程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误?

开发过程中遇到CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误的问题如何解决?下面主要结合日常开发的经验,给出你关于CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误的解决方法建议,希望对你解决CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误有所启发或帮助;

我正在使用 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,@R_262_10906@duler,optimizer,n_epochs):
  Train_loss = []
  model.Train()
 for epoch in range(1,epochs+1):
   @R_191_10586@l_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()
     @R_262_10906@duler.step()
     Training_loss += loss.item()
     @R_191_10586@l_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 = @R_191_10586@l_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 上运行代码,但错误在于矩阵形状不匹配。输入形状,self.bert 后的形状打印在图像中。由于没有执行第一个线性层 (fc1),因此不会打印其后的形状。

CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误

CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误

解决方法

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

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

如果这不起作用,那么我建议如此 github issue 所示更新到 Pytorch cuda 的新版本,该版本修复了矩阵乘法错误,该错误会释放您的代码可能会出现的相同错误。因此,如本 forum 所示,您可以将 Pytorch 更新为夜间 pip 轮,或使用 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)

萨萨克耆那教

大佬总结

以上是大佬教程为你收集整理的CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误全部内容,希望文章能够帮你解决CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。