使用配置文件完成一次完整评测¶
本教程从空文件开始构建一个完整评测配置。最终实验通过 OpenAI Responses API 调用 gpt-6-astra,评测 64 条 GSM8K 演示样本,并展示如何显式控制任务划分、执行策略,并汇总最终评测结果。
1. 创建配置文件¶
在仓库根目录新建 my_eval.py。先用 read_base() 引入仓库已有的模型和数据集配置:
from mmengine.config import read_base
with read_base():
from opencompass.configs.datasets.demo.demo_gsm8k_chat_gen import \
gsm8k_datasets
from opencompass.configs.models.openai.gpt_6_astra import \
models as gpt6_astra_models
datasets = gsm8k_datasets
models = gpt6_astra_models
models 和 datasets 都必须是列表。通过别名导入模型变量,可以让多个模型配置组合时更易读。demo_gsm8k_chat_gen 只选取 64 条测试样本,适合验证环境,不代表正式基准结果。
2. 使用默认策略执行评测任务¶
上文提供的示例已经能够作为 opencompass 的最小合法配置运行。当配置中没有显式指定 infer 和 eval 字段时,opencompass 会补齐本地默认值。使用如下指令来检查最终配置和任务切分策略:
opencompass my_eval.py --dry-run --config-verbose
然后执行完整评测:
opencompass my_eval.py \
--work-dir outputs/my_eval \
--debug
3. 配置执行策略¶
你可以通过配置 infer 和 eval 字段,显式指定评测任务的切分策略、运行环境和任务类型。示例如下:
from opencompass.partitioners import NaivePartitioner, NumWorkerPartitioner
from opencompass.runners import LocalRunner
from opencompass.tasks import OpenICLEvalWatchTask, OpenICLInferConcurrentTask
infer = dict(
partitioner=dict(type=NumWorkerPartitioner, num_worker=1),
runner=dict(
type=LocalRunner,
max_num_workers=1,
task=dict(type=OpenICLInferConcurrentTask),
),
)
eval = dict(
partitioner=dict(type=NaivePartitioner),
runner=dict(
type=LocalRunner,
max_num_workers=1,
task=dict(type=OpenICLEvalWatchTask),
),
)
这部分描述的是执行方式,不改变数据集中的评分规则:
Partitioner 决定按何种策略把模型与数据集组合划分为子任务。
NumWorkerPartitioner将待测数据集尽量均匀地分配给不超过num_worker个子任务;设为num_worker=1时,同一模型的所有待测数据集会交给一个子任务处理。Runner 决定任务在何种环境中运行。
LocalRunner在本机启动任务,max_num_workers=1表示该 Runner 同一时间最多运行一个任务。该参数控制任务级并发,不控制单个任务内部的 API 请求并发。Task 是推理或评测阶段的实际执行单元,定义该阶段的任务入口与处理逻辑。
OpenICLInferConcurrentTask是执行推理的任务实例,通过模型侧的max_workers控制并发数,但仅适用于 API 模型;直接在评测进程中加载的本地模型应使用OpenICLInferTask。OpenICLEvalWatchTask是执行评测的任务示例,通过监听与心跳机制实现数据集推理完成后的实时评测;本地模型通常与OpenICLEvalTask搭配使用。
三类组件的职责、主要参数和选择方法详见任务划分、执行器与任务类型,以及跨任务并发推理与评测监听。
4. 配置结果汇总¶
通过 summarizer 可以指定最终汇总表中的展示内容、指标和顺序。示例如下:
summarizer = dict(
dataset_abbrs=[
'All Results',
['demo_gsm8k', 'accuracy'],
],
)
dataset_abbrs 中的各项会按列表顺序显示:支持显示类似 All Results 的纯文本行,['demo_gsm8k', 'accuracy'] 指定要展示的数据集 abbr 及其指标。Summarizer 只负责组织和展示 Evaluator 产出的指标,不会改变评分规则。
5. 运行、恢复与分阶段执行¶
正式运行命令如下(也可将 work_dir 写入配置文件以便复用):
opencompass my_eval.py --work-dir outputs/my_eval
每次启动会在 outputs/my_eval/ 下创建时间戳目录。如果某次运行中断,可复用最近一次实验中的已有产物:
opencompass my_eval.py --work-dir outputs/my_eval --reuse
也可以指定时间戳,并只执行某个阶段:
opencompass my_eval.py \
--work-dir outputs/my_eval \
--reuse 20260903_120000 \
--mode eval
--mode eval 和 --mode viz 必须配合 --reuse,否则 OpenCompass 不知道应读取哪次预测或结果。复用逻辑详见任务恢复、复用与只重跑评测,全部命令行参数见命令行参数参考。
6. 完整配置文件的结构¶
将前面各部分合并后,完整的 my_eval.py 如下:
from mmengine.config import read_base
from opencompass.partitioners import NaivePartitioner, NumWorkerPartitioner
from opencompass.runners import LocalRunner
from opencompass.tasks import (OpenICLEvalWatchTask,
OpenICLInferConcurrentTask)
with read_base():
from opencompass.configs.datasets.demo.demo_gsm8k_chat_gen import \
gsm8k_datasets
from opencompass.configs.models.openai.gpt_6_astra import \
models as gpt6_astra_models
datasets = gsm8k_datasets
models = gpt6_astra_models
infer = dict(
partitioner=dict(type=NumWorkerPartitioner, num_worker=1),
runner=dict(
type=LocalRunner,
max_num_workers=1,
task=dict(type=OpenICLInferConcurrentTask),
),
)
eval = dict(
partitioner=dict(type=NaivePartitioner),
runner=dict(
type=LocalRunner,
max_num_workers=1,
task=dict(type=OpenICLEvalWatchTask),
),
)
summarizer = dict(
dataset_abbrs=[
'All Results',
['demo_gsm8k', 'accuracy'],
],
)
work_dir = 'outputs/my_eval'
其中,命令行传入的 --work-dir 会覆盖配置文件中的 work_dir。保存文件后,可以先运行 opencompass my_eval.py --dry-run --config-verbose 检查最终配置和任务划分,再启动完整评测。
7. 检查产物¶
一次运行的时间戳目录包含(各目录产物的结构细节见理解输出与结果汇总):
outputs/my_eval/<时间戳>/
├── configs/ # 实际生效的配置快照
├── logs/ # 非 debug 模式下的任务日志
├── predictions/ # 逐样本模型输出
├── results/ # 数据集评测结果与明细
└── summary/ # 汇总表格和 CSV 等文件
8. 扩展评测配置¶
你可以在配置文件中写入多模型、多评测集、统一配置 Judge 模型、批量化设置上下文等多项扩展方案。例如:
# 合并前面通过 read_base() 导入的模型和数据集配置
models = model_group_a + model_group_b
datasets = objective_datasets + subjective_datasets
# Judge 模型仅用于评分,不属于上面的被测模型列表
from opencompass.models import OpenAISDK
judge_cfg = dict(
abbr='judge-model',
type=OpenAISDK,
path='your-judge-model',
key='your-judge-key',
openai_api_base='your-judge-api',
batch_size=64,
temperature=0.001,
max_out_len=16384,
max_seq_len=262144,
)
for dataset in datasets:
# 统一覆盖数据集推理器的最大输出长度
inferencer = dataset.get('infer_cfg', {}).get('inferencer')
if inferencer is not None:
inferencer['max_out_len'] = 128000
# 覆盖直接使用 Judge 模型的 Evaluator 配置
evaluator = dataset.get('eval_cfg', {}).get('evaluator', {})
if 'judge_cfg' in evaluator:
evaluator['judge_cfg'] = judge_cfg
# 兼容在级联评测器中嵌套的 LLM Evaluator
if ('llm_evaluator' in evaluator
and 'judge_cfg' in evaluator['llm_evaluator']):
evaluator['llm_evaluator']['judge_cfg'] = judge_cfg