Vitis AI 執行提供程式
Vitis AI 是 AMD 針對在 AMD 平臺(包括 Ryzen AI、AMD 自適應 SoC 和 Alveo 資料中心加速卡)上進行硬體加速 AI 推理而開發的堆疊。
目錄
要求
下表列出了 Vitis AI ONNX Runtime 執行提供程式支援的 AMD 目標。
| 架構 | 系列 | 支援的目標 | 支援的作業系統 |
|---|---|---|---|
| AMD64 | Ryzen AI | 帶 NPU 的 AMD Ryzen 處理器 | Windows |
| Arm® Cortex®-A53 | Zynq UltraScale+ MPSoC | ZCU102, ZCU104, KV260 | Linux |
| Arm® Cortex®-A72 | Versal AI Core / Premium | VCK190 | Linux |
| Arm® Cortex®-A72 | Versal AI Edge | VEK280 | Linux |
有關帶 NPU 的 AMD Ryzen 處理器完整列表,請參閱處理器規格頁面(查詢表格右側的“AMD Ryzen AI”列,並從下拉選單中選擇“Available”)。
AMD 自適應 SoC 開發者也可以利用 Vitis AI ONNX Runtime 執行提供程式來支援自定義(晶片級)設計。
安裝
針對 AMD Ryzen AI 處理器的安裝
要在 Microsoft Windows 中啟用針對 AMD Ryzen AI 處理器的 Vitis AI ONNX Runtime 執行提供程式,開發者必須安裝 Ryzen AI 軟體。有關如何下載和安裝 Ryzen AI 軟體的詳細說明,請訪問:https://ryzenai.docs.amd.com/en/latest/inst.html
有關針對 AMD Ryzen AI 處理器的完整示例,開發者應參考 RyzenAI-SW Github 儲存庫。
針對 AMD 自適應 SoC 的安裝
對於 AMD 自適應 SoC 目標,提供了預構建包以在嵌入式 Linux 上部署 ONNX 模型。使用者應參考標準的 Vitis AI 目標設定說明,以在目標上啟用 Vitis AI。在目標上啟用 Vitis AI 後,開發者可以參考 Vitis AI 文件的此部分以獲取安裝和 API 詳細資訊。
有關針對 AMD 自適應 SoC 的完整示例,開發者應參考 ONNX Runtime Vitis AI 執行提供程式示例。
構建
要從原始碼構建 Ryzen AI Vitis AI ONNX Runtime 執行提供程式,請參考構建說明。
量化
量化是將高精度權重/啟用對映到較低精度格式,同時保持模型準確性的過程。此技術提高了模型在 NPU 裝置上部署的計算和記憶體效率。它可以在訓練後應用,允許在不需要重新訓練的情況下最佳化現有模型。
Vitis AI EP 支援量化為 INT8 或 BF16 格式的輸入模型。
Ryzen AI 模型的量化可以使用 AMD Quark 量化器、Vitis AI 量化器或 Olive 完成。
AMD Quark
AMD Quark 是一個全面的跨平臺深度學習工具包,旨在簡化和增強深度學習模型的量化。Quark 支援 PyTorch 和 ONNX 模型,使開發者能夠最佳化其模型以部署到各種硬體後端,在不損害準確性的前提下實現顯著的效能提升。
有關完整詳細資訊,請參閱 Ryzen AI 的 AMD Quark 文件。
Vitis AI 量化器
Vitis AI 量化器支援 PyTorch、TensorFlow 和 ONNX 模型的量化。
提供了 Pytorch、Tensorflow 2.x 和 Tensorflow 1.x docker 映象,以支援 PyTorch 和 TensorFlow 模型的量化。為了支援 Vitis AI ONNX Runtime 執行提供程式,Vitis AI 量化器提供了一個選項,可在量化後以 ONNX 格式匯出量化模型。
有關完整詳細資訊,請參閱 Vitis AI 關於模型量化的文件。
Olive
對 Microsoft Olive 的實驗性支援也已啟用。Vitis AI 量化器已作為外掛整合到 Olive 中並將被上游。完成後,使用者可以參考 Olive Vitis AI 示例目錄中提供的示例。
執行時選項
Vitis AI ONNX Runtime 集成了一個編譯器,它將模型圖和權重編譯成微編碼的可執行檔案。此可執行檔案部署到目標加速器(Ryzen AI NPU 或 Vitis AI DPU)。
模型在 ONNX Runtime 會話啟動時編譯,並且必須在第一次推理透過之前完成編譯。編譯所需的時間各不相同,但可能需要幾分鐘才能完成。模型編譯完成後,模型可執行檔案將被快取,後續推理執行可以選擇使用快取的可執行模型(詳情如下)。
下表概述了可用於配置推理會話的提供程式選項和環境變數。
有關如何在 AMD Ryzen AI 處理器上配置 BF16 和 INT8 模型推理會話的詳細說明,請參閱 Ryzen AI 軟體文件
| 提供程式選項 | 預設值 | 詳細資訊 |
|---|---|---|
| cache_dir | Linux: “/tmp/{使用者}/vaip/.cache/” Windows: “C:\temp\{使用者}\vaip\.cache” | 可選,快取目錄 |
| cache_key | {onnx_model_md5} | 可選,快取鍵,用於區分不同模型。 |
| log_level | “error” | 有效值為 info、warning、error 和 fatal |
最終快取目錄是 {cache_dir}/{cache_key}。請參考以下 C++ 示例瞭解用法。
Ryzen AI API 示例
要利用 C++ API,請使用以下示例作為參考
// ...
#include <onnxruntime_cxx_api.h>
// include user header files
// ...
std::basic_string<ORTCHAR_T> model_file = "resnet50.onnx" // Replace resnet50.onnx with your model name
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "resnet50_pt");
auto session_options = Ort::SessionOptions();
auto options = std::unorderd_map<std::string,std::string>({});
// optional, eg: cache path : /tmp/my_cache/abcdefg // Replace abcdefg with your model name, eg. onnx_model_md5
options["cache_dir"] = "/tmp/my_cache";
options["cache_key"] = "abcdefg"; // Replace abcdefg with your model name, eg. onnx_model_md5
options["log_level"] = "info";
// Create an inference session using the Vitis AI execution provider
session_options.AppendExecutionProvider_VitisAI(options);
auto session = Ort::Session(env, model_file.c_str(), session_options);
// get inputs and outputs
Ort::AllocatorWithDefaultOptions allocator;
std::vector<std::string> input_names;
std::vector<std::int64_t> input_shapes;
auto input_count = session.GetInputCount();
for (std::size_t i = 0; i < input_count; i++) {
input_names.emplace_back(session.GetInputNameAllocated(i, allocator).get());
input_shapes = session.GetInputTypeInfo(i).GetTensorTypeAndShapeInfo().GetShape();
}
std::vector<std::string> output_names;
auto output_count = session.GetOutputCount();
for (std::size_t i = 0; i < output_count; i++) {
output_names.emplace_back(session.GetOutputNameAllocated(i, allocator).get());
}
// Create input tensors and populate input data
std::vector<Ort::Value> input_tensors;
...
auto output_tensors = session.Run(Ort::RunOptions(), input_names.data(), input_tensors.data(),
input_count, output_names.data(), output_count);
// postprocess output data
// ...
要利用 Python API,請使用以下示例作為參考
import onnxruntime
# Add user 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=[{"log_level": "info"}])
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})
有關針對 AMD Ryzen AI 處理器的完整示例,開發者應參考 RyzenAI-SW Github 儲存庫。
有關針對 AMD 自適應 SoC 的完整示例,開發者應參考 ONNX Runtime Vitis AI 執行提供程式示例。