WindowsゲーミングPCでGPUを使ったコンテナを実行する方法

# はじめに

NVIDIA GPU が乗っている Windows ゲーミング PC にて、GPU を使ったコンテナを実行するための手順をざっと紹介します。

# 前提条件

- NVIDIA GPU を搭載したゲーミング PC
- Windows 環境にて適切なドライバーが適用されていること (*1)
- Windows 管理者権限を持つアカウントを利用可能なこと

:::note info
*1 NVIDIA 公式ドライバに CUDA ドライバは含まれているはずです。私が試した環境は、工場出荷時の環境となります。DCH デバイスドライバのみをインストールした状態です。NVIDIA GeForce Experience はインストールしていません。
:::

# 手順

手順は次のようになります。
- WSL のインストール
- docker engine のインストール
- NVIDIA Container Toolkit のインストール ([詳細はこちらをの英語ページ](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html)をご確認下さい。Host OS に CUDA ドライバをインストールすることなどがビジュアルで分かります)
- GPU を使うコンテナの動作確認

## WSL のインストール

PowerShell または Windows コマンド プロンプトを管理者モードで開き、次のコマンドを実行します。詳しい手順は、[Microsoft のドキュメント](https://learn.microsoft.com/ja-jp/windows/wsl/install)をご参照下さい。

```powershell
wsl --install
```

## docker engine のインストール

この作業は、ubuntu にて実行して下さい。docker 公式サイトにある最新バージョンの[docker engine の ubuntu へのインストールステップ](https://docs.docker.com/engine/install/ubuntu/)を参照しながら作業します。具体的な手順は次のようになります。

```sh
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
```

```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

ここまでで docker engine が動作する状態になります。`sudo docker ps -a` もしくは `docker ps -a` (post-installation steps を実行した場合)などで docker engine が正常に動作していることをご確認下さい。

## NVIDIA Container Toolkit のインストール

NVIDIA Container Toolkit を WSL 環境にインストールします。インストール先がWindows ではないことをご注意下さい。[公式ページの Installing the NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-the-nvidia-container-toolkit)に詳しい説明があります。WSL の ubuntu へのコピペは注意して作業を行って下さい。コピペの失敗で適切に動作しない、ということが起きるかと思います。

```sh
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
```

```sh
sudo apt-get update
```

コピペのミスがあったりすると、次のコマンドで失敗することがあります。

```sh
sudo apt-get install -y nvidia-container-toolkit
```

私は docker を再起動しないと正常に動作しませんでした。

```sh
sudo systemctl restart docker
```

## GPU を使うコンテナの動作確認

まず ubuntu にて nvidia-smi を実行し CUDA バージョンを確認して下さい。

```sh
$ nvidia-smi
Fri Dec 29 17:44:52 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.52                 Driver Version: 531.88       CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX 4060 L...    On | 00000000:01:00.0 Off |                  N/A |
| N/A   35C    P3               15W /  N/A|      0MiB /  8188MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

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

[docker hub/nvidia/cuda](https://hub.docker.com/r/nvidia/cuda/tags?page=1) にアクセスし、ホストのバージョンと同じものを見つけて下さい。私の環境の場合、CUDA 12.1 だったので 12.1.0-base-ubuntu22.04 をコンテナとして起動し動作を確認しました。

```sh
$ docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
Fri Dec 29 08:50:11 2023                                   +---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.52                 Driver Version: 531.88       CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX 4060 L...    On | 00000000:01:00.0 Off |                  N/A |
| N/A   35C    P3               14W /  N/A|      0MiB /  8188MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

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

これで作業は完了となります。あとは目的の GPU を使ったアプリケーションを起動してお楽しみ下さい。

## インストールが失敗していた場合

NVIDIA Container Toolkit のインストールに失敗した場合、もしくは再起動しなかった場合、次のようなエラーが出力されることがあります。インストールの結果を確認したり、docker daemon の再起動を行うなど対応してみて下さい。

```
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
```

# 参考

- [Microsoft/WSL を使用して Windows に Linux をインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install)
- [docker/Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
- [NVIDIA Container Toolkit/Installing the NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-the-nvidia-container-toolkit)
- [docker hub/nvidia/cuda](https://hub.docker.com/r/nvidia/cuda/tags?page=1)