用 500 美元就能跑通的视频生成新范式:Pusa V1.0 通俗全指南

读完本文,你将知道:

  • Pusa 是什么,为什么它能用 4 000 条样例、500 美元预算,就打败需要 1 000 万条样例、10 万美元的旧方案;
  • 它的「向量时间步」到底动了哪一行代码;
  • 如何 30 分钟内跑通文本-到-视频、图像-到-视频、视频续写、首尾帧插值等 6 个任务;
  • 什么时候该用 LoRA,什么时候该全量微调,以及常见踩坑清单。

一张图先读懂 Pusa V1.0

Pusa 与 Wan-I2V 的对比
维度 Pusa V1.0 Wan-I2V-14B(基线)
训练数据 3 860 条 ≥ 1 000 万条
训练预算 500 USD ≥ 100 000 USD
推理步数 10 步 50 步
VBench-I2V 总分 87.32 % 86.86 %
额外能力 文本-到-视频、首尾帧、视频续写… 仅图像-到-视频

1. Pusa 是什么?为什么值得关注?

一句话:Pusa 把「整段视频必须同步降噪」这一传统假设打碎了,让每一帧拥有独立的时间轴(向量时间步),从而用极低成本学会各种时序任务。

1.1 传统方法为什么贵

  • 旧模型用一个标量 t 控制所有帧的噪声水平;
  • 做「图像-到-视频」时,第一帧是干净的,其余帧是带噪的,强行同步导致模型要重新学习一次“如何保持第一帧不动”;
  • 于是 Wan-I2V 用 1 000 万条样例、4×880 GB GPU、两个星期的全量微调才勉强学会。

1.2 Pusa 的解法:向量时间步(Vectorized Timestep Adaptation, VTA)

  • 把时间步从标量 t 变成向量 τ=[τ₁,τ₂,…,τₙ],每帧独立;
  • 想让第一帧保持不动,只要把 τ₁ 固定在 0 即可,无需修改网络权重
  • 其余帧照常扩散,模型只需学会“何时参考第一帧”,而不是“重新画第一帧”。

1.3 结果

  • 只改 2 处代码:

    1. 时间步嵌入层从 Linear(1, D) 换成 Linear(N, D)
    2. 每个 DiT Block 的 modulate() 函数改成逐帧调制。
  • 用 LoRA rank-512 在 8×80 GB GPU 上跑 900 步(≈ 2 小时)即可收敛。

2. 如何 30 分钟跑通你的第一条 Pusa 视频

2.1 环境准备

# 1. 克隆仓库
git clone https://github.com/Yaofang-Liu/Pusa-VidGen.git
cd Pusa-VidGen/PusaV1

# 2. 推荐使用 uv 管理依赖
pip install uv
uv venv .venv
source .venv/bin/activate
uv pip install -r requirements.txt

2.2 下载权重

# 方式一:Hugging Face CLI
pip install huggingface_hub
huggingface-cli download RaphaelLiu/PusaV1 --local-dir ./models

# 方式二:手动下载后解压到 ./models

2.3 文本-到-视频(T2V)30 秒出片

python scripts/infer_t2v.py \
  --model_dir ./models \
  --prompt "A cat wearing sunglasses skateboarding down the beach" \
  --num_steps 10 \
  --output cat.mp4

2.4 图像-到-视频(I2V)3 行命令

python scripts/infer_i2v.py \
  --model_dir ./models \
  --image_path ./assets/starry_night.jpg \
  --prompt "The stars twinkle and the clouds drift gently" \
  --num_steps 10 \
  --output starry_motion.mp4

小技巧:把 --noise_multiplier 0.3 加入第一帧,可减少“画面过于静止”的僵硬感。

2.5 首尾帧插值(Start-End Frames)

python scripts/infer_start_end.py \
  --model_dir ./models \
  --start_frame ./assets/start.jpg \
  --end_frame ./assets/end.jpg \
  --prompt "Smooth cinematic transition" \
  --num_steps 10 \
  --output transition.mp4

3. 进阶:训练你自己的 Pusa LoRA

如果你有一批私有数据,可以沿用官方脚本,在单节点 8×A100 上 2 小时完成微调。

3.1 数据格式

dataset/
 ├─ 00001.mp4
 ├─ 00001.txt   # 对应文本提示
 ├─ 00002.mp4
 └─ 00002.txt

3.2 启动训练

accelerate launch --config_file ds_config_zero2.yaml \
  train_lora.py \
  --base_model Wan-T2V-14B \
  --data_root ./dataset \
  --rank 512 \
  --alpha 1.7 \
  --lr 1e-4 \
  --max_steps 900 \
  --output_dir ./runs/my_pusa
关键参数 推荐值 说明
rank 512 过小会欠拟合,过大浪费显存
alpha 1.7 推理时缩放系数,经验值
max_steps 900 3 860 条数据下已收敛
batch_size 8 8×80 GB GPU 刚好

3.3 推理时合并权重

python scripts/merge_lora.py \
  --base_model ./models/Wan-T2V-14B \
  --lora_path ./runs/my_pusa/checkpoint-900 \
  --output_path ./models/my_pusa_merged

4. 工作原理拆解:为什么 VTA 如此高效?

4.1 向量时间步 vs 标量时间步

对比点 标量时间步 向量时间步
控制粒度 整段视频同步 每帧独立
条件生成 必须改网络 只需改采样策略
训练数据 高冗余,重复学 低冗余,直接学
遗忘风险 容易忘记 T2V 几乎无遗忘

4.2 训练策略:完全随机时间步

  • 每帧 τᵢ 独立采样自 U[0,1]
  • 模型必须学会“什么时候参考条件帧、什么时候自由生成”;
  • 这种随机性迫使网络学到通用时序先验,而非特定布局。

4.3 参数漂移可视化

官方实验显示:

  • Wan-I2V 改动 7 亿参数,Pusa 只改动 1 千万参数(LoRA);
  • Pusa 的注意力图与原始 Wan-T2V 更相似,说明只改了“何时看条件帧”而非“如何画内容”

5. 常见问题 FAQ

Q1:显存不够怎么办?

  • --offload 打开,可把 30 GB 需求降到 12 GB;
  • 或者使用梯度检查点(已内置)。

Q2:LoRA 和全量微调差多少?

方案 显存 训练时间 分数差距
LoRA rank-512 8×80 GB 2 h 87.32 %
Full FT 4×880 GB 3 d 87.90 %

0.6 % 的差距换 200× 成本下降,多数人用 LoRA 即可。

Q3:视频最长能到多少?

  • 官方脚本默认 81 帧(≈ 3 秒 24 fps);
  • --num_frames 设成 161 帧即可 6 秒,显存线性增加。

Q4:会不会忘记文本-到-视频能力?

  • 不会。LoRA 只更新 <1 % 权重,官方评测 T2V 质量与基线一致。

6. 典型应用场景速配表

场景 推荐命令 关键参数
产品广告 infer_i2v.py --noise_multiplier 0.2 防抖动
故事板预览 infer_start_end.py 首尾帧 + 提示词
老视频续拍 infer_extension.py --cond_position "[-1]" 只参考最后一帧
多视角合成 infer_multi_frames.py 3-5 张关键帧
动图表情包 infer_t2v.py --num_steps 4 极速出片

7. 版本与路线图

版本 基座模型 能力 时间
V0.5 Mochi-1-Preview T2V, I2V, 续写 2025-04
V1.0 Wan-T2V-14B 同上 + 首尾帧 2025-07
V1.1 Wan-T2V-14B 长视频 最长 60 s 计划中
V2.0 下一代开源模型 任意时长、4K 社区共研

8. 一句话结论

把「同步降噪」改成「逐帧降噪」,Pusa 用 500 美元和 3 860 条数据就做到了别人 10 万美元、1 000 万条数据才能勉强达到的效果,而且一次训练、六类任务零样本通用。如果你只想记住一件事:先下模型,跑通一条命令,再决定是否微调——从下载到出片,全程不到 30 分钟。