Pytorch在Colab上出现CUDA错误:设备端触发了断言。

59
我正在尝试在启用了GPU的Google Colab上初始化一个张量。
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

t = torch.tensor([1,2], device=device)

但是我遇到了一个奇怪的错误。
RuntimeError: 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

即使将该环境变量设置为1,似乎也没有显示任何进一步的细节。
有人遇到过这个问题吗?

您应该对笔记本电脑进行恢复出厂设置,然后再尝试。 - Sudhanshu
14个回答

89

虽然我尝试了你的代码,它没有给我报错,但通常调试CUDA运行时错误的最佳实践是将collab转换为CPU并重新创建错误。这将给您提供更有用的回溯错误。

大多数情况下,CUDA运行时错误可能是一些索引不匹配的原因,例如您尝试在具有15个标签的数据集上训练具有10个输出节点的网络。而且,这个CUDA错误的问题在于,一旦您遇到此错误,您将在使用torch.tensors进行的每个操作中都收到此错误。这会强制您重新启动笔记本电脑。

我建议您重新启动笔记本电脑,通过切换到CPU获取更准确的回溯,并检查您的其余代码,特别是如果您在某个地方对一组目标进行了模型训练。


21
形状不匹配。很遗憾,torch 没有明确告诉你这个错误。 - 3nomis
我收到了这个错误,问题是什么?文件“/home/tf/.virtualenvs/torch/lib/python3.6/site-packages/torch/nn/functional.py”,第2824行,交叉熵函数中出现错误:返回torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)。运行时错误:CUDA错误:设备端触发断言。CUDA内核错误可能会在其他API调用时异步报告,因此下面的堆栈跟踪可能不正确。为了调试,请考虑传递CUDA_LAUNCH_BLOCKING=1。 - fisakhan
太好了。我切换到CPU,现在错误已经清除! - Amir Pourmand
3
非常抱歉再次提出这个问题。但是当我在CPU上运行时,没有发生错误,但是现在我面临同样的问题。是否有其他方法可以尝试找出发生了什么? - user23415

7

就像其他回答者所指出的那样:在CPU上运行会显示错误。我的目标标签是{1,2},我把它们改成了{0,1}。这个过程解决了我的问题。


7

在使用 Transformers Trainer 时遇到了同样的问题。 在我的情况下,问题是由于模型输入和分词器长度不匹配引起的。 以下是解决我的问题的方法:

model.resize_token_embeddings(len(tokenizer))

在添加pad标记时导致了不匹配的问题。
tokenizer.add_special_tokens({'pad_token': '<pad>'})

太好了,谢谢!LLaMA2上也有同样的错误。 - germanjke

3

第一次:

使用simpletransformers库 fine-tuning 基于Transformer的模型进行多类分类问题时遇到了同样的错误。simpletransformers是建立在transformers库之上的库。

我将标签从字符串表示形式更改为数字,然后它就能工作了。

第二次:

使用transformers库训练另一个基于Transformer的文本分类模型时,再次遇到了相同的错误。 我的数据集中有4个标签,分别为0、1、2和3。但是在我的模型类的最后一层(线性层)中,我只使用了两个神经元nn.Linear(*, 2),因此我不得不用nn.Linear(*, 4)来替换它,因为我总共有四个标签。


1
什么是“字符串表示”?你是指独热向量吗? - Blade
2
例如,我有一个情感分析问题,其中包含两个标签,“积极”和“消极”。我将我的标签从“积极”更改为1,从“消极”更改为0,在我的数据中。这就是我所说的“将标签从字符串表示更改为数字”。 - Shaida Muhammad
我在一个提取型问答任务中遇到了这个问题。有人有类似的经历吗? - undefined

3

请仔细检查GPU数量,通常情况下应该是gpu=0,除非您有多个GPU。


2

我在Colab上也遇到了同样的问题。 如果你的代码在设备(“cpu”)上正常运行,请尝试删除当前的Colab运行时并重新启动。这对我有用。


2

也许,在某些情况下

这是因为您在将逻辑发送到BCE Loss之前忘记添加Sigmoid激活。

希望能有所帮助 :P


你的答案目前不清楚。请编辑并添加更多详细信息,以帮助其他人理解此答案如何解决问题。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

1

我也遇到了这个问题并发现原因,因为词汇维度是8000,但我的模型中嵌入维度设置为5000。


1
这是一个开放性问题,对于大多数来到这个页面的人来说,因为每种情况下的潜在问题都不同。在我的情况下,当我尝试在Colab pro上运行这个笔记本时,出现了错误:https://colab.research.google.com/drive/1SRclU2pcgzCkVXpmhKppVbGW4UcCs5xT?usp=sharingsupervised_finetuning_trainer.train()步骤中。
如果有像我一样无法将计算转移到CPU而不是GPU的人(主要是因为错误堆栈跟踪导致了不同的软件包,如transformers,...,一直追溯到pytorch),这里是获取更准确的错误堆栈跟踪的方法:

https://github.com/huggingface/transformers/blob/ad78d9597b224443e9fe65a94acc8c0bc48cd039/docs/source/en/troubleshooting.md?plain=1#L110

致谢:GitHub 上的 sgugger。


0
在我的情况下,我首先尝试在 CPU 上运行计算以检测实际问题。结果发现,我的图像转换有误,我对掩模图像应用了一些不必要的转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接