文档
注册

溢出检测自动性质判定功能使用

溢出检测自动性质判定是ptdbg溢出检测工具的一项子功能,主要用于对检测出来的溢出结果进行判定并给出对应的解决方案。

图1 溢出检测场景

如图所示,我们将溢出的情况分为了5种情况,下文会具体介绍5种情况的检测结果。

  1. 参见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,来判断是否溢出。
      1. 饱和模式相对于INF_NAN模式校验更为严格,因此训练中因溢出导致的跳过梯度更新的迭代要更多。INF_NAN模式与GPU对齐,检查计算出的grad中是否存在inf或nan,来判断是否溢出;因此就算过程中有inf或nan,但结果中没有,该轮迭代也不会跳过梯度更新。饱和模式下,每轮迭代任何计算过程中有溢出,芯片标志位则被使能,在溢出检查时则被判断为溢出,跳过梯度更新。
      2. 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信息
  2. 参见 工具安装完成工具的安装。
  3. 使用精度预检工具执行命令如下:
    cd $ATT_HOME/debug/accuracy_tools/API_accuracy_checker/run_ut 
    python3 run_overflow_check.py -forward ./forward_info_{pid}.json 

    由于反向过程无法获取该API对应前向的信息,因此无法完整复现反向的计算过程,因此反向过程溢出的API暂不支持这一功能,后续支持会在此更新说明。

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

当前产品无相关内容

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