当我们谈论模型转换精度问题时,我们在谈论什么

在使用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等校准配置后,都可以得到符合客户期望的精度提升

补充一小条:模型量化前输出层不要使用全局缩放参数,类似于FCOS中box_head使用的Scales参数,该参数可以提取出来放到后处理中调用,多次验证发现该类参数导致模型最后的输出框精度大减。

目前我这边精度差异很大,想请问一下:校准数据生成(自己先做好了resize和通道转置)后是否是对接在上板模型输入上(因为文中提到不做重复的归一化(若上板模型已经添加了归一化的预处理节点)进行校准的(但我也注意到horizon_x3_tc_1.1.17e的samples分类用例里面好像做校准数据预处理时都有ScaleTransformer(255)即乘以255,这是为何,是不是数据是skimage读取就放大到uint8,若是opencv就不需要了?)?另外对于input_type_rt类型为 rgb/bgr/rgbp/bgrp 的配置,要求输入上板模型的输入是不是一定是int8的,那我这边就需要将opencv读入的bgr uint8图片要减去-128并转为int8处理才行? 谢谢

厉害了

相关问题已解决,见https://developer.horizon.ai/forumDetail/136488103547258551

想请问一下大佬,如果开启了per_channel的话,片上速度会有影响不?