You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HuggingFace构建QA Pipeline遇KeyError: 'eval_loss',求保存最佳模型方法

HuggingFace QA训练触发KeyError: 'eval_loss'的解决方法

问题背景

使用HuggingFace框架构建问答(QA)Pipeline时,训练阶段出现KeyError: 'eval_loss'错误,配置的TrainingArguments如下:

args = TrainingArguments(f'model_training',
                      evaluation_strategy="epoch",
                      label_names = ["start_positions", "end_positions"],
                      logging_steps = 1,
                      learning_rate=2e-5,
                      num_train_epochs=epochs,
                      save_total_limit = 2,
                      load_best_model_at_end=True,
                      save_strategy="epoch",
                      logging_strategy="epoch",
                      report_to="none",
                      weight_decay=0.01,
                      fp16=True,
                      push_to_hub=False)

错误栈信息:

Traceback (most recent call last):
  File "qa_pipe.py", line 286, in <module>
    pipe.training(train_d, val_d, epochs = 2)
  File "qa_pipe.py", line 263, in training
    self.trainer.train()
  File "/home/admin/qa/lib/python3.7/site-packages/transformers/trainer.py", line 1505, in train
    ignore_keys_for_eval=ignore_keys_for_eval,
  File "/home/admin/qa/lib/python3.7/site-packages/transformers/trainer.py", line 1838, in _inner_training_loop
    self._maybe_log_save_evaluate(tr_loss, model, trial, epoch, ignore_keys_for_eval)
  File "/home/admin/qa/lib/python3.7/site-packages/transformers/trainer.py", line 2090, in _maybe_log_save_evaluate
    self._save_checkpoint(model, trial, metrics=metrics)
  File "/home/admin/qa/lib/python3.7/site-packages/transformers/trainer.py", line 2193, in _save_checkpoint
    metric_value = metrics[metric_to_check]
KeyError: 'eval_loss'

错误原因

当设置load_best_model_at_end=True时,Trainer默认以eval_loss作为筛选最佳模型的指标,但如果验证阶段未生成eval_loss(比如自定义compute_metrics函数未返回该值、验证数据集字段缺失导致模型无法计算损失),就会触发该KeyError。

解决方法

1. 明确指定评估指标并确保返回eval_loss

在TrainingArguments中显式声明最佳模型的判断指标,同时确保compute_metrics函数返回包含eval_loss的结果字典:

args = TrainingArguments(
    f'model_training',
    evaluation_strategy="epoch",
    label_names = ["start_positions", "end_positions"],
    logging_steps = 1,
    learning_rate=2e-5,
    num_train_epochs=epochs,
    save_total_limit = 2,
    load_best_model_at_end=True,
    save_strategy="epoch",
    logging_strategy="epoch",
    report_to="none",
    weight_decay=0.01,
    fp16=True,
    push_to_hub=False,
    # 新增以下配置
    metric_for_best_model="eval_loss",
    greater_is_better=False  # loss值越小模型性能越好
)

2. 检查验证数据集完整性

确认验证数据集val_d包含模型所需的全部输入特征:input_ids、attention_mask、start_positions、end_positions,避免因字段缺失导致模型无法计算验证损失。

3. 升级Transformers库版本

旧版本Transformers可能存在eval_loss未被正确记录的Bug,执行命令升级依赖:

pip install --upgrade transformers datasets

4. 临时规避方案(可选)

如果暂时不需要自动加载最佳模型的功能,可先将load_best_model_at_end设为False,训练完成后手动筛选最佳模型:

args = TrainingArguments(
    # 其他参数不变
    load_best_model_at_end=False
)

最佳模型保存与加载

错误修复后,Trainer会自动将最佳模型保存至model_training目录。加载模型时直接读取该目录即可:

from transformers import AutoModelForQuestionAnswering, AutoTokenizer

model = AutoModelForQuestionAnswering.from_pretrained("model_training")
tokenizer = AutoTokenizer.from_pretrained("model_training")

内容的提问来源于stack exchange,提问作者Aaditya Ura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:30:59