如何在Hugging Face中计算微调Qwen模型的验证损失并用于评估?
基于Hugging Face Transformers的Qwen模型损失评估与曲线绘制
一、用损失函数评估训练后的模型
你当前的训练配置已经开启了验证损失自动计算(eval_strategy="steps"、metric_for_best_model="eval_loss"),训练后可通过以下方式获取并分析损失:
1. 训练完成后直接评估
训练结束后,调用trainer.evaluate()即可自动在验证集上计算对应损失:
eval_results = trainer.evaluate() print(f"验证集损失: {eval_results['eval_loss']}")
2. 加载指定Checkpoint评估
若要评估不同训练阶段的模型(比如某一保存的checkpoint),可从输出目录加载对应模型后再执行评估:
from transformers import DPOTrainer # 替换为你的checkpoint路径 trainer = DPOTrainer.from_pretrained( model_name_or_path="./output_dir/checkpoint-25000", processing_class=tokenizer, args=training_args, eval_dataset=dataset['valid'] ) eval_results = trainer.evaluate() print(f"该Checkpoint验证损失: {eval_results['eval_loss']}")
3. 手动计算细粒度损失
如果需要针对单个样本或小批量计算损失,可手动执行模型前向传播:
import torch # 取验证集中的一个样本 sample = dataset['valid'][0] inputs = tokenizer(sample['prompt'], sample['completion'], return_tensors="pt").to(model.device) # 无梯度计算损失 with torch.no_grad(): outputs = model(**inputs, labels=inputs['input_ids']) loss = outputs.loss.item() print(f"单样本损失: {loss}")
二、绘制损失曲线筛选最优训练会话
训练过程中,Hugging Face会在输出目录生成trainer_state.json文件,记录每一步的训练损失和验证损失,基于此可绘制曲线并筛选最优会话:
1. 读取训练日志数据
import json # 加载训练状态文件 with open("./output_dir/trainer_state.json", "r") as f: trainer_state = json.load(f) # 提取训练/验证损失与对应步数 train_losses = [] train_steps = [] eval_losses = [] eval_steps = [] for entry in trainer_state['log_history']: if 'loss' in entry: train_steps.append(entry['step']) train_losses.append(entry['loss']) if 'eval_loss' in entry: eval_steps.append(entry['step']) eval_losses.append(entry['eval_loss'])
2. 绘制损失曲线
使用matplotlib绘制训练/验证损失曲线,若有多个训练会话,可将多个日志数据叠加对比:
import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) plt.plot(train_steps, train_losses, label='训练损失', alpha=0.6) plt.plot(eval_steps, eval_losses, label='验证损失', marker='o', alpha=0.8) plt.xlabel('训练步数') plt.ylabel('损失值') plt.title('训练与验证损失曲线') plt.legend() plt.grid(True) plt.show()
3. 筛选最优训练会话
- 查看曲线中验证损失最低的点,对应的训练步数即为最优阶段,对应目录下的checkpoint就是最优模型
- 若存在多个训练会话,对比每个会话的最低验证损失,选择损失最小的会话对应的模型
内容的提问来源于stack exchange,提问作者Kathi Meyer
相关产品推荐
相关产品推荐

