6.2.11. HB_ONNXRuntime推理库

HB_ONNXRuntime是地平线基于公版ONNXRuntime封装的一套x86端的ONNX模型推理库。 除支持Pytorch、TensorFlow、PaddlePaddle、MXNet等各训练框架直接导出的ONNX原始模型外,还支持对地平线工具链进行PTQ转换过程中产出的各阶段ONNX模型进行推理。 使用流程如下图所示:

../../../../_images/hb_onnxruntime.png

注解

请注意,地平线BPU架构的计算平台使用的是int8的计算精度(业内计算平台的通用精度),使用地平线工具链进行PTQ转换过程中, 虽然对于最终转换生成的bin模型的输入对于 input_type_rtinput_type_train 颜色空间的转换会配合处理器硬件完成, 但是对于转换过程中生成的onnx模型(非featuremap输入且 norm_type 未配置为 no_preprocess)前端插入的预处理节点却不包含硬件转换逻辑, 因此onnx模型的实际输入只是一种中间类型(除featuremap输入外,其他类型输入均需做-128操作,即由unit8转为int8), HB_ONNXRuntime内部会对此数据转换进行处理,但仅限如下不涉及数据损失的转换场景:

  • 模型输入为int8:支持传入int8、uint8。

  • 模型输入为uint8:支持传入为int8、uint8。

  • 模型输入为float32:支持传入为int8、uint8及float32。

如涉及混合类型输入等会出现数据损失的转换,需先自行完成对应数据转换的处理,再进行推理。

6.2.11.1. 使用方法

使用HB_ONNXRuntime加载ONNX模型推理的基本流程如下所示,这份示例代码适用于所有ONNX模型的推理, 根据不同模型的输入类型和layout要求准备数据即可:

import numpy as np
# 加载地平线依赖库
from horizon_tc_ui import HB_ONNXRuntime
# 准备模型运行的输入
input_data = np.load("input.npy")
# 加载模型文件
sess = HB_ONNXRuntime(model_file = "model.onnx")
# 获取模型输入&输出节点信息
input_names = sess.input_names
output_names = sess.output_names
# 准备输入数据,这里我们假设此模型只有1个输入
input_info = {input_names[0]: input_data}
# 开始模型推理,推理的返回值是一个list,依次与output_names指定名称一一对应
output = sess.run(output_names, input_info)

6.2.11.2. 参数说明

  • output_names

    用于配置输出名称,支持配置为None或自定义配置。

    • 如配置为None,工具内部会读取模型内的输出节点信息并按解析的顺序给出推理结果。

    • 如自定义配置,可以配置全量或部分output_name,且支持修改输出顺序。则推理完成后,会按您配置的输出名称和顺序返回输出。

  • input_info

    按照输入类型和layout准备模型运行的输入,配置格式要求为字典形式,输入名称和输入数据组成键值对,参考配置示例:{“input_name” : data}。