TensorFlow(GPU版)/KerasのインストールからHello World [Ubuntu/Dockerコンテナ]
前提条件
ディープラーニングの事実上の標準OSである「Ubuntu16.04」にDocker/nvidia-docker2で「TensorFlow専用のコンテナ(環境)」を作成してAnacondaをインストールしている状態にします。
お済ではない方はDocker/nvidia-docker2のコンテナ上にAnacondaをインストールするを先にご覧ください。
ホストOSとコンテナの「共有フォルダ」は次のようにします。
/home/ユーザー名/tensor
[コンテナ側]
/foo
TensorFlowの必要環境
現時点で最新版のTensorFlow1.9.0(GPU版)の必要環境。
種類 | 備考 |
---|---|
CUDA Toolkit 9.0 (開発環境) | 前提条件で準備済み。 |
cuDNN v7.0 (ディープラーニング用ライブラリ) | 前提条件で準備済み。 |
NVIDIA CUDA Profile Tools Interface (libcupti-devライブラリ) | 今回インストールします。 |
※詳細は公式をご覧ください。
1. NVIDIA CUDA Profiling Tools Interface(libcupti-devライブラリ)のインストール
コンテナ上にlibcupti-devライブラリをインストールします。
apt -y install libcupti-dev
2. TensorFlowのインストール
コンテナ上に最新版のTensorFlowをインストールします。
pip install --upgrade tensorflow-gpu
次はバージョンを指定する場合。(Python 3.6/TensorFlow_GPU 1.9.0)
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.9.0-cp36-cp36m-linux_x86_64.whl
※詳細は公式を参照してください。
3. cuDNNのダウングレード
コンテナ上で「apt -y upgrade」を実行した方は、2018/7/17時点ではcuDNNが7.0から7.1になるので、7.0系に下げます。
※upgradeコマンドを未実行の方はこの章は飛ばしてください。
apt-get install --allow-downgrades libcudnn7=7.0.5.15-1+cuda9.0
このダウングレードを行わないと、後述する「mnist_cnn.py」のテストで次のようなエラーが発生します。
ツール | |
---|---|
Jupyter Notebook | The kernel appears to have died. It will restart automatically. (カーネルが死亡したようです。 自動的に再起動します。) |
pythonコマンド | E tensorflow/stream_executor/cuda/cuda_dnn.cc:332] could not create cudnn handle: CUDNN_STATUS_NOT_INITIALIZED (cudnnハンドルが作れないよ。) |
E tensorflow/stream_executor/cuda/cuda_dnn.cc:340] possibly insufficient driver version: 390.67.0 (恐らくドライバのバージョンが不十分だよ。) |
4.Kerasのインストール
pip install keras
5. TensorFlowのテスト
5-1. Hello World
import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello)) sess.close()
5-2. 行列演算(加算)
次の行列演算をTensorFlowで実行します。
import tensorflow as tf import numpy as np with tf.Session(): input1 = tf.constant(1.0, shape=[2, 3]) input2 = tf.constant(np.reshape(np.arange(1.0, 7.0, dtype=np.float32), (2, 3))) output = tf.add(input1, input2) result = output.eval() result
※GoogleのColaboratoryのコードです。
5-3. バージョンの確認
import tensorflow as tf print(tf.__version__)
5-4. その他(コマンド)
TensorFlowのインストール場所を確認できます。(コンテナのターミナル用)
pip show tensorflow-gpu
6. KerasとGPUのテスト
Kerasのexamplesのmnist_cnn.pyを使用してGPUをテストします。
6.1 Jupyter Notebook版
Jupyter Notebookにmnist_cnn.pyのコードをコピペします。その後、処理時間を計測する為に先頭行に
%%time
を追記して実行してください。
[実行結果]
x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples Train on 60000 samples, validate on 10000 samples Epoch 1/12 60000/60000 [==============================] - 4s 67us/step - loss: 0.2725 - acc: 0.9163 - val_loss: 0.0603 - val_acc: 0.9803 Epoch 2/12 60000/d0000 [==============================] - 3s 57us/step - loss: 0.0883 - acc: 0.9737 - val_loss: 0.0404 - val_acc: 0.9868 Epoch 3/12 60000/60000 [==============================] - 3s 51us/step - loss: 0.0674 - acc: 0.9797 - val_loss: 0.0369 - val_acc: 0.9881 Epoch 4/12 60000/60000 [==============================] - 3s 54us/step - loss: 0.0567 - acc: 0.9835 - val_loss: 0.0319 - val_acc: 0.9893 Epoch 5/12 60000/60000 [==============================] - 3s 55us/step - loss: 0.0478 - acc: 0.9856 - val_loss: 0.0317 - val_acc: 0.9895 Epoch 6/12 60000/60000 [==============================] - 3s 56us/step - loss: 0.0421 - acc: 0.9869 - val_loss: 0.0290 - val_acc: 0.9900 Epoch 7/12 60000/60000 [==============================] - 3s 55us/step - loss: 0.0386 - acc: 0.9881 - val_loss: 0.0304 - val_acc: 0.9901 Epoch 8/12 60000/60000 [==============================] - 4s 60us/step - loss: 0.0347 - acc: 0.9890 - val_loss: 0.0293 - val_acc: 0.9907 Epoch 9/12 60000/60000 [==============================] - 3s 54us/step - loss: 0.0315 - acc: 0.9904 - val_loss: 0.0270 - val_acc: 0.9919 Epoch 10/12 60000/60000 [==============================] - 3s 57us/step - loss: 0.0325 - acc: 0.9901 - val_loss: 0.0274 - val_acc: 0.9917 Epoch 11/12 60000/60000 [==============================] - 3s 54us/step - loss: 0.0296 - acc: 0.9910 - val_loss: 0.0257 - val_acc: 0.9918 Epoch 12/12 60000/60000 [==============================] - 3s 53us/step - loss: 0.0284 - acc: 0.9915 - val_loss: 0.0248 - val_acc: 0.9920 Test loss: 0.024774683424527395 Test accuracy: 0.992 CPU times: user 52.7 s, sys: 7.9 s, total: 1min Wall time: 41.7 s
このmnist_cnn.pyはCPUでは20分ぐらいの処理時間がかかるそうです。今回はGPUを使用しているので1分で処理が完了しています。
6.2 pythonコマンド版
今度はコンテナ上のターミナルで実行してみます。
mnist_cnn.pyのファイルを作成してコンテナの「/foo」(ホストOS上では/home/ユーザー名/tensor)に移動します。
次のコマンドを実行します。
time python /foo/mnist_cnn.py
[実行結果]
root@xxx:/# time python /foo/mnist_cnn.py ... 省略 ... Test loss: 0.026504793879033785 Test accuracy: 0.9917 real 0m44.962s user 0m58.252s sys 0m9.216s
処理中のGPUの最大温度は57度でした。(2回連続実行)
※私のGPUは60度を超えないとファンが回転しない仕様です。
2018/7/22 追記
素のTensorFlowで同様のテストを行いたい方は「TensorFlowではじめる DeepLearning実装入門」の本に掲載されている「畳み込みニューラルネットワーク」(CNN)を使用したmnist.pyを試すと良いです。
関連記事
前の記事: | Jupyter Notebookでプログラムのコード補完、入力補助 [Python] |
次の記事: | TensorBoardとJupyter Notebookを同時に起動する[Docker/nvidia-docker2] |