OpenCompass评测系统:任务分片与并行执行深度解析
引言
在大模型评测领域,如何高效处理海量数据是一个关键挑战。OpenCompass作为一款专业的大模型评测工具,通过创新的任务分片和并行执行机制,实现了评测过程的高效加速。本文将深入解析OpenCompass的任务分片策略和运行机制,帮助用户根据实际需求优化评测流程。
核心概念
OpenCompass的评测流程主要包含两个阶段:
- 推理阶段(Infer):模型对测试数据进行预测
- 评估阶段(Eval):对预测结果进行指标计算
每个阶段都涉及三个核心组件:
- Partitioner(分片器):将大任务拆分为小任务
- Runner(运行器):控制任务的执行方式
- Task(任务):具体的执行单元
任务分片策略详解
1. NaivePartitioner(基础分片器)
适用场景:最简单的分片策略,适合小规模评测或调试场景。
工作原理:
- 每个模型和数据集组合作为一个独立任务
- 不做任何额外拆分
- 任务数量 = 模型数量 × 数据集数量
配置示例:
from opencompass.partitioners import NaivePartitioner
infer = dict(
partitioner=dict(type=NaivePartitioner)
)
优缺点分析:
- 优点:实现简单,易于理解
- 缺点:当数据集很大时,单个任务可能执行时间过长
2. NumWorkerPartitioner(按工作节点分片)
适用场景:推理阶段的默认分片策略,适合需要精确控制并行度的场景。
工作原理:
- 将每个数据集划分为
num_split份 - 将这些分片均匀分配到
num_worker个任务中 - 确保每个任务的工作量相对均衡
关键参数:
num_worker:预期的工作节点数num_split:每个数据集的划分份数min_task_size:每个分片的最小数据量
配置示例:
from opencompass.partitioners import NumWorkerPartitioner
infer = dict(
partitioner=dict(
type=NumWorkerPartitioner,
num_worker=16,
num_split=None,
min_task_size=16,
)
)
注意事项:
- 修改
num_split或num_worker会影响断点续评的功能 - 不适合评估阶段的任务
3. SizePartitioner(按计算量分片)
适用场景:需要根据任务计算量动态分片的场景。
工作原理:
- 估算每个数据集的推理成本(数据量×扩张系数)
- 通过切分大数据集、合并小数据集的方式创建任务
- 确保各任务的计算成本相近
关键参数:
max_task_size:单个任务的最大数据量gen_task_coef:生成式任务的扩张系数
配置示例:
from opencompass.partitioners import SizePartitioner
infer = dict(
partitioner=dict(
type=SizePartitioner,
max_task_size=2000,
gen_task_coef=20,
)
)
技术细节:
- 生成式任务(如使用GenInferencer)使用较大的扩张系数
- 判别式任务(如使用PPLInferencer)使用prompt中的标签数量作为系数
运行后端选择指南
1. LocalRunner(本地运行器)
适用场景:单机多卡环境。
特点:
- 使用本地进程并行执行任务
- 配置简单,无需额外依赖
配置示例:
from opencompass.runners import LocalRunner
infer = dict(
runner=dict(
type=LocalRunner,
max_num_workers=16,
task=dict(type=OpenICLEvalTask),
)
)
资源限制:
- 实际并行度受GPU数量和
max_num_workers共同限制
2. SlurmRunner(Slurm集群运行器)
适用场景:Slurm管理的HPC集群环境。
特点:
- 自动提交任务到Slurm队列
- 支持任务重试机制
配置示例:
from opencompass.runners import SlurmRunner
infer = dict(
runner=dict(
type=SlurmRunner,
max_num_workers=16,
retry=2,
task=dict(type=OpenICLEvalTask),
)
)
最佳实践:
- 合理设置
retry参数可提高任务可靠性 max_num_workers应与集群资源匹配
3. DLCRunner(阿里云DLC运行器)
适用场景:阿里云深度学习中心(DLC)环境。
前期准备:
- 安装DLC命令行工具
- 配置访问凭证
配置示例:
from opencompass.runners import DLCRunner
infer = dict(
runner=dict(
type=DLCRunner,
max_num_workers=16,
aliyun_cfg=dict(
bashrc_path="/user/.bashrc",
conda_env_name='opencompass',
dlc_config_path="/user/.dlc/config",
workspace_id='ws-xxx',
worker_image='xxx',
),
retry=2,
task=dict(type=OpenICLEvalTask),
)
)
关键配置项:
workspace_id:DLC工作空间IDworker_image:运行任务的容器镜像conda_env_name:包含OpenCompass的环境
任务类型解析
OpenCompass目前支持两种核心任务类型:
-
OpenICLInferTask
- 基于OpenICL框架执行语言模型推理
- 处理模型的前向计算
-
OpenICLEvalTask
- 基于OpenEval框架执行评估计算
- 计算各类评测指标
任务执行方式:
- 直接调用
task.run() - 通过
get_command生成完整执行命令
性能优化建议
-
数据密集型任务:
- 使用SizePartitioner确保各节点负载均衡
- 适当增大
max_task_size减少任务调度开销
-
计算密集型任务:
- 使用NumWorkerPartitioner精确控制并行度
- 根据GPU内存调整
min_task_size
-
混合型任务:
- 对不同类型任务采用不同分片策略
- 为生成式任务设置更高的扩张系数
常见问题解答
Q: 如何选择合适的分片策略? A: 小规模评测用NaivePartitioner,大规模推理用NumWorkerPartitioner,异构任务用SizePartitioner。
Q: 任务执行失败怎么办? A: 配置Runner的retry参数启用自动重试,SlurmRunner和DLCRunner都支持此功能。
Q: 如何估算最佳并行度? A: 从较小值开始测试,逐步增加直到资源利用率达到80-90%。
结语
OpenCompass通过灵活的任务分片和多样化的运行后端,为大规模语言模型评测提供了高效解决方案。理解这些机制的工作原理和配置方法,可以帮助用户根据实际硬件环境和评测需求,设计出最优的评测流程。随着OpenCompass的持续发展,未来还将支持更多任务类型和分片策略,进一步满足多样化的评测需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



