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)
/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 をダウンロードする必要があります。
/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 メモリが必要のようです
その他
ドキュメントによりますと、
cerspense/zeroscope_v2_576w と cerspense/zeroscope_v2_XL というモデルもあり、
こちらは前者で小さい動画を作り、後者でアップスケーリングする使い方のようです。
また以下を追加で設定して、メモリを最適化すると良いかもしれません。
pipe.unet.enable_forward_chunking(chunk_size= 1 , dim= 1)
まとめ
画像が作れるだけで凄いのに動画まで出来てしまうとは...
先月発表された Open AI の Sora などもありますので、色々使えるようになっていくのが楽しそうです。
同 diffusers v0.15.0 のリリースノートには Text-to-Video Zero というのもありましたので別途調べてみようと思います。