Shortcuts

任务划分、执行器与任务类型

OpenCompass 把推理和评测拆成任务后交给 Runner 执行。配置中的三个层次分别是:

  • Partitioner:把模型和数据集组合按指定策略拆成子任务;

  • Runner:在本地或 Slurm、阿里云、火山引擎等外部环境中以指定配置和并发启动任务;

  • Task:执行推理、评测或其他具体工作。

用户通过配置文件中的 infer.partitioner / infer.runner 和 eval.partitioner / eval.runner 分别控制推理和评测两个阶段。本页集中说明 Partitioner、Runner 和普通任务类型;API 跨数据集并发的内部机制见跨任务并发推理与评测监听。

任务划分:三种 Partitioner

NaivePartitioner

将每个“模型 × 数据集”组合作为一个独立任务派发,是最基础的划分策略,没有额外参数。评测阶段天然适合这种划分——每个组合的预测文件本就是一个整体。

from opencompass.partitioners import NaivePartitioner

infer = dict(
    partitioner=dict(type=NaivePartitioner),
    # ...
)

NumWorkerPartitioner

推理阶段的默认划分器。它把每个数据集划分成 num_split 份,再将这些分片均匀分入 num_worker 个任务,任务数预期与实际运行的 worker 数一致。

from opencompass.partitioners import NumWorkerPartitioner

infer = dict(
    partitioner=dict(
        type=NumWorkerPartitioner,
        num_worker=16,    # 划分完成后的任务数 / 预期 worker 数
        num_split=None,   # 每个数据集被划分成多少份;None 时取 num_worker
        min_task_size=16, # 每个划分的最小样本数
    ),
    # ...
)

strategy 参数可选 heuristic(默认)与 split,后者只切分大数据集、不合并小数据集。

警告

该划分器不适用于评测阶段(OpenICLEvalTask)。

警告

推理需要断点继续时,不要修改 num_split 的值;若 num_split 为 None,则不要修改 num_worker,否则已有预测分片无法对齐复用。

SizePartitioner

根据数据集大小乘上扩张系数,估算每个数据集的推理成本,然后通过切分大数据集、合并小数据集的方式创建任务,尽量让各子任务的成本均等。

from opencompass.partitioners import SizePartitioner

infer = dict(
    partitioner=dict(
        type=SizePartitioner,
        max_task_size=2000,  # 单个任务的最大样本数
        gen_task_coef=20,    # 生成式任务的扩张系数
    ),
    # ...
)

估算成本时按推理类型选择系数:生成式任务(GenInferencer)使用较大的 gen_task_coef;判别式任务(PPLInferencer)则使用 prompt 中 label 的数量。这一估算仍然比较粗糙,未能准确反映两类任务的计算量差距。

警告

该划分器不适用于评测阶段(OpenICLEvalTask)。

切分与断点恢复

改变切分参数可能让已有预测文件无法正确复用。需要断点恢复时,应保持模型简称、数据集简称和切分策略稳定,详见任务恢复、复用与只重跑评测。

运行后端:Runner

LocalRunner

最基本的运行器,将任务在本机并行启动:

from opencompass.runners import LocalRunner

runner=dict(
    type=LocalRunner,
    max_num_workers=16,  # 最大并行任务数,默认 16
    max_workers_per_gpu=1,
    task=dict(type=OpenICLInferTask),
)

实际并行任务数同时受可用 GPU 资源和 max_num_workers 限制。

SlurmRunner

将任务提交到 Slurm 集群运行:

from opencompass.runners import SlurmRunner

runner=dict(
    type=SlurmRunner,
    partition='my-partition',  # 集群分区
    quotatype='auto',          # 可选:配额类型
    max_num_workers=16,        # 最大同时运行任务数,默认 32
    retry=2,                   # 任务失败重试次数
    task=dict(type=OpenICLInferTask),
)

DLCRunner

将任务提交到阿里云 PAI-DLC 运行,依赖环境中预先配置好的 dlc 命令行工具和工作空间:

from opencompass.runners import DLCRunner

runner=dict(
    type=DLCRunner,
    max_num_workers=16,
    retry=2,
    aliyun_cfg=dict(
        workspace_id='ws-xxx',               # DLC 工作空间 ID
        worker_image='xxx',                  # 运行任务的镜像
        dlc_config_path='/user/.dlc/config', # dlc 配置文件
        conda_env_name='opencompass',        # OpenCompass 的 conda 环境
    ),
    task=dict(type=OpenICLInferTask),
)

VOLCRunner

将任务提交到火山引擎机器学习平台运行。使用前需要安装并配置 volc 命令行工具,并准备机器学习任务 YAML 配置文件:

from opencompass.runners import VOLCRunner
from opencompass.tasks import OpenICLInferTask

runner=dict(
    type=VOLCRunner,
    queue_name='your-resource-queue',
    max_num_workers=16,
    retry=2,
    preemptible=False,
    volcano_cfg=dict(
        volcano_config_path='/path/to/ml_task.yaml',
        python_env_path='/path/to/opencompass-env',
        hf_offline=True,
        extra_envs=['COMPASS_DATA_CACHE=/path/to/data'],
    ),
    task=dict(type=OpenICLInferTask),
)

VOLCRunner 使用 volc ml_task submit 提交任务,并通过 get 和 logs 子命令跟踪状态与日志。它会根据 Task 的 num_gpus 修改 YAML 中 RoleName: worker 角色的 Flavor,因此配置文件必须包含该角色。python_env_path 也可替换为 bashrc_path 与 conda_env_name,以激活指定的 Conda 环境。

RJOBRunner

通过 rjob 命令行工具提交并跟踪任务,适用于使用 rjob 调度的集群。资源需求根据任务声明的 num_gpus 自动推导(GPU 数、内存和 CPU);无 GPU 的任务可在 rjob_cfg 中直接指定 memory 和 cpu。提交后 Runner 会轮询 rjob get 直到任务结束:

from opencompass.runners import RJOBRunner

runner=dict(
    type=RJOBRunner,
    max_num_workers=16,
    retry=2,
    rjob_cfg=dict(
        task_id='my-exp',               # 用于生成任务名
        image='xxx',                    # 运行任务的镜像
        mount=['/path/to/shared'],      # 挂载路径,字符串或列表
        env=dict(HF_HOME='/cache/huggingface'),  # 注入的环境变量
    ),
    task=dict(type=OpenICLInferTask),
)

rjob_cfg 还支持 charged_group、private_machine、replicas、host_network 和 extra_args 等字段。

命令行的 --slurm / --dlc 属于运行时覆盖:即使配置已定义执行器,也会把 Runner 替换成对应类型,并给出覆盖警告。VOLCRunner 没有对应的命令行覆盖参数,需要在配置文件中显式声明。

任务类型(Task)

任务是OpenCompass中实际执行评测的独立脚本,通过配置文件确定参数。它可以实例化后调用 task.run() 执行,也可以通过 get_command 生成完整命令(如 srun {task_cmd})交给调度系统。目前支持:

  • OpenICLInferTask:基于 OpenICL 框架执行语言模型推理;

  • OpenICLEvalTask:读取预测结果执行评测计算;

  • OpenICLInferConcurrentTask:由一个进程并发推进 API 模型的多个数据集;

  • OpenICLEvalWatchTask:监听推理状态并随完成随评。

后两个任务的参数、运行机制和选择建议参阅跨任务并发推理与评测监听。

任务恢复、复用与只重跑评测

OpenCompass 将预测、评分与汇总结果分别保存,因此可以复用已完成的阶段。复用时,工作目录、时间戳、模型与数据集简称以及任务切分方式应保持一致。

本节命令中的 --reuse、--mode 和 --work-dir 可分别简写为 -r、-m 和 -w,长短形式可以混合使用。

复用最近一次运行

opencompass my_eval.py --work-dir outputs/my_eval --reuse

不指定值时,--reuse(或 -r)会选择该工作目录下按名称排序的最新时间戳目录。为明确指定复用目标,建议传入具体时间戳:

opencompass my_eval.py \
    -w outputs/my_eval \
    -r 20260903_120000

分阶段执行

# 只生成预测
opencompass my_eval.py -w outputs/my_eval -m infer

# 对已有预测重新评分
opencompass my_eval.py -w outputs/my_eval \
    -r 20260903_120000 -m eval

# 对已有结果重新汇总
opencompass my_eval.py -w outputs/my_eval \
    -r 20260903_120000 -m viz

使用 eval 或 viz 模式时,需要通过 --reuse 指定已有实验,或使用结果站读取机制。

@沪ICP备2021009351号-23 OpenCompass Open Platform Service Agreement