文档
注册

概述与原理

概述

因为在同一模型或算子调试过程中,用户定位算子相关的计算精度问题时费时费力,所以推出了精度比对工具ptdbg_ascend。精度比对工具通过在PyTorch模型中注入hook,跟踪计算图中算子的前向传播与反向传播时的输入与输出,排查存在的计算精度误差,进行问题的精准定位。

使用场景

  • 同一模型从GPU(或CPU)移植到NPU中存在精度下降问题,对比NPU芯片中的算子计算数值与GPU(CPU)芯片中的算子计算数值,进行问题定位。
  • 同一模型进行迭代(模型、算子或设备迭代)时存在精度下降问题,对比相同模型在迭代前后版本的算子计算数值,进行问题定位。

基本原理

普遍适用的比对方法是以模型为单位,采用hook机制挂在模型上。当模型在CPU(或GPU)上进行正向传播时跟踪并dump每一层的数值输入与输出,在反向传播时跟踪并dump每一层的梯度输入值与输出值;同样的当模型在NPU中进行计算时采用相同的方式记录下相应的数据,通过对比dump出的数值,计算两者的余弦相似度、均方根误差和最大绝对误差,定位和排查NPU算子存在的计算精度问题。

图1 精度比对逻辑参考图

图1即为精度对比的基本逻辑,以下要点需要注意:

  1. 需要控制CPU/GPU侧与NPU侧运行的模型参数和超参数相同,控制两侧模型的原始输入相同,并固定dropout随机性。
  2. 同一个torch API在不同硬件上执行可能会调用不同的算子,造成两边算子不匹配。表现如下图2
    图2 运行流程对比图

    由于可能会出现融合算子,所以在算子的逐一匹配时可能会出现错误匹配或无法匹配的问题,例如图2中NPU算子npu_op_1与npu_op_2无法和cpu_op_k进行匹配,会跳过当前算子的匹配,直到到npu_op_3和cpu_op_3才重新对齐开始匹配。

  3. 在模型执行过程中,前面的算子输出会作为后续算子的输入,因此我们要重点关注输出产生误差的第一个算子。

算子匹配条件

判断运行在CPU和NPU上的两个算子是否相同的条件如下:

  1. 两个算子的名字是否相同。
  2. 两个算子的输入输出tensor数量和各个tensor的shape是否相同。

通常满足以上的两个条件,就认为是同一个算子,可以成功进行算子的匹配,后续进行相应的计算精度比对。如果比对结果中产生大量名字或者shape不匹配的情况,建议优先检查NPU与CPU/GPU运行的模型超参数是否一致。

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词