0%

Nsight Systems

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 用户指南