在使用X3J3浮点转定点工具链时,偶尔会出现生成的量化上板模型的精度有损失,不符合期望的情况。研发团队根据大量的模型调试和长期的客户精度支持的经验,提供了各种精度优化的方法。在这篇帖子中,我们详细描述了在出现精度问题时,如何进行定位和优化。
根据经验,我们将精度损失问题分成两组:
1. 精度有较明显损失(损失大于5%):这种问题往往是由于yaml配置不当,校验数据集不均衡等导致的
2. 精度损失较小(1.5%~3%):出现这种精度损失往往是由于模型自身的敏感性导致
针对上面的两种情况,我们分别提供下列检查方法:
一、精度有明显损失(4%以上)
通常情况下,精度较大损失是由于各种配置不当引起的。可以按照下面的顺序逐一检查:
1. pipeline检查:首先建议检查自己的评测pipeline,metric指标,后处理等代码已经发生改动但没有及时更新。
2. yaml配置检查:yaml的配置对于不熟悉工具链使用的客户可能会是一个易错点,所以在确保pipeline流程无误后,需要再次检查yaml的配置包括:
a). input_type_rt、input_type_train: 该参数用来区分模型训练时和模型上板时的图片数据格式,需要认真检查是否符合预期,尤其是GBR和RGB格式是否正确
b). mean、scale 等参数是否配置正确:通过yaml配置可以直接在模型中插入mean和scale操作节点,需要确认是否对校验/测试图片进行了重复的 mean 和 scale 操作。重复预处理是错误的易发区。
c). preprocess_on开关是否开启:决定了是否对校准图片进行resize以及颜色转换
3. 一致性检查:图片读取方式一致性检查:工具链提供两种图片读取方法skimage和opencv,而且两种方法在输出的范围和格式上都有所区别。(对于skimage的图片读取,输出的是RGB&取值范围为0~1的float,而对于opencv,输出的是BGR&取值范围为0~255的uint8)
4. quantized.onnx和上板模型一致性检查:推荐直接在python中运行quantized.onnx模型并评测精度的客户
5. 校验图片集是否合理设置:校准图片集最好可以覆盖到数据分布的各种场合,例如在多任务或多分类时,校验图片集可以覆盖到各个预测分支或者各个类别。
二、精度有较小损失,但仍然想要提高
一般这种情况的精度损失在1.5%到3%。这种情况可以尝试使用如下方法提高精度:
1. 默认情况下yaml配置的校准方法为KL,可以将提供的多种校准方法分别进行尝试:
a). 使用max校准
b). 使用max + max_percentile校准并将max_percentile参数配置为0.99999, 0.99995, 0.9999, 0.9998,0.9995分别进行尝试
c). 打开perchannel选项,perchannel选项可以分别配合max或kl形成perchannel+max;perchannel+kl;perchannel+max_percentile等多种组合形式
2. 尝试配置校验编译选项为search方法(search方法目前在优化开发中,后续会提供稳定版本)
往往在客户尝试多种kl,max-percentile,perchannel等校准配置后,都可以得到符合客户期望的精度提升