CUDA error: CUBLAS_STATUS_INVALID_VALUE error when training BERT model using HuggingFace

CUDA error: CUBLAS_STATUS_INVALID_VALUE error when training BERT model using HuggingFace

我正在使用 BERT 模型对 Steam 评论数据集进行情绪分析,其中我有 2 个标签:正面和负面。我有 fine-tuned 具有 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)`

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

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

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

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

如果这不起作用,那么我建议如此 github issue to update to a new version of Pytorch cuda that fixes a matrix multiplication bug that releases this same error that your code could be doing. Hence, as shown in this forum 您可以将 Pytorch 更新到 nightly pip wheel,或者使用 CUDA10.2 或 conda 二进制文件。您可以在 pytorch 主页上找到有关此类安装的信息,其中提到了如何安装 pytorch。

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

编辑(基于评论):

您的模型中存在矩阵错误。 问题出在你的 forward func then

模型 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)

萨萨克·耆那教