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

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

如何解决此错误?

158260 次浏览

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

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

这通常是一个索引问题。

例如,如果你的地面真相标签从1开始:

target = [1,2,3,4,5]

然后你应该为每个标签减去 1,这样:

target = [0,1,2,3,4]

我在运行 BertModel.from _ pretraining (‘ bert-base-uncase’)时遇到了这个错误。当错误消息改为‘ IndexError: index out of range in self’时,我移动到 CPU 找到了解决方案。这让我找到了 这个的位置。解决办法是把句子截短到512个。

如果您首先切换到 CPU,这个错误可能会变得更加复杂。一旦切换到 CPU,它将显示确切的错误,这很可能与索引问题有关,即 IndexError: 目标2在我的情况下是出界的,在你的情况下可能是相关的。 问题是“您当前使用了多少个类,您的输出是什么形状?”你可以找到这样的类

max(train_labels)
min(train_labels)

在我的例子中是2和0,这个问题是由于缺少1个索引引起的,所以一个快速的方法是用1替换所有的2,这可以通过下面的代码来完成:

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)

提高“ CUDA 错误: 设备端断言触发”RuntimeError的一种方法是使用无维索引的 list索引到 GPU torch.Tensor

因此,这个代码片段将产生一个 IndexError,其消息为“ IndexError: index3不适用于尺寸为3的维度0”,而不是 CUDA 错误

data = torch.randn((3,10), device=torch.device("cuda"))
data[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,例如第一个代码片段抛出的错误。

我发现我得到这个错误时,我有一个无效的值标签。

当 bce 或 ce 丢失的目标或标签 < = 0时,多次发生在我身上。

这也可能是由于您的模型输入数据中的 nan 值造成的。一个简单的方法来“处理”这个问题,就是把任何弹出的数字都转换成零:

batch_data = batch_data[batch_data != batch_data] = 0

另一种可能发生这种情况的情况是: 您正在使用比上一层预期的更多的类来训练数据集。这是另一个意想不到的索引情况

我希望你的问题得到解决,但我面对这个问题,花了近2个小时来解决它,所以我将在这里解决问题和解决方法的人喜欢我。
我有这个问题是因为类别标签。
我的项目是关于三个类的情绪分析,所以我用值来标记数据集: -1,0,1(输出层中的3个节点) ,这导致了我的问题!
所以我用0,1,2重新标记了数据集,它得到了解决。从0开始标记示例非常重要(PyTorch 使用 index 作为类标记,因此您应该小心)。
对于那些遇到错误说设置 CUDA _ LAUNCH _ BLOCKING = 1的人,你应该在导入 PyTorch 之前使用这个命令: os.environ [‘ CUDA _ LAUNCH _ BLOCKING’] = “1”,如果你遇到同样的错误(没有更多关于错误的信息) ,你应该在 CPU 上运行脚本,然后再试一次(这次你可能会得到关于问题的新信息)。

我得到了这个错误,当我使用 Huggingface 变压器模型 长形码编解码器(LED),并设置解码器长度太大。在我的例子中,解码器的默认最大长度是1024。

希望这对谁有帮助