溢出检测自动性质判定功能使用
溢出检测自动性质判定是ptdbg溢出检测工具的一项子功能,主要用于对检测出来的溢出结果进行判定并给出对应的解决方案。
图1 溢出检测场景
如图所示:我们将溢出的情况分为了5种情况,下文会具体介绍5种情况的检测结果。
- 参见PrecisionDebugger功能使用使能ptdbg的溢出检测功能检测网络训练过程中的溢出API,各rank单独计算溢出次数。
from ptdbg_ascend import PrecisionDebugger as PD debugger = PD(dump_path="./", hook_name="overflow_check") # 初始化溢出检测 debugger.configure_hook(overflow_nums=3) # 设置为检测3次溢出后退出 ... PD.start() ... PD.stop()
在训练过程中,工具会在日志中提示检测到溢出以及给出相关建议,具体情况如下:- 情况1:对于输入已经有溢出的场景,检测结果中会提示用户该API的输入已经存在溢出。见下图。
图2 API溢出
- 情况2:在NPU设备上,溢出存在饱和模式和非饱和模式(INF_NAN)两种模式。饱和模式是通过检测芯片标志位的状态来判断是否存在溢出,存在输入输出都无溢出,但中间计算过程有溢出从而被检测到溢出的情况。非饱和模式与GPU对齐,检查计算出的输出中是否存在inf或nan,来判断是否溢出。
- 饱和模式相对于INF_NAN模式校验更为严格,因此训练中因溢出导致的跳过梯度更新的迭代要更多。INF_NAN模式与GPU对齐,检查计算出的grad中是否存在inf或nan,来判断是否溢出;因此就算过程中有inf或nan,但结果中没有,该轮迭代也不会跳过梯度更新。饱和模式下,每轮迭代任何计算过程中有溢出,芯片标志位则被使能,在溢出检查时则被判断为溢出,跳过梯度更新。
- INF_NAN模式下,检查grad tensor中是否有inf或nan或增加一些计算开销,相比饱和模式下检查芯片溢出标志位会有性能下降。
对于过程溢出的场景,检测结果中会根据输入输出的情况提示用户该API属于过程溢出。
可通过下面的环境变量启用INF_NAN模式
export INF_NAN_MODE_ENABLE=1
图3 过程溢出结果
- 情况3:如果整网训练过程中检测到了溢出,但将该API的输入输出保存下来后,使用精度预检工具却发现没有溢出。这种情况建议用户首先开启INF_NAN模式,重新做检测,如果依然存在上述问题,需要使用精度比对工具在整网中检查精度问题原因。
- 情况4和情况5:情况4和情况5都属于输入正常,输出存在溢出的情况,这也是溢出场景中最普遍的情况。针对输入正常但输出存在溢出的API,ptdbg溢出检测会在训练执行目录下将溢出的API信息按照前向和反向分类,dump并保存为forward_info_{pid}.json和backward_info_{pid}.json。前向过程溢出的API可通过 精度预检工具对json文件进行解析,输出溢出API为正常溢出还是非正常溢出,从而帮助用户快速判断。
保存的API输入数据如下所示:
图4 API输入数据
保存的json信息如下所示:
图5 保存的json信息
- 情况1:对于输入已经有溢出的场景,检测结果中会提示用户该API的输入已经存在溢出。见下图。
- 参见 工具安装完成工具的安装。
- 使用精度预检工具执行命令如下:
cd $ATT_HOME/debug/accuracy_tools/API_accuracy_checker/run_ut python3 run_overflow_check.py -forward ./forward_info_{pid}.json
由于反向过程无法获取该API对应前向的信息,因此无法完整复现反向的计算过程,因此反向过程溢出的API暂不支持这一功能,后续支持会在此更新说明。
父主题: 使用示例