Skip to content

稳定视频扩散

[[open-in-colab]]

稳定视频扩散 (SVD) 是一种强大的图像到视频生成模型,可以根据输入图像生成2-4秒的高分辨率(576x1024)视频。

本指南将向你展示如何使用SVD从图像生成短视频。

在开始之前,请确保已安装以下库:

py
# Colab에서 필요한 라이브러리를 설치하기 위해 주석을 제외하세요
!pip install -q -U diffusers transformers accelerate

该模型有两个变体,SVDSVD-XT。SVD检查点经过训练可以生成14帧,而SVD-XT检查点进一步微调以生成25帧。

在本指南中,你将使用SVD-XT检查点。

python
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)
"source image of a rocket"
"generated video from source image"

torch.compile

通过编译UNet,你可以获得20-25%的速度提升,但代价是内存略有增加。

diff
- 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内存调整此值),但视频可能会有一些闪烁。
diff
- 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_idnoise_aug_strength微调条件参数:

python
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)