我可以访问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
如何解决此错误
答案 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)