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

Posted

技术标签:

【中文标题】RuntimeError:CUDA 错误:仅使用 GPU 调用 `cublasSgemm(handle)` 时出现 CUBLAS_STATUS_EXECUTION_FAILED【英文标题】:RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm( handle)` with GPU only 【发布时间】:2021-06-10 11:57:34 【问题描述】:

我正在研究一维信号的 CNN。它与 CPU 设备完全兼容。但是,当我在 GPU 中训练模型时,发生了 CUDA 错误。我在调用cublasCreate(handle) 时得到RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED 后设置了os.environ['CUDA_LAUNCH_BLOCKING'] = "1" 命令。这样做会发生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)`

我已尝试解决此错误数周,但找不到解决方案。如果您在这里发现任何错误,请告诉我。

【问题讨论】:

请创建minimal reproducible example 亲爱的@user12750353,很抱歉回复晚了。在解决这个问题后,我已经解决了不同的问题。我试图用简单的 cnn 对一维信号进行回归。与带有 cifar 数据集的简单 cnn 示例几乎相同,只是数据不同。还有 cudatoolkit 10.2 版! 我遇到了同样的错误。不确定根本原因,但这是我从挖掘中发现的:-当批次大小小于 8 时,梯度变得超低-(可能相关)如果样本数量不能被批次大小整除,则最后一批epoch = 8,我这个错误似乎已经消失了。 【参考方案1】:

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

我在训练图像识别模型时也遇到了这个错误,其中最终Conv2d 的输出和第一个Linear 层的输入的形状不一样。

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

this 答案(上面引用)中解释的一种补救措施是,禁用gpu 尝试通过在cpu 上执行代码(不更改任何行)来重新创建类似的情况,它应该会给出更好且易于理解的错误。

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

【讨论】:

【参考方案2】:

请注意,如果输入张量的尺寸与 nn.Linear 模块的尺寸不匹配,也可能会导致这种情况。 (ex. input.shape = (a, b) and nn.Linear(c, c, bias=False) 与 c 不匹配)。

【讨论】:

这个答案是正确的 尝试知道nn.Flatten()之后的输出形状,然后将其用作nn.Linear()中的input【参考方案3】:

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

【讨论】:

以上是关于RuntimeError:CUDA 错误:仅使用 GPU 调用 `cublasSgemm(handle)` 时出现 CUBLAS_STATUS_EXECUTION_FAILED的主要内容,如果未能解决你的问题,请参考以下文章

使用VGG网络训练发生错误RuntimeError: CUDA out of memory解决方案:

使用VGG网络训练发生错误RuntimeError: CUDA out of memory解决方案:

RuntimeError:cuda 运行时错误(710):设备端断言触发于

带有 CUDA 和 Nvidia 卡的 PyTorch:RuntimeError:CUDA 错误:所有支持 CUDA 的设备都忙或不可用,但 torch.cuda.is_available() 为 T

如何解决这个奇怪的错误:“RuntimeError: CUDA error: out of memory”

Pytorch RuntimeError: CUDA error: out of memory at loss.backward() , 使用 CPU 时没有错误