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 |
+-----------------------------------------------------------------------------+
原因分析:
- CPU-GPU 不同步:GPU 在等待CPU提交下一个kernel
- IO 密集型:数据从磁盘/网络加载,GPU 空闲等待
- Batch Size 过小:显存空间充足但计算量不足以填满 GPU
- 频繁的 CUDA Sync:代码中存在不必要的
cudaDeviceSynchronize()
优化方向:
- 增加 Batch Size(充分利用显存空间)
- 使用异步数据加载(
num_workers > 0) - 减少 CPU-GPU 同步点
- 使用 TensorRT / cuDNN 优化算子
nvidia-smi 输出解读
1 | $ nvidia-smi |
| 字段 | 值 | 含义 |
|---|---|---|
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%。