GPU 性能瓶颈定位方法
一句话定位:优化的第一步不是改代码,而是判定瓶颈属于哪一类。判错类别,所有后续努力都白费——这也是面试最爱追问的地方。
1. 瓶颈分类与判定信号
| 现象 | 瓶颈类别 | 首要动作 |
|---|---|---|
| GPU 利用率低但 CPU 跑满 | 数据供给 / 前处理瓶颈 | 调 DataLoader(2.9)、优化解析与数据格式(1.7) |
| Kernel 之间有明显空隙 | 调度 / 同步问题 | 减少同步点与 H2D 拷贝、算子融合、CUDA Graph、增大 batch |
| 多卡吞吐不随卡数线性增长 | 通信瓶颈 | 看 NCCL 拓扑与并行策略(3.10) |
| GPU 利用率高但吞吐不达标 | 计算 / 访存瓶颈 | 看是否 IO-bound(3.7)、换更优 kernel、量化(4) |
2. 必答题:「你怎么知道是 GPU 而不是 CPU 瓶颈?」
标准答法是给出可观测证据链,而不是凭感觉:
- 看 GPU 利用率曲线形态:
nvidia-smi dmon或 Nsight 采样。- 利用率持续高位 → GPU 是瓶颈;
- 利用率呈锯齿/周期性掉底 → GPU 在等数据 → CPU 侧(加载、前处理)是瓶颈。
- 对照 CPU 侧负载:若 CPU 各核接近满载而 GPU 空闲,结论明确。
- 做单变量实验:用合成数据(预先常驻显存的假 batch)替换真实 DataLoader 再跑——
- 吞吐显著提升 → 瓶颈确实在数据管线;
- 吞吐几乎不变 → 瓶颈在 GPU 计算本身。
- 看时间线归因:Nsight Systems 上统计 GPU Kernel 累计时间占墙钟时间的比例(GPU Kernel 占比)。占比低说明大量时间耗在非 Kernel(等待、拷贝、Python 开销)。
这套”先量化观测 → 提出假设 → 单变量验证”的动作,与 Spark 里通过 UI 判断是 Shuffle、倾斜还是资源不足完全同构(见 5.5)。
参考:Nsight Systems 用户指南;nvidia-smi 手册