AI 数据集生成和模型微调框架 Distilabel 高级指南:深度功能与最佳实践
系列文章:
AI 数据集生成和模型微调框架 Distilabel 入门指南:基本概念、安装与快速开始
AI 数据集生成和模型微调框架 Distilabel 基础指南:概念与入门(一)
AI 数据集生成和模型微调框架 Distilabel 基础指南:概念与入门(二)
AI 数据集生成和模型微调框架 Distilabel 实践: Pipeline实现原理解读
AI 数据集生成和模型微调框架 Distilabel 高级指南:深度功能与最佳实践
正文:
前面的文章介绍了 Distilabel 的基本概念以及核心的 Pipeline 实现原理。本文会介绍 Distilabel 中的一些深度使用概念和功能,并介绍一些最佳实践的教程。
使用 Distiset 数据集对象
在 Distilabel 中,Pipeline 会返回一个特殊类型的 Hugging Face datasets.DatasetDict
,它被称为 Distiset。
Distiset 是一个类似字典的对象,包含了由 Pipeline 生成的不同配置,每个配置对应 Pipeline 中 DAG(有向无环图)中每个叶节点的步骤。每个配置对应数据集的一个子集。这一概念借鉴了 datasets 的理念,允许你在同一个仓库内上传相同数据集的不同配置,每个配置可以包含不同的列(即不同的配置),并可以无缝推送到 Hugging Face Hub。
下面是如何创建一个类似 datasets.DatasetDict
的 Distiset 对象的示例:
from datasets import Dataset
from distilabel.distiset import Distisetdistiset = Distiset({"leaf_step_1": Dataset.from_dict({"instruction": [1, 2, 3]}),"leaf_step_2": Dataset.from_dict({"instruction": [1, 2, 3, 4], "generation": [5, 6, 7, 8]}),}
)
注意事项:如果只有一个叶节点,即 Pipeline 的最后一步,配置名称不会是最后一步的名称,而是设置为 "default",因为这与 Hugging Face Hub 上的标准数据集更一致。
Distiset 方法
我们可以与 Pipeline 生成的不同部分进行交互,并将它们视为不同的配置。Distiset 只有两个方法:
1. 训练/测试集拆分
为不同的配置或子集创建训练/测试拆分。
>>> distiset.train_test_split(train_size=0.9)
Distiset({leaf_step_1: DatasetDict({train: Dataset({features: ['instruction'],num_rows: 2})test: Dataset({features: ['instruction'],num_rows: 1})})leaf_step_2: DatasetDict({train: Dataset({features: ['instruction', 'generation'],num_rows: 3})test: Dataset({features: ['instruction', 'generation'],num_rows: 1})})
})
2. 推送到 Hugging Face Hub
将 Distiset 推送到 Hugging Face 仓库,每个子集对应不同的配置:
distiset.push_to_hub("my-org/my-dataset",commit_message="Initial commit",private=False,token=os.getenv("HF_TOKEN"),generate_card=True,include_script=False
)
注意:从版本 1.3.0 起,你可以自动将创建 Pipeline 的脚本推送到同一个仓库。例如,假设你有一个文件如下:
# sample_pipe.pywith Pipeline() as pipe:...
distiset = pipe.run()
distiset.push_to_hub("my-org/my-dataset",include_script=True
)
执行该命令后,你可以访问该仓库, sample_pipe.py
文件将被存储,方便与社区分享你的 Pipeline。
1)自定义 Docstring
Distilabel 包含一个自定义插件,可自动为不同组件生成一个展示集。信息通过解析步骤的 docstring 提取。你可以查看 UltraFeedback 源代码中的 docstring,并在组件展示集中查看相应的条目,了解 docstring 的渲染方式。
如果你创建了自己的组件,并希望引用在 README 卡片中自动呈现(如果你打算将最终的 Distiset 分享到 Hugging Face Hub),你可能需要添加Citations
部分。例如:
class MagpieGenerator(GeneratorTask, MagpieBase):r"""Generator task the generates instructions or conversations using Magpie....Citations:```@misc{xu2024magpiealignmentdatasynthesis,title={Magpie: Alignment Data Synthesis from Scratch by Prompting Aligned LLMs with Nothing},author={Zhangchen Xu and Fengqing Jiang and Luyao Niu and Yuntian Deng and Radha Poovendran and Yejin Choi and Bill Yuchen Lin},year={2024},eprint={2406.08464},archivePrefix={arXiv},primaryClass={cs.CL},url={https://arxiv.org/abs/2406.08464},}```"""
Citations
可以包含任意数量的 bibtex 引用。你可以根据需要添加多个元素,每个Citation
都会是 @misc{...}
的形式。这些信息将自动在 README 中使用,特别是当你调用 distiset.push_to_hub
时。如果找不到Citations
,但在参考文献中找到指向 https://arxiv.org/ 的 URL,系统会自动尝试获取 Bibtex 等价项。
2)图像数据集
如果你对图像数据集感兴趣,Distiset 对象有一个新方法 transform_columns_to_image
,专门用于在将数据集推送到 Hugging Face Hub 之前,将图像转换为 PIL.Image.Image
对象。
从版本 1.5.0 起,新增了 ImageGeneration 任务,能够从文本生成图像。默认情况下,所有的过程将使用图像的字符串表示形式,但为了充分利用 Hugging Face Hub 的功能,如果数据集将存储在 Hub 上,建议使用适当的图像对象。例如,以下是一个提取自 "examples/image_generation.py" 的Pipeline:
with Pipeline(name="image_generation_pipeline") as pipeline:img_generation = ImageGeneration(name="flux_schnell",llm=igm,InferenceEndpointsImageGeneration(model_id="black-forest-labs/FLUX.1-schnell"))...if __name__ == "__main__":distiset = pipeline.run(use_cache=False, dataset=ds)distiset = distiset.transform_columns_to_image("image")distiset.push_to_hub(...)
3. 从磁盘保存和加载
这些方法与 datasets.load_from_disk
和 datasets.Dataset.save_to_disk
相同,因此参数直接传递给这些方法。你可以使用 storage_options
参数将 Distiset 保存在云提供商中,包括 distilabel 工件(如 pipeline.yaml
、pipeline.log
和 README.md)。
1)保存到磁盘
distiset.save_to_disk("my-dataset",save_card=True,save_pipeline_config=True,save_pipeline_log=True
)
2)从本地磁盘加载
以相同的方式加载使用Distiset.save_to_disk保存的Distiset: