CUDA运行时错误(59):触发了设备端断言

sai*_*and 12 gpu pytorch

我可以访问Tesla K20c,我正在CIFAR10数据集上运行ResNet50 ...然后出现以下错误:
THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1524584710464/work/aten/src/THC/generated/../generic/THCTensorMathPointwise.cu line=265 error=59 : device-side assert triggered
Traceback (most recent call last):
File "main.py", line 109, in <module>
train(loader_train, model, criterion, optimizer)
File "main.py", line 54, in train optimizer.step()
File "/usr/local/anaconda35/lib/python3.6/site-packages/torch/optim/sgd.py", line 93, in step
d_p.add_(weight_decay, p.data) RuntimeError: cuda runtime error (59) : device-side assert triggered at /opt/conda/conda-bld/pytorch_1524584710464/work/aten/src/THC/generated/../generic/THCTensorMathPointwise.cu:265
如何解决此错误

小智 17

我在运行 BertModel.from_pretrained('bert-base-uncased') 时遇到此错误。当错误消息更改为“IndexError:索引超出自身范围”时,我通过转移到 CPU 找到了解决方案。这让我看到了这篇文章。解决方案是将句子截断为长度 512。


小智 12

我已经多次遇到此问题。我发现这是一个索引问题。例如,如果您的地面真相标签从1开始:target = [1,2,3,4,5],则应为每个标签减去1,将其更改为:[0,1,2,3,4] 。这每次都解决了我的问题。

  • 我可以确认,这也是我的案例出错的原因。例如,有效的文本标签已转换为 0..n-1(n 是类别数)。然而,NaN 值被转换为 -1,这使其偏离了轨道。 (3认同)
  • @Rainy你能详细说明一下“地面真相标签从1开始”吗?你是什​​么意思?我认为标签是 1 到 5,为了克服错误,错误中的第一个值应该为零。我对吗? (2认同)

Ala*_*lan 11

引发“CUDA 错误:设备端断言已触发”的一种方法是使用维度索引外的RuntimeError索引到 GPU 。torch.Tensorlist

因此,此代码片段将引发IndexError消息“IndexError:索引 3 超出尺寸 3 的维度 0 的范围”,而不是 CUDA 错误

data = torch.randn((3,10), device=torch.device("cuda"))
data[3,:]
Run Code Online (Sandbox Code Playgroud)

然而,这会引发 CUDA“设备端断言触发”RuntimeError

data = torch.randn((3,10), device=torch.device("cuda"))
indices = [1,3]
data[indices,:]
Run Code Online (Sandbox Code Playgroud)

这可能意味着在类标签的情况下,例如@Rainy的答案,label == num_classes当标签从1而不是0开始时,最终的类标签(即when)导致了错误。

此外,当设备是"cpu"抛出的错误时IndexError,例如第一个片段抛出的错误。


McL*_*nce 10

通常,在遇到cuda runtine errors时,建议使用该CUDA_LAUNCH_BLOCKING=1标志再次运行您的程序以获得准确的堆栈跟踪。

在您的特定情况下,对于指定数量的类,数据目标太高(或太低)。

  • 除此之外,一旦获得更准确的堆栈跟踪并找到问题所在,您就可以将张量移至 CPU。将张量移至 CPU 会产生更详细的错误。将“CUDA_LAUNCH_BLOCKING=1”与将张量移至 CPU 相结合是我能够解决我花了 3 天的问题的唯一方法。 (3认同)