云服务器内容精选

  • 逐个替换模型,检测有问题的模型 该方式主要是通过模型替换,先定位出具体哪个模型引入的误差,进一步诊断具体的模型中哪个算子或者操作导致效果问题,模型替换原理如下图所示。通过设置开关选项(是否使用onnx模型),控制模型推理时,模型使用的是onnx模型或是mindir的模型。 图1 精度诊断流程 一般情况下,onnx模型推理的结果可以认为是标杆数据,单独替换某个onnx模型为MindSpore Lite模型,运行得到的结果再与标杆数据做对比,如果没有差异则说明pipeline的差异不是由当前替换的MindSpore Lite模型引入。 如果有差异,则说明当前模型与原始onnx的结果存在差异。依次单独替换onnx模型为对应的MindSpore Lite模型,从而定位出有差异的模型。在模型初始化的代码块已经添加了use_ascend参数,修改参考如下: 图2 代码修改 以上述现象为例,通过修改use_ascend参数值对模型替换,可以发现:当text_encoder模型为onnx模型,其余模型为mindir模型时,能够得到和标杆数据相同的输出,因此可以判断出转换得到的text_encoder模型是产生pipeline精度误差的根因。通过下一小节可以进一步确认模型精度的差异。
  • 使用精度对比工具ait debug compare 在模型转换场景,误差的累积和算子溢出等都可能导致转换后的模型存在误差。当识别到模型误差较大时,可以使用一键式全流程精度比对工具ait debug compare对比转换前的onnx模型和转换后的OM模型。 使用该工具对比onnx模型和OM模型,指定onnx模型路径、 OM模型路径、生成文件的路径以及模型输入shape的信息。其中,-o表示对比结果的保存路径,需要是一个已经存在的路径。 #shell ait debug compare -gm ./model.onnx -om ./text_encoder.om -o ./ --input-shape "input_ids:1,77" 执行成功后,会在指定输出目录下输出{timestamp}文件夹,打开对应的文件夹,可以看到result_{timestamp}.csv文件,该文件统计了各个图算子在推理过程中的日志信息。具体各个字段代表的含义可以参考昇腾整网对比文档。 排查精度问题时可以通过检索.csv文件中CosineSimilarity(余弦相似度)和MaxAbsoluteError(最大绝对误差)两列的信息定位第一个发生突变的算子。一般认为余弦相似度小于0.99时算子的精度有偏差,这种情况表明:该突变行对应的Ascend算子和onnx算子的执行结果存在较大差异,从而将排查重点锁定在对应的算子上。 如下图所示,最大绝对误差在Trilu_233这个算子处发生突变(溢出)。如果用户对模型比较了解,可以继续排查模型网络中使用这个算子的地方,否则需要向华为工程师求助。 图3 误差分析 该算子精度问题是由MindSpore Lite 2.1.0版本引入,在华为工程师修复该问题后,端到端的pipeline模型的输出能够对齐。 图4 修复后推理结果