WSL2でGPS-Gaussianを試してみる
2024/1/1 12:00追記。
RTX 4090 Laptop GPU(16GB)を使用して試した本記事ですと、訓練時間が途方もない時間かかることがわかりました。
これを解決するため、RTX 4090(24GB)を使用して試した記事を別途作成しましたので、そちらをご参照ください。
2023/12/30 22:00頃追記。
stage1、4分の1まで来ました。
2023/12/29 20:40頃追記。
CTRL+Cを押すのも忍びないため、stage1は実行中。
ログを追記しました。
2023/12/28 12:15頃追記
「4. Trainingを試してみる…も」を追記しました。
はい、「…も」とあるとおり、弊環境ですとstage1の訓練だけで12日かかる見込み。
とある界隈で話題のGPS-Gaussian「Generalizable Pixel-wise 3D Gaussian Splatting for Real-time Human Novel View Synthesis」です。3週間?の時を経て、GitHubにソースが公開されましたので、動くかどうか分かりませんが、試してみます
使用するPCは、GALLERIA UL9C-R49(RTX 4090 laptop 16GB)、メモリは64GB、OSはWindows 11+WSL2です。
1. 準備
venv環境
python3 -m venv gps-gaussian
cd $_
source bin/activate
GPS-Gaussianのダウンロード
git clone https://github.com/ShunyuanZheng/GPS-Gaussian.git
インストール
torchを忘れずに。
pip install torch
続いて、diff-gaussian-rasterizationのコンパイルとインストールです。
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
cd gaussian-splatting/
pip install -e submodules/diff-gaussian-rasterization
cd ..
「任意」と書いていますが、モデルの高速化のためのRAFT-Stereoもインストールしておきます。
git clone https://github.com/princeton-vl/RAFT-Stereo.git
cd RAFT-Stereo/sampler && python setup.py install && cd ../..
2. モデルなどのダウンロード
ダウンロード
OneDriveにデータがアップロードされていますので、これをダウンロードしましょう。
3ファイルありました。
これらをコマンドラインでダウンロードしようと試行錯誤しましたが、アレコレしないとダウンロードできないため、ブラウザ経由でダウンロードします。
ファイルの格納と展開
まずは、cloneしたGPS-Gaussianにカレントディレクトリを移動します。
cd GPS-Gaussian
ブラウザ経由でダウンロードした3ファイルを展開するディレクトリを、作成しておきましょう。ここではdataとしました。
mkdir data
続いて、ダウンロードしてきたファイルをカレントディレクトリ(GPS-Gaussian)にコピーします。
$ pwd
/path/to/venv/gps-gaussian/GPS-Gaussian
$ ls -l
$ ls -l *.pth *.zip
-rw-r--r-- 1 user user 54118869 Dec 26 23:06 GPS-GS_stage2_final.pth
-rw-r--r-- 1 user user 2350810694 Dec 26 23:10 real_data.zip
-rw-r--r-- 1 user user 11466169026 Dec 26 23:31 render_data.zip
$
この状態で各ファイルを移動、展開します。
$ mv GPS-GS_stage2_final.pth data
$ unzip -d data real_data.zip
$ unzip -d data render_data.zip
展開されたファイルの確認
real_dataには、撮影写真ママ(img)と白抜きマスク画像(mask)が含まれていました。
$ find ./data/real_data/ -maxdepth 1 -type d
./data/real_data/
./data/real_data/img
./data/real_data/parm
./data/real_data/mask
$
render_dataには、訓練データと検証データがそれぞれ格納されているようです。
$ find ./data/render_data/ -maxdepth 2 -type d
./data/render_data/
./data/render_data/train
./data/render_data/train/img
./data/render_data/train/parm
./data/render_data/train/mask
./data/render_data/train/depth
./data/render_data/val
./data/render_data/val/img
./data/render_data/val/parm
./data/render_data/val/mask
./data/render_data/val/depth
これで、準備完了です。
3. Testingを試してみる
訓練も試してみたいところですが、数時間かかるので次の機会に。
Testingとして記述されている2つを試してみます。
・Real-world data
・Freeview rendering:
不足のパッケージ
実行時にエラーとなるので、先にインストールしておきます。
pip install numpy opencv-python pillow scipy yacs
Real-world data
コマンドラインはこちら。
python test_real_data.py \
--test_data_root ./data/real_data \
--ckpt_path ./data/GPS-GS_stage2_final.pth \
--src_view 0 1 \
--ratio=0.5
3つ目と4つめのオプションの意味は以下です。これらを変更することで、合成される画像が変わります。
・src_view: 2つの視点の間を合成対象とする。0から15が指定可能。
・ratio: src_viewで指定した2点間の位置を0 ~ 1の比率で指定する
実行後、test_outディレクトリにJPEGが450ファイル生成されました。
$ find test_out -type f | wc -l
450
$
画像ファイルをパラパラと開くに「これらファイルからmp4を作れということだな」ということで、ffmpegコマンドで動画を作ります。
ffmpeg -framerate 30 -i test_out/%04d_novel.jpg -vcodec libx264 -pix_fmt yuv420p -r 60 ./test_out_0_1_05.mp4
そして、生成された動画はこちら。オプションは、view_src 0 1 + ration 0.5です。
こちらは、view_src 1 2 + ration 0.5です。少し右側に回った視点からの動画です。
ふむふむ、なるほど。
Freeview rendering(自由視点からのレンダリング)
コマンドラインはこちら。
python test_view_interp.py \
--test_data_root ./data/render_data/val \
--ckpt_path ./data/GPS-GS_stage2_final.pth \
--novel_view_nums 5
test_data_root: レンダリング画像の検証テータが格納されたディレクトリを指定
ckpt_path: チェックポイントのファイルパスを指定
novel_view_nums(仮想視点数)
画像生成時のある視点から次の視点までの間に補完する視点数を指定します。5と指定すると、その視点間に5つの画像が生成されます。10ならば10の画像となります。
実行ログは以下。
2023-12-26 23:48:19,085 INFO [test_view_interp.py:63] Loading checkpoint from ./data/GPS-GS_stage2_final.pth ...
2023-12-26 23:48:19,300 INFO [test_view_interp.py:66] Parameter loading done
100%|██████████████████████████████████████████████████████████████████████████████████| 1600/1600 [24:00<00:00, 1.11it/s]
24分でJPEGが8,000ファイル生成されていました。秒間5.5ファイルが生成されている計算ですね。
$ find interp_out -type f | wc -l
8000
$
うーん、一つ一つ動画にしていたら面倒くさいので一括で作ります。
outdir=mp4
mkdir ${outdir}
for r in $(find interp_out -type f -name '*.jpg' | sed -e 's!^.*/\([0-9]*\)_.*$!\1!' | sort | uniq); do
ffmpeg -framerate 30 -pattern_type glob -i "./interp_out/${r}*.jpg" -vcodec libx264 -pix_fmt yuv420p -r 60 ${outdir}/interp_out_${r}_5.mp4
done
を流し込んだら、はい、できました。
$ ls mp4/*.mp4 | head
mp4/interp_out_0000_5.mp4
mp4/interp_out_0001_5.mp4
mp4/interp_out_0002_5.mp4
mp4/interp_out_0003_5.mp4
mp4/interp_out_0006_5.mp4
mp4/interp_out_0009_5.mp4
mp4/interp_out_0012_5.mp4
mp4/interp_out_0018_5.mp4
mp4/interp_out_0019_5.mp4
mp4/interp_out_0021_5.mp4
サンプルで一つアップロードしておきます。
とりいそぎ、きょうはここまで。
4. Trainingを試してみる…も
Trainingのプログラムから使用されるパッケージをインストールします。
pip install tensorboard packaging
(注記)
当初提供されていた data_render.zipとhuman_loader.pyに不具合があったため、stage1の処理中に以下のようなエラーが発生していました。
$ python train_stage1.py
2023-12-28 08:15:40,415 INFO [human_loader.py:133] Using local data in data/render_data/rectified_local/train ...
2023-12-28 08:15:40,831 INFO [human_loader.py:133] Using local data in data/render_data/rectified_local/val ...
0%| | 0/40000 [00:24<?, ?it/s]
Traceback (most recent call last):
File "/path/to/venv/gps-gaussian/GPS-Gaussian/train_stage1.py", line 175, in <module>
trainer.train()
File "/path/to/venv/gps-gaussian/GPS-Gaussian/train_stage1.py", line 56, in train
_, flow_loss, metrics = self.model(data)
File "/path/to/venv/gps-gaussian/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
File "/path/to/venv/gps-gaussian/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
return forward_call(*args, **kwargs)
File "/path/to/venv/gps-gaussian/GPS-Gaussian/lib/network.py", line 37, in forward
flow_loss, metrics = sequence_loss(flow_predictions, flow, valid)
File "/path/to/venv/gps-gaussian/GPS-Gaussian/lib/loss.py", line 15, in sequence_loss
assert not torch.isinf(flow_gt[valid.bool()]).any()
IndexError: too many indices for tensor of dimension 4
terminate called without an active exception
Aborted
本事象についてはissueが登録されており、
・human_loader.pyに不具合があった。
・real_data.zipのマスク画像に4チャネルのデータが含まれていた
とのこと。それぞれ、最新版に置き換えておきましょう。
train_stage1.py - 2023/12/28
「深度予測モデル」を事前訓練するプログラムらしいです。いざ実行!
$ python train_stage1.py
2023-12-28 08:38:25,895 INFO [human_loader.py:132] Generating data to data/render_data/rectified_local/train ...
100%|██████████████████████████████████████████████████████████████████████████████████| 6816/6816 [13:05<00:00, 8.67it/s]2023-12-28 08:51:31,699 INFO [human_loader.py:163] Generating data Done!
2023-12-28 08:51:32,180 INFO [human_loader.py:132] Generating data to data/render_data/rectified_local/val ...
100%|██████████████████████████████████████████████████████████████████████████████████| 1600/1600 [03:22<00:00, 7.88it/s]2023-12-28 08:54:55,110 INFO [human_loader.py:163] Generating data Done!
1%|▊ | 444/40000 [2:53:57<266:57:43, 24.30s/it]
うん? 約3時間経過して、残りが266時間57分だとぅ…。
train_stage1.py実行中のリソース状況を確認します。
CPUとメモリの使用状況。pythonがメモリを約80%(24GB)ほど使用しています。こちらは特段問題なさそう。
%Cpu(s): 3.1 us, 0.0 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31947.9 total, 635.8 free, 12057.3 used, 19254.7 buff/cache
MiB Swap: 8192.0 total, 5691.5 free, 2500.5 used. 2448.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
44798 shoji_n+ 20 0 68.2g 15.1g 14.8g R 100.0 48.3 294:07.47 python
44947 shoji_n+ 20 0 65.4g 1.0g 6608 S 0.0 3.2 0:23.71 python
44948 shoji_n+ 20 0 65.4g 1.0g 6284 S 0.0 3.2 0:23.27 python
45143 shoji_n+ 20 0 65.4g 1.0g 6324 S 0.0 3.2 0:23.09 python
45139 shoji_n+ 20 0 65.4g 978.1m 6340 S 0.0 3.1 0:22.71 python
44915 shoji_n+ 20 0 65.4g 990412 6308 S 0.0 3.0 0:24.72 python
45074 shoji_n+ 20 0 65.4g 978184 6312 S 0.0 3.0 0:23.10 python
45142 shoji_n+ 20 0 65.4g 977440 6388 S 0.0 3.0 0:22.74 python
45012 shoji_n+ 20 0 65.4g 973532 6328 S 0.0 3.0 0:23.47 python
44949 shoji_n+ 20 0 65.4g 973376 6352 S 0.0 3.0 0:23.76 python
45013 shoji_n+ 20 0 65.3g 937704 6308 S 0.0 2.9 0:23.31 python
45140 shoji_n+ 20 0 65.3g 937632 6336 S 0.0 2.9 0:23.70 python
45205 shoji_n+ 20 0 65.3g 932064 6420 S 0.0 2.8 0:23.72 python
45369 shoji_n+ 20 0 66.3g 79108 7204 S 0.0 0.2 0:00.81 python
45368 shoji_n+ 20 0 66.3g 78552 7212 S 0.0 0.2 0:00.78 python
45370 shoji_n+ 20 0 66.2g 76168 7216 S 0.0 0.2 0:00.74 python
45371 shoji_n+ 20 0 66.2g 76024 7268 S 0.0 0.2 0:00.75 python
322 root 20 0 1229744 12160 3056 S 0.0 0.0 0:18.17 python3.10
一方、GPU。メモリの使用量が36.6GB。GPU専用メモリから21GBあふれてしまってます。こやつに訓練は荷が重たかったか…。
train_stage1.py - 2023/12/29 20:40(JST)
1日と12時間で、40,000分の5,306まで来た。あと、1.5日×7 = 10.5日かかる…。CTRL+Cするのも忍びない。
2023-12-28 08:38:25,895 INFO [human_loader.py:132] Generating data to data/render_data/rectified_local/train ...
100%|██████████████████████████████████████████████████████████████████████████████████| 6816/6816 [13:05<00:00, 8.67it/s]
2023-12-28 08:51:31,699 INFO [human_loader.py:163] Generating data Done!
2023-12-28 08:51:32,180 INFO [human_loader.py:132] Generating data to data/render_data/rectified_local/val ...
100%|██████████████████████████████████████████████████████████████████████████████████| 1600/1600 [03:22<00:00, 7.88it/s]
2023-12-28 08:54:55,110 INFO [human_loader.py:163] Generating data Done!
5%|███▋ | 2000/40000 [13:11:54<246:25:16, 23.35s/it]
2023-12-28 22:07:14,222 INFO [train_recoder.py:42] Training Metrics (2000): [ 2000, 0.0001980] 0.3199, 0.6260, 7.7101,
2023-12-28 22:07:14,256 INFO [train_stage1.py:85] Doing validation ...
2023-12-28 22:08:45,881 INFO [train_stage1.py:103] Validation Metrics (2000): epe 1.8716, 1pix 0.5453
10%|███████▍ | 4000/40000 [27:58:31<269:57:27, 27.00s/it]
2023-12-29 12:53:48,362 INFO [train_recoder.py:42] Training Metrics (4000): [ 4000, 0.0001939] 0.5995, 0.9004, 1.6586,
2023-12-29 12:53:48,636 INFO [train_stage1.py:85] Doing validation ...
2023-12-29 12:55:28,858 INFO [train_stage1.py:103] Validation Metrics (4000): epe 1.4603, 1pix 0.6375
13%|█████████▊ | 5306/40000 [35:46:33<215:24:40, 22.35s/it]
train_stage1.py - 2023/12/30 22:00(JST)
12/30 22:00頃、25%まできました。あと9日…
2023-12-30 00:57:36,432 INFO [train_recoder.py:42] Training Metrics (6000): [ 6000, 0.0001899] 0.6606, 0.9222, 1.3864,
2023-12-30 00:57:36,628 INFO [train_stage1.py:85] Doing validation ...
20%|██████████████▊ | 8000/40000 [52:49:12<221:15:31, 24.89s/it]
2023-12-30 13:44:32,182 INFO [train_recoder.py:42] Training Metrics (8000): [ 8000, 0.0001859] 0.6967, 0.9326, 1.2403,
2023-12-30 13:44:32,234 INFO [train_stage1.py:85] Doing validation ...
2023-12-30 13:46:10,167 INFO [train_stage1.py:103] Validation Metrics (8000): epe 1.2381, 1pix 0.6969
25%|██████████████████▎ | 10000/40000 [61:06:46<134:15:50, 16.11s/it]
2023-12-30 22:02:00,504 INFO [train_recoder.py:42] Training Metrics (10000): [ 10000, 0.0001818] 0.7197, 0.9386, 1.1568,
2023-12-30 22:02:00,626 INFO [train_stage1.py:85] Doing validation ...
25%|██████████████████▎ | 10006/40000 [61:10:20<227:46:56, 27.34s/it]
2023-12-30 22:03:38,117 INFO [train_stage1.py:103] Validation Metrics (10000): epe 1.1659, 1pix 0.7204
25%|██████████████████▎ | 10013/40000 [61:13:23<213:11:30, 25.59s/it]
train_stage2.py
stage1が終わらない限り実行できず。無念。
5. まとめ
テストのプログラムは普通に動くけれども、訓練はRTX 4090 laptop 16GBには荷が重すぎました。
はやく、A100x2のマシンが来ないかな…。
この記事が気に入ったらサポートをしてみませんか?