Fixed issue with hidream-01 that could cause a weird nan state. Took forever to track down as it was 1 in 10 starts.
This commit is contained in:
@@ -1740,35 +1740,6 @@ class Qwen3VLModel(Qwen3VLPreTrainedModel):
|
|||||||
input_ids, inputs_embeds=inputs_embeds, image_features=image_embeds
|
input_ids, inputs_embeds=inputs_embeds, image_features=image_embeds
|
||||||
)
|
)
|
||||||
inputs_embeds = inputs_embeds.masked_scatter(image_mask, image_embeds)
|
inputs_embeds = inputs_embeds.masked_scatter(image_mask, image_embeds)
|
||||||
elif torch.is_grad_enabled():
|
|
||||||
# t2i task: no pixel_values, but we must run the vision encoder with a
|
|
||||||
# tiny dummy input so that EVERY rank has non-None (zero) gradients for
|
|
||||||
# vision-encoder parameters. This keeps the FSDP reduce-scatter and the
|
|
||||||
# replicate-group all-reduce symmetric across t2i and ref-task ranks,
|
|
||||||
# preventing collective hangs at backward / clip_grad_norm_.
|
|
||||||
# The dummy output is zeroed out before being added to inputs_embeds, so
|
|
||||||
# the forward result is numerically identical to the no-pixel_values path.
|
|
||||||
pe = self.visual.patch_embed # PatchEmbed
|
|
||||||
t_sz = pe.temporal_patch_size # e.g. 2
|
|
||||||
m_sz = self.visual.spatial_merge_size # e.g. 2
|
|
||||||
n_patches = t_sz * m_sz * m_sz
|
|
||||||
patch_dim = pe.in_channels * t_sz * pe.patch_size * pe.patch_size
|
|
||||||
fake_pv = torch.zeros(
|
|
||||||
n_patches,
|
|
||||||
patch_dim,
|
|
||||||
device=inputs_embeds.device,
|
|
||||||
dtype=pe.proj.weight.dtype,
|
|
||||||
)
|
|
||||||
fake_grid = torch.tensor(
|
|
||||||
[[t_sz, m_sz, m_sz]], dtype=torch.long, device=inputs_embeds.device
|
|
||||||
)
|
|
||||||
fake_embs, _ = self.get_image_features(fake_pv, fake_grid)
|
|
||||||
fake_embs = torch.cat(fake_embs, dim=0).to(inputs_embeds.dtype)
|
|
||||||
# Multiply by a zero tensor (same dtype/device) so the gradient path
|
|
||||||
# through the vision encoder is live but the numerical contribution is 0.
|
|
||||||
inputs_embeds = inputs_embeds + fake_embs.sum() * inputs_embeds.new_zeros(
|
|
||||||
[]
|
|
||||||
)
|
|
||||||
|
|
||||||
if pixel_values_videos is not None:
|
if pixel_values_videos is not None:
|
||||||
video_embeds, _ = self.get_video_features(
|
video_embeds, _ = self.get_video_features(
|
||||||
|
|||||||
Reference in New Issue
Block a user