NVIDIA 显卡显存占用高但是 nvidia-smi 查不到
解决方案
假设是 3 号卡,用 sudo lsof /dev/nvidia3
看看有哪些进程正在使用这个设备。然后用各种手段查看各个可疑进程的信息(假设进程号是 66666):
ps ww 66666
(BSD 风格的ps
,而不是 System V)。cat /proc/66666/status
查看进程状态。除了 status 之外,还有其他信息可以在 /proc 下查看。htop -p 66666
或者top -p 66666
。
确定进程没用之后,就可以根据 PID 杀掉进程了。
Tip
除了 lsof
之外,还可以用 fuser
查找正打开文件或者 socket 的进程。根据 https://unix.stackexchange.com/a/60497/ ,lsof
更适合找一个进程打开的所有的文件,而 fuser
更适合找特定文件被什么进程打开了,比如 fuser -uv
,详见刚刚的链接。
在 Debian 下使用 fuser
需要安装 psmisc(pstree
也是这个包)。
如果不给管理员权限,lsof
可能会输出错误信息并遗漏内容,fuser
则可能会静默失败。
现象分析
现象:在 nvidia-smi
上查不到,在 nvitop
上能查到但显示“No Such Process”。
当时服务器上占用资源较多的几个进程都在 S(sleep)或者 T(stopped)状态,可能是因为不活跃所以才在 nvidia-smi 查不到?它们主要占的是内存和显存,而不占用 CPU 和 GPU 的计算性能,但是 nvidia-smi 结果中的 GPU util 数值却是 100%。参考 understanding-gpu-performance 这篇文章,nvidia-smi 给出的 GPU util 是按占用时间来算的(比如 1 秒中有多少时间显卡没有完全闲下来,但凡带一点任务都算在使用),而不是按照负载算的,可能是进程正在执行 CUDA kernel 的时候就停住了,占用了 SM?
相关链接
有一个 Stack Overflow 问题和这里的情况一模一样: https://stackoverflow.com/questions/71433347/no-such-process-consumes-gpu-memory 其中有个链接点进去还建议可以尝试使用 sudo nvidia-smi --gpu-reset -i 0
的方式重置 GPU。
https://github.com/XuehaiPan/nvitop/issues/75 提到当上游的 nvidia-ml-py 版本和显卡驱动版本不匹配的时候,就会得到错误的进程号,导致显示“No Such Process”。但是服务器上的包已经是最新了,显卡驱动也不好随意更改,这件事情就不了了之了。