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上での構築方法しかできなさそうだったので、あきらめた。ガッデム。