nvidia-smi 输出详解
做 AI Infra,第一个要学会的命令就是 nvidia-smi。
这个命令是查看 GPU 状态的,相当于 GPU 的 top。机器上 GPU 用得怎么样、谁在用、还剩多少显存,都靠它来看。
这篇文章会把 nvidia-smi 的输出逐行解释清楚,看完之后你应该能:
- 看懂每个字段的含义
- 区分 GPU 利用率和显存利用率
- 知道怎么排查常见问题
一个完整的输出
先看一个真实的 nvidia-smi 输出:
$ nvidia-smi
Wed Jan 15 10:30:45 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA A100-SXM4-80GB On | 00000000:07:00.0 Off | 0 |
| N/A 32C P0 63W / 400W | 1234MiB / 81920MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
| 1 NVIDIA A100-SXM4-80GB On | 00000000:0F:00.0 Off | 0 |
| N/A 34C P0 289W / 400W | 76543MiB / 81920MiB | 87% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 1234 C python 1230MiB |
| 1 N/A N/A 5678 C python 76539MiB |
+-----------------------------------------------------------------------------------------+
输出分两个部分:上面是 GPU 状态表,下面是进程列表。下面逐块讲。
第一行:版本信息
| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |
三个版本号:
- NVIDIA-SMI:nvidia-smi 工具本身的版本,一般和驱动版本一致
- Driver Version:NVIDIA 驱动版本,这个很重要
- CUDA Version:这台机器的驱动最高支持的 CUDA 版本
注意最后一个,很多人会误解。这里显示的 CUDA Version 不是"机器上安装的 CUDA 版本",而是"驱动支持的最高 CUDA 版本"。实际使用的 CUDA 版本取决于你的程序和容器镜像。
版本兼容性问题
这是新手最容易踩的坑之一。CUDA、驱动、PyTorch 之间有版本对应关系:
| CUDA 版本 | 最低驱动版本 |
|---|---|
| CUDA 12.2 | >= 535.54 |
| CUDA 12.0 | >= 525.60 |
| CUDA 11.8 | >= 520.61 |
| CUDA 11.7 | >= 515.43 |
如果驱动版本太低,跑高版本 CUDA 编译的程序会报错:
CUDA driver version is insufficient for CUDA runtime version
遇到这种报错,要么升级驱动,要么用低版本 CUDA 的镜像。
GPU 状态表:逐字段解释
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
这是表头,下面逐个字段讲。
GPU 和 Name
| 0 NVIDIA A100-SXM4-80GB On |
- 0:GPU 编号,从 0 开始。多卡机器会有 0、1、2、3...
- NVIDIA A100-SXM4-80GB:GPU 型号。A100 是系列名,SXM4 是接口类型(还有 PCIe 版),80GB 是显存大小
Persistence-M
Persistence-M: On
Persistence Mode,持久模式。
- On:驱动常驻内存,GPU 初始化更快
- Off:每次使用 GPU 都要重新初始化
生产环境建议开启,可以减少任务启动时间。开启命令:
sudo nvidia-smi -pm 1
Bus-Id
Bus-Id: 00000000:07:00.0
GPU 的 PCIe 总线地址。格式是 域:总线:设备.功能。
这个信息在排查多卡问题时有用。比如想知道哪张卡物理上在哪个位置,或者排查 PCIe 带宽问题。
Disp.A
Disp.A: Off
Display Active,是否有显示器连接。服务器上一般都是 Off。
Volatile Uncorr. ECC
Volatile Uncorr. ECC: 0
未校正的 ECC 错误数量。ECC 是纠错码,用来检测和修复显存中的数据错误。
- 0:正常
- 非 0:可能有显存问题,需要关注
如果这个值持续增加,说明 GPU 可能有硬件问题,建议报修。
Fan
Fan: N/A
风扇转速百分比。数据中心的 GPU(如 A100、H100)一般显示 N/A,因为散热靠机柜风扇,不是 GPU 自带风扇。消费级显卡(如 4090)会显示具体数值。
Temp
Temp: 32C
GPU 核心温度,摄氏度。
- < 50°C:很凉快,可能是空闲状态
- 50-80°C:正常工作温度
- > 80°C:偏高,需要关注散热
- > 90°C:过热,可能会降频或触发保护
持续高温会影响 GPU 寿命,也会导致性能下降(热降频)。
Perf
Perf: P0
Performance State,性能状态。从 P0 到 P12,P0 是最高性能,P12 是最低。
- P0:最高性能,跑训练/推理时应该在这个状态
- P8:空闲状态,省电模式
如果跑任务时 Perf 不是 P0,可能是功耗或温度限制了性能。
Pwr:Usage/Cap
Pwr:Usage/Cap: 289W / 400W
功耗。Usage 是当前功耗,Cap 是功耗上限。
- 左边 289W 是当前实际功耗
- 右边 400W 是这张卡的功耗墙
如果 Usage 接近 Cap,说明 GPU 在满载。功耗也可以作为"GPU 是否在干活"的一个参考指标。
Memory-Usage
Memory-Usage: 76543MiB / 81920MiB
显存使用情况。左边是已用,右边是总量。
- 76543 MiB 是当前占用的显存
- 81920 MiB 是总显存(80GB)
这个是最常关注的指标之一。显存不够就会 OOM。
MiB 和 MB 的区别
nvidia-smi 用的是 MiB(Mebibyte),不是 MB(Megabyte):
- 1 MiB = 1024 × 1024 = 1,048,576 字节
- 1 MB = 1000 × 1000 = 1,000,000 字节
81920 MiB ≈ 85.9 GB,但习惯上说"80GB 显存"是因为厂商用的是 GB 为单位的近似值。
GPU-Util
GPU-Util: 87%
GPU 利用率,这是另一个最重要的指标。
表示 GPU 计算单元在过去一个采样周期内有多少时间在工作。
- 87%:大部分时间在计算,很健康
- < 30%:利用率偏低,可能有问题
GPU 利用率 vs 显存利用率
这是面试常问的问题,也是很多人容易混淆的概念:
- 显存利用率 = 已用显存 / 总显存:只说明内存占用了多少
- GPU 利用率:说明计算单元有多少时间在干活
两者是独立的。完全可能出现:
| 场景 | 显存利用率 | GPU 利用率 |
|---|---|---|
| 加载了大模型但没跑推理 | 高 | 低 |
| 跑小模型但计算密集 | 低 | 高 |
| 数据加载慢,GPU 在等数据 | 高 | 低 |
| 满载训练 | 高 | 高 |
所以看 GPU 用得好不好,要同时看这两个指标。显存占满但 GPU 利用率很低,说明 GPU 在闲着,可能是数据加载、通信等其他环节是瓶颈。
Compute M.
Compute M.: Default
Compute Mode,计算模式:
- Default:允许多个进程同时使用 GPU
- Exclusive_Process:同一时间只允许一个进程使用
- Prohibited:禁止 CUDA 计算
一般用 Default 就行。
MIG M.
MIG M.: Disabled
Multi-Instance GPU 模式是否开启。
MIG 是 A100/H100 支持的功能,可以把一张大卡切分成多个小 GPU 实例,实现硬件级别的隔离。后面会专门讲。
进程列表
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 1234 C python 1230MiB |
| 1 N/A N/A 5678 C python 76539MiB |
+-----------------------------------------------------------------------------------------+
显示哪些进程在用 GPU。
- GPU:使用的 GPU 编号
- GI ID / CI ID:MIG 相关的 ID,没开 MIG 就是 N/A
- PID:进程 ID
- Type:进程类型,C 表示 Compute(计算),G 表示 Graphics(图形)
- Process name:进程名
- GPU Memory Usage:这个进程占用的显存
通过 PID 可以进一步查看是哪个用户在跑什么任务:
ps -p 5678 -o user,cmd
常用参数
持续监控
# 每秒刷新一次
nvidia-smi -l 1
# 或者用 watch
watch -n 1 nvidia-smi
只看简要信息
nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total --format=csv
# 输出:
# index, name, utilization.gpu [%], memory.used [MiB], memory.total [MiB]
# 0, NVIDIA A100-SXM4-80GB, 0 %, 1234 MiB, 81920 MiB
# 1, NVIDIA A100-SXM4-80GB, 87 %, 76543 MiB, 81920 MiB
这个格式适合脚本处理或者接入监控系统。
查看 GPU 拓扑
nvidia-smi topo -m
输出:
GPU0 GPU1 GPU2 GPU3 CPU Affinity NUMA Affinity
GPU0 X NV12 NV12 NV12 0-31 0
GPU1 NV12 X NV12 NV12 0-31 0
GPU2 NV12 NV12 X NV12 32-63 1
GPU3 NV12 NV12 NV12 X 32-63 1
Legend:
X = Self
NV# = Connection traversing a bonded set of # NVLinks
PHB = Connection traversing PCIe as well as a PCIe Host Bridge (different CPU socket)
这个命令显示 GPU 之间的连接方式:
- NV12:通过 12 条 NVLink 连接,带宽很高
- PHB:要通过 PCIe 和 CPU 桥接,带宽较低
分布式训练时,尽量让通信频繁的 GPU 走 NVLink。
重置 GPU
# 重置指定 GPU(需要没有进程在用)
sudo nvidia-smi -r -i 0
GPU 状态异常时可以尝试重置。但如果有进程在用,会失败。
常见问题排查
问题一:显存被占满但不知道被谁占的
nvidia-smi 进程列表是空的,但显存显示被占用了。
可能原因:
- 僵尸进程:进程已经退出但显存没释放干净
排查:
# 查找所有使用 GPU 的进程
fuser -v /dev/nvidia*
# 或者
lsof /dev/nvidia*
解决:kill 掉对应进程,或者重置 GPU。
- 显存碎片:CUDA 上下文占用
PyTorch 等框架会预先分配一些显存作为缓存,即使没有跑任务也会占用。
问题二:GPU 利用率很低
跑着任务,但 GPU-Util 只有 10-20%。
可能原因:
- 数据加载慢:CPU 处理数据跟不上 GPU 计算速度
排查:看 CPU 利用率,如果 CPU 跑满但 GPU 闲着,就是数据加载瓶颈。
解决:增加 DataLoader 的 num_workers,或者优化数据预处理。
- Batch size 太小:GPU 没吃饱
解决:在显存允许的情况下增大 batch size。
- 模型太小:计算量不够
小模型本身计算量小,GPU 来不及满载就算完了。
- 通信瓶颈:分布式训练时等待同步
多卡训练时,如果通信占比太高,GPU 大部分时间在等。
问题三:CUDA out of memory
最常见的错误:
RuntimeError: CUDA out of memory. Tried to allocate 2.00 GiB (GPU 0; 79.35 GiB total capacity; 76.54 GiB already allocated; 1.21 GiB free)
解决思路:
- 减小 batch size:最直接的方法
- 用混合精度训练:FP16 比 FP32 省一半显存
- 梯度累积:小 batch 多次累积,等效大 batch
- 模型并行:把模型切分到多张卡
问题四:驱动版本问题
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.
可能原因:
- 驱动没装:
lsmod | grep nvidia看看驱动是否加载 - 内核升级后驱动失效:重装驱动
- 驱动和 CUDA 版本不匹配:检查版本对应关系
更强大的工具:nvitop
nvidia-smi 够用,但界面比较原始。推荐一个更好用的工具:nvitop。
pip install nvitop
nvitop
它提供:
- 实时刷新的 top 风格界面
- 进程的详细信息(用户、命令行、运行时间)
- 历史曲线图
- 彩色显示,更直观
日常监控比 nvidia-smi 好用很多。
小结
nvidia-smi 是 AI Infra 工程师最常用的命令,核心要记住:
- Driver Version 和 CUDA Version 的兼容关系
- GPU-Util 和 Memory-Usage 的区别
- 怎么看进程列表 找出谁在用 GPU
- nvidia-smi topo -m 查看 GPU 拓扑
下一篇讲 GPU 的三个核心指标:显存、算力、带宽,以及它们之间的关系。