![見出し画像](https://assets.st-note.com/production/uploads/images/125394627/rectangle_large_type_2_a7f5376797a2682cf8aff0871be8ce9a.png?width=1200)
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
![](https://assets.st-note.com/img/1703333563414-MGnyqhpent.png?width=1200)
(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」を指定すると、使用するメモリの量は最小限になりますが、動画がちらつく可能性があります。
Stable Video Diffusionを試す。SVD(14frame)https://t.co/mOjvq4ghdu pic.twitter.com/oI5KTOb53T
— 布留川英一 / Hidekazu Furukawa (@npaka123) November 22, 2023
4. DALL-E 3の画像からの動画生成
「DALL-E 3」(ChatGPT) を使うことで、簡単に動画作成できます。
・input1.png
![](https://assets.st-note.com/img/1703333831354-hwvKkEwvSg.png?width=1200)
・input2.png
![](https://assets.st-note.com/img/1703333845883-hY3KEZJMAa.png?width=1200)
DALL-E 3 → Stable Video Diffusion pic.twitter.com/x34mHBoxiW
— 布留川英一 / Hidekazu Furukawa (@npaka123) December 23, 2023
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)
この記事が気に入ったらサポートをしてみませんか?