カスタマイズされたアクセラレータ用のコンパイル - 3.5 日本語

Vitis AI ユーザー ガイド (UG1414)

Document ID
UG1414
Release Date
2023-09-28
Version
3.5 日本語

XIR ベースのコンパイラは、深層学習フレームワークから生成される、フレームワークに依存しない XIR グラフのコンテキスト内で動作します。パーサーは CNN モデルからフレームワーク固有の属性を削除し、モデルを XIR ベースの計算グラフに変換します。コンパイラは、計算グラフをさまざまなサブグラフに分割し、ヘテロジニアスな最適化を利用して、各サブグラフ用に最適化されたマシン コードを生成します。

図 1. コンパイル フロー

DPU でサポートされない演算子がモデルに含まれている場合は、いくつかのサブグラフが作成されて CPU にマップされます。FPGA は処理能力が高いため、特定の IP を作成してこれらの演算子の実行を高速化し、エンドツーエンドのパフォーマンスを向上させることができます。XIR ベースのツールチェーンを使用して、カスタマイズされたアクセラレーション IP を有効にするには、プラグインと呼ばれるパイプラインを利用して XIR とコンパイラを拡張します。

インターフェイス クラスのプラグインは、Plugin.hpp 内で宣言されます。コンパイラが DPU 用のグラフのコンパイルを開始する前に、プラグインが順番に実行されます。最初に、演算子ごとに子サブグラフが作成され、高速化する演算子がプラグインによって選択されます。次に、これらのサブグラフは大きなサブグラフに結合され、カスタマイズ IP にマップされて、ランタイム (VART::Runner) 用の必要な情報 (サブグラフに関する指示など) が追加されます。

プラグインの実装

  1. Plugin::partition() を実装します。

    std::set<xir::Subgraph*> partition(xir::Graph* graph) で、目的の演算子を選択し、次のヘルパー関数を使用してこれらをデバイス レベルのサブグラフにマージします。

    • xir::Subgraph* filter_by_name(xir::Graph* graph, const std::string& name) は、特定の名前を持つサブグラフを返します。
    • std::set<xir::Subgraph*> filter_by_type(xir::Graph* graph, const std::string& type) は、特定のタイプの詳細サブグラフを返します。
    • std::set<xir::Subgraph*> filter_by_template(xir::Graph* graph, xir::GraphTemplate* temp) は、特定の構造を持つサブグラフを返します。
      図 2. テンプレートによるフィルタリング
    • std::set<xir::Subgraph*> filter(xir::Graph* graph, std::function<std::set<xir::Subgraph*>(std::set<xir::Subgraph*>)> func) により、カスタマイズ関数によってサブグラフをフィルタリングできます。この手法は、コンパイルされていないサブグラフをすべて見つけるのに役立ちます。

    子サブグラフをマージするには、ヘルパー関数 merge_subgraph() を使用します。ただし、この関数が結合できるのは、同じレベルのサブグラフのみです。サブグラフのリストを 1 つのサブグラフに結合できない場合、ヘルパー関数は可能な限りそのリストを結合します。

  2. Plugin::partition() 関数で選択したサブグラフの名前、デバイス、およびランナーを指定します。
  3. Plugin::compile(xir::Subgraph*) を実装します。この関数は、partition() 関数が返すすべてのサブグラフについて呼び出されます。ランタイム用のサブグラフに情報を追加できます。

プラグインの構築

外部 get_plugin() 関数を作成し、共有ライブラリ内にインプリメンテーションを構築します。

extern "C" plugin* get_plugin() { return new YOURPLUGIN(); }

プラグインの使用

vai_c コマンド ライン オプションで --options '{"plugins": "plugin0,plugin1"}' を使用して、プラグイン ライブラリをコンパイラに渡します。プラグインを実行すると、コンパイラはライブラリを開き、「get_plugin」という名前の外部関数をロードすることにより、プラグインのインスタンスを作成します。2 つ以上のプラグインを指定した場合、プラグインはコマンド ライン オプションで指定した順番で実行されます。すべてのプラグインがインプリメントされた後、DPU および CPU 用のコンパイルが実行されます。

Samples

サンプルは、https://github.com/Xilinx/Vitis-AI/tree/v3.5/src/vai_runtime/plugin-samples を参照してください。