NVIDIA 显卡显存占用高但是 nvidia-smi 查不到

解决方案

假设是 3 号卡,用 sudo lsof /dev/nvidia3 看看有哪些进程正在使用这个设备。然后用各种手段查看各个可疑进程的信息(假设进程号是 66666):

  • ps ww 66666BSD 风格的 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”。但是服务器上的包已经是最新了,显卡驱动也不好随意更改,这件事情就不了了之了。