cuDNN 5.1に対応したNVIDIAフォークのCaffe「NVcaffe(caffe-nv)」をベンチマークしてみました。
以下の記事のアップデートで、caffe-nvは、0.14.5-2+cuda7.5から0.15.9-1+cuda7.5になりました。なお、バージョン名から分かるように、CUDA 7.5対応のままなので、RCの取れたCUDA 8.0がリリースされると、caffe-nvのアップデートが行われる可能性があります。
NVIDIAのcuDNNのページ(https://developer.nvidia.com/cudnn)のベンチマークでは、VGGのような3×3 convolutionのネットワークのトレーニングが2.7倍早いと書かれていますが、ソフト(cuDNN)だけではなくハード(GPU)も変更されているので、cuDNNの効果がはっきりしません。
ベンチマーク
ここでは、以下の記事でインストールし、今回のアップデートの影響を受けないDIGITS 2.0のcuDNN 3対応のcaffe-nvと、今回アップデートされたcuDNN 5.1対応のcaffe-nvを比較してみます。なお、GPUは、GTX 960 4GBです。
ベンチマークには、以下の記事と同じようにconvnet-benchmarks(https://github.com/soumith/convnet-benchmarks)を利用します。
まず、digits-2.0ディレクトリに移動します。
$ cd ~/digits-2.0
AlexNet (バッチ数:32)
convnet-benchmarkからalexnet.prototxt(https://raw.githubusercontent.com/soumith/convnet-benchmarks/master/caffe/imagenet_winners/alexnet.prototxt)をダウンロードします。
alexnet.prototxtの3行目のinput_dim(バッチサイズ)を128から32に変更して、AlexNetのベンチマークを行います。
以下のコマンドを実行して、cuDNN 3対応のcaffe-nvのベンチマークを行います。
$ LD_LIBRARY_PATH=lib/cuda/:lib/cnmem caffe/build/tools/caffe time -model=alexnet.prototxt -gpu=0 ... Average Forward pass: 32.9242 ms. Average Backward pass: 66.751 ms. Average Forward-Backward: 99.8097 ms.
次に、以下のコマンドを実行して、cuDNN 5.1対応のcaffe-nvのベンチマークを行います。
$ caffe time -model=alexnet.prototxt -gpu=0 ... Average Forward pass: 23.553 ms. Average Backward pass: 55.1745 ms. Average Forward-Backward: 78.8644 ms.
Average Forward-Backwardは、cuDNN 3対応のcaffe-nvが約100ms、cuDNN 5.1対応のcaffe-nvが約79msとなりました。
GoogLeNet (バッチ数:32)
convnet-benchmarkからgooglenet.prototxt(https://raw.githubusercontent.com/soumith/convnet-benchmarks/master/caffe/imagenet_winners/googlenet.prototxt)をダウンロードします。
googlenet.prototxtの3行目のinput_dim(バッチサイズ)を128から32に変更して、GoogLeNetのベンチマークを行います。
以下のコマンドを実行して、cuDNN 3対応のcaffe-nvのベンチマークを行います。
$ LD_LIBRARY_PATH=lib/cuda/:lib/cnmem caffe/build/tools/caffe time -model=googlenet.prototxt -gpu=0 ... Average Forward pass: 115.189 ms. Average Backward pass: 259.735 ms. Average Forward-Backward: 375.207 ms.
次に、以下のコマンドを実行して、cuDNN 5.1対応のcaffe-nvのベンチマークを行います。
$ caffe time -model=googlenet.prototxt -gpu=0 ... Average Forward pass: 92.5176 ms. Average Backward pass: 218.426 ms. Average Forward-Backward: 311.168 ms.
Average Forward-Backwardは、cuDNN 3対応のcaffe-nvが約375ms、cuDNN 5.1対応のcaffe-nvが約311msとなりました。
VGG (バッチ数:16)
convnet-benchmarkからvgg_a.prototxt(https://raw.githubusercontent.com/soumith/convnet-benchmarks/master/caffe/imagenet_winners/vgg_a.prototxt)をダウンロードします。
vgg_a.prototxtの3行目のinput_dim(バッチサイズ)を64から16に変更して、VGGのベンチマークを行います。
以下のコマンドを実行して、cuDNN 3対応のcaffe-nvのベンチマークを行います。
$ LD_LIBRARY_PATH=lib/cuda/:lib/cnmem caffe/build/tools/caffe time -model=vgg_a.prototxt -gpu=0 ... Average Forward pass: 159.407 ms. Average Backward pass: 322.507 ms. Average Forward-Backward: 482.093 ms.
次に、以下のコマンドを実行して、cuDNN 5.1対応のcaffe-nvのベンチマークを行います。
$ caffe time -model=vgg_a.prototxt -gpu=0 ... Average Forward pass: 102.752 ms. Average Backward pass: 206.668 ms. Average Forward-Backward: 309.56 ms.
Average Forward-Backwardは、cuDNN 3対応のcaffe-nvが約482ms、cuDNN 5.1対応のcaffe-nvが約310msとなりました。
まとめ
上記の結果をグラフにすると、下のグラフのようになります。
なお、cuDNN 5.1対応のcaffe-nvでは、VGGとGoogLeNetの処理時間がほぼ等しくなっていますが、VGGのバッチ数がGoogLeNetの半分であることに注意が必要です。
また、NVIDIAのcuDNNのページと同様に、cuDNN 3対応のcaffe-nvを基準とした比率は、下のグラフのようになります。
GoogLeNetに関しては、cuDNN 5.0対応のcaffe-nvでも、約10%早くなっており、cuDNN 5.1対応のcaffe-nvも、ほぼ同じ結果となっています。
一方、VGGに関しては、約50%早くなっており、NVIDIAのcuDNNのページと似た傾向にあることが確認できました。