GPU显存被占用无法清理问题解决

内容纲要

问题

运行了多个jupyter lab notebook后,发现out of memory
显存不够了,意识到GPU被无用的进程占用
通过nvidia-smi发现,gpu任务占用列表为空,看不到占用情况

原因

运行了一个 web_demo_streamlit,未及时关闭

解决方案

1、使用nvidia-smi命令检查GPU的使用情况

首先使用nvidia-smi命令检查GPU的使用情况,如果发现程序已经关闭了但是还有显存占用,说明有残留进程占用了显存,那么按以下方式释放:

从截图中能看出有程序占用了4388MiB的显存,此时要释放显存,那么首先找到进程ID:

2、使用ps -ef命令kill占用GPU的进程(生产环境不建议操作)

ps -ef 查看全部进程
ps -ef|grep 关键字 识别出可能用到了GPU的进程
kill -9 进程号 关掉

可以看到PID、PPID、CMD 3列重要信息,分别是进程ID、父进程ID、进程的启动命令。

通过命令可以判断哪些进程是自己程序启动的进程,比如上方的python train.py就是我启动的进程,其他的均为系统进程或无关显存占用的进程。接下来杀死进程:

从截图中看到python train.py程序的进程ID是594797,那么可以使用kill -9 594 797命令来结束进程。 但是常常占用显存的进程会很多,特别是在多卡并行时,按此方法会比较繁琐,以下介绍一种更强大的方式结束进程:

通过ps -ef能看出,我自己的进程都包含了train关键字(并且其他无关的系统进程没有包含,防止误杀),那么使用grep命令可以过滤出我自己的进程,例如:

接下来是获取进程的ID,此时可以使用awk命令,awk命令用法复杂,这里简单记住以下命令即可:

最后再通过kill命令,即可完整的结束进程。完整命令为ps -ef | grep train | awk '{print $2}' | xargs kill -9

以上输出中会多出来一个No such process的错误,可以忽略,出现原因是grep train也会产生一个进程,被自己过滤出来。

更多说明

Linux命令中的|符号称之为管道,作用是把前一个命令的输出作为下一个命令的输入(一般为stdout,stderr要做其他处理),管道的功能非常实用,在很多场景下都可以使用到,比如某个文件夹下有几万个文件,但是有一个文件是txt文件,其他均为图片,需要将此文件找出来。如果使用ls获取文件列表后人工排查非常麻烦,因此可以使用:

参考

1、AutoDL 文档 - 显存没有释放

2、AutoDL 文档 - 性能篇

先使用nvidia-smi -l 1命令查看GPU使用率,如果GPU使用率为0优先检查代码是否调用了GPU进行计算。如果GPU使用率已经为90%+,则可以考虑换多卡并行或更高算力的GPU。

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward