Tensorflowを使ったDeep LearningにおけるGPU性能調査
Kabukuエンジニアブログを始めます
どうも、おはこんばんちわ、カブクの足立です。
カブクのエンジニアって何やっているのか分かりにくいね、と言われ続け、我々のことを知ってもらうためにエンジニアブログなどで発信していかねば。
と、一念発起してはや半年。
忙しさにかまけて先延ばしにし続けるあるある状況を打開すべくKabukuエンジニアブログを始めます!
会社のエンジニアブログは重厚長大で、会社ブランディングを意識し、自社が技術的に優れている事をアピールする風潮があります。我々はそこに風穴を空けるべく、重厚長大ではないブログも書いていこう!
重厚長大じゃなくても世の中のためになることはある。
もっとライトにエンジニアがオフィシャルブログで情報発信していってもいいじゃないか。
と、言い訳たっぷり、ハードルを地中に埋めたところで、記念すべき第一回は会社のビジネス活動に関係ないDeep Learning周りの調査を報告いたします。
GPUってどれぐらい速いの?
最近、Deep Learningが流行っているおかげで注目し学習をはじめる人が増えている様に思います。
そういう方々からよく聞くのが「GPUでどれぐらい速くなるの?」ということです。
Deep Learningは大規模なデータを大規模に計算して、なんか凄い結果を出すというイメージかと思います。
開発者としては「大規模に計算」が気になるところ。
実際、Deep Learning系のフレームワークが提供しているチュートリアルを試すと20〜30分掛かるなんてことは普通です。
なのでGPUを活用することでどれ位速くなるのかが気になるところ。
TensorflowのMNISTでGPU性能調査
TensorflowのMNISTを使ってDeep LearningでGPUがどれだけ性能に影響するのかの調査しました。
性能調査のマシンとソフトの構成は以下のとおりです。
マシン構成
- CPU: Intel Core i7-6700K [4GHz/4Core/HT/HD530/TDP91W]
- RAM: 32GB
- SSD: Intel SSD 730 Series [SSD 240GB]
- GPU: NVIDIA GeForce GTX980Ti
ソフト構成
- OS: Ubuntu 14.04.2
- Driver: nvidia-352
- Library: CUDA Toolkit(v7.5.18), cuDNN(v7.0)
- Deep Learning Framework: Tensorflow 0.8rc0(Linux CPU/GPU版)
- etc: Python2.7.6, Docker 1.10.2
調査方法
MNISTをConvolutional NN(ConvNet)で解くTensorflowのサンプルを実行するだけ。
MNISTで必要とするデータセットはローカルにダウンロード済み(ダウンロード時間は考慮する必要なし)。
CPUを使うTensorflowのフレームワークとGPUを使うTensorflowのフレームワークで性能を比較しました。
下記のコマンドの結果にて実行時間を測定し評価します。
$ time python /usr/local/lib/python2.7/dist-packages/tensorflow/models/image/mnist/convolutional.py
評価結果は測定回数は3回(結果に大きなブレがなかったので3回で打止め)の平均。
結果
CPUで計算した平均時間: 1147.53s
GPUで計算した平均時間: 58.75s
CPUに比べてGPUだと約20倍でした。
詳細
次のtimeコマンドでの計測結果
/usr/bin/time -f "real %e user %U sys %S cpu %P mem %M" python ...
CPUでの計算時間
1: real 1147.89 user 6463.80 sys 488.71 cpu 605% mem 676216
2: real 1148.67 user 6456.33 sys 503.56 cpu 605% mem 676892
3: real 1146.03 user 6456.04 sys 488.36 cpu 605% mem 675524
GPUでの計算時間
1: real 58.86 user 63.80 sys 22.17 cpu 146% mem 919568
2: real 58.91 user 63.66 sys 22.19 cpu 145% mem 925912
3: real 58.47 user 62.88 sys 22.46 cpu 145% mem 920544
NN構造との関係は?
これはTensorflowにおける結果です。他のフレームワークは別途調査が必要です。
ただ、他フレームワークの方がTensorflowよりも高速という情報もあるのでもっと速くなる可能性が高いと思います。
TensorflowのMNISTのサンプルプログラムにおける結果であることも注意が必要です。
ニューラルネットワークの構造としては深いというわけではありません。
構造の深さが性能に与える影響はこの調査では分かりません。
そこで追調査として、ConvNetの深さが性能に与える影響を調査しました。
DeepになるほどGPUが有利
調査対象は引き続きMNISTをConvNetで解くTensorflowのサンプルプログラムです。
このサンプルプログラムのニューラルネットワークの構造はConvolutional Layer(C)にPooling Layer(P)という組み合わせを2回繰り返し、中間層512ノード、出力層10ノードのFully Connected Layer(FC)でクラスタリングするという構造です(下図参照)。
ここでは省略してC1P-C1P-FCと表記します(※ 1はCを1層という意味)。
この構造をよりDeepにした場合、計算時間がどうなるのかを調査します。
これ以上Pooling Layerを増やすと画像がなくなってしまい層を増やせないので、今回はConvolutional Layerを増やします。
前半のConvolutional LayerのChannel数は32とし、後半のそれは64で統一とした構造としました。
以下の様な構造です。
- 構造0(C1P): C1P-C1P-FC [1]
- 構造1(C2P): C2P-C2P-FC [3.5]
- 構造2(C3P): C3P-C3P-FC [5.8]
- 構造3(C4P): C4P-C4P-FC [8.3]
- 構造4(C5P): C5P-C5P-FC [10.7]
※Stanfordの講義資料(PDF)を見る限り、C層が1〜5つに対してP層が1つという組合せの事例が多いみたい。
各構造の右側の括弧内の数字はオリジナルのConvNetの構造(C1P)の計算数を1とした時の各構造におけるザックリとした計算数です。
※手計算なので間違ってたらごめんなさい。
※Back Propagationの計算数は考慮していません(順方向の計算数に対して大きくないので無視しました)。
各計算が等しい計算リソースを消費するわけではないので、単純にこの数値から計算コストを粗見積りするのは危険なのですが、オーダー感として参考にできると思います。
結果
GPU(青)の結果は計算数(横軸)に対して計算時間(縦軸)がなだらかに比例しています。
それに対して、CPU(赤)の結果は非常に急な比例関係にあります。
この結果から、GPUの並行計算が大きく効いてそうです。
詳細
GPUとCPUの計算時間の比較を表にまとめました。
CPUの結果がC3Pまでしかありません。
計算時間かかりすぎてデータ取得を諦めました(C3Pですら12時間超…)。
ただ、計算数にほぼ等倍比例する値が実測値で得られたので、C4PとC5Pは推測値を大きくはずさないと思われます。
※推測値は赤文字
Conv層の段数が上がるほど性能比が高くなっています。
これはニューラルネットワークの構造がDeepであるほどGPUによる並行計算の高速化の恩恵が大きいことを意味しています。
C3Pの構造(CPU版で実測した最深の構造)において約45倍となりました。
まとめ
カブクのエンジニアの事を知ってもらうために、Kabukuエンジニアブログはじめました!
Deep LearningフレームワークであるTensorflowのチュートリアルプログラムでCPUを使った実行時間とGPUを使った実行時間の比較調査を行いました。
約20倍GPUを使ったほうが高速でした。
さらにConvNetのConvolutional Layerを深くしていくとその性能比の差は大きくなり、45倍以上になりました。
蛇足
この調査をしている間にTensorflowのバージョンが0.7.1から0.8に上がりました。
その結果、GPUでの計算における実行時間が34%ぐらい短縮(約89s→約58s)しました。
GPUのデバイスのモニタリングとしてNVIDIAのSMI (System Management Interface)というツールが便利です。
とりあえず
$ nvidia-smi dmon -s pucvme
ってコマンドを打てば幸せになれます。本家ドキュメントはこちら→PDF
おわりに
もうCPUでDeep Learningやりたくない
その他の記事
Other Articles
関連職種
Recruit