前回、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ディレクトリを空にする必要がある。 また、トレーニングの数も抑えて、なるべくプロファイラが軽く動作するようにデータセットを少し変更している。
1.1 Visual Profilerでのプロファイル結果
01_OneHiddenをプロファイリングした結果が以下だ。GPGPUが利用されていることが分かる。
拡大する。
殆どが行列演算だ。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だって、こういうフレームワーク作るのは以外と簡単なのかも(適当)。
拡大図。
ここで言う「wgrad_alg0_engine」や、「dgrad_engine」は何のことかググっても分からなかったが、ライブラリの資料を読めば分かるはずだ。調査してみよう。
3. Visual Profilerを使ってMNIST(03_ConvBatchNorm.cntk)のプロファイリングを行う
03_ConvBatchNormはさらに正規化が加わっている(正直ここらへんのアルゴリズムの理解は足りていない)。 プロファイリングを取ってみると以下のようになった。
拡大図。
やはりcudnnライブラリが利用されている。こりゃcudnn様々だな。 ここでは、02_Convolutionとは異なるライブラリがコールされている。これも調査してみる必要があるな。