HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于

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 进程列表是空的,但显存显示被占用了。

可能原因:

  1. 僵尸进程:进程已经退出但显存没释放干净

排查:

# 查找所有使用 GPU 的进程
fuser -v /dev/nvidia*

# 或者
lsof /dev/nvidia*

解决:kill 掉对应进程,或者重置 GPU。

  1. 显存碎片:CUDA 上下文占用

PyTorch 等框架会预先分配一些显存作为缓存,即使没有跑任务也会占用。

问题二:GPU 利用率很低

跑着任务,但 GPU-Util 只有 10-20%。

可能原因:

  1. 数据加载慢:CPU 处理数据跟不上 GPU 计算速度

排查:看 CPU 利用率,如果 CPU 跑满但 GPU 闲着,就是数据加载瓶颈。

解决:增加 DataLoader 的 num_workers,或者优化数据预处理。

  1. Batch size 太小:GPU 没吃饱

解决:在显存允许的情况下增大 batch size。

  1. 模型太小:计算量不够

小模型本身计算量小,GPU 来不及满载就算完了。

  1. 通信瓶颈:分布式训练时等待同步

多卡训练时,如果通信占比太高,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)

解决思路:

  1. 减小 batch size:最直接的方法
  2. 用混合精度训练:FP16 比 FP32 省一半显存
  3. 梯度累积:小 batch 多次累积,等效大 batch
  4. 模型并行:把模型切分到多张卡

问题四:驱动版本问题

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.

可能原因:

  1. 驱动没装:lsmod | grep nvidia 看看驱动是否加载
  2. 内核升级后驱动失效:重装驱动
  3. 驱动和 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 的三个核心指标:显存、算力、带宽,以及它们之间的关系。