无法测试量化生成的onnx模型

用户您好,请详细描述您所遇到的问题:无法测试量化生成的ONNX模型。在文末的链接中包含测试用的代码和ONNX文件,其中ort_test.py使用公版ONNX Runtime进行测试,hb_test1.py使用HB_ONNXRuntime测试转换前的模型,hb_test2.py使用HB_ONNXRuntime测试转换后的original_float模型,这三者的输出结果均正常。在hb_test3.py中试图使用HB_ONNXRuntime测试转换后的量化模型,报错:horizon_nn.horizon_onnxruntime.onnxruntime_pybind11_state.InvalidArgument: [ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type. Actual: (N11onnxruntime17PrimitiveDataTypeIfEE) , expected: (N11onnxruntime17PrimitiveDataTypeIaEE)

  1. 系统软件版本: (通过 cat /etc/version 获得)

OS: docker pull openexplorer/ai_toolchain_ubuntu_20_xj3_cpu:v2.5.2,在docker镜像中进行的操作

OE: horizon_xj3_openexplorer_v2.5.2_py38_20230331

  1. 问题涉及的技术领域: (硬件、操作系统、驱动、其他)

AI工具链

  1. 问题描述:

无法测试量化生成的ONNX模型。在文末的链接中包含测试用的代码和ONNX文件,其中ort_test.py使用公版ONNX Runtime进行测试,hb_test1.py使用HB_ONNXRuntime测试转换前的模型,hb_test2.py使用HB_ONNXRuntime测试转换后的original_float模型,这三者的输出结果均正常。在hb_test3.py中试图使用HB_ONNXRuntime测试转换后的量化模型,报错:horizon_nn.horizon_onnxruntime.onnxruntime_pybind11_state.InvalidArgument: [ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type. Actual: (N11onnxruntime17PrimitiveDataTypeIfEE) , expected: (N11onnxruntime17PrimitiveDataTypeIaEE)

见附件图片

  1. 复现概率:必现

  2. 已进行的排查措施、分析及结果:

  3. 硬件问题先排查供电和时钟 不涉及

  4. 驱动问题先排查外设的供电、复位和时钟 不涉及

  5. 功能异常,先排查一下是不是运行的代码和demo存在差异,修改不多的情况下直接用对比软件先对比

参考了文章:模型精度验证及调优建议 (horizon.ai)1.1节

也查看了类似的问题:.horizon_onnxruntime.onnxruntime 出错

输入数据类型uint8和float32均尝试过,均无法解决

  1. 提供必要的问题日志:
  2. 软件上是否有做自定义修改:有

链接: https://pan.baidu.com/s/1tL7uJ7ZKi-\_Qc1U6mfwLmw 提取码: lj7g

--来自百度网盘超级会员v4的分享

Screenshotfrom2023-05-0516-03-04_20230505161555.png

感谢您使用地平线芯片算法工具链,最近我们在收集大家的满意度反馈,欢迎您填写问卷,详细情况可见:https://developer.horizon.ai/forumDetail/146177053698464782

你好,这个报错提示的是输入数据的类型不匹配,我们可以通过以下几个步骤去做分析:

1. 通过 netron 工具可视化 original_float.onnx 和 quantized.onnx,点击 HzPreprocess 预处理节点,查看到模型输入数据的类型为 RGB_128,_128 的意思是 uint8 数据减去 128 转换至 int8 类型

2. 查阅用户手册 3.6.1 节,可以看到针对图像输入的模型来说,推理接口不使用 sess.run_feature,而是使用 sess.run,其中 input_offset=128 的传参也就是我们前面所描述的 uint8 转 int8 的操作,我们封装在了接口内部实现

3. 另外还发现你的 quantized.onnx 模型增加了非常多的输出分支,说明你的在模型转换的时候,在 yaml 文件中配置了 layer_out_dump 参数为 True,这个也可以关闭上,会非常影响模型的推理速度(虽然这与无法推理不相关)

好的,问题已解决