视频生成 SOTA

Wan2.2 技术原理解析

基于 Diffusion Transformer (DiT),融合 Flow MatchingMixture-of-Experts (MoE) 的新一代视频生成模型。

核心架构概览

Wan2.2 是一个端到端的视频生成系统,它摒弃了传统的 U-Net,采用了 DiT 架构来处理视频的长序列 Token。 其参数量高达 27B,但得益于 MoE 稀疏激活机制,推理时显存占用仅相当于 14B 模型。

输入统一表示 (VCU)

将文本、帧、蒙版统一编码。

高效时空压缩

Wan-VAE 实现 4×8×8 压缩率,信息压缩倍数达 256倍。

多语言理解

采用 umT5 编码器,原生支持中英双语提示词。

数据流管道

视频输入
文本提示
Wan-VAE 编码器
3D Causal Conv
umT5 编码器
Text Embedding
DiT 核心
流匹配
MoE 切换
Wan-VAE 解码器
Reconstruction

时空 VAE:压缩的艺术

视频数据包含极高的冗余。Wan-VAE 通过 3D 卷积实现了时空维度的同时压缩。
->

关键技术细节:

  • 因果 3D 卷积 (Causal 3D Conv): 确保每一帧的编码只依赖于前序帧。
  • 混合损失函数: 结合 L1, KL, LPIPS 和 GAN 损失。
  • 特征缓存 (Feature Cache): 缓存前一时间步特征,支持无限长视频生成。

Flow Matching 原理

可视化对比:Flow Matching vs. 传统扩散

Wan2.2 采用流匹配(Flow Matching),其生成轨迹是直线的(Optimal Transport Path),相比传统扩散模型的“随机行走”路径,效率更高,训练更稳定。

输入 Noise
输出 Video
Flow Matching (直线)
传统扩散 (随机)

训练目标公式:

模型直接预测速度向量。

为什么选择 Flow Matching?

传统的扩散模型(DDPM)模拟的是随机微分方程(SDE),路径弯曲。Flow Matching 建立了一个从噪声到数据的确定性常微分方程 (ODE)。直线路径允许更大的步长(20-50 步)。

数学定义

  • 1. 插值路径:
  • 2. 向量场:
  • 3. 损失函数:

混合专家 (MoE) 架构

Wan2.2 的 MoE 不是用于扩大词表,而是专门用于去噪过程的时间维度。视频生成的早期(构图)和晚期(细节)需要截然不同的能力。

交互演示:MoE 动态切换

总参数: 27B | 激活: 14B
纯噪声 (Input) 生成视频 (Output)
早期去噪阶段 (High Noise) 精细化阶段 (Low Noise)
当前时间步 1.00

激活模型

高噪专家 (High Noise)

专注任务

全局布局与结构

切换阈值
t

全局布局与结构

专家分工表

组件高噪专家 (High Noise)低噪专家 (Low Noise)
激活条件低 SNR (早期)高 SNR (后期)
主要职责生成大幅度运动、场景布局生成纹理、光影细节
训练策略从零开始训练基于 Wan2.1 微调

代码实现

以下代码展示了如何使用 Hugging Face `diffusers` 库来加载 Wan2.2 模型并生成视频。底层会自动处理 MoE 的权重切换。

Python 推理代码 (Diffusers)
import torch
from diffusers import WanPipeline
from diffusers.utils import export_to_video

# 1. 加载模型 (自动加载 MoE 权重)
# 以下代码展示了如何使用 Hugging Face `diffusers` 库来加载 Wan2.2 模型并生成视频。底层会自动处理 MoE 的权重切换。
pipe = WanPipeline.from_pretrained(
    "Wan-AI/Wan2.2-T2V-A14B-Diffusers",
    torch_dtype=torch.bfloat16
)

# 2. 开启显存优化 (Offload 到 CPU)
pipe.enable_model_cpu_offload()

# 3. 生成视频 (Flow Matching 仅需约 50 步)
prompt = "A cinematic drone shot of a futuristic city with flying cars, neon lights, 4k, high quality."
output = pipe(
    prompt=prompt,
    height=720,
    width=1280,
    num_inference_steps=50,
    guidance_scale=5.0
).frames[0]

# 4. 保存结果
export_to_video(output, "wan_futuristic_city.mp4")