2016年7月3日日曜日

で、次どうする?

よくありがちなことですが、インストールだけ成功して満足してしまうのがPC使いの罠。

Chainer+CUDA+cuDNNのインストールは成功。
サンプルも動いた。

なんかファイルが4つ(mnist.pkl、graph.dot、mlp.model、mlp.state)生まれた。

で、これをどうしろっていうの??

2016年7月2日土曜日

ChainerのCPU利用時とGPU利用時の差

CPUモードの時とGPUモードの時を比較してみる。

CPUモード(Core i5-6600)の時:
epoch 1
graph generated
train mean loss=0.19060514808942874, accuracy=0.9417666694770257, throughput=4271.602999064454 images/sec

GPUモード(NVIDIA GeForce GTX970)の時:
epoch 1
graph generated
train mean loss=0.1898393394611776, accuracy=0.9429833358960847, throughput=18989.679505603865 images/sec

スループット差は約4.4倍ほど。

CPUモード(Core i5-6600)の時:
epoch 20
train mean loss=0.012885340018372063, accuracy=0.9962166701753934, throughput=2738.190540420163 images/sec

GPUモード(NVIDIA GeForce GTX970)の時:
epoch 20
train mean loss=0.009821116544642905, accuracy=0.9971666693687439, throughput=22496.614220684336 images/sec

スループット差は約8.2倍。

同じデータで比較したけれど、スループット差はかなりあるようだ。

やっとcuDNNが動いたけれど

どうやって動いたのか、未だによくわからない。
色々とシステムをいじくりまわした結果なので。

Macで、Chainer初心者が定番にやるtrain_mnist.py。
CPUモードで動かしている限りはかなり楽勝。
だが、GPUを使う場合は、いろいろとうまく行かなかった。

Python3でサンプルを動かすと、まずエラーが出る。
CUDA、cuDNNをインストールガイドにしたがってインストールしてもエラーが出る。

で、やってみたこと。

1.シンボリックリンクを貼ってみた。
El CaptitanではDYLD_LIBRARY_PATHの上書きが有効にならないらしいため。
$ ln -s /usr/local/cuda/lib/* /usr/local/lib
$ ln -s /Developer/NVIDIA/CUDA-7.5/lib/* /usr/local/lib

出典:http://qiita.com/ayuma0913/items/82c03a8173d3c97bff10

で、とりあえずGPUというかCUDAは動き出した感じ。
でもエラーはまだ出てくる。

$ python train_mnist.py -g 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20
Network type: simple

load MNIST dataset
Downloading train-images-idx3-ubyte.gz...
Done
Downloading train-labels-idx1-ubyte.gz...
Done
Downloading t10k-images-idx3-ubyte.gz...
Done
Downloading t10k-labels-idx1-ubyte.gz...
Done
Converting training data...
Done
Converting test data...
Done
Save output...
Done
Convert completed
/Users/ほげほげ/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/chainer/cuda.py:87: UserWarning: cuDNN is not enabled.
Please reinstall chainer after you install cudnn
(see https://github.com/pfnet/chainer#installation).
  'cuDNN is not enabled.\n'
epoch 1
/Users/ほげほげ/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/chainer/cuda.py:87: UserWarning: cuDNN is not enabled.
Please reinstall chainer after you install cudnn
(see https://github.com/pfnet/chainer#installation).
  'cuDNN is not enabled.\n'
graph generated
train mean loss=0.1901665245865782, accuracy=0.942733337233464, throughput=19169.138552723725 images/sec
test  mean loss=0.09113417560467496, accuracy=0.9730000060796737
以下略

CPUモードに比べれば全然速いのだけど、cuDNNが無効というのが気に入らない。

2.OS X 10.11 El CapitanのSystem Integrity Protection(SIP)を無効にしてみる。
自分の環境がちょっと特殊(苦笑)なため、リカバリーモードに入るのに苦労した。

例のインストールUSBからブートして、GUIが起動したらユーティリティのターミナルに入る。
$ csrutil disable
$ reboot

これでSIPが無効になる。
セキュリティ的にSIPは効果的らしいんだけど、まずは切ってみた。
副次効果として、SIP環境下ではアプリがSandboxで動いていたのがそうではなくなるので、動作はサクサクになる。操作感は相当にいいので、Sandboxは重たいのだなって実感。

で、chainerをアンインストール、再インストールする。

で、再挑戦。
やっぱりcuDNN is not enabledと表示される。

3.cuDNNのバージョンを変える。
いままでcuDNN v5(May 12,2016),for CUDA 7.5を使っていたが、cuDNN v5.1 RC (June 16, 2016), for CUDA 7.5にバージョンアップしてみる。

ダウンロードしたフォルダを展開し、それぞれ/Developer/NVIDIA/CUDA-7.5下のフォルダにコピー。

で、chainerをアンインストール、再インストールする。

で、再挑戦。

$ python train_mnist.py -g 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20
Network type: simple

load MNIST dataset
Downloading train-images-idx3-ubyte.gz...
Done
Downloading train-labels-idx1-ubyte.gz...
Done
Downloading t10k-images-idx3-ubyte.gz...
Done
Downloading t10k-labels-idx1-ubyte.gz...
Done
Converting training data...
Done
Converting test data...
Done
Save output...
Done
Convert completed
epoch 1
graph generated
train mean loss=0.1888404919952154, accuracy=0.9433166711529096, throughput=16031.889196102731 images/sec
test  mean loss=0.09853773100476246, accuracy=0.9686000072956085
epoch 2
train mean loss=0.07550216538365931, accuracy=0.9763166766365369, throughput=22556.0344267401 images/sec
test  mean loss=0.07264450040020165, accuracy=0.9770000052452087
epoch 3
train mean loss=0.04877504045046711, accuracy=0.9843666765093804, throughput=22632.55122509905 images/sec
test  mean loss=0.08447756661909807, accuracy=0.9758000069856644
epoch 4
train mean loss=0.03617304402956506, accuracy=0.9882166763146718, throughput=22372.07331256839 images/sec
test  mean loss=0.07253925856392016, accuracy=0.9785000050067901
epoch 5
train mean loss=0.02990280262378898, accuracy=0.9904666745662689, throughput=22544.69441226119 images/sec
test  mean loss=0.07364016732306482, accuracy=0.9786000072956085
epoch 6
train mean loss=0.02051041631498568, accuracy=0.9932666728893916, throughput=22602.377604251567 images/sec
test  mean loss=0.08061152838608905, accuracy=0.9794000065326691
epoch 7
train mean loss=0.02313764386140974, accuracy=0.9924666731556256, throughput=22608.97704668778 images/sec
test  mean loss=0.07398538219076045, accuracy=0.9813000071048736
epoch 8
train mean loss=0.01743261187949732, accuracy=0.9944333384434382, throughput=22505.744075544564 images/sec
test  mean loss=0.06380779648055522, accuracy=0.9824000066518783
epoch 9
train mean loss=0.017964339632999326, accuracy=0.9940833389759064, throughput=22634.045328307027 images/sec
test  mean loss=0.07465034724052032, accuracy=0.9814000070095062
epoch 10
train mean loss=0.01577379300415032, accuracy=0.9950333380699158, throughput=22556.450902358458 images/sec
test  mean loss=0.07825881053931426, accuracy=0.9805000072717667
epoch 11
train mean loss=0.01135890639123924, accuracy=0.9965166698892911, throughput=22567.71775072012 images/sec
test  mean loss=0.0798807725448205, accuracy=0.9818000066280365
epoch 12
train mean loss=0.014168494007887299, accuracy=0.9959166704614957, throughput=22579.648188927462 images/sec
test  mean loss=0.08158497168318718, accuracy=0.9832000064849854
epoch 13
train mean loss=0.01492698869720698, accuracy=0.9956500040491422, throughput=22598.878417525055 images/sec
test  mean loss=0.08872715805148687, accuracy=0.980800005197525
epoch 14
train mean loss=0.009995754014827678, accuracy=0.9964000033338865, throughput=22575.31759377331 images/sec
test  mean loss=0.08891520491886695, accuracy=0.9828000068664551
epoch 15
train mean loss=0.010710552199502388, accuracy=0.9967833363016446, throughput=22601.20229250324 images/sec
test  mean loss=0.08941980777552216, accuracy=0.981700005531311
epoch 16
train mean loss=0.01189803228019097, accuracy=0.9964333367347717, throughput=22547.26976868952 images/sec
test  mean loss=0.09618509650914689, accuracy=0.982900008559227
epoch 17
train mean loss=0.007446224756765029, accuracy=0.9976333355903626, throughput=22305.55383457275 images/sec
test  mean loss=0.09916683364292737, accuracy=0.9818000072240829
epoch 18
train mean loss=0.008587048528358612, accuracy=0.9974333357810974, throughput=22575.74288268399 images/sec
test  mean loss=0.1162207845506302, accuracy=0.9780000072717666
epoch 19
train mean loss=0.012611796275693409, accuracy=0.9964500031868617, throughput=22599.16659265566 images/sec
test  mean loss=0.09134372303703306, accuracy=0.9832000058889389
epoch 20
train mean loss=0.005183243499375673, accuracy=0.9983000016212463, throughput=22576.352491400365 images/sec
test  mean loss=0.1039556429999165, accuracy=0.9821000063419342
save the model
save the optimizer

ああ、動いたなあ。
そして速いなあ…………。

結局1〜3のどれが効いたのかよくわからない。
2のSIP無効化は必要ないのかもしれない。
そのうち検証してみようと思う。