まんぼう日記

takataka's diary

cuDNN を入れて Theano で使ってみる

Convolutional Neural Net で CIFAR-10 を識別してみる - まんぼう日記 に書いた,NVIDIA cuDNN – GPU Accelerated Deep Learning の話です.今朝,NVIDIA から GPU Computing & Embedded Developer Program への登録の approval のメイルが来ました.サイトへ行ってみたら cuDNN がダウンロードできるようになってたので,早速.

 

cuDNNの設定の仕方や Theano で使う方法については,Theano のサイトに詳しい説明があります:sandbox.cuda.dnn – cuDNN — Theano 0.7 documentation

以下はそれを参考に書いてます.

 

 

cuDNNの設定

 

まずは, NVIDIA cuDNN – GPU Accelerated Deep Learning から cuDNN 3 のアーカイブファイルをダウンロード.たかたかは Linux + CUDA 7.0 で使うので,cudnn-7.0-linux-x64-v3.0-rc.tgz です.展開すると,cudnn.h やら libcudnn.so.7.0.X やらが出てきます.現時点では,X は 58 でした.これらを,環境変数 CUDA_ROOT で指定されてるディレクトリの下の適切な場所にコピーします.特に CUDA_ROOT を指定してないデフォルトでは /usr/local/cuda やそうです.たかたかは変更したりしてないので,そちらへ.

 

$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn.so.7.0.58 /usr/local/cuda/lib64
$ cd /usr/local/cuda/lib64
$ sudo ln -s libcudnn.so.7.0.58 libcudnn.so.7.0
$ sudo ln -s libcudnn.so.7.0 libcudnn.so

 

Theano から呼び出して使えればよい,って場合はこれだけ.

 

Theano から呼び出す

cuDNN が適切に設定されてれば,Theano は勝手に使おうとするそうです.何も考えずに GPU 使って Theano のプログラムを動かしても cuDNN が使えてるかどうかはわかりません.確認したければ,Theano の設定で optimizer_including=cudnn として実行してみたらよいそうな.cuDNN 使えなかったらエラー出るそうです.

 

逆に cuDNN が入ってても使わへんようにしたいときは? と調べてみると,

config – Theano Configuration — Theano 0.7 documentation

に config.optimizer_excluding というのがありました.

 

というわけで,cuDNN を使う使わへんでどれくらい性能に違いがでるか,Convolutional Neural Net で CIFAR-10 を識別してみる - まんぼう日記 の Convolutional Neural Net のプログラムを動かして確認してみました.実験条件は,実験2の下から2つ目,

24x24 (2,2) (2,2) 81.4% 37m

です.

 

まずは,cuDNNなし.

$ time THEANO_FLAGS='floatX=float32,device=gpu0,optimizer_excluding=cudnn' python ex150823b.py
Using gpu device 0: Tesla K20c
   :
### Conv-Pool-Conv-Pool-ReLu-Softmax   Xdim: (3, 24, 24)
#   W1dim: (64, 5, 5)  ds1: (2, 2)  st1: None  border_mode: full  H1: 12544
#   W2dim: (64, 5, 5)  ds2: (2, 2)  st2: None  border_mode: full  H2: 5184
#   H3: 1000
# eta =  0.01  mu =  0.9  lam =  0.0001
# ZCAwhitening =  True  tfunc =  translate2  dstshape =  (24, 24)
### training:   NL =  40000  NV =  10000  K =  10  batchsize =  100
0 | 2.3027 9.63 | 2.3027 9.55
   :
# NT =  10000
50 | 0.1511 95.06 | 0.5798 82.43 | 0.6129 81.42

real    37m5.578s
user    38m43.758s
sys    6m5.519s

次は,optimizer_excluding=cudnn をはずして,cuDNN を有効にした状態で.

$ time THEANO_FLAGS='floatX=float32,device=gpu0' python ex150823b.py
Using gpu device 0: Tesla K20c
   :
50 | 0.1617 94.73 | 0.5999 82.06 | 0.6205 81.75

real    20m53.066s
user    24m28.949s
sys    4m10.160s

というわけで,37分が21分になりました.結構な高速化ですね.ほほぅ.

 

ほな overlap ありの max-pooling もできたりして?( cf. Theano で GPU 使って Convolutional Neural Net - まんぼう日記 ) と思って,上記のプログラムで ds1 と ds2 を (3, 3) に,st1 と st2 を (2, 2) にして実行してみたら,1 epoch 20分,ほとんど GPU 使えてない様子…今までとおんなじやーん (;_;) がっくり

 

ほなほな convolution なしの普通の MLP では? ちうことで,大石東バイパスとTheanoでGPGPU - まんぼう日記 同様,MNIST の学習をするプログラムで実験.784(input) - 1000(ReLu) - 500(ReLu) - 10(softmax) って3層MLPで.

 

で,結果は,cuDNN ありなしとも 1分58秒で違いなし.識別率その他の値も全く同じで,どうやら cuDNN を呼び出してないようです.Theano が cuDNN を有効活用してないのかも.

 

それでも convolution の高速化の恩恵がおっきいので,CUDA + Theano なひとは cuDNN も必須ですな.