Windows 10/11 の WSL や docker 上で nVidia GPU (cuda) を使う
Windows 11 じゃないと使えない、Windows 10 は insider preview (dev channel) にしないとダメ、というドキュメントが多くて、いやWin 10 の21H2でできるのでは?とセットアップしてみたメモ。結果としてはできる。もちろんWin11でもできる。
なお環境は WSL2 の Ubuntu 20.04。
Microsoft のドキュメント
使えると書いてある
nVidia のドキュメント
Win11 か Win10 + insider preview で、と書いてある…(2021/12/18現在)
が21H2ならできるはずでは?
やってみるぞ
Windows 10 を 21H2 へ更新する
wsl を kernel 5.10 以降に update する
昔のままだと kernel 4.19.x で動かない
WSL サポートのドライバーを入れる
docker から GPU 使う
オフィシャルドキュメントは WSL + Docker-CE で叩いているが、普通に Docker Desktop から叩いてみる
一回目はGPU見つからずエラーだったけど、↑のnvidia wsl サポートドライバーを入れた後に、Docker Engine を再起動してないからだった。
再起動後は普通に動く。Windows 側からでも、WSL の Linux 上からでもどちらでも問題なく使える。
code:sh
$ docker run --rm -it --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark -numbodies=512000
...
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
Windowed mode
Simulation data stored in video memory
Single precision floating point simulation
1 Devices used for simulation
GPU Device 0: "Ampere" with compute capability 8.6
number of bodies = 512000
512000 bodies, total time for 10 iterations: 2540.940 ms
= 1031.681 billion interactions per second
= 20633.622 single-precision GFLOP/s at 20 flops per interaction
WSL2 から GPU 使う
ubuntu の cuda をママいれると、純Linux用のドライバーが入ってしまうので、apt pin で入らないように固定しつつ、cuda を入れる
meta-package の cuda-tooklit を入れることで、cuda のバージョンを切り替えられる(といっても11-4,11-5だけだけど)
code:sh
$ apt-cache search cuda-toolkit
nvidia-cuda-toolkit - NVIDIA CUDA development toolkit
nvidia-cuda-toolkit-gcc - NVIDIA CUDA development toolkit (GCC compatibility)
cuda-toolkit-11-4 - CUDA Toolkit 11.4 meta-package
cuda-toolkit-config-common - Common config package for CUDA Toolkit.
cuda-toolkit-11-config-common - Common config package for CUDA Toolkit 11.
cuda-toolkit-11-4-config-common - Common config package for CUDA Toolkit 11.4.
cuda-toolkit-11-5-config-common - Common config package for CUDA Toolkit 11.5.
cuda-toolkit-11-5 - CUDA Toolkit 11.5 meta-package
nvidia-smi は動いた。nvcc は /usr/local/cuda-11.5/bin/ に入っているようだ。
とりあえず sample をコンパイルして動くかを試す。
/usr/local/cuda/samples にあるので make して、できたバイナリを動かす
問題なく動かせた
cudnn
TensorFlow などから使う用途に cudnn を入れる
code:bash
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-get update
sudo apt-get install libcudnn8=${cudnn_version}-1+${cuda_version}
sudo apt-get install libcudnn8-dev=${cudnn_version}-1+${cuda_version}
cuda に対応する cudnn を入れる。最新を入れるなら何もなくても良い
cuda 11.5 対応の cudnn 8.3 が入った
TensorFlow を WSL2 上で動かす
cuda 11.5 は TF 2.7.0 が対応してるっぽいので、環境を作って動かす
code:sh
conda create --name py39-tf27 python=3.9
pip install tensorflow==2.7.0
conda activate py39-tf27
tensorflow の hello world 的なサンプルを書いて実行する
なお、NN層が浅くデータも少ないので、メモリ転送帯域がボトルネックになるため、GPUよりCPUのほうがこのコードなら速く処理できる
code:log
$ python hello-gpu.py
# NUMA の warning たくさん
Your kernel may have been built without NUMA support.
2021-12-18 09:05:32.086852: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1525] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 21629 MB memory: -> device: 0, name: NVIDIA GeForce RTX 3090, pci bus id: 0000:0a:00.0, compute capability: 8.6
1 Physical GPUs, 1 Logical GPUs
2021-12-18 09:05:33.844177: I tensorflow/stream_executor/cuda/cuda_blas.cc:1774] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.
Epoch 1/5
Epoch 2/5
Epoch 3/5
Epoch 4/5
Epoch 5/5
313/313 - 1s - loss: 0.0759 - accuracy: 0.9777 - 771ms/epoch - 2ms/step
tf.Tensor(
[[2.90975755e-09 7.82388807e-11 1.39521660e-06 1.53591645e-05
1.62591760e-10 1.90548803e-08 2.49957356e-14 9.99981999e-01
2.65425673e-08 1.14033571e-06]
[3.33647732e-09 2.12538521e-06 9.99994516e-01 3.35006484e-06
1.19420134e-14 1.58522628e-09 1.52490731e-09 1.00598436e-11
5.22445376e-09 5.78770328e-15]
[2.01191256e-07 9.98933733e-01 1.82860793e-04 1.20782879e-05
3.30207058e-06 1.59161846e-06 8.79778236e-06 8.03754607e-04
5.32809827e-05 2.75442346e-07]
[9.99946356e-01 2.56479904e-09 1.69727518e-05 3.53857928e-07
1.42381339e-06 5.38322274e-06 1.67797498e-05 4.08239339e-06
4.37360992e-09 8.71325938e-06]
[3.00797979e-06 5.85011399e-08 1.90970768e-05 2.03114638e-07
9.96902525e-01 3.27941564e-07 1.27610497e-06 2.60300585e-04
7.60649891e-06 2.80559529e-03]], shape=(5, 10), dtype=float32)