基于MMEngine的配置文件语法¶
本页是 OpenCompass 配置语法的速查手册。若你还没有完成过一次评测,请先阅读使用配置文件完成一次完整评测。
基本格式¶
配置文件是 Python 文件,通过顶层变量声明评测配置细节。最小评测配置包含两个列表:
models = [dict(type=..., abbr='my-model', ...)]
datasets = [dict(type=..., abbr='my-dataset', ...)]
常用顶层字段如下:
字段 |
作用 |
|---|---|
|
模型后端、路径、生成参数和资源需求 |
|
数据读取、输入构造、推理方式和评测器 |
|
推理任务的 Partitioner、Runner 与 Task |
|
评测任务的 Partitioner、Runner 与 Task |
|
指标分组、展示顺序与综合分数 |
|
实验输出根目录,也可由 |
使用 read_base() 复用配置¶
OpenCompass 使用 MMEngine 的纯 Python 配置继承。导入必须放在 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_models
models = gpt6_models
datasets = gsm8k_datasets
从仓库外部配置文件导入时,使用完整的 opencompass.configs... 路径最清晰;位于 opencompass/configs 内的配置也可以使用相对导入。
组合列表¶
多个模型或数据集可以直接拼接:
models = gpt6_models + other_api_models
datasets = gsm8k_datasets + math_datasets
建议在导入时使用有意义的别名,避免多个模块都导出 models 或 datasets 时发生覆盖。
覆盖导入的配置¶
导入后可以修改列表中的字典。若同一个基础配置还会被其他变量复用,先深拷贝以避免引起误修改:
from copy import deepcopy
models = deepcopy(gpt6_models)
models[0]['query_per_second'] = 2
models[0]['max_workers'] = 16
配置对象与注册类型¶
type 可以写成导入的 Python 类对象:
from opencompass.summarizers import DefaultSummarizer
summarizer = dict(type=DefaultSummarizer)
对于由 MMEngine Registry 管理的组件,type 也可以写成注册名称字符串。例如:
infer_cfg = dict(
prompt_template=dict(
type='RawPromptTemplate',
messages=[dict(role='user', content='{question}')],
),
retriever=dict(type='ZeroRetriever'),
inferencer=dict(type='GenInferencer'),
)
构建组件时,上述三个名称会分别在提示词模板、Retriever 和 Inferencer 对应的 Registry 中查找。OpenCompass 的内置 Registry 配置了模块位置,能够在查找时自动导入相应内置模块,因此通常无需再显式导入这些类。
字符串必须与组件在对应 Registry 中的注册名称完全一致;注册时指定了别名的,应填写别名而不是 Python 类名。自定义组件还必须确保其模块已被导入、注册装饰器已执行。不同 Registry 之间不能混用名称,配置中的其余参数也必须与目标组件的构造函数匹配。请注意,并非所有 type 字段都覆盖了 Registry 管理。
仓库目前没有统一列出所有 Registry 的 CLI。可以先触发对应 Registry 的内置模块导入,再查看已注册名称。例如,列出全部 Inferencer:
python -c "from opencompass.registry import ICL_INFERENCERS as R; R.import_from_location(); print('\n'.join(sorted(R.module_dict)))"
检查某个名称是否存在时,直接调用 get() :
python -c "from opencompass.registry import ICL_INFERENCERS as R; print(R.get('GenInferencer'))"
根据组件类别,可将查询命令中的 ICL_INFERENCERS 替换为 MODELS、LOAD_DATASET、RUNNERS、PARTITIONERS、TASKS、ICL_RETRIEVERS、ICL_PROMPT_TEMPLATES、ICL_EVALUATORS、TEXT_POSTPROCESSORS 或 DICT_POSTPROCESSORS。
配置与命令行的优先级¶
配置文件与命令行之间不存在统一的“命令行始终优先”规则。当前入口的部分参数情况按以下方式处理:
配置文件中的
models、datasets和summarizer优先生效, CLI 中的--models、--datasets、--summarizer以及 Hugging Face 快捷参数不会与其合并。--work-dir会覆盖配置中的work_dir;未传入时保留配置值,若配置也未声明则使用outputs/default。--max-num-workers、--max-workers-per-gpu和--retry仅在未指定配置文件时生效;其中--max-num-workers同时设置 Runner 并发数和NumWorkerPartitioner.num_worker。
解析和检查配置¶
使用 MMEngine 单独检查语法:
python -c "from mmengine.config import Config; Config.fromfile('my_eval.py')"
通过 --dry-run 检查 OpenCompass 补齐默认项后的配置和任务切分:
opencompass my_eval.py --dry-run --config-verbose