NVIDIA GPU显存占比 vs 显存利用率

核心区别

指标 nvidia-smi 字段 含义 本质
显存占比 FB Memory Usage 已使用的显存 / 总显存 容量占用
显存利用率 Utilization.Memory 显存读写引擎活跃时间占比 带宽活跃度

详细解释

显存占比(Memory Usage)

显存占比 = 已使用显存 / 总显存 × 100%
  • 反映的是静态容量,如模型权重、训练数据、中间激活值占用了多少显存
  • 单位:MiB / GiB
  • 一旦分配后基本固定,除非重新分配显存

显存利用率(Memory Utilization)

显存利用率 = 显存读写活跃时间 / 采样窗口时间 × 100%
  • 反映的是动态带宽使用频率
  • 表示在采样周期内,有多少比例的时间显存控制器正在执行读写操作
  • 单位为百分比(0%~100%)

场景对比

场景 显存占比 显存利用率 GPU-Util 说明
模型加载后等待 高(80%+) 低(<5%) 显存已占用但无计算
训练推理中 高(稳定) 高(>80%) 持续读写显存进行计算
数据传输阶段 上升中 极高(接近100%) PCIe/NVLink传输时显存带宽打满
单kernel执行完毕间隙 瞬间下降 瞬间下降 kernel间切换时显存空闲

困惑:显存占比高但GPU-Util 低

% nvidia-smi
+-----------------------------------------------------------------------------+
| GPU-Util  Memory-Usage                                                      |
|    5% MiB / 24564 MiB                                                       |
+-----------------------------------------------------------------------------+

原因分析:

  1. CPU-GPU 不同步:GPU 在等待CPU提交下一个kernel
  2. IO 密集型:数据从磁盘/网络加载,GPU 空闲等待
  3. Batch Size 过小:显存空间充足但计算量不足以填满 GPU
  4. 频繁的 CUDA Sync:代码中存在不必要的 cudaDeviceSynchronize()

优化方向:

  • 增加 Batch Size(充分利用显存空间)
  • 使用异步数据加载(num_workers > 0
  • 减少 CPU-GPU 同步点
  • 使用 TensorRT / cuDNN 优化算子

nvidia-smi 输出解读

1
2
3
4
5
6
7
8
9
10
$ nvidia-smi
+------------------------------------------------------+
| GPU Name Persistence-M | Bus-Id Disp.A. |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage |
| | GPU-Util Compute P. |
|======================================================|
| 0 NVIDIA A100-SXM4-40GB Off | 00000000:00:04.0 Off |
| N/A 32C P0 45W / 400W | 8742MiB / 40960MiB |
| | 5% Default |
+------------------------------------------------------+
字段 含义
Memory-Usage 8742MiB / 40960MiB 显存占比 = 21.3%
GPU-Util 5% 计算单元活跃时间占比
Perf P0 性能状态(P0=最大性能)

总结

关注点 看哪个指标
是否会 OOM(显存溢出) 显存占比
GPU是否在高效工作 GPU-Util + 显存利用率
带宽是否打满 显存利用率
计算单元是否空闲 GPU-Util

经验法则:理想训练状态下,显存占比应保持在 80%~95%(最大化显存利用率),同时 GPU-Util 保持在 90%+,显存利用率在 70%~90%。