pytorch的dataloader在num_worker>0子进程没有在主进程被kill时被清理

时间:2024-03-24 17:30:12

复现步骤:

pytorch dataloader的num_worker设为大于0的数(例如8),然后执行后台运行脚本的命令:nohup python -u script.py &,shell会返回进程pid,下图中我还加了指定GPU的环境变量以及输出重定向:

pytorch的dataloader在num_worker>0子进程没有在主进程被kill时被清理

使用 watch -n .5 ps aux --sort -rss' 持续按照内存从大到小查看进程,dataloader的代码执行之后会发现有1+8个你创建的进程是占用内存排在前列的(下图中我的用户名是xiepengyu):

pytorch的dataloader在num_worker>0子进程没有在主进程被kill时被清理
其中第一个进程就是主进程,即pid(第二列)为19528的进程,其状态为Rl,即正在运行中。其余进程状态为Sl,即睡眠中。此时使用kill -9 19528命令来kill掉主进程后,会发现其余子进程还没有被kill掉。

pytorch的dataloader在num_worker>0子进程没有在主进程被kill时被清理

pytorch的dataloader在num_worker>0子进程没有在主进程被kill时被清理

为了清理掉这些进程,第一种方法是在前面查看进程后一个一个地kill掉其余进程,例如kill -9 21319等等。另一种方案,首先确保自己没有其他python进程在跑了,则在准备结束脚本时不要使用 kill -9,而是使用 killall python ,这样你的账号创建的python进程都会被kill掉,而其他用户的python进程则提示没权限kill:

pytorch的dataloader在num_worker>0子进程没有在主进程被kill时被清理