概述
在PyTorch训练网络,对同一模型或API调试过程中,遇到API相关的计算精度问题,定位时费时费力。
ptdbg_ascend为PyTorch精度工具,用来进行PyTorch整网API粒度的数据dump、精度比对和溢出检测,从而定位PyTorch训练场景下的精度问题。
使用场景
主要的使用场景包括:
- 同一模型,从CPU或GPU移植到NPU中存在精度下降问题,对比NPU芯片中的API计算数值与CPU或GPU芯片中的API计算数值,进行问题定位。
- 同一模型,进行迭代(模型、框架版本升级或设备硬件升级)时存在的精度下降问题,对比相同模型在迭代前后版本的API计算数值,进行问题定位。
基本原理
精度对比工具,通过在PyTorch模型中注册hook,跟踪计算图中API的前向传播与反向传播时的输入与输出,排查存在计算精度误差,进行问题的精准定位。
精度比对流程:
- 当模型在CPU或GPU上进行正向和反向传播时,分别dump每一层的数值输入与输出。
- 当模型在NPU中进行计算时,采用相同的方式dump下相应的数据。
- 通过对比dump出的数值,计算余弦相似度和最大绝对误差的方式,定位和排查NPU API存在的计算精度问题,如图1所示。
图1 精度比对逻辑参考图
图1即为精度对比的基本逻辑,以下要点需要注意:
- 需要控制CPU/GPU侧与NPU侧运行的模型参数和超参数相同,控制两侧模型的原始输入相同,并固定dropout随机性。
- 同一个torch API在不同硬件上执行可能会调用不同的API,造成两边API不匹配。表现如下图2。
图2 运行流程对比图
由于可能会出现融合API,所以在API的逐一匹配时可能会出现错误匹配或无法匹配的问题,例如图2中NPU API npu_op_1与npu_op_2无法和cpu_op_k进行匹配,会跳过当前API的匹配,直到到npu_op_3和cpu_op_3才重新对齐开始匹配。
- 在模型执行过程中,前面的API输出会作为后续API的输入,因此我们要重点关注输出产生误差的第一个API。
API匹配条件
进行精度比对时,需要判断CPU或GPU的API与NPU的API是否相同可比对,须满足以下匹配条件:
- 两个API的名称相同,API命名规则:{api_type}_{api_name}_{api调用次数}_{正反向}_{输入输出}.index,如:Functional_conv2d_1_backward_input.0。
- 两个API的输入输出Tensor数量和各个Tensor的Shape相同。
通常满足以上两个条件,ptdbg_ascend就认为是同一个API,成功进行API的匹配,后续进行相应的计算精度比对。