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)の環境を作ろうという話。
◆ 前提環境
◆ 準備
まずは、Keras+TensorFlow(GPU)にたどり着くためのツール類をインストールする。 バージョン超重要。すごくはまった。
- CUDA ToolKit 8.0
- cuDNN 5.1
- Anaconda 4.4.0
- Visual C++ 2015 Build Tool
* CUDA Toolkit
GPU使うために必要。 インストーラをポチポチやっていくだけなので、割愛。 最初のシステムチェックでワーニングでたけど、気にせず進めて問題なかった。
CUDA Toolkit Download | NVIDIA Developer
* CuDNN
TensorFlow-GPU使うために必要。 ユーザ登録必須。バージョンいろいろ出てくるけど「v5.1 for CUDA 8.0」を選択。 zipをダウンロード、解凍して、先程インストールしたCUDA Toolkitフォルダ配下に配置。
https://developer.nvidia.com/rdp/cudnn-download
* Anaconda
僕のPython力は高くないので、AnacondaでPytyon環境構築する。 これまた、インストーラをポチポチやっていくだけなので、割愛。
Download Anaconda Now! | Continuum
* Visual C++ 2015 Build Tool
TensorFlow-GPUをインストールするために必要。 またまた、インストーラをポチポチやっていくだけなので、割愛。時代に感謝。
Download the Visual C++ Build Tools (standalone C++ compiler, libraries and 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上での構築方法しかできなさそうだったので、あきらめた。ガッデム。