Nsight Systems
一句话定位:系统级时间线剖析工具——不只看算子,而是把 CPU 线程、CUDA API、Kernel 执行、内存拷贝、多流并发画在同一条时间轴上,用来发现”GPU 为什么在空转”。
1. 能看什么
- Kernel 执行:每个 Kernel 的起止时间、持续时长、所在 Stream;
- H2D / D2H 拷贝:Host↔Device 数据传输的时机与耗时,是否与计算重叠(未重叠说明缺少 pinned memory 或异步拷贝,见 2.9);
- CUDA Stream 并发:多流是否真正并行,还是被隐式同步串行化;
- 同步点:
cudaDeviceSynchronize、.item()、.cpu()、打印张量等操作造成的阻塞;这些同步点会打断流水,是常见性能杀手。
2. 核心判据:Kernel 之间的空隙就是 GPU 空转
这是使用 Nsight 最重要的一条:
- 时间线上若 Kernel 密集连续 → GPU 被喂满,应转向优化 Kernel 本身(换实现、量化);
- 若 Kernel 之间存在明显空隙(gap) → GPU 在等待,这些空隙就是首要优化目标。按成因分别处理:
- 空隙伴随 CPU 侧繁忙 → 数据供给/前处理瓶颈(调 DataLoader,2.9);
- 空隙伴随 H2D 拷贝 → 拷贝未与计算重叠(用 pinned memory +
non_blocking); - 空隙前有同步 API → 去掉不必要的同步(如训练循环里的
loss.item()每步都同步); - 大量极短 Kernel 密集排列且间隔均匀 → Kernel 启动开销占主导,用算子融合 / CUDA Graph 合并。
3. 与 PyTorch Profiler 的分工
- PyTorch Profiler(5.1):框架语义强,能回溯到 Python 代码行,适合定位”哪个算子贵”;
- Nsight Systems:系统视角,适合定位”为什么 GPU 闲着“(调度、同步、拷贝、并发问题)。
- 实践顺序:先用 Nsight 看整体时间线判定瓶颈类别(3.3),再用 PyTorch Profiler 深挖具体算子。
参考:NVIDIA Nsight Systems 用户指南