CUDA错误:调用cublasCreate(handle)时出现CUBLAS_STATUS_ALLOC_FAILED。

46

我在Google Colab上运行我的PyTorch深度学习模型时遇到了以下错误

/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in linear(input, weight, bias)
   1370         ret = torch.addmm(bias, input, weight.t())
   1371     else:
-> 1372         output = input.matmul(weight.t())
   1373         if bias is not None:
   1374             output += bias

RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`

我甚至将批量大小从128减少到64,即减少了一半,但仍然出现了这个错误。之前,我使用批量大小为128运行了相同的代码,但没有出现这样的错误。


3
错误和答案似乎确实表明,某种方式GPU内存已满,并且未被标准安全协议捕获。 当太多(笔记本)Python内核同时使用GPU时,我遇到了这个错误。 - F.Wessels
17个回答

31

不,在这种情况下,批大小并不重要。

最可能的原因是标签数量与输出单元数量之间存在不一致。

  • 尝试在前向传递中打印最终输出的大小,并检查输出的大小

print(model.fc1(x).size())
这里fc1将被替换为返回之前您的模型的最后一个线性层的名称

  • 在计算损失之前,请确保label.size()等于prediction.size()

即使在修复该问题后,您也必须重新启动GPU运行时(在使用Colab GPU时我需要这样做)

此GitHub问题评论也可能会有所帮助。


1
准确地解决了我的问题...更改了数据集但忘记更改标签的数量。 - Shawn

24

实际上,这个错误可能由不同原因引起。如果可能的话,建议通过在 CPU 上运行代码来调试 CUDA 错误。如果不可能,请尝试通过以下方式执行脚本:


CUDA_LAUNCH_BLOCKING=1 python [YOUR_PROGRAM]

这将帮助您获取堆栈跟踪中引发错误的正确代码行,以便您可以解决它。


谢谢@HLeb,我使用CUDA_LAUNCH_BLOCKING=1运行了我的程序,但是它输出了RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle)`。为什么会输出CUDA错误? - haneulkim
很奇怪。尝试直接在CPU上运行,那通常是默认设置。但如果GPU被优先考虑,则可能需要修改您的代码。这取决于您正在执行什么操作。 - HLeb

13

减小批次大小对我有帮助,训练按计划进行。


6

这个错误意味着“在cuBLAS库内部分配资源失败”。

我通过减小批量大小解决了这个问题。你说你增加到了64,但没有帮助。也尝试使用32、8、1等大小。

此外,尝试在CPU上运行相同的代码,检查张量形状是否正确。


5
这个问题的一个原因可能是标签的数量不等于网络输出通道的数量,即预测的输出类别数量。调整输出以匹配就可以解决这个问题。

是的,我也通过更改输出类解决了它。 - Lanka

1

对于具有限制(例如BERT)的模型,减少最大序列长度可以解决此错误。

此外,当我调整模型的嵌入层大小时,我也遇到了同样的问题:model.resize_token_embeddings(NEW_SIZE),进行训练并保存。

在预测时,当我加载模型时,需要再次调整嵌入层大小!


1

我曾经遇到过同样的问题,尽管我不知道具体原因,但我知道它的根本原因是我的NN.module的最后一行。

 self.fc3 = nn.Linear(84, num_classes) 

我将真实的num_classes改为原来的两倍,但是变量num_classes的值并没有改变,这可能是我在某个输出结果的地方犯了错误。

当我修正了num_classes的值后,问题就解决了。 我建议您再次检查模型中的数字。


1
这似乎是一个完全不同的问题(由于您代码中的一些无法重现的错误引起),与当前的问题无关。 - TylerH

0

这可能是维度或索引不匹配。您可以在CPU上运行模型以获得更清晰的错误反馈。如果需要,您可以减少数据集大小,在我的情况下,由于只是一个简单的预测,我只需切换到CPU并发现它是模型词汇范围之外的令牌。


0
很有可能存在层次不匹配的问题。请仔细检查每个层次上的尺寸是否一致。

这并不是对问题的回答。一旦您拥有足够的声望,您将能够在任何帖子上发表评论;而不是提供需要询问者澄清的答案。- [来自审查] (/ review / late-answers / 30324706) - BNazaruk

0
减少批量大小对我没有起作用。我在`main.py`中定义了`num_classes`,并且在模型结构中也定义了。由于我忘记改变模型结构中的`num_classes`,因此出现了错误。更改后,训练过程已经开始。

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