您好,~Thanks♪(・ω・)ノ1. 芯片型号:J6E2. 天工开物开发包 OpenExplorer 版本:v3.0.223. 问题定位:模型转换4. 问题具体描述:PTQ量化时模型沿batch维度拆分后y, uv的输入数据类型为uint8, 在对量化后的bc模型推理时,如果对图像进行前处理操作(如减均值除方差,之后转nv12再拆y,uv)得到的输入数据为浮点类型。这两者无法对齐,如果强制将输入数据转为uint8,精度又无法保证。请问是否需要在沿batch维度拆分时对模型输入类型进行修改?
你好,对量化后的bc模型推理时,输入模型的数据就是做了w32对齐的uint8的y + uv的数据,如果需要前处理操作,你可以将这部分计算配置到yaml的mean_value和scale_value 中。
感谢回复!目前PTQ量化过程中使用了两次yaml文件:第一次是在模型沿batch维度拆分之前做了一次量化编译生成 sparse_256x704_nv12_ptq_model.onnx 使用了yaml文件第二次是在沿batch维度拆分之后使用拆分后的模型又做了一次量化编译生成.bc模型 使用了yaml文件。我按如下修改yaml文件之后执行第一步操作后出现报错:(意思是featuremap不支持mean、scale)还是只在第二步修改yaml文件执行编译就行?
你好,通过这种方式量化出的bc模型,通过执行samples/ai_toolchain/horizon_model_convert_sample/02_bev/01_sparse4d/04_inference.sh,得到的推理结果经过decoder输出的scores值都极小。请问OE包中是否有类似Sparse4D这种需要沿batch维度拆分的PTQ量化示例可供对比分析?
你好,看了一下,目前OE包中PTQ量化示例都是单输入的,没有沿batch维度拆分的示例,但是你可以同样存在输入为Y+UV的示例,比如horizon_model_convert_sample/04_detection/08_yolov4,相比你目前的模型输入较简单,但是NV12输入部分的逻辑可供参考。
你好,对比了yolov4示例中的推理代码,目前Sparse4D量化的bc模型也是按照这个推理流程设置输入的,推理输入设置如下:但执行04_inference.sh,模型推理输出结果如下:使用OE包中下载得到的Sparse4d qat.bc模型使用相同输入得到结果为对比两种bc模型的推理结果,两者输出的四种结果shape相同,但数值却不在一个量级。还请帮忙排查一下,谢谢!完整工程代码如下链接: https://pan.baidu.com/s/1ODsB5N74gJ_OqrpTo-rqdQ?pwd=1234 提取码: 1234
你好,数据预处理代码比较简单,仅是6张图padresize后转nv12再拆分yuv给到模型输入。目前在修改yaml文件后执行量化编译时没有余弦相似度输出,无法判断PTQ量化后模型的精度问题,还请尽快安排验证,非常感谢!
这样理解吧:QAT模型跟PTQ这个模型输出前的处理逻辑是不是一样的都很难说,如果不能确认他们具有一样的计算逻辑,那这个差距是很难说是对还是错的。另外,HBRuntime是可以推理浮点模型的,而浮点模型是没有量化损失的,你可以试试推理的结果是不是跟QAT的是一个量级的。hb_verifer这个工具,可以对比量化前后模型的一致性,如果ptq量化前后模型一致性基本是OK的,那量化损失就是可以接受的,就不是导致这个问题的原因,