CUDA error: device-side assert triggered 报错解决
bug show
报错如下:
[E ProcessGroupNCCL.cpp:915] [Rank 1] NCCL watchdog thread terminated with exception: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.
Exception raised from c10_cuda_check_implementation at ../c10/cuda/CUDAException.cpp:44 (most recent call first):
frame #0: c10::Error::Error(c10::SourceLocation, std::string) + 0x57 (0x7feeb00c5617 in /usr/local/lib/python3.10/dist-packages/torch/lib/libc10.so)
frame #1: c10::detail::torchCheckFail(char const*, char const*, unsigned int, std::string const&) + 0x64 (0x7feeb008098d in /usr/local/lib/python3.10/dist-packages/torch/lib/libc10.so)
frame #2: c10::cuda::c10_cuda_check_implementation(int, char const*, char const*, int, bool) + 0x118 (0x7feeb0176518 in /usr/local/lib/python3.10/dist-packages/torch/lib/libc10_cuda.so)
frame #3: c10d::ProcessGroupNCCL::WorkNCCL::finishedGPUExecutionInternal() const + 0x80 (0x7fedff6a0150 in /usr/local/lib/python3.10/dist-packages/torch/lib/libtorch_cuda.so)
frame #4: c10d::ProcessGroupNCCL::WorkNCCL::isCompleted() + 0x58 (0x7fedff6a3f78 in /usr/local/lib/python3.10/dist-packages/torch/lib/libtorch_cuda.so)
frame #5: c10d::ProcessGroupNCCL::workCleanupLoop() + 0x24b (0x7fedff6ba7bb in /usr/local/lib/python3.10/dist-packages/torch/lib/libtorch_cuda.so)
frame #6: c10d::ProcessGroupNCCL::ncclCommWatchdog() + 0x78 (0x7fedff6baac8 in /usr/local/lib/python3.10/dist-packages/torch/lib/libtorch_cuda.so)
frame #7: <unknown function> + 0xdc253 (0x7feeb0439253 in /usr/lib/x86_64-linux-gnu/libstdc++.so.6)
frame #8: <unknown function> + 0x94ac3 (0x7feeb31f3ac3 in /usr/lib/x86_64-linux-gnu/libc.so.6)
frame #9: <unknown function> + 0x126850 (0x7feeb3285850 in /usr/lib/x86_64-linux-gnu/libc.so.6)
terminate called after throwing an instance of 'std::runtime_error'
what(): [Rank 1] NCCL watchdog thread terminated with exception: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.
解决
我们翻译一下:
- RuntimeError: CUDA error: device-side assert triggered
运行时错误:CUDA设备端断言被触发。
这表明在GPU设备上执行的代码中有断言失败。断言是一种错误检查,如果代码中的某个条件为假,则会引发断言失败。
- CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
CUDA核心(kernel)错误可能会在某些其他API调用中异步报告,因此下面的堆栈跟踪可能不正确。
由于CUDA操作可能是异步执行的,错误可能不会立即在引发它的确切位置被报告。这意味着错误消息中的堆栈跟踪可能不指向实际引发问题的位置。
- For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
为了调试,请考虑传递CUDA_LAUNCH_BLOCKING=1。
这是一个调试技巧。通过设置环境变量CUDA_LAUNCH_BLOCKING=1,可以使CUDA操作同步执行,这有助于准确地定位引发错误的代码行。
- Compile with ‘TORCH_USE_CUDA_DSA’ to enable device-side assertions.
使用‘TORCH_USE_CUDA_DSA’编译以启用设备端断言。
这建议在编译PyTorch时启用设备端断言,这可以帮助开发者捕捉到在GPU上执行的代码中的问题。
用人话:
现许多网友建议错误可能是由于分类任务中训练数据标签超出了设定的类别数目所导致的。例如,如果设置了8个类别,但训练数据中的标签却包含了9,就会触发这个错误。此外,还需要注意一个常见的陷阱:即使标签从0开始计数,在PyTorch中使用0或负数作为类别标签也会导致错误。因此,如果类别标签从0开始,需要将所有类别标签加1以避免错误。
大部分错误是由于下边的原因导致的
-
1.1 数据类型不匹配
在PyTorch中,张量的数据类型必须与模型的预期类型匹配。如果存在不匹配,可能会导致CUDA设备上的断言失败。例如,如果模型期望输入是torch.FloatTensor类型,而实际输入是torch.LongTensor,就会引发该错误。 -
1.2 索引超出范围
在使用索引操作时,如果索引超出了张量的范围,也会触发CUDA设备上的断言错误。比如,在进行分类任务时,如果目标标签的索引值超出了类别数的范围,就会导致该错误。 -
1.3 未正确初始化的张量
在某些情况下,未正确初始化的张量也会导致设备断言错误。例如,在使用未初始化的张量进行计算时,可能会触发此错误。
我这里的在做了很多debug后,发现是一个int 类型的tensor中不小心混入了一个float(“nan”),然后在用idx去tensor中取具体的值时,因为float的内存大小和int不一样,导致越界,直接内核报错推出。
英语原文:
https://discuss.pytorch.org/t/scattergatherkernel-cu-assertion-idx-dim-0-idx-dim-index-size-index-out-of-bounds/195356
https://stackoverflow.com/questions/58242415/how-to-fix-runtimeerror-cuda-error-device-side-assert-triggered-in-pytorch
https://github.com/pytorch/pytorch/issues/67978