复现步骤:
pytorch dataloader的num_worker设为大于0的数(例如8),然后执行后台运行脚本的命令:nohup python -u script.py &
,shell会返回进程pid,下图中我还加了指定GPU的环境变量以及输出重定向:
使用 watch -n .5 ps aux --sort -rss'
持续按照内存从大到小查看进程,dataloader的代码执行之后会发现有1+8个你创建的进程是占用内存排在前列的(下图中我的用户名是xiepengyu):
其中第一个进程就是主进程,即pid(第二列)为19528的进程,其状态为Rl,即正在运行中。其余进程状态为Sl,即睡眠中。此时使用kill -9 19528
命令来kill掉主进程后,会发现其余子进程还没有被kill掉。
为了清理掉这些进程,第一种方法是在前面查看进程后一个一个地kill掉其余进程,例如kill -9 21319
等等。另一种方案,首先确保自己没有其他python进程在跑了,则在准备结束脚本时不要使用 kill -9
,而是使用 killall python
,这样你的账号创建的python进程都会被kill掉,而其他用户的python进程则提示没权限kill: