Dockerを使って爆速でGPUを設定する方法



#はじめに
機械学習をやろうと思ったら、まずやってくるのが **GPUの設定** ですよね。ドライバインストールしてCUDAとcudnnインストールして、、、。**これが本当にめんどくさい！**そんな方には **Dockerを用いた設定をオススメ**します。マジで**爆速**です。しかも、PyTorchやTFによって環境を別で設定できますし、使わなくなったらその環境をすぐに削除できます。ひと通りカバーした記事があまりなかったので残しておきます。困っている方の参考になればと思います。

*ミスがありましたら、ぜひご指摘お願いします


#手順

####1. NVIDIA driver のインストール
####2. Docker のインストール
####3. NVIDIA container toolkit のインストール

---


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

- ドライバがインストールされているか確認
- インストールされてなければ、何も表示されない


```
$ nvidia-smi
```

- NVIDIAドライバを削除したい場合


```
$ sudo apt-get --purge remove nvidia-*
$ sudo apt autoremove
```

- リポジトリの追加


```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
```

- インストール可能なドライバの表示(recomendedを選ぶのが無難？)

```
$ ubuntu-drivers devices
```

- ドライバのインストール


```
$ sudo apt-get install nvidia-driver-450
```

- 再起動

```
$ sudo reboot
```

#2. Dockerのインストール

- インストール可能なパッケージの一覧を更新

```
$ sudo apt-get update
```
- 前提ソフトウェアをインストール

```
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
```

- Dockerの公式GPG公開鍵のインストール


```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
```

- 公開鍵のフィンガープリントを確認

```
$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
```
*「0EBFCD88」は鍵ID

- repositoryの追加

```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

- インストール可能なパッケージの一覧を更新


```
$ sudo apt-get update
```

- Docker CE のインストール

```
$ sudo apt-get install -y docker-ce
```

- この状態だと、`$ sudo docker ps`のように`sudo`を付加しないと実行できないので変更

```
# dockerグループの情報表示
$ getent group docker

# Dockerグループにユーザ追加
$ sudo gpasswd -a [username] docker

# 権限を付与
$ sudo chgrp docker /var/run/docker.sock

# 追加されているか確認
$ id [username]

# 再起動
$ sudo reboot
```

- エラーが消えているか確認


```
$ docker ps
```



- これでエラーが出なかったらOK

```
$ sudo docker run hello-world
```

#3. NVIDIA container toolkit


- インストール


```

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

- 確認

```
$ nvidia-container-cli info
```

*表示されればOK

#4. DockerでGPUを使う

- イメージをpull

```
$ docker pull nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 
```

- docker上でNVIDIAドライバが認識されていればOK

```
$ docker run --gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 nvidia-smi
```

- イメージを元にコンテナを作成する
- 以下は、CUDA:10.0、cudnn:7を使用する場合


```
$ docker run -it -d --gpus all --name gpu_env nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 bash
```

- 起動中のコンテナ確認

;...
```
$ docker ps
```
- コンテナに入る

```
$ docker exec -it gpu_env bash
```


#5. コンテナで作業

今回は、PyTorchでGPUを使用できるように設定しておきます。

- コンテナ上でドライバが認識されているか確認


```
root@cf3868e92ebf:/# nvidia-smi
```

- CUDAの確認

```
root@cf3868e92ebf:/# nvcc -V
```

- インストール可能なパッケージの一覧を更新

```
root@cf3868e92ebf:/# apt-get update
```

- pythonのインストール


```
root@cf3868e92ebf:/# apt-get install -y python3 python3-pip
```

- pipでtorhとtorchvisionのインストール


```
root@cf3868e92ebf:/# pip3 install torch torchvision
```

- GPUが使用可能か確認


```
root@cf3868e92ebf:/# python3
Python 3.6.9 (default, Oct  8 2020, 12:12:24) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import torch
>>> print(torch.cuda.is_available())
True
>>> 
```

*`True`と表示されればOK

- コンテナを抜ける


```
root@cf3868e92ebf:/# exit
```

#その他(dockerコマンド)


- ローカルにあるイメージの一覧表示

```
$ docker images
```

- 起動中のコンテナ表示


```
$ docker ps
```



- コンテナの起動

```
$ docker start CONTAINER
```

- コンテナの停止

```
$ docker stop CONTAINER
```

- 起動中のコンテナに入る

```
$ docker exec -it CONTAINER bash
```

- コンテナの名前変更

```
$ docker rename OLD_CONTAINER_NAME NEW_ONTAINER_NAME
```

- コンテナの削除

```
$ docker rm CONTAINER
```

#参考文献

- [Ubuntu16.04 LTSにDocker CEをインストールする。](https://qiita.com/onodes/items/e87479450cb5545dd3b2)
- [Ubuntu 20.04へのDockerのインストールおよび使用方法](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja)
- [NVIDIA container toolkitを使って、dockerのコンテナ上でcudaを動かす](https://qiita.com/Hiroaki-K4/items/c1be8adba18b9f0b4cef)
- [NVIDIA Docker って今どうなってるの？ (20.09 版)](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44)