摘要:推理时精度错误或不达标,怎么办?模型推理时,模型推理功能调测OK,但推理精度错误,或推理精度与标杆数据存在少量差距,这时该怎么做呢?
本文分享自华为云社区《【CANN文档速递10期】推理网络精度调优》,作者: 昇腾CANN 。
一、推理时精度错误或不达标,怎么办?
模型推理时,模型推理功能调测OK,但推理精度错误,或推理精度与标杆数据存在少量差距,这时该怎么做呢?我们可以从以下两种导致精度问题的原因入手,建议先检查配置问题、再检查算子精度问题。
二、推理前,哪些配置可能影响精度?
1、JPEGD解码后的输出图片可能存在补边的无效数据,可能影响推理精度。
建议:JPEGD+VPC串联使用时,由于JPEGD解码后的输出图片的宽stride*高stride有128*16对齐的约束,因此解码后的输出图片的宽、高有一些补边的无效数据,所以VPC在处理图片前,应首先对JPEGD对齐后的输出图片进行原分辨率裁剪,目的是去除无效数据对图像精度的影响。
2、VPC输出图片格式与AIPP输入图片格式不一致,可能影响推理精度。
建议:AIPP色域转换配置中的源图片格式要与VPC的输出图片格式保持一致,如果不一致,例如,VPC的输出格式是YUV420SP(NV12),而AIPP色域转换的配置是YUV420SP(NV21)–>RGB888,则UV分量的顺序不同会影响模型推理的精度。
三、模型中算子精度不达标,怎么定位呢?
模型中算子精度不达标导致整网推理精度不达标时,可以借助精度比对工具、一键Dump比对工具,根据下文中具体的问题定位流程获取各类数据后,再进行比对、分析,逐一解决问题。
在定位问题前,我们先需要获取相关辅助工具:
• 精度比对工具:用于比对昇腾算子与业界标准算子的运算结果,也可用于比对昇腾算子多次运算结果,但需用户自行准备昇腾算子或业界标准算子的运算结果数据(即Dump数据)。该工具的获取及用法请参见配套版本的《精度比对工具使用指南》。
• 一键Dump比对工具:仅用于比对昇腾算子与TensorFlow/ONNX标准算子的运算结果,无需用户准备昇腾算子和TensorFlow/ONNX标准算子的运算结果数据,只需指定昇腾模型和TensorFlow/ONNX 模型的路径即可该工具的获取及用法请参见https://gitee.com/ascend/tools/tree/master/msquickcmp
通过工具比对数据时,我们还需要修改或检查以下配置:
1、配置模型高精度模式
• 原因分析:
当前默认采用fp16(float16)数据类型进行计算。配置模型高精度模式后推理,可提升精度,但可能会影响推理性能,如果在精度达标的同时,需要保持性能,则可以配置部分算子保持原始网络中的数据类型。
• 配置方法:
模型高精度模式:模型转换时增加–precision_mode=allow_fp32_to_fp16
部分算子保持原始网络中的数据类型:模型转换时增加–keep_dtype参数以及–precision_mode=force_fp16
2、关闭数据缓存优化
• 原因分析:
当前默认开启数据缓存优化,开启数据缓存优化可提高计算效率、提升性能,但由于部分算子在实现上可能存在未考虑的场景,导致影响精度,因此在出现精度问题时可以尝试关闭数据缓存优化。如果关闭数据缓存优化功能后,精度达标,则还是需要识别出问题算子,反馈给华为工程师进一步分析、解决算子问题,解决算子问题后,建议保持开启数据缓存优化。
• 配置方法:
模型转换时增加–buffer_optimize=off_optimize
3、关闭融合规则
• 原因分析:
当前默认开启融合规则,开启融合规则可提高计算效率、提升性能,但算子之间可能会融合,融合后的部分算子在实现上可能存在未考虑的场景,导致影响精度,因此在出现精度问题时可以尝试关闭融合规则。如果关闭融合规则功能后,精度达标,则还是需要识别出问题算子,反馈给华为工程师进一步分析、解决算子问题,解决算子问题后,建议保持开启融合规则功能。
• 配置方法:
模型转换时增加–fusion_switch_file参数,指定融合规则配置文件,一键式关闭融合规则。融合规则配置文件内容如下:
4、检查数据处理或配置
推理精度不达标可能是由于数据集预处理或推理结果后处理方式与标杆不一致导致,也有可能是由于AIPP配置不正确导致,需一一检查、修改后,重新推理。
5、与标杆计算数据比对
上面的配置、检查都完成后,如果推理精度还是不达标,最后,我们可以使用一键Dump比对工具比对昇腾算子与TensorFlow/ONNX标准算子的运算结果的差异,然后联系华为工程师,进一步定位算子问题并解决。
四、更多介绍
了解更详细的内容,登录昇腾社区,在开发者文档中心:https://www.hiascend.com/document?tag=community-developer