Vitis AI 3.5 では、ONNX Runtime に基づく運用サンプルが 10 個以上提供されています。サンプルは samples_onnx フォルダーにあります。Vitis AI を使用して ONNX モデルを運用するには、次の手順に従います。
- git を使用して、https://github.com/Xilinx/Vitis-AI から対応する Vitis AI ライブラリをコピーします。
- ホスト側にクロス コンパイル システムをインストールします。手順は、インストール を参照してください。
- ONNX 形式で量子化されたモデルを用意します。Vitis AI クオンタイザーを使用してモデルを量子化し、量子化されたモデルを ONNX フォーマットで出力します。
- 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.whl と onnxruntime_vitisai-1.16.0-py3-none-any.whl をダウンロードします。デバイスがオンラインであることを確認し、これらをオンラインでインストールします。
pip3 install voe*.whl pip3 install onnxruntime_vitisai*.whl
-
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})
- 次に示すように 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}
- プログラムをクロス コンパイルします。
sh -x build.sh
-
scp
コマンドを使用して、プログラムの実行ファイルと量子化した ONNX モデルをターゲット ボードにコピーします。 - ターゲット ボード上でプログラムを実行します。プログラムを実行する前に、ターゲット ボードに Vitis AI ライブラリがインストールされていることを確認して、テストするイメージを準備します。
./resnet50_onnx <Onnx model> <image>
注記: ONNX モデルの運用では、入力モデルは量子化された ONNX モデルです。環境変数WITH_XCOMPILER
が ON の場合、プログラムを実行すると、まずモデルがオンラインでコンパイルされます。モデルのコンパイルには時間がかかることがあります。