Ubuntu18.04にNVIDIA Container Toolkitをインストールする

# 追記(2020/11)
内容が古いです、こちらを見ましょう。
[NVIDIA Docker って今どうなってるの？ (20.09 版)](https://link.medium.com/56tAzLfUdbb)

# 最初に
nvidia-docker2が非推奨になったそうなので新しく環境構築しました。
手元で上手くいった例を記録として残しているだけで、何が正しいか分かっていない(動けば正義)ので無駄な手順等を行なっている可能性があります、ご了承ください
またコマンドと出力が一緒になっている部分はコマンド前に`$`を付けています

# 環境
試した環境

- Docker, nvidia-driver, CUDA未インストール
- GPUはGTX 1660Tiと1660の二枚刺し
- OSはUbuntu: 18.04 (詳しくは以下の通り)

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
```

# nvidia-driverとCUDAをインストールする
以下のサイトを参考にインストール

- [CUDA Toolkit 10.1 Update 2 Download](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=debnetwork)
- [NVIDIA Docker って今どうなってるの？ (19.11版)](https://qiita.com/ksasaki/items/b20a785e1a0f610efa08#%E3%81%8A%E3%81%BE%E3%81%91-nvidia-%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)


```bash
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
# 自動で合うdriverを入れてくれる
# sudo ubuntu-drivers autoinstallだと435, 以下コマンドだと418のインストールを確認
sudo apt-get -y install cuda-drivers
sudo apt-get -y install cuda
```

`.bashrc`にパスを追加

```bash
# 以下を追記
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

`sudo reboot`で再起動、以下で確認

```bash
$ nvidia-smi
Fri Nov 15 00:06:50 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 166...  On   | 00000000:01:00.0  On |                  N/A |
| 29%   33C    P8     5W / 120W |    110MiB /  5911MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 1660    On   | 00000000:03:00.0 Off |                  N/A |
| 28%   31C    P8     3W / 120W |      1MiB /  5914MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       953      G   /usr/lib/xorg/Xorg                            39MiB |
|    0      1011      G   /usr/bin/gnome-shell                          69MiB |
+-----------------------------------------------------------------------------+
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243
```

# Dockerをインストールする
以下のサイトを参考にインストール

- [ubuntu 18.04 に、nvidia-docker2をインストールする](https://qiita.com/TaroNakasendo/items/44c3eecb0c1e0a91fdaf)
- [Get Docker Engine - Community for Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/#prerequisites)

```bash
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD8
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y
# 確認
sudo docker run hello-world
```

バージョンの確認(NVIDIA Container ToolkitはDockerが19.03以降でないとダメ)

```bash
$ docker -v
Docker version 19.03.4, build 9013bf583a
```

# NVIDIA Container Toolkitをインストール
以下のサイトを参考にインストール

- [NVIDIA Container Toolkit quickstart](https://github.com/NVIDIA/nvidia-docker/tree/master#quickstart)

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

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
```

動くか確認

```bash
$ nvidia-container-cli info
NVRM version:   418.87.01
CUDA version:   10.1

Device Index:   0
Device Minor:   0
Model:          GeForce GTX 1660 Ti
Brand:          GeForce
GPU UUID:       GPU-4dd3cbbf-cb72-be49-a3d0-4625043ce50e
Bus Location:   00000000:01:00.0
Architecture:   7.5

Device Index:   1
Device Minor:   1
Model:          GeForce GTX 1660
Brand:          GeForce
GPU UUID:       GPU-914b0174-e95d-0b8f-cf13-d20ed58f707e
Bus Location:   00000000:03:00.0
Architecture:   7.5
```

これでGPUコンテナを実行するとき(run)に`--gpus`オプションを付ければ動く
# メモ
dockerコマンドの際に一々sudoを打たなくていいようにする
この記事より以下コマンドを入力後、再起動
[dockerコマンドをsudoの付与無しに実行できるようにする](https://www7390uo.sakura.ne.jp/wordpress/archives/631)

```bash
sudo gpasswd -a "権限を付与するuser" docker
```

# 実際にpytorchを動かしてみる
閑話休題
今回はお手軽にpytorch公式のdockerhubからイメージを持ってくる(動くか確認もしたかった)

- [pytorch/pytorch](https://hub.docker.com/r/pytorch/pytorch/tags)
- [runtimeではnvccが使えないので注意[nvidia-docker2]](http://vastee.hatenablog.com/entry/2018/08/07/141446)

```bash
# 色々オプションをつけているが、最低限なら-pとか-vはいらない
# -vするなら適当に作業ディレクトリに移動してから行う
docker run -itd --name pytorch -p 8888:8888 -v $PWD/:/workspace --gpus all pytorch/pytorch:1.3-cuda10.1-cudnn7-devel
docker exec -it pytorch /bin/bash
```

`nvidia-smi`もちゃんと動くことを確認
学習部分だけいい感じに切り取ってくれている記事があったので利用させてもらう
[Docker(19.03)でgpu有効化してpytorchで訓練するまでやる(Ubuntu18.04)](https://qiita.com/tomp/items/50081b99df7963462488#%E5%AD%A6%E7%BF%92)
無事動くことを確認

# おまけ

この記事より丁寧でわかりやすい導入記事()
[NVIDIA Container Toolkit を使って Docker コンテナで GPU を使う](https://blog.amedama.jp/entry/docker-nvidia-container-toolkit)