Windows10でKeras+TensorFlow(GPU)環境を作る
◆ はじめに
猫も杓子もディープニューラルネットワーク(DNN)という時代。
技術に疎い上司も「AIがーAIがー」と毎日言っているので、本当にすごい時代になったなと思う。
同僚とも、とりあえずなんかやってみたいよねー的な話をしてたら、
うちの会社、紙データの入力業務とかしてまして、それをDNNで手書き文字認識で自動化したら良くね?という案が出た。
DNN入門としては良い課題。これはやってみるっきゃない、ということで3人くらいで休日を使って、
ちまちまと開発したり、テストデータ作ったりしていた。
最初のうちは良かったが、学習データが10,000件を超えたあたりで、
学習にかかる時間が2時間くらいかかりだして、結構馬鹿にならなくなってきた。
パラメータ少し変えたら2時間、学習データを追加するたびに2時間…。
耐えられなくなってきたので、GPU利用で速くしたいというのは自明な流れ。
ちょうどその時期に、自宅のPCの買い替えを検討していたので、人柱になってやろうという気になった。
買ったのは、ALIENWARE13のGTX1060(6GB)搭載のモデル。
(本当は、Surface Laptopを買おうと思っていたけど、NDIVIAのGPU載ってないからやめた)
このPCに、Keras+TensorFlow(GPU)の環境を作ろうという話。
◆ 前提環境
- Windows 10 Pro 64bit
- GeForce GTX 1060(6GB)
◆ 準備
まずは、Keras+TensorFlow(GPU)にたどり着くためのツール類をインストールする。
バージョン超重要。すごくはまった。
- CUDA ToolKit 8.0
- cuDNN 5.1
- Anaconda 4.4.0
- Visual C++ 2015 Build Tool
* CUDA Toolkit
GPU使うために必要。
インストーラをポチポチやっていくだけなので、割愛。
最初のシステムチェックでワーニングでたけど、気にせず進めて問題なかった。
https://developer.nvidia.com/cuda-downloads
* CuDNN
TensorFlow-GPU使うために必要。
ユーザ登録必須。バージョンいろいろ出てくるけど「v5.1 for CUDA 8.0」を選択。
zipをダウンロード、解凍して、先程インストールしたCUDA Toolkitフォルダ配下に配置。
https://developer.nvidia.com/rdp/cudnn-download
* Anaconda
僕のPython力は高くないので、AnacondaでPytyon環境構築する。
これまた、インストーラをポチポチやっていくだけなので、割愛。
https://www.continuum.io/downloads
* Visual C++ 2015 Build Tool
TensorFlow-GPUをインストールするために必要。
またまた、インストーラをポチポチやっていくだけなので、割愛。時代に感謝。
http://landinghub.visualstudio.com/visual-cpp-build-tools
◆ Keras+TensorFlow(GPU)
* Anacondaの仮想環境
まずは、AnacondaでPython仮想環境を作る。Pythonのバージョンは、3.5。以下、この環境下で作業する。
c:> conda create -n Keras python=3.5
c:> activate Keras
(Keras) c:>
* TensorFlow
公式の「Installing with Anaconda」に全部書いてあるとおり、pipコマンド一発。URLはここ。
実はさっきの仮想環境作るところから書いてある。
CUDAやcuDNN、Pythonのバージョンもここで指定されているので、きっちりその通りにしている。
TensorFlowのバージョンは、1.2.1。
(Keras) c:> pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whl
コマンド実行後、以下が実行できればインストールできている。
(Keras) c:> python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
* Keras
これもコマンド一発だが、途中「scipy」が正しくインストールされず、エラーでこけてしまった。
なので、condaコマンドで個別インストールしてから、再度インストールする。
Kerasのバージョンは、2.0.6。
(Keras) c:> conda install scipy
(Keras) c:> pip install keras
これで環境構築は終わり。
◆ 速度比較
環境が出来上がったので、さっそく速度比較をしてみる。
MNISTを例にCPU利用、GPU利用で比較をした。
実行したソースは以下(mnist.py)。
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 = 1
img_rows, img_cols = 28, 28
(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
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, kernel_size=(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])
実行方法
(Keras) c:> python mninst.py
結果
CPU利用時
215秒で終了。まあこんなもん。
Train on 60000 samples, validate on 10000 samples
Epoch 1/1
60000/60000 [==============================] - 215s - loss: 0.3186 - acc: 0.9039 - val_loss: 0.0743 - val_acc: 0.9770
Test loss: 0.0742522198511
Test accuracy: 0.977
GPU利用時
10秒で終了。速い。
Train on 60000 samples, validate on 10000 samples
Epoch 1/1
60000/60000 [==============================] - 10s - loss: 0.3392 - acc: 0.8977 - val_loss: 0.0827 - val_acc: 0.9746
Test loss: 0.082712899866
Test accuracy: 0.9746
◆ 感想
GPU速い。超速い。にわかニューラルネット開発だけど、速いは正義を実感。
◆ その他
CPU実行の環境は、実はDockerで作っていた。なので、はじめはGPU環境もDockerでできないかしらとか思ってた。
だけど、Linux上での構築方法しかできなさそうだったので、あきらめた。ガッデム。