NeRF(PyTorch版)をWSL2で動かしてみる

はじめに

半年ほど前にNeRFをgoogle colabで動かす記事を書きました。

umikazeken.hatenablog.com

今回はWSL2(Windows Subsystem for Linux)上で動かしてみました。
前回はWSL2ではうまく動かなかったのでリベンジです。

オリジナルのNeRFはtensorflow版ですが、最近はPyTorchの方が勢いが
あるようなので、下記のPyTorch版を動かしてみました。

github.com

実行環境

実行環境は以下の通り。

項目 スペック
PC ASUS ROG Zephyrus M16
CPU Core i7-11800H, memory:40GB
GPU Nvidia RTX3070 Laptop, memory:8GB
OS Windows 11 Home 22H2

Ubuntu 22.04.1 LTS


環境構築

まずはGitHubのページに記載されている手順通り動かしてみます。
前提:WSL2環境にanacondaをインストール済。

conda create -n nerf python=3.9
conda activate nerf

git clone https://github.com/yenchenlin/nerf-pytorch.git
cd nerf-pytorch
pip install -r requirements.txt

bash download_example_data.sh


最後の行を実行中にunzipが無いと言われたので、unzipをインストールしています。

sudo apt install unzip


環境構築が終わったら動かしてみます。

python run_nerf.py --config configs/lego.txt


エラーで落ちました。

/home/******/anaconda3/envs/nerf/lib/python3.9/site-packages/torch/cuda/__init__.py:145: UserWarning:
NVIDIA GeForce RTX 3070 Laptop GPU with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
If you want to use the NVIDIA GeForce RTX 3070 Laptop GPU GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
中略
RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)`


PyTorchを再インストール

上記のエラーメッセージを見ると適切なPyTorchがインストールされていないようです。

エラーメッセージに従い、https://pytorch.org/get-started/locally/を開きます。
このページのテーブルの項目を使用中の環境に合わせて選択していきます。

私のPCにはCUDA11.8が入っているので、こんな感じに選択しました。


 注:CUDAが入っていない人はNvidiaのページからインストールしてください。
   CUDA Toolkit - Free Tools and Training | NVIDIA Developer

選択結果に応じて「Run this Command:」欄にコマンドが表示されるので、
このコマンドを使ってPyTorchを再インストールします。

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia


再実行

PyTorchを再インストールしたら再実行してみます。

python run_nerf.py --config configs/lego.txt


今度は無事に動き出しました。

  1%|▉                                  | 1617/200000 [05:50<11:29:01,  4.80it/s]
  1%|▉                                  | 1617/200000 [05:50<11:57:42,  4.61it/s]


が、最初の試行に11時間はちと長い・・・
イタレーション回数を減らし品質を落として動作確認をしてみます。

run_nerf.pyを編集してN_itersに設定している値を変更します。

run_nerf.py(編集前)

697    if use_batching:
698        rays_rgb = torch.Tensor(rays_rgb).to(device)
699
700
701    N_iters = 200000 + 1
702    print('Begin')


run_nerf.py(編集後)

697    if use_batching:
698        rays_rgb = torch.Tensor(rays_rgb).to(device)
699
700
701    N_iters = 2000 + 1
702    print('Begin')


イタレーション回数を1/100にしたので実行時間もほぼ1/100になります。
このまま実行すると結果の動画が出力されないのでオプションを追加して実行します。

python run_nerf.py --config configs/lego.txt --i_video 2000


動かしてみます。結果はlogsフォルダにmp4動画として出力されます。


イタレーション回数を大幅に減らしているのでボケてますが、動いているようですね。

めでたしめでたし


ではまた。