GPU无进程但显存占用

在服务器的docker里面使用显卡发现在终端 ctrl + c之后,代码会停掉但是GPU资源不会释放。
nvidia-smi里面还看不到PID进程号,有PID号直接kill 就行了

如果想要把GPU上所有程序全都杀掉可以执行下面的命令

fuser -v /dev/nvidia* |awk '{for(i=1;i<=NF;i++)print "kill -9 " $i;}' | sh

但是我的显卡跑了多组实验,一个实验正常再跑,另一组停掉了。我不希望把显卡上所有程序都杀掉,只释放已经Kill掉进程的那一组显存就行。所以就捣鼓了一下,写成blog造福大家!
为了保险起见我将要杀死的进程的 PID 号保存到一个文件中,而不是直接杀死它们,当然也是可以做到。通过修改下面的命令就可以实现:
grep /debug 是查找命令里面的关键字区分,哪一组是正在跑,哪一组是死掉了的
echo $pid >> pids_to_kill.txt 可以替换为kill -9 $pid 来直接杀掉

fuser -v /dev/nvidia* | awk '{print $0}' | grep -Eo '[0-9]+' | while read pid; do cmd=$(ps -fp $pid | grep /debug); if [ -n "$cmd" ]; then echo $pid >> pids_to_kill.txt; fi; done

上面这个命令会将所有包含 /debug 字符串的、正在使用 NVIDIA GPU 的进程的 PID 号写入到 pids_to_kill.txt 文件中,而不是直接杀死这些进程。
可以在需要的时候使用这个文件来杀死这些进程。

while read pid; do kill -9 $pid; done < pids_to_kill.txt

这个命令会读取 pids_to_kill.txt 文件中的每一行(也就是每一个 PID),然后杀死对应的进程。

你可能感兴趣的:(gpu,bash,深度学习)