Hub documentation
Distilabel
Distilabel
Distilabel 是一个用于合成数据和 AI 反馈的框架,专为需要基于经过验证的研究论文构建快速、可靠且可扩展的流水线的工程师而设计。
Distilabel 可用于为多种项目生成合成数据和 AI 反馈,包括传统的预测性 NLP(分类、抽取等),以及生成式和大语言模型场景(指令遵循、对话生成、评判等)。Distilabel 的编程化方法允许你构建可扩展的数据生成和 AI 反馈流水线。distilabel 的目标是通过基于经过验证的研究方法快速生成高质量、多样化的数据集,来加速你的 AI 开发,这些方法用于生成和评判 AI 反馈。
人们使用 distilabel 构建什么?
Argilla 社区使用 distilabel 创建出色的数据集和模型。
- 1M OpenHermesPreference 是一个包含约 100 万条 AI 偏好数据的数据集,这些数据是使用 teknium/OpenHermes-2.5 大语言模型生成的。它是一个很好的示例,展示了如何使用 distilabel 来扩展并提升数据集的开发效率。
- 用于微调改进版 OpenHermes 模型的distilabeled Intel Orca DPO 数据集。该数据集通过结合 Argilla 中的人工筛选与 distilabel 提供的 AI 反馈构建而成,从而生成了 Intel Orca 数据集的改进版本,并在性能上超越了基于原始数据集微调的模型。
- haiku DPO 数据是一个示例,展示了任何人都可以为特定任务创建合成数据集,经过筛选和评估后,可用于微调自定义 LLM。
先决条件
hf auth login
请确保已安装distilabel:
pip install -U distilabel[vllm]
Distilabel 流水线
Distilabel 流水线可以由任意数量的相互连接的步骤或任务构建。一个步骤或任务的输出会作为另一个步骤或任务的输入。可以将一系列步骤串联起来,以构建使用 LLM 的复杂数据处理和生成流水线。每个步骤的输入是一个数据批次,其中包含一个字典列表,每个字典代表数据集的一行,键为列名。为了从 Hugging Face hub 读取和写入数据,我们定义了 Distiset 类,作为 datasets.DatasetDict 的抽象。
作为数据集对象的 Distiset
distilabel 中的 Pipeline 会返回一种特殊的 Hugging Face datasets.DatasetDict 类型,称为 Distiset。
Pipeline 可以在 Distiset 中输出多个子集,Distiset 是一个类似字典的对象,每个子集对应一个条目。随后,Distiset 可以无缝推送到 Hugging Face Hub,所有子集都位于同一个仓库中。
从 Hub 加载数据到 Distiset
为了展示从 Hub 加载数据的示例,我们将复现 Prometheus 2 论文,并使用 distilabel 中实现的 PrometheusEval 任务。Prometheus 2 和 Prometheuseval 任务分别是直接评估和成对排序任务,即针对给定指令(无论是否提供参考答案)评估单个独立响应的质量,以及针对给定指令(无论是否提供参考答案)将一个响应与另一个响应进行质量对比。我们将使用这些任务处理一个从 Hub 加载的数据集,该数据集由 Hugging Face H4 团队创建,名为 HuggingFaceH4/instruction-dataset。
from distilabel.llms import vLLM
from distilabel.pipeline import Pipeline
from distilabel.steps import KeepColumns, LoadDataFromHub
from distilabel.steps.tasks import PrometheusEval
if __name__ == "__main__":
with Pipeline(name="prometheus") as pipeline:
load_dataset = LoadDataFromHub(
name="load_dataset",
repo_id="HuggingFaceH4/instruction-dataset",
split="test",
output_mappings={"prompt": "instruction", "completion": "generation"},
)
task = PrometheusEval(
name="task",
llm=vLLM(
model="prometheus-eval/prometheus-7b-v2.0",
chat_template="[INST] {{ messages[0]['content'] }}\n{{ messages[1]['content'] }}[/INST]",
),
mode="absolute",
rubric="factual-validity",
reference=False,
num_generations=1,
group_generations=False,
)
keep_columns = KeepColumns(
name="keep_columns",
columns=["instruction", "generation", "feedback", "result", "model_name"],
)
load_dataset >> task >> keep_columns然后,我们需要使用运行时参数调用 pipeline.run,以便启动 pipeline 并将数据存储到 Distiset 对象中。
distiset = pipeline.run(
parameters={
task.name: {
"llm": {
"generation_kwargs": {
"max_new_tokens": 1024,
"temperature": 0.7,
},
},
},
},
)将 distilabel Distiset 推送到 Hub
将 Distiset 推送到 Hugging Face 仓库,其中每个子集对应一个不同的配置:
distiset.push_to_hub(
"my-org/my-dataset",
commit_message="Initial commit",
private=False,
token=os.getenv("HF_TOKEN"),
)