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

时间:2018-08-05 05:10:27

标签: 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
如何解决此错误

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

引发“CUDA 错误:设备端断言触发”RuntimeError 的一种方法是使用具有超出维度索引的 torch.Tensor 索引到 GPU list

因此,此代码段将引发 IndexError 消息“IndexError: index 3 is out of bounds for Dimension 0 with size 3”,而不是 CUDA 错误

data = torch.randn((3,10), device=torch.device("cuda"))
temp[3,:]

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

data = torch.randn((3,10), device=torch.device("cuda"))
indices = [1,3]
data[indices,:]

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

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

答案 3 :(得分:1)

我在运行BertModel.from_pretrained('bert-base-uncased')时遇到此错误。当错误消息更改为“ IndexError:索引超出自身范围”时,我通过移至CPU找到了解决方案。导致我发表this帖子。解决方案是将句子的长度截短到512。

答案 4 :(得分:0)

如果首先切换到CPU,则可以使此错误更详尽。一旦切换到CPU,它将显示确切的错误,这很可能与索引问题有关,即IndexError:在我的情况下,目标2超出范围,在您的情况下可能与此有关。 问题是“您当前正在使用几个类,输出的形状是什么?”,您可以找到这样的类

max(train_labels)
min(train_labels)

在我的情况下,这给了我2和0,问题是由缺少1索引引起的,所以一个快速的技巧是用1s快速替换所有2s,这可以通过以下代码完成:

train_=train.copy()
train_['label'] =train_['label'].replace(2,1)

然后您运行相同的代码并查看结果,它应该可以工作

class NDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __getitem__(self, idx):
        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
        item['labels'] = torch.tensor(self.labels[idx])
        return item

    def __len__(self):
        return len(self.labels)

train_dataset = NDataset(train_encodings, train_labels)
val_dataset = NDataset(val_encodings, val_labels)
test_dataset = NDataset(test_encodings, test_labels)