TensorFlow から CNTK に移行する理由
深層学習は、過去数年間に人工知能 (AI) に革命をもたらしました。一部の上位の企業だけではなく誰でも自由に人工知能を使えるように、というマイクロソフトのビジョンに基づき、オープンソースの深層学習フレームワークであるMicrosoft Cognitive Toolkit (CNTK) が作成されました。今日では、GitHubスターの数で TensorFlowとCaffeに続く、そしてMxNet、Theano、Torchなどよりも順位が高い、3番目に人気のある深層学習フレームワークとなりました。
TensorFlowの人気が高いことを考えると、TensorFlowの代わりにCNTKを使用する理由はなになのかということをよく聞かれます。人間は大勢がやっていることに従う傾向があり、そうすること自体は間違いではありません。しかし、この記事では、CNTKに有利ないくつかの強力な理由を指摘したいと思います。
多くの実例で、CNTKがはるかに優れた選択肢かもしれないと主張しています。これらの理由は次のとおりです。
- スピード: CNTKは一般にTensorFlowよりもはるかに高速であり、再帰ネットワークでは5〜10倍高速になります。
- 精度: CNTKは、最先端の精度で深層学習モデルの訓練に使用できます。
- APIデザイン: CNTKは非常に強力なC ++ APIを備えており、機能プログラミングのパラダイムで設計された低水準と簡単な高水準の両方の Python APIも備えています。
- スケーラビリティ: CNTKは何千ものGPUで容易に拡張できます。
- 推論: CNTKはC#/.NET / Javaによる推論をサポートしているため、CNTKの評価をユーザーアプリケーションに簡単に統合できます。
- 拡張性: CNTKはPythonから簡単に拡張できます。
- ビルトインリーダー: CNTKは分散型学習もサポートする効率的なデーター読み取りを内蔵しています。
この記事の残りの部分では、これらの利点をさらに詳しく説明します。
理由1:スピード
深層学習は、データ集約型で計算集中型です。製品を構築しているときでも、論文を書いているときでも、迅速に反復実行できることが成功の鍵です。トレーニングと評価のスピードの面では、CNTKはTensorFlowよりも大きな利点があります。HKBUの研究者(https://dlbench.comp.hkbu.edu.hk/、記事:https://arxiv.org/pdf/1608.07249.pdf)の比較では、テストしたすべてのネットワークで、CNTKのパフォーマンスはCPUまたはGPUのいずれでもTensorFlowより優れています。実際、GPUでは、CNTKは他のすべてのツールキットよりも高速です。
画像関連のタスクの場合、CNTKは通常TensorFlowより2〜3倍高速です。しかも、再帰ニューラルネットワーク(RNN)では、CNTKはぶっちぎりに勝っています。上記の論文で報告されているように、CPUで実行すると、「CNTKはTorchおよびTensorFlowよりもはるかに優れたパフォーマンス(最大5〜10倍)を得ます。」GPUでは、「CNTKは他のすべてのツールを何倍も凌駕しています。」この速度の利点は偶然ではありません。CNTK はもともとMicrosoft Researchの音声認識グループによって開発されたもので、シーケンス処理のために非常に最適化されています。
プロジェクトに音声認識、自然言語理解、機械翻訳などのシーケンス処理が含まれている場合は、CNTK が最適です。そして、ビデオ処理に取り組む動画研究者も、CNTKをぜひ試してみてください。
理由2:精度
深層学習ツールキットは、たとえツールキットのコードにバグがあっても、同じネットワークアーキテクチャ設計で合理的な精度を達成できてしまうため、開発に特殊な工夫を必要とします。他の多くのツールキットでは、元の論文の実装と同じように見えるサンプルを作成し、ダウンロードして評価するための変換されたモデルを提供しています。これは我々に言わせれば非常に無責任です。CNTKでは、バグの追跡に多くの注意を払い、実際にモデルを最初からトレーニングし、最先端の精度を達成するためにツールキットを使用できることを確認します。
一例として、元々Googleのいくつかの研究者によって開発されたInception V3ネットワーク(https://arxiv.org/abs/1512.00567)をあげます。TensorFlowはInception V3のトレーニングスクリプトを共有し、トレーニング済みのモデルをダウンロードで提供しました。しかし、データの前処理や拡張などの詳細をさらに理解する必要があるため、モデルを再学習して同じ精度を達成することは困難です。第三者(この場合はKeras)によって達成された最高の精度は、元の論文が報告したものより約0.6%悪化しています。CNTKチームの研究者たちは懸命に働き、上位 5 つのエラー が5.972% (これは元の論文よりも良い精度!) の精度で CNTK Inception V3モデルを訓練することができました。トレーニングスクリプトはサンプルとして共有されており、あなた自身で確認することができます。(https://github.com/Microsoft/CNTK/tree/master/Examples/Image/Classification/GoogLeNet)
再帰ニューラルネットワークでは、CNTKの自動バッチアルゴリズムにより、異なる長さのシーケンスをパックし、高い実行効率を達成することができます。さらに重要なことは、トレーニングデータのランダム化が改善され、ナイーブなデータパッキングと比較して1〜2%の精度向上が得られることです。これにより、Microsoft Researchの音声認識グループが会話音声認識(https://arxiv.org/pdf/1610.05256.pdf)で人間と同等の精度を達成するのに役立ちました。
理由3:APIデザイン
TensorFlowはもともと小さなC ++コアAPIを持つように設計されており、そのほとんどの機能はPythonで実装されています。これは確かに利点があります。なぜなら、Pythonで書く方がはるかに簡単で、更新がより速いからです。しかし同時に様々な欠点があります。私たちはすでに実行速度の遅さについては指摘しました。さらに、実際の多くのアプリケーションでは、アプリケーション自体がC ++で記述され、Pythonコードを埋め込むことは必ずしも可能ではないため、実行時に厳しい制限が付きます。TensorFlow 1.0では、広範なC ++ APIがリリースされましたが、実行速度はやや低速です。
当初から、深層学習モデルの評価だけがアプリケーションの重要な部分ではないと考えています。モデルをトレーニングする際は、OfficeやWindowsなどのインテリジェントアプリケーションとも密接に連携する場合があります。CNTKはほとんどすべての機能がC++ で記述されています。これにより、非常に高速になるだけでなく、あらゆるアプリケーションに統合可能なC ++ APIとして使用できるようになります。また、CNTKにPython、R、Javaなどのバインディングを追加することも非常に簡単です。
また、CNTKのPython APIには、低水準実装と高水準実装の両方が含まれていることも重要です。高水準のPython APIは、関数型プログラミングのパラダイムで設計されており、特に、再帰ニューラルネットワークを扱う場合は、非常にコンパクトで直感的です。これは、TensorFlowのPython APIとは対照的です。これは、ほとんどの人に低水準すぎるとみなされています。TensorFlowユーザーは、TensorFlow SlimやSonnetなどのサードパーティ製の高水準APIを使用してギャップを埋めていますが、選択肢が多すぎるため使いにくくなっています。
理由4:スケーラビリティ
最近の深層学習の課題では、数十億個の訓練サンプルを処理する必要がある場合があります。複数のGPUと複数のマシンを利用できる必要があります。TensorFlowなどのツールキットは、1台のマシン上で複数のGPUを処理できます。しかし、複数のマシンにまたがって拡張する必要がある場合、実行するには複雑すぎることがよくあります。
それに対して、分散型トレーニングは常にCNTKの強力なセールスポイントです。CNTKリポジトリの多くの例に見られるように、トレーニングスクリプトを単一のGPUから複数のマシンにまたがる複数のGPUに変更するのは、ほんの数行の変更です。マイクロソフトの内部では、CNTKは数多くのマシン上の何百ものGPUでタスクを訓練するために使用されてきました。私たちは、1ビットSGD (https://research.microsoft.com/apps/pubs/?id=230137)やBlock-Momentum SGD(https://www.microsoft.com/en-us/research/publication/scalable-training-deep-learning-machines-incremental-block-training-intra-block-parallel-optimization-blockwise-model-update-filtering/) など並列トレーニングについてのもっとも革新的な仕組みを発明しました。これらのアルゴリズムにより、ハイパーパラメーターの調整が大幅に改善し、Microsoft Researchが行った会話型音声認識のブレークスルーなど、より短期間で優れたモデルの構築につながりました。(https://arxiv.org/pdf/1610.05256.pdf)
理由5:推論
TensorFlowはサービングについてとても素敵な話をしています。複数のモデルバージョンをサポートし、サービング用に最適化されたモデルを保存し、同じモデル内に複数のメタグラフを保存して、さまざまなデバイスをサポートし、ユーザーカスタマイズ プラグインをサポートします。XLA AoTコンパイルにより、TensorFlow はモデルを実行可能形式に変換することができます。これにより、モバイルおよび組み込みデバイスのモデルサイズと待ち時間が大幅に短縮されます。
TensorFlowと比較して、CNTKはCNTK Evalをユーザーアプリケーションに直接統合することに重点を置いています。PythonとC ++のほかに、CNTKは推論のためのC#/ .NET APIを提供しています。C#/.NET APIは、パフォーマンスオーバーヘッドを最小限に抑えてC ++ API上に直接構築されています。Java APIはもう間もなく利用可能になります。.NETアプリケーションを構築しており、推論のための深層学習ツールキットを選択したい場合、CNTKはTensorFlowよりはるかに自然な選択です。
CNTKは、メモリオーバーヘッドが非常に限られた複数の要求の並列評価もサポートしています。これは、Webアプリケーションなどのサービス環境にモデルを展開する場合に大きな利点をもたらします。エッジデバイスの場合、CNTKはIntelプラットフォームとARMプラットフォームの両方をサポートします。
理由6:拡張性
TensorFlowは非常に柔軟なツールキットであり、ほとんどすべてのモデルを実装できます。しかし、あなたが現在のCaffeユーザーであれば対象外です。CaffeスクリプトをTensorFlowに変換する簡単な方法はありません。最初からすべてを書き直す方法以外にはありません。同様に、他の誰かが発明し、別のツールキットで書かれた新しいレイヤーを試したい場合は、自分自身で実装するか、誰かがあなたのために実装するのを待つかのいずれかです。
CNTKはこのような制限がないため、おそらく最も拡張性の高いツールキットです。UserFunctionsを通して、どの演算子も純粋なPythonで実装できます。NumPy配列をコアCNTKとPythonバインディングとの間のインターフェイスとして使用すると、順方向パスと逆方向パスを実装するだけで、新しく作成された演算子をすぐにグラフに配置できます。さらに、他のツールキットのグラフ実行をCNTK UserFunctionに配置して、実験フェーズを大幅に高速化することも簡単です。
同じことが勾配更新アルゴリズムにも当てはまります。CNTKはRMSPropやAdamのようなほとんどのアルゴリズムをそのまま使用できますが、純粋なPythonでは新しい学習アプローチを自由に実装することができます。
理由7:ビルトインリーダー
深層学習は、多くの訓練データがあるときに威力を発揮します。一部のアプリケーションでは、データが非常に大きいためRAMに収まらない場合があります。データがRAMに収まっていても、慣れないトレーニングループは、RAMからGPUにデータを転送するのに多くの時間を費やします。CNTKのビルトインリーダーは、データをRAMに収める必要なく、データセットを繰り返し処理するための高性能な機能を提供することで、上記のすべての問題を解決します。これらは、単一のディスクまたはHDFSなどの分散ファイルシステムのいずれかで使用できます。プリフェッチは広範囲に使用されるため、GPUは常にストールすることなく使用されます。CNTKのリーダーは、基礎となるデータセットがシャッフルされていなくても、モデルが常に適切にシャッフルされた順番でデータを受け取り(コンバージェンスを改善する)ことを保証することもできます。最後に、これらすべての仕組みは現在および将来のすべてのリーダーで利用可能です。エキゾチックなファイル形式のためのリーダーを書くとしても、あなたは自分で先読みを実装することについて心配する必要はありません。
この記事の締めくくりとしてお話しすると、CNTKを採用すると、Bing、Cortana、WindowsなどのMicrosoft製品グループで使用されているものとまったく同じツールキットを使用することになることを約束します。あなたのCNTKへの貢献を歓迎します。一緒にAIを本当に民主化するための深層学習ツールキットにしていきましょう。
この文章は以下の原文を翻訳したものです: