Debian 9.3 Nvidia-Dockerの導入 (Nvidia-Docker環境構築 3)
当サイトではアフィリエイト広告を利用しています
ディープラーニングおよびマイニングを行うために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マシンの負荷や温度などの監視を行い、通知を行えるように設定します。