00 前言
2025年1月,阿里通义万相Wan2.1模型登顶Vbench榜首第一,超越Sora、HunyuanVideo、Minimax、Luma、Gen3、Pika等国内外视频生成模型。而在今天,万相Wan2.1视频生成大模型正式开源!
Github:
模型:
https://modelscope.cn/organization/Wan-AI
截止到目前,Wan2.1在vbench榜单中仍处在榜首位置。
01 模型生成效果
万相Wan2.1是首个具备支持中文文字生成能力,且同时支持中英文文字特效生成的视频生成模型。用户只需输入简短的文字描述,即可生成具有电影级效果的文字和动画。支持多种场景下的字体应用,包括特效字体、海报字体以及真实场景中的字体展示,满足各种专业需求。
万相Wan2.1已上线魔搭社区创空间,可以直接体验
DEMO:
https://modelscope.cn/studios/Wan-AI/Wan-2.1
02 Wan2.1的技术创新
万相大模型架构是主流的DiT,基于线性噪声轨迹Flow Matching范式训练,通过两个重要的技术创新实现了生成能力的大幅提升。
(一)特征缓存机制实现高效VAE
为了高效支持任意长度视频的编码和解码,万相在3D VAE的因果卷积模块中实现了特征缓存机制,从而代替直接对长视频端到端的编解码过程。这使显存的使用仅与Chunk大小相关而与原始视频长度无关,从而实现无限长1080P视频的高效编解码。
特征缓存机制
实验结果表明,万相的视频VAE在各项指标上均表现出极具竞争力的性能,展现出卓越视频质量和高处理效率的双重优势。下图展示了不同VAE模型的模型计算效率和视频压缩重构指标的结果以及对应可视化对比,可以看到万相VAE在较小的模型参数下,实现了业内领先的视频压缩重构质量。
值得注意的是,在相同的硬件环境(单个A800 GPU)下,Wan2.1的VAE重建速度比现有的最先进方法(如HunYuanVideo)快2.5倍。由于Wan2.1的VAE模型小尺寸设计和特征缓存机制,这种速度优势在更高分辨率下将更加明显。
万相视频VAE和其他VAE对比
(二)共享时间步特征映射实现高效视频DiT
万相模型架构基于主流的视频DiT结构,整体训练则采用了线性噪声轨迹的流匹配(Flow Matching)方法。关键的是,万相通过一组在所有Transformer Block中共享参数的MLP,将输入的时间步特征T映射为模型中AdaLN层的可学习缩放与偏置参数。实验证明在相同的参数规模下,这种共享时间步特征映射层参数的方法在保持模型能力同时可以显著降低参数和计算量。
万相视频模型架构图
数据精制和训练流程
万相构建了O(1)B量级视频和 O(10)B量级图像的训练数据集,这些数据来源于内部版权资源和公开数据集,同时设计了一个四步数据清洗流程,重点关注基础维度、视觉质量和运动质量。对应的整个预训练过程也分为四个阶段,每个阶段逐渐增加分辨率和视频时长,让模型在一定算力限制下得到更充分的训练。最终的SFT阶段,进行了更严格的数据过滤,保障模型稳定收敛到高质量视频输出。
数据清洗流程
全系列模型开源
万相团队开源全部推理代码和权重,包括两种尺寸的模型,1.3B参数的极速版和14B参数的专业版。即使是1.3B参数的极速版,其度量结果不仅超过了更大尺寸的开源模型,甚至还和一些闭源的模型结果接近。推理仅需8.19GB显存进行推理,可在消费级显卡上使用。其他不同参数量的模型,在不同GPU卡型上的推理耗时(秒)和显存消耗可以在下面的表格中查看。
Wan2.1系列模型在不同GPU配置上推理性能
03模型推理与训练定制
魔搭社区的DiffSynth-Studio项目是社区针对AIGC模型生态,提供的全链路的推理和训练优化的开源工具(https://github.com/modelscope/DiffSynth-Studio)。
本次DiffSynth-Studio也第一时间为Wan2.1系列模型提供了全面支持。
详细信息可参考:
https://github.com/modelscope/DiffSynth-Studio/tree/main/examples/wanvideo
安装
通过以下命令可下载并安装 DiffSynth-Studio:
git clone https://github.com/modelscope/DiffSynth-Studio.git cd DiffSynth-Studio pip install -e .
模型下载
modelscope download --model Wan-AI/Wan2.1-T2V-1.3B --local_dir ./models/Wan-AI/Wan2.1-T2V-1.3B modelscope download --model Wan-AI/Wan2.1-T2V-14B --local_dir ./models/Wan-AI/Wan2.1-T2V-14B modelscope download --model Wan-AI/Wan2.1-I2V-14B-480P --local_dir ./models/Wan-AI/Wan2.1-I2V-14B-480P modelscope download --model Wan-AI/Wan2.1-I2V-14B-720P --local_dir ./models/Wan-AI/Wan2.1-I2V-14B-720P
模型推理
1.3B 模型
运行 1.3B 文生视频模型的代码(提示词等参数可在代码文件中进行修改):
python examples/wanvideo/wan_1.3b_text_to_video.py
1.3B 模型需要 6G 显存即可运行。
14B 模型
运行 14B 文生视频和图生视频模型的代码:
python examples/wanvideo/wan_14b_text_to_video.py python examples/wanvideo/wan_14b_image_to_video.py
对于 14B 的模型,由于模型参数量较大,我们在DiffSynth里默认开启了 FP8 量化,24G 显存即可运行。此外,DiffSynth提供了显存管理技术,可以通过控制代码中的 num_persistent_param_in_dit参数,来平衡显存需求和计算速度。该参数越大,计算速度越快,对应需要的显存也越多。用户可根据自己的设备配置,来选择合适的参数,具体参数可在上述脚本中调整。以下是我们在 A100 单卡上实测的结果:
torch_dtype |
num_persistent_param_in_dit |
计算速度 |
显存需求 |
默认设置 |
torch.bfloat16 |
None |
18.5s/it |
40G |
|
torch.bfloat16 |
7000000000 |
20.8s/it |
24G |
|
torch.bfloat16 |
0 |
23.4s/it |
10G |
|
torch.float8_e4m3fn |
None |
18.3s/it |
24G |
✅ |
torch.float8_e4m3fn |
0 |
24.0s/it |
10G |
此外DiffSynth里面也全面支持了Wan2.1的图生视频模型,具体可以参见https://github.com/modelscope/DiffSynth-Studio/tree/main/examples/wanvideo 目录下的i2v范例。
模型微调训练(LoRA)
DiffSynth-Studio 同时也提供了Wan2.1系列模型的 LoRA 微调训练支持。以Wan 文生视频1.3B为例,开发者可按以下步骤进行微调训练。
第一步:安装额外依赖包。
pip install peft lightning pandas
第二步:按以下格式整理视频数据集文件。
data/example_dataset/ ├── metadata.csv └── train ├── video_00001.mp4 └── video_00002.mp4
其中的 metadata.csv中保存了每个视频的文本描述,格式如下:
file_name,text video_00001.mp4,"video description" video_00001.mp4,"video description"
第三步:启动数据处理进程,如果数据量过大,可通过修改 CUDA_VISIBLE_DEVICES来开启多卡并行处理。
CUDA_VISIBLE_DEVICES="0" python examples/wanvideo/train_wan_t2v.py \ --task data_process \ --dataset_path data/example_dataset \ --output_path ./models \ --text_encoder_path "models/Wan-AI/Wan2.1-T2V-1.3B/models_t5_umt5-xxl-enc-bf16.pth" \ --vae_path "models/Wan-AI/Wan2.1-T2V-1.3B/Wan2.1_VAE.pth" \ --tiled \ --num_frames 81 \ --height 480 \ --width 832
数据处理完毕后,文件列表如下。其中的 .pth文件为模型处理得到的中间变量,对于存在长度过短、无法读取等问题的视频,无对应的 .pth文件生成。
data/example_dataset/ ├── metadata.csv └── train ├── video_00001.mp4 ├── video_00001.mp4.tensors.pth ├── video_00002.mp4 └── video_00002.mp4.tensors.pth
第四步:开始训练,如果有多个 GPU,可通过修改 CUDA_VISIBLE_DEVICES来开启多卡并行训练。
CUDA_VISIBLE_DEVICES="0" python examples/wanvideo/train_wan_t2v.py \ --task train \ --dataset_path data/example_dataset \ --output_path ./models \ --dit_path "models/Wan-AI/Wan2.1-T2V-1.3B/diffusion_pytorch_model.safetensors" \ --steps_per_epoch 500 \ --max_epochs 10 \ --learning_rate 1e-4 \ --lora_rank 4 \ --lora_alpha 4 \ --lora_target_modules "q,k,v,o,ffn.0,ffn.2" \ --accumulate_grad_batches 1 \ --use_gradient_checkpointing
第五步:测试 LoRA 模型的效果,将 LoRA 模型文件的路径填入以下代码中,即可运行测试 LoRA 模型的效果。
import torch from diffsynth import ModelManager, WanVideoPipeline, VideoData, save_video model_manager = ModelManager(torch_dtype=torch.bfloat16, device="cpu") model_manager.load_models([ "models/Wan-AI/Wan2.1-T2V-1.3B/diffusion_pytorch_model.safetensors", "models/Wan-AI/Wan2.1-T2V-1.3B/models_t5_umt5-xxl-enc-bf16.pth", "models/Wan-AI/Wan2.1-T2V-1.3B/Wan2.1_VAE.pth", ]) model_manager.load_lora("models/lightning_logs/version_1/checkpoints/epoch=0-step=500.ckpt", lora_alpha=1.0) pipe = WanVideoPipeline.from_model_manager(model_manager, device="cuda") pipe.enable_vram_management(num_persistent_param_in_dit=None) # Text-to-video video = pipe( prompt="...", negative_prompt="...", num_inference_steps=50, seed=0, tiled=True ) save_video(video, "video_with_lora.mp4", fps=30, quality=5)