Lane模型采用PTQ链路部署时,INT8量化精度损失明显,希望经过精度调优后,所有校准数据上输出的平均余弦相似度不低于0.99。
1. 校准模型精度调优
首先采用HMCT default INT8量化,校准算法选择了max_asy_perchannel,所有输出平均相似度均未满足需求。
1.1 提升全BPU精度
1.1.1 全INT16精度
设置模型all_node_type为INT16,校准算法选择了max,全INT16精度不满足需求(occlusion和box_arrow输出平均相似度未达0.99):
1.1.2 INT16上限精度
设置模型all_node_type为INT16后,受硬件以及性能限制,模型中仍会存在INT8量化节点:Conv和ConvTranspose权重以及GridSample节点;通过HMCT提供的IR接口将校准模型中所有校准节点数据类型修改为INT16,得到真INT16模型:
验证真INT16校准模型在所有输出上的平均相似度,均能够满足要求,故接下来可以通过补偿误差来完成调优。
1.1.3 补偿量化损失
首先基于全INT16校准模型,yaml配置debug_mode: "dump_calibration_data" 保存校准数据,通过get_sensitivity_of_nodes输出节点量化敏感度:
接着按照节点敏感度排序修改校准模型,将量化精度从INT8提升至INT16,直到occlusion和box_arrow满足精度需求:
序号 | 余弦相似度阈值(<=该阈值设置为INT16) | 输出相似度 | |||
|---|---|---|---|---|---|
occlusion | box_arrow | ||||
Min | Avg | Min | Avg | ||
1 | None | 0.943404 | 0.983970 | 0.755858 | 0.987496 |
2 | 0.999 | 0.983739 | 0.997729 | 0.893116 | 0.994958 |
3 | 0.99 | 0.952758 | 0.994116 | 0.745781 | 0.987434 |
由上述表格可知,将Conv_360, Conv_3, Conv_338权重量化精度从INT8提高至INT16,所有输出相似度能够达标;在HMCT全BPU部署时,通过引入一个相同算子来补偿INT8量化导致的精度损失,将量化精度提升到接近INT16:
注:推荐Resize和GridSample采用nearest采样方式,此时算子输出不会引入新数值,误差也能够被补偿掉,否则输出INT8量化也引入额外损失。
1.2 INT16精度调试
补偿Conv_360, Conv_3, Conv_338权重量化损失后,全INT16校准模型精度能够达标,基于误差补偿后的INT8校准模型开始调优,校准模型精度如下:
1.2.1 INT8+INT16混合精度调试
INT8校准模型所有输出均未满足要求,通过get_sensitivity_of_nodes计算节点量化敏感度:
按照余弦相似度排序从前往后的顺序,逐步设置算子INT16量化,校准模型相似度也会随着增加:
序号 | 余弦相似度阈值 | 输出相似度 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
mask | field | attr | backgroud | cls | box | cls_sl | box_sl | occlusion | cls_arrow | box_arrow | ||
1 | None | 0.874048 | 0.875366 | 0.908879 | 0.976282 | 0.959749 | 0.939461 | 0.959271 | 0.947069 | 0.945837 | 0.942194 | 0.829580 |
2 | 0.99 | 0.980708 | 0.987483 | 0.989023 | 0.993368 | 0.991154 | 0.985205 | 0.990900 | 0.990375 | 0.985721 | 0.975350 | 0.963180 |
3 | 0.999 | 0.988858 | 0.990837 | 0.994669 | 0.995994 | 0.995570 | 0.994660 | 0.995466 | 0.996202 | 0.991201 | 0.979100 | 0.980218 |
4 | 0.9995 | 0.991085 | 0.991593 | 0.995369 | 0.997524 | 0.995818 | 0.995149 | 0.996001 | 0.996851 | 0.992633 | 0.981471 | 0.982875 |
经上述测试表格调优,将敏感度阈值小于等于0.9995的敏感节点设为INT16节点,除cls_arrow和box_arrow外,其余输出平均相似度均不低于0.99;cls_arrow和box_arrow共用同一个分支,尝试基于0.9995敏感节点设置INT16的校准模型,配置arrow的输出head子图为INT16,量化配置及输出相似度:
仅box_arrow输出平均相似度未达标,单独指定box_arrow输出重新获取敏感度排序:
按照余弦相似度排序从前往后的顺序,逐步设置算子INT16量化,直到box_arrow输出相似度满足要求:
序号 | 余弦相似度阈值 | 输出相似度 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
mask | field | attr | backgroud | cls | box | cls_sl | box_sl | occlusion | cls_arrow | box_arrow | ||
1 | None | 0.991085 | 0.991593 | 0.995369 | 0.997524 | 0.995818 | 0.995149 | 0.996001 | 0.996851 | 0.992633 | 0.990650 | 0.983423 |
2 | 0.999 | 0.993978 | 0.993429 | 0.996853 | 0.998160 | 0.996915 | 0.996035 | 0.997124 | 0.997249 | 0.994457 | 0.992993 | 0.989119 |
3 | 0.9995 | 0.995126 | 0.994426 | 0.997494 | 0.998554 | 0.997245 | 0.996941 | 0.997775 | 0.998297 | 0.995518 | 0.995444 | 0.990272 |
最终通过设置部分敏感节点INT16,模型所有输出的平均相似度均满足要求,量化配置及输出相似度如下:

