RexUniNLU模型微调实战基于PyTorch的迁移学习1. 引言如果你正在处理中文自然语言理解任务比如从文本中提取关键信息、分析情感倾向或者对文本进行分类可能会遇到一个常见问题现有的通用模型在你的特定领域数据上表现不佳。这时候就需要对模型进行微调让它更好地适应你的具体任务。RexUniNLU是一个强大的中文自然语言理解模型它基于DeBERTa-v2架构采用了创新的RexPrompt框架。这个模型最厉害的地方在于它不需要大量的标注数据就能处理多种NLP任务。但即使如此当我们面对特定领域的文本时比如医疗报告、法律文书或者电商评论还是需要对模型进行一些调整才能获得最佳效果。本文将手把手教你如何使用PyTorch对RexUniNLU模型进行领域适配微调。无论你是NLP初学者还是有一定经验的开发者都能从中学到实用的微调技巧和最佳实践。2. 环境准备与模型加载在开始微调之前我们需要先搭建好开发环境。这里假设你已经安装了Python和PyTorch如果没有的话建议先安装Python 3.8和PyTorch 1.12版本。# 安装必要的依赖库 pip install transformers datasets torchmetrics pip install sentencepiece sacremoses # 用于文本处理接下来让我们加载预训练的RexUniNLU模型和对应的tokenizerfrom transformers import AutoTokenizer, AutoModelForSequenceClassification import torch # 指定模型名称 model_name damo/nlp_rexuninlu_chinese-base # 加载tokenizer和模型 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForSequenceClassification.from_pretrained(model_name) print(f模型加载成功{model_name}) print(f模型参数量{sum(p.numel() for p in model.parameters()):,})这里我们使用的是RexUniNLU的基础版本它已经在大规模中文语料上进行了预训练具备了强大的语言理解能力。现在模型已经准备好了接下来我们需要准备训练数据。3. 数据准备与预处理数据质量直接决定了微调效果的好坏。让我们来看如何为RexUniNLU准备合适的训练数据。首先我们需要将原始文本数据转换成模型可以理解的格式。RexUniNLU使用特殊的prompt格式来处理不同的NLP任务下面是一个情感分析任务的示例def prepare_sentiment_data(text, label, max_length512): 准备情感分析任务的训练数据 text: 原始文本 label: 情感标签0负面, 1正面 # 构建prompt prompt 情感分析判断以下文本的情感倾向是正面还是负面 input_text f{prompt}{text} # 对文本进行编码 encoding tokenizer( input_text, truncationTrue, paddingmax_length, max_lengthmax_length, return_tensorspt ) # 添加标签 encoding[labels] torch.tensor([label]) return encoding # 示例用法 sample_text 这部电影真的很精彩演员表演出色剧情扣人心弦 sample_data prepare_sentiment_data(sample_text, 1) print(处理后的数据, sample_data)对于不同的任务类型我们需要设计不同的prompt模板。下面是一些常见任务的prompt设计示例def create_task_prompt(task_type, text): 为不同任务创建prompt prompts { sentiment: f情感分析{text}, ner: f命名实体识别{text}, classification: f文本分类{text}, relation: f关系抽取{text} } return prompts.get(task_type, text) # 批量处理数据的示例 def prepare_batch_data(texts, labels, task_typesentiment): 批量准备训练数据 encodings [] for text, label in zip(texts, labels): prompt_text create_task_prompt(task_type, text) encoding tokenizer( prompt_text, truncationTrue, paddingmax_length, max_length512, return_tensorspt ) encoding[labels] torch.tensor([label]) encodings.append(encoding) return encodings在实际项目中你可能需要从CSV文件或数据库中加载数据。这里提供一个从CSV文件加载数据的示例import pandas as pd from torch.utils.data import Dataset class NLUDataset(Dataset): 自定义NLP数据集类 def __init__(self, csv_file, tokenizer, task_type, max_length512): self.data pd.read_csv(csv_file) self.tokenizer tokenizer self.task_type task_type self.max_length max_length def __len__(self): return len(self.data) def __getitem__(self, idx): row self.data.iloc[idx] text row[text] label row[label] prompt_text create_task_prompt(self.task_type, text) encoding self.tokenizer( prompt_text, truncationTrue, paddingmax_length, max_lengthself.max_length, return_tensorspt ) return { input_ids: encoding[input_ids].flatten(), attention_mask: encoding[attention_mask].flatten(), labels: torch.tensor(label, dtypetorch.long) } # 使用示例 dataset NLUDataset(sentiment_data.csv, tokenizer, sentiment)4. 模型微调实战现在进入最核心的部分——模型微调。我们将使用PyTorch来实现完整的微调流程。4.1 基础微调配置首先让我们设置训练的基本参数from transformers import TrainingArguments, Trainer from torch.optim import AdamW from datasets import load_metric import numpy as np # 设置训练参数 training_args TrainingArguments( output_dir./rexuninlu-finetuned, num_train_epochs3, per_device_train_batch_size8, per_device_eval_batch_size8, warmup_steps500, weight_decay0.01, logging_dir./logs, logging_steps100, evaluation_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, metric_for_best_modelaccuracy, ) # 定义评估指标 metric load_metric(accuracy) def compute_metrics(eval_pred): predictions, labels eval_pred predictions np.argmax(predictions, axis1) return metric.compute(predictionspredictions, referenceslabels)4.2 自定义损失函数在某些情况下我们可能需要自定义损失函数来处理类别不平衡或其他特殊需求import torch.nn as nn import torch.nn.functional as F class WeightedCrossEntropyLoss(nn.Module): 带权重的交叉熵损失函数用于处理类别不平衡 def __init__(self, weightNone): super().__init__() self.weight weight def forward(self, inputs, targets): if self.weight is not None: self.weight self.weight.to(inputs.device) loss F.cross_entropy(inputs, targets, weightself.weight) return loss # 如果有类别不平衡可以设置类别权重 class_weights torch.tensor([1.0, 2.0]) # 假设负面样本较少给正面样本更高权重 criterion WeightedCrossEntropyLoss(weightclass_weights)4.3 学习率策略合适的学习率策略对微调效果至关重要。下面实现一个带 warmup 的学习率调度器from transformers import get_linear_schedule_with_warmup # 准备优化器和学习率调度器 optimizer AdamW(model.parameters(), lr2e-5, weight_decay0.01) # 假设我们有1000个训练步骤 num_training_steps 1000 num_warmup_steps 100 scheduler get_linear_schedule_with_warmup( optimizer, num_warmup_stepsnum_warmup_steps, num_training_stepsnum_training_steps )4.4 完整训练循环现在让我们实现完整的训练循环from torch.utils.data import DataLoader from tqdm import tqdm def train_model(model, train_dataset, val_dataset, epochs3, batch_size8): 完整的训练循环 train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) val_loader DataLoader(val_dataset, batch_sizebatch_size) # 将模型移动到GPU如果可用 device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) best_accuracy 0.0 for epoch in range(epochs): # 训练阶段 model.train() total_loss 0 progress_bar tqdm(train_loader, descfEpoch {epoch1}/{epochs} [Train]) for batch in progress_bar: optimizer.zero_grad() input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask, labelslabels) loss outputs.loss loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() scheduler.step() total_loss loss.item() progress_bar.set_postfix({loss: f{loss.item():.4f}}) avg_train_loss total_loss / len(train_loader) # 验证阶段 model.eval() total_accuracy 0 with torch.no_grad(): for batch in tqdm(val_loader, descfEpoch {epoch1}/{epochs} [Val]): input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask) predictions torch.argmax(outputs.logits, dim-1) accuracy (predictions labels).float().mean() total_accuracy accuracy.item() avg_val_accuracy total_accuracy / len(val_loader) print(fEpoch {epoch1}: Train Loss {avg_train_loss:.4f}, Val Accuracy {avg_val_accuracy:.4f}) # 保存最佳模型 if avg_val_accuracy best_accuracy: best_accuracy avg_val_accuracy torch.save(model.state_dict(), fbest_model_epoch_{epoch1}.pt) return model5. 调试技巧与最佳实践在微调过程中你可能会遇到各种问题。这里分享一些实用的调试技巧5.1 学习率查找找到合适的学习率很重要可以使用学习率查找技巧def find_optimal_lr(model, train_loader, device): 寻找最优学习率 optimizer AdamW(model.parameters(), lr1e-7) lr_lambda lambda step: 10**(step/100) scheduler torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda) model.train() losses [] lrs [] for i, batch in enumerate(train_loader): if i 100: # 测试100个批次 break optimizer.zero_grad() input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask, labelslabels) loss outputs.loss loss.backward() optimizer.step() losses.append(loss.item()) lrs.append(scheduler.get_last_lr()[0]) scheduler.step() return lrs, losses5.2 梯度累积当显存不足时可以使用梯度累积def train_with_gradient_accumulation(model, train_loader, accumulation_steps4): 使用梯度累积训练 optimizer AdamW(model.parameters(), lr2e-5) device torch.device(cuda if torch.cuda.is_available() else cpu) model.train() total_loss 0 for i, batch in enumerate(train_loader): input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask, labelslabels) loss outputs.loss / accumulation_steps loss.backward() total_loss loss.item() if (i 1) % accumulation_steps 0: torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() optimizer.zero_grad() print(fStep {i1}: Loss {total_loss:.4f}) total_loss 05.3 模型验证与测试训练完成后需要全面评估模型性能def evaluate_model(model, test_loader, device): 全面评估模型性能 model.eval() all_predictions [] all_labels [] with torch.no_grad(): for batch in tqdm(test_loader, descEvaluating): input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask) predictions torch.argmax(outputs.logits, dim-1) all_predictions.extend(predictions.cpu().numpy()) all_labels.extend(labels.cpu().numpy()) # 计算各种评估指标 accuracy accuracy_score(all_labels, all_predictions) precision precision_score(all_labels, all_predictions, averageweighted) recall recall_score(all_labels, all_predictions, averageweighted) f1 f1_score(all_labels, all_predictions, averageweighted) print(fAccuracy: {accuracy:.4f}) print(fPrecision: {precision:.4f}) print(fRecall: {recall:.4f}) print(fF1 Score: {f1:.4f}) # 显示混淆矩阵 cm confusion_matrix(all_labels, all_predictions) plt.figure(figsize(8, 6)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues) plt.title(Confusion Matrix) plt.ylabel(True Label) plt.xlabel(Predicted Label) plt.show() return all_predictions, all_labels6. 模型部署与推理训练好的模型需要部署到生产环境中使用class RexUniNLUPredictor: 训练好的模型预测器 def __init__(self, model_path, devicecuda if torch.cuda.is_available() else cpu): self.device device self.tokenizer AutoTokenizer.from_pretrained(model_path) self.model AutoModelForSequenceClassification.from_pretrained(model_path) self.model.to(device) self.model.eval() def predict(self, text, task_typesentiment): 进行预测 prompt_text create_task_prompt(task_type, text) encoding self.tokenizer( prompt_text, truncationTrue, paddingmax_length, max_length512, return_tensorspt ) with torch.no_grad(): input_ids encoding[input_ids].to(self.device) attention_mask encoding[attention_mask].to(self.device) outputs self.model(input_idsinput_ids, attention_maskattention_mask) probabilities F.softmax(outputs.logits, dim-1) prediction torch.argmax(probabilities, dim-1) return { prediction: prediction.item(), probabilities: probabilities.cpu().numpy(), confidence: torch.max(probabilities).item() } # 使用示例 predictor RexUniNLUPredictor(./rexuninlu-finetuned) result predictor.predict(这个产品质量很好性价比很高) print(f预测结果{result})7. 总结通过本文的实践我们完整地走了一遍RexUniNLU模型的微调流程。从环境准备、数据预处理到模型微调、调试优化最后到模型部署每个环节都有详细的操作示例和代码实现。微调过程中最重要的几点经验首先数据质量比数据数量更重要确保标注准确一致其次学习率需要仔细调整太大会导致训练不稳定太小则收敛慢最后一定要在验证集上监控模型性能避免过拟合。实际应用中你可能还需要考虑模型蒸馏、量化等优化技术来提升推理速度。另外对于不同的任务类型prompt的设计也很关键需要根据具体场景进行调整。希望这篇教程能够帮助你在实际项目中成功应用RexUniNLU模型。如果在实践中遇到问题记得多查看模型文档和相关论文也可以在技术社区中寻求帮助。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
RexUniNLU模型微调实战:基于PyTorch的迁移学习
RexUniNLU模型微调实战基于PyTorch的迁移学习1. 引言如果你正在处理中文自然语言理解任务比如从文本中提取关键信息、分析情感倾向或者对文本进行分类可能会遇到一个常见问题现有的通用模型在你的特定领域数据上表现不佳。这时候就需要对模型进行微调让它更好地适应你的具体任务。RexUniNLU是一个强大的中文自然语言理解模型它基于DeBERTa-v2架构采用了创新的RexPrompt框架。这个模型最厉害的地方在于它不需要大量的标注数据就能处理多种NLP任务。但即使如此当我们面对特定领域的文本时比如医疗报告、法律文书或者电商评论还是需要对模型进行一些调整才能获得最佳效果。本文将手把手教你如何使用PyTorch对RexUniNLU模型进行领域适配微调。无论你是NLP初学者还是有一定经验的开发者都能从中学到实用的微调技巧和最佳实践。2. 环境准备与模型加载在开始微调之前我们需要先搭建好开发环境。这里假设你已经安装了Python和PyTorch如果没有的话建议先安装Python 3.8和PyTorch 1.12版本。# 安装必要的依赖库 pip install transformers datasets torchmetrics pip install sentencepiece sacremoses # 用于文本处理接下来让我们加载预训练的RexUniNLU模型和对应的tokenizerfrom transformers import AutoTokenizer, AutoModelForSequenceClassification import torch # 指定模型名称 model_name damo/nlp_rexuninlu_chinese-base # 加载tokenizer和模型 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForSequenceClassification.from_pretrained(model_name) print(f模型加载成功{model_name}) print(f模型参数量{sum(p.numel() for p in model.parameters()):,})这里我们使用的是RexUniNLU的基础版本它已经在大规模中文语料上进行了预训练具备了强大的语言理解能力。现在模型已经准备好了接下来我们需要准备训练数据。3. 数据准备与预处理数据质量直接决定了微调效果的好坏。让我们来看如何为RexUniNLU准备合适的训练数据。首先我们需要将原始文本数据转换成模型可以理解的格式。RexUniNLU使用特殊的prompt格式来处理不同的NLP任务下面是一个情感分析任务的示例def prepare_sentiment_data(text, label, max_length512): 准备情感分析任务的训练数据 text: 原始文本 label: 情感标签0负面, 1正面 # 构建prompt prompt 情感分析判断以下文本的情感倾向是正面还是负面 input_text f{prompt}{text} # 对文本进行编码 encoding tokenizer( input_text, truncationTrue, paddingmax_length, max_lengthmax_length, return_tensorspt ) # 添加标签 encoding[labels] torch.tensor([label]) return encoding # 示例用法 sample_text 这部电影真的很精彩演员表演出色剧情扣人心弦 sample_data prepare_sentiment_data(sample_text, 1) print(处理后的数据, sample_data)对于不同的任务类型我们需要设计不同的prompt模板。下面是一些常见任务的prompt设计示例def create_task_prompt(task_type, text): 为不同任务创建prompt prompts { sentiment: f情感分析{text}, ner: f命名实体识别{text}, classification: f文本分类{text}, relation: f关系抽取{text} } return prompts.get(task_type, text) # 批量处理数据的示例 def prepare_batch_data(texts, labels, task_typesentiment): 批量准备训练数据 encodings [] for text, label in zip(texts, labels): prompt_text create_task_prompt(task_type, text) encoding tokenizer( prompt_text, truncationTrue, paddingmax_length, max_length512, return_tensorspt ) encoding[labels] torch.tensor([label]) encodings.append(encoding) return encodings在实际项目中你可能需要从CSV文件或数据库中加载数据。这里提供一个从CSV文件加载数据的示例import pandas as pd from torch.utils.data import Dataset class NLUDataset(Dataset): 自定义NLP数据集类 def __init__(self, csv_file, tokenizer, task_type, max_length512): self.data pd.read_csv(csv_file) self.tokenizer tokenizer self.task_type task_type self.max_length max_length def __len__(self): return len(self.data) def __getitem__(self, idx): row self.data.iloc[idx] text row[text] label row[label] prompt_text create_task_prompt(self.task_type, text) encoding self.tokenizer( prompt_text, truncationTrue, paddingmax_length, max_lengthself.max_length, return_tensorspt ) return { input_ids: encoding[input_ids].flatten(), attention_mask: encoding[attention_mask].flatten(), labels: torch.tensor(label, dtypetorch.long) } # 使用示例 dataset NLUDataset(sentiment_data.csv, tokenizer, sentiment)4. 模型微调实战现在进入最核心的部分——模型微调。我们将使用PyTorch来实现完整的微调流程。4.1 基础微调配置首先让我们设置训练的基本参数from transformers import TrainingArguments, Trainer from torch.optim import AdamW from datasets import load_metric import numpy as np # 设置训练参数 training_args TrainingArguments( output_dir./rexuninlu-finetuned, num_train_epochs3, per_device_train_batch_size8, per_device_eval_batch_size8, warmup_steps500, weight_decay0.01, logging_dir./logs, logging_steps100, evaluation_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, metric_for_best_modelaccuracy, ) # 定义评估指标 metric load_metric(accuracy) def compute_metrics(eval_pred): predictions, labels eval_pred predictions np.argmax(predictions, axis1) return metric.compute(predictionspredictions, referenceslabels)4.2 自定义损失函数在某些情况下我们可能需要自定义损失函数来处理类别不平衡或其他特殊需求import torch.nn as nn import torch.nn.functional as F class WeightedCrossEntropyLoss(nn.Module): 带权重的交叉熵损失函数用于处理类别不平衡 def __init__(self, weightNone): super().__init__() self.weight weight def forward(self, inputs, targets): if self.weight is not None: self.weight self.weight.to(inputs.device) loss F.cross_entropy(inputs, targets, weightself.weight) return loss # 如果有类别不平衡可以设置类别权重 class_weights torch.tensor([1.0, 2.0]) # 假设负面样本较少给正面样本更高权重 criterion WeightedCrossEntropyLoss(weightclass_weights)4.3 学习率策略合适的学习率策略对微调效果至关重要。下面实现一个带 warmup 的学习率调度器from transformers import get_linear_schedule_with_warmup # 准备优化器和学习率调度器 optimizer AdamW(model.parameters(), lr2e-5, weight_decay0.01) # 假设我们有1000个训练步骤 num_training_steps 1000 num_warmup_steps 100 scheduler get_linear_schedule_with_warmup( optimizer, num_warmup_stepsnum_warmup_steps, num_training_stepsnum_training_steps )4.4 完整训练循环现在让我们实现完整的训练循环from torch.utils.data import DataLoader from tqdm import tqdm def train_model(model, train_dataset, val_dataset, epochs3, batch_size8): 完整的训练循环 train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) val_loader DataLoader(val_dataset, batch_sizebatch_size) # 将模型移动到GPU如果可用 device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) best_accuracy 0.0 for epoch in range(epochs): # 训练阶段 model.train() total_loss 0 progress_bar tqdm(train_loader, descfEpoch {epoch1}/{epochs} [Train]) for batch in progress_bar: optimizer.zero_grad() input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask, labelslabels) loss outputs.loss loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() scheduler.step() total_loss loss.item() progress_bar.set_postfix({loss: f{loss.item():.4f}}) avg_train_loss total_loss / len(train_loader) # 验证阶段 model.eval() total_accuracy 0 with torch.no_grad(): for batch in tqdm(val_loader, descfEpoch {epoch1}/{epochs} [Val]): input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask) predictions torch.argmax(outputs.logits, dim-1) accuracy (predictions labels).float().mean() total_accuracy accuracy.item() avg_val_accuracy total_accuracy / len(val_loader) print(fEpoch {epoch1}: Train Loss {avg_train_loss:.4f}, Val Accuracy {avg_val_accuracy:.4f}) # 保存最佳模型 if avg_val_accuracy best_accuracy: best_accuracy avg_val_accuracy torch.save(model.state_dict(), fbest_model_epoch_{epoch1}.pt) return model5. 调试技巧与最佳实践在微调过程中你可能会遇到各种问题。这里分享一些实用的调试技巧5.1 学习率查找找到合适的学习率很重要可以使用学习率查找技巧def find_optimal_lr(model, train_loader, device): 寻找最优学习率 optimizer AdamW(model.parameters(), lr1e-7) lr_lambda lambda step: 10**(step/100) scheduler torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda) model.train() losses [] lrs [] for i, batch in enumerate(train_loader): if i 100: # 测试100个批次 break optimizer.zero_grad() input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask, labelslabels) loss outputs.loss loss.backward() optimizer.step() losses.append(loss.item()) lrs.append(scheduler.get_last_lr()[0]) scheduler.step() return lrs, losses5.2 梯度累积当显存不足时可以使用梯度累积def train_with_gradient_accumulation(model, train_loader, accumulation_steps4): 使用梯度累积训练 optimizer AdamW(model.parameters(), lr2e-5) device torch.device(cuda if torch.cuda.is_available() else cpu) model.train() total_loss 0 for i, batch in enumerate(train_loader): input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask, labelslabels) loss outputs.loss / accumulation_steps loss.backward() total_loss loss.item() if (i 1) % accumulation_steps 0: torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() optimizer.zero_grad() print(fStep {i1}: Loss {total_loss:.4f}) total_loss 05.3 模型验证与测试训练完成后需要全面评估模型性能def evaluate_model(model, test_loader, device): 全面评估模型性能 model.eval() all_predictions [] all_labels [] with torch.no_grad(): for batch in tqdm(test_loader, descEvaluating): input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_idsinput_ids, attention_maskattention_mask) predictions torch.argmax(outputs.logits, dim-1) all_predictions.extend(predictions.cpu().numpy()) all_labels.extend(labels.cpu().numpy()) # 计算各种评估指标 accuracy accuracy_score(all_labels, all_predictions) precision precision_score(all_labels, all_predictions, averageweighted) recall recall_score(all_labels, all_predictions, averageweighted) f1 f1_score(all_labels, all_predictions, averageweighted) print(fAccuracy: {accuracy:.4f}) print(fPrecision: {precision:.4f}) print(fRecall: {recall:.4f}) print(fF1 Score: {f1:.4f}) # 显示混淆矩阵 cm confusion_matrix(all_labels, all_predictions) plt.figure(figsize(8, 6)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues) plt.title(Confusion Matrix) plt.ylabel(True Label) plt.xlabel(Predicted Label) plt.show() return all_predictions, all_labels6. 模型部署与推理训练好的模型需要部署到生产环境中使用class RexUniNLUPredictor: 训练好的模型预测器 def __init__(self, model_path, devicecuda if torch.cuda.is_available() else cpu): self.device device self.tokenizer AutoTokenizer.from_pretrained(model_path) self.model AutoModelForSequenceClassification.from_pretrained(model_path) self.model.to(device) self.model.eval() def predict(self, text, task_typesentiment): 进行预测 prompt_text create_task_prompt(task_type, text) encoding self.tokenizer( prompt_text, truncationTrue, paddingmax_length, max_length512, return_tensorspt ) with torch.no_grad(): input_ids encoding[input_ids].to(self.device) attention_mask encoding[attention_mask].to(self.device) outputs self.model(input_idsinput_ids, attention_maskattention_mask) probabilities F.softmax(outputs.logits, dim-1) prediction torch.argmax(probabilities, dim-1) return { prediction: prediction.item(), probabilities: probabilities.cpu().numpy(), confidence: torch.max(probabilities).item() } # 使用示例 predictor RexUniNLUPredictor(./rexuninlu-finetuned) result predictor.predict(这个产品质量很好性价比很高) print(f预测结果{result})7. 总结通过本文的实践我们完整地走了一遍RexUniNLU模型的微调流程。从环境准备、数据预处理到模型微调、调试优化最后到模型部署每个环节都有详细的操作示例和代码实现。微调过程中最重要的几点经验首先数据质量比数据数量更重要确保标注准确一致其次学习率需要仔细调整太大会导致训练不稳定太小则收敛慢最后一定要在验证集上监控模型性能避免过拟合。实际应用中你可能还需要考虑模型蒸馏、量化等优化技术来提升推理速度。另外对于不同的任务类型prompt的设计也很关键需要根据具体场景进行调整。希望这篇教程能够帮助你在实际项目中成功应用RexUniNLU模型。如果在实践中遇到问题记得多查看模型文档和相关论文也可以在技术社区中寻求帮助。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。