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

问题描述 投票:0回答:9

我在 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 的批处理大小运行了相同的代码,但没有出现这样的错误。

python pytorch nlp cuda bert-language-model
9个回答
26
投票

不,批量大小在这种情况下无关紧要。

最有可能的原因是标签数量和输出单元数量不一致

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

print(model.fc1(x).size())

这里
fc1
将在返回之前被模型的最后一个线性层的名称替换

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

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

这个 GitHub 问题评论 也可能有帮助。


21
投票

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

CUDA_LAUNCH_BLOCKING=1 python [YOUR_PROGRAM]

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


11
投票

减少批量大小对我有效,培训按计划进行。


6
投票

此错误表示“cuBLAS 库中的资源分配失败”。

减小批量大小为我解决了这个问题。你说你增加到 64 并没有帮助。也可以尝试 32、8、1 等。

此外,尝试在您的 CPU 上运行相同的程序以检查您的张量形状是否一切正常。


4
投票

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


1
投票

我有同样的问题,但我不知道原因是什么我知道原因, 我的 NN.module 的最后一行是

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

我把我真正的 num_classes 改成了原来的 2 倍 但它并没有改变变量 num_classes 的值,这可能是我在某处输出结果时犯了一个错误。

在我确定了 num_classes 的值后,它就成功了 我建议再次检查模型中的数字


0
投票

我的模型是将最后一层只有一个神经元的两个类分类。当最后一层在 pytorch 环境中是 nn.Linear(512,1) 时,我遇到了这个问题。但我的标签只是 [0] 或 [1]。我通过添加图层解决了这个问题:nn.sigmoid()


0
投票

对于大规模数据集,只需删除寺庙变量

for batch_idx, (x, target) in enumerate(train_dataloader):
    ...
    del x,target,loss,outputs


0
投票

减少具有限制的模型(例如 BERT)的

maximum sequence length
为我解决了这个错误。

此外,我在调整模型的嵌入层大小时也遇到了同样的问题:

model.resize_token_embeddings(NEW_SIZE)
,训练并保存它。

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

© www.soinside.com 2019 - 2024. All rights reserved.