支持新数据集¶
尽管 OpenCompass 已经包含了大多数常用数据集,用户在支持新数据集的时候需要完成以下几个步骤:
在
opencompass/datasets文件夹新增数据集脚本mydataset.py, 该脚本需要包含:数据集及其加载方式,需要定义一个
MyDataset类,实现数据集加载方法load,该方法为静态方法,需要返回datasets.Dataset或datasets.DatasetDict类型的数据。这里我们使用 Hugging Face dataset 作为数据集的统一接口,避免引入额外的逻辑。如果返回Dataset,OpenCompass 会将其同时作为内部的train和testsplit;如果返回DatasetDict,可以在reader_cfg中通过train_split和test_split指定实际使用的 split。具体示例如下:
from typing import Union import datasets from opencompass.registry import LOAD_DATASET from .base import BaseDataset @LOAD_DATASET.register_module() class MyDataset(BaseDataset): @staticmethod def load(**kwargs) -> Union[datasets.Dataset, datasets.DatasetDict]: pass
(可选)如果 OpenCompass 已有的评测器不能满足需要,可以实现并注册自定义 Evaluator,具体方法参阅新增后处理器、评测器与汇总器。
(可选)如果 OpenCompass 已有的后处理方法不能满足需要,需要用户定义
mydataset_postprocess方法,根据输入的字符串得到相应后处理的结果。如果希望通过注册名复用该后处理器,需要注册到TEXT_POSTPROCESSORS。具体示例如下:
from opencompass.registry import TEXT_POSTPROCESSORS @TEXT_POSTPROCESSORS.register_module('mydataset') def mydataset_postprocess(text: str) -> str: pass
新增数据集脚本后,需要确保相关类和函数能被配置文件导入。如果希望使用
from opencompass.datasets import ...的写法,需要在opencompass/datasets/__init__.py中导入新模块;也可以在配置文件中直接从具体模块导入,例如from opencompass.datasets.mydataset import MyDataset。在定义好数据集加载、评测以及数据后处理等方法之后,需要在配置文件中新增以下配置:
from opencompass.datasets import MyDataset, MyDatasetEvaluator, mydataset_postprocess mydataset_eval_cfg = dict( evaluator=dict(type=MyDatasetEvaluator), pred_postprocessor=dict(type=mydataset_postprocess)) mydataset_datasets = [ dict( type=MyDataset, ..., reader_cfg=..., infer_cfg=..., eval_cfg=mydataset_eval_cfg) ]
为了使用户提供的数据集能够被其他使用者更方便地获取,需要用户在配置文件中给出数据集路径。
path字段可以填写本地路径,也可以填写一个逻辑数据集名称;后者会通过opencompass/utils/datasets_info.py中的映射解析为实际数据源。具体示例如下:
mmlu_datasets = [ dict( ..., path='opencompass/mmlu', ..., ) ]
接着,需要在
opencompass/utils/datasets_info.py中创建对应名称的字典字段。如果用户已将数据集托管到 Hugging Face 或 ModelScope,那么请在DATASETS_MAPPING字典中添加对应名称的字段,并将对应的 Hugging Face 或 ModelScope 数据集地址填入hf_id和ms_id;另外,还允许指定一个默认的local地址。具体示例如下:
"opencompass/mmlu": { "ms_id": "opencompass/mmlu", "hf_id": "opencompass/mmlu", "local": "./data/mmlu/", }
如果希望提供的数据集在其他用户使用时能够通过 OpenCompass 官方 OSS 获取,则需要在 Pull Request 阶段向我们提交数据集文件,我们将代为传输数据集至 OSS,并在
DATASETS_URL新建字段。为了确保数据来源的可选择性,用户需要根据所提供数据集的下载路径类型来完善数据集脚本
mydataset.py中的load方法。通常先调用get_data_path(path)解析路径:当DATASET_SOURCE=ModelScope时会使用ms_id;当DATASET_SOURCE=HF时会使用hf_id;未设置DATASET_SOURCE时,当前实现会优先使用local字段对应的本地路径,并结合COMPASS_DATA_CACHE查找缓存,路径不存在时才会根据DATASETS_URL尝试下载。若不同数据源返回的数据格式不同,需要在load中做相应适配。opencompass/datasets/cmmlu.py中的具体示例如下:
def load(path: str, name: str, **kwargs): ... if environ.get('DATASET_SOURCE') == 'ModelScope': ... else: ... return dataset
在完成数据集脚本和配置文件的构建后,需要在 OpenCompass 主目录下的
dataset-index.yml配置文件中登记新数据集的相关信息,以使其加入 OpenCompass 官网 Doc 的数据集统计列表中。需要填写的字段包括数据集名称
name、数据集类型category、原文或项目地址paper、数据集配置文件路径configpath,以及 LLM Judge 配置文件路径configpath_llmjudge。如果没有对应的 LLM Judge 配置,可以将configpath_llmjudge置为空字符串。具体示例如下:
- mydataset: name: MyDataset category: Understanding paper: https://arxiv.org/pdf/xxxxxxx configpath: opencompass/configs/datasets/MyDataset configpath_llmjudge: ''