执行训练过程中,用户可使用以下方法进行调试。
print(torch.npu.synchronize(),"debug message") print(inputs.shape, inputs.dtype, inputs,storage().npu_format) #所需打印参数可根据实际情况变更
import pdb pdb.set_trace()
breakpoint()
#调试core文件 gdb python3 core
生成coredump文件的步骤如下:
# 查看当前设置, 0表明不生成coredump文件 ulimit -c # ulimit -c size 可以设置coredump文件大小;unlimited为无限制,此时如果进程崩溃就会生成coredump文件 ulimit -c unlimited
# 查看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模板中使用的变量见下表。
变量名称 |
说明 |
---|---|
%% |
单个%字符 |
%p |
所dump进程的进程ID |
%u |
所dump进程的实际用户ID |
%g |
所dump进程的实际组ID |
%s |
导致本次core dump的信号 |
%t |
core dump的时间 (由1970年1月1日计起的秒数) |
%h |
主机名 |
%e |
程序文件名 |
运行以下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)}')
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))