Pytorch 训练停止,输出显示 died with <Signals,SIGKILL.9> 问题定位过程记录

最近使用 Pytorch 进行模型训练时,模型在训练到一小部分后程序均被停止。第一次以为是由于机器上其他人的误操作,故而直接重新拉起训练。但第二次程序终止时,发现基本与第一次训练停止的训练 iteration 一致,故而尝试对问题进行定位。

问题描述

具体而言,在使用 Pytorch 训练时的错误信息类似如下所示:

  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py", line 340, in <module>
    main()
  File "/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py", line 326, in main
    sigkill_handler(signal.SIGTERM, None)  # not coming back
  File "/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py", line 301, in sigkill_handler
    raise subprocess.CalledProcessError(returncode=last_return_code, cmd=cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', xxx]' died with <Signals.SIGKILL: 9>.

问题定位

首先由于输出显示程序收到了 SIGTERM 信号,所以尝试寻找发出对应信号的位置。由于发送信号的行为需要经过操作系统 kernel,这里可以通过 dmesg 命令查看最近的内核操作(实际是输出了内核中记录行为的 kernel ring buffer 的内容)来查看是否存在相关的信息。具体命令如下所示,其中 dmesg 的 -T 选项表示显示命令的操作时间。grep 的 -E 参数表示使用拓展的正则表达式进行匹配。 -i 参数表示忽略匹配的大小写问题,-B num 参数表示在匹配行之前另外输出 num 行的数据,主要可以用来看是否有上下文的相关信息。命令来自What killed my process and why?

dmesg -T | grep -E -i -B100 'killed process'

这里显示用户 uid = 1002 的进程由于 OOM 即 out of memory 的问题被 kill 了,且给出了在终止时整体的虚拟地址的使用量。这里可以通过 id 命令获取个人用户的 uid / gid 等内容。

id        // 获取当前用户的 uid 等信息

通过 id 命令确认了 uid = 1002 即为当前笔者的用户 id。故而可以确定程序终止的原因是程序运行过程中发生了 OOM 导致系统向程序发送了 SIGTERM 信号。结合之前笔者发现程序总是在训练到一定的 iteration 时即结束,即可猜测是由于程序存在内存泄露问题,导致随着训练的进行,内存占用越来越大,从而最终出现 OOM。

原文链接:

https://www.cnblogs.com/yhjoker/p/15599119.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值