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 も必須ですな.