Vitis AI 执行提供程序
Vitis AI 是 AMD 的开发堆栈,用于在 AMD 平台(包括 Ryzen AI、AMD Adaptable SoC 和 Alveo 数据中心加速卡)上进行硬件加速 AI 推理。 它由优化的 IP、工具、库、模型和示例设计组成。
此版本的 Vitis AI 执行提供程序支持加速针对 AMD Ryzen AI 和 Adaptable SoC 以及 Ryzen AI 的神经网络模型推理。
目录
要求
下表列出了 Vitis AI ONNX Runtime 执行提供程序支持的 AMD 目标。
架构 | 系列 | 支持的目标 | 支持的操作系统 |
---|---|---|---|
AMD64 | Ryzen AI | AMD Ryzen 7040U, 7040HS | 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 |
AMD Adaptable SoC 开发人员还可以利用 Vitis AI ONNX Runtime 执行提供程序来支持自定义(芯片级)设计。
Ryzen AI 演示
演示展示了 AMD 的 XDNA 技术的一个潜在应用。 鼓励新用户进行测试。
安装
AMD Adaptable SoC 安装
对于 AMD Adaptable SoC 目标,提供了一个预构建的软件包,用于在嵌入式 Linux 上部署 ONNX 模型。 用户应参考标准的 Vitis AI 目标设置说明,以在目标上启用 Vitis AI。 在目标上启用 Vitis AI 后,开发人员可以参考 Vitis AI 文档的此部分,了解安装和 API 详细信息。
有关更完整的示例,开发人员应参考 ONNX Runtime Vitis AI 执行提供程序示例。
Ryzen AI 安装
要在 Microsoft Windows 中启用 Vitis AI ONNX Runtime 执行提供程序,需要提供 .zip 存档。
开发人员可以参考Ryzen AI 文档的安装部分,获取更详细的说明。
此存档的内容如下
ryzen-ai-sw-1.0.zip
├── env.yaml
├── install.bat
├── quicktest
│ ├── image_0.png
│ ├── quicktest.py
│ ├── quicktest_random.py
│ ├── README.md
│ ├── requirements.txt
│ └── test_model.onnx
├── requirements_ryzenai_voe.txt
├── vai_q_onnx-1.16.0+be3c70b-py2.py3-none-any.whl
└── voe-4.0-win_amd64
├── 1x4.xclbin
├── 4x4.xclbin
├── aieml_gemm_asr.json
├── aieml_gemm_asr_qdq.json
├── aieml_gemm_asr_qdq.xclbin
├── aieml_gemm_asr.xclbin
├── aieml_gemm_vm_phx_4x4_bf16.json
├── aieml_gemm_vm_phx_4x4_bf16.xclbin
├── aieml_gemm_vm_phx_4x4.json
├── aieml_gemm_vm_phx_4x4.xclbin
├── flexml_vaiep
│ ├── binary-modules
│ │ └── ResNet.flexml
│ │ ├── 0
│ │ │ ├── ctrl_pkt0.bin
│ │ │ ├── ctrlPktPatch.json
│ │ │ ├── ctrl_pkts.xclbin
│ │ │ ├── flexmlrt-hsi.json
│ │ │ ├── ml_txn.bin
│ │ │ └── wts32.txt
│ │ ├── flexml_bm.signature
│ │ ├── libflexml_usermodel.dll
│ │ └── partition-info.json
│ ├── demo
│ │ ├── imagenet-classes.txt
│ │ ├── requirements.txt
│ │ ├── setup.bat
│ │ ├── test-single-image.py
│ │ ├── utils
│ │ │ ├── image_utils.py
│ │ │ ├── __init__.py
│ │ │ └── onnx.py
│ │ └── YellowLabradorLooking_new.jpg
│ ├── lib
│ │ └── flexmlrt.dll
│ ├── onnx-models
│ │ └── resnet50_v1_3_vaiq.onnx
│ └── README.md
├── installer.py
├── onnxruntime_vitisai-1.15.1-cp39-cp39-win_amd64.whl
├── vaip_config.json
├── voe-0.1.0-cp39-cp39-win_amd64
│ ├── onnxruntime.dll
│ └── onnxruntime_vitisai_ep.dll
└── voe-0.1.0-cp39-cp39-win_amd64.whl
注意: 此版本未启用 Ryzen AI Linux 支持。
C++ 和 Python API 均受支持。 以下说明假定您已在 Windows RyzenAI 目标上安装了 ONNX Runtime。 安装 Vitis AI ONNX Runtime 引擎的步骤如下
1. 验证先决条件
- Visual Studio = 2019
- cmake (版本 >= 3.26)
- python (版本 >= 3.9)(推荐使用 Python 3.9.13 64 位)
- AMD IPU 驱动程序 = 10.1109.8.100 已安装
2. 准备安装文件
- 下载 Ryzen AI 软件包。
- 解压
ryzen-ai-sw-1.0.zip
。 - 进入
voe-4.0-win_amd64
ONNX runtime 文件夹。
3. 安装 C++ 库
注意: 这是一个可选步骤,仅当您打算使用 C++ API 时才需要。
- 将 DLL 文件从解压后的存档的
voe-0.1.0-cp39-cp39-win_amd64
子目录复制到C:\Program Files\onnxruntime\bin
,(即copy voe-0.1.0-cp39-cp39-win_amd64\*.dll C:\Program Files\onnxruntime\bin
)。 这将安装 Vitis AI ONNX Runtime 引擎库。
4. 设置 XLNX_VART_FIRMWARE 环境变量
重要提示: 如果您不执行此步骤,IPU 将不会加载所需的 Executable 文件。 默认情况下,使用的搜索路径将是 C:\Windows\System32\AMD
,并且此路径可能已包含在 IPU 驱动程序安装期间存储的 xclbin。 请勿使用此路径来存储 Execution Provider xclbin 文件。 执行以下命令,将 [path_to_xclbin]
替换为包含 xclbin 的目标路径
set XLNX_VART_FIRMWARE=C:\[path_to_xclbin]\1x4.xclbin
4. 安装 Python 模块
- 在 Python 提示符下,执行以下命令,将
[version]
替换为从 .zip 存档中提取的文件确定的相应发布版本号。
pip install voe-[version]-cp39-cp39-win_amd64.whl
4. 运行 ResNet50 示例
- 利用
quicktest
文件夹中的脚本来测试您的安装。
构建
要从源代码构建 Ryzen AI Vitis AI ONNX Runtime 执行提供程序,请参阅构建说明。
量化
AMD Ryzen AI 和 Adaptable SoC 目标采用 INT8 量化进行推理。 INT8 量化的优势包括降低功耗和内存利用率。
当前版本的 Vitis AI 执行提供程序接受具有 INT8 数据类型的量化 ONNX 模型。 不支持直接部署具有替代数据类型(包括 FP32)的模型。 Ryzen AI 模型的量化可以使用 Vitis AI 量化器或 Olive 完成。 对于 AMD Adaptable SoC,用户必须利用 Vitis AI 量化器。
Vitis AI 量化器
Pytorch、Tensorflow 2.x 和 Tensorflow 1.x Docker 可用于支持 PyTorch 和 TensorFlow 模型的量化。 为了支持 Vitis AI ONNX Runtime 执行提供程序,Vitis AI 量化器中提供了一个选项,可以在量化后导出 ONNX 格式的量化模型。
ONNX 量化器 python wheel 可用于解析和量化 ONNX 模型,从而实现端到端 ONNX 模型 -> ONNX Runtime 工作流程,该工作流程也在 Ryzen AI 软件包中提供。 此外,在未来的版本中,Vitis AI ONNX Runtime 执行提供程序将支持即时量化,从而可以直接部署 FP32 ONNX 模型。
有关详细信息,请参阅模型量化。
Olive
此版本中启用了对 Microsoft Olive 的实验性支持。 Vitis AI 量化器已作为插件集成到 Olive 中,并将被上游化。 完成后,用户可以参考Olive Vitis AI 示例目录中提供的示例。
运行时选项
Vitis AI ONNX Runtime 集成了一个编译器,该编译器将模型图和权重编译为微码可执行文件。 此可执行文件部署在目标加速器(Ryzen AI IPU 或 Vitis AI DPU)上。
模型在 ONNX Runtime 会话启动时编译,并且编译必须在第一次推理传递之前完成。 编译所需的时间长度各不相同,但可能需要几分钟才能完成。 模型编译完成后,模型可执行文件将被缓存,对于后续的推理运行,可以选择使用缓存的可执行模型(详细信息如下)。
可以设置多个运行时变量来配置推理会话,如下表所示。 config file
变量不是可选的,必须设置为指向配置文件的位置。 cacheDir
和 cacheKey
变量是可选的。 C++ Ryzen AI API 示例中提供了一个说明所有三个变量用法的示例。
运行时变量 | 默认值 | 详细信息 |
---|---|---|
config_file | ”” | 必需,配置文件路径,配置文件 vaip_config.json 包含在 voe-[version]-win_amd64.zip 中。 |
cacheDir | Linux:“/tmp/{user}/vaip/.cache/” Windows:“C:\temp\{user}\vaip\.cache” | 可选,缓存目录 |
cacheKey | {onnx_model_md5} | 可选,缓存键,用于区分不同的模型。 |
最终缓存目录为 {cacheDir}/{cacheKey}
。 有关用法,请参阅以下 C++ 示例。
此外,可以设置环境变量以自定义 Vitis AI 执行提供程序。
环境变量 | 默认值 | 详细信息 |
---|---|---|
XLNX_VART_FIRMWARE | ”” | 配置 IPU 上运行的 xclbin 可执行文件的路径位置。 配置此变量至关重要。 |
XLNX_ENABLE_CACHE | 1 | 是否使用缓存,如果为 0,则会忽略缓存的可执行文件,并且将重新编译模型。 |
XLNX_TARGET_NAME | ”” | DPU 目标名称。 在 Adaptable SoC 上,如果未设置,则会自动读取 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_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 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=[{"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})