PaddleDet-Picodet模型转换及部署异常

用户您好,请详细描述您所遇到的问题,这会帮助我们快速定位问题~

1.芯片型号:X3派

2.天工开物开发包OpenExplorer版本hrt_model_exec -v : 1.18.2

3.问题定位

1. 执行 04_inference.sh origin 结果正常,执行 04_inference.sh quanti结果异常,输出为None. 详情如下:

2. 使用bin文件模型进行推理,报错如下:

hrt_model_exec model_info --model_file models/picodet_xs_320x320_rgb.binI0000 00:00:00.000000 15620 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3[BPU_PLAT]BPU Platform Version(1.3.3)![HBRT] set log level as 0. version = 3.15.25.0[DNN] Runtime version = 1.18.2_(3.15.25 HBRT)[A][DNN][packed_model.cpp:234][Model](2023-09-21,14:14:36.135.346) [HorizonRT] The model builder version = 1.18.2Load model to DDR cost 297.965ms.This model file has 1 model:[picodet_xs_320x320_rgb]---------------------------------------------------------------------[model name]: picodet_xs_320x320_rgbinput[0]: name: imageinput source: HB_DNN_INPUT_FROM_PYRAMIDvalid shape: (1,3,320,320,)aligned shape: (1,3,320,320,)aligned byte size: 153600tensor type: HB_DNN_IMG_TYPE_NV12tensor layout: HB_DNN_LAYOUT_NCHWquanti type: NONEstride: (0,0,0,0,)output[0]: name: p2o.Mul.179valid shape: (1,2125,4,1,)aligned shape: (1,2125,4,1,)aligned byte size: 34000tensor type: HB_DNN_TENSOR_TYPE_F32tensor layout: HB_DNN_LAYOUT_NCHWquanti type: NONEstride: (34000,16,4,4,)output[1]: name: p2o.Concat.9valid shape: (1,1,2125,1,)aligned shape: (1,1,2125,1,)aligned byte size: 8500tensor type: HB_DNN_TENSOR_TYPE_F32tensor layout: HB_DNN_LAYOUT_NCHWquanti type: NONEstride: (8500,8500,4,4,)---------------------------------------------------------------------

4.问题具体描述

执行03_build.sh模型转换脚本,origin模型推理正常,quanti量化模型掉点严重hb_mapper_makertbin.log日志详情可见附件,但不清楚哪里出现问题,改如何解决?

附:

模型转换配置及相关模型文件:链接:https://pan.baidu.com/s/1k1GIwIuGvI0IAzRU9kkLfQ?pwd=8xay 提取码:8xay 

hb_mapper_makertbin.log-
inference_origin.log-
inference_quanti.log

您好,地平线工具链在持续迭代优化,为了给您提供更好的服务,希望您能抽出3分钟左右的时间,将您在使用工具链期间的感受和建议告诉我们,您的宝贵意见对我们很重要,非常感谢!-
问卷链接:地平线算法工具链使用满意度反馈

你好,关于X86端inference脚本报错问题,需要您根据log日志排查是否是后处理脚本的问题,也有可能是无检测目标产生的corner case;

关于板端hrt_model_exec推理报错,这个是由于多段BPU计算图导致的DNN推理库报错,我们这边在分析修复,您这边可以在yaml文件中配置校准参数组run_on_cpu: 'p2o.MatMul.2_gemm; p2o.MatMul.0_gemm; p2o.MatMul.4_gemm; p2o.MatMul.6_gemm’去除报错的BPU子图解决

PaddleDet–ppyoloe_plus模型无上述问题,可顺利完成模型转换及部署,所以很疑惑问题是出在什么地方?

相同的脚本,唯一的变量就是加载的模型不同(origin 和 quanti), 量化模型检测结果为空,如此严重的掉点现象,应该是不正常的。

run_on_cpu: ‘p2o.MatMul.2_gemm; p2o.MatMul.0_gemm; p2o.MatMul.4_gemm; p2o.MatMul.6_gemm’。-
请问这些p2o.MatMul.2_gemm名称,是通过什么方式查看的?那如果我修改了网络结构, 是不是BPU子图的名称(p2o.MatMul.2_gemm)也可能会发生变化?

不排除,截图看不出来原因,具体的报错原因要看log文件的Traceback了

我看了hb_mapper_makertbin.log文件,确有两处[ONNXRuntimeError],更详细的日志文件已添加到附件中。因这两处错误导致量化模型严重掉点?那该要如何解决呢?

你好,根据quanti模型的inference.log中的报错:

File “/media/bitcq/DataSet/Racobit/code/horizon_ai/horizon_model_convert_paddle/04_detection/11_pp_picodet/mapper/postprocess.py”, line 166, in draw_bboxs

for i, bbox in enumerate(bboxes):

TypeError: ‘NoneType’ object is not iterable

可以确定是因为模型量化精度掉点导致没有检测到目标,首先建议您针对这个特殊情况优化一下后处理代码。其次上面截图中的两处ONNXRuntimeError不影响模型的量化精度,可以忽略,建议您根据社区文章 PTQ精度Debug工具 (horizon.cc) 和用户手册 4.1.2.11. 精度debug工具 — Horizon Open Explorer 进行量化精度调优,让量化敏感节点运行在CPU上(yaml文件中配置run_on_cpu)

你好,对bin模型使用命令行工具hb_perf xxx.bin,在生成的hb_perf_result目录下会生成二进制模型的结构图,如下

根本问题是红框部分最高维度6400大于编译器对于BPU计算图的最大输入维度限制4096,需要将6400在维度上拆分开

修改了网络结构,子图内对应的算子也会发生变化,转换产出物的html文件中包含了对应BPU计算图内的算子情况,从而获取算子名称,hb_perf的具体使用详见 4.1.2.3. hb_perf 工具 — Horizon Open Explorer