Diffusers 中开放视频生成模型的现状
OpenAI 的 Sora 演示标志着去年 AI 生成视频的显著进步,让我们得以一窥视频生成模型的潜力。其影响立竿见影,自那次演示以来,视频生成领域竞争日益激烈,主要参与者和初创公司纷纷推出各自的高性能模型,如 Google 的 Veo2、Haliluo 的 Minimax、Runway 的 Gen3 Alpha、Kling、Pika 和 Luma Lab 的 Dream Machine。
开源领域也涌现出大量视频生成模型,包括 CogVideoX、Mochi-1、Hunyuan、Allegro 和 LTX Video。视频社区是否正在经历其“Stable Diffusion 时刻”?
本文将简要概述视频生成模型的现状,开放视频生成模型的发展情况,以及 Diffusers 团队如何计划支持其大规模采用。
具体来说,我们将讨论:
- 视频生成模型的能力和局限性
- 为什么视频生成如此困难
- 开放视频生成模型
- 使用 Diffusers 进行视频生成
- 推理和优化
- 微调
- 展望未来
当今视频生成模型及其局限性
这些是目前最流行的 AI 生成内容视频模型
提供商 | 模型 | 开放/封闭 | 许可证 |
---|---|---|---|
Meta | MovieGen | 封闭(附有详细的技术报告) | 专有 |
OpenAI | Sora | 封闭 | 专有 |
Veo 2 | 封闭 | 专有 | |
RunwayML | Gen 3 Alpha | 封闭 | 专有 |
Pika Labs | Pika 2.0 | 封闭 | 专有 |
KlingAI | Kling | 封闭 | 专有 |
Haliluo | MiniMax | 封闭 | 专有 |
THUDM | CogVideoX | 开放 | 自定义 |
Genmo | Mochi-1 | 开放 | Apache 2.0 |
RhymesAI | Allegro | 开放 | Apache 2.0 |
Lightricks | LTX 视频 | 开放 | 自定义 |
腾讯 | 混元视频 | 开放 | 自定义 |
局限性:
- 高资源要求: 生成高质量视频需要大型预训练模型,这在开发和部署上计算成本高昂。这些成本源于数据集收集、硬件要求、大量训练迭代和实验。这些成本使得开发开源和免费模型难以获得合理回报。尽管我们没有详细的技术报告阐明所使用的训练资源,但这篇帖子提供了一些合理的估算。
- 泛化能力:一些开放模型泛化能力有限,无法达到用户的预期。模型可能需要以特定方式进行提示,或者需要类似 LLM 的提示,或者无法泛化到分布外数据,这些都是阻碍其广泛用户采用的障碍。例如,像 LTX-Video 这样的模型通常需要以非常详细和具体的方式进行提示,才能获得高质量的生成结果。
- 延迟:视频生成的高计算和内存需求导致显著的生成延迟。对于本地使用而言,这通常是一个障碍。大多数新的开放视频模型对于社区硬件而言是无法访问的,除非进行大量的内存优化和量化方法,而这些方法会影响推理延迟和生成视频的质量。
为什么视频生成如此困难?
在视频中,我们希望看到并控制以下几个因素:
- 对输入条件(例如文本提示、起始图像等)的遵循
- 真实感
- 美学
- 运动动力学
- 时空一致性和连贯性
- FPS(帧率)
- 时长
对于图像生成模型,我们通常只关注前三个方面。然而,对于视频生成,我们现在必须考虑运动质量、随时间推移的连贯性和一致性,这可能涉及多个主体。在优质数据、正确的归纳先验和训练方法之间找到适当的平衡以满足这些额外要求,事实证明比其他模态更具挑战性。
开放视频生成模型
文本到视频生成模型与其文本到图像模型具有相似的组成部分
- 文本编码器,用于提供输入文本提示的丰富表示
- 去噪网络
- 编码器和解码器,用于在像素空间和潜在空间之间进行转换
- 非参数调度器,负责管理所有时间步相关的计算和去噪步骤
最新一代的视频模型具有一个核心特性,即去噪网络处理捕获空间和时间信息的 3D 视频令牌。负责生成和解码这些令牌的视频编码器-解码器系统采用空间和时间压缩。虽然解码潜在变量通常需要最多的内存,但这些模型提供了逐帧解码选项以减少内存使用。
文本条件通过联合注意力(在Stable Diffusion 3中引入)或交叉注意力融入。T5 已成为大多数模型的首选文本编码器,Hunyuan 是一个例外,它同时使用了 CLIP-L 和 LLaMa 3。
去噪网络本身基于 William Peebles 和 Saining Xie 开发的 DiT 架构,同时融入了 PixArt 的各种设计元素。
使用 Diffusers 进行视频生成
使用视频模型时,生成可以分为三大类:
- 文本到视频
- 图像或图像控制条件 + 文本到视频
- 视频或视频控制条件 + 文本到视频
从文本(及其他条件)到视频只需几行代码。下面我们展示如何使用 Lightricks 的 LTX-Video 模型进行文本到视频生成。
import torch
from diffusers import LTXPipeline
from diffusers.utils import export_to_video
pipe = LTXPipeline.from_pretrained("Lightricks/LTX-Video", torch_dtype=torch.bfloat16).to("cuda")
prompt = "A woman with long brown hair and light skin smiles at another woman with long blonde hair. The woman with brown hair wears a black jacket and has a small, barely noticeable mole on her right cheek. The camera angle is a close-up, focused on the woman with brown hair's face. The lighting is warm and natural, likely from the setting sun, casting a soft glow on the scene. The scene appears to be real-life footage"
negative_prompt = "worst quality, inconsistent motion, blurry, jittery, distorted"
video = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
width=704,
height=480,
num_frames=161,
num_inference_steps=50,
).frames[0]
export_to_video(video, "output.mp4", fps=24)
内存要求
任何模型所需的内存可以通过以下各项相加计算:
- 权重所需的内存
- 存储中间激活状态所需的最大内存
权重所需的内存可以通过量化、降级到更低的数据类型或卸载到 CPU 来降低。激活状态所需的内存也可以降低,但这更复杂,超出了本博客的范围。
可以使用极低内存运行任何视频模型,但这会以推理时间为代价。如果优化技术所需的时间超出用户认为合理的范围,则无法进行推理。Diffusers 提供了许多此类可选优化,并且可以链式应用。
下表提供了三种流行的视频生成模型在合理默认设置下的内存要求:
模型名称 | 内存 (GB) |
---|---|
HunyuanVideo | 60.09 |
CogVideoX (1.5 5B) | 36.51 |
LTX-Video | 17.75 |
这些数字是在 80GB A100 机器上使用以下设置获得的(完整脚本在此处)
torch.bfloat16
数据类型num_frames
: 121,height
: 512,width
: 768最大序列长度
: 128推理步数
: 50
这些需求相当惊人,使得这些模型在消费级硬件上难以运行。通过 Diffusers,用户可以选择不同的优化方式来减少内存使用。下表提供了 HunyuanVideo 在启用各种优化后的内存需求,这些优化对质量和推理时间的影响最小。
我们选择 HunyuanVideo 进行这项研究,因为它足够大,可以逐步展示优化的好处。
设置 | 内存 | 时间 |
---|---|---|
BF16 基准 | 60.10 GB | 863秒 |
BF16 + CPU 卸载 | 28.87 GB | 917秒 |
BF16 + VAE 切片 | 43.58 GB | 870秒 |
8 位 BnB | 49.90 GB | 983秒 |
8 位 BnB + CPU 卸载* | 35.66 GB | 1041秒 |
8 位 BnB + VAE 切片 | 36.92 GB | 997秒 |
8 位 BnB + CPU 卸载 + VAE 切片 | 26.18 GB | 1260秒 |
4 位 BnB | 42.96 GB | 867秒 |
4 位 BnB + CPU 卸载 | 21.99 GB | 953秒 |
4 位 BnB + VAE 切片 | 26.42 GB | 889秒 |
4 位 BnB + CPU 卸载 + VAE 切片 | 14.15 GB | 995秒 |
FP8 向上转换 | 51.70 GB | 856秒 |
FP8 向上转换 + CPU 卸载 | 21.99 GB | 983秒 |
FP8 向上转换 + VAE 平铺 | 35.17 GB | 867秒 |
FP8 向上转换 + CPU 卸载 + VAE 平铺 | 20.44 GB | 1013秒 |
BF16 + 组卸载 (块=8) + VAE 平铺 | 15.67 GB | 925秒 |
BF16 + 组卸载 (块=1) + VAE 平铺 | 7.72 GB | 881秒 |
BF16 + 组卸载 (叶) + VAE 平铺 | 6.66 GB | 887秒 |
FP8 向上转换 + 组卸载 (叶) + VAE 平铺 | 6.56 GB^ | 885秒 |
*与 4 位模型不同,bitsandbytes
中的 8 位模型无法从 GPU 移动到 CPU。
^内存使用量没有进一步减少,因为峰值利用率来自计算注意力和前馈。使用 Flash Attention 和 Optimized Feed-Forward 可以帮助将此要求降低到约 5 GB。
我们使用与上述相同的设置来获取这些数字。另请注意,由于数值精度损失,量化会影响输出质量,其影响在视频中比图像中更显著。
我们将在下面的章节中提供有关这些优化的更多详细信息以及一些代码片段。但如果您已经感到兴奋,我们鼓励您查看我们的指南。
优化套件
视频生成在资源受限的设备上可能相当困难,即使在更强大的 GPU 上也可能耗时。Diffusers 提供了一套实用程序,有助于优化这些模型的运行时和内存消耗。这些优化分为以下几类:
- 量化:模型权重被量化为较低精度数据类型,从而降低了模型的 VRAM 需求。Diffusers 目前支持三种不同的量化后端:bitsandbytes、torchao 和 GGUF。
- 卸载:模型的不同层可以在需要计算时动态加载到 GPU 上,然后卸载回 CPU。这在推理过程中节省了大量内存。卸载通过
enable_model_cpu_offload()
和enable_sequential_cpu_offload()
支持。更多详细信息请参阅此处。 - 分块推理:通过将推理分割到输入潜在张量的非嵌入维度上,可以减少中间激活状态的内存开销。这种技术的常见用途通常见于编码器/解码器切片/平铺。Diffusers 中的分块推理通过前馈分块、解码器平铺和切片以及分注意力推理来支持。
- 注意力与 MLP 状态的重用:如果满足特定算法的某些条件,可以跳过某些去噪步骤的计算并重用过去的 states,以在最小质量损失的情况下加快生成过程。
下面,我们列出了一些目前正在开发中并将很快合并的先进优化技术:
- 逐层转换:允许用户以较低精度(例如
torch.float8_e4m3fn
)存储参数,并以较高精度(例如torch.bfloat16
)运行计算。 - 组卸载:允许用户对内部块级或叶级模块进行分组以执行卸载。这很有益,因为只有计算所需的模型部分才会被加载到 GPU 上。此外,我们支持使用 CUDA 流重叠数据传输和计算,这可以减少多次加载/卸载层带来的大部分额外开销。
下面是应用 4 位量化、VAE 切片、CPU 卸载和逐层转换到 HunyuanVideo 的示例,以将 121 x 512 x 768
分辨率视频所需的 VRAM 减少到仅约 6.5 GB。据我们所知,这是所有可用实现中运行 HunyuanVideo 所需内存最低且不牺牲速度的实现。
从源代码安装 Diffusers 即可尝试这些功能!有些实现与所使用的模型无关,可以轻松应用于其他后端 - 一定要查看!
pip install git+https://github.com/huggingface/diffusers.git
import torch
from diffusers import (
BitsAndBytesConfig,
HunyuanVideoTransformer3DModel,
HunyuanVideoPipeline,
)
from diffusers.utils import export_to_video
from diffusers.hooks import apply_layerwise_casting
from transformers import LlamaModel
model_id = "hunyuanvideo-community/HunyuanVideo"
quantization_config = BitsAndBytesConfig(
load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16
)
text_encoder = LlamaModel.from_pretrained(model_id, subfolder="text_encoder", torch_dtype=torch.float16)
apply_layerwise_casting(text_encoder, storage_dtype=torch.float8_e4m3fn, compute_dtype=torch.float16)
# Apply 4-bit bitsandbytes quantization to Hunyuan DiT model
transformer = HunyuanVideoTransformer3DModel.from_pretrained(
model_id,
subfolder="transformer",
quantization_config=quantization_config,
torch_dtype=torch.bfloat16,
)
pipe = HunyuanVideoPipeline.from_pretrained(
model_id, transformer=transformer, text_encoder=text_encoder, torch_dtype=torch.float16
)
# Enable memory saving
pipe.vae.enable_tiling()
pipe.enable_model_cpu_offload()
output = pipe(
prompt="A cat walks on the grass, realistic",
height=320,
width=512,
num_frames=61,
num_inference_steps=30,
).frames[0]
export_to_video(output, "output.mp4", fps=15)
我们也可以在训练期间应用优化。两种最著名的视频模型应用技术包括:
- 时间步蒸馏:这涉及以递归方式训练模型,使其在更少的推理步骤中更快地对噪声潜在变量进行去噪。例如,如果一个模型需要 32 步才能生成高质量视频,则可以对其进行增强,使其尝试在仅 16 步、8 步甚至 2 步中预测最终输出!这可能会伴随质量损失,具体取决于使用的步数。时间步蒸馏模型的一些例子包括 Flux.1-Schnell 和 FastHunyuan。
- 引导蒸馏:无分类器引导是一种在扩散模型中广泛使用的技术,可提高生成质量。然而,这会使生成时间加倍,因为它涉及每个推理步骤中模型的两次完整前向传播,然后是一个插值步骤。通过训练模型以一次前向传播的成本预测两次前向传播和插值的输出,此方法可以实现更快的生成。引导蒸馏模型的一些例子包括 HunyuanVideo 和 Flux.1-Dev。
我们建议读者参阅本指南,以详细了解 Diffusers 中视频生成及其当前可能性。
微调
我们创建了 finetrainers
— 一个允许您轻松微调最新一代开放视频模型的存储库。例如,以下是使用 LoRA 微调 CogVideoX 的方法:
# Download a dataset
huggingface-cli download \
--repo-type dataset Wild-Heart/Disney-VideoGeneration-Dataset \
--local-dir video-dataset-disney
# Then launch training
accelerate launch train.py \
--model_name="cogvideox" --pretrained_model_name_or_path="THUDM/CogVideoX1.5-5B" \
--data_root="video-dataset-disney" \
--video_column="videos.txt" \
--caption_column="prompt.txt" \
--training_type="lora" \
--seed=42 \
--mixed_precision="bf16" \
--batch_size=1 \
--train_steps=1200 \
--rank=128 \
--lora_alpha=128 \
--target_modules to_q to_k to_v to_out.0 \
--gradient_accumulation_steps 1 \
--gradient_checkpointing \
--checkpointing_steps 500 \
--checkpointing_limit 2 \
--enable_slicing \
--enable_tiling \
--optimizer adamw \
--lr 3e-5 \
--lr_scheduler constant_with_warmup \
--lr_warmup_steps 100 \
--lr_num_cycles 1 \
--beta1 0.9 \
--beta2 0.95 \
--weight_decay 1e-4 \
--epsilon 1e-8 \
--max_grad_norm 1.0
# ...
# (Full training command removed for brevity)
我们使用 finetrainers
模拟了“溶解”效果并获得了有希望的结果。查看该模型以获取更多详细信息。
展望未来
我们预计在 2025 年,视频生成模型将取得显著进展,在输出质量和模型能力方面都有重大改进。我们的目标是让这些模型易于使用且人人可及。我们将继续发展 finetrainers
库,并计划添加更多功能:Control LoRAs、蒸馏算法、ControlNets、适配器等等。一如既往,欢迎社区贡献 🤗
我们仍然坚定不移地致力于与模型发布者、研究人员和社区成员合作,确保视频生成的最新创新成果人人可及。
资源
我们在帖子中引用了许多链接。为确保您不会错过最重要的链接,我们在下面提供了一个列表:
- 视频生成指南
- Diffusers 中的量化支持
- Diffusers 中的通用 LoRA 指南
- CogVideoX 内存优化指南(也适用于其他视频模型)
finetrainers
用于微调