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

如何在测试集上测试已训练好的HuggingFace多选QA模型

HuggingFace多选问答模型测试集运行方案

你的测试集已经完成和训练集、验证集完全一致的特征处理,字段对齐,不需要额外做预处理,直接复用训练时的组件就能完成测试,两种常用实现方式如下:

方案一:复用Trainer接口(最简便,和训练验证逻辑完全统一)

不需要重写指标计算、数据加载逻辑,直接替换评估数据集即可:

from transformers import TrainingArguments, Trainer, DataCollatorForMultipleChoice, AutoModelForMultipleChoice

# 加载训练好的模型检查点
model = AutoModelForMultipleChoice.from_pretrained('results/checkpoint-1000')

# 配置测试专用参数,关闭训练逻辑
test_args = TrainingArguments(
    output_dir="./test_results",
    per_device_eval_batch_size=8,
    do_train=False,
    evaluation_strategy="no"
)

# 初始化测试用Trainer,评估数据集替换为test拆分
trainer = Trainer(
    model=model,
    args=test_args,
    tokenizer=tokenizer,
    data_collator=DataCollatorForMultipleChoice(tokenizer=tokenizer),
    compute_metrics=compute_metrics, # 直接复用训练阶段写好的指标计算函数
    eval_dataset=tokenized_qa["test"]
)

# 执行评估,直接返回测试集整体指标
test_metrics = trainer.evaluate()
print("测试集指标:", test_metrics)

如果需要导出每条样本的预测结果,开启predict模式即可:

# 修改参数开启预测
test_args.do_predict = True
pred_result = trainer.predict(tokenized_qa["test"])
# pred_result.metrics 为整体评估指标
# pred_result.predictions 为所有样本对应4个选项的原始logits,沿最后一维argmax即可得到预测标签
# pred_result.label_ids 为测试集真实标签

方案二:自定义推理循环(适合需要定制化处理预测结果的场景)

如果需要在推理过程中插入自定义逻辑,可以手动构造DataLoader实现:

import torch
from torch.utils.data import DataLoader
from transformers import DataCollatorForMultipleChoice

# 模型切换到评估模式,加载到对应运算设备
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
model.eval()

# 构造测试集DataLoader,collate_fn和训练阶段保持一致
test_dataloader = DataLoader(
    # 移除非张量类型的原始文本字段,避免数据加载报错
    tokenized_qa["test"].remove_columns(['id', 'sent1', 'sent2', 'ending0', 'ending1', 'ending2', 'ending3']),
    batch_size=8,
    collate_fn=DataCollatorForMultipleChoice(tokenizer=tokenizer)
)

all_preds = []
all_labels = []
# 关闭梯度计算,减少显存占用
with torch.no_grad():
    for batch in test_dataloader:
        batch = {k: v.to(device) for k, v in batch.items()}
        outputs = model(**batch)
        batch_preds = outputs.logits.argmax(dim=-1)
        all_preds.extend(batch_preds.cpu().numpy().tolist())
        all_labels.extend(batch["labels"].cpu().numpy().tolist())

# 将all_preds、all_labels传入你训练时用的compute_metrics函数即可得到测试集指标

注意点

  • 不要修改tokenizer、data_collator、compute_metrics的配置,和训练阶段保持一致即可,避免特征处理不匹配导致结果异常
  • 如果你的测试集没有真实标签(如竞赛提交场景),去掉compute_metrics配置,直接取预测结果整理成要求的提交格式即可
  • 手动推理时必须将模型切换到eval()模式,否则Dropout、BatchNorm等层的训练态行为会导致推理结果不稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:24:16