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
用於微調