Stable Video Diffusionのvideo_sampling.pyセットアップ手順(Linux)

# 概要

stability.aiから発表があった Stable Video Diffusion (SVD) のデモ用プログラム `video_sampling.py` を Linux 上で動かす手順です。

ドキュメントがまとまっていなかったようなので、自分の備忘録として書き残します。

https://ja.stability.ai/blog/stable-video-diffusion

- 発表
  -  Introducing Stable Video Diffusion — Stability AI
 https://stability.ai/news/stable-video-diffusion-open-ai-video-model
- GitHub リポジトリ（おなじみ？の場所ですが `Stable Video Diffusion` の [commit](https://github.com/Stability-AI/generative-models/commit/059d8e9cd9c55aea1ef2ece39abf605efb8b7cc9) がありました
  - Stability-AI/generative-models: Generative Models by Stability AI
https://github.com/Stability-AI/generative-models
- モデル（研究用途で利用できます、詳細はドキュメント参照）
  - https://huggingface.co/stabilityai/stable-video-diffusion-img2vid
  - https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt

設定がうまくいくと、このような UI が立ち上がります。画像を投げると、動画(mp4)に変換してくれます。細かなパラメータを調整できます。ただし、現時点ではテキスト to ビデオの機能は無いようです([参照](https://github.com/Stability-AI/generative-models/issues/143))。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/c20345e1-2842-8519-e548-caa40affa9a1.png)

# 前提条件

- 動作確認は Ubuntu 22.04.3 LTS で行いました
- Python のバージョンは 3.10.12 です（3.10 以外のバージョンでは失敗するかもしれないという情報もあります）
- NVIDIA の GPU が必要です。コマ数を増やそうとすると VRAM が結構必要になりそうです([参考](https://github.com/Stability-AI/generative-models/issues/140))
- NVIDIA の GPU ドライバ等 ( CUDA や nvidia-utils などは別途必要です。Ubuntu であれば、次のが参考になるかもしれません）
- モデルのファイルは1つで約10GB近くありますので、ストレージ容量が必要です

https://qiita.com/zembutsu/items/ae7809501b7e07700cf9


# 手順

手順前半は、公式 Readme.md の [Installation:](https://github.com/Stability-AI/generative-models/#installation) セクションにある手順と同じです。

※本環境は《さくらのクラウド》を利用しましたが、基本的に GPU の積んだ環境であれば、同様の作業で入ると思います(Ubuntu Server 22.04.1 LTS　64bit を `apt get update` `apt get upgrade` しています）。


ますはじめに、 Stability-AI の `generative-models` リポジトリをクローンします。

```
$ git clone https://github.com/Stability-AI/generative-models.git
$ cd generative-models
```

以降のコマンド実行は、すべてこのディレクトリ内を基準とします。

次に `python3.10-venv` が入っていなければ、入れます。

```
$ sudo apt install python3.10-venv
```

PyTorch 2.0 等を入れます。

```
$ python3 -m venv .pt2
$ source .pt2/bin/activate
$ pip3 install -r requirements/pt2.txt
$ pip3 install .
```

ファイル `scripts/demo/streamlit_helpers.py` を編集します。 [61行目](https://github.com/Stability-AI/generative-models/blob/059d8e9cd9c55aea1ef2ece39abf605efb8b7cc9/scripts/demo/streamlit_helpers.py#L61) に `lowvram_mode = False` （少VRAMモード）が `False` になっていますが、これを `True` にします。※かなり VRAM が潤沢であれば不要かもしれません。

```
lowvram_mode = True
```

次はモデルを格納するディレクトリを作ります。

```
$ mkdir checkpoints
```

この中に Hugging Face で公開されているモデルをダウンロードします。

`svd.safetensors` `svd_image_decoder.safetensors`
https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/tree/main

`svd_xt.safetensors` `svd_xt_image_decoder.safetensors`
https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt/tree/main

これらは大きいので、 `wget <URL> -O 出力先 'ダウンロードするモデルのURL'` のように実行すると楽でしょう。

例： `svd.safetensors` の場合
```
$ wget -O ./checkpoints/svd.safetensors 'https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/resolve/main/svd.safetensors?download=true'
```

必要なモデルのダウンロードが終われば、あとはデモスクリプトを実行します。

```
$ PYTHONPATH=. ./.pt2/bin/streamlit run scripts/demo/video_sampling.py
```

インストールが正常であれば、次のような出力が出ます。

```
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.


  You can now view your Streamlit app in your browser.

  Network URL: http://<IP_ADDR>:8501
  External URL: http://<IP_ADDR>:8501
```

画面の指示に従って、ブラウザで `http://<IPアドレス>:8501/` を開きます。

あとはしばらく待つと、次のような画面に変わります。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/9a8a8cc4-082f-922f-a781-dcc0e1f06033.png)

`Model Version` で使いたいモデルを選択します。ダウンロードしていないモデル名も出ますが、使いたいものしか選べません（エラーになります）。

それから `Load Model` をクリックするとモデルが読み込めます。

あとは画面の指示に従って画像をアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/a076e182-e059-3960-9246-4b359e9ea870.png)

ページ一番下に「Sample」ボタンがあるので、押すと生成が始まります。

もし VRAM のメモリ不足になるようであれば途中で止まります。 `Decode t frames at a time` の数値を小さくすると、メモリの使用量が減ります。コマンド `watch -n 1 nvidia-smi` などで状況をモニタリングしながら調整すると良さそうです。

作成された動画等は `./outputs/demo/vid/svd/samples/` ディレクトリ以下に出力されます。

Docker の入っている環境であれば

```
$ sudo docker run -p 80:80 -v ./outputs/demo/vid/svd/samples:/usr/local/apache2/htdocs -d httpd
```

このようにして一時的にディレクトリを作れば、ファイルの転送も都度しなくてよいので楽でしょう。ブラウザからファイル群を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/e296b89f-123a-3662-c292-361db2c31fef.png)

この `.mp4` をダウンロードすると動画化されたファイルを確認できます。



Enjoy!

# 参考

- Issues · Stability-AI/generative-models
  - https://github.com/Stability-AI/generative-models/issues
- Stable Video Diffusion | Hacker News
  - https://news.ycombinator.com/item?id=38368287
- Stable Diffusion の Discord Server [#stable-video-diffusion](https://discord.com/channels/1002292111942635562/1176560067961696276)