昇腾社区首页
中文
注册

训练调试

执行训练过程中,用户可使用以下方法进行调试。

  • 打点定位:由于PyTorch框架是异步执行框架,直接使用print打点可能无法准确定位问题所在位置,需要使用流同步接口辅助打点。该方法适用于问题定位场景。
    print(torch.npu.synchronize(),"debug message")
    
    print(inputs.shape, inputs.dtype, inputs,storage().npu_format) #所需打印参数可根据实际情况变更
  • 断点调试:在需要设置断点的部分添加函数。
    • 方法一:在代码中引入pdb模块,在需要设置断点的部分添加set_trace函数触发调试器,脚本运行至此处会停留,通过在命令行中输入n执行下一行代码,输入p {变量名}可打印当前变量的值,更多参数介绍请参见pdb参数说明
      import pdb
      pdb.set_trace()
    • 方法二:在需要设置断点的部分添加breakpoint函数,脚本运行至此处会停留。
      breakpoint()
  • 命令行调试(gdb):主要功能为在程序中设置断点、监视变量、单步骤运行、运行时改变变量值、跟踪路径、线程切换。此方法主要针对coredump,可使用gdb调试core文件,打印堆栈。gdb工具使用请参考官方文档
    #调试core文件
    gdb python3 core

    生成coredump文件的步骤如下:

    1. 设置生成coredump文件(ulimit设置)。
      # 查看当前设置, 0表明不生成coredump文件
      ulimit -c
      # ulimit -c size 可以设置coredump文件大小;unlimited为无限制,此时如果进程崩溃就会生成coredump文件
      ulimit -c unlimited
    2. 设置coredump文件存储位置和名称。
      # 查看coredump文件生成目录的两种方法
      sysctl -a | grep core.pattern
      cat /proc/sys/kernel/core_pattern
      # 临时修改coredump文件生成目录
      sysctl -w kernel.core_pattern=core-%e.%p.%h.%t
      # 固化coredump生成目录
      echo "/pathtocoredump/core.%e.%p" >/proc/sys/kernel/core_pattern

      可以在core.pattern模板中使用的变量见下表。

      表1 core.pattern模板可使用变量

      变量名称

      说明

      %%

      单个%字符

      %p

      所dump进程的进程ID

      %u

      所dump进程的实际用户ID

      %g

      所dump进程的实际组ID

      %s

      导致本次core dump的信号

      %t

      core dump的时间 (由1970年1月1日计起的秒数)

      %h

      主机名

      %e

      程序文件名

    3. coredump文件生成。

      运行以下test_coredumpy.py脚本,即可在当前目录下生成coredump文件“core*.*”。

      # test_coredumpy.py 
      # 运行以下代码会产生coredumpy
      import sys
      def recursive_sum(x):
          return x + recursive_sum(x - 1) if x > 0 else 0
      print('Bumping up recursion limit...')
      sys.setrecursionlimit(1000000000)
      print(f'sys.getrecursionlimit()={sys.getrecursionlimit()}')
      print(f'recursive_sum(100)={recursive_sum(100)}')
      print(f'recursive_sum(1000)={recursive_sum(1000)}')
      print(f'recursive_sum(10000000)={recursive_sum(10000000)}')
    4. coredump文件使用。

      可以在gdb中执行命令gdb python core*.*来使用生成的coredump文件。

  • Hook定位:该方法主要针对定位模型中某个module的报错,通常适用于正反向module的报错定位。在代码执行模型计算之前添加hook,定位到具体行后,打印所有shape、dtype、format后配合host日志辅助排查问题。
    def hook_func(name, module):
        def hook_function(module, inputs, outputs):
            print(name)
        return hook_function
    
    for name, module in model.named_modules():
        if module is not None:
            module.register_forward_hook(hook_func('[forward]:' + name, module))
            module.register_backward_hook(hook_func('[backward]:' + name, module))