Introduction

GPU を使って docker で遊ぶときはいつも Ubuntu を使っていたが、自宅のだと一番良い GPU を積んだマシンは Windows とのデュアルブートのため、環境の切り替えが必要。
いい加減面倒なので、Windows で GPU を使った docker 環境を作ってみた。

実はその前に、Python の venv で環境を作ってやりたいことができるかどうか試したが、python パッケージのビルドでこけたのでやむなく docker でやることにしたのが事の始まり。

How to use?

基本はググってみれば情報は見つかる。

1. WSL の更新

カーネルが 5.10.43.3 以上であることが条件。

私の環境は下記だった。

1
2
C:\WINDOWS\system32> wsl cat /proc/version
Linux version 4.19.128-microsoft-standard (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Tue Jun 23 12:58:10 UTC 2020

そのため、

1
2
3
4
5
6
C:\WINDOWS\system32> wsl --update
更新をチェック中...
更新をダウンロード中...
更新をインストール中...
この変更は、次回の WSL 再起動時に有効になります。強制的に再起動するには、'wsl --shutdown' を実行してください。
カーネル バージョン: 5.10.102.1

で更新。

1
C:\WINDOWS\system32> wsl --shutdown
1
2
C:\WINDOWS\system32> wsl cat /proc/version
Linux version 5.10.102.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Wed Mar 2 00:30:59 UTC 2022

あと、docker も再起動する。

2. GPU ドライバのインストール

これは正しいかわからないが、古いドライバーだと使えない可能性がある。

installing-nvidia-drivers によれば

Install NVIDIA GeForce Game Ready or NVIDIA RTX Quadro Windows 11 display driver on your system with a compatible GeForce or NVIDIA RTX/Quadro card from https://www.nvidia.com/Download/index.aspx?lang=en-us. rRefer to the system requirements in the Appendix.)

とあるので、 NVIDIA GeForce Game Ready をインストールする。
Studio Driver とどう違うかはわからないが、指示に従う。

3. 動作確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
C:\WINDOWS\system32> docker run --rm -it --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark -numbodies=512000
Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
-fullscreen (run n-body simulation in fullscreen mode)
-fp64 (use double precision floating point values for simulation)
-hostmem (stores simulation data in host memory)
-benchmark (run benchmark to measure performance)
-numbodies=<N> (number of bodies (>= 1) to run in simulation)
-device=<d> (where d=0,1,2.... for the CUDA device to use)
-numdevices=<i> (where i=(number of CUDA devices > 0) to use for simulation)
-compare (compares simulation results running once on the default GPU and once on the CPU)
-cpu (run n-body simulation on the CPU)
-tipsy=<file.bin> (load a tipsy model file for simulation)

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: "Pascal" with compute capability 6.1

> Compute 6.1 CUDA device: [NVIDIA GeForce GTX 1080]
number of bodies = 512000
512000 bodies, total time for 10 iterations: 9246.127 ms
= 283.518 billion interactions per second
= 5670.353 single-precision GFLOP/s at 20 flops per interaction

無事に動いた。

docker で作った Pytorch 環境からでも

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
user@b148c3ef3f01:/opt/base$ python3 -c "import torch; print(torch.cuda.is_available())"
True
user@b148c3ef3f01:/opt/base$ nvidia-smi
Sun Dec 4 06:16:45 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.65 Driver Version: 527.37 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| 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 GeForce ... On | 00000000:01:00.0 On | N/A |
| 31% 39C P8 7W / 180W | 315MiB / 8192MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

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

問題なし。