コンテナ環境でGPUを使うためのセットアップ

# コンテナ環境でGPUを使いたい

コンテナ環境でGPUを使うためにいろいろとセットアップしていきます。
wsl2のinstallは以前の記事で書いたので、そちらを参照してください。

https://qiita.com/hotate_2235/items/87654a1348e51774c224#4-cuda%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E7%92%B0%E5%A2%83%E3%81%AE%E6%95%B4%E5%82%99pytorch


# 個人的一番つまりポイント

私は普段Rancher Desktopを使っているのですが、__Rancher Desktopはnvidiaのgpuに対応していないっぽいです。__
公式Rancher　Desktopの公式ドキュメントにもほぼ記載がないので、あきらめました。

https://github.com/rancher-sandbox/rancher-desktop/issues/3968

https://forums.developer.nvidia.com/t/support-rancher-desktop-on-windows-11/296324

なので、WSL上にdockerを直接入れて、そこでコンテナを使うという感じにしました。

# コンテナ環境GPUセットアップ

セットアップしていきます。

## wsl上でのdockerのinstall

これをもとに作業します。

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

```install
# Run the following command to uninstall all conflicting packages
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# Set up Docker's apt repository.
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# To install the latest version, run:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Verify that the installation is successful by running the hello-world image:
sudo docker run hello-world
```


## wslのubuntu上での確認作業

```
nvidia-smi # wslでそもそもgpuを認識しているかの確認

# コンテナでgpuを認識するかの確認
# 確認用のdocker image をpull
sudo docker image pull nvidia/cuda:12.2.0-base-ubuntu22.04
# 確認用のdocker containerを起動
sudo docker run --gpus all --rm nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
# gpu情報が出れば成功

Sun May 25 05:18:28 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 560.35.02              Driver Version: 560.94         CUDA Version: 12.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 GeForce RTX 3060        On  |   00000000:01:00.0  On |                  N/A |
| 30%   31C    P8              8W /  170W |     688MiB /  12288MiB |      1%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A        27      G   /Xwayland                                   N/A      |
|    0   N/A  N/A        39      G   /Xwayland                                   N/A      |
+-----------------------------------------------------------------------------------------+

```

## 備忘録
今回、rancher desktop上でgpuを使えるコンテナを利用しようと色々とやっている間に入れたものがあるので、それについてのメモをしておきます。

### nvidia-container toolkit

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

https://zenn.dev/rhene/articles/docker-on-wsl2-with-gpu

これらに従ってwsl上でinstallを行いました。

```container_toolkit install
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 sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update
sudo apt install -y nvidia-container-toolkit
```

## エラー！

`Error response from daemon: could not select device driver "nvidia" with capabilities: [[all]]`
というエラーが出ました。ので、以下の記事に従って対処しました。

https://qiita.com/murakamixi/items/5f6cf5c1ab6b4090f64a

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

sudo docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:23.03-py3
```

これでひとまずちゃんと起動するようになりました。

## dockerfileとdockercomposeを調整

dockerfileとdockercomposeを以下のようにしました。

```dockerfile
# pytorchのcudaいりimageを引っ張る
FROM pytorch/pytorch:2.7.0-cuda12.6-cudnn9-runtime

# 必要ライブラリ(jupyterのinstall)
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
```

```yml:dockercompose.yml
services:
  torch-cuda-container:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: torch-cuda-container
    volumes:
      - ./notebook:/workspace/notebook
    ports:
      - "8188:8188"
    # gpuを使うための設定関連？
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
```

これによって、gpuを認識するコンテナ環境を作成できました。
```
sudo docker compose up -d
sudo docker compose run --rm -it torch-cuda-container bash
```

あとは、vscodeをwslにつないで、そこからコンテナ一覧を見て、起動しているコンテナにつなげば完了です。

# まとめ
これでgpuをコンテナ環境で使えるようになりました。
cuda関連はいろいろともめるので、備忘録として残しておきます。

必要なもの
- windows上でのcudaドライバー
- wsl環境
- wsl環境下でのnvidia-container toolkit
- wsl環境下でのdocker