kill杀死程序流程
最近在学习Pytorch的DistributedDataParallel API进行多GPU并行计算的实现,并行虽好,但是一旦代码有bug手动强行终止运行,经常出现部分进程还没终止的现象,还在后台运行占用资源,必须手动杀死进程。然而kill进程却没那么顺利,有些进程怎么也杀不死,看了好些方法都没用,最后自己摸索了出来,特此记录一下这个坑。
由于服务器上不是所有用户都有根权限,所以指令可能无效。如果出现无效的情况,加上根权限即可
sudo 你的指令
检查GPU进程
nvidia-smi
强行终止代码运行后查看一下GPU运行情况,看看各个GPU的负载和进程
nvidia-smi
可以看到GPU0和GPU2上都有进程,其中PID为8545和10632的进程是torch运行产生的,而且GPU0利用率达到了100%
单卡任务kill指令
kill -GPU索引号 -PID
尝试使用指定GPU索引号和PID的指令杀死进程,无效,进程还在
kill -GPU -PID
多卡任务kill指令
fuser -v /dev/nvidia*
sudo fuser -v /dev/nvidia*
查看nvidia上所有进程的详细信息
发现进程号PID为8545、10632的进程居然在8个GPU上都存在,而nvidia-smi
显示只在GPU0或者2上。这就很容易理解了,前面单卡杀进程指令指定了GPU,但是这个PID的进程在所有GPU上运行着,自然杀不死,也就是说我被nvidia-smi
的进程信息误导了。我灵机一动,既然进程在所有GPU上,不指定GPU,只指定PID会怎么样呢?
kill -PID
sudo kill -PID
重要补充!!!若sudo kill 无效,尝试加上-9
,即
sudo kill -9 -PID
手动地一个一个的输入上面的两个进程
再次查看进程信息
发现我的账号(brian)的进程全部都被终止了,可以说是极度舒服了,我都快要哭出来了2333
小结
- 对于在单卡上的任务,可直接使用
kill -GPU -PID
杀掉进程 - 若使用单卡杀进程指令杀不死进程,
fuser -v /dev/nvidia*
检查PID号进程是否在多个GPU上运行 - 若
2==True
则使用kill -PID
杀死在多个GPU上同时运行的进程 nvidia-smi
信息不全,fuser -v /dev/nvidia*
查看进程更准- 若指令无效加上根权限
sudo
,建议指令前加根权限