ubuntuのcuda+cuDNN環境を最新版にアップデートする

# TL;DR

* 「最近のバージョンを使ってね」と以下のように言われてGPU関連コマンドが実行できなくなった場合に，ドライバとcuDNNライブラリを更新する手続きの備忘録です
    * nvidia-docker2を使用する場合も，ホストPCのドライバをアップデートする必要があります

```
# nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
```

# CUDA Toolkitのアップデート

## アップデート手順

* [CUDA Toolkitのダウンロード](https://developer.nvidia.com/cuda-downloads)から，適切なプラットフォームを選択してインストーラをダウンロード
    * [Linux][x86_64][Ubuntu][18.04][runfile(local)]を選択して，表示されたベースインストーラをダウンロード
    * ```cuda_10.1.105_418.39_linux.run``` のような名前のファイル
    * URLさえわかれば， ```wget``` コマンドでダウンロードできる

```shell
sh ./cuda_10.1.105_418.39_linux.run

│ Do you accept the above EULA? (accept/decline/quit):
│ accept       # ``accept''とキーボード入力してエンターキー

│ CUDA Installer se Agreement                                                  │
│ - [X] Driver                                                                 │
│      [X] 418.39                                                              │
│ + [X] CUDA Toolkit 10.1                                                      │
│   [X] CUDA Samples 10.1                                                      │
│   [X] CUDA Demo Suite 10.1                                                   │
│   [X] CUDA Documentation 10.1                                                │
│   Install               # カーソルをInstallに合わせてエンターキー
│   Options                                                                    │

# マイナーバージョンアップが行われる場合
│ A symlink already exists at /usr/local/cuda. Update to this installation?    │
│ Yes [X] Driver          # カーソルをYesに合わせてエンターキー
│ No   [ ] 418.39

# 同一マイナーバージョンでのアップデートの場合
│ Existing directory found at install path, upgrade existing cuda files?       │
│ Upgrade all            # カーソルをUpgrade Allに合わせてエンターキー
│ Choose components to upgrade                                                 │
│ No, abort installation                                                       │

# インストールのまとめ
===========
= Summary =
===========
Driver:   Installed
Toolkit:  Installed in /usr/local/cuda-10.1/
Samples:  Installed in /home/ubuntu/, but missing recommended libraries
```

## アップデート確認

* nvidia-smiコマンドで，ドライババージョンがインストールしたものになっていることを確認する

```bash
# nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.39       Driver Version: 418.39       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
```

# cuDNNのアップデート

* [cuDNN](https://developer.nvidia.com/cudnn)のダウンロードには，ユーザ登録が必要です
    * ログインして利用規約に同意したら，最新版のcuDNNをクリックする
        * 例）[Download cuDNN v7.5.0 (Feb 25, 2019), for CUDA 10.1]など
    * Runtime, Developer Library, Code Samples and User Guideをそれぞれダウンロードする（以下はubuntu18.04での例）
        * cuDNN Runtime Library for Ubuntu18.04 (Deb)
            * libcudnn7_7.5.0.56-1+cuda10.1_amd64.deb
        * cuDNN Developer Library for Ubuntu18.04 (Deb)
            * libcudnn7-dev_7.5.0.56-1+cuda10.1_amd64.deb
        * cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)
            * libcudnn7-doc_7.5.0.56-1+cuda10.1_amd64.deb

* 古いlibcudnnをアンインストールし，新しいバージョンをインストールする
    * Runtime, Developer Library, Code Samples and User Guideの順にインストールする

```bash
aptitude remove libcudnn7 libcudnn7-dev libcudnn7-doc
yes | gdebi libcudnn7_7.5.0.56-1+cuda10.1_amd64.deb
yes | gdebi libcudnn7-dev_7.5.0.56-1+cuda10.1_amd64.deb
yes | gdebi libcudnn7-doc_7.5.0.56-1+cuda10.1_amd64.deb
```

# 確認

cuDNNを使用する[OpenPoseをコンテナ実行するDockerfile](https://qiita.com/myoshimi/items/412f595b964772fa433e)を実行し，動作することを確認．
* 実行中に ```nvidia-smi``` でGPUの稼働状況を確認する

```bash
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.39       Driver Version: 418.39       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  Tesla M60           Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   50C    P0   107W / 150W |   4388MiB /  7618MiB |     93%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      5021      C   /usr/local/bin/openpose.bin                 4377MiB |
+-----------------------------------------------------------------------------+
```

# 参考

* [CUDA Toolkitのダウンロード](https://developer.nvidia.com/cuda-downloads)
* [cuDNN](https://developer.nvidia.com/cudnn)
* [OpenPoseをコンテナ実行するDockerfile](https://qiita.com/myoshimi/items/412f595b964772fa433e)