影片生成 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")