系列文章:
Distilabel 入门指南:基本概念、安装与快速上手
Distilabel 基础指南:概念与入门
Distilabel 高级指南:深度功能与最佳实践
Distilabel API 文档:功能详解与使用
正文:
概述
Distilabel 是一个 AI 反馈框架,既可以生成数据集,也可以使用大语言模型(LLMs)对数据集进行标注。特别适用于基于验证过的研究论文快速构建可靠且可扩展的数据流水线(Pipeline)。它支持广泛的应用场景,包括传统的自然语言处理任务(如分类、信息抽取)以及生成式 AI 和大语言模型(LLM)任务(如指令跟随、对话生成等)。Distilabel 采用编程式方法,帮助用户高效构建数据生成和 AI 反馈流水线(Pipeline),从而加速 AI 开发进程并提升数据质量。
从上面的工作流程来看,让我们分解一下不同的步骤:
任务(Task): 任务是一个类,定义了大语言模型(LLM)的输入和输出参数,以及用于生成数据集的提示(prompt)。它还负责解析 LLM 的输出,并返回一个包含输出参数及其相应值的字典。
大语言模型(LLMs): LLM 是用于生成数据集的模型。它们被定义为实现 generate
方法的类,该方法接收提示并返回生成的输出。LLM 还为一些流行的框架/引擎提供了包装器,例如 transformers、Inference Endpoints、vLLM、llama.cpp 等。
流水线(Pipeline):Pipeline是一个类,负责协调提供的数据集的生成、标注或两者结合的过程。它负责生成提示、生成数据集、标注数据集,最后返回标注后的数据集。它实现了一些优化机制,以确保在任何步骤中都不会出错,追求稳健性,因为大语言模型(LLM)并不总是能够生成预期的输出。
Distilabel 的目标是帮助用户通过快速的迭代与基于研究论文的方法提升 AI 开发效率。通过灵活、可扩展和容错的数据合成与评估机制,Distilabel 能够满足大规模 AI 项目的需求。目前已经有的一些实例包括:
- Argilla社区使用distilabel创建了令人惊叹的数据集(Hugging Face – The AI community building the future.)和模型(Models - Hugging Face)。
- 1M OpenHermesPreference(argilla/OpenHermesPreferences · Datasets at Hugging Face)是一个包含约100万个AI偏好的数据集,这些偏好来自teknium/OpenHermes-2.5。它展示了我们如何使用Distilabel来大规模地合成数据。
- distilabeled Intel Orca DPO dataset(argilla/distilabel-intel-orca-dpo-pairs · Datasets at Hugging Face)和改进的OpenHermes模型(argilla/distilabeled-OpenHermes-2.5-Mistral-7B · Hugging Face)展示了使用Distilabel 如何通过人工智能反馈过滤掉50%的原始数据集来提高模型性能。
- haiku DPO data概述了任何人如何为特定任务创建数据集,以及提高数据集质量的最新研究论文。
这些实际案例展示了 Distilabel 在大规模数据合成和 AI 反馈生成方面的强大能力,进一步证明了它在提升数据集质量和 AI 模型性能方面的重要作用。
安装指南
安装基本功能
项目地址:argilla-io/distilabel: Distilabel is a framework for synthetic data and AI feedback for engineers who need fast, reliable and scalable pipelines based on verified research papers.
前置条件:需要安装 Python 3.9 及以上版本,最高支持 Python 3.12,但对于 Python 3.12 的支持仍在开发中。
安装最新发布版本(PyPI),需要运行以下命令安装 PyPI 上的最新稳定版本:
pip install distilabel --upgrade
如果想安装最新的未发布版本(直接从源码安装),可以运行以下命令:
pip install "distilabel @ git+https://github.com/argilla-io/distilabel.git@develop" --upgrade
注意: 这里安装的是develop
分支,因为这个分支包含了所有即将发布的新功能、Bug 修复和改进。如果你想安装其他特定分支,可以将develop
替换为对应的分支名称。
额外扩展功能(Extras)
除了基础功能外,distilabel 还提供了一些额外的依赖,主要用于支持不同的 LLM(大模型)集成。以下是可选扩展功能列表:
1. LLM 支持
- anthropic:通过 AnthropicLLM 集成 Anthropic API 的模型。
- argilla:支持将生成的数据集导出到 Argilla。
- cohere:通过 CohereLLM 集成 Cohere API 的模型。
- groq:通过 GroqLLM 集成 Groq API(使用 groq Python 客户端)。
- hf-inference-endpoints:通过 InferenceEndpointsLLM 集成 Hugging Face Inference Endpoints 的模型。
- hf-transformers:通过 TransformersLLM 集成 Hugging Face transformers 库中的模型。
- litellm:通过 LiteLLM 以 OpenAI API 格式调用任意 LLM。
- llama-cpp:通过 LlamaCppLLM 使用 llama-cpp-python 绑定 llama.cpp。
- mistralai:通过 MistralAILLM 集成 Mistral AI API 的模型。
- ollama:通过 OllamaLLM 集成 Ollama 及其提供的模型。
- openai:通过 OpenAILLM 集成 OpenAI API 提供的模型,同时支持 AnyscaleLLM、AzureOpenAILLM、TogetherLLM(基于 OpenAI API 客户端)。
- vertexai:通过 VertexAILLM 集成 Google Vertex AI 专有模型。
- vllm:通过 vLLM 集成 vllm 推理引擎。
- sentence-transformers:使用 sentence-transformers 生成句子嵌入(sentence embeddings)。
- mlx:通过 MlxLLM 集成使用 MLX 模型。
比如安装带有anthropic额外依赖软件包,可以使用如下命令:
pip install distilabel[anthropic] --upgrade
2. 数据处理(Data Processing)
- ray:使用 Ray 进行大规模分布式流水线处理。
- faiss-cpu / faiss-gpu:使用 Faiss 生成句子嵌入(sentence embeddings)。
- minhash:使用 MinHash 进行重复数据检测(基于 datasketch 和 nltk)。
- text-clustering:使用 UMAP 和 Scikit-learn 进行文本聚类(text clustering)。
3. 结构化生成(Structured Generation)
- outlines:使用 Outlines 进行结构化 LLM 生成。
- instructor:使用 Instructor 进行结构化 LLM 生成。
4. 推荐/注意事项
- Mistral AI 依赖 Python 3.9 及以上版本
如果你打算使用distilabel.models.llms.MistralLLM
实现 Mistral AI 模型,则需要确保 Python 版本 >= 3.9。 - 建议安装
flash-attn
加速推理(适用于 GPU)
对于 transformers 和 vllm,如果你使用的是 GPU 加速,建议单独安装 flash-attn,它可以显著加速推理。
由于 flash-attn 不是 distilabel 依赖项的一部分,需要单独安装:
pip install flash-attn --no-build-isolation
- llama-cpp-python 依赖的安装注意事项
如果你希望本地运行 LLM 并使用 llama-cpp-python,请注意其安装过程可能因操作系统(Windows/Linux/Mac)不同而有所不同。
建议先阅读其官方文档的安装部分,以确保正确安装。
快速开始
基本组件介绍
Distilabel 提供了构建可扩展和可靠的合成数据生成和 AI 反馈流水线(Pipeline)所需的所有工具。流水线(Pipeline)用于生成数据、评估模型、操作数据或任何其他常见任务。它们由不同的组件组成:步骤(Steps)、任务(Tasks)和大语言模型(LLMs),这些组件通过有向无环图(DAG)链式连接。
- 步骤(Steps): 这些是流水线(Pipeline)的构建块。普通步骤(Step)用于执行基本操作,如加载数据、应用某些转换或任何其他常见操作。
- 任务(Tasks): 任务(Task)是一种特殊的步骤(Step),它的一个强制参数是 LLM(大语言模型),要使用LLM进行数据生成或者评估。这些是依赖于大语言模型(LLMs)和提示(prompts)来执行生成性任务的步骤(Step),被称为任务(Task),它们可以用于生成数据、评估模型或操作数据。
- 大语言模型(LLMs): 用于执行生成性任务的模型,可以是本地或远程的,开源或商业的。
流水线(Pipeline)设计上具有可扩展性和可靠性,可以以分布式方式执行,并且支持缓存和恢复。这在处理大规模数据集或确保流水线(Pipeline)可复现时非常有用。
此外,流水线(Pipeline)还设计为模块化和灵活的。你可以轻松地向流水线(Pipeline)中添加新的步骤(Steps)、任务(Tasks)或大语言模型(LLMs),也可以轻松地修改或删除它们。
示例运行
例如,构建一个用于生成偏好数据集(dataset of preferences)的流水线可能包含多个步骤和 LLM 任务。如下:
要安装带有 hf-inference-endpoints
额外依赖的最新版本软件包,可以使用以下命令:
pip install distilabel[hf-inference-endpoints] --upgrade
使用通用流水线(Pipeline)
要为机器学习任务使用通用流水线(Pipeline),可以使用 InstructionResponsePipeline
类。该类是一个通用流水线(Pipeline),可用于生成监督微调任务的数据。它使用 InferenceEndpointsLLM
类,根据输入数据和模型生成数据。
from distilabel.pipeline import InstructionResponsePipeline
pipeline = InstructionResponsePipeline()
dataset = pipeline.run()
InstructionResponsePipeline
类将使用 InferenceEndpointsLLM
类,搭配 meta-llama/Meta-Llama-3.1-8B-Instruct
模型,基于系统提示词(system prompt)生成数据。输出数据集包含 instruction
(指令)和 response
(回应)两列。该类默认使用通用系统提示词,但可以通过 system_prompt
参数进行自定义。
注意:目前项目正在积极开发适用于不同任务的流水线(Pipeline)。如果您有任何建议或需求,可以到项目上提交issue!当前正在开发的流水线包括 分类(Classification)、 直接偏好优化(Direct Preference Optimization, DPO)以及 信息检索(Information Retrieval)等任务。
使用自定义流水线(Pipeline)
创建一个简单的流水线(Pipeline),该流水线(Pipeline)使用 InferenceEndpointsLLM
类生成文本。它会处理一个直接通过 Hugging Face datasets
库加载的数据集,并使用 InferenceEndpointsLLM
类在 TextGeneration
(文本生成)任务中生成文本。
在 Hugging Face Model Hub 查看可用模型,并按推理(Inference)状态进行筛选。
from datasets import load_dataset
from distilabel.models import InferenceEndpointsLLM
from distilabel.pipeline import Pipeline
from distilabel.steps.tasks import TextGeneration
with Pipeline() as pipeline:
TextGeneration(
llm=InferenceEndpointsLLM(
model_id="meta-llama/Meta-Llama-3.1-8B-Instruct",
generation_kwargs={"temperature": 0.7, "max_new_tokens": 512},
),
)
if __name__ == "__main__":
dataset = load_dataset("distilabel-internal-testing/instructions", split="test")
distiset = pipeline.run(dataset=dataset)
distiset.push_to_hub(repo_id="distilabel-example")
该流水线(Pipeline)的主要流程如下:
- 通过
load_dataset()
从 Hugging Face 数据集加载测试数据。 - 使用
InferenceEndpointsLLM
进行文本生成,模型为Meta-Llama-3.1-8B-Instruct
,参数包括temperature=0.7
和max_new_tokens=512
。 - 运行流水线,处理数据集。
- 将生成的数据集推送到 Hugging Face Hub(
distilabel-example
),注意,要配置自己的huggingface_hub的repo_id。
通过这种方式,可以轻松自定义流水线并集成 Hugging Face 生态系统的模型和数据集。
到Hugging Face中能查看推上去的数据集:
总结
Distilabel 是一个用于合成和标注数据集的 AI 反馈框架,专为加速 AI 开发和提升数据质量而设计。它通过可扩展的流水线(Pipeline),将大语言模型(LLMs)与任务、步骤和优化机制结合,支持数据生成、模型评估和数据标注。Distilabel 支持多种流行的 LLM 引擎,如transformers 和 vLLM,能够高效处理大规模数据集,并提供灵活的 API,帮助用户掌控数据生成过程,提升 AI 模型的性能和研发效率。
后面会继续介绍Distilabel 的使用指南和详细的API文档。