深層学習用の環境セットアップ(ノートブックGPU内蔵用)

システム構成

GPUをうまく生かしたDL環境を次のシステム上に設定する。

深層学習用のソフト設定

  • NVIDIA Quadro P4200を活用できるように、tensorflow-GPUをインストールする。
  • Linux用にはDockerが使えるようだが、今回はWindowsの直下にインストールする形にする。
    • ホスト側にうまくCUDAがインストーされていれば、Docker環境もできるはず。後ほどそれも設定したい。
  • Anacondaの仮想環境を用いて、まずは色々な組み合わせで試す形にする。

Anacondaのインストール

CUDAのインストール

  • 使用するTensorflowのバージョンによって、適切なCUDAのバージョンを選択する必要がある。
  • TensorFlow 2.0 Alpha版があるようだが、今回は安定版にする。インストール後確認したら、1.13.1バージョンであった。 www.tensorflow.org

  • CUDAは最新版10.1があるは、正式サポートされているCUDA10.0をインストールする。 f:id:nikonikoten:20190531103139p:plain

  • CUDA10.0をインストールすると、一緒にGraphicドライバーもアップグレードされ、DPディジーチェーンでの外部ディスプレイ表示が動作しなくなった。 developer.nvidia.com
  • 最新の安定版のP4200用Graphicドライバーをインストールして、この問題を解決した。 www.nvidia.co.jp f:id:nikonikoten:20190531103919p:plain
  • 設定されたリビジョンは、R430 U3になる。 f:id:nikonikoten:20190531104006p:plain
  • cuDNNライブラリをインストールする。ダウンロードするために、ユーザ登録が必要になる。
  • 今回はCUDA10.0用ということで、cuDNN v7.6.0をダウンロードする。 developer.nvidia.com f:id:nikonikoten:20190531105701p:plain
  • 解凍後どこか適切な場所において、パス変数でその場所を含める方法もあるが、今回は解凍データを次のフォルダーに直接コピーした。 f:id:nikonikoten:20190531112041p:plain

Visual Studio Codeインストール

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