インストールと運用 - 3.5 日本語

Vitis AI ライブラリ ユーザー ガイド (UG1354)

Document ID
UG1354
Release Date
2023-06-29
Version
3.5 日本語
Vitis AI 3.5 では、ONNX Runtime に基づく運用サンプルが 10 個以上提供されています。サンプルは samples_onnx フォルダーにあります。Vitis AI を使用して ONNX モデルを運用するには、次の手順に従います。
  1. git を使用して、https://github.com/Xilinx/Vitis-AI から対応する Vitis AI ライブラリをコピーします。
  2. ホスト側にクロス コンパイル システムをインストールします。手順は、インストール を参照してください。
  3. ONNX 形式で量子化されたモデルを用意します。Vitis AI クオンタイザーを使用してモデルを量子化し、量子化されたモデルを ONNX フォーマットで出力します。
  4. 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
  5. Vitis AI 3.5 では、ONNX Runtime の C++ API と Python API が両方サポートされます。ONNX Runtime API の詳細は、ONNX Runtime API docs を参照してください。次に、C++ API を使用した ONNX モデルの運用コード スニペットを示します。
    // ...
    #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})
  6. 次に示すように 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 " 
    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" 
    
    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} 
  7. プログラムをクロス コンパイルします。
    sh -x build.sh
  8. scp コマンドを使用して、プログラムの実行ファイルと量子化した ONNX モデルをターゲット ボードにコピーします。
  9. ターゲット ボード上でプログラムを実行します。プログラムを実行する前に、ターゲット ボードに Vitis AI ライブラリがインストールされていることを確認して、テストするイメージを準備します。
    ./resnet50_onnx <Onnx model> <image>
    注記: ONNX モデルの運用では、入力モデルは量子化された ONNX モデルです。環境変数 WITH_XCOMPILER が ON の場合、プログラムを実行すると、まずモデルがオンラインでコンパイルされます。モデルのコンパイルには時間がかかることがあります。