🐳

WSL2上にNVIDIA Container ToolkitをインストールしてDockerコンテナ内でCUDAを使用できるようにする

2022/07/29に公開

WSL2上のDockerからCUDAを使える環境を作成したときの備忘録です。
古い記事の中で手順が変わっていたものなどあったのでまとめました。


環境

OS (WSLホスト): Windows 11
OS (WSLゲスト): Ubuntu 22.04
NVIDIAドライバのバージョン: 516.59

WSL用のドライバについて

現在はWindows用のNVIDIAドライバにWSL用ドライバが含まれているので[1]ダウンロードページかGeForce ExperienceからWindows用のドライバをインストールします。

ドライバをインストール後、/usr/lib/wsl/lib配下にドライバ関連のファイルが増えています。
この中にnvidia-smiコマンドが含まれているのでこのコマンドでGPUが認識できていることを確認できます。

$ ls -lt /usr/lib/wsl/lib
total 73364
-r-xr-xr-x 1 root root   141464 Jun 24 12:05 libcuda.so
-r-xr-xr-x 1 root root   141464 Jun 24 12:05 libcuda.so.1
-r-xr-xr-x 1 root root   141464 Jun 24 12:05 libcuda.so.1.1
-r-xr-xr-x 1 root root  5950624 Jun 24 12:05 libnvcuvid.so
-r-xr-xr-x 1 root root  5950624 Jun 24 12:05 libnvcuvid.so.1
-r-xr-xr-x 1 root root  7547400 Jun 24 12:05 libnvdxdlkernels.so
-r-xr-xr-x 1 root root   424400 Jun 24 12:05 libnvidia-encode.so
-r-xr-xr-x 1 root root   424400 Jun 24 12:05 libnvidia-encode.so.1
-r-xr-xr-x 1 root root   212624 Jun 24 12:05 libnvidia-ml.so.1
-r-xr-xr-x 1 root root   354768 Jun 24 12:05 libnvidia-opticalflow.so
-r-xr-xr-x 1 root root   354768 Jun 24 12:05 libnvidia-opticalflow.so.1
-r-xr-xr-x 1 root root 45841504 Jun 24 12:05 libnvwgf2umx.so
-r-xr-xr-x 1 root root   600472 Jun 24 12:05 nvidia-smi
-r-xr-xr-x 2 root root  5398848 Mar 19 18:17 libd3d12core.so
-r-xr-xr-x 2 root root   785608 Jun  5  2021 libd3d12.so
-r-xr-xr-x 2 root root   827904 Jun  5  2021 libdxcore.so
$ nvidia-smi
Thu Jul 28 20:46:31 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.57       Driver Version: 516.59       CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| 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 |
| 32%   47C    P5    33W / 175W |   2035MiB /  8192MiB |     41%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

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

Dockerのインストール

インストールガイドに沿ってインストールします。

$ sudo apt update
$ sudo apt install -y ca-certificates curl gnupg lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
      | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 実行時のグループ設定
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker

NVIDIA Container Toolkitのインストール

インストールガイドに沿って進めます。
nvidia-docker2は非推奨なので[2]nvidia-container-toolkitパッケージをインストールします。

$ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
    sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
    && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
        sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
$ sudo apt update
$ sudo apt install -y nvidia-container-toolkit

# Dockerデーモンの再起動
$ sudo systemctl restart docker

動作確認

コンテナ内でnvidia-smiコマンドを実行して先ほどと同じ出力になればOKです。

$ docker run --rm --gpus all nvidia/cuda:11.7.0-base-ubuntu22.04 nvidia-smi
Unable to find image 'nvidia/cuda:11.7.0-base-ubuntu22.04' locally
11.7.0-base-ubuntu22.04: Pulling from nvidia/cuda
405f018f9d1d: Pull complete
5c77aa48067f: Pull complete
d62c65265317: Pull complete
09c9dc58c1ea: Pull complete
dbe53a87777f: Pull complete
Digest: sha256:6d5600a579ab5dd44d38c3fd575a26357056424d5c95cff06705f73b4f3b86c9
Status: Downloaded newer image for nvidia/cuda:11.7.0-base-ubuntu22.04
Thu Jul 28 11:57:47 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.57       Driver Version: 516.59       CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| 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 |
| 30%   43C    P5    26W / 175W |   4515MiB /  8192MiB |     16%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

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

参考資料

https://www.docker.com/blog/wsl-2-gpu-support-for-docker-desktop-on-nvidia-gpus/
https://docs.nvidia.com/cuda/wsl-user-guide/index.html
https://docs.docker.com/config/containers/resource_constraints/#gpu
https://blog.amedama.jp/entry/docker-nvidia-container-toolkit

脚注
  1. https://developer.nvidia.com/cuda/wsl ↩︎

  2. https://medium.com/nvidiajapan/nvidia-docker-って今どうなってるの-20-09-版-558fae883f44 ↩︎

Discussion