一、int8的输出和fp32模型输出差异比较大
解决方案:
- 检查前后处理是否有问题,int8网络输入输出一般需要做scale处理,看看是否遗漏?
- 通过量化可视化工具分析int8的输出和fp32的输出的精度差异,做个输出曲线对比;通过曲线查找出导致误差较大的层,通过更换该层的量化方式调整结果,找到最优量化方式,若仍然不能满足精度要求,则可将该层设置为float输出,不进行量化。
二、calibration_use_pb 指定校准参数注意事项
calibration_use_pb 这个工具和校准相关的参数:
-accuracy_opt
-per_channel
-th_method
问:
Q1:这三个参数是互斥的存在,还是可以组合使用?
A1:可以组合使用,accuracy_opt针对depthwise的卷积,如果没有depthwise可以不选,跟th_method不冲突
Q2:per_channel 这个参数指定成 true 之后,还需要其他的参数配合吗? 比如: first_conv_enable_per_channel
A2:per_channel可以单独使用
Q3:th_method 这个参数可以同时指定多个吗? 比如同时指定:-th_method=SYMKL, -th_method=JSD
A3:th_method一次只能选一种
三、提高模型的量化效率和精度的方法
推荐策略是:
- 对于检测和分类模型,使用自动量化工具,量化成功后精度测试;
- 对于其他类模型,手动指定量化参数,量化成功后精度测试;
- 自动量化失败 或 精度不够的,反馈给我们的技术支持。
四、量化方法的常见问题
问:手动指定量化参数时,需要尝试18种量化方法的组合,并逐个测试精度。是否可以提供相关量化参数的说明及推荐使用方法?我们希望能根据模型结构缩小量化方法的搜索范围。
答:kl和symkl和jsd算法比较相似可能差别不大,bert一般用max。多数网络max表现一般,但是各种算法和网络结构和用户训练结果都有关系,所以先默认kl量化,下降多的话再尝试其他组合可能省些时间。
问:这些量化方法 对量化后模型的性能有影响吗?
答:几种门限算法对性能没影响,accuracyopt会把depthwise卷积用浮点,一般会变慢,perchannel也会变慢,这两个是为了提高精度。