DockerでCUDA GPU環境を作る方法 自分用まとめ



## Linux PCまたはWSL2上のLinux(Ubuntu)のDockerで動かす場合

1. NVIDIA Driverのインストール
1. Dockerのインストール
1. NVIDIA Container Toolkitのインストール

## WindowsのDocker Desktopで動かす場合

1. NVIDIA Driverのインストール
1. Docker Desktopのインストール

---

### 1. NVIDIA Driverのインストール

CUDAはDockerコンテナ内に入れる必要があるため、ホストPCにCUDAを入れる必要はない。
ただし、ドライバは必要

#### 1-1. Linuxの場合

1. [CUDA Toolkitを配布しているサイト](https://developer.nvidia.com/cuda-downloads)を開く
1. OS、アーキテクチャ、ディストリビューション、バージョンを選択
1. deb(network)またはrpm(network)を選択し、表示されたInstallation Instructionsに従う

```bash: Ubuntu 22.04の場合
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
$ sudo dpkg -i cuda-keyring_1.1-1_all.deb
$ sudo apt-get update
```

最後に、NVIDIA Driverのみをインストールするには、

```bash: ドライバのみインストール
$ sudo apt-get -y install cuda-drivers
```

CUDAを入れたいときは、

```bash: CUDAをインストール
$ sudo apt-get -y install cuda
```

Proxyなどの関係でdeb(network)でうまくいかない場合はdeb(local)またはrpm(local)を選択するとよい。
その場合、新しいバージョンにアップデートしようとしたときにうまくインストールできない場合がある。
もしそうなったら一旦CUDAやドライバ類をアンインストールしてからもう一度インストールを試す。

```bash: CUDA Toolkitのアンインストール
$ sudo apt purge cuda-*
$ sudo apt purge nvidia-*
$ sudo apt autoremove
```

#### 1-2. Windows（およびWSL2上のLinux）の場合

NVIDIA Driverをインストールする場合は、[NVIDIAドライバダウンロードのページ](https://www.nvidia.co.jp/Download/Find.aspx)からGPUとOSを選択してインストーラをダウンロードして実行
（GRDとSDはどちらでもよい、GRDの方がやや新しいバージョンが公開されていることがある）

CUDAをインストールするとドライバのバージョンが若干古くなる場合があるのでNDIVIA Driverのインストールをお勧めする。
CUDAを入れたい場合は、[CUDA Toolkitを配布しているサイト](https://developer.nvidia.com/cuda-downloads?target_os=Windows)からインストーラーをダウンロードして実行

---

### 2. Dockerのインストール

#### 2-1. Docker(LinuxおよびWSL2上のLinux)の場合

[Docker公式のインストールガイド](https://docs.docker.com/engine/install/)に従う
```bash:以前のバージョンをアンインストール
$ sudo apt-get remove docker docker-engine docker.io containerd runc
```
```bash:リポジトリの追加
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

```
```bash:Dockerのインストール
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```
```bash:ユーザーをdockerグループに追加
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
```

これで`docker`コマンドが使えるようになるはず

WSL2上のUbuntuだとsystemctlが ~~使えないので、DockerデーモンにProxyが通せない。 [dotnet-runtime](https://docs.microsoft.com/ja-jp/dotnet/core/install/) などを入れてsystemdをPID1にすると動かせるらしい。~~

WSL2上のLinuxでもsystemdが[使えるようになった](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/)。
WSL2上のLinuxの `/etc/wsl.conf` に `systemd=true` を記述する。  
[Microsoftのドキュメント](https://learn.microsoft.com/windows/wsl/systemd)

```bash: /etc/wsl.conf
[boot]
systemd=true
```

Windows上からコピペすると改行コードがCRLFになってしまうことがあるので気を付ける。
Linux内では改行コードをLFにしておかないと動かない。

#### 2-2. Docker Desktop(Windows)の場合

[Docker公式のインストールガイド](https://docs.docker.com/engine/install/)に従う
「Download Docker Desktop for Windows」というボタンからインストーラをダウンロードして実行する。
Docker Desktopを起動すればpowershellで`docker`コマンドが使えるようになるはず

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

Linux（およびWSL2上のLinux）のDockerからGPUを使う場合はNVIDIA Container Toolkitをインストールをする必要がある。WindowsからDocker Desktopを利用する場合は必要ない。
[NVIDIA Container Toolkitのインストールガイドのページ](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html)に従う。

```bash:リポジトリの追加
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && 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/$distribution/libnvidia-container.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
```

```bash:NVIDIA Container Toolkitのインストール
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
```

インストール後、PCかDockerを再起動するとGPUを認識するようになる。

```bash:Dockerの再起動
$ sudo systemctl restart docker
```

---


DockerでGPUを使う準備が済んだら[TensorFlow](https://hub.docker.com/r/tensorflow/tensorflow/)や[PyTorch](https://hub.docker.com/r/pytorch/pytorch)のイメージをベースに好みでDockerfileを作ったりすればいい。

VSCodeでリモートしたり（リモートホスト内のDockerコンテナにもRemote Development拡張機能でトンネルして入れる）、
コンテナの中でJupyter Serverを起動したりして開発する。

---

#### 注意点

WSL2上のLinuxを使っているとメモリを確保するだけして開放しなくなる。[issue](https://github.com/microsoft/WSL/issues/4166)
`%UserProfile%\.wslconfig`にメモリの使用量制限とスワップ領域の設定を書かないとSSDの寿命がゴリゴリ削られていく。
メモリがいっぱいになると計算を回せなくなったりするので長期間使用する場合は定期的に再起動が必要。

2022/05/26 更新
NVIDIAのリポジトリのGPG keyが更新されたためかコマンドが更新されていたので併せて修正した。

2023/07/05 更新
Nvidia Driver のコマンドを更新、 `wsl.conf` について追記