TheanoでDeep Learning
最近の機械学習界隈はDeep Learning一色なので、流行りに乗っかってやってみます。
実際に自分が環境構築してみて、ネットワークをCPUとGPUの両方で動かしてみました。
環境構築
今回はLinux Mintを使用して環境を構築しました。Debian/Ubuntu系のOSなら基本同じように設定できるはずです。(家にLinux環境が無かったなんて言えない)
自分の忘備録のためにも書き残しておきます。興味ない方は下まですっ飛ばしてください。
OSインストール
OSはこちらからダウンロード。今回はLinux Mint 16 "Petra" KDE版 64bitを使ってみました。
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
ダウンロードしたらインストール。
終わったら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をインストール。
ここまでで無事環境構築は終了です。
ソースコードとデータセットの入手
正直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計算できる環境を整えることをおすすめします。