From 9aa11f6f1a2dc232df5d7e4ba99a6207c17bf592 Mon Sep 17 00:00:00 2001 From: ozbayb <17261091+ozbayb@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:15:19 -0600 Subject: [PATCH] Fix proper handling of difference between 1.7B and 14B HuMo models --- comfy/ldm/wan/model.py | 8 +------- comfy/model_base.py | 31 ++++++++++++++++--------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/comfy/ldm/wan/model.py b/comfy/ldm/wan/model.py index dc0196974..66017ed76 100644 --- a/comfy/ldm/wan/model.py +++ b/comfy/ldm/wan/model.py @@ -1510,7 +1510,7 @@ class HumoWanModel(WanModel): operations=None, ): - super().__init__(model_type='i2v', patch_size=patch_size, text_len=text_len, in_dim=36, dim=dim, ffn_dim=ffn_dim, freq_dim=freq_dim, text_dim=text_dim, out_dim=out_dim, num_heads=num_heads, num_layers=num_layers, window_size=window_size, qk_norm=qk_norm, cross_attn_norm=cross_attn_norm, eps=eps, flf_pos_embed_token_number=flf_pos_embed_token_number, wan_attn_block_class=WanAttentionBlockAudio, image_model=image_model, device=device, dtype=dtype, operations=operations) + super().__init__(model_type='i2v', patch_size=patch_size, text_len=text_len, in_dim=in_dim, dim=dim, ffn_dim=ffn_dim, freq_dim=freq_dim, text_dim=text_dim, out_dim=out_dim, num_heads=num_heads, num_layers=num_layers, window_size=window_size, qk_norm=qk_norm, cross_attn_norm=cross_attn_norm, eps=eps, flf_pos_embed_token_number=flf_pos_embed_token_number, wan_attn_block_class=WanAttentionBlockAudio, image_model=image_model, device=device, dtype=dtype, operations=operations) self.audio_proj = AudioProjModel(seq_len=8, blocks=5, channels=1280, intermediate_dim=512, output_dim=1536, context_tokens=audio_token_num, dtype=dtype, device=device, operations=operations) @@ -1539,12 +1539,6 @@ class HumoWanModel(WanModel): e0 = self.time_projection(e).unflatten(2, (6, self.dim)) if reference_latent is not None: - if reference_latent.shape[1] < 36: - padding_needed = 36 - reference_latent.shape[1] - padding = torch.zeros(reference_latent.shape[0], padding_needed, *reference_latent.shape[2:], - device=reference_latent.device, dtype=reference_latent.dtype) - reference_latent = torch.cat([padding, reference_latent], dim=1) # pad at beginning like c_concat - ref = self.patch_embedding(reference_latent.float()).to(x.dtype) ref = ref.flatten(2).transpose(1, 2) freqs_ref = self.rope_encode(reference_latent.shape[-3], reference_latent.shape[-2], reference_latent.shape[-1], t_start=time, device=x.device, dtype=x.dtype) diff --git a/comfy/model_base.py b/comfy/model_base.py index dc4cd35dc..40b7b3757 100644 --- a/comfy/model_base.py +++ b/comfy/model_base.py @@ -1227,22 +1227,23 @@ class WAN21_HuMo(WAN21): if audio_embed is not None: out['audio_embed'] = comfy.conds.CONDRegular(audio_embed) - if "c_concat" not in out or "concat_latent_image" in kwargs: # 1.7B model OR I2V mode - reference_latents = kwargs.get("reference_latents", None) - if reference_latents is not None: - out['reference_latent'] = comfy.conds.CONDRegular(self.process_latent_in(reference_latents[-1])) + reference_latents = kwargs.get("reference_latents", None) + + if "c_concat" not in out and reference_latents is not None and reference_latents[0].shape[1] == 16: # 1.7B model + out['reference_latent'] = comfy.conds.CONDRegular(self.process_latent_in(reference_latents[-1])) else: - noise_shape = list(noise.shape) - noise_shape[1] += 4 - concat_latent = torch.zeros(noise_shape, device=noise.device, dtype=noise.dtype) - zero_vae_values_first = torch.tensor([0.8660, -0.4326, -0.0017, -0.4884, -0.5283, 0.9207, -0.9896, 0.4433, -0.5543, -0.0113, 0.5753, -0.6000, -0.8346, -0.3497, -0.1926, -0.6938]).view(1, 16, 1, 1, 1) - zero_vae_values_second = torch.tensor([1.0869, -1.2370, 0.0206, -0.4357, -0.6411, 2.0307, -1.5972, 1.2659, -0.8595, -0.4654, 0.9638, -1.6330, -1.4310, -0.1098, -0.3856, -1.4583]).view(1, 16, 1, 1, 1) - zero_vae_values = torch.tensor([0.8642, -1.8583, 0.1577, 0.1350, -0.3641, 2.5863, -1.9670, 1.6065, -1.0475, -0.8678, 1.1734, -1.8138, -1.5933, -0.7721, -0.3289, -1.3745]).view(1, 16, 1, 1, 1) - concat_latent[:, 4:] = zero_vae_values - concat_latent[:, 4:, :1] = zero_vae_values_first - concat_latent[:, 4:, 1:2] = zero_vae_values_second - out['c_concat'] = comfy.conds.CONDNoiseShape(concat_latent) - reference_latents = kwargs.get("reference_latents", None) + concat_latent_image = kwargs.get("concat_latent_image", None) + if concat_latent_image is None: + noise_shape = list(noise.shape) + noise_shape[1] += 4 + concat_latent = torch.zeros(noise_shape, device=noise.device, dtype=noise.dtype) + zero_vae_values_first = torch.tensor([0.8660, -0.4326, -0.0017, -0.4884, -0.5283, 0.9207, -0.9896, 0.4433, -0.5543, -0.0113, 0.5753, -0.6000, -0.8346, -0.3497, -0.1926, -0.6938]).view(1, 16, 1, 1, 1) + zero_vae_values_second = torch.tensor([1.0869, -1.2370, 0.0206, -0.4357, -0.6411, 2.0307, -1.5972, 1.2659, -0.8595, -0.4654, 0.9638, -1.6330, -1.4310, -0.1098, -0.3856, -1.4583]).view(1, 16, 1, 1, 1) + zero_vae_values = torch.tensor([0.8642, -1.8583, 0.1577, 0.1350, -0.3641, 2.5863, -1.9670, 1.6065, -1.0475, -0.8678, 1.1734, -1.8138, -1.5933, -0.7721, -0.3289, -1.3745]).view(1, 16, 1, 1, 1) + concat_latent[:, 4:] = zero_vae_values + concat_latent[:, 4:, :1] = zero_vae_values_first + concat_latent[:, 4:, 1:2] = zero_vae_values_second + out['c_concat'] = comfy.conds.CONDNoiseShape(concat_latent) if reference_latents is not None: ref_latent = self.process_latent_in(reference_latents[-1]) ref_latent_shape = list(ref_latent.shape)