nvidia-smi
nvidia-smi
介绍与使用
nvidia-smi,全称为 NVIDIA System Management Interface,是一个跨平台的命令行工具,用于监控和管理 NVIDIA GPU 的状态和性能。它可以显示 GPU 的详细信息,包括型号、驱动版本、内存使用情况、温度、功耗等。此外,它还可以用于控制 GPU 的行为,如调整频率、设置风扇转速等。
在日常的 DL 过程中,应首先关注 GPU 资源的使用情况,否则当资源不足时可能出现 cuda out of memory 等错误。
nvidia-smi 的使用方式就是其本身:
1 | nvidia-smi |
显示信息如下:
1 | Fri May 17 16:16:12 2024 |
从上至下分为两个表格,先看下面的表格,主要显示占用 GPU 资源的进程信息,从左到右分别为:
GPU:GPU 编号,与数组下标类似,从 0 开始GI ID: GPU 实例 ID(用于 MIG 模式),在非 MIG 模式下为N/ACI ID:计算实例 ID(用于 MIG 模式),在非 MIG 模式下为N/APID:进程 IDType:进程类型G:表示图形进程C:表示计算进程
Process name:进程的名称和路径GPU Memory Usage:进程占用 GPU 的内存量
[!note] 总结
通常情况下,根据 Processes 表中的信息,即可判断出:谁的哪个进程占用了某张卡的多少资源。还可以在拳头够大友好交流的前提下,根据 PID 杀死该进程。
再来看上面的表格,首先是第一行:
NVIDIA-SMI:工具版本Driver Version:驱动版本CUDA Version:Driver API 对应的 CUDA 版本(这是一个略复杂的问题,有空再写)
第二行是表头,的每个格子内分为若干行,每行有若干字段。这个表格的正确读取方式为:每个单词都代表一个独立值。例如第二行第一个格子内实际上有 7 个值,分别为:
GPU:GPU 编号Name:GPU 名称Persistence-M:是否开启持久模式Fan:GPU 风扇的当前速度百分比Temp:GPU 的当前温度(摄氏度)Perf:当前的性能状态P8:表示最低功耗状态P0:表示最高性能状态
Pwr:Usage/Cap:当前功耗和最大功耗(瓦特)
第二行第二列:
Bus-Id:GPU 在 PCIe 总线上的标识符Disp.A:显示设备是否正在使用 GPU(on/off)Memory-Usage:GPU 内存使用情况
第二行第三列:
Volatile Uncorr. ECC:易失性不可纠正错误计数GPU-Util:GPU 利用率百分比Compute M.:计算模式Default:默认计算模式Exclusive Thread:每个 GPU 只能被一个线程访问Prohibited:禁止使用 CUDA
MIG M.:多实例 GPU(MIG)模式
Memory-Usage 与 GPU-Util
以上表为例,不难发现 Memory-Usage 存在 GPU 内存占用时,GPU-Util 百分比为 0。
因为当前 GPU 并没有进行计算任务(如深度学习训练或推理),但仍然有内存被分配和占用。
👻幽灵占用
“幽灵占用”问题与上一节类似,主要体现在 Memory-Usage 大量占用,但不仅 GPU-Util 百分比为 0,而且 Processes 表中没有进程或进程占用量与上面显示的不符。
[!tip]
“幽灵占用”这名字是我随口起的,不确定这个问题的学名叫什么。。。
这种情况多是由于用户运行了一些自己都不知道是什么玩意的代码,自然也就不知道产生的进程究竟有没有结束,见下图:
针对此类问题,可以尝试以下几步:
1 | # 先查看哪些进程在使用 GPU 设备文件 |
如果能找到可疑进程,直接根据输出的 PID 杀死即可。
如果这一招也不行,那就采用一个更无脑但有效的方案:
1 | ps aux | grep python |
直接找 Python 相关的进程,一个个杀。


