ディープラーニングおよびマイニングを行うためにNvidia-Dockerの導入を行います。

対象環境は構築したGeforce 1070を搭載したLinuxマシン(Debian Stretch 9.3.0)となります。

前回でdockerの導入が完了したので、本記事ではNvidia-Dockerのインストールを行います。

前回の続きです。

Nvidia-Dockerの導入

基本的に公式の手順に従います。

Docker導入時にすべての要件確認済みなので、ここはこのまま進めます。 前回に導入したdocker-ceではstableで動作すると書かれているので問題なさそうです。

リポジトリの追加

Docker-CEと同様、リポジトリを追加してインストールを行います。 Debianにおけるリポジトリの追加手順は次の公式ページに記載されています。

上記にて利用環境のStretch x86_64が記載されているので、記載された手順に従ってリポジトリの追加を行います。

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/debian9/amd64/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update

インストール

追加したリポジトリからapt installでインストールを行います。

$ sudo apt install nvidia-docker2
$ sudo pkill -SIGHUP dockerd

現行バージョンは2.0.1+docker17.09.1-1でした。

動作確認

Nvidia-Dockerの動作確認を行います。

$ sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

この際、nvidia/cudaのイメージDLに時間がかります。

動作確認時のエラー

先述のコマンドで正常に起動せず、エラーが出力されたので確認していきます。

$ sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
container_linux.go:265: starting container process caused "process_linux.go:368: container init caused \"process_linux.go:351: running prestart hook 1 caused \\\"error running hook: exit status 1, stdout: , stderr: exec command: [/usr/bin/nvidia-container-cli --load-kmods configure --ldconfig=@/sbin/ldconfig --device=all --compute --utility --require=cuda>=9.0 --pid=8564 /var/lib/docker/overlay2/b8eac5eb54a4d2465dcc4dbfce55d441925b002edd1d071e5fbb68b09c05ecba/merged]\\\\nnvidia-container-cli: initialization error: load library failed: libcuda.so.1: cannot open shared object file: no such file or directory\\\\n\\\"\""
docker: Error response from daemon: oci runtime error: container_linux.go:265: starting container process caused "process_linux.go:368: container init caused \"process_linux.go:351: running prestart hook 1 caused \\\"error running hook: exit status 1, stdout: , stderr: exec command: [/usr/bin/nvidia-container-cli --load-kmods configure --ldconfig=@/sbin/ldconfig --device=all --compute --utility --require=cuda>=9.0 --pid=8564 /var/lib/docker/overlay2/b8eac5eb54a4d2465dcc4dbfce55d441925b002edd1d071e5fbb68b09c05ecba/merged]\\\\nnvidia-container-cli: initialization error: load library failed: libcuda.so.1: cannot open shared object file: no such file or directory\\\\n\\\"\"".

これと同様のエラーが出ている書き込みを発見しました。

nvidia-container-cliの実行において、libcudaがないと怒られている模様です。 私の認識ではNvidia-Dockerではホストにcuda入れる必要がなく、要件になかったとみなしていたのですが、どうやら覚え違いをしていたようです。

$ nvidia-container-cli --debug=/dev/stdout list --compute

-- WARNING, the following logs are for debugging purposes only --

I1216 08:56:41.220479 11761 nvc.c:250] initializing library context (version=1.0.0, build=ec15c7233bd2de821ad5127cb0de6b52d9d2083c)
I1216 08:56:41.220592 11761 nvc.c:225] using ldcache /etc/ld.so.cache
I1216 08:56:41.220611 11761 nvc.c:226] using unprivileged user 1000:1000
nvidia-container-cli: initialization error: load library failed: libcuda.so.1: cannot open shared object file: no such file or directory

ldconfigでcuda関連のライブラリを確認します。

$ sudo ldconfig -p | grep cuda
        libicudata.so.57 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libicudata.so.57

本来はlibcuda.so, libcuda.so.1が表示されなければいけないのですが、上記では表示されていません。

改めて、cudaのインストール状況を確認します。

$ apt search libcuda

結果、libcuda1とlibcudart8.0が表示されましたが、両方とも未インストールでした。これが原因でしょう。

libcudaはlibcuda Driver libraryで、CUDA5~8系を含み、libcudart8.0はCUDA Runtime API等を含んでいるようです。ユーザー登録必要なCudaToolkitはnvidia-dockerに不要でも、これらは必要ということでした。

とにかくインストールします。

$ sudo apt install libcuda1 libcudart8.0

CUDAのバージョン指定

上記のインストール後に再度dockerを走らせてみましたが、再びエラーが出てしまいました。先ほどとは内容が変わっています。

$ sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
container_linux.go:265: starting container process caused "process_linux.go:368: container init caused \"process_linux.go:351: running prestart hook 1 caused \\\"error running hook: exit status 1, stdout: , stderr: exec command: [/usr/bin/nvidia-container-cli --load-kmods configure --ldconfig=@/sbin/ldconfig --device=all --compute --utility --require=cuda>=9.0 --pid=24127 /var/lib/docker/overlay2/9354f94e25fb0f91fdd423858486bbc261be8a2dc1d30f2989283b4f88b9852d/merged]\\\\nnvidia-container-cli: requirement error: unsatisfied condition: cuda >= 9.0\\\\n\\\"\""
docker: Error response from daemon: oci runtime error: container_linux.go:265: starting container process caused "process_linux.go:368: container init caused \"process_linux.go:351: running prestart hook 1 caused \\\"error running hook: exit status 1, stdout: , stderr: exec command: [/usr/bin/nvidia-container-cli --load-kmods configure --ldconfig=@/sbin/ldconfig --device=all --compute --utility --require=cuda>=9.0 --pid=24127 /var/lib/docker/overlay2/9354f94e25fb0f91fdd423858486bbc261be8a2dc1d30f2989283b4f88b9852d/merged]\\\\nnvidia-container-cli: requirement error: unsatisfied condition: cuda >= 9.0\\\\n\\\"\"".

今度はcuda9.0が必要とのことです。libcudaが8.0までしかサポートしていなかったことが原因なのでしょう。 どうも下記の記事を見ていると、nvidia/cudaのデフォルトイメージがCUDA9.0になっているみたいです。

下記のようにCUDAのバージョンを指定してやれば、CUDA8.0で起動できます。

$ sudo docker run --runtime=nvidia --rm nvidia/cuda:8.0-runtime nvidia-smi

あらためてCUDA8.0を指定して実行してみます。

$ sudo docker run --runtime=nvidia --rm nvidia/cuda:8.0-runtime nvidia-smi
Sat Dec 16 xx:xx:xx 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.82                 Driver Version: 375.82                    |
|-------------------------------+----------------------+----------------------+
| 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 1070    Off  | 0000:01:00.0     Off |                  N/A |
|  0%   34C    P8    13W / 185W |     23MiB /  8113MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

正常な稼働が確認できました。

途中トラブルはありましたが、Nvidia-Dockerの導入が完了しました。

まとめ

今回のインストールにおいて次の内容が判明しました。 同様のインストールを行う際は注意してください。

  • nvidia-dockerではlibcudaのインストールが必要
  • デフォルトでCUDA9.0を使う
    • ライブラリのバージョン次第では8.0を指定するが必要ある
    • その際に指定できるタグはdocker-hubを参照

今後

今回導入したNvidia-Docker上の環境でディープラーニングやマイニングなどを行っていきます。

ですがその前に、両者は長時間運用するものになると思われるため、Linuxマシンの負荷や温度などの監視を行い、通知を行えるように設定します。