深層学習用の環境セットアップ(ノートブックGPU内蔵用)
システム構成
GPUをうまく生かしたDL環境を次のシステム上に設定する。
- DELL notebook Precision 7730
深層学習用のソフト設定
- NVIDIA Quadro P4200を活用できるように、tensorflow-GPUをインストールする。
- Linux用にはDockerが使えるようだが、今回はWindowsの直下にインストールする形にする。
- ホスト側にうまくCUDAがインストーされていれば、Docker環境もできるはず。後ほどそれも設定したい。
- Anacondaの仮想環境を用いて、まずは色々な組み合わせで試す形にする。
Anacondaのインストール
- Anaconda 2019.03 for Windows Installer(Python3.7の64b)を選択してインストールする。 www.anaconda.com
- 実際の手順は以下のWEBを参照されたし。 weblabo.oscasierra.net
CUDAのインストール
- 使用するTensorflowのバージョンによって、適切なCUDAのバージョンを選択する必要がある。
TensorFlow 2.0 Alpha版があるようだが、今回は安定版にする。インストール後確認したら、1.13.1バージョンであった。 www.tensorflow.org
CUDAは最新版10.1があるは、正式サポートされているCUDA10.0をインストールする。
- CUDA10.0をインストールすると、一緒にGraphicドライバーもアップグレードされ、DPディジーチェーンでの外部ディスプレイ表示が動作しなくなった。 developer.nvidia.com
- 最新の安定版のP4200用Graphicドライバーをインストールして、この問題を解決した。 www.nvidia.co.jp
- 設定されたリビジョンは、R430 U3になる。
- cuDNNライブラリをインストールする。ダウンロードするために、ユーザ登録が必要になる。
- 今回はCUDA10.0用ということで、cuDNN v7.6.0をダウンロードする。 developer.nvidia.com
- 解凍後どこか適切な場所において、パス変数でその場所を含める方法もあるが、今回は解凍データを次のフォルダーに直接コピーした。
Visual Studio Codeインストール
- Pythonコードのエディター用にセットする。MicrosoftがPythonモードを用意しているので、便利。
- 今回はVersion 1.34をインストールした。 code.visualstudio.com
TesorFlow、kerasのセットアップ
- これからのセットアップ、サンプルプログラムの実行は、以下のブログをありがたく参考させて頂きました。 kazusa-pg.com
- アナコンダの仮想環境を利用して設定している。Anaconda Powershell Promptプログラムを起動して、以下のコマンドを実行。
> conda create -n keras-DL python=3.6 > activate keras-DL > pip install tensorflow-gpu > pip install keras
- 次にインストールされたtensorflow-gpuのバージョンを確認。
> python -c "import tensorflow as tf; print(tf.__version__)" 1.13.1
from tensorflow.python.client import device_lib device_lib.list_local_devices()
- 出力結果は、以下のようになり、設定は完了。
2019-05-31 12:53:46.362514: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 2019-05-31 12:53:46.595875: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties: name: Quadro P4200 major: 6 minor: 1 memoryClockRate(GHz): 1.594 pciBusID: 0000:01:00.0 totalMemory: 8.00GiB freeMemory: 6.62GiB 2019-05-31 12:53:46.600019: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0 2019-05-31 12:53:47.093210: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-05-31 12:53:47.096036: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0 2019-05-31 12:53:47.097725: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0: N 2019-05-31 12:53:47.099432: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/device:GPU:0 with 6372 MB memory) -> physical GPU (device: 0, name: Quadro P4200, pci bus id: 0000:01:00.0, compute capability: 6.1)
- どういったパッケージがインストールされているか、次のコマンドで確認できる。
> conda list WARNING: The conda.compat module is deprecated and will be removed in a future release. # packages in environment at C:\Users\nikonikoten\Anaconda3\envs\keras-deeplearning: # # Name Version Build Channel absl-py 0.7.1 pypi_0 pypi astor 0.8.0 pypi_0 pypi certifi 2019.3.9 py36_0 gast 0.2.2 pypi_0 pypi grpcio 1.21.1 pypi_0 pypi h5py 2.9.0 pypi_0 pypi keras 2.2.4 pypi_0 pypi keras-applications 1.0.7 pypi_0 pypi keras-preprocessing 1.0.9 pypi_0 pypi markdown 3.1.1 pypi_0 pypi mock 3.0.5 pypi_0 pypi numpy 1.16.4 pypi_0 pypi pip 19.1.1 py36_0 protobuf 3.8.0 pypi_0 pypi python 3.6.8 h9f7ef89_7 pyyaml 5.1 pypi_0 pypi scipy 1.3.0 pypi_0 pypi setuptools 41.0.1 py36_0 six 1.12.0 pypi_0 pypi sqlite 3.28.0 he774522_0 tensorboard 1.13.1 pypi_0 pypi tensorflow-estimator 1.13.0 pypi_0 pypi tensorflow-gpu 1.13.1 pypi_0 pypi termcolor 1.1.0 pypi_0 pypi vc 14.1 h0510ff6_4 vs2015_runtime 14.15.26706 h3a45250_4 werkzeug 0.15.4 pypi_0 pypi wheel 0.33.4 py36_0 wincertstore 0.2 py36h7fe50ca_0
- 次のコマンドで、設定した仮想環境をリストアップできる。
- 後でCPUのみ環境も設定して、実行時間を比較してみる。これがAnaconda仮想環境の強み。
> conda info -e WARNING: The conda.compat module is deprecated and will be removed in a future release. # conda environments: # base C:\Users\nikonikoten\Anaconda3 keras-DL C:\Users\nikonikoten\Anaconda3\envs\keras-DL keras-cpu-test C:\Users\nikonikoten\Anaconda3\envs\keras-cpu-test
- 環境の切り替えは、次のコマンドで可能。
> conda deactivate > conda activate XXXX
サンプルプログラムで設定環境の検証
- 次のコードMNISTをkerasで動作させる。
'''Trains a simple convnet on the MNIST dataset. Gets to 99.25% test accuracy after 12 epochs (there is still a lot of margin for parameter tuning). 16 seconds per epoch on a GRID K520 GPU. ''' from __future__ import print_function import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K batch_size = 128 num_classes = 10 epochs = 12 # input image dimensions img_rows, img_cols = 28, 28 # the data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1])
- 最初の起動では、MNISTデータをダウンロードするので、計算以外の時間が含まれる。
- 2回以降は、純粋なGPU実行。実行時間は1分強、精度は99.12%を達成した。
- 細かいところWARNINGが出ていますが、設定環境の検証としてはうまくいった。
Using TensorFlow backend. x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples WARNING:tensorflow:From C:\Users\nikonioten\Anaconda3\envs\keras-deeplearning\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version. Instructions for updating: Colocations handled automatically by placer. WARNING:tensorflow:From C:\Users\nikonikoten\Anaconda3\envs\keras-deeplearning\lib\site-packages\keras\backend\tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version. Instructions for updating: Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`. WARNING:tensorflow:From C:\Users\nikonikoten\Anaconda3\envs\keras-deeplearning\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version. Instructions for updating: Use tf.cast instead. Train on 60000 samples, validate on 10000 samples Epoch 1/12 2019-05-31 13:38:36.955245: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 2019-05-31 13:38:37.183766: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties: name: Quadro P4200 major: 6 minor: 1 memoryClockRate(GHz): 1.594 pciBusID: 0000:01:00.0 totalMemory: 8.00GiB freeMemory: 6.62GiB 2019-05-31 13:38:37.190059: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0 2019-05-31 13:38:37.673832: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-05-31 13:38:37.677569: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0 2019-05-31 13:38:37.679830: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0: N 2019-05-31 13:38:37.682092: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6372 MB memory) -> physical GPU (device: 0, name: Quadro P4200, pci bus id: 0000:01:00.0, compute capability: 6.1) 2019-05-31 13:38:38.282462: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library cublas64_100.dll locally 60000/60000 [==============================] - 8s 129us/step - loss: 0.2624 - acc: 0.9202 - val_loss: 0.0655 - val_acc: 0.9785 Epoch 2/12 60000/60000 [==============================] - 5s 87us/step - loss: 0.0853 - acc: 0.9750 - val_loss: 0.0393 - val_acc: 0.9874 Epoch 3/12 60000/60000 [==============================] - 5s 89us/step - loss: 0.0633 - acc: 0.9814 - val_loss: 0.0352 - val_acc: 0.9883 Epoch 4/12 60000/60000 [==============================] - 5s 87us/step - loss: 0.0535 - acc: 0.9840 - val_loss: 0.0307 - val_acc: 0.9887 Epoch 5/12 60000/60000 [==============================] - 5s 87us/step - loss: 0.0453 - acc: 0.9862 - val_loss: 0.0297 - val_acc: 0.9891 Epoch 6/12 60000/60000 [==============================] - 5s 87us/step - loss: 0.0417 - acc: 0.9878 - val_loss: 0.0261 - val_acc: 0.9919 Epoch 7/12 60000/60000 [==============================] - 5s 88us/step - loss: 0.0381 - acc: 0.9884 - val_loss: 0.0296 - val_acc: 0.9893 Epoch 8/12 60000/60000 [==============================] - 5s 88us/step - loss: 0.0342 - acc: 0.9895 - val_loss: 0.0286 - val_acc: 0.9902 Epoch 9/12 60000/60000 [==============================] - 5s 87us/step - loss: 0.0297 - acc: 0.9909 - val_loss: 0.0286 - val_acc: 0.9912 Epoch 10/12 60000/60000 [==============================] - 5s 88us/step - loss: 0.0292 - acc: 0.9911 - val_loss: 0.0296 - val_acc: 0.9907 Epoch 11/12 60000/60000 [==============================] - 5s 87us/step - loss: 0.0279 - acc: 0.9911 - val_loss: 0.0286 - val_acc: 0.9907 Epoch 12/12 60000/60000 [==============================] - 5s 87us/step - loss: 0.0255 - acc: 0.9917 - val_loss: 0.0287 - val_acc: 0.9912 Test loss: 0.02871448308277877 Test accuracy: 0.9912
- CPUのみでの実行時間を検証してみよう。Anacondaの仮想環境を設定する。
> conda create -n keras-cpu-test python=3.6 > activate keras-cpu-test > pip install tensorflow > pip install keras
- 実行時間は13分程度ですね。
Using TensorFlow backend. x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples WARNING:tensorflow:From C:\Users\shoji\Anaconda3\envs\keras-cpu-test\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version. Instructions for updating: Colocations handled automatically by placer. WARNING:tensorflow:From C:\Users\shoji\Anaconda3\envs\keras-cpu-test\lib\site-packages\keras\backend\tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version. Instructions for updating: Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`. WARNING:tensorflow:From C:\Users\shoji\Anaconda3\envs\keras-cpu-test\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version. Instructions for updating: Use tf.cast instead. Train on 60000 samples, validate on 10000 samples Epoch 1/12 2019-05-31 14:27:03.451982: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 60000/60000 [==============================] - 65s 1ms/step - loss: 0.2590 - acc: 0.9207 - val_loss: 0.0601 - val_acc: 0.9805 Epoch 2/12 60000/60000 [==============================] - 66s 1ms/step - loss: 0.0855 - acc: 0.9748 - val_loss: 0.0414 - val_acc: 0.9869 Epoch 3/12 60000/60000 [==============================] - 77s 1ms/step - loss: 0.0632 - acc: 0.9816 - val_loss: 0.0417 - val_acc: 0.9864 Epoch 4/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0526 - acc: 0.9848 - val_loss: 0.0348 - val_acc: 0.9891 Epoch 5/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0461 - acc: 0.9859 - val_loss: 0.0331 - val_acc: 0.9889 Epoch 6/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0418 - acc: 0.9874 - val_loss: 0.0265 - val_acc: 0.9915 Epoch 7/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0371 - acc: 0.9890 - val_loss: 0.0279 - val_acc: 0.9909 Epoch 8/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0343 - acc: 0.9896 - val_loss: 0.0293 - val_acc: 0.9905 Epoch 9/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0307 - acc: 0.9904 - val_loss: 0.0298 - val_acc: 0.9912 Epoch 10/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0282 - acc: 0.9913 - val_loss: 0.0292 - val_acc: 0.9912 Epoch 11/12 60000/60000 [==============================] - 64s 1ms/step - loss: 0.0279 - acc: 0.9913 - val_loss: 0.0274 - val_acc: 0.9907 Epoch 12/12 60000/60000 [==============================] - 63s 1ms/step - loss: 0.0256 - acc: 0.9920 - val_loss: 0.0272 - val_acc: 0.9906 Test loss: 0.027180181098842512 Test accuracy: 0.9906 2019年5月31日 14:40:08