深層学習コンパイラの概要

       ディープラーニングの発展は、科学のさまざまな分野に大きな影響を与えています。自然言語処理 (NLP) やコンピューター ビジョン (CV) などの人工知能の分野で大きな価値を示しているだけでなく、電子商取引、スマート シティ、創薬などのより広範な応用分野でも大きな成功を収めています。畳み込みニューラル ネットワーク (CNN)、リカレント ニューラル ネットワーク (RNN)、長短期記憶 (LSTM)、敵対的生成ネットワーク (GAN) などのさまざまな深層学習モデルの出現により、さまざまな DL モデルのプログラミングが簡素化されています。広く普及することが重要であることを理解してください。

        産業界と学術界の継続的な努力により、さまざまな DL モデルの実装を簡素化するために、TensorFlow、PyTorch、MXNet、CNTK などのいくつかの人気のある DL フレームワークが提案されています。上記の DL フレームワークには、設計上のトレードオフに応じた利点と欠点がありますが、既存の DL モデル全体で新しい DL モデルをサポートする場合、冗長なエンジニアリングの労力を軽減するために相互運用性が非常に重要になります。相互運用性を提供するために、ONNX が提案されています。ONNX は、異なる DL フレームワーク間のモデル変換を容易にする DL モデルを表現するための統一フォーマットを定義します。

       DL ライブラリとツールの欠点に対処し、各 DL ハードウェアで DL モデルを手動で最適化する負担を軽減するために、DL コミュニティはドメイン固有のコンパイラの開発を推進しています。TVM、Tensor Comprehension、Glow、nGraph、XLA など、いくつかの人気のある DL コンパイラが産業界や学術界から提案されています。DL コンパイラは、DL フレームワークで記述されたモデル定義を入力として受け取り、さまざまな DL ハードウェア上で効率的なコード実装を出力として生成します。モデル定義と具体的なコード実装の間の変換は、モデル仕様とハードウェア アーキテクチャに対して高度に最適化されています。具体的には、レイヤーと演算演算子の融合 (Conv+BatchNorm など) などの DL 指向の最適化が組み込まれており、コード生成がより効率的になります。さらに、既存の DL コンパイラは、LLVM などの汎用コンパイラの成熟したツールチェーンも活用しており、さまざまなハードウェア アーキテクチャ間での移植性が向上しています。従来のコンパイラと同様に、DL コンパイラもフロントエンド、中間コード、バックエンドの階層設計を採用しています。ただし、DL コンパイラーの独自性は、マルチレベル IR の設計と DL 固有の最適化にあります。

  • 深層学習フレームワーク

図 1. 深層学習フレームワーク

図 1 は、現在人気のあるフレームワーク、歴史的なフレームワーク、ONNX によってサポートされているフレームワークを含む DL フレームワークの見通しを示しています。

TensorFlow :すべての DL フレームワークの中で、TensorFlow は、C++、Python、Java、Go、R、Haskell などの言語インターフェイスを最も包括的にサポートしています。TensorFlow 使用の複雑さを軽減するために、Google は TensorFlow コアのフロントエンドとして Keras を採用しました。

Keras : DL モデルを迅速に構築するための高レベルのニューラル ネットワーク ライブラリで、純粋な Python で書かれています。Keras 自体は DL フレームワークではありませんが、TensorFlow、MXNet、Theano、CNTK と統合される高レベルの API を提供します。Keras を使用すると、DL 開発者はわずか数行のコードでニューラル ネットワークを構築できます。ただし、Keras は過剰なカプセル化により柔軟性が十分ではなく、演算子の追加や低レベルのデータ情報の取得が非常に困難になります。

PyTorch : Facebook は、Lua ベースの DL フレームワーク Torch を Python で書き直し、すべてのモジュールを Tensor レベルでリファクタリングすることにより、PyTorch をリリースしました。最も人気のある動的フレームワークである PyTorch は、動的データフロー グラフを構築するためのプリミティブを Python に埋め込み、制御フローは Python インタープリターで実行されます。PyTorch 1.0 は、PyTorch 0.4 と Caffe2 のコード ベースを統合して、統一されたフレームワークを作成します。これにより、PyTorch は Caffe2 の利点を吸収して、効率的なグラフ実行とモバイル展開をサポートできるようになります。

Caffe/Caffe2 : Caffe は、深層学習と画像分類のためにカリフォルニア大学バークレー校によって設計されました。Caffe にはコマンド ライン、Python、MATLAB 用の API があります。Caffe はシンプルであるため、ソース コードを拡張しやすく、開発者による詳細な分析に適しています。したがって、Caffe は主に研究を指向しており、それが当初から今日まで人気を博しています。Caffe2 は、オリジナルの Caffe プロジェクトに基づいて構築されています。Caffe2 はコード構造が TensorFlow に似ていますが、その API は軽量であり、計算グラフ内の中間結果へのアクセスが容易です。

MXNET : MXNET は、Python、C++、R、Julia、Matlab、JavaScript などの複数の言語 API をサポートします。スケーラビリティを考慮して設計されており、データの読み込みと I/O の複雑さを軽減するという観点から設計されています。MXNet は、caffe や Tensorflow のような宣言型プログラミングと、PyTorch のような命令型プログラミングという、さまざまなパラダイムを提供します。CNTK : Python および C++ の API を通じて利用できます。または、独自のスクリプト言語 (つまり BrainScript) を使用することもできます。CNTK は使いやすく、作成しやすいように設計されており、実稼働環境で大規模なデータに対応できます。TensorFlow や Caffe に似た静的計算グラフを使用しており、DL モデルは有向グラフを介した一連の計算ステップとして表示されます。

Paddle-Paddle :元のデザインは Caffe に似ており、各モデルはレイヤーのセットとして表現できます。ただし、Paddle-Paddlev2 は TensorFlow の演算子の概念を参照しており、層をより詳細な演算子に分解するため、より複雑な DL モデルがサポートされます。また、paddle Fluid は、独自のインタープリターを提供するという点で PyTorch に似ており、Python インタープリターのパフォーマンスの制限を回避します。

ONNX : Open Neural Network Exchange (ONNX) はスケーラブルな計算グラフ モデルを定義しているため、さまざまな DL フレームワークによって構築された計算グラフを簡単に ONNX に変換できます。ONNX を使用すると、DL フレームワーク間でのモデルの変換が簡単になります。たとえば、開発者は MXNet モデルを構築し、PyTorch を使用してそのモデルを推論のために実行できます。図 1 に示すように、ONNX は PyTorch、MXNet、paddle などに統合されています。まだ直接サポートされていない一部の DL フレームワーク (TensorFlow や Keras など) については、ONNX によってコンバータが追加されます。

非推奨のフレームワーク: DL コミュニティの急速な発展により、多くの歴史的な DL フレームワークはもうアクティブではありません。たとえば、Torch は PyTorch に置き換えられました。Theano は最も古い DL フレームワークの 1 つであり、現在はメンテナンスされていません。Chainer は、動的計算グラフに最適なフレームワークでしたが、同様の特性を持つ MXNet、PyTorch、TensorFlow に置き換えられました。

  • 深層学習コンパイラのアーキテクチャ設計

DL コンパイラの一般的な設計アーキテクチャは、図 2 に示すように、主にフロント エンドとバック エンドの 2 つの部分で構成されます。中間コード (IR) はフロントエンドとバックエンドに分散されます。一般に、IR はプログラムの抽象化であり、プログラムの最適化に使用されます。具体的には、DL モデルは DL コンパイラでマルチレベル IR に変換されます。高レベル IR はフロントエンドに存在し、低レベル IR はバックエンドに存在します。コンパイラ フロントエンドは、ハードウェアに依存しない変換と最適化を担当する高レベルの IR に基づいています。基礎となる IR に基づいて、コンパイラー バックエンドはハードウェア固有の最適化、コード生成、およびコンパイルを担当します。

図 2. 一般的に採用されている DL コンパイラ設計アーキテクチャの概要

ハイレベル IR:グラフ IR とも呼ばれ、ハードウェアに依存しない計算と制御フローを表します。高レベル IR の設計上の課題は、さまざまな DL モデルをキャプチャして表現できる計算および制御フローの抽象化機能です。高レベル IR の目標は、オペレーターとデータ間の制御フローと依存関係を確立し、グラフレベルの最適化のためのインターフェースを提供することです。また、コンパイル用の豊富なセマンティック情報も含まれており、カスタム演算子の拡張性も提供します。

低レベル IR:特定のハードウェアの最適化と、さまざまなハードウェア ターゲット向けのコード生成用に設計されています。したがって、基盤となる IR は、ハードウェアの特性を反映し、ハードウェア固有の最適化を表現できるほど十分に粒度が細かい必要があります。また、コンパイラ バックエンドで Halide、多面体、LLVM などの成熟したサードパーティ ツールチェーンを使用できるようにする必要もあります。

フロントエンドは、既存の DL フレームワークから DL モデルを入力として取得し、そのモデルを計算グラフ表現に変換します (IR に示すように)。フロントエンドは、さまざまなフレームワークでさまざまな形式をサポートするために、さまざまな形式変換を実装する必要があります。計算グラフの最適化では、汎用コンパイラの最適化手法と DL 固有の最適化手法を組み合わせて、計算グラフの冗長性を削減し、計算効率を向上させます。この最適化は、ノード レベル (nop 除去や 0 次元テンソル除去など)、ブロック レベル (代数的単純化、演算子融合、演算子シンキングなど)、およびデータ フロー レベル (CSE、DCE、静的メモリ プランニング、レイアウト遷移)。フロントエンドの後、最適化された計算グラフが生成され、バックエンドに渡されます。

バックエンドは高レベル IR を低レベル IR に変換し、ハードウェア固有の最適化を実行します。一方で、高レベルの IR をサードパーティのツールチェーン (LLVM IR など) に直接変換して、汎用の最適化とコード生成に既存のインフラストラクチャを活用できます。一方、DL モデルとハードウェア特性の事前知識を利用して、カスタマイズされたコンパイル プロセスを通じてコードをより効率的に生成できます。一般的なハードウェアの最適化には、ハードウェアの内部マッピング、メモリの割り当てと取得、メモリ遅延の隠蔽、並列化、ループ指向の最適化が含まれます。大規模な最適化空間で最適なパラメータ設定を決定するために、既存の DL コンパイラは通常、自動スケジューリング (多面体など) と自動チューニング (AutoTVM など) の 2 つの方法を採用しています。

おすすめ

転載: blog.csdn.net/lily_19861986/article/details/131451815