OpenCompass评测系统:任务分片与并行执行深度解析

OpenCompass评测系统:任务分片与并行执行深度解析

【免费下载链接】opencompass opencompass - OpenCompass是一个用于评估大型语言模型的工具,提供分布式评估、多样化评估范式和模块化设计。 【免费下载链接】opencompass 项目地址: https://gitcode.com/gh_mirrors/op/opencompass

引言

在大模型评测领域,如何高效处理海量数据是一个关键挑战。OpenCompass作为一款专业的大模型评测工具,通过创新的任务分片和并行执行机制,实现了评测过程的高效加速。本文将深入解析OpenCompass的任务分片策略和运行机制,帮助用户根据实际需求优化评测流程。

核心概念

OpenCompass的评测流程主要包含两个阶段:

  1. 推理阶段(Infer):模型对测试数据进行预测
  2. 评估阶段(Eval):对预测结果进行指标计算

每个阶段都涉及三个核心组件:

  • Partitioner(分片器):将大任务拆分为小任务
  • Runner(运行器):控制任务的执行方式
  • Task(任务):具体的执行单元

任务分片策略详解

1. NaivePartitioner(基础分片器)

适用场景:最简单的分片策略,适合小规模评测或调试场景。

工作原理

  • 每个模型和数据集组合作为一个独立任务
  • 不做任何额外拆分
  • 任务数量 = 模型数量 × 数据集数量

配置示例

from opencompass.partitioners import NaivePartitioner

infer = dict(
    partitioner=dict(type=NaivePartitioner)
)

优缺点分析

  • 优点:实现简单,易于理解
  • 缺点:当数据集很大时,单个任务可能执行时间过长

2. NumWorkerPartitioner(按工作节点分片)

适用场景:推理阶段的默认分片策略,适合需要精确控制并行度的场景。

工作原理

  1. 将每个数据集划分为num_split
  2. 将这些分片均匀分配到num_worker个任务中
  3. 确保每个任务的工作量相对均衡

关键参数

  • 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_splitnum_worker会影响断点续评的功能
  • 不适合评估阶段的任务

3. SizePartitioner(按计算量分片)

适用场景:需要根据任务计算量动态分片的场景。

工作原理

  1. 估算每个数据集的推理成本(数据量×扩张系数)
  2. 通过切分大数据集、合并小数据集的方式创建任务
  3. 确保各任务的计算成本相近

关键参数

  • 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)环境。

前期准备

  1. 安装DLC命令行工具
  2. 配置访问凭证

配置示例

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工作空间ID
  • worker_image:运行任务的容器镜像
  • conda_env_name:包含OpenCompass的环境

任务类型解析

OpenCompass目前支持两种核心任务类型:

  1. OpenICLInferTask

    • 基于OpenICL框架执行语言模型推理
    • 处理模型的前向计算
  2. OpenICLEvalTask

    • 基于OpenEval框架执行评估计算
    • 计算各类评测指标

任务执行方式

  1. 直接调用task.run()
  2. 通过get_command生成完整执行命令

性能优化建议

  1. 数据密集型任务

    • 使用SizePartitioner确保各节点负载均衡
    • 适当增大max_task_size减少任务调度开销
  2. 计算密集型任务

    • 使用NumWorkerPartitioner精确控制并行度
    • 根据GPU内存调整min_task_size
  3. 混合型任务

    • 对不同类型任务采用不同分片策略
    • 为生成式任务设置更高的扩张系数

常见问题解答

Q: 如何选择合适的分片策略? A: 小规模评测用NaivePartitioner,大规模推理用NumWorkerPartitioner,异构任务用SizePartitioner。

Q: 任务执行失败怎么办? A: 配置Runner的retry参数启用自动重试,SlurmRunner和DLCRunner都支持此功能。

Q: 如何估算最佳并行度? A: 从较小值开始测试,逐步增加直到资源利用率达到80-90%。

结语

OpenCompass通过灵活的任务分片和多样化的运行后端,为大规模语言模型评测提供了高效解决方案。理解这些机制的工作原理和配置方法,可以帮助用户根据实际硬件环境和评测需求,设计出最优的评测流程。随着OpenCompass的持续发展,未来还将支持更多任务类型和分片策略,进一步满足多样化的评测需求。

【免费下载链接】opencompass opencompass - OpenCompass是一个用于评估大型语言模型的工具,提供分布式评估、多样化评估范式和模块化设计。 【免费下载链接】opencompass 项目地址: https://gitcode.com/gh_mirrors/op/opencompass

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值