Distilabel
Distilabel 是一个用于合成数据和 AI 反馈的框架,适用于需要基于经过验证的研究论文的快速、可靠和可扩展管道 的工程师。
Distilabel 可用于生成合成数据和 AI 反馈,用于各种项目,包括传统的预测 NLP(分类、提取等)或生成性和大型语言 模型场景(指令遵循、对话生成、判断等)。Distilabel 的编程方法使您能够构建可扩展的管道数据生成和 AI 反馈。 Distilabel 的目标是通过快速生成基于经过验证的研究方法的高质量、多样化数据集来加速您的 AI 开发,以用于生成和评判 以及 AI 反馈。
人们用 distilabel 建造了什么?
Argilla 社区使用 distilabel 创建了惊人的 数据集 和 模型。
- 1M OpenHermesPreference 是一个包含约 100 万个 AI 偏好的数据集,这些偏好是使用 teknium/OpenHermes-2.5 LLM 生成的。它是如何使用 distilabel 来扩展和增强数据集开发的一个很好的例子。
- distilabeled Intel Orca DPO 数据集 用于微调 改进的 OpenHermes 模型。该数据集是通过在 Argilla 中结合人工整理和 distilabel 的 AI 反馈构建的,从而导致了 Intel Orca 数据集的改进版本,并且超越了在原始数据集上微调的模型。
- haiku DPO 数据 是如何能够为特定任务创建合成数据集的示例,经过整理和评估后,该数据集可用于微调自定义 LLM。
先决条件
huggingface-cli login
确保您已安装 distilabel
pip install -U distilabel[vllm]
Distilabel 管道
Distilabel 管道可以使用任意数量的相互连接的步骤或任务构建。一个步骤或任务的输出作为另一个步骤或任务的输入。 可以将一系列步骤链接在一起以构建具有 LLM 的复杂数据处理和生成管道。每个步骤的输入都是一批数据,包含一个字典列表, 其中每个字典代表数据集的一行,键是列名。为了从 Hugging Face Hub 中提供和接收数据,我们定义了一个 Distiset
类作为 datasets.DatasetDict
的抽象。
Distiset 作为数据集对象
Distilabel 中的管道返回一种特殊的 Hugging Face datasets.DatasetDict
,称为 Distiset
。
管道可以在 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
,以便启动管道并将数据存储在 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"),
)