精度调试案例
问题现象
zipformer语音模型迁移场景下流式推理前x帧没有问题,在第x+1帧出现精度问题。环境配置自检正常,确认非偶现问题,非硬件环境、软件版本问题。
环境配置:
- 硬件平台:Atlas 300I DUO推理服务器
- 软件平台:Linux ubuntu 4.15.0-29-generic,aarch64
- 环境版本:CANN(7.5.0.1.129:8.0.RC3)8.0.RC3商发
问题分析步骤
- 执行以下命令,使用ATC转换onnx模型。
atc --input_shape="x:4,77,40;cached_key_0:128,4,128" \ --precision_mode=force_fp32 \ --soc_version=Ascendxxx \ --framework=5 \ --output=modeloutputpath \ --model=/modelpath/model.onnx
其中--input_shape参数如果有多个输入,shape之间需使用英文分号分隔;--soc_version为芯片型号,可参见表1获取。
- 使用msit debug compare工具获取比对结果。由于流式推理获取中间输入较为困难,改为随机构建输入数据进行debug compare,命令如下。
msit debug compare -gm /modelpath/model.onnx -om /modelpath/model.om -o output_path --input-shape="x:4,77,40;cached_key_0:128,4,128"
输出比对结果,查看结果文件,如图1,发现可疑算子(mul_sub_sub融合算子)的输出有nan和inf值,怀疑该算子存在溢出。
- 基于比对结果进行问题分析。
手动比较sub_6213算子的输出dump结果,om数据dump结果中有inf(om模型的sub_6213算子为融合算子mul_sub6211_sub6213,也出现溢出),onnx输出结果正常,开始往前追溯om模型,定位到sub_6200输出为inf,最终原因为Data数据过大导致sub_6200算子溢出,如图2。
由于融合算子没有中间算子的计算结果,较难定位问题,考虑关闭融合算子后重新比对,关闭方法请参见关闭融合规则比较。关闭融合算子后的比对结果如图3。
从图3可以看出om onnx中exp算子均输出inf,输入正常且对齐,exp算子可能存在精度问题。关闭融合规则后两边的局部拓扑结构如图4。
图中的标注结果为算子的当前输出。手动验证局部相关算子后,发现onnx、om模型中where算子三个输入中都有一个输入包含inf,onnx输出正常,om输出inf,导致后续算子输出inf,即onnx模型可以自动处理溢出情况,om模型在溢出后会将输出结果继续传导下去。可以确定是exp算子的溢出问题导致整网的精度问题。
- 需修改图结构增加clip算子对梯度进行裁剪防止溢出。修改图结构工具推荐使用msit debug surgeon工具,工具使用请参见msit debug surgeon功能使用指南。
父主题: 精度问题