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/A
CI ID
:计算实例 ID(用于 MIG 模式),在非 MIG 模式下为N/A
PID
:进程 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 相关的进程,一个个杀。