执行训练过程中,用户可使用以下方法进行调试。常见报错问题和解决方法可参见FAQ。
print(torch.npu.synchronize(), "debug message") print(inputs.shape, inputs.dtype, inputs, storage().npu_format) # 所需打印参数可根据实际情况变更
import pdb pdb.set_trace()
样例回显如下图。下图是在执行训练的循环中设置调试器,触发调试器后尝试打印变量Loss的值。
breakpoint()
样例回显如下图。下图是在执行训练的循环中设置断点。
ulimit -c # 查看当前设置,0表明不生成coredump文件,需要更改ulimit设置 ulimit -c unlimited # unlimited将生成coredump文件大小设置为无限制,此时如果进程崩溃就会生成coredump文件
# 临时修改生成的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 |
程序文件名 |
gdb python3 core*.* # coredump文件名请根据用户自己的设置修改
执行命令后,gdb工具会将发生异常的代码、其所在的函数、文件名和所在文件的行数打印到屏幕,方便定位问题。样例回显如下图。
gdb模式中常用的调试命令如下表。
命令 |
功能说明 |
---|---|
l |
列出代码 |
break 13 |
在某行设置断点,13为样例行号 |
info break |
查看断点信息 |
r |
运行程序 |
n |
单条命令执行 |
c |
继续执行 |
p {变量名} |
打印变量 |
bt |
查看函数堆栈 |
finish |
退出函数 |
q |
退出gdb |
更多调试命令请参考官方文档。
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))
样例回显如下图。