Hub documentation

Distilabel

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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。

先决条件

首先,使用您的 Hugging Face 账户登录:

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"),
)

📚 资源

Update on GitHub