首页
/ Diffusers EasyAnimateTransformer3DModel 详解:视频扩散 Transformer 架构与实战加载

Diffusers EasyAnimateTransformer3DModel 详解:视频扩散 Transformer 架构与实战加载

2026-09-10 17:52:21作者:翟萌耘Ralph

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 直接使用,作为去噪骨干网络:

从其类定义可看出,它同时继承 ModelMixinConfigMixin(见 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(为 Truetext_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=48text_embed_dim=3584add_noise_in_inpaint_model=True),这正是 V5.1 12B 模型使用的真实配置。

模型内部架构剖析

模块构造代码 可以还原出完整的网络结构,共 6 个组成部分:

  1. 时间步嵌入time_proj = Timesteps(inner_dim, flip_sin_to_cos, freq_shift) 生成正弦时间编码,经 time_embedding = TimestepEmbedding(inner_dim, time_embed_dim, "silu") 映射为条件向量 temb
  2. 3D RoPE 位置编码rope_embedding = EasyAnimateRotaryPosEmbed(patch_size, attention_head_dim) 负责为视频的帧、高、宽三维网格生成旋转位置编码。
  3. Patch 嵌入self.proj 是一个 nn.Conv2d(in_channels, inner_dim, kernel_size=patch_size, stride=patch_size),将逐帧空间特征切分为 patch 并投影到模型维度。
  4. 文本投影text_proj(以及可选的 text_proj_t5)把文本编码器输出投影到与视频 token 相同的维度;若同时传入 T5 嵌入,两者会在序列维度拼接。
  5. Transformer 块栈transformer_blocksnum_layersEasyAnimateTransformerBlock,其中前 mmdit_layers 个配置为多模态块(is_mmdit_block=True)。
  6. 输出头norm_final(LayerNorm)→ norm_out(AdaLayerNorm,按 temb 生成 shift/scale)→ proj_out(线性层,输出 patch_size * patch_size * out_channels 用于还原 patch)→ unpatchify 重组为视频形状。

EasyAnimateTransformerBlock:多模态 DiT 块

单个块(实现见此处)的结构为:

  • norm1EasyAnimateLayerNormZero):把 temb 经 SiLU + 线性层投影为 6 组 shift/scale/gate,分别作用于视频隐藏状态与文本隐藏状态,实现 AdaLN-Zero 式条件调制。
  • attn1Attention):使用 EasyAnimateAttnProcessor2_0 处理器。当 is_mmdit_block=True 时,注意力同时携带文本条件分支(added_kv_proj_dimcontext_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+,核心流程为:

  1. 若为 MMDiT 块,先拼接文本与视频 token;
  2. 计算 QKV 投影并重塑为多头;
  3. 对 Q/K 做可选的 QK 归一化(norm_q / norm_k);
  4. 对文本分支单独投影 QKV(add_q_proj / add_k_proj / add_v_proj)后拼入注意力序列;
  5. 对视频部分的 Q/K 施加 3D RoPE;
  6. 调用 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 组装为对话格式后编码;
  • VAEAutoencoderKLMagvit(详见 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=4patch_size=2num_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 端到端生成视频,理解其参数与内部数据流都是用好这一模型的基础。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.16 K
2.78 K
kernelkernel
deepin linux kernel
C
34
18
docsdocs
暂无描述
Markdown
904
5.83 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
932
1.86 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
862
1.36 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.95 K
1.03 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.38 K
1.47 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
535
606
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
549
398
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Markdown
77
23