CNTK 2.2 Python API 解説 (2) – マルチノード分散トレーニングの実装と実行 / ベンチマーク

◆ CNTK ( Microsoft Cognitive Toolkit ) 2.2 の Python API 解説第2弾です。
今回は CNTK の分散トレーニング、特にマルチノード構成における分散トレーニングの実装・実行方法の解説とベンチマークの結果報告になります。
ユーザ設定が必要な初期値 (ウォームスタートサイズ, ブロックサイズ) についても適正値を検証しています。
また、CIFAR-10 用にカスタマイズした BN Inception, ResNet-110 モデルを分散トレーニングすることによってテスト精度 94.04 % を達成しています。

これまでは主として CNTK 2.2 Tutorials への橋渡しを意識した記事作成を心がけてきましたが、
今回はリファレンスマニュアルを参考に、サンプルプログラムを利用した分散処理の実験報告です。

◆ CNTK 2.2 を新たに学び始めた一番の理由は、分散トレーニングへの期待です。
他の幾つかの深層学習フレームワークで分散トレーニングに挑戦してみましたが、
個人的に試した限りでは以下のような短所の何れかを持つケースが目立ち、良い感触が得られていません :

  • 分散対応に必要なコード変更量が多すぎて、手軽に利用できない。
  • 柔軟性に欠けていて、雛形に落とし込むことがタスクによっては困難。
  • パフォーマンス (速度・精度) が出ない。速度が出なかったり、速度が出ても精度が極端に落ちる。
  • 具体的な分散アルゴリズムが不明。
  • (開発途上なのかもしれませんが) 安定感に欠けて現時点で利用しづらい。

そこで CNTK です。
CNTK では並列データ処理、とくに “1-bit SGD” アルゴリズムの実装をセールスポイントにしていますので分散処理を重視しているはずです。そして分散処理フレームワークとして MPI 仕様ベースの OpenMPI 実装を利用していますから全体像の理解が容易ですし、かつステーブルであることも期待できます。

◆ 今回実験した結論として、CNTK の分散トレーニングについて以下のような 優位点 が確認できました :

  • 実装が非常に簡単です。分散トレーニングへの対応に必要なプログラムの改変は最小限で済みます。
  • 少なくとも 4 ノードあれば明確にパフォーマンス改善が得られます。大幅な速度の改善が見られ、精度の劣化もアルゴリズムの選択により最小限に抑えることができます。
  • ジョブの投入も MPI をベースにしているのでスムースで手軽です。
  • 複数のデータ並列アルゴリズムから選択できます ので、モデルやデータセットについて最適化できます。
  • それぞれのアルゴリズムの主目的 (勾配交換の効率化や非並列化トレーニングの活用等々) が明確ですので、高速化のポイントが抑えやすいです。

 

詳細 : CNTK 2.2 Python API 解説 (2) – マルチノード分散トレーニングの実装と実行 / ベンチマーク