服务器的GPU怎么看,为什么明明下面的进程没有占用这么多,但是上面已经满了,可用的显存很少?
问题描述
在服务器上使用 nvidia-smi 查看 GPU 显存使用情况时,发现显存几乎被占满,可用显存很少。然而,通过 nvidia-smi pmon 或 ps aux | grep python 等命令查看具体进程的显存占用时,却发现这些进程的显存使用总量远低于实际已使用的显存。这种现象可能由哪些原因导致?如何进一步排查并解决显存占用不匹配的问题?
问题分析
1. 框架缓存未释放
- 从输出中可以看到 python 进程(如PID: 2188 和 9374)正在以计算模式(C 类型)运行。
- 深度学习框架(如 PyTorch 或 TensorFlow)可能会保留显存作为缓存,即使当前没有活跃的任务在运行。
- 缓存不会立即释放,因此可能导致显存占用看起来比实际使用的更多。
2. 隐藏或未显示的显存分配
- nvidia-smi 的默认视图可能无法显示所有显存分配细节。
- 某些进程可能已经退出,但它们分配的显存尚未被释放。
3. 系统或驱动程序占用
- 显卡驱动程序本身会占用一部分显存,尤其是在启用了持久模式(Persistence Mode)的情况下。
- 系统服务(如 Xorg 和 gnome-shell)也可能占用显存。
4. 硬件或驱动问题
- 如果上述原因都无法解释显存占用,可能是硬件层面的问题,或者 NVIDIA 驱动报告的显存使用情况不准确。
实例
以我自己的情况举例,下面是现在显示的情况
首先检查显存使用情况:
nvidia-smi
如果想看其中一个PID的详细情况可以用以下语句
ps aux | grep PID
# 比如
# ps aux | grep 1925
结果如下:可以看到详细的用户信息,进程名字等等
方法 1:清空深度学习框架缓存
如果你使用的是 PyTorch 或 TensorFlow,可以尝试以下操作来清空缓存:
- PyTorch:
import torch
torch.cuda.empty_cache()
- TensorFlow:
import tensorflow as tf
tf.keras.backend.clear_session()
方法 2:终止不必要的 GPU 进程
从 nvidia-smi pmon 输出中可以看到有两个 python 进程(PID: 2188 和 9374)。如果这些进程不再需要,可以手动终止它们:
kill -9 2188
kill -9 9374
但是我清理完了之后仍然是没有用,后来通过以下方式检查是否有 Python 脚本仍在运行,并手动清理缓存:
ps aux | grep python
显示的结果如下:
然后下面还有很多-009这个用户的程序,但是明明我这个用户的程序都停了,所以怀疑是没有释放显存
通过 pkill 快速终止
pkill 是一个非常方便的工具,可以根据用户名或其他条件快速终止进程。
终止所有 -009 用户的进程:
pkill -u -009
这条命令会终止当前系统中所有属于 -009 用户的进程。
然后再使用nvidia -smi 进行查看,发现现在就正常了
完结撒花!!!
评论前必须登录!
注册