完成脚本迁移后,在训练适配过程中,如果遇到问题,可以使用以下方法进行调试,确认问题代码发生的位置以及原因。
其他常见报错问题和解决方法可参见《常见问题》。
print(torch.npu.synchronize(),"debug message") print(inputs.shape, inputs.dtype) #所需打印参数可根据实际情况变更
该方法适用于问题定位场景,正式训练可删除。
import pdb pdb.set_trace()
脚本运行至pdb.set_trace()处会暂停,通过在命令行中输入命令操作,例如输入n可以执行下一行代码,输入p {变量名}可打印当前变量的值,更多参数介绍请参见常用pdb参数说明。
下图展示了在执行训练的循环中设置pdb并尝试打印变量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模板中使用的变量见表1。
gdb python3 core*.* #coredump文件名请根据用户自己的设置修改
执行命令后,gdb工具会将发生异常的代码、其所在的函数、文件名和所在文件的行数打印到屏幕,方便定位问题。样例回显如下图。
gdb模式中常用的调试命令如表2。
命令 |
功能说明 |
---|---|
l |
列出代码 |
break num |
在某行设置断点,num为样例行号 |
info break |
查看断点信息 |
r |
运行程序 |
n |
单条命令执行 |
c |
继续执行 |
p parmname |
打印变量 |
bt |
查看函数堆栈 |
finish |
退出函数 |
q |
退出gdb |
更多调试命令请参考官方文档。
在脚本中添加如下代码,定义hook。
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))
下图展示了添加hook函数后的日志打印内容,可以看到模型的每个模块名被打印出来,用户也可以通过修改hook_func函数,自定义想打印的内容。