用途:帮助定位并消除 PyTorch 代码中的主机-设备同步,使 CPU 持续向 GPU 排队任务而不等待,避免 GPU 空闲停顿。所有同步最终会调用 cuEventSynchronize、cuStreamSynchronize 或 cuCtxSynchronize 之一,阻塞 CPU 线程。
主要能力:检测同步点(torch.cuda.set_sync_debug_mode 快速检测,或 nsys profile 全面检测);将同步分类为可避免的假依赖与需重构的真依赖;按难度给出消除策略,包括删除冗余同步、使用 non_blocking=True、改用无同步 API、把同步推迟到迭代末尾、合并多次同步为一次、用 torch.where 等把逻辑卸载到 GPU,以及最后手段将不可避免的同步排除在 CUDA Graph 捕获范围外;最后用 set_sync_debug_mode('error') 或重新 profile 验证。
使用方式:在待检查区域开始处调用 torch.cuda.set_sync_debug_mode('warn') 或 'error',运行训练步骤后设回 0;全面检测可用 nsys profile --capture-range=cudaProfilerApi --python-sampling=true --backtrace=dwarf python your_script.py,在 GUI 中查看 CUDA API 时间线并搜索 cudaStreamSynchronize、cudaEventSynchronize、cudaDeviceSynchronize。
适用场景:nsys 中出现频繁 cudaStreamSynchronize、torch.cuda.set_sync_debug_mode 告警、训练吞吐受 CPU-GPU 往返限制、热循环中存在 .item() 或 .cpu()。
限制:需要 PyTorch >=2.0 且带 CUDA 支持的 NVIDIA GPU,Nsight Systems 可选;set_sync_debug_mode 只能检测经 PyTorch 包装的 cuStreamSynchronize,第三方库直接调用 CUDA 同步 API 不会被检测到;non_blocking=True 仅适用于 CPU 不立即读取结果的情况。不适用于 CUDA Graphs、内核性能分析、内核优化、NCCL 通信优化、显存优化或 torch.compile 等场景。