見出し画像

Google Colab で Stable Video Diffusion を試す

「Google Colab」で「Stable Video Diffusion」を試したのでまとめました。

【注意】Google Colab Pro/Pro+のA100で動作確認しています。


1. Stable Video Diffusion

「Stable Video Diffusion」は、「Stability AI」が開発した画像から動画を生成するAIモデルです。解像度 1024x572 で、14フレーム (2秒) または25フレーム (4秒) の動画を生成します。

2. Stable Video Diffusion のモデル

現在、2つのモデルが提供されています。

stabilityai/stable-video-diffusion-img2vid (SVD ) : 14フレーム
stabilityai/stable-video-diffusion-img2vid-xt (SVD-XT) : 25フレーム

3. Colabでの実行

Colabでの実行手順は、次のとおりです。

(1) Colabのノートブックを開き、メニュー「編集 → ノートブックの設定」で「GPU」の「A100」を選択。

(2) パッケージのインストール。

# パッケージのインストール
!pip install -U diffusers transformers accelerate

(3) パイプラインの準備。

import torch
from diffusers import StableVideoDiffusionPipeline

# パイプラインの準備
pipe = StableVideoDiffusionPipeline.from_pretrained(
    "stabilityai/stable-video-diffusion-img2vid-xt",
    torch_dtype=torch.float16,
    variant="fp16"
)
pipe.enable_model_cpu_offload()

(4) 左端のフォルダアイコンから画像をアップロード。

・input.png

(5) 画像の読み込み。

from diffusers.utils import load_image

# 画像の読み込み
image = load_image("input.png")
#image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png?download=true")
image = image.resize((1024, 576))

(6) 動画生成。
40秒ほどで動画生成が完了します。

from diffusers.utils import export_to_video

# 動画生成
frames = pipe(
    image,
    decode_chunk_size=8,
    generator=torch.manual_seed(42)
).frames[0]
export_to_video(frames, "generated.mp4", fps=7)

decode_chunk_size」で、一度にデコードされるフレーム数を制御できます。これにより、メモリ使用量を削減できます。「decode_chunk_size=1」を指定すると、使用するメモリの量は最小限になりますが、動画がちらつく可能性があります。

4. DALL-E 3の画像からの動画生成

「DALL-E 3」(ChatGPT) を使うことで、簡単に動画作成できます。

・input1.png

・input2.png

5. Torch.compile

UNetを次のようにコンパイルすると、メモリがわずかに増加しますが、20~25%の高速化を実現できます。

(1) UNetを以下のように設定。

pipe.enable_model_cpu_offload()

pipe.to("cuda")
pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)

(2) 以下のコードを実行。
Colabでは動画生成時にエラーが発生したため、この手法を適用しました。

!export LC_ALL="en_US.UTF-8"
!export LD_LIBRARY_PATH="/usr/lib64-nvidia"
!export LIBRARY_PATH="/usr/local/cuda/lib64/stubs"
!ldconfig /usr/lib64-nvidia

動画生成で、初回は時間かかりますが、2回目以降は40秒かかっていた動画が30秒になりました。

6. Low-memory

次のオプションは、推論速度を犠牲にしてメモリ要件を低くします。

・enable_model_cpu_offload() : パイプラインの各コンポーネントを不要時になるとCPUオフロード。
・unet.enable_forward_chunking() : フィードフォワードチャンキングの有効化。単一の巨大なフィードフォワードバッチサイズで実行するのではなく、ループ内で実行。
・decode_chunk_size を減らす : VAE がフレームをすべてまとめてデコードするのではなく、チャンクに分けてデコード。この手法は、速度が若干遅くなるだけでなく、ビデオ品質もわずかに低下。

有効化手順は、次のとおりです。

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 未満になる予定です。

7. Micro-conditioning

生成する動画をより詳細に制御できる Micro-conditioning を提供します。

・fps : 生成された動画の1秒あたりのフレーム数
・motion_bucket_id : 生成された動画に使用する motion_bucket_id。これを使用して、生成された動画の動きを制御できる。motion_bucket_id を増やすと、生成される動画のモーションが増加。
・noise_aug_strength : コンディショニング画像に追加されるノイズの量。 値が高くなるほど、ビデオは調整画像に似なくなる。この値を増やすと、生成される動画のモーションも増加。

以下は、Micro-conditioning を使用して、より動きのある動画を生成する例です。

from diffusers.utils import export_to_video

# 動画生成
frames = pipe(
    image, 
    decode_chunk_size=8, 
    generator=torch.manual_seed(42), 
    motion_bucket_id=180, 
    noise_aug_strength=0.1
).frames[0]
export_to_video(frames, "generated.mp4", fps=7)



この記事が気に入ったらサポートをしてみませんか?