はらぺこらいおん

日々、思ったことを。

Ubuntu14.04にKeras with Tensorflow(GPU)をインストール

pictzzz.hatenablog.com

こちらの記事でMacbook ProにKerasをインストールしてみましたが、 あまりディープでないCNNでも学習が終わらず、 GPUの乗っているUbuntu14.04にKerasをインストールしてみました。

Ubuntu14.04にGPU(CUDA、cuDNN)をセットアップする方法は以下の記事に書きました。 グラボはGeForce GTX 660(2GB)です。

pictzzz.hatenablog.com

セットアップ

Tensorflow

GPUを使うためには、以下の環境変数をインストール前に登録しておく必要があります。

# ~/.bashrc

export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.1-cp27-none-linux_x86_64.whl
export CUDA_HOME=/usr/local/cuda

登録後は以下のコマンドで環境変数を読み込みます。

$ source ~/.bashrc

インストールmacにインストールした時と同様に pip コマンドでインストールします。

$ pip install tensorflow

scipyインストール

scipyはKerasをインストールすると自動で入るはずですが、 Kerasのインストールでscipyがこけているようだったので、別途インストールしました。 同様にnumpyでこける方もいるようです。

scipyのインストールは以下のコマンドで行います。

$ apt-get install python-scipy

matplotlibインストール

plot用に必要となるmatplotlibですが、こちらもmacと同様にpipでインストールします。 事前に必要となるpydotとgraphvizもインストールしておきます。

$ pip install pydot_ng
$ apt-get install graphviz
$ pip install matplotlib

Kerasインストール

最後にKerasをインストールします。

$ pip install keras

テスト

Tensorflow

以下のようにimportをして正常にインストールされているか確認します。

$ python
>>> import tensorflow as tf

これを実行してみてエラーが出なければOKです。

Keras

macの時と同様に、こちらのMNISTのサンプルプログラムを実行してみます。

keras/mnist_mlp.py at master · fchollet/keras · GitHub

ダウンロードしてtest.pyとして保存します。(名前はなんでも良いです。)

$ python test.py
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
60000 train samples
10000 test samples
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
dense_1 (Dense)                  (None, 512)           401920      dense_input_1[0][0]              
____________________________________________________________________________________________________
activation_1 (Activation)        (None, 512)           0           dense_1[0][0]                    
____________________________________________________________________________________________________
dropout_1 (Dropout)              (None, 512)           0           activation_1[0][0]               
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 512)           262656      dropout_1[0][0]                  
____________________________________________________________________________________________________
activation_2 (Activation)        (None, 512)           0           dense_2[0][0]                    
____________________________________________________________________________________________________
dropout_2 (Dropout)              (None, 512)           0           activation_2[0][0]               
____________________________________________________________________________________________________
dense_3 (Dense)                  (None, 10)            5130        dropout_2[0][0]                  
____________________________________________________________________________________________________
activation_3 (Activation)        (None, 10)            0           dense_3[0][0]                    
====================================================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
____________________________________________________________________________________________________
Train on 60000 samples, validate on 10000 samples
Epoch 1/20
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GeForce GTX 660
major: 3 minor: 0 memoryClockRate (GHz) 1.0975
pciBusID 0000:01:00.0
Total memory: 1.95GiB
Free memory: 1.67GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 660, pci bus id: 0000:01:00.0)
60000/60000 [==============================] - 3s - loss: 0.2434 - acc: 0.9248 - val_loss: 0.1119 - val_acc: 0.9637
Epoch 2/20
60000/60000 [==============================] - 3s - loss: 0.1015 - acc: 0.9694 - val_loss: 0.0801 - val_acc: 0.9748
Epoch 3/20
60000/60000 [==============================] - 3s - loss: 0.0746 - acc: 0.9776 - val_loss: 0.0874 - val_acc: 0.9740
Epoch 4/20
60000/60000 [==============================] - 3s - loss: 0.0581 - acc: 0.9825 - val_loss: 0.1001 - val_acc: 0.9729
Epoch 5/20
60000/60000 [==============================] - 3s - loss: 0.0510 - acc: 0.9844 - val_loss: 0.0951 - val_acc: 0.9771
Epoch 6/20
60000/60000 [==============================] - 3s - loss: 0.0442 - acc: 0.9868 - val_loss: 0.0874 - val_acc: 0.9792
Epoch 7/20
60000/60000 [==============================] - 2s - loss: 0.0366 - acc: 0.9882 - val_loss: 0.0887 - val_acc: 0.9793
Epoch 8/20
60000/60000 [==============================] - 3s - loss: 0.0341 - acc: 0.9897 - val_loss: 0.0916 - val_acc: 0.9801
Epoch 9/20
60000/60000 [==============================] - 3s - loss: 0.0327 - acc: 0.9907 - val_loss: 0.0840 - val_acc: 0.9826
Epoch 10/20
60000/60000 [==============================] - 3s - loss: 0.0288 - acc: 0.9913 - val_loss: 0.0884 - val_acc: 0.9833
Epoch 11/20
60000/60000 [==============================] - 3s - loss: 0.0258 - acc: 0.9927 - val_loss: 0.0876 - val_acc: 0.9844
Epoch 12/20
60000/60000 [==============================] - 3s - loss: 0.0247 - acc: 0.9928 - val_loss: 0.0984 - val_acc: 0.9822
Epoch 13/20
60000/60000 [==============================] - 3s - loss: 0.0244 - acc: 0.9934 - val_loss: 0.0949 - val_acc: 0.9836
Epoch 14/20
60000/60000 [==============================] - 3s - loss: 0.0222 - acc: 0.9939 - val_loss: 0.0959 - val_acc: 0.9837
Epoch 15/20
60000/60000 [==============================] - 3s - loss: 0.0210 - acc: 0.9940 - val_loss: 0.0892 - val_acc: 0.9835
Epoch 16/20
60000/60000 [==============================] - 2s - loss: 0.0192 - acc: 0.9947 - val_loss: 0.0953 - val_acc: 0.9834
Epoch 17/20
60000/60000 [==============================] - 3s - loss: 0.0191 - acc: 0.9948 - val_loss: 0.1119 - val_acc: 0.9840
Epoch 18/20
60000/60000 [==============================] - 3s - loss: 0.0216 - acc: 0.9944 - val_loss: 0.1086 - val_acc: 0.9830
Epoch 19/20
60000/60000 [==============================] - 3s - loss: 0.0179 - acc: 0.9952 - val_loss: 0.1180 - val_acc: 0.9829
Epoch 20/20
60000/60000 [==============================] - 3s - loss: 0.0200 - acc: 0.9949 - val_loss: 0.1069 - val_acc: 0.9842
Test score: 0.106886059585
Test accuracy: 0.9842

macだと20epochで200秒くらいで終わりましたが、 GPUでは60秒くらいに短縮できました。