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 执行提供程序示例。