Diffusers 文件
Stable Video Diffusion
加入 Hugging Face 社群
並獲得增強的文件體驗
開始使用
Stable Video Diffusion
Stable Video Diffusion (SVD) 是一個強大的影像到影片生成模型,可以根據輸入影像生成 2-4 秒的高解析度(576x1024)影片。
本指南將向您展示如何使用 SVD 從影像生成短影片。
開始之前,請確保已安裝以下庫:
# Colab에서 필요한 라이브러리를 설치하기 위해 주석을 제외하세요
!pip install -q -U diffusers transformers accelerate
此模型有兩個變體:SVD 和 SVD-XT。SVD 檢查點用於生成 14 幀,而 SVD-XT 檢查點經過進一步微調以生成 25 幀。
本指南將使用 SVD-XT 檢查點。
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt", torch_dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()
# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))
generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]
export_to_video(frames, "generated.mp4", fps=7)


torch.compile
您可以透過編譯 UNet 來提高 20-25% 的速度,但會略微增加記憶體佔用。
- pipe.enable_model_cpu_offload()
+ pipe.to("cuda")
+ pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
減少記憶體使用
影片生成是記憶體密集型任務,因為您本質上是同時生成 num_frames
,類似於高批次大小的文字到影像生成。為了減少記憶體需求,有多種選項可以在推理速度和記憶體需求之間進行權衡:
- 啟用模型解除安裝:管道的每個元件在不再需要時會解除安裝到 CPU。
- 啟用前饋分塊:前饋層以迴圈方式執行,而不是以巨大的批次大小執行單個前饋。
- 減少
decode_chunk_size
:VAE 分塊解碼幀,而不是一次性解碼所有幀。將decode_chunk_size=1
設定為每次解碼一幀並使用最少量的記憶體(我們建議根據您的 GPU 記憶體調整此值),但影片可能會有一些閃爍。
- pipe.enable_model_cpu_offload()
- frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]
+ pipe.enable_model_cpu_offload()
+ pipe.unet.enable_forward_chunking()
+ frames = pipe(image, decode_chunk_size=2, generator=generator, num_frames=25).frames[0]
結合使用所有這些技巧應將記憶體需求降低到少於 8GB VRAM。
微條件
Stable Diffusion Video 除了條件影像外,還支援微條件,從而可以更好地控制生成的影片
fps
:生成影片的每秒幀數。motion_bucket_id
:用於生成影片的運動桶 ID。這可用於控制生成影片的運動。增加運動桶 ID 會增加生成影片的運動。noise_aug_strength
:新增到條件影像的噪聲量。值越高,影片與條件影像的相似度越低。增加此值還會增加生成影片的運動。
例如,要生成更多運動的影片,請使用 motion_bucket_id
和 noise_aug_strength
微條件引數。
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt", torch_dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()
# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))
generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator, motion_bucket_id=180, noise_aug_strength=0.1).frames[0]
export_to_video(frames, "generated.mp4", fps=7)