|
| 1 | +# 添加自定义任务 |
| 2 | + |
| 3 | +要添加新任务,首先打开一个issue,确定它是否将被集成到lighteval的核心评估中、扩展任务中还是社区任务中,并在hub上添加其数据集。 |
| 4 | + |
| 5 | +- 核心评估是在其度量和处理中只需要标准逻辑的评估,我们会将其添加到我们的测试套件中,以确保随着时间的推移不会出现回归。它们在社区中已经有很高的使用率。 |
| 6 | +- 扩展评估是在其度量中需要自定义逻辑的评估(复杂的规范化、LLM作为评判等),我们添加它们是为了方便用户。它们在社区中已经有很高的使用率。 |
| 7 | +- 社区评估是社区提交的新任务。 |
| 8 | + |
| 9 | +随着时间的推移,一个受欢迎的社区评估可以发展成为扩展评估或核心评估。 |
| 10 | + |
| 11 | +> [!TIP] |
| 12 | +> 您可以在<a href="https://github.com/huggingface/lighteval/tree/main/community_tasks">community_task</a>目录中找到自定义任务的示例。 |
| 13 | +
|
| 14 | +## 逐步创建自定义任务 |
| 15 | + |
| 16 | +> [!WARNING] |
| 17 | +> 要将您的自定义指标贡献给lighteval仓库,您首先需要通过运行`pip install -e .[dev]`安装所需的开发依赖项,然后运行`pre-commit install`安装pre-commit钩子。 |
| 18 | +
|
| 19 | +首先,在`community_tasks`目录下创建一个Python文件。 |
| 20 | + |
| 21 | +您需要定义一个提示函数,该函数将把来自数据集的一行转换为用于评估的文档。 |
| 22 | + |
| 23 | +```python |
| 24 | +# 根据您不同的任务需求定义尽可能多的函数 |
| 25 | +def prompt_fn(line, task_name: str = None): |
| 26 | + """定义如何从数据集行到doc对象。 |
| 27 | + 参考src/lighteval/tasks/default_prompts.py中的例子, |
| 28 | + 或者在README中获取关于此函数应该做什么的更多信息。 |
| 29 | + """ |
| 30 | + return Doc( |
| 31 | + task_name=task_name, |
| 32 | + query=line["question"], |
| 33 | + choices=[f" {c}" for c in line["choices"]], |
| 34 | + gold_index=line["gold"], |
| 35 | + instruction="", |
| 36 | + ) |
| 37 | +``` |
| 38 | + |
| 39 | +然后,您需要选择一个指标:您可以使用现有的指标(在[`lighteval.metrics.metrics.Metrics`]中定义)或[创建自定义指标](adding-a-new-metric)。 |
| 40 | +[//]: # (TODO: 一旦添加了自动文档,将lighteval.metrics.metrics.Metrics替换为~metrics.metrics.Metrics) |
| 41 | + |
| 42 | +```python |
| 43 | +custom_metric = SampleLevelMetric( |
| 44 | + metric_name="my_custom_metric_name", |
| 45 | + higher_is_better=True, |
| 46 | + category=MetricCategory.IGNORED, |
| 47 | + use_case=MetricUseCase.NONE, |
| 48 | + sample_level_fn=lambda x: x, # 如何计算一个样本的分数 |
| 49 | + corpus_level_fn=np.mean, # 如何聚合样本指标 |
| 50 | +) |
| 51 | +``` |
| 52 | + |
| 53 | +然后,您需要使用[`~tasks.lighteval_task.LightevalTaskConfig`]定义您的任务。 |
| 54 | +您可以定义有或没有子集的任务。 |
| 55 | +要定义没有子集的任务: |
| 56 | + |
| 57 | +```python |
| 58 | +# 这是如何创建一个简单的任务(如hellaswag),它有一个单一的子集附加到它,并且可能有一个评估。 |
| 59 | +task = LightevalTaskConfig( |
| 60 | + name="myothertask", |
| 61 | + prompt_function=prompt_fn, # 必须在文件中定义或从src/lighteval/tasks/tasks_prompt_formatting.py导入 |
| 62 | + suite=["community"], |
| 63 | + hf_repo="", |
| 64 | + hf_subset="default", |
| 65 | + hf_avail_splits=[], |
| 66 | + evaluation_splits=[], |
| 67 | + few_shots_split=None, |
| 68 | + few_shots_select=None, |
| 69 | + metric=[], # 在Metrics中选择您的指标 |
| 70 | +) |
| 71 | +``` |
| 72 | + |
| 73 | +如果您想创建具有多个子集的任务,请将它们添加到`SAMPLE_SUBSETS`列表中,并为每个子集创建一个任务。 |
| 74 | + |
| 75 | +```python |
| 76 | +SAMPLE_SUBSETS = [] # 用于此评估的所有子集列表 |
| 77 | + |
| 78 | + |
| 79 | +class CustomSubsetTask(LightevalTaskConfig): |
| 80 | + def __init__( |
| 81 | + self, |
| 82 | + name, |
| 83 | + hf_subset, |
| 84 | + ): |
| 85 | + super().__init__( |
| 86 | + name=name, |
| 87 | + hf_subset=hf_subset, |
| 88 | + prompt_function=prompt_fn, # 必须在文件中定义或从src/lighteval/tasks/tasks_prompt_formatting.py导入 |
| 89 | + hf_repo="", |
| 90 | + metric=[custom_metric], # 在Metrics中选择您的指标或使用您的custom_metric |
| 91 | + hf_avail_splits=[], |
| 92 | + evaluation_splits=[], |
| 93 | + few_shots_split=None, |
| 94 | + few_shots_select=None, |
| 95 | + suite=["community"], |
| 96 | + generation_size=-1, |
| 97 | + stop_sequence=None, |
| 98 | + ) |
| 99 | +SUBSET_TASKS = [CustomSubsetTask(name=f"mytask:{subset}", hf_subset=subset) for subset in SAMPLE_SUBSETS] |
| 100 | +``` |
| 101 | + |
| 102 | +以下是参数及其含义的列表: |
| 103 | + |
| 104 | +- `name` (str),您的评估名称 |
| 105 | +- `suite` (list),您的评估应该属于的套件。此字段允许我们比较不同的任务实现,并用作任务选择以区分要启动的版本。目前,您会找到关键词["helm", "bigbench", "original", "lighteval", "community", "custom"];对于核心评估,请选择`lighteval`。 |
| 106 | +- `prompt_function` (Callable),您在上面步骤中定义的提示函数 |
| 107 | +- `hf_repo` (str),hub上您的评估数据集的路径 |
| 108 | +- `hf_subset` (str),您想用于评估的特定子集(注意:当数据集没有子集时,请用`"default"`填充此字段,而不是用`None`或`""`) |
| 109 | +- `hf_avail_splits` (list),您的数据集可用的所有分割(训练、验证、测试、其他...) |
| 110 | +- `evaluation_splits` (list),您想用于评估的分割 |
| 111 | +- `few_shots_split` (str,可以为`null`),您想从中选择样本作为少量样本示例的特定分割。它应该与`evaluation_splits`中包含的集合不同 |
| 112 | +- `few_shots_select` (str,可以为`null`),您将用来为少量样本示例选择项目的方法。可以为`null`,或以下之一: |
| 113 | + - `balanced` 从`few_shots_split`中选择带有平衡标签的示例,以避免将少量样本示例(因此是模型生成)偏向特定标签 |
| 114 | + - `random` 从`few_shots_split`中随机选择示例 |
| 115 | + - `random_sampling` 为每个新项目从`few_shots_split`中随机选择新示例,但如果采样项等于当前项,则从可用样本中删除 |
| 116 | + - `random_sampling_from_train` 为每个新项目从`few_shots_split`中随机选择新示例,但如果采样项等于当前项,则保留!仅在您知道自己在做什么时使用此选项。 |
| 117 | + - `sequential` 选择`few_shots_split`的前`n`个示例 |
| 118 | +- `generation_size` (int),生成评估允许的最大令牌数。如果您的评估是对数似然评估(多选),此值应为-1 |
| 119 | +- `stop_sequence` (list),作为生成的句子结束标记的字符串列表 |
| 120 | +- `metric` (list),您想用于评估的指标(有关详细说明,请参见下一节) |
| 121 | +- `trust_dataset` (bool),如果您信任数据集,则设置为True |
| 122 | + |
| 123 | + |
| 124 | +然后,您需要将您的任务添加到`TASKS_TABLE`列表中。 |
| 125 | + |
| 126 | +```python |
| 127 | +# 存储您的评估 |
| 128 | + |
| 129 | +# 带有子集的任务: |
| 130 | +TASKS_TABLE = SUBSET_TASKS |
| 131 | + |
| 132 | +# 不带子集的任务: |
| 133 | +# TASKS_TABLE = [task] |
| 134 | +``` |
| 135 | + |
| 136 | +创建文件后,您可以使用以下命令运行评估: |
| 137 | + |
| 138 | +```bash |
| 139 | +lighteval accelerate \ |
| 140 | + "model_name=HuggingFaceH4/zephyr-7b-beta" \ |
| 141 | + "community|{custom_task}|{fewshots}|{truncate_few_shot}" \ |
| 142 | + --custom-tasks {path_to_your_custom_task_file} |
| 143 | +``` |
0 commit comments