【问题标题】:CUDA error: CUBLAS_STATUS_INVALID_VALUE error when training BERT model using HuggingFaceCUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误
【发布时间】:2021-09-23 18:15:41
【问题描述】:

我正在使用 BERT 模型对 Steam 评论数据集进行情感分析,其中我有 2 个标签:正面和负面。我已经用 2 个线性层对模型进行了微调,其代码如下。

 bert = BertForSequenceClassification.from_pretrained("bert-base-uncased",
                                                 num_labels = len(label_dict),
                                                 output_attentions = False,
                                                 output_hidden_states = False)

 class bertModel(nn.Module):
   def __init__(self, bert):
     super(bertModel, self).__init__()
     self.bert = bert
     self.dropout1 = nn.Dropout(0.1)
     self.relu =  nn.ReLU()
     self.fc1 = nn.Linear(768, 512)
     self.fc2 = nn.Linear(512, 2)
     self.softmax = nn.LogSoftmax(dim = 1)

  def forward(self, **inputs):
     _, x = self.bert(**inputs)
    x = self.fc1(x)
    x = self.relu(x)
    x = self.dropout1(x)
    x = self.fc2(x)
    x = self.softmax(x)

  return x

这是我的火车功能:

def model_train(model, device, criterion, scheduler, optimizer, n_epochs):
  train_loss = []
  model.train()
 for epoch in range(1, epochs+1):
   total_train_loss, training_loss = 0,0 
  for idx, batch in enumerate(dataloader_train):
     model.zero_grad()
     data = tuple(b.to(device) for b in batch)
     inputs = {'input_ids':      data[0],'attention_mask': data[1],'labels':data[2]}
     outputs = model(**inputs)
     loss = criterion(outputs, labels)
     loss.backward()
     torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
     #update the weights
     optimizer.step()
     scheduler.step()
     training_loss += loss.item()
     total_train_loss += training_loss
     if idx % 25 == 0:
        print('Epoch: {}, Batch: {}, Training Loss: {}'.format(epoch, idx, training_loss/10))
        training_loss = 0      
  #avg training loss
  avg_train_loss = total_train_loss/len(dataloader_train)
  #validation data loss
  avg_pred_loss = model_evaluate(dataloader_val)
  #print for every end of epoch
  print('End of Epoch {}, Avg. Training Loss: {}, Avg. validation Loss: {} \n'.format(epoch, avg_train_loss, avg_pred_loss))

我正在 Google Colab 上运行此代码。当我运行 train 函数时,出现以下错误,我尝试使用批量大小 32、256、512。

RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling `cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)`

谁能帮我解决这个问题?谢谢。

代码更新:我尝试在 CPU 上运行代码,错误在于矩阵形状不匹配。输入的shape,self.bert之后的shape打印在图像中。由于第一个线性层(fc1)没有被执行,之后的形状没有被打印出来。

【问题讨论】:

    标签: python pytorch sentiment-analysis bert-language-model


    【解决方案1】:

    我建议尝试一些可能解决错误的方法。

    forum 所示,一种可能的解决方案是降低加载数据的批量大小。因为可能是内存错误。

    如果这不起作用,那么我建议按照此 github issue 所示更新到新版本的 Pytorch cuda,该版本修复了矩阵乘法错误,该错误会释放您的代码可能正在执行的相同错误。因此,如forum 所示,您可以将 Pytorch 更新为 nightly pip wheel,或使用 CUDA10.2 或 conda 二进制文件。您可以在 pytorch 主页上找到有关此类安装的信息,其中提到了如何安装 pytorch。

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

    编辑(基于评论):

    您的模型中存在矩阵错误。 问题出在你的前向函数中

    模型 BERT 输出一个具有 torch.size (64, 2) 的张量,这意味着如果您将其放在线性层中,则会出错,因为该线性层需要 (?, 768) b/c 的输入将其初始化为nn.Linear(768, 512)。为了使错误消失,您需要对张量进行一些转换或初始化另一个线性层,如下所示:

    somewhere defined in __init__: self.fc0 = nn.Linear(2, 768)
    def forward(self, **inputs):
         _, x = self.bert(**inputs)
         
        x = self.fc0(x)
        x = self.fc1(x)
        x = self.relu(x)
        x = self.dropout1(x)
        x = self.fc2(x)
        x = self.softmax(x)
    
    

    萨塔克·耆那教

    【讨论】:

    • 好的,我会试试这些,让你知道它是如何工作的,谢谢。
    • 我按照您提到的链接尝试更改 Pytorch 版本,目前我有“1.9.0+cu102”这个版本。但我仍然得到同样的错误。如果我分享给你,你能看看我的笔记本吗?
    • 我也更改了批量大小并尝试使用较小的 32、64..但仍然存在相同的错误
    • 好的,我建议您以 1 的批处理大小运行并暂时将进程切换到 CPU。我认为 32 的批量大小对于大型模型来说仍然很大。另外,请确保您在 CPU 上运行一次,因为这样您将获得更有意义的实际错误。您可能对如何编码或预测难以调试的标签有一些问题,除非您在 CPU 上运行一次训练过程并且它给出了一个可读的错误,而不是上面没有太多说明的 CUDA 错误。由于 CPU 很慢,为了更快地重新创建错误,我建议将批量大小设为 1。
    • 是的,我刚刚在 CPU 上运行它,我得到了矩阵形状错误:RuntimeError: mat1 and mat2 shapes cannot be multiplied (64x2 and 768x512)
    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2021-05-18
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多