仅使用 GPU 调用 `cublasSgemm(handle)` 时出现运行时错误:CUDA 错误:CUBLAS_STATUS_EXECUTION_FAILED

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

我正在研究具有一维信号的 CNN。它与 CPU 设备配合得很好。但是,当我在 GPU 中训练模型时,出现了 CUDA 错误。我在调用

os.environ['CUDA_LAUNCH_BLOCKING'] = "1"
时得到
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED
后设置了
cublasCreate(handle)
命令。执行此操作后,发生了
cublasSgemm
错误,而不是
cublasCreate
错误。 虽然nvidia文档怀疑硬件问题,但我可以用图像训练其他CNN,没有任何错误。下面是我在训练模型中加载数据和设置数据的代码。

    idx = np.arange(len(dataset))  # dataset & label shuffle in once
    np.random.shuffle(idx)

    dataset = dataset[idx]
    sdnn = np.array(sdnn)[idx.astype(int)]        

    train_data, val_data = dataset[:int(0.8 * len(dataset))], dataset[int(0.8 * len(dataset)):]
    train_label, val_label = sdnn[:int(0.8 * len(sdnn))], sdnn[int(0.8 * len(sdnn)):]
    train_set = DataLoader(dataset=train_data, batch_size=opt.batch_size, num_workers=opt.workers)

    for i, data in enumerate(train_set, 0):  # data.shape = [batch_size, 3000(len(signal)), 1(channel)] tensor

        x = data.transpose(1, 2)
        label = torch.Tensor(train_label[i * opt.batch_size:i * opt.batch_size + opt.batch_size])
        x = x.to(device, non_blocking=True)
        label = label.to(device, non_blocking=True) # [batch size]
        label = label.view([len(label), 1])
        optim.zero_grad()

        # Feature of signal extract
        y_predict = model(x) # [batch size, fc3 output] # Error occurred HERE
        loss = mse(y_predict, label)

以下是此代码的错误消息。

File C:/Users/Me/Desktop/Me/Study/Project/Analysis/Regression/main.py", line 217, in Processing
    y_predict = model(x) # [batch size, fc3 output]
  File "C:\Anaconda\envs\torch\lib\site-packages\torch\nn\modules\module.py", line 722, in _call_impl
    result = self.forward(*input, **kwargs)
  File "C:\Users\ME\Desktop\ME\Study\Project\Analysis\Regression\cnn.py", line 104, in forward
    x = self.fc1(x)
  File "C:\Anaconda\envs\torch\lib\site-packages\torch\nn\modules\module.py", line 722, in _call_impl
    result = self.forward(*input, **kwargs)
  File "C:\Anaconda\envs\torch\lib\site-packages\torch\nn\modules\linear.py", line 91, in forward
    return F.linear(input, self.weight, self.bias)
  File "C:\Anaconda\envs\torch\lib\site-packages\torch\nn\functional.py", line 1674, in linear
    ret = torch.addmm(bias, input, weight.t())
RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)`

我已经尝试解决这个错误数周了,但找不到解决方案。如果您发现这里有任何问题,请告诉我。

python pytorch gpu conv-neural-network
7个回答
25
投票

请注意,如果输入张量的尺寸与 nn.Linear 模块的尺寸不匹配,也可能会导致这种情况。

(ex. input.shape = (a, b) and nn.Linear(c, c, bias=False)
与 c 不匹配)。


9
投票

通过部分关键词搜索,终于得到了类似的情况。 因为稳定性,我使用了CUDA 10.2版本。参考资料要求将 CUDA 工具包升级到更高版本 - 在我的例子中是 11.2 - 问题解决了! 我已经处理过其他训练过程,但这一个只会导致错误。由于各种原因导致CUDA错误,可以通过更改版本来解决。


5
投票

Loich说得对,我认为形状不匹配是引发此错误的主要原因。

我在训练图像识别模型时也遇到了这个错误,其中最终

Conv2d

的输出和第一个
Linear
层的输入的形状不一样。

如果这些都不起作用,那么最好的办法是在 CPU 上运行该进程的较小版本并重新创建错误。当在 CPU 而不是 CUDA 上运行它时,您将获得更有用的回溯,可以解决您的错误。

this答案(上面引用)中解释的一种补救措施是,在禁用gpu

的情况下,尝试通过在
cpu
上执行代码(不更改任何行)来重新创建类似的情况,它应该会给出更好且可以理解的错误。

P.S.:虽然最初的问题表明他们的代码在CPU上执行良好,但我已经为有类似错误的人发布了这个答案,而不是由于Cuda版本不匹配。


3
投票
在这里放置另一个答案,为我解决了这个问题:

如果您使用接收超出预定义词汇范围的输入索引的

nn.Embedding

 实例,您将看到完全相同的错误消息。因此,如果您创建了 100 个单位的嵌入,并且输入索引 100(嵌入现在需要从 0-99 的输入!),您最终会出现此 CUDA 错误,该错误非常难以追踪到嵌入。


0
投票
当我的张量太大时,我收到此错误:

A.size() ; B.size() # this works torch.matmul(A[:450, ...], B).size # this doesn't torch.matmul(A, B)
输出:

torch.Size([512, 256, 3, 3, 4]) torch.Size([4]) torch.Size([450, 256, 3, 3]) RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling `cublasSgemv(handle, op, m, n, &alpha, a, lda, x, incx, &beta, y, incy)`
所以,分割大张量为我解决了这个问题


0
投票
当我使用基于

detectron2

 的模型在 4-GPU 机器中的单个 GPU 上运行相同的任务时,遇到了相同的错误:

第一个 GPU 工作正常(又名

cuda:0

),而其余的 GPU 在 170 个 epoch 后出现此错误。
我不想更改 cuda 版本或更新环境(一旦一切正常,事情就没那么简单了...),而且我也不想更改任何层(当它确实工作时没有意义)一个 GPU)。

所以我找到了另一个简单的解决方案,用于使用 1 个 GPU 运行,这不是第一个:在脚本参数之前使用

CUDA_VISIBLE_DEVICES=<gpu_number>

,如果你有 
--device
 参数,请将其设置为 0(因为 cuda 只会看到一个 GPU,你所说的那个)。


0
投票
我从

GPU A100

 中的 CUDA 版本得到了这个错误结果。我终于通过将CUDA版本从10.2升级到11.7解决了这个问题。

conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvid


    

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