VOE を使用したプログラミング - 3.5 日本語

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

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

ONNX ランタイム

AMD の DPU を使用する AI 推論のハードウェア アクセラレーション用に Vitis AI 実行プロバイダー (Vitis AI EP) が提供されます。これを使用すると、量子化した ONNX モデルをターゲット ボード上で直接実行できます。現在 ONNX ランタイムに含まれる Vitis AI EP は、Zynq UltraScale+ MPSoCVersalVersalAI エッジ、および Kria カードなどのエンベデッド デバイス上でニューラル ネットワーク モデルの推論を高速化できます。

Vitis AI ONNXRuntime Engine (VOE) は、Vitis AI EP の実装ライブラリとして機能します。

図 1. VOE の概要

機能

  • ONNX Opset バージョン 18、ONNX Runtime 1.16.0 および ONNX バージョン 1.13 をサポート
  • C++ および Python API (Python バージョン 3 をサポート)
  • ACL EP などのその他の実行プロバイダーの組み込みをサポートすることで、Vitis AI EP に加えて AMD DPU での推論アクセラレーションが可能
  • ARM64 Cortex®-A72 コアでの演算をサポート。VAI3.5 でサポートされるターゲットは VEK280

利点

  • 汎用性: 追加の演算子用にほかの実行プロバイダー ( Arm® NN や Arm® ACL など) を使用しながら、AMD DPU 上でサブグラフを運用できます。この柔軟性により、ターゲット ボードで直接サポートされていないモデルも運用が可能です。
  • 性能の向上: 特定の演算子には AMD DPU など専用の実行プロバイダーを使用し、その他の演算子には別の実行プロバイダーを使用することにより、個々のモデルに最適化した性能を達成できます。
  • 展開モデルサポート: ONNX Runtime の改良により、DPU でネイティブにサポートされない演算子を使用したモデルも運用が可能です。追加の実行プロバイダーを組み込むと、ONNX Model Zoo で提供されるものを含め、多くのモデルを実行できます。

Runtime のオプション

Vitis AI ONNX Runtime にはコンパイラが統合されており、このコンパイラでモデル グラフと重みをマイクロコード形式の実行ファイルとしてコンパイルします。この実行ファイルをターゲット アクセラレータ上で運用します。

ONNX Runtime セッションの開始中にモデルがコンパイルされますが、このコンパイル プロセスは 1 回目の推論パスの前に完了する必要があります。コンパイルにかかる時間はさまざまですが、数分かかる場合があります。モデルがコンパイルされると、実行モデルがキャッシュされます。以降の推論実行では、キャッシュされた実行モデルを使用できます。

次の表に、推論セッションの設定に使用する Runtime の変数を示します。config_file は必須の変数で、これを使用してコンフィギュレーション ファイルの場所を設定する必要があります。変数 cacheDircacheKey はオプションです。

表 1. Runtime の変数
Runtime の変数 デフォルト値 詳細

config_file

"" 必須。コンフィギュレーション ファイルのパスです。コンフィギュレーション ファイル vaip_config.json は Vitis_ai_2023.1-r3.5.0.tar.gz に含まれます。
cacheDir

/tmp/{user}/vaip/.cache/

オプション。キャッシュ ディレクトリ

cacheKey

{onnx_model_md5}

オプション。モデルの種類を区別するために使用するキャッシュ キー。

最終的なキャッシュ ディレクトリは {cacheDir}/{cacheKey} です。また、環境変数を設定して Vitis AI EP をカスタマイズすることもできます。

表 2. 環境変数

環境変数

デフォルト値

詳細

XLNX_ENABLE_CACHE

1

キャッシュを使用するかどうかを設定します。0 の場合、キャッシュ内にある実行ファイルを無視してモデルが再コンパイルされます。

XLNX_CACHE_DIR

/tmp/$USER/vaip/.cache/{onnx_model_md5}

オプション。キャッシュのパスを設定します。

インストールと運用

Vitis AI 3.5 には、ONNX ランタイムをベースにした 10 個以上の運用例が用意されています。サンプルは、https://github.com/Xilinx/Vitis-AI/tree/v3.5/examples/vai_library/samples_onnx にあります。次に、VOE を使用して ONNX モデルを運用する手順を示します。

  1. ONNX 形式で量子化されたモデルを用意します。Vitis AI クオンタイザーを使用してモデルを量子化し、量子化されたモデルを ONNX フォーマットで出力します。
  2. ONNX Runtime パッケージ vitis_ai_2023.1-r3.5.0.tar.gz をダウンロードして、ターゲット ボードにインストールします。
    tar -xzvf vitis_ai_2023.1-r3.5.0.tar.gz -C /
    次に、voe-0.1.0-py3-none-any.whlonnxruntime_vitisai-1.16.0-py3-none-any.whl をダウンロードします。デバイスがオンラインであることを確認し、これらをオンラインでインストールします。
    pip3 install voe*.whl
    pip3 install onnxruntime_vitisai*.whl
  3. Vitis AI 3.5 では、ONNX Runtime の C++ API と Python API がサポートされます。ONNX Runtime API の詳細は、https://onnxruntime.ai/docs/api/ を参照してください。次に、C++ API を使用した ONNX モデルの運用コード スニペットを示します。

    C++ の例

    // ...
    #include <experimental_onnxruntime_cxx_api.h>
    // include user header files
    // ...
    
    auto onnx_model_path = "resnet50_pt.onnx"
    Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "resnet50_pt");
    auto session_options = Ort::SessionOptions();
    
    auto options = std::unorderd_map<std::string,std::string>({});
    options["config_file"] = "/etc/vaip_config.json";
    // optional, eg: cache path : /tmp/my_cache/abcdefg // Replace abcdefg with your model name, eg. onnx_model_md5
    options["cacheDir"] = "/tmp/my_cache";
    options["cacheKey"] = "abcdefg"; // Replace abcdefg with your model name, eg. onnx_model_md5
    
    // Create an inference session using the Vitis AI execution provider
    session_options.AppendExecutionProvider("VitisAI", options);
    
    auto session = Ort::Experimental::Session(env, model_name, session_options);
    
    auto input_shapes = session.GetInputShapes();
    // preprocess input data
    // ...
    
    // Create input tensors and populate input data
    std::vector<Ort::Value> input_tensors;
    input_tensors.push_back(Ort::Experimental::Value::CreateTensor<float>(
    input_data.data(), input_data.size(), input_shapes[0]));
    
    auto output_tensors = session.Run(session.GetInputNames(), input_tensors,
    session.GetOutputNames());
    // postprocess output data
    // ...

    Python API を使用する場合は、次のサンプルをリファレンスとして使用してください。

    
    import onnxruntime
    
    # Add other imports
    # ...
    
    # Load inputs and do preprocessing
    # ...
    
    # Create an inference session using the Vitis-AI execution provider
    
    session = onnxruntime.InferenceSession(
    '[model_file].onnx',
    providers=["VitisAIExecutionProvider"],
    provider_options=[{"config_file":"/etc/vaip_config.json"}])
    
    input_shape = session.get_inputs()[0].shape
    input_name = session.get_inputs()[0].name
    
    # Load inputs and do preprocessing by input_shape
    input_data = [...]
    result = session.run([], {input_name: input_data})
  4. build.sh ファイルを作成するか、Vitis AI ライブラリの ONNX サンプルから 1 つをコピーして、それを変更します。次に、プログラムをビルドします。
    result=0 && pkg-config --list-all | grep opencv4 && result=1
    if [ $result -eq 1 ]; then
    	OPENCV_FLAGS=$(pkg-config --cflags --libs-only-L opencv4)
    else
    	OPENCV_FLAGS=$(pkg-config --cflags --libs-only-L opencv)
    fi
    
    lib_x=" -lglog -lunilog -lvitis_ai_library-xnnpp -lvitis_ai_library-model_config -lprotobuf -lxrt_core -lvart-xrt-device-handle -lvaip-core -lxcompiler-core -labsl_city -labsl_low_level_hash -lvart-dpu-controller -lxir -lvart-util -ltarget-factory -ljson-c" 
    lib_onnx=" -lonnxruntime" 
    lib_opencv=" -lopencv_videoio -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc -lopencv_core " 
    
    if [[ "$CXX"  == *"sysroot"* ]];then
     inc_x="-I=/usr/include/onnxruntime -I=/install/Release/include/onnxruntime -I=/install/Release/include -I=/usr/include/xrt"
     link_x="  -L=/install/Release/lib"
    else
     inc_x=" -I/usr/include/onnxruntime  -I/usr/include/xrt"
     link_x="  "
    fi
    
    name=$(basename $PWD)
    
    CXX=${CXX:-g++}
    $CXX -O2 -fno-inline -I. \
     ${inc_x} \
     ${link_x} \
     -o ${name}_onnx -std=c++17 \
     $PWD/${name}_onnx.cpp \
     ${OPENCV_FLAGS} \
     ${lib_opencv} \
     ${lib_x} \
     ${lib_onnx} 
  5. プログラムの実行ファイルと量子化した ONNX モデルをターゲットにコピーします。次に、プログラムを実行します。
    注記: ONNX モデルの運用では、入力モデルは量子化された ONNX モデルです。環境変数 WITH_XCOMPILER が ON の場合、プログラムを実行すると、まずモデルがオンラインでコンパイルされます。モデルのコンパイルには時間がかかることがあります。