Vitis AI 执行提供者
Vitis AI 是 AMD 的开发堆栈,用于在 AMD 平台(包括 Ryzen AI、AMD Adaptable SoCs 和 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 Adaptable 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 Adaptable SoCs 安装
对于 AMD Adaptable SoC 目标,提供了一个预构建软件包,用于在嵌入式 Linux 上部署 ONNX 模型。用户应参考标准的 Vitis AI 目标设置说明以在目标设备上启用 Vitis AI。一旦在目标设备上启用了 Vitis AI,开发者可以参考 Vitis AI 文档的本节以获取安装和 API 详细信息。
对于针对 AMD Adaptable SoCs 的完整示例,开发者应参考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 Quantizer 提供了一个选项,可以在量化后以 ONNX 格式导出量化模型。
有关完整详细信息,请参考Vitis AI 文档中关于模型量化的部分。
Olive
还启用了对 Microsoft Olive 的实验性支持。Vitis AI Quantizer 已集成到 Olive 中作为插件,并将被上游化。完成后,用户可以参考 Olive Vitis AI 示例目录中提供的示例。
运行时选项
Vitis AI ONNX Runtime 集成了一个编译器,可将模型图和权重编译为微码可执行文件。此可执行文件部署在目标加速器(Ryzen AI NPU 或 Vitis AI DPU)上。
在启动 ONNX Runtime 会话时编译模型,并且必须在第一次推理传递之前完成编译。编译所需的时间各不相同,但可能需要几分钟才能完成。模型编译完成后,模型可执行文件会被缓存,对于后续的推理运行,可以选择使用缓存的可执行模型(详细信息如下)。
下表概述了可用于配置推理会话的提供者选项和环境变量。
有关如何在 AMD Ryzen AI 处理器上为 BF16 和 INT8 模型配置推理会话的详细说明,请参考Ryzen AI 软件文档
运行时变量 | 详细信息 |
---|---|
config_file | 传递某些编译特定选项的配置文件。BF16 模型必需。 |
xclbin | 指定 NPU 配置的 NPU 二进制文件。INT8 模型必需。 |
cache_dir | 缓存目录的路径和名称。可选。 |
cache_key | 缓存目录中存储编译模型的子文件夹。可选。 |
encryptionKey | 用于在缓存文件夹中生成加密编译模型的 256 位密钥。可选。 |
环境变量 | 详细信息 |
---|---|
XLNX_ENABLE_CACHE | 是否使用缓存,如果为 0,则忽略缓存的可执行文件,模型将重新编译。 |
XLNX_VART_FIRMWARE | 指定 NPU 二进制文件的传统方法。已被 xclbin 提供者选项取代。INT8 模型必需。 |
XLNX_TARGET_NAME | DPU 目标名称。在 Adaptable SoCs 上,如果未设置,将自动读取 DPU 目标名称;在 Windows 上,默认值为“AMD_AIE2_Nx4_Overlay”,这是 IPU 的 DPU 目标名称。 |
Ryzen AI API 示例
要利用 C++ API,请参考以下示例
// ...
#include <experimental_onnxruntime_cxx_api.h>
// include user header files
// ...
auto onnx_model_path = "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>({});
options["xclbin"] = "/path/to/AMD_AIE2P_Nx4_Overlay.xclbin"; // Required. Specify full path to the appropriate NPU binary file.
options["cache_dir"] = "/tmp/my_cache"; // Optional
options["cache_key"] = "my_model_subfolder"; // Optional
// 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 user imports
# ...
# Load inputs and do preprocessing
# ...
# Create an inference session using the Vitis AI execution provider
providers = ['VitisAIExecutionProvider']
provider_options = [{
'xclbin': '/path/to/AMD_AIE2P_Nx4_Overlay.xclbin', # Required. Specify full path to the appropriate NPU binary file.
'cache_dir': '/tmp/my_cache', # Optional
'cache_key': 'my_model_subfolder', # Optional
}]
session = ort.InferenceSession(
"resnet50.onnx", # Replace resnet50.onnx with your model name
providers=providers,
provider_options=provider_options
)
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 Adaptable SoCs 的完整示例,开发者应参考ONNX Runtime Vitis AI 执行提供者示例。