ai-infra-interview-305

第 10 题:如何调试PyTorch的CUDA kernel launch失败?CUDA_LAUNCH_BLOCKING=1的原理?

题目

如何调试PyTorch的CUDA kernel launch失败?CUDA_LAUNCH_BLOCKING=1的原理?


完整讲解

一、CUDA kernel「launch 失败」常见原因


二、CUDA_LAUNCH_BLOCKING=1 在干什么?

设置环境变量 CUDA_LAUNCH_BLOCKING=1 后,每次 kernel launch 都会变成同步:driver 会等这个 kernel 执行完再返回,且一旦 kernel 内部出错,报错会立刻发生在对应的 launch 调用处,而不是等到后面的 cudaDeviceSynchronize() 或下一次同步点。这样:

代价是 GPU 和 CPU 无法并行,整体变慢,所以只用于调试,生产环境不要开。


三、调试步骤建议

  1. 先开 CUDA_LAUNCH_BLOCKING=1export CUDA_LAUNCH_BLOCKING=1(或 Windows 下在环境变量里设),再跑,看报错堆栈指向哪一行、哪个 op。
  2. 看完整错误信息:CUDA 会报 error code(如 invalid configuration、out of memory);对照文档判断是显存、配置还是设备问题。
  3. 缩小范围:若报错指向某一大段,可注释掉部分代码或减小 batch/shape,确认是哪个 tensor 或哪次 launch 导致。
  4. 显存:用 torch.cuda.memory_summary()nvidia-smi 看是否 OOM 或碎片;可先减小模型/ batch 验证。
  5. 自定义 kernel:检查 grid/block、shared memory、是否在正确 device;用 cuda-memcheck 或 compute-sanitizer 查越界和非法访问。

四、其他常用手段


面试要点


记忆要点

  1. launch 失败常见:OOM、grid/block 非法、异步导致报错位置滞后。
  2. CUDA_LAUNCH_BLOCKING=1 = 同步 launch,错误立刻落在正确调用点;仅调试用。
  3. 配合 TORCH_SHOW_CPP_STACKTRACES、memory_summary、cuda-gdb 等缩小范围。
返回模块 返回总览