Fix issue with layer offloading with MinMax H3

This commit is contained in:
Jaret Burkett 2026-08-03 11:32:36 -06:00
parent 9d614a51fb
commit bf739ff966
2 changed files with 14 additions and 6 deletions

View File

@ -87,8 +87,11 @@ class MiniMaxH3Rope(nn.Module):
def forward(self, position_ids: torch.Tensor):
"""position_ids (B, S, 3) -> cos, sin each (B, S, 96), float32."""
position_ids = position_ids.to(device=self.inv_freq.device, dtype=torch.float32)
freqs = position_ids.unsqueeze(-1) * self.inv_freq.view(1, 1, 1, -1)
# compute on the input's device: the frequency buffer may be left
# CPU-resident by layer offloading / low_vram loads
position_ids = position_ids.to(dtype=torch.float32)
inv_freq = self.inv_freq.to(position_ids.device)
freqs = position_ids.unsqueeze(-1) * inv_freq.view(1, 1, 1, -1)
# (B, S, 3, 16) -> (B, S, 48) in (t, h, w) axis order -> duplicate to 96
freqs = freqs.flatten(2, 3)
freqs = torch.cat([freqs, freqs], dim=-1)
@ -403,10 +406,13 @@ class MiniMaxH3Transformer(nn.Module):
return self.time_embedder(t)
table = self.adaln_t_table.float()
pos = t.clamp(0.0, 1.0) * (table.shape[0] - 1)
# the table may stay CPU-resident under offloading while timesteps
# arrive on cuda: interpolate on the table's device, return on t's
pos = pos.to(table.device)
lo = pos.floor().long()
hi = (lo + 1).clamp(max=table.shape[0] - 1)
frac = (pos - lo.float()).unsqueeze(1)
return table[lo] * (1.0 - frac) + table[hi] * frac
return (table[lo] * (1.0 - frac) + table[hi] * frac).to(t.device)
def forward(
self,

View File

@ -62,11 +62,13 @@ class Int8Embedding(torch.nn.Module):
return (self.qweight.float() * scales.unsqueeze(1)).to(self.output_dtype)
def forward(self, input_ids: torch.Tensor) -> torch.Tensor:
flat = input_ids.reshape(-1)
# the table may stay CPU-resident under text-encoder offloading: run
# the (tiny) lookup on the table's device, return on the caller's
flat = input_ids.reshape(-1).to(self.qweight.device)
rows = self.qweight.index_select(0, flat).float()
scales = self.scales.view(torch.float32).index_select(0, flat)
out = rows * scales.unsqueeze(1)
return out.to(self.output_dtype).reshape(*input_ids.shape, self.embedding_dim)
out = (rows * scales.unsqueeze(1)).to(self.output_dtype)
return out.to(input_ids.device).reshape(*input_ids.shape, self.embedding_dim)
def _to_ostris(module: torch.nn.Linear, quantizer, orig_dtype: torch.dtype) -> OstrisLinear: