見出し画像

WSL2でStable Video 3Dを試してみる

「3D オブジェクトの周囲の軌道ビデオを高解像度でイメージからマルチビューに生成するための潜在ビデオ拡散モデル」であるStable Video 3D(SV3D)を試してみます。

使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)
・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。


1. 準備

環境構築

venv環境を作ります。「バージョンコンフリクトするからpython 3.10を使いなさい」とありますので、ご注意ください。

python3 -m venv stablevideo3d
cd $_
source bin/activate

リポジトリをクローン。

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

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

# Pytorch 2.0
pip install -r requirements/pt2.txt

# sgm-0.1.0
pip install .

あと、imageio関係でエラーが発生するため、以下のようにバージョン指定(2.27.0)してインストールします。

pip install imageio==2.27.0 imageio[ffmpeg]

(参考)発生するエラーは以下。

(snip)
    stream = self._container.add_stream(codec, fps)
  File "av/container/output.pyx", line 61, in av.container.output.OutputContainer.add_stream
ValueError: needs one of codec_name or template

ついでに、学習に必要となるパッケージもインストールしておきます。

pip install -e git+https://github.com/Stability-AI/datapipelines.git@main#egg=sdata

モデルのダウンロード

モデルをダウンロードするためには同意が必要です。stabilityai/sv3d にアクセスして同意します。

このモデルに触れたければ、汝の窓口を共有すべし。

続いて、pythonを立ち上げて以下を流し込みます。

from huggingface_hub import snapshot_download

REPO_ID = "stabilityai/sv3d"
snapshot_download(
	repo_id=REPO_ID,
	revision="main",
	local_dir="./checkpoints",
	local_dir_use_symlinks=True	
)

./checkpoints ディレクトリにモデルがダウンロードされます。モデルは2つあります。

  • SV3D_u: カメラ調整なしで単一の画像入力に基づいて軌道ビデオを生成する

  • SV3D_p: SVD3_uを機能拡張。単一画像と軌道ビューの両方に対応し、指定されたカメラパスに沿った3Dビデオの生成する

コードの確認

scripts/sampling/simple_video_sample.py の覗いてみてみましょう。

画像 `input_path` または複数の画像 (フォルダー `input_path` 内の画像ファイルごとに 1 つ) に条件付けされた単一のサンプルを生成する単純なスクリプト。 VRAM が不足している場合は、「decoding_t」を減らしてみてください。

scripts/sampling/simple_video_sample.py

とのこと。このスクリプトで指定可能な引数は以下です。

  • --input_path: ファイルへのパス。デフォルト値は 'assets/test_image.png'

  • --num_frames: フレーム数。versionとしてsv3d_u / sv3d_pが指定された場合、21 固定。指定しても無視される

  • --num_steps: ステップ数。versionとしてsv3d_u / sv3d_pが指定された場合、デフォルト値 50

  • --version: 使用するモデルを指定。デフォルト値 'svd'

  • -f, --fps_id: FPS。デフォルト値 6

  • -m, --motion_bucket_id: モーションバケットID。デフォルト値 127

  • -c, --cond_aug: デフォルト値 0.02。ただし、versionとしてsv3d_u / sv3d_pが指定された場合、1e-5 固定。指定しても無視される

  • -s, --seed: たね。デフォルト値 23

  • --decoding_t: 一度にデコードされるフレーム数。VRAM消費下げる効果あり。デフォルト値 14

  • --device: デフォルト値 'cuda'

  • -o, --output_folder: 出力先フォルダ。指定されたversionによって変わる。sv3d_u / sv3d_pが指定された場合、デフォルト値 outputs/simple_video_sample/sv3d_[up]/

  • -e, --elevations_degSV3D用: -90から90までの21個の仰角(度単位)を、浮動小数点を1つ、またはリスト形式で指定。versionとしてsv3d_u / sv3d_pが指定された場合、デフォルト値 [0,…,0]

  • -a, --azimuths_degSV3D用: 0から360までの21個の方位角(度単位)を0から360の順序でリスト形式で指定。versionとしてsv3d_u / sv3d_pが指定された場合、デフォルト値 [18,36,54,…,324,342,0]

  • --image_frame_ratio: 画像フレーム比

  • --verbose: 詳細出力。デフォルト値 False

3. 試してみる

(1) モデル SV3D_u

RTX 4090(24GB)を使って実行です。

CUDA_VISIBLE_DEVICES=0 python scripts/sampling/simple_video_sample.py \
	--input_path ~/doraemon-pilot.png \
	--version sv3d_u

入力画像はこちら。

だがしかし、vramが溢れ、プロセスは固まったように見えます…。

CUDAが芯まで吸い取るブイラム/時間の彼方で固まるプロセス

--verboseオプションを追加して起動したところ、処理状況の詳細が表示される。どうやら30分ほど書き出しにかかるようです。

Sampling with EulerEDMSampler for 51 steps:   6%|██▌         | 3/51 [01:54<29:57, 37.45s/it]

待つこと、ウン十分。JPEGファイル、MP4ファイルが生成されました。

$ ls -l  outputs/simple_video_sample/sv3d_u
total 284
-rw-r--r-- 1 user user 32147 Mar 20 19:19 000000.jpg
-rw-r--r-- 1 user user 255681 Mar 20 19:23 000000.mp4
$

とても安定したいい感じです。しかし、なぜ後ろが分かるんだろうか。

(2) モデル SV3D_p

指定できるものはフルで指定しましょう。

CUDA_VISIBLE_DEVICES=0 python scripts/sampling/simple_video_sample.py \
	--input_path ~/doraemon-pilot.png \
	--version sv3d_p \
	--elevations_deg [-90,-81,-72,-63,-54,-45,-36,-27,-18,-9,0,9,18,27,36,45,54,63,72,81,90] \
	--azimuths_deg [0,18,36,54,72,90,108,126,144,162,180,198,216,234,252,270,288,306,324,342,360]

SV3D_uと同様JPEGファイル、MP4ファイルが生成されました。

ちょっと回しすぎましたかね…。

4. まとめ

・RTX 4090(24GB)で実行
いちサンプルあたり30~35分程度かかるので、ちょっと厳しいですね。

・A100 80GBで実行(参考情報)
メモリ推移(下記ログの6項目目)をみるに 48GB以上必要かと思います。
処理時間は、モデルsv3d_uが 67~75秒、sv3d_pが 57秒 近辺でした。

0, 2024/03/20 19:03:59.020, 100 %, 42 %, 81920 MiB, 18753 MiB, 67, NVIDIA A100 80GB PCIe
0, 2024/03/20 19:04:00.020, 100 %, 63 %, 81920 MiB, 47145 MiB, 66, NVIDIA A100 80GB PCIe
0, 2024/03/20 19:04:01.020, 0 %, 0 %, 81920 MiB, 47145 MiB, 66, NVIDIA A100 80GB PCIe
0, 2024/03/20 19:04:02.020, 0 %, 0 %, 81920 MiB, 47144 MiB, 63, NVIDIA A100 80GB PCIe
0, 2024/03/20 19:04:03.020, 100 %, 3 %, 81920 MiB, 4 MiB, 63, NVIDIA A100 80GB PCIe
0, 2024/03/20 19:04:04.021, 0 %, 0 %, 81920 MiB, 4 MiB, 63, NVIDIA A100 80GB PCIe

関連

いいなと思ったら応援しよう!