nvidia-docker環境更新

nvidia-dockerの環境が立ち上がらなくなってしまったので、更新した際のメモです。

# 行ったこと
[こちらの記事](https://qiita.com/ksasaki/items/b20a785e1a0f610efa08)を参考に、「Docker 19.03 以降の環境で前だけを見て生きる場合」にしたがって以下の手順ですすめます。
1.  最新の NVIDIA ドライバーをインストール
2.  Docker の最新バージョン (19.03) をインストール 
3.  nvidia-container-toolkit パッケージをインストール

### 環境

```souece:OS
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
```
```souece:GPU(更新前)
$ lspci -vv|grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1) (prog-if 00 [VGA controller])
	Kernel driver in use: nvidia
	Kernel modules: nvidiafb, nouveau, nvidia_396, nvidia_396_drm
01:00.1 Audio device: NVIDIA Corporation GP102 HDMI Audio Controller (rev a1)
```

# 1.  最新の NVIDIA ドライバーをインストール
おすすめの「cuda-driversパッケージを使う」方法に従う。

```souece:手順
$wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin
$sudo mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600
$sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/ /"
$sudo apt-get update
$sudo apt-get -y install cuda-drivers
```
但し、3行目のkeyの取得のところで以下のエラーがでたため、[以下のサイト](https://daichan.club/docker/78480)を参考に処理を追加。

```souece:ERROR1
$sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
Executing: /tmp/tmp.AxRPl9JGE0/gpg.1.sh --fetch-keys
https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
gpgkeys: protocol `https' not supported
gpg: 鍵サーバ・スキーム「https」用のハンドラがありません
gpg: *警告*: URI https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub からデータを取れません: 鍵サーバのエラー
```
```souece:OK
$sudo apt-get install gnupg-curl
$sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos
Executing: /tmp/tmp.kbe6EjNXFn/gpg.1.sh --fetch-keys
https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
gpg: 鍵7FA2AF80:"cudatools <cudatools@nvidia.com>"変更なし
gpg: 処理数の合計: 1
gpg:              変更なし: 1
```
さらに、5行目のupdateのところでも、公開鍵が利用できないというエラーが出たため、[こちらの記事](https://qiita.com/ReoNagai/items/777885f8e704028f3ab9)などを参考に処理を追加。

```souece:ERROR2
$sudo apt-get update
エラー:13 https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64  InRelease
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 6ED91CA3AC1160CD
```
```souece:OK
$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [エラーとして表示された鍵(NO_PUBKEYの後)]
例)$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6ED91CA3AC1160CD
```

# 2.  Docker の最新バージョン (19.03) をインストール 
[こちらの公式サイト](https://docs.docker.com/engine/install/ubuntu/)にしたがってインストールします。前提条件を確認した上で、古いdockerをアンインストールします。以下のようなメッセージがでたので、autoremoveによりアンインストールを行いました。

```souece:uninstall
$sudo apt-get remove docker docker-engine docker.io containerd runc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
パッケージ 'docker-engine' はインストールされていないため削除もされません
パッケージ 'docker' はインストールされていないため削除もされません
パッケージ 'containerd' はインストールされていないため削除もされません
パッケージ 'docker.io' はインストールされていないため削除もされません
パッケージ 'runc' はインストールされていないため削除もされません
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  containerd.io docker-ce docker-ce-cli libnvidia-container-tools libnvidia-container1 libvdpau-dev linux-headers-4.15.0-38
  linux-headers-4.15.0-38-generic linux-image-4.15.0-38-generic linux-modules-4.15.0-38-generic
  linux-modules-extra-4.15.0-38-generic
これを削除するには 'sudo apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 367 個。
$sudo apt autoremove
```
次に、dockerのインストールには以下の3種類の方法があるそうですが、その中で1のリポジトリによる方法を選択しました。それ以外の方法については、上記の公式サイトに記載があります。
　・リポジトリを用いる方法
　・手動による方法
　・スクリプトを用いる方法。

### リポジトリを用いたインストール
####2.1 aptがHTTPSを通じてリポジトリを使えるようにする。

```souece:
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
```
####2.2 dockerの公式鍵を追加して、確認する。

```souece:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
pub   4096R/0EBFCD88 2017-02-22
      フィンガー・プリント = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
```
####2.3 stableなリポジトリを設定し、公式リポジトリとして　etc/apt/sources.list　に登録されていることを確認する。

```souece:
$sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
(確認)$grep download.docker.com /etc/apt/sources.list
```
####2.4 dockerのインストール
```souece:
$sudo apt-get update
$sudo apt-get install docker-ce docker-ce-cli containerd.io
```

####2.5 インストールの確認
```souece:
$sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:***
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
...(省略)...........
```

# 3.  nvidia-container-toolkit パッケージをインストール
[こちらのquickstart](https://github.com/NVIDIA/nvidia-docker/tree/master#quickstart)に基づき、toolkitをインストールする.
####3.1 公式鍵の追加。
```souece:
$distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
```
####3.2 リポジトリの追加。
```souece:
$curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/$(ARCH) /
```
####3.3 インストール
```souece:
$sudo apt-get update 
$sudo apt-get install -y nvidia-container-toolkit
$sudo systemctl restart docker
$sudo reboot
```
####3.4 インストールの確認
```souece:
$docker run --gpus all nvidia/cuda nvidia-smi
Thu Apr  9 07:15:13 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64.00    Driver Version: 440.64.00    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 108...  Off  | 00000000:01:00.0  On |                  N/A |
| 33%   44C    P8    11W / 250W |    402MiB / 11175MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```
# 4.  これまで使っていたイメージの起動
```souece:
$docker images
REPOSITORY                    TAG                            IMAGE ID            CREATED             SIZE
nvcr.io/nvidia/tensorflow     19.12-tf1-py3                  af027926c1a0        3 months ago        8.32GB
nvcr.io/nvidia/tensorflow     18.06-py3                      0d13c9061269        22 months ago       3.4GB
```
これまで使っていたimageは、--runtime=nvidia の部分を　--gpus all に変更するだけで、問題なく立ち上がりました。

```souece:
$ docker run --gpus all -it --rm nvcr.io/nvidia/tensorflow:18.06-py3                                                                                                                                                
================
== TensorFlow ==
================

NVIDIA Release 18.06 (build 512350)

Container image Copyright (c) 2018, NVIDIA CORPORATION.  All rights reserved.
Copyright 2017 The TensorFlow Authors.  All rights reserved.

Various files include modifications (c) NVIDIA CORPORATION.  All rights reserved.
NVIDIA modifications are covered by the license terms that apply to the underlying project or file.

NOTE: The SHMEM allocation limit is set to the default of 64MB.  This may be
   insufficient for TensorFlow.  NVIDIA recommends the use of the following flags:
   nvidia-docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 ...
```