見出し画像

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ファイルありました。

・GPS-GS_stage2_final.pth : チェックポイント
・real_data.zip :現実世界のデータ
・render_data.zip : レンダリング・データ

これらをコマンドラインでダウンロードしようと試行錯誤しましたが、アレコレしないとダウンロードできないため、ブラウザ経由でダウンロードします。

ファイルの格納と展開

まずは、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分だとぅ…。

444/40000 [2:53:57<266:57:43, 24.30s/it]

train_stage1.pyからの出力ログ

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のマシンが来ないかな…。

この記事が気に入ったらサポートをしてみませんか?