Ⓜ️

WSL2, conda, MMDetection v3.0.0 環境構築

2023/05/29に公開

環境

  • Windows 11 Home (22H2)
  • Ubuntu 22.04
  • GPU: RTX 3090

NVIDIAドライバーのインストール(Windows上)

未インストールの場合は、 https://www.nvidia.com/Download/index.aspx からダウンロードしてインストールする。

インストール済みの場合でも、使用予定のCUDAバージョンによっては更新が必要。
CUDA Toolkit Release NotesでMinimum Required Driver Versionを確認する。
CUDA 11で十分な環境であれば452.39以上に上げ、CUDA 12も使用しそうな環境(RTX 4090等)であれば527.41以上に上げることになるだろう。筆者の場合、インストール済みの512.77をそのまま使用した。

WSL2のインストール(Windows上)

スタートボタンを右クリックし、ターミナル (管理者) を開く。
「管理者: Windows PowerShell」タブ上で、以下を実行する。

wsl --install

参考:

筆者の場合エラーが出たため、金子邦彦先生の記事を参考にインストールした。差分は以下。

  • Hyper-Vのチェックボックスは無かった
  • dism.exeの実行は飛ばした
  • wsl --updateを実行してからwsl --installを実行する必要があった

apt(WSL2のUbuntu上)

update, upgradeの実行に加え、とりあえず必要そうなものをインストールする。

sudo apt update && sudo apt upgrade
sudo apt -y install build-essential zip unzip

WSL2のネットワークが遅い場合

WSL2のネットワークが遅いという問題が頻発している。
筆者の場合、以下の(1), (2)を実行し、(2)の実行後にまともなダウンロード速度になった。

(1) nameserver修正(WSL2のUbuntu上)

参考: https://taka-say.hateblo.jp/entry/2022/03/06/171935

(2) Large Send Offload無効化(Windows上)

スタートボタンを右クリックし、ターミナル (管理者) を開く。
「管理者: Windows PowerShell」タブ上で、以下を実行する。

# コントロールパネル経由で"vEthernet (WSL)"が見えない場合もipconfigでは見える
ipconfig.exe /all
# ネットワークアダプター設定を確認
Get-NetAdapterAdvancedProperty -IncludeHidden -Name "vEthernet (WSL)"
# Large Send Offloadを無効化
Disable-NetAdapterLso -IncludeHidden -Name "vEthernet (WSL)"

VSCodeのインストール(Windows上)

https://code.visualstudio.com/ からダウンロードしてインストールする。

VSCodeのWSL拡張機能のインストール(Windows上)

拡張機能ボタン → "wsl"で検索 → WSL by Microsoftをインストールする。

Minicondaのインストール(WSL2のUbuntu上)

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
rm Miniconda3-latest-Linux-x86_64.sh

詳細は https://www.macnica.co.jp/business/semiconductor/articles/qualcomm/142362/ を参照。

Minicondaのチャンネル指定変更(WSL2のUbuntu上)

conda config --remove channels defaults
conda config --add channels conda-forge

詳細は https://inorio.hatenablog.com/entry/2022/10/14/190000 を参照。

MMDetectionのインストール(WSL2のUbuntu上)

MMDetectionのドキュメントに従ってインストールする。以下は、PyTorch 2.0.0, CUDA 11.7を使用する場合の例である(RTX 4090等ではCUDA 11.8以上が必要)。

conda create --name mmdet300 python=3.9 -y
conda activate mmdet300
conda install pytorch=2.0.0 torchvision=0.15.0 pytorch-cuda=11.7 -c pytorch -c nvidia

pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0"

git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -v -e .

MMDetectionの動作確認:推論(WSL2のUbuntu上)

RTMDet-tinyの学習済みモデルをダウンロードし、デモ画像中の物体を検出する。

mim download mmdet --config rtmdet_tiny_8xb32-300e_coco --dest work_dirs/rtmdet/
python demo/image_demo.py \
    demo/demo.jpg \
    work_dirs/rtmdet/rtmdet_tiny_8xb32-300e_coco.py \
    --weights work_dirs/rtmdet/rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth \
    --out-dir work_dirs/rtmdet/

インストールに成功していれば、work_dirs/rtmdet/vis/demo.jpgに結果が出力される。

エラー1つ目の修正

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

sudo apt -y install libgl1-mesa-glx

MMSegmentationのdandelionさんのプルリク参照。MMDetectionでの修正方法より軽いはず。

エラー2つ目の修正

Could not load library libcudnn_cnn_infer.so.8. Error: libcuda.so: cannot open shared object file: No such file or directory

libcuda.so/usr/lib/wsl/lib/にいるので$LD_LIBRARY_PATHに追加する。なお、$PATHには元々入っていたため、nvidia-smiは普通に実行できた。

.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/wsl/lib

参考: https://stackoverflow.com/questions/54249577/importerror-libcuda-so-1-cannot-open-shared-object-file

MMDetectionの動作確認:テスト・訓練(WSL2のUbuntu上)

COCOデータセットのダウンロード

download_dataset.pyを編集し、使用予定の無いファイルはコメントアウトしておく。

coco2017=[
    'http://images.cocodataset.org/zips/train2017.zip',
    'http://images.cocodataset.org/zips/val2017.zip',
    # 'http://images.cocodataset.org/zips/test2017.zip',
    # 'http://images.cocodataset.org/zips/unlabeled2017.zip',
    'http://images.cocodataset.org/annotations/annotations_trainval2017.zip',  # noqa
    # 'http://images.cocodataset.org/annotations/stuff_annotations_trainval2017.zip',  # noqa
    # 'http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip',  # noqa
    # 'http://images.cocodataset.org/annotations/image_info_test2017.zip',  # noqa
    # 'http://images.cocodataset.org/annotations/image_info_unlabeled2017.zip',  # noqa
],

データセットはMMDetection以外のライブラリからもアクセスしたいため、MMDetection外のディレクトリ(例:${HOME}/data/coco)にダウンロードする。

python tools/misc/download_dataset.py --dataset-name coco2017 --save-dir ${HOME}/data/coco --unzip --delete

MMDetectionの既存configはmmdetection/data/下を見にいくよう書かれているため、ダウンロード先が見えるようシンボリックリンクを張る。

# データセットごとにシンボリックリンクを張る場合
mkdir data
ln -s ${HOME}/data/coco data/coco
# 面倒なのでdataディレクトリごとシンボリックリンクを張る場合
ln -s ${HOME}/data data

テスト

推論動作確認でダウンロードした学習済みモデルを使い、テストが実行でき、精度が再現できることを確認する。

CONFIG_FILE=configs/rtmdet/rtmdet_tiny_8xb32-300e_coco.py
CHECKPOINT_FILE=work_dirs/rtmdet/rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth
GPU_NUM=1
bash tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM}

RTMDet-tinyの場合、COCO APが41.1のため、coco/bbox_mAP: 0.4110と表示されればテスト時精度再現成功。

訓練

CONFIG_FILE=configs/rtmdet/rtmdet_tiny_8xb32-300e_coco.py
GPU_NUM=1
bash tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM}

訓練が始まりlossが下がっていけばOK。
RTMDetは訓練エポック数300であり、eta: 7 daysなどと表示されるため、訓練時精度再現確認には向かない(そもそも8 GPU用のconfigであるため、そのままでは精度再現しない)。

補足:訓練時精度再現確認

理想的には、訓練時の精度再現も確認する(MMDetectionの場合、環境構築の確認目的でここまでやる人は稀だと思う)。
具体的には、公開学習済みモデルの実験条件と同一またはできるだけ近い実験条件で訓練を行い、ほぼ同等精度になることを確認する。
例えば、ATSS (ResNet-50) を8 GPUで訓練し、COCO APが39.4±0.1になることを確認する。

CONFIG_FILE=configs/atss/atss_r50_fpn_1x_coco.py
GPU_NUM=8
bash tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM}

補足:WSL-Ubuntu用CUDA Toolkitのインストール(WSL2のUbuntu上)

MMDetectionのドキュメントのNOTEにも書いてある通り、MMDetectionを使う上で必須ではないため、必要になった場合のみインストールすればよい。

基本的にはNVIDIAのドキュメントに従う。
PyTorchインストール時に指定したバージョン(今回の場合11.7)と同じバージョンをインストールするため、CUDA Toolkit Archiveから辿り、インストールコマンドを得る。

sudo apt-key del 7fa2af80
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda-repo-wsl-ubuntu-11-7-local_11.7.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-7-local_11.7.1-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
rm cuda-repo-wsl-ubuntu-11-7-local_11.7.1-1_amd64.deb
find /usr/ -name 'nvcc'
# /usr/local/cuda-11.7/bin/nvcc

補足:メモリ不足の対処(Windows上)

WSL2側のメモリが不足したり、逆にWSL2側がメモリを食いすぎてWindows側のメモリが枯渇する場合は、ユーザーフォルダを開き.wslconfigを作成し編集する。
筆者の場合、64GB中、WSL2側最大48GB、Windows側最小16GBとなるよう、以下のように設定した。

%USERPROFILE%\.wslconfig
[wsl2]
memory=48GB
swap=0

参考:

補足:ExplorerPatcher使用時の注意(Windows上)

筆者はExplorerPatcherを使用しており、以下の設定でWindows 11のUIを直している。

  • Taskbar > Taskbar style: Windows 10
  • File Explorer > Disable the Windows 11 context menu

タスクバースタイルを変更すると、スタートボタン右クリックで「Windows PowerShell (管理者)」が出てくるのだが、クリックしても管理者として実行されない
何という罠。もしやこの罠のせいでwsl --installでエラーが出たのでは......。「ターミナル (管理者)」の方を使いましょう。

Discussion