0 概述-
本文为QAT一致性验证流程及说明。一致性问题主要表现在精度问题中,主要为两阶段的推理结果不一致,例如quantized model和板端推理可视化效果差异大等。通过本文可以检查在QAT流程环节中由于数据/模型/推理库不一致导致的精度问题,以达到帮助使用者可以快速定位并解决的目的。
1 QAT流程-
QAT流程中模型的转换流程主要为float–>calib–>qat–>quantized->hbm,若calib精度达到预期可以不进行qat,直接转为quantized model然后进行后续流程。整体的流程划分为4大块:float阶段、calib阶段、int阶段、板端部署,具体流程如下:
2 一致性验证-
本节针对上图中出现精度问题时需要做的一致性验证做说明。-
流程
阶段
验证环境
验证目的
验证途径
参考代码/其他说明
1
float
PC
确保模型和推理代码的正确性
测试浮点模型的单张结果或metric,是否达到预期精度
1. 如推理有误则需检查推理代码
2
Calib-
QAT
PC
验证calib、qat模型量化精度是否满足预期
测试calib、qat模型的单张结果或metric,是否达到预期精度
1. 可直接复用浮点模型评测代码-
2. 若精度不满足预期,则可直接进入精度debug
3
Int
PC
验证int模型量化精度是否满足预期
输入数据正确性验证:-
模型输入是否处理为中间类型(注1)
int模型的输入数据需要处理至中间类型(注1),处理方式见:PTQ&QAT方案板端验证注意事项的2.2.2章节
int量化精度验证:-
测试int模型的单张结果或metric,是否达到预期精度
1. 可直接复用浮点模型评测代码-
2. 做int模型精度评测时无需做量化和反量化操作,由quantized model中的quant和dequant节点完成-
3. 若精度不满足预期,则可直接进入精度debug
4
板端部署
PC&板端
验证hbm模型精度是否和int一致
输入数据一致性验证:-
模型输入是否处理至板端输入类型(若为图像输入,quantized model需要处理到中间类型-yuv444_128,hbm则是runtime类型-nv12)
PC端:-
1. 数据准备参考流程3的输入数据处理-
2. 若input_source为pyramid,训练时使用rgb/bgr,则需要插入前处理节点centered_yuv2rgb、centered_yuv2bgr ,具体步骤见:RGB888部署-
板端:-
1. 数据准备参考PTQ&QAT方案板端验证注意事项的2.2.2章节-
2. 板端模型(hbm模型)无量化节点,使用python准备板端输入数据时若为featuremap输入则需要在pc端做量化和padding操作,量化公式:quant_x=torch.clamp(torch.floor(x/scale+0.5),-2^{n-1},2^{n-1}-1),padding方式见在部署时为输入数据做padding
模型一致性验证:-
使用hbdk-model-verifier工具验证quantized model和hbm的一致性
hbdk-model-verifier对比验证:-
1. 命令为:hbdk-model-verifier --hbm xxx.hbm --model-pt xxx.pt --model-input xxx.jpg --ip board_ip-
2. model_input说明:-
- 模型输入的数据来源为 pyramid或者resizer(nv12格式)时,可以直接使用jpg、png、yuv文件作为输入。如果使用yuv文件作为输入,需要通过–yuv-shape参数给出yuv文件的尺寸信息;由于工具未包含resize预处理,需要准备和模型输入大小相同的图片输入-
- 如果输入的数据来源为 ddr(即无格式的tensor featuremap),那么可以使用二进制或者txt格式的数据作为输入。需要注意,layout必须为NHWC,若与模型的输入layout不一致工具会做处理。如果是二进制数据,注意二进制数据的数据类型需要与模型输入一致。如果是txt文本,可以通过numpy.loadtxt正确读取。-
- 如果模型本身有多个输入,那么输入数据用逗号进行分隔。例如:--model-input input_0.bin,input_1.bin,input_2.bin,input_3.bin
-
3. 如未通过验证,则提供输入数据、pt和hbm模型给地平线技术人员分析。
DNN推理库验证:-
对比PC端quantized model结果和hrt_model_exec 的infer结果的一致性
dnn 推理验证:-
1. DNN 推理:前两步确认输入数据和模型无误后,使用hrt_model_exec工具验证DNN推理库的正确性,命令为:hrt_model_exec infer --model_file xxx.hbm --input_file xxx.bin --enable_dump True --dump_format txt
-
- input_source为resizer时,命令参考resizer模型使用与部署 4.1章节-
- input_file数据准备参考4的板端数据准备-
- dump的输出为未经过反量化的输出,需要获取输出的scale,做反量化-
2. int 推理:python推理参考流程3-
对比以上两个结果是否一致,如不一致则检查dnn版本是否更新到最新版本,如已是最新版本则提供输入数据、pt和hbm模型给地平线技术人员分析。
板端代码一致性检查:-
前处理:-
对比板端模型的实际输入和hrt 的输入是否一致-
后处理:-
对比板端和pc端后处理的可视化结果是否一致
若通过hrt_model_exec工具已验证推理hbm模型和推理库无误,则请仔细检查工程代码的前后处理是否正确。-
前处理:-
1. 打印板端部署时模型推理前的实际输入数据,(注意保存位数和pc端一致),若数据和hrt 的输入不同则为板端前处理过程与PC端不一致导致,其中量化和padding操作可以参考以下:反量化节点的融合实现 在部署时为输入数据做padding-
后处理-
1. 将模型板端推理的输出结果做反量化后保存,将结果接入python后处理,查看推理结果是否正常,若python正常,板端异常则为板端后处理代码有误,需要检查后处理代码使其与python端一致。-
特别注意:若使用了centered_yuv2rgb算子,可能会存在转换过程导致的损失,一般不影响可视化效果。详见:QAT前处理节点解读和验证
注1:数据格式对应的中间类型(input_type_rt):
nv12
yuv444
rgb
bgr
gray
featuremap
yuv444_128
yuv444_128
RGB_128
BGR_128
GRAY_128
featuremap