Diffusers EasyAnimateTransformer3DModel 详解:视频扩散 Transformer 架构与实战加载
EasyAnimateTransformer3DModel 是 🤗 Diffusers 中对阿里巴巴 PAI 团队 EasyAnimate 系列视频生成模型的官方适配实现,它是一类处理视频潜在特征(latent)的 Diffusion Transformer(DiT)。本文以 EasyAnimateTransformer3DModel API 文档 为核心骨架,结合仓库内 模型源码、EasyAnimate 视频生成 Pipeline 与 测试用例 进行纵深讲解。读完本文,你将掌握该模型的加载方式、完整配置参数语义、内部模块结构与前向推理流程,并能在自己的视频生成任务中正确集成与使用它。
模型概述
EasyAnimateTransformer3DModel 是一个面向视频类三维数据的 Diffusion Transformer 模型,由阿里巴巴 PAI 团队在 EasyAnimate 项目中提出。它接收 VAE 编码后的视频潜在表示(形状为 (batch_size, channels, num_frames, height, width) 的五维张量),在时间步(timestep)与文本条件(text embedding)的引导下执行去噪,最终由 VAE 解码还原为视频帧。
在 Diffusers 仓库中,该模型被 EasyAnimate 系列 Pipeline 直接使用,作为去噪骨干网络:
- EasyAnimatePipeline(文生视频 T2V)
- EasyAnimatePipeline 的 Inpaint 变体(pipeline_easyanimate_inpaint.py)
- EasyAnimatePipeline 的 Control 变体(pipeline_easyanimate_control.py)
从其类定义可看出,它同时继承 ModelMixin 与 ConfigMixin(见 transformer_easyanimate.py),因此既支持 from_pretrained / save_pretrained 的标准模型加载与保存流程,也支持 Diffusers 统一的配置管理、梯度检查点(_supports_gradient_checkpointing = True)与层间精度控制(_skip_layerwise_casting_patterns)等基础设施。
快速加载模型
原文档给出了最核心的加载方式——直接从 EasyAnimate 官方检查点中按 subfolder 加载 Transformer 子模型:
from diffusers import EasyAnimateTransformer3DModel
transformer = EasyAnimateTransformer3DModel.from_pretrained(
"alibaba-pai/EasyAnimateV5.1-12b-zh",
subfolder="transformer",
dtype=torch.float16,
).to("cuda") # or "mps", "xpu", "cpu"
要点说明:
- 检查点仓库结构:
alibaba-pai/EasyAnimateV5.1-12b-zh是一个多组件仓库,transformer子目录存放的就是本模型权重,因此必须显式指定subfolder="transformer"。 dtype=torch.float16:官方推荐推理精度,可显著降低显存占用;设备端支持"cuda"、"mps"、"xpu"、"cpu",其中 XPU 表示 Intel 加速卡。- 若需独立使用该模型(而非通过 Pipeline 端到端生成视频),加载后可以只调用其
forward完成单步去噪预测,输出为Transformer2DModelOutput(详见下文)。
直接实例化
除 from_pretrained 外,模型也支持按配置直接构造(测试用例 test_easyanimate.py 即采用这种方式构造小模型用于单元测试):
transformer = EasyAnimateTransformer3DModel(
num_attention_heads=2,
attention_head_dim=16,
in_channels=4,
out_channels=4,
time_embed_dim=2,
text_embed_dim=16,
num_layers=1,
sample_width=16,
sample_height=16,
patch_size=2,
)
完整配置参数详解
以下是 模型构造函数 中的全部参数及其默认值、含义说明:
| 参数 | 默认值 | 说明 |
|---|---|---|
num_attention_heads |
48 |
多头注意力使用的注意力头数量 |
attention_head_dim |
64 |
每个注意力头的通道数(inner_dim = num_attention_heads * attention_head_dim) |
in_channels |
16 |
输入潜在特征的通道数(由 VAE 的 latent 通道数决定) |
out_channels |
16 |
输出通道数 |
patch_size |
2 |
Patch 嵌入层使用的 patch 尺寸(空间维度按该值下采样) |
sample_width |
90 |
输入潜在特征宽度(对应 720 分辨率视频经 8 倍空间压缩) |
sample_height |
60 |
输入潜在特征高度(对应 480 分辨率视频经 8 倍空间压缩) |
activation_fn |
"gelu-approximate" |
前馈网络使用的激活函数 |
timestep_activation_fn |
"silu" |
生成时间步嵌入时使用的激活函数 |
freq_shift |
0 |
时间正弦嵌入的频率偏移 |
num_layers |
48 |
Transformer 块总层数 |
mmdit_layers |
48 |
其中使用多模态(MMDiT)结构的块数,前 mmdit_layers 个块为 MMDiT 块 |
dropout |
0.0 |
Dropout 概率 |
time_embed_dim |
512 |
时间步嵌入的输出维度 |
add_norm_text_encoder |
False |
是否在文本投影前先对文本嵌入做 RMSNorm(为 True 时 text_proj 变为 RMSNorm + Linear 序列) |
text_embed_dim |
3584 |
文本编码器(Qwen2-VL)输出嵌入的输入维度 |
text_embed_dim_t5 |
None |
可选第二个文本编码器(T5)的嵌入维度,非 None 时额外创建 text_proj_t5 投影层 |
norm_eps |
1e-5 |
归一化层的 epsilon |
norm_elementwise_affine |
True |
归一化层是否使用逐元素仿射 |
flip_sin_to_cos |
True |
时间嵌入中是否将 sin 翻转为 cos |
time_position_encoding_type |
"3d_rope" |
时间位置编码类型(当前实现为三维旋转位置编码 RoPE) |
after_norm |
False |
是否在前馈输出后追加一次 FP32LayerNorm 归一化 |
resize_inpaint_mask_directly |
True |
是否直接缩放 inpaint 掩码 |
enable_text_attention_mask |
True |
是否启用文本注意力掩码(Pipeline 会在初始化时读取该配置,见 pipeline_easyanimate.py) |
add_noise_in_inpaint_model |
True |
在 inpaint 模型中是否对掩码区域添加噪声 |
需要说明:docstring 中标注的默认值与构造函数签名中的默认值存在少量差异(例如 docstring 写 num_layers 默认 30、text_embed_dim 默认 4096、add_noise_in_inpaint_model 默认 False),实际生效值以构造函数签名为准(num_layers=48、text_embed_dim=3584、add_noise_in_inpaint_model=True),这正是 V5.1 12B 模型使用的真实配置。
模型内部架构剖析
从 模块构造代码 可以还原出完整的网络结构,共 6 个组成部分:
- 时间步嵌入:
time_proj = Timesteps(inner_dim, flip_sin_to_cos, freq_shift)生成正弦时间编码,经time_embedding = TimestepEmbedding(inner_dim, time_embed_dim, "silu")映射为条件向量temb。 - 3D RoPE 位置编码:
rope_embedding = EasyAnimateRotaryPosEmbed(patch_size, attention_head_dim)负责为视频的帧、高、宽三维网格生成旋转位置编码。 - Patch 嵌入:
self.proj是一个nn.Conv2d(in_channels, inner_dim, kernel_size=patch_size, stride=patch_size),将逐帧空间特征切分为 patch 并投影到模型维度。 - 文本投影:
text_proj(以及可选的text_proj_t5)把文本编码器输出投影到与视频 token 相同的维度;若同时传入 T5 嵌入,两者会在序列维度拼接。 - Transformer 块栈:
transformer_blocks为num_layers个EasyAnimateTransformerBlock,其中前mmdit_layers个配置为多模态块(is_mmdit_block=True)。 - 输出头:
norm_final(LayerNorm)→norm_out(AdaLayerNorm,按temb生成 shift/scale)→proj_out(线性层,输出patch_size * patch_size * out_channels用于还原 patch)→ unpatchify 重组为视频形状。
EasyAnimateTransformerBlock:多模态 DiT 块
单个块(实现见此处)的结构为:
norm1(EasyAnimateLayerNormZero):把temb经 SiLU + 线性层投影为 6 组 shift/scale/gate,分别作用于视频隐藏状态与文本隐藏状态,实现 AdaLN-Zero 式条件调制。attn1(Attention):使用EasyAnimateAttnProcessor2_0处理器。当is_mmdit_block=True时,注意力同时携带文本条件分支(added_kv_proj_dim、context_pre_only=False),即文本与视频 token 在同一注意力中交互(MMDiT);非 MMDiT 块则无文本分支。norm2+ff:前馈网络,同样受 gate 调制;MMDiT 块还会为文本分支单独准备txt_ff。- 可选
norm3:当after_norm=True时在 FFN 输出后追加 FP32 LayerNorm。
EasyAnimateLayerNormZero:条件归一化
该类(实现见此处)将 temb 映射为 6 个通道并切分为 (shift, scale, gate, enc_shift, enc_scale, enc_gate),对视频与文本隐藏状态分别执行 norm(x) * (1 + scale) + shift 的调制,gate 则用于残差连接加权。norm_type 支持 "layer_norm" 与 "fp32_layer_norm" 两种实现,后者在 fp16 推理下以 FP32 计算归一化以提高数值稳定性。
EasyAnimateAttnProcessor2_0:缩放点积注意力
处理器(实现见此处)要求 PyTorch 2.0+,核心流程为:
- 若为 MMDiT 块,先拼接文本与视频 token;
- 计算 QKV 投影并重塑为多头;
- 对 Q/K 做可选的 QK 归一化(
norm_q/norm_k); - 对文本分支单独投影 QKV(
add_q_proj/add_k_proj/add_v_proj)后拼入注意力序列; - 对视频部分的 Q/K 施加 3D RoPE;
- 调用
F.scaled_dot_product_attention计算注意力并分离文本/视频输出。
EasyAnimateRotaryPosEmbed:三维旋转位置编码
该类(实现见此处)针对输入 (bs, c, num_frames, grid_height, grid_width):
- 将空间网格按
patch_size缩放; - 以
(60, 90)为基准尺寸(对应sample_height=60, sample_width=90),通过get_resize_crop_region_for_grid计算等比缩放+中心裁剪区域,使不同分辨率输入都能对齐到统一的位置编码网格; - 调用 get_3d_rotary_pos_embed 生成包含帧维度在内的三维 RoPE 嵌入,从而让注意力感知帧间时序位置——这是视频生成位置信息的关键来源。
前向推理流程
模型 forward(实现见此处)接收以下参数:
| 参数 | 形状/类型 | 说明 |
|---|---|---|
hidden_states |
(B, C, F, H, W) |
视频潜在特征输入 |
timestep |
torch.LongTensor |
去噪步时间步 |
timestep_cond |
可选 | 额外的 timestep 条件嵌入,会与时间步嵌入相加 |
encoder_hidden_states |
可选 | 文本条件嵌入(如 Qwen2-VL 输出) |
encoder_hidden_states_t5 |
可选 | 第二个文本编码器(T5)的嵌入 |
inpaint_latents |
可选 | 修复(Inpaint)变体的潜在特征,在通道维拼接 |
control_latents |
可选 | 控制(Control)变体的潜在特征,在通道维拼接 |
return_dict |
bool = True |
是否返回 Transformer2DModelOutput,否则返回普通 tuple |
执行流程分为六步:时间步嵌入与 3D RoPE 生成 → Patch 嵌入(含 inpaint/control 潜在特征通道拼接,将 [B,C,F,H,W] 重排为 [B, FHW, C] 的 token 序列)→ 文本嵌入投影(可选拼接 T5 嵌入)→ 依次通过 Transformer 块(支持梯度检查点,见 _gradient_checkpointing_func)→ 输出归一化与投影 → Unpatchify 重组为 (B, C, F, H, W) 输出。
当 return_dict=True 时返回 Transformer2DModelOutput,其字段为 sample,即去噪后的视频潜在特征。该输出类型由 models/modeling_outputs.py 定义,是 Diffusers 系列 Transformer 的通用输出约定,也是原文档中 Transformer2DModelOutput 一节所引用的对象。
与 EasyAnimate Pipeline 的集成
在实际生成视频时,该模型作为 EasyAnimatePipeline 的一个组件与其他模块协同工作:
- 文本编码器:V5.1 系列使用 Qwen2-VL(
Qwen2VLForConditionalGeneration)+Qwen2Tokenizer,提示词经apply_chat_template组装为对话格式后编码; - VAE:
AutoencoderKLMagvit(详见 autoencoderkl_magvit.md),将视频编解码为潜在特征,空间压缩比 8、时间压缩比 4; - 调度器:
FlowMatchEulerDiscreteScheduler,执行 flow-matching 去噪采样; - Transformer:即本文主角,执行核心去噪预测。
Pipeline 的 model_cpu_offload_seq = "text_encoder->transformer->vae"(pipeline_easyanimate.py)定义了 CPU offload 顺序,说明 transformer 是去噪阶段的核心算力消耗点。端到端推理示例(见 EasyAnimate 文档):
import torch
from diffusers import EasyAnimatePipeline
from diffusers.utils import export_to_video
pipe = EasyAnimatePipeline.from_pretrained(
"alibaba-pai/EasyAnimateV5.1-7b-zh-diffusers", torch_dtype=torch.float16
).to("cuda")
video = pipe(
prompt="A panda, dressed in a small, red jacket...",
guidance_scale=6,
negative_prompt="bad detailed",
height=512,
width=512,
num_inference_steps=50,
).frames[0]
export_to_video(video, "output.mp4", fps=8)
EasyAnimateV5.1 系列支持 1~49 帧、宽高 256~1024 的分辨率范围,官方检查点包括:
| 检查点 | 推荐推理精度 |
|---|---|
alibaba-pai/EasyAnimateV5.1-12b-zh(T2V / I2V) |
torch.float16 |
alibaba-pai/EasyAnimateV5.1-12b-zh-InP(I2V / V2V / Inpaint) |
torch.float16 |
alibaba-pai/EasyAnimateV5.1-12b-zh-Control(Control) |
torch.float16 |
alibaba-pai/EasyAnimateV5.1-12b-zh-Control-Camera(Control-Camera) |
torch.float16 |
量化加载以降低显存
对于 12B 量级的大模型,可以使用 bitsandbytes 以 8-bit 量化加载 Transformer 子模型后再组装 Pipeline:
import torch
from diffusers import (
BitsAndBytesConfig as DiffusersBitsAndBytesConfig,
EasyAnimateTransformer3DModel,
EasyAnimatePipeline,
)
from diffusers.utils import export_to_video
quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = EasyAnimateTransformer3DModel.from_pretrained(
"alibaba-pai/EasyAnimateV5.1-12b-zh",
subfolder="transformer",
quantization_config=quant_config,
dtype=torch.float16,
)
pipeline = EasyAnimatePipeline.from_pretrained(
"alibaba-pai/EasyAnimateV5.1-12b-zh",
transformer=transformer_8bit,
dtype=torch.float16,
device_map="balanced",
)
video = pipeline(
prompt="A cat walks on the grass, realistic style.",
negative_prompt="bad detailed",
num_frames=49,
num_inference_steps=30,
).frames[0]
export_to_video(video, "cat.mp4", fps=8)
测试与工程验证
仓库测试 test_easyanimate.py 对该模型的使用方式给出了工程层面的验证:
- 快速推理测试:使用 2 头、16 维注意力头、
in_channels=4、patch_size=2、num_layers=1的微型模型构造 Pipeline,输入 5 帧 16×16 视频,断言输出形状为(5, 3, 16, 16)(帧数×RGB×高×宽); - 集成测试:加载真实
alibaba-pai/EasyAnimateV5.1-12b-zh权重,开启enable_model_cpu_offload(),以 720×480、5 帧、2 步生成并与随机张量做余弦相似度校验,验证端到端输出的数值稳定性; - 内存优化测试:覆盖 CPU offload、group offload、layerwise casting 等内存优化路径;其中测试注释说明 Sequential CPU offload 因 Qwen2-VL 文本编码器遗留 meta 设备缓冲而存在已知失败(标记为 xfail),与模型本身无关。
小结
EasyAnimateTransformer3DModel 将 EasyAnimate 的视频 DiT 架构完整落地到 Diffusers 生态:通过 3D RoPE 感知帧间时序、通过 MMDiT 块实现文本-视频联合注意力、通过 AdaLN-Zero 注入时间步条件,并以统一的 ModelMixin/ConfigMixin 接口支持标准的加载、保存、量化与内存优化能力。无论是直接加载该模型做二次开发,还是通过 EasyAnimatePipeline 端到端生成视频,理解其参数与内部数据流都是用好这一模型的基础。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.21 K637- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python270
cherry-studio🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端TypeScript2 K146
hello-agents📚 《从零开始构建智能体》——从零开始的智能体原理与实践教程Python46066
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go20143
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java34051