昇腾社区首页
中文
注册

精度调试案例

问题现象

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商发

问题分析步骤

  1. 执行以下命令,使用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获取。

  2. 使用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值,怀疑该算子存在溢出。

    图1 查看结果文件
  3. 基于比对结果进行问题分析。

    手动比较sub_6213算子的输出dump结果,om数据dump结果中有inf(om模型的sub_6213算子为融合算子mul_sub6211_sub6213,也出现溢出),onnx输出结果正常,开始往前追溯om模型,定位到sub_6200输出为inf,最终原因为Data数据过大导致sub_6200算子溢出,如图2

    图2 比较sub_6213算子输出结果

    由于融合算子没有中间算子的计算结果,较难定位问题,考虑关闭融合算子后重新比对,关闭方法请参见关闭融合规则比较。关闭融合算子后的比对结果如图3

    图3 比对结果

    图3可以看出om onnx中exp算子均输出inf,输入正常且对齐,exp算子可能存在精度问题。关闭融合规则后两边的局部拓扑结构如图4

    图中的标注结果为算子的当前输出。手动验证局部相关算子后,发现onnx、om模型中where算子三个输入中都有一个输入包含inf,onnx输出正常,om输出inf,导致后续算子输出inf,即onnx模型可以自动处理溢出情况,om模型在溢出后会将输出结果继续传导下去。可以确定是exp算子的溢出问题导致整网的精度问题。

    图4 拓扑结构
  4. 需修改图结构增加clip算子对梯度进行裁剪防止溢出。修改图结构工具推荐使用msit debug surgeon工具,工具使用请参见msit debug surgeon功能使用指南