Wan-Animate-2开源发布:支持推理训练与硬件优化

近期,万相团队正式开源新一代端到端角色动画模型Wan-Animate-2,这是对前代Wan-Animate的重大架构升级。这款基于双分支Diffusion Transformer(DiT)的框架,彻底摆脱了对显式姿态骨架和辅助姿态提取网络的依赖,直接从参考视频中捕捉运动先验,实现了多项突破性能力。
模型支持高保真跨身份动作迁移,即便目标角色与参考角色在体型、外观上差异巨大,也能将参考视频中的动作与表情完美迁移到静态参考图上;同时支持文本驱动的相机视角控制,用户可以通过类似“right 60-degree view”“top angle”的提示调整输出视角;此外还提供了可达24fps的实时流式生成变体,适配直播数字人、交互式虚拟环境等实时场景。
在用户盲测评估中,Wan-Animate-2在整体质量上超过前代模型的比例超过70%,并达到了与Dreamina、Kling-MotionControl等主流商业方案相当的水准。目前相关体验已在开源AI平台上线,支持免费在线试用。
Wan-Animate-2的生成效果覆盖多种场景,具体包括以下几类:
- 高保真单人动画:支持真人、卡通形象、机器人、动物等多种主体,在复杂舞蹈、微表情、乐器演奏、轮滑等高动态、非刚性动作场景下均可保持稳定输出,细节还原度出色。
- 多人交互动画:在多角色同框场景中,能够保持各角色的身份特征与动作独立性,完美适配情侣舞、双人舞等需要角色间互动的场景。
- 多机位视角控制:通过文本提示即可灵活调整相机视角,将输出视角与驱动视频解耦,即使视角发生显著变化,也能保证场景环境的一致性。
- 实时流式生成:Wan-Animate-2-Lite版本采用分块自回归方式生成视频,在长序列生成过程中不会累积误差,满足实时创作需求。
相比初代Wan-Animate,新版本能够自动完成动作重定向,直接按照参考图的实际尺寸驱动生成,在复杂肢体动作、表情细节与手部动作上的伪影和形变问题大幅减少。
Wan-Animate-2的核心设计思路是:参考视频本身已经包含最鲁棒的运动先验,因此无需再借助骨架、SMPL或人脸关键点等中间表示。模型直接将参考视频patchify后的隐变量送入DiT网络,绕开了中间特征提取器带来的误差,同时缓解了跨身份迁移时常见的身份漂移问题。围绕这一思路,Base模型引入了多项关键设计:
双分支DiT架构:参考分支与去噪latent分支共享同一套QKV投影参数,但独立运行。其中latent分支处于扩散时间步t,参考分支锚定在t=0时刻,用于提供干净无噪的运动先验。参考分支将key/value传递给latent分支,两条流各自独立计算注意力,既保留了参考分支的结构独立性,又避免了将所有token拼接成单一长序列做全自注意力带来的巨大计算开销。
Time-Align RoPE位置编码:引入参考分支后,若两条分支套用同一套旋转位置编码会产生歧义并影响训练稳定性。该机制将参考视频token逐帧拼接到去噪序列前方,构成统一的时间流,并根据参考图与目标输出各自的latent尺寸动态计算空间偏移,确保在不同分辨率下都能保持精确的时空对应关系。
Sparse-Ref Attention稀疏注意力:在双分支基础上引入时间约束的注意力掩码,latent分支的query仅关注参考分支中时间上对应的key/value token,同时保留latent流内部的完整自注意力。基于角色动画中参考帧与目标帧天然逐帧对齐的特性,该机制剪除了非必要的跨序列交互,在不损失运动保真度的前提下显著降低了计算与显存开销。
Viewpoint LoRA视角控制模块:为解耦相机视角与动作,将视角调整简化为文本驱动任务。模型在12个方位角和4个仰角构成的离散视角空间上,通过文本描述相机状态,并通过接入cross-attention层的轻量LoRA实现视角操控。相比ReCamMaster等方案需要精确相机参数回归的方式,文本驱动对用户更加友好,该LoRA模块使用约5万个Unreal Engine渲染的多视角样本训练完成。
在训练数据方面,Wan-Animate-2使用超过10万对由动画模型合成的配对视频作为主训练语料,参考图由多个图像生成模型生成,覆盖全身、半身、特写等多种镜头,最高分辨率可达2.5K。
针对实时推理场景推出的Wan-Animate-2-Lite版本,采用因果DiT做分块自回归生成(每块8帧),训练分为三个阶段:首先通过teacher forcing预训练将扩散模型改造为逐块因果生成,并引入error buffer机制,将真实预测残差注入训练上下文以缓解曝光偏差,支持任意长序列生成而不累积误差;其次通过Self-Forcing蒸馏将多步去噪过程压缩为更少步数;最后配套chunk-wise反向传播策略,将14B模型的峰值显存从“随序列长度”降低到“随单块长度”,使得Self-Forcing蒸馏在14B规模下可行。在4卡H100上以流水线并行部署时,400×720分辨率、3步去噪即可达到24fps,满足实时生成阈值。
官方代码部署
环境安装
首先克隆包含子模块的官方仓库:
git clone --recursive https://github.com/Wan-Video/Wan2.2-Animate-2.git
安装依赖与flash_attn加速库:
pip install -r requirements.txt pip install flash-attn --no-build-isolation
模型下载
通过开源模型平台下载模型权重:
pip install modelscope modelscope download --model Wan-AI/Wan2.2-Animate-2-14B --local_dir ./ckpts/
推理流程
推理前,需要先用大语言模型配合指定提示词为参考图生成客观描述,再将该描述作为Wan-Animate-2的生成prompt。提示词范式示例:
用中文客观描述图片中的内容,包括以下要点:人物外观描述,不描述动作行为。背景描述,忽略主观评价和情绪推测。下面给出描述范例,必须遵循这个范式,不要输出额外的符号: 人物外观描述:穿着一件浅蓝色的校服衬衫,领口和袖口有白色边饰。胸前有一个圆形徽章。 背景描述:背景为明亮、整洁的教室或办公室,氛围安静有序。
执行推理的命令示例:
export PYTHONPATH="$(pwd)" python wan_animate_2_demo.py \ --prompt "人物外观描述:一个人形机器人,躯干和四肢主要由银灰色金属外壳构成,关节连接处为黑色。头部呈黑色流线型,面部区域有一圈发光的蓝色 LED 灯带。双手佩戴黑色手套,双脚穿着黑色的鞋状足部组件。背景描述:背景为室外铺设有灰色地砖的广场或人行道,身后有一根巨大的白色圆柱。左后方停放着白色和深色的汽车,右后方有绿色的灌木丛,光线为自然日光。" \ --refer-img-file ../examples/demo1/refer.jpeg \ --refer-video-file ../examples/demo1/template.mp4
Diffusers部署方案
目前Diffusers对Wan-Animate-2的支持以公开PR的形式提供,尚未合入主干分支,安装时需要指定该PR分支,当前仅覆盖推理功能,训练需使用下文的DiffSynth-Studio方案。
环境安装
pip install "git+https://github.com/huggingface/diffusers.git@refs/pull/14412/head" pip install flash-attn --no-build-isolation
模型下载
pip install modelscope modelscope download --model Wan-AI/Wan2.2-Animate-2-14B-Diffusers --local_dir ./Wan2.2-Animate-2-14B-Diffusers
推理代码示例
import torch from diffusers import WanAnimate2Pipeline from diffusers.utils import export_to_video, load_imagepipe = WanAnimate2Pipeline.from_pretrained(
“./Wan2.2-Animate-2-14B-Diffusers”, torch_dtype=torch.bfloat16
).to(“cuda”)
output = pipe(
image=load_image(“reference.png”),
driving_video=“driving.mp4”,
prompt=“人物外观描述:一名长黑发女性,穿着白色半透明蕾丝长袖上衣。背景描述:背景为现代室内空间,墙面和柜体以浅灰色为主。”,
height=800,
width=640,
num_inference_steps=40,
)
export_to_video(output.frames[0], “output.mp4”, fps=24)
对于蒸馏版本,可使用10步去噪、关闭CFG,并搭配Euler调度器:
pipe = WanAnimate2Pipeline.from_pretrained(
"./Wan2.2-Animate-2-14B-Distilled-Diffusers", torch_dtype=torch.bfloat16
).to("cuda")
output = pipe(
image=load_image("reference.png"),
driving_video="driving.mp4",
prompt="人物外观描述:...;背景描述:...",
num_inference_steps=10,
guidance_scale=1.0,
flow_solver="euler",
)
export_to_video(output.frames[0], "output.mp4", fps=24)
DiffSynth-Studio部署方案
安装依赖
git clone https://github.com/modelscope/DiffSynth-Studio.git cd DiffSynth-Studio pip install -e ".[all]"
推理示例
import torch from PIL import Image from diffsynth.utils.data import save_video, VideoData from diffsynth.pipelines.wan_video import WanVideoPipeline, ModelConfig from modelscope import dataset_snapshot_downloadvram_config = {
“offload_dtype”: “disk”,
“offload_device”: “disk”,
“onload_dtype”: torch.bfloat16,
“onload_device”: “cpu”,
“preparing_dtype”: torch.bfloat16,
“preparing_device”: “cuda”,
“computation_dtype”: torch.bfloat16,
“computation_device”: “cuda”,
}pipe = WanVideoPipeline.from_pretrained(
torch_dtype=torch.bfloat16,
device=“cuda”,
model_configs=[
ModelConfig(model_id=“Wan-AI/Wan2.2-Animate-2-14B”, origin_file_pattern=“wan_animate_2/wan_animate_2_bf16.safetensors”, **vram_config),
ModelConfig(model_id=“Wan-AI/Wan2.2-Animate-2-14B”, origin_file_pattern=“videomodel/Wan-AI/models_t5_umt5-xxl-enc-bf16.pth”, **vram_config),
ModelConfig(model_id=“Wan-AI/Wan2.2-Animate-2-14B”, origin_file_pattern=“videomodel/Wan-AI/models_clip_open-clip-xlm-roberta-large-vit-huge-14.pth”, **vram_config),
ModelConfig(model_id=“Wan-AI/Wan2.1-T2V-14B”, origin_file_pattern=“Wan2.1_VAE.pth”, **vram_config),
],
tokenizer_config=ModelConfig(model_id=“Wan-AI/Wan2.2-Animate-2-14B”, origin_file_pattern=“videomodel/Wan-AI/umt5-xxl/”),
vram_limit=torch.cuda.mem_get_info(“cuda”)[1] / (1024 ** 3) - 0.5,
)下载示例数据集
dataset_snapshot_download(
“DiffSynth-Studio/diffsynth_example_dataset”,
local_dir=“data/diffsynth_example_dataset”,
allow_file_pattern=“wanvideo/Wan2.2-Animate-2-14B/*”
)reference_image = Image.open(“data/diffsynth_example_dataset/wanvideo/Wan2.2-Animate-2-14B/refimage.jpg”).convert(“RGB”)
reference_video = VideoData(“data/diffsynth_example_dataset/wanvideo/Wan2.2-Animate-2-14B/refvideo.mp4”).raw_data()单片段生成示例
num_frames = 81
video = pipe(
prompt=“人物外观描述:一名长黑发女性,穿着白色半透明蕾丝长袖上衣,衣身带有花卉刺绣,下身搭配白色百褶短裙和黑色腰带,脚穿米白色厚底运动鞋。 背景描述:背景为现代室内空间,墙面和柜体以浅灰色为主,后方设有两扇深色落地窗或玻璃门,顶部安装长条形灯具,中央有一块浅色长方形台面。”,
negative_prompt=“色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走”,
animate2_prompt_ref=“视频中的人在做动作,背景静止”,
animate2_reference_image=reference_image,
animate2_reference_video=reference_video[:num_frames],
animate2_offload_kv=True,
num_frames=num_frames, height=1280, width=720,
num_inference_steps=40, cfg_scale=3.0,
seed=0, tiled=True,
)
save_video(video, “video_Wan2.2-Animate-2-14B.mp4”, fps=24, quality=5)
训练流程
modelscope download --dataset DiffSynth-Studio/diffsynth_example_dataset --include "wanvideo/Wan2.2-Animate-2-14B/*" --local_dir ./data/diffsynth_example_datasetaccelerate launch examples/wanvideo/model_training/train.py
–dataset_base_path data/diffsynth_example_dataset/wanvideo/Wan2.2-Animate-2-14B
–dataset_metadata_path data/diffsynth_example_dataset/wanvideo/Wan2.2-Animate-2-14B/metadata.json
–data_file_keys “video,animate2_reference_image,animate2_reference_video”
–height 640
–width 352
–num_frames 81
–dataset_repeat 1
–model_id_with_origin_paths “Wan-AI/Wan2.2-Animate-2-14B:videomodel/Wan-AI/models_t5_umt5-xxl-enc-bf16.pth,Wan-AI/Wan2.2-Animate-2-14B:videomodel/Wan-AI/models_clip_open-clip-xlm-roberta-large-vit-huge-14.pth,Wan-AI/Wan2.1-T2V-14B:Wan2.1_VAE.pth”
–learning_rate 1e-4
–num_epochs 5
–remove_prefix_in_ckpt “pipe.dit.”
–output_path “./models/train/Wan2.2-Animate-2-14B_lora_splited_cache”
–lora_base_model “dit”
–lora_target_modules “self_attn.q,self_attn.k,self_attn.v”
–lora_rank 32
–extra_inputs “animate2_prompt_ref,animate2_reference_image,animate2_reference_video”
–use_gradient_checkpointing
–task “sft:data_process”accelerate launch --config_file examples/wanvideo/model_training/full/accelerate_config_14B.yaml examples/wanvideo/model_training/train.py
–dataset_base_path models/train/Wan2.2-Animate-2-14B_lora_splited_cache
–data_file_keys “video,animate2_reference_image,animate2_reference_video”
–height 640
–width 352
–num_frames 81
–dataset_repeat 100
–model_id_with_origin_paths “Wan-AI/Wan2.2-Animate-2-14B:wan_animate_2/wan_animate_2_bf16.safetensors”
–learning_rate 1e-4
–num_epochs 5
–remove_prefix_in_ckpt “pipe.dit.”
–output_path “./models/train/Wan2.2-Animate-2-14B_lora”
–lora_base_model “dit”
–lora_target_modules “self_attn.q,self_attn.k,self_attn.v”
–lora_rank 32
–extra_inputs “animate2_prompt_ref,animate2_reference_image,animate2_reference_video”
–use_gradient_checkpointing
–task “sft:train”
英特尔已完成Wan-Animate-2在锐炫Pro B70上的端到端适配,与模型开源同步提供Day 0支持。本次适配基于llm-scaler omni项目中的ComfyUI-OmniXPU自定义节点,完成了omni-xpu-kernel算子对接,并支持context-windows和loop两类视频生成工作流。
在优化过程中,团队发现原有OmniXPU adapter的准入策略未覆盖Wan-Animate-2的张量形状特征,导致大量attention调用回落至PyTorch原生实现。将基于特定形状枚举的准入机制重构为形状无关的判断逻辑后,cross-attention算子可全面调用XPU高性能内核,端到端推理性能在FP16和BF16精度下分别提升13.1%和14.5%。
锐炫Pro B70采用Xe2架构,配备32个Xe核心、256个XMX AI引擎、32GB GDDR6显存和608GB/s显存带宽,峰值INT8算力367 TOPS,能够为本地角色动画创作提供充足的算力支撑。

