アンドロイドはDeep Learningの夢を見るか

自分の専門分野の内容で自分向けの忘備録(Twitterには書ききれない内容のメモ的な)

TheanoでDeep Learning

最近の機械学習界隈はDeep Learning一色なので、流行りに乗っかってやってみます。

実際に自分が環境構築してみて、ネットワークをCPUとGPUの両方で動かしてみました。 

環境構築

今回はLinux Mintを使用して環境を構築しました。Debian/Ubuntu系のOSなら基本同じように設定できるはずです。(家にLinux環境が無かったなんて言えない)

自分の忘備録のためにも書き残しておきます。興味ない方は下まですっ飛ばしてください。

OSインストール

OSはこちらからダウンロード。今回はLinux Mint 16 "Petra" KDE版 64bitを使ってみました。

http://linuxmint-jp.net/

Pythono+Theano+CUDAインストール

PythonとTheanoのインストールはこちらを参考に設定しました。

$ sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git

 

$ sudo pip install Theano

python-devはpython本体のパッケージです。python-numpyとpython-scipyはTheanoの依存関係のために必要なパッケージとなっています。ちなみに中身は行列とか便利に扱えるライブラリっぽい。(もしかしたらsudo aptitude installとか使えばこのへんの依存関係を気にしなくていのかもしれませんが)

python-pipはpythonのパッケージ管理ソフトです。Theanoはこれ経由で入れておきます。

次にCUDAのインストールです。これはこちらを参考にしました。

nvccのダウンロードは以下から。Linux Ubuntu12.04 64bit DEBのパッケージを選択。

https://developer.nvidia.com/cuda-downloads

ダウンロードしたらインストール。

 $ sudo dpkg -i cuda-repo-ubuntu1204_5.5-0_amd64.deb

終わったらPATHの設定をする。インストールしたCUDAのバージョンによってはPATHの書きかえが必要かもです。

$ export PATH=/Developer/NVIDIA/CUDA-5.5/bin:$PATH

$ export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-5.5/lib:$DYLD_LIBRARY_PATH  

次にGPUドライバが入っているかを確認。

$ sudo grep NVIDIA /var/log/Xorg.0.log

 

[  1312.602] (II) Module glx: vendor="NVIDIA Corporation"

[  1312.602] (II) NVIDIA GLX Module  319.60  Wed Sep 25 14:24:11 PDT 2013

[  1312.603] (II) Module nvidia: vendor="NVIDIA Corporation"

[  1312.604] (II) NVIDIA dlloader X Driver  319.60  Wed Sep 25 14:04:14 PDT 2013

[  1312.604] (II) NVIDIA Unified Driver for all Supported NVIDIA GPUs

[  1312.604] (II) NOUVEAU driver for NVIDIA chipset families :

[  1312.609] (II) NVIDIA(0): Creating default Display subsection in Screen section

[  1312.609] (==) NVIDIA(0): Depth 24, (==) framebuffer bpp 32

 ...(中略)

 ログを見てドライバが当たっていることを確認。当たってなければ別途インストールしてください。

最後にnvidia-settingsをインストール。

$ sudo aptitude install nvidia-settings

 ここまでで無事環境構築は終了です。

ソースコードとデータセットの入手

正直Theanoの動作確認には、Theanoでちょいと書いてあるソースであれば何でもいいのですが、今回はdeeplearning.netからStacked Denoising Auto-Encoderアルゴリズムで実装された手書き数字認識器を動かしてみます。

まずはソースの入手。

https://github.com/lisa-lab/DeepLearningTutorials

このソースコードの詳しい解説はこちらで解説されています。

データセットは以下で入手できます。ちなみにこれはmnistの手書き数字のpklパッケージ版です。

http://www.iro.umontreal.ca/~lisa/deep/data/mnist/mnist.pkl.gz

今回はSdA.pyの実行をしてみますが、この際SdA.pyのソースコードが保存されているフォルダから見て「../data/mnist.pkl.gz」の位置にデータセットがないとうまくデータを食ってくれなかったりします。

実行結果

CPUモードとGPUモードで比較してみます。

その前に当方のハードウェア的な環境は以下のとおりです。

CPUモード実行結果

CPUモードで学習するには、CPUフラグをONにして実行させます。

$ HEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 python SdA.py 

... loading data

... building the model

... getting the pretraining functions

... pre-training the model

Pre-training layer 0, epoch 0, cost  71.64814

Pre-training layer 0, epoch 1, cost  63.687415

Pre-training layer 0, epoch 2, cost  62.29181

Pre-training layer 0, epoch 3, cost  61.580305 

Pre-training layer 0, epoch 4, cost  61.15378

...(中略)

Pre-training layer 2, epoch 13, cost  176.49464 

Pre-training layer 2, epoch 14, cost  176.34824  

The pretraining code for file SdA.py ran for 235.43m 

... getting the finetuning functions

... finetunning the model

epoch 1, minibatch 50000/50000, validation error 4.080000 %

     epoch 1, minibatch 50000/50000, test error of best model 4.220000 %

epoch 2, minibatch 50000/50000, validation error 3.480000 % 

     epoch 2, minibatch 50000/50000, test error of best model 3.690000 %

epoch 3, minibatch 50000/50000, validation error 2.920000 %

...(中略)

epoch 36, minibatch 50000/50000, validation error 1.430000 %

epoch 37, minibatch 50000/50000, validation error 1.430000 %

Optimization complete with best validation score of 1.420000 %,with test performance 1.370000 %

The training code for file SdA.py ran for 284.60m 

結果はPre-Trainingで235.43分、Fine-Tuningで284.60分となりました。

GPUモード実行結果

GPUモードで学習するには、GPUフラグをONにして実行させます。

 $ THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python SdA.py 

Using gpu device 0: GeForce GTX 660 Ti

... loading data

... building the model

... getting the pretraining functions

... pre-training the model

Pre-training layer 0, epoch 0, cost  71.648135

Pre-training layer 0, epoch 1, cost  63.68741

Pre-training layer 0, epoch 2, cost  62.29181

Pre-training layer 0, epoch 3, cost  61.580305

Pre-training layer 0, epoch 4, cost  61.15378

...(中略)

Pre-training layer 2, epoch 13, cost  176.49468

Pre-training layer 2, epoch 14, cost  176.34826 

The pretraining code for file SdA.py ran for 93.74m

... getting the finetuning functions    

... finetunning the model  

epoch 1, minibatch 50000/50000, validation error 4.030000 % 

     epoch 1, minibatch 50000/50000, test error of best model 4.290000 %                                                                                    

epoch 2, minibatch 50000/50000, validation error 3.330000 % 

     epoch 2, minibatch 50000/50000, test error of best model 3.840000 %                                                                                    

epoch 3, minibatch 50000/50000, validation error 2.900000 %

     epoch 3, minibatch 50000/50000, test error of best model 2.880000 %

...(中略)

epoch 42, minibatch 50000/50000, validation error 1.470000 %

epoch 43, minibatch 50000/50000, validation error 1.470000 %

Optimization complete with best validation score of 1.440000 %,with test performance 1.320000 %

The training code for file SdA.py ran for 119.48m

 学習のアルゴリズム上繰り返しの回数が同一のものとならず、ちょっとアンフェア(GPUで計算させた方が今回は繰り返し回数が多かった)な感じですが、それでもこっちの方が速いですね。結果はPre-Trainingで93.74分、Fine-Tuningで119.48分となりました。

結果比較

今回はCPUとGPUでそれぞれ手書き数字文字認識をさせたところ、Pre-Trainingで約2.51倍、FIne-Tuningで約2.38倍高速に計算をさせることができました。

もちろん環境や計算の繰り返し回数で大きく結果が変わる可能性はあるのでご参考程度に…

高速に計算が出きると色々はかどると思うので、Deep Learingの際はGPU計算できる環境を整えることをおすすめします。