如何解决Google Colab运行Hugging Face BERT NER示例的CUDA运行时错误
问题修复方案
CUDA 710错误本质是交叉熵损失计算时标签值超出模型输出维度范围,触发CUDA侧断言报错,修复方法如下:
核心错误点
你代码中存在两处导致报错的硬伤:
- 重复初始化模型时参数错误:前面已经用
distilbert-base-cased初始化了匹配你数据集标签数量的模型,训练前又重新加载了一次distilbert-base-uncased且没有传入num_labels参数,模型默认分类头仅支持2分类,而WNUT数据集实体标签数远大于2,计算损失时标签越界触发CUDA报错。 - 评估指标配置错误:多分类任务使用了仅适用于二分类的
average='binary'配置,且未导入accuracy_score依赖。
修复步骤
- 删除重复的模型初始化代码
找到训练前的这行错误代码直接删除即可:
# 删掉此行 model = DistilBertForTokenClassification.from_pretrained("distilbert-base-uncased")
- 修复评估指标函数
替换原有compute_metrics函数为如下版本,同时补充缺失的依赖导入:
from sklearn.metrics import accuracy_score, precision_recall_fscore_support def compute_metrics(pred): labels = pred.label_ids preds = pred.predictions.argmax(-1) # 过滤掉损失计算时忽略的-100标签 filter_mask = labels != -100 true_labels = labels[filter_mask] true_preds = preds[filter_mask] precision, recall, f1, _ = precision_recall_fscore_support(true_labels, true_preds, average='macro') acc = accuracy_score(true_labels, true_preds) return { 'accuracy': acc, 'f1': f1, 'precision': precision, 'recall': recall }
- 可选:优化标签编码逻辑(避免分词截断导致的赋值错误)
替换原有encode_tags函数为如下版本,增加长度校验:
import numpy as np def encode_tags(tags, encodings): labels = [[tag2id[tag] for tag in doc] for doc in tags] encoded_labels = [] for doc_labels, doc_offset in zip(labels, encodings.offset_mapping): doc_enc_labels = np.ones(len(doc_offset),dtype=int) * -100 arr_offset = np.array(doc_offset) valid_pos = np.where((arr_offset[:,0] == 0) & (arr_offset[:,1] != 0))[0] # 对齐有效位置和原始标签长度,避免截断导致的赋值越界 valid_len = min(len(valid_pos), len(doc_labels)) doc_enc_labels[valid_pos[:valid_len]] = doc_labels[:valid_len] encoded_labels.append(doc_enc_labels.tolist()) return encoded_labels
生效操作
修改完成后重置Colab运行时,重新执行所有代码即可在GPU环境下正常训练。
内容的提问来源于stack exchange,提问作者user14497686
相关产品推荐
相关产品推荐

