NVIDIA GPU + Docker + TensorFlow 導入

はじめに

TensorFlow 2.0 Alpha のプレビューが始まった.

www.tensorflow.org

TensorFlow も CUDA も使ってみたかったので,この機会にちょっと触ってみる.

母艦をできるだけ汚したくないのでDockerで動かす.

TensorFlowの導入手順をベースにしつつ,適宜寄り道しながら進める.

www.tensorflow.org

docs.docker.com

github.com

環境準備

nvidia-dockerの手順によると必要なものはこれ.

  1. GNU/Linux x86_64 with kernel version > 3.10
  2. Docker >= 1.12
  3. NVIDIA GPU with Architecture > Fermi (2.1)
  4. NVIDIA drivers ~= 361.93 (untested on older versions)

確認しみると

$ uname -r
3.10.0-957.5.1.el7.x86_64
  • Docker
    • yum でインストールしたままでOK ではない...ので入れ直し...
$ docker -v
Docker version 1.13.1, build 07f3374/1.13.1
$ nvidia-smi 
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.93       Driver Version: 410.93       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| 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 106...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   47C    P5     9W / 120W |    797MiB /  6075MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      5342      G   /usr/lib64/firefox/firefox                     1MiB |
|    0      8874      G   /usr/bin/nvidia-settings                       1MiB |
|    0     15494      G   /usr/bin/X                                   504MiB |
|    0     16250      G   cinnamon                                     126MiB |
|    0     25161      G   ...uest-channel-token=17082780505565724006   160MiB |
+-----------------------------------------------------------------------------+

Docker 導入

単にyumからインストールしたDockerは古くて使えない.Dockerの手順にならいインストールし直す.

古いDocker削除

$ yum list installed | grep -i docker
docker.x86_64                           2:1.13.1-91.git07f3374.el7.centos
docker-client.x86_64                    2:1.13.1-91.git07f3374.el7.centos
docker-common.x86_64                    2:1.13.1-91.git07f3374.el7.centos
$ sudo yum remove docker docker-client docker-common

リポジトリ設定

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ yum check-update

インストール

$ sudo yum -y install docker-ce
$ docker -v
Docker version 18.09.3, build 774a1f4

かなりバージョンが上がりました.

nvidia-docker2 導入

リポジトリ設定

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
$ sudo yum check-update

インストール

$ sudo yum -y install nvidia-docker2
$ sudo systemctl enable docker.service 
$ sudo systemctl start docker.service 

インストールついでにDockerを動かしておく.

TensorFlow 導入

TensorFlow Docker image ダウンロード

$ sudo docker pull tensorflow/tensorflow
$ sudo docker pull tensorflow/tensorflow:latest-gpu
$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
tensorflow/tensorflow   latest-gpu          d786239380f8        5 days ago          3.37GB
tensorflow/tensorflow   latest              2ebc856b5e27        5 days ago          1.04GB

イメージがでかい.

コンテナ化

$ sudo docker run --runtime=nvidia -it tensorflow/tensorflow:latest-gpu bash

________                               _______________                
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ / 
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...

root@f2097cd19609:/# 
root@f2097cd19609:/# pip list
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Package              Version             
-------------------- --------------------
absl-py              0.7.0               
astor                0.7.1               
backports.weakref    1.0.post1           
enum34               1.1.6               
funcsigs             1.0.2               
futures              3.2.0               
gast                 0.2.2               
google-pasta         0.1.4               
grpcio               1.19.0              
h5py                 2.9.0               
Keras-Applications   1.0.7               
Keras-Preprocessing  1.0.9               
Markdown             3.0.1               
mock                 2.0.0               
numpy                1.16.2              
pbr                  5.1.3               
pip                  19.0.3              
protobuf             3.7.0               
setuptools           40.8.0              
six                  1.12.0              
tb-nightly           1.14.0a20190301     
tensorflow-gpu       2.0.0a0             
termcolor            1.1.0               
tf-estimator-nightly 1.14.0.dev2019030115
Werkzeug             0.14.1              
wheel                0.29.0    
root@f2097cd19609:/# pip show tensorflow-gpu
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Name: tensorflow-gpu
Version: 2.0.0a0
Summary: TensorFlow is an open source machine learning framework for everyone.
Home-page: https://www.tensorflow.org/
Author: Google Inc.
Author-email: packages@tensorflow.org
License: Apache 2.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: google-pasta, enum34, protobuf, keras-preprocessing, gast, astor, absl-py, six, wheel, numpy, termcolor, tb-nightly, tf-estimator-nightly, backports.weakref, grpcio, mock, keras-applications
Required-by: 
root@f2097cd19609:/# nvidia-smi 
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.93       Driver Version: 410.93       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| 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 106...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   50C    P8     9W / 120W |    474MiB /  6075MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

とりあえず TensorFlow GPU image をコンテナ化して入ってみた.

おわりに

とりあえず環境は整ったので今回はここまで.

ついで(?)にはてなCSSを変更して,結構大きめのディスプレイ幅で表示できるようにした.

ちなみに

$ sudo yum install nvidia-docker2
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ nvidia-docker2.noarch 0:2.0.3-1.docker18.09.3.ce を インストール
--> 依存性の処理をしています: nvidia-container-runtime = 2.0.0-1.docker18.09.3 のパッケージ: nvidia-docker2-2.0.3-1.docker18.09.3.ce.noarch
--> 依存性の処理をしています: docker-ce = 3:18.09.3 のパッケージ: nvidia-docker2-2.0.3-1.docker18.09.3.ce.noarch
--> トランザクションの確認を実行しています。
---> パッケージ nvidia-container-runtime.x86_64 0:2.0.0-1.docker18.09.3 を インストール
--> 依存性の処理をしています: nvidia-container-runtime-hook < 2.0.0 のパッケージ: nvidia-container-runtime-2.0.0-1.docker18.09.3.x86_64
---> パッケージ nvidia-docker2.noarch 0:2.0.3-1.docker18.09.3.ce を インストール
--> 依存性の処理をしています: docker-ce = 3:18.09.3 のパッケージ: nvidia-docker2-2.0.3-1.docker18.09.3.ce.noarch
--> トランザクションの確認を実行しています。
---> パッケージ nvidia-container-runtime-hook.x86_64 0:1.4.0-2 を インストール
--> 依存性の処理をしています: libnvidia-container-tools < 2.0.0 のパッケージ: nvidia-container-runtime-hook-1.4.0-2.x86_64
--> 依存性の処理をしています: libnvidia-container-tools >= 0.1.0 のパッケージ: nvidia-container-runtime-hook-1.4.0-2.x86_64
---> パッケージ nvidia-docker2.noarch 0:2.0.3-1.docker18.09.3.ce を インストール
--> 依存性の処理をしています: docker-ce = 3:18.09.3 のパッケージ: nvidia-docker2-2.0.3-1.docker18.09.3.ce.noarch
--> トランザクションの確認を実行しています。
---> パッケージ libnvidia-container-tools.x86_64 0:1.0.1-1 を インストール
--> 依存性の処理をしています: libnvidia-container1(x86-64) >= 1.0.1-1 のパッケージ: libnvidia-container-tools-1.0.1-1.x86_64
--> 依存性の処理をしています: libnvidia-container.so.1(NVC_1.0)(64bit) のパッケージ: libnvidia-container-tools-1.0.1-1.x86_64
--> 依存性の処理をしています: libnvidia-container.so.1()(64bit) のパッケージ: libnvidia-container-tools-1.0.1-1.x86_64
---> パッケージ nvidia-docker2.noarch 0:2.0.3-1.docker18.09.3.ce を インストール
--> 依存性の処理をしています: docker-ce = 3:18.09.3 のパッケージ: nvidia-docker2-2.0.3-1.docker18.09.3.ce.noarch
--> トランザクションの確認を実行しています。
---> パッケージ libnvidia-container1.x86_64 0:1.0.1-1 を インストール
---> パッケージ nvidia-docker2.noarch 0:2.0.3-1.docker18.09.3.ce を インストール
--> 依存性の処理をしています: docker-ce = 3:18.09.3 のパッケージ: nvidia-docker2-2.0.3-1.docker18.09.3.ce.noarch
--> 依存性解決を終了しました。
エラー: パッケージ: nvidia-docker2-2.0.3-1.docker18.09.3.ce.noarch (nvidia-docker)
             要求: docker-ce = 3:18.09.3
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

CentOS7のリポジトリからインストールしたDockerだと,nvidia-docker2のインストールで怒られる.