ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Wan2.2 模型系统解读:从视频扩散到 WAM 世界模型模块

Wan2.2 模型系统解读:从视频扩散到 WAM 世界模型模块 0. 简介**本文现在按“模型定位 → 视频扩散主线 → 内部模块结构 → WAM 因果改造 → 部署与优化”的顺序展开。**阅读时可以先把 Wan2.2 看成四层结构第一层是文本、图像、语音等条件编码第二层是 VAE 压缩后的 latent 视频空间第三层是 DiT/Transformer 在 latent 上做多步去噪第四层是 VAE 解码和视频保存。WAM 拓展则是在这个基础上加入历史观察、动作条件、因果时序和策略输出让模型从“生成一段合理视频”逐步变成“预测动作会怎样改变未来世界”。后文每一部分都会先讲概念再落到代码路径和优化方法。1. Wan2.2 的定位与视频扩散基础1.1 先把 Wan2.2 放到正确位置**Wan2.2 不是单个模型而是一组围绕视频生成任务组织的开源模型族。**官方仓库在 2025 年 7 月 28 日开放 T2V、I2V、TI2V 的推理代码和权重后续又扩展到 S2V 和 Animate。对学习者来说最容易混淆的是模型名称里的任务缩写T2V 是文本到视频I2V 是图像到视频TI2V 是文本/图像统一到视频S2V 是语音驱动视频Animate 则偏角色动画和替换。它们共用很多视频扩散模型思想但在输入条件、VAE、Transformer 尺寸和推理流程上并不完全一致。**Wan2.2 的核心仍然是扩散式视频生成不是传统自回归语言模型。**它先把视频压缩到 VAE latent 空间再在 latent 上用 DiT/Transformer 迭代去噪最后通过 VAE 解码回 RGB 视频。T2V-A14B 和 I2V-A14B 的最大变化是引入高噪声专家和低噪声专家TI2V-5B 的最大变化则是使用 Wan2.2-VAE把视频压缩得更狠从而让单张消费级显卡也能跑 720P24fps 的任务。理解这两条线基本就抓住了 Wan2.2 的主干。1.2 视频扩散到底在做什么**视频扩散可以先理解成“在压缩空间里反复修正一段带噪视频”。**训练时模型看到真实视频 latent、噪声强度和文本条件学习如何从带噪 latent 中预测噪声、速度或干净样本方向推理时系统从随机噪声开始按照采样器给出的时间步逐步调用去噪器每一步都把 latent 推向更像真实视频的方向。由于视频包含时间维、空间维和语义条件去噪器不能只看一帧而要同时建模画面内容、运动连续性、主体一致性和提示词约束。**Wan2.2 使用的是视频 latent 上的 Transformer而不是直接在像素上做扩散。**这点非常关键因为原始 720P 视频的像素量过大直接处理会导致注意力计算和显存爆炸。VAE 先把视频压缩成通道数较高但时空尺寸更小的 latentDiT 再把这些 latent 切成 3D patch token。这样做的代价是模型必须依赖 VAE 保留足够多的细节收益是 Transformer 可以在较短 token 序列上做全局建模。1.3 Wan2.2 的任务谱系和官方配置**T2V-A14B 与 I2V-A14B 是双专家 MoE 版本TI2V-5B 是高压缩 VAE 支持的密集版本。**从本地配置文件可以看到T2V-A14B 的实际配置是dim5120、num_heads40、num_layers40而不是很多早期解读里常见的2048/16/32默认值。WanModel类的默认参数确实保留了较小配置但 A14B 权重加载时使用的是任务配置文件因此正式分析需要以wan/configs/wan_t2v_A14B.py和wan/configs/wan_i2v_A14B.py为准。模型主要用途VAE strideTransformer 主配置推理步数关键特征T2V-A14B文本生成视频(4, 8, 8)dim5120, heads40, layers4040高噪/低噪双专家支持 480P/720PI2V-A14B图像生成视频(4, 8, 8)dim5120, heads40, layers4040图像条件输入双专家边界略不同TI2V-5B文本/图像统一生成视频(4, 16, 16)dim3072, heads24, layers3050高压缩 Wan2.2-VAE单卡 4090 可运行**官方 对 Wan2.2 的升级点可以归纳为三类容量、数据和压缩。**容量来自高噪声/低噪声双专家设计训练数据相比 Wan2.1 有更大规模扩展压缩则来自 TI2V-5B 使用的新 VAE。这里要注意一个写作上的边界Wan2.2 官方文档把 A14B 称为 MoE但从代码看它不是 LLM 中常见的 token-level router MoE而是按去噪时间步切换两个 dense expert它的“专家化”发生在扩散噪声阶段而不是每个 token 动态选择专家。1.4 基础阶段的学习建议**学习 Wan2.2 最稳的方式是先确认“任务入口”和“真实配置”再进入模块细节。**例如你想跑文本生成视频就先看generate.py如何把--task t2v-A14B或--task ti2v-5B映射到对应 pipeline想分析模型规模就不要只看WanModel.__init__的默认参数而要看wan/configs/wan_t2v_A14B.py、wan/configs/wan_i2v_A14B.py和wan/configs/wan_ti2v_5B.py。这样做可以避免一个常见误区拿默认类参数解释正式权重导致维度、层数、VAE stride 和推理步数都对不上。2. Wan2.2 的核心结构与代码路径2.1 从 forward 看整体 pipeline**WanModel 的forward是理解 Wan2.2 的入口。**输入x是一组视频 latent每个样本形状近似为[C, F, H, W]模型先用Conv3d做 patch embedding再记录每个样本的 3D 网格大小grid_sizes随后 flatten 成 token 序列。时间步t会通过 sinusoidal embedding 和 MLP 变成调制向量文本上下文通过两层线性层映射到同一个 hidden dimension最后依次通过多个WanAttentionBlock由Head输出 patch 内容并unpatchify回 latent 视频。# Wan2.2/wan/modules/model.py 的核心结构简化self.patch_embeddingnn.Conv3d(in_dim,dim,kernel_sizepatch_size,stridepatch_size)self.text_embeddingnn.Sequential(nn.Linear(text_dim,dim),nn.GELU(approximatetanh),nn.Linear(dim,dim))self.time_embeddingnn.Sequential(nn.Linear(freq_dim,dim),nn.SiLU(),nn.Linear(dim,dim))self.time_projectionnn.Sequential(nn.SiLU(),nn.Linear(dim,dim*6))self.blocksnn.ModuleList([WanAttentionBlock(dim,ffn_dim,num_heads,window_size,qk_norm,cross_attn_norm,eps)for_inrange(num_layers)])self.headHead(dim,out_dim,patch_size,eps)**这个 pipeline 的关键不是“卷积、注意力、MLP”这些模块名而是数据形态的变化。**视频先被 VAE 压到 latent再被 3D patch 切成 token每个 token 同时带有时间位置、空间位置和通道语义。Transformer 做的事情是在整段视频 token 上估计当前噪声强度下应该如何修正 latent。最后unpatchify只是把 token 排列回[C, F, H, W]真正决定画面细节和运动一致性的是中间 40 层或 30 层 Transformer 的时空建模能力。结构上可以把WanModel.forward拆成五个连续动作patch、embed、attend、head、unpatch。patch 负责把[C,F,H,W]的 latent 视频变成 token 序列embed 负责把时间步和文本条件对齐到模型维度attend 负责在 self-attention 中建模视频内部关系并在 cross-attention 中吸收条件head 负责把 hidden token 投影回 patch 内容unpatch 则把 patch 内容重新拼回 latent 视频。优化时也可以沿着这五步定位问题shape 错多半在 patch/unpatch语义不跟 prompt 多半在条件 embedding 或 CFG运动不稳多半在 attention、RoPE 或训练数据覆盖。# forward 中从 latent 到 token再从 token 回 latent 的主流程x[self.patch_embedding(u.unsqueeze(0))foruinx]grid_sizestorch.stack([torch.tensor(u.shape[2:],dtypetorch.long)foruinx])x[u.flatten(2).transpose(1,2)foruinx]seq_lenstorch.tensor([u.size(1)foruinx],dtypetorch.long)forblockinself.blocks:xblock(x,**kwargs)xself.head(x,e)xself.unpatchify(x,grid_sizes)2.2 PatchEmbedding为什么是 3D patch**Wan2.2 的 patch 不是只切图像而是切视频 latent 的时间、空间三维结构。**默认patch_size(1, 2, 2)表示时间维不合并空间维每2x2latent 网格合成一个 token。对于 T2V-A14BVAE 已经把原视频压到(4, 8, 8)的时空 stride因此 DiT 再做(1, 2, 2)patch 后空间 token 进一步减少一半对于 TI2V-5BVAE stride 已经是(4, 16, 16)再配合 DiT patch 后总体空间压缩会更高。**3D patch 的意义是让 Transformer 的每个 token 代表一个局部时空块而不是一个像素或单帧区域。**这会显著减少序列长度使全局 attention 有可能在 720P 视频上运行。缺点是 patch 过大时会损失细粒度运动和纹理因此 Wan2.2 在 T2V/I2V 和 TI2V 上采用了不同的 VAE 压缩策略A14B 追求更强质量TI2V-5B 追求更高效率。学习代码时不要只看patch_size还要把它和vae_stride合起来理解。2.3 TimeEmbedding 与 AdaLN-Zero 调制**扩散模型中的时间步不是普通的位置编码而是当前噪声强度的控制信号。**Wan2.2 先用sinusoidal_embedding_1d把时间步变成频率特征再经过time_embeddingMLP 得到 hidden 向量最后用time_projection输出6 * dim。这六组向量会在每个WanAttentionBlock里拆成shift, scale, gate, shift2, scale2, gate2分别调制 self-attention 和 FFN 的归一化输入及残差门控。# 时间步被投影成 6 组调制参数eself.time_embedding(sinusoidal_embedding_1d(self.freq_dim,t).unflatten(0,(bt,seq_len)).float())e0self.time_projection(e).unflatten(2,(6,self.dim))**这类结构常被称为 AdaLN-Zero 风格调制适合扩散 Transformer。**直观理解是同一段 noisy latent在高噪声阶段和低噪声阶段需要不同的处理方式时间步调制相当于告诉每一层“现在应该更关注大轮廓还是更关注纹理和细节”。Wan2.2 又在 A14B 层面引入高噪/低噪专家因此时间信息同时影响“选哪个大模型”和“每层内部如何调制”。2.4 WanAttentionBlock真正的核心计算单元**每个 WanAttentionBlock 的顺序是 self-attention、cross-attention 和 FFN。**self-attention 建模视频 token 之间的时空关系cross-attention 把文本条件注入视觉 tokenFFN 对每个 token 做非线性变换。代码中norm1、norm2使用强制 fp32 的 LayerNormQ/K 可选 RMSNormattention 使用封装后的flash_attention。这套结构和很多 DiT 类模型相似但 Wan 的重点是 3D RoPE、视频长度处理和扩散时间调制。# WanAttentionBlock 的核心逻辑简化e(self.modulation.unsqueeze(0)e).chunk(6,dim2)yself.self_attn(self.norm1(x).float()*(1e[1].squeeze(2))e[0].squeeze(2),seq_lens,grid_sizes,freqs)xxy*e[2].squeeze(2)xxself.cross_attn(self.norm3(x),context,context_lens)yself.ffn(self.norm2(x).float()*(1e[4].squeeze(2))e[3].squeeze(2))xxy*e[5].squeeze(2)**这里的门控残差值得特别注意。**普通 Transformer 通常直接x attention(x)而 Wan2.2 会用时间步生成的 gate 控制残差强度。扩散模型从纯噪声到清晰样本的每一步都在不同分布上工作如果所有时间步共享同样的残差路径很容易出现训练不稳定或不同噪声阶段能力冲突。AdaLN-Zero 的价值就在于把“噪声阶段”显式注入每一层使同一个 block 可以在多种 denoising regime 下工作。2.5 3D RoPE让 token 知道自己在视频里的位置**视频 token 需要同时知道自己处于第几帧、画面的哪一行、哪一列。**Wan2.2 的rope_apply会把频率分成时间、高度、宽度三段然后 broadcast 到(F, H, W)网格中再把 Q/K 转成 complex 表示进行旋转。这样 self-attention 在比较 token 时不仅看到语义向量还能感知三维相对位置关系。对于视频生成这比单纯的一维位置编码更自然因为运动一致性依赖时间维构图和纹理依赖空间维。# 3D RoPE 的关键思想把频率拆成 t/h/w 三段后拼回每个 tokenfreqsfreqs.split([c-2*(c//3),c//3,c//3],dim1)freqs_itorch.cat([freqs[0][:f].view(f,1,1,-1).expand(f,h,w,-1),freqs[1][:h].view(1,h,1,-1).expand(f,h,w,-1),freqs[2][:w].view(1,1,w,-1).expand(f,h,w,-1)],dim-1).reshape(seq_len,1,-1)x_itorch.view_as_real(x_i*freqs_i).flatten(2)**RoPE 只作用在 Q/K 上不直接改 V。**这符合注意力机制的定位逻辑位置影响“谁和谁相似、谁应该关注谁”而 value 仍然携带内容信息。Wan2.2 在初始化时预计算长度 1024 的频率表并在 forward 中根据每个样本的grid_sizes切片使用避免每次为不同视频动态生成完整频率网格。这是一个很典型的工程优化模型保持支持可变视频形状但高频路径尽量复用预计算张量。2.6 MoEWan2.2 的“双专家”到底怎么工作**Wan2.2 A14B 的 MoE 可以理解为“按去噪阶段切换两个 dense DiT”。**高噪声阶段latent 还接近随机噪声模型主要需要决定整体布局、主体关系和大运动方向低噪声阶段latent 已经出现可辨识结构模型更需要修正纹理、边缘、局部动作和语义细节。官方说法是每个专家约 14B 参数总参数约 27B但每个采样步只激活一个 14B 专家因此计算量接近单个 14B 模型。从代码看专家切换发生在WanT2V._prepare_model_for_timestep。T2V 配置里boundary0.875推理时会乘以训练总时间步得到阈值如果当前时间步大于等于阈值就使用high_noise_model否则使用low_noise_model。这是一种硬路由没有 token-level router也没有 top-k expert 选择。它更像 diffusion timestep expert routing而不是大语言模型里每层 FFN 的稀疏 MoE。# Wan2.2/wan/text2video.py 的专家选择逻辑简化def_prepare_model_for_timestep(self,t,boundary,offload_model):ift.item()boundary:required_model_namehigh_noise_modeloffload_model_namelow_noise_modelelse:required_model_namelow_noise_modeloffload_model_namehigh_noise_modelifoffload_modelorself.init_on_cpu:ifnext(getattr(self,offload_model_name).parameters()).device.typecuda:getattr(self,offload_model_name).to(cpu)ifnext(getattr(self,required_model_name).parameters()).device.typecpu:getattr(self,required_model_name).to(self.device)returngetattr(self,required_model_name)**为什么这仍然可以被称为 MoE争议点也正在这里。**如果按“多个专家分别负责不同输入区域或 token”的狭义定义Wan2.2 的 A14B 确实不像 LLM MoE 或 DiffMoE 那样细粒度如果按“同一任务中存在多个专家子模型由路由策略选择当前激活专家”的广义定义它又确实满足 MoE 的基本思想。更严谨的表述是Wan2.2 采用了面向扩散去噪阶段的双专家硬路由而不是 token 级稀疏专家路由。2.7 采样循环CFG 与专家切换如何结合**Wan2.2 的采样循环每一步会分别跑条件分支和无条件分支再做 classifier-free guidance。**代码中arg_c使用正向 prompt 的文本 embeddingarg_null使用负向 prompt 或空条件文本 embedding。模型先预测noise_pred_cond再预测noise_pred_uncond最后按noise_pred_uncond scale * (cond - uncond)合成最终预测。T2V-A14B 还允许低噪声和高噪声阶段使用不同 CFG scale例如配置中(3.0, 4.0)表示低噪 scale 为 3.0高噪 scale 为 4.0。boundaryself.boundary*self.num_train_timestepsfor_,tinenumerate(tqdm(timesteps)):timesteptorch.stack([t])modelself._prepare_model_for_timestep(t,boundary,offload_model)sample_guide_scaleguide_scale[1]ift.item()boundaryelseguide_scale[0]noise_pred_condmodel(latent_model_input,ttimestep,**arg_c)[0]noise_pred_uncondmodel(latent_model_input,ttimestep,**arg_null)[0]noise_prednoise_pred_uncondsample_guide_scale*(noise_pred_cond-noise_pred_uncond)latents[sample_scheduler.step(...)[0].squeeze(0)]**这段代码说明 Wan2.2 的“推理成本几乎不变”有一个前提每步只让一个专家参与。**如果显存足够可以把两个专家都留在 GPU 上以减少 CPU/GPU 来回搬运如果显存不足offload_modelTrue会把暂时不用的专家卸载到 CPU。这样可以降低峰值显存但会增加 PCIe 传输和等待时间。实际部署时A14B 更适合 80GB 级显卡或多卡并行TI2V-5B 才是普通消费级单卡更现实的入口。2.8 高压缩 VAETI2V-5B 为什么能跑得更轻**TI2V-5B 的关键不只是 Transformer 从 14B 变成 5B而是 Wan2.2-VAE 把视频 latent 压得更小。**配置文件里ti2v_5B.vae_stride (4, 16, 16)表示 VAE 输出相对于原视频在时间上压缩 4 倍、空间上压缩 16 倍。随后 DiT 的patch_size(1, 2, 2)又在 latent 网格上做空间 patch因此官方称加上 patchification 后总压缩可达到4x32x32。这直接减少 token 数量是 TI2V-5B 能在 RTX 4090 这类显卡上运行的根本原因之一。从vae2_2.py看压缩来自 patchify、残差下采样和因果 3D 卷积的组合。patchify(x, patch_size2)先把空间2x2像素块并入通道维随后Down_ResidualBlock根据temperal_downsample和down_flag决定是否对时间和空间下采样。本地仓库当前Wan2_2_VAEwrapper 默认传入temperal_downsample[False, True, True]意味着下采样 block 中有两次时间下采样空间下采样发生在前三个 block结论仍然是时间x4、空间x16的 VAE 压缩。…详情请参照古月居
返回列表