TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

Windows11+WSL2+Dockerでdlshogiを動かす

学習用のPCをWindows11にアップグレードしたので、CUDA on WSLを試してみた。

ドライバインストール

CUDA on WSLに対応したドライバをインストールする。
GPU in Windows Subsystem for Linux (WSL) | NVIDIA Developer
※2021/11/1 追記
CUDA 11.4に付属するドライバでも大丈夫だった。
このドライバを使うとWindows上で、以前のCUDA+TensorRTでビルドしたdlshogiのNPS性能が低下した。

WSL2インストール

公式のドキュメントの通り、管理者モードでPowerShellを起動して、

wsl --install

でインストールする。
Ubuntuも合わせてインストールされる。

GPUが使用できることを確認

Windows11でWSL2をインストールすると、デフォルトでCUDAが使用可能になっている。

$ nvidia-smi
$ nvidia-smi
Mon Nov  1 00:05:38 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.00       Driver Version: 510.06       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA TITAN V      On   | 00000000:01:00.0 Off |                  N/A |
| 43%   53C    P0    31W / 250W |    703MiB / 12288MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA TITAN RTX    On   | 00000000:21:00.0 Off |                  N/A |
| 41%   29C    P8    14W / 280W |    300MiB / 24576MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

GPU使用率は表示できないようなので、GPU使用率を確認するにはWindows側のnvidia-smiを使用する必要がある。

Docker CEインストール

Ubuntuを起動し、公式ドキュメントの通り、Dockerをインストールする。

$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

Dockerの設定

sudoなしで起動できるように、ユーザーをdockerグループに追加する。

sudo gpasswd -a $USER docker

Dockerサービス起動

Dockerのサービスを手動で起動する。

sudo service docker start

NVIDIA Container Toolkitインストール

公式の説明の通り、NVIDIA Container Toolkitをインストールする。

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2

$ sudo service docker stop
$ sudo service docker start

PyTorchコンテナを起動

dlshogiが使用しているPyTorchが使用できるNVIDIAのコンテナを起動する。

docker run --gpus all -it --net=host -v /mnt/d:/mnt/d --name shogi nvcr.io/nvidia/pytorch:21.10-py3

※/mnt/dは自分の環境に合わせて編集する
※共有メモリの警告が表示されるが、データローダをマルチプロセスで使用しない場合は関係ないので無視する。
※気になる場合は、ここに説明があるので、起動オプションを設定する。

dlshogiインストール

# git clone https://github.com/TadaoYamaoka/DeepLearningShogi.git
# cd DeepLearningShogi
# pip install -e .

モデル訓練

dlshogiでモデルの訓練を実行する。

# python -m dlshogi.train floodgate_2019-2021_r3800.hcpe3 floodgate.hcpe --use_amp --eval_interval 100
2021/10/31 14:44:45     INFO    network resnet10_swish
2021/10/31 14:44:45     INFO    batchsize=1024
2021/10/31 14:44:45     INFO    lr=0.01
2021/10/31 14:44:45     INFO    weight_decay=0.0001
2021/10/31 14:44:45     INFO    val_lambda=0.333
2021/10/31 14:44:46     INFO    use amp
2021/10/31 14:44:46     INFO    temperature=1.0
2021/10/31 14:44:46     INFO    optimizer SGD (Parameter Group 0 dampening: 0 lr: 0.01 momentum: 0.9 nesterov: True weight_decay: 0.0001)
2021/10/31 14:44:46     INFO    Reading training data
2021/10/31 14:44:46     INFO    floodgate_2019-2021_r3800.hcpe3
2021/10/31 14:44:55     INFO    Reading test data
2021/10/31 14:44:56     INFO    train position num = 7576031
2021/10/31 14:44:56     INFO    test position num = 856923
2021/10/31 14:45:11     INFO    epoch = 1, steps = 100, train loss = 4.2608442, 0.6415551, 0.6496299, 4.9050882, test loss = 3.4043007, 0.6760992, 0.6944302, 4.0865040, test accuracy = 0.2392578, 0.5654297
2021/10/31 14:45:25     INFO    epoch = 1, steps = 200, train loss = 2.9916522, 0.5849209, 0.6070443, 3.5839402, test loss = 2.9757018, 0.6661907, 0.6929067, 3.6507890, test accuracy = 0.2763672, 0.5869141
...

訓練が実行できることが確認できた。

Windows側のnvidia-smiでGPU使用率を確認すると、GPUが使用されていることが確認できた。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.06       Driver Version: 510.06       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA TITAN V     WDDM  | 00000000:01:00.0 Off |                  N/A |
| 61%   84C    P2   210W / 250W |   6285MiB / 12288MiB |     86%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA TITAN RTX   WDDM  | 00000000:21:00.0 Off |                  N/A |
| 41%   28C    P8    13W / 280W |    300MiB / 24576MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

dlshogiビルド

CPUがRyzenなので、MakefileをZEN2向けに修正して、ビルドする。

# cd usi
# sed -i -e 's/-DHAVE_BMI2 -msse4.2 -mbmi2 -DHAVE_AVX2 -mavx2/-msse4.2 -DHAVE_AVX2 -mno-bmi2 -mavx2 -march=znver2/' Makefile
# make

dlshogi実行

USIエンジンをコマンドから実行する。

# cd bin
# ./usi
setoption name DNN_Model value /workspace/model/model-dr2_exhi.onnx
setoption name UCT_Threads value 3
setoption name UCT_Threads2 value 3
isready
position startpos
go byoyomi 5000
info nps 39707 time 5033 nodes 199848 hashfull 19 score cp 72 depth 31 pv 2g2f 3c3d 7g7f 8c8d 2f2e 8d8e 6i7h 8e8f 8g8f 8b8f 2e2d 2c2d 2h2d 4a3b 2d3d 2b3c 5i5h 5a5b 3g3f 8f7f 8h7g 7f7d 3d7d 7c7d P*2h P*8b 7i6h 3a4b 7h7i 3b3a P*7b
bestmove 2g2f

GPU2枚(TITAN VとTITAN RTX)で4万npsくらいの探索速度である。

Windows上からの比較

Windows上からも同じ条件で探索速度を測った。

info nps 29337 time 5038 nodes 147800 hashfull 14 score cp 72 depth 31 pv 2g2f 3c3d 7g7f 8c8d 2f2e 8d8e 6i7h 8e8f 8g8f 8b8f 2e2d 2c2d 2h2d 4a3b 2d3d 2b3c 5i5h 5a5b 3g3f 8f7f 8h7g 7f7d 3d7d 7c7d P*2h P*8b 7i6h 3a4b 7h7i 3b3a P*7b
bestmove 2g2f

Ubuntuから実行した方が速い。
TensorRTのバージョンとも関連していそうである。
別途、Windows側のCUDAとTensorRTのバージョンを上げて測定してみたい。

まとめ

Windows11のWSL2上のDockerコンテナで、dlshogiの学習とUSIエンジンの実行を試した。
問題なく使用できることがわかった。

NPSはなぜかWindows上よりも高くなったので、CUDAとTensorRTのバージョンをそろえた上で別途測定してみたい。