FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Microsoftの機械学習ツールキットCNTKの実行結果をVisual Profilerで解析する

前回、CNTKをGPGPUで動作させることに成功した。今回は、標準的なMNISTを使って、どのようにしてGPGPUが呼ばれているのかを解析していこう。 利用したのは、NVIDIAのプロファイラであるVisual Profilerだ。このツールGPGPUでどのような関数がどれくらいの時間実行されているのかを表示することができる。

NVIDIA Visual Profiler | NVIDIA Developer

1. Visual Profilerを使ってMNIST(01_OneHidden)のプロファリングを行う

まずは最も簡単な、01_OneHiddenのプロファイリングだ。Visual Profilerの使い方は簡単で、バイナリを指定し、Working Directoryを指定、引数を指定すれば良い。 このときに、CNTKはOutputディレクトリの中身が既に生成されているならばトレーニングをスキップしてしまうので注意が必要だ。プロファイリングを取るときは、必ずOutputディレクトリを空にする必要がある。 また、トレーニングの数も抑えて、なるべくプロファイラが軽く動作するようにデータセットを少し変更している。

f:id:msyksphinz:20160216001208p:plain

1.1 Visual Profilerでのプロファイル結果

01_OneHiddenをプロファイリングした結果が以下だ。GPGPUが利用されていることが分かる。

f:id:msyksphinz:20160216001434p:plain

拡大する。

f:id:msyksphinz:20160216001521p:plain

殆どが行列演算だ。sgemm(単精度の行列積)が全体のうち半分以上を占めている。まあディープラーニングなんて行列積の塊だし、そんなもんかとは思うけど。

http://news.mynavi.jp/special/2008/cuda/008.html

2. Visual Profilerを使ってMNIST(02_Convolution.cntk)のプロファイリングを行う

一方、02_Convolutionでは、うって変わってcudnnのライブラリが多く呼ばれるようになった。やはりCNNのネットワークは、単純な行列演算では行からないらしい。 CUDNNはCUDAのNeural Network向けのライブラリだ。っていうかこんなの配布されているんだったら、CNTKだってTensorFlowだって、こういうフレームワーク作るのは以外と簡単なのかも(適当)。

f:id:msyksphinz:20160216004322p:plain

拡大図。

f:id:msyksphinz:20160216013051p:plain

ここで言う「wgrad_alg0_engine」や、「dgrad_engine」は何のことかググっても分からなかったが、ライブラリの資料を読めば分かるはずだ。調査してみよう。

developer.nvidia.com

3. Visual Profilerを使ってMNIST(03_ConvBatchNorm.cntk)のプロファイリングを行う

03_ConvBatchNormはさらに正規化が加わっている(正直ここらへんのアルゴリズムの理解は足りていない)。 プロファイリングを取ってみると以下のようになった。

f:id:msyksphinz:20160216011942p:plain

拡大図。

f:id:msyksphinz:20160216012827p:plain

やはりcudnnライブラリが利用されている。こりゃcudnn様々だな。 ここでは、02_Convolutionとは異なるライブラリがコールされている。これも調査してみる必要があるな。

まとめ

  • ディープネットの基本は行列演算(gemm)ただし、浮動小数点の精度はアプリ依存。float/double有り得る。
  • GPGPUでディープネットの高速化を図るならば、CuDNNの理解は必須。どうやら高速化のキモが詰まっているようだ。