步数蒸馏¶
步数蒸馏是 LightX2V 中的一项重要优化技术,通过训练蒸馏模型将推理步数从原始的 40-50 步大幅减少到 4 步,在保持视频质量的同时显著提升推理速度。LightX2V 在实现步数蒸馏的同时也加入了 CFG 蒸馏,进一步提升推理速度。
🔍 技术原理¶
DMD 蒸馏¶
步数蒸馏的核心技术是 DMD 蒸馏。DMD 蒸馏的框架如下图所示:
DMD蒸馏的核心思想是最小化蒸馏模型与原始模型输出分布的 KL 散度:
由于直接计算概率密度几乎是不可能的,因此 DMD 蒸馏改为计算这个 KL 散度的梯度:
其中 \(s_\text{real}(x) =\nabla_{x} \text{log}~p_\text{real}(x)\) 和 \(s_\text{fake}(x) =\nabla_{x} \text{log}~p_\text{fake}(x)\) 为得分函数。得分函数可以由模型进行计算。因此,DMD 蒸馏一共维护三个模型:
real_score,计算真实分布的得分;由于真实分布是固定的,因此 DMD 蒸馏使用固定权重的原始模型作为其得分函数;fake_score,计算伪分布的得分;由于伪分布是不断更新的,因此 DMD 蒸馏使用原始模型对其初始化,并对其进行微调以学习生成器的输出分布;generator,学生模型,通过计算real_score与fake_scoreKL 散度的梯度指导其优化方向。
参考文献:
Self-Forcing¶
DMD 蒸馏技术是针对图像生成的。Lightx2v 中的步数蒸馏基于 Self-Forcing 技术实现。Self-Forcing 的整体实现与 DMD 类似,但是仿照 DMD2,去掉了它的回归损失,而是使用了 ODE 初始化。此外,Self-Forcing 针对视频生成任务加入了一个重要优化:
目前基于 DMD 蒸馏的方法难以一步生成视频。Self-Forcing 每次选择一个时间步进行优化,generator 仅仅在这一步计算梯度。这种方法使得 Self-Forcing 的训练速度显著提升,并且提升了中间时间步的去噪质量,其效果亦有所提升。
参考文献:
Lightx2v¶
Self-Forcing 针对 1.3B 的自回归模型进行步数蒸馏、CFG蒸馏。LightX2V 在其基础上,进行了一系列扩展:
- 更大的模型:支持 14B 模型的步数蒸馏训练;
- 更多的模型:支持标准的双向模型,以及 I2V 模型的步数蒸馏训练;
- 更好的效果:Lightx2v 使用了约 50,000 条数据的高质量 prompt 进行训练;
具体实现可参考 Self-Forcing-Plus。
🎯 技术特性¶
- 推理加速:推理步数从 40-50 步减少到 4 步且无需 CFG,速度提升约 20-24x
- 质量保持:通过蒸馏技术保持原有的视频生成质量
- 兼容性强:支持 T2V 和 I2V 任务
- 使用灵活:支持加载完整步数蒸馏模型,或者在原生模型的基础上加载步数蒸馏LoRA;支持与 int8/fp8 模型量化相兼容
🛠️ 配置文件说明¶
基础配置文件¶
在 configs/distill/ 目录下提供了多种配置选项:
| 配置文件 | 用途 | 模型地址 |
|---|---|---|
| wan_t2v_distill_model_4step_cfg.json | 加载 T2V 4步蒸馏完整模型 | hugging-face |
| wan_i2v_distill_model_4step_cfg.json | 加载 I2V 4步蒸馏完整模型 | hugging-face |
| wan_t2v_distill_lora_4step_cfg.json | 加载 Wan-T2V 模型和步数蒸馏 LoRA | hugging-face |
| wan_i2v_distill_lora_4step_cfg.json | 加载 Wan-I2V 模型和步数蒸馏 LoRA | hugging-face |
关键配置参数¶
- 设置
distill_method: "dmd2",使用 WanStepDistillScheduler。 infer_steps,denoising_step_list和sample_shift设置为与训练时相匹配的参数,一般不建议用户修改。enable_cfg沿用所选模型配置;本文 Wan2.1 示例使用false。- 使用蒸馏 LoRA 时,在
lora_configs中设置路径和强度,同时保留distill_method: "dmd2"。加载完整蒸馏模型且不叠加 LoRA 时,省略lora_configs。
下面是字段片段,需合并到与所选权重匹配的完整配置中。infer_steps 表示推理步数,denoising_step_list 表示去噪时间步列表,sample_shift 表示调度器的 timestep shift。
{
"distill_method": "dmd2",
"infer_steps": 4,
"denoising_step_list": [
1000,
750,
500,
250
],
"sample_shift": 5,
"enable_cfg": false,
"lora_configs": [
{
"path": "path/to/distill_lora.safetensors",
"strength": 1.0
}
]
}
📜 使用方法¶
模型准备¶
完整模型:
--model_path 指向包含 config.json 和编码器、VAE 权重的原始 Wan 模型目录。dit_original_ckpt 指向蒸馏 safetensors 文件;量化权重使用 dit_quantized_ckpt,并设置 dit_quantized=true 和对应的 dit_quant_scheme。使用 distill_model.pt 时,移除配置中的 dit_original_ckpt,并将文件放在 --model_path 根目录。
LoRA:
- 将下载好的 LoRA 放到任意位置
- 修改配置文件中的
lora_configs[].path参数为 LoRA 存放路径即可
推理脚本¶
T2V 完整模型:
I2V 完整模型:
步数蒸馏 LoRA 推理脚本¶
T2V LoRA:
I2V LoRA:
🔧 服务化部署¶
启动蒸馏模型服务¶
对 scripts/server/start_server.sh 中的启动命令进行修改:
python -m lightx2v.server \
--model_cls wan2.1 \
--task t2v \
--model_path $model_path \
--config_json ${lightx2v_path}/configs/distill/wan21/wan_t2v_distill_model_4step_cfg.json \
--port 8000
运行服务启动脚本:
更多详细信息见服务化部署。
在 Gradio 界面中使用¶
安装与使用方法见独立仓库 Gradio-Lightx2v。