ジャコ Lab

プログラミング関連のメモ帳的ブログです

diffusers v0.15.0 の Text-to-Video を Google Colab で使ってみる

github.com

huggingface.co

diffuser v0.15.0 のリリースノートにある Text-to-Video を使ってみます。 今だと Stable Video Diffusion を使うのが普通なんですかね? Stable Video Diffusion はそのうち調べるとして、まずは使ってみましょう。

Text-to-Video とは

Text-to-Image の動画バージョンですね!プロンプトで動画が作れます。

今回使用するモデルについて

diffusers v0.15.0 のリリースノート 及び Text-to-Image のこちらのドキュメント には、以下の注記があったので、このモデルは遊び以外では使ってはダメと思われます。

🧪 This pipeline is for research purposes only.

実際にやってみる

import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
from diffusers.utils import export_to_video

# パイプラインの準備
pipe = DiffusionPipeline.from_pretrained(
    "damo-vilab/text-to-video-ms-1.7b", 
    torch_dtype=torch.float16, 
    variant="fp16"
)
pipe.enable_model_cpu_offload()

# スケジューラの設定
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

# プロンプト実行
prompt = "Spiderman is surfing"
video_frames = pipe(prompt, num_inference_steps=25).frames
video_path = export_to_video(video_frames)
ERROR
/usr/local/lib/python3.10/dist-packages/diffusers/utils/export_utils.py in export_to_video(video_frames, output_video_path, fps)
    133 
    134     fourcc = cv2.VideoWriter_fourcc(*"mp4v")
--> 135     h, w, c = video_frames[0].shape
    136     video_writer = cv2.VideoWriter(output_video_path, fourcc, fps=fps, frameSize=(w, h))
    137     for i in range(len(video_frames)):

ValueError: too many values to unpack (expected 3)

v0.15.0 のリリースノートの通りだと、現環境ではエラーになってしまうようです。

変わりにドキュメントの方を参考にすると良さそう!
prompt = "Spiderman is surfing"
- video_frames = pipe(prompt, num_inference_steps=25).frames
+ video_frames = pipe(prompt, num_inference_steps=25).frames[0]
video_path = export_to_video(video_frames)
video_path

画像と違って Google Colab 上には表示されてくれないので、 video_path をダウンロードする必要があります。

video_path の出力値を見ると /tmp 以下にありそうです!

生成された動画

おおー。スパイダーマンがサーフィンしていますね!凄いです。

メモリについて

num_frames を設定していないデフォルト値は 16フレーム(8fps で2秒)の動画が生成されるようです。
確かにダウンロードした動画を見ると2秒でした。

ドキュメントによりますと、メモリについて多く記載されています。
画像よりも消費メモリが多いので、色々とメモリ使用量を抑えるテクニックがあるようです。

Since videos are often more memory-heavy than images, we can enable CPU offloading and VAE slicing to keep the memory footprint at bay.
(ビデオは画像よりも多くのメモリを使用することが多いため、CPU オフロードと VAE スライシングを有効にしてメモリ使用量を抑えることができます。)

It just takes 7 GBs of GPU memory to generate the 64 video frames using PyTorch 2.0, “fp16” precision and the techniques mentioned above.
(PyTorch 2.0、「fp16」精度、および上記のテクニックを使用して 64 ビデオ フレームを生成するには、7 GB の GPU メモリが必要です。)

どうやら「PyTorch 2.0」で「fp16」で「CPU オフロード」で「VAE スライシングを有効」で64フレーム(8fps で8秒)の動画を作るには 7GB の GPU メモリが必要のようです

64 frame のビデオは Google Colab の T4 GPU でも出来た!

その他

ドキュメントによりますと、

cerspense/zeroscope_v2_576wcerspense/zeroscope_v2_XL というモデルもあり、
こちらは前者で小さい動画を作り、後者でアップスケーリングする使い方のようです。

また以下を追加で設定して、メモリを最適化すると良いかもしれません。

pipe.unet.enable_forward_chunking(chunk_size= 1 , dim= 1)

まとめ

画像が作れるだけで凄いのに動画まで出来てしまうとは...

先月発表された Open AI の Sora などもありますので、色々使えるようになっていくのが楽しそうです。

同 diffusers v0.15.0 のリリースノートには Text-to-Video Zero というのもありましたので別途調べてみようと思います。