Cosmopedia:如何为 LLM 预训练构建大规模合成数据
Cosmopedia: how to create large-scale synthetic data for pre-training Large Language Models
Hugging Face 发布 Cosmopedia,一个由 Mixtral-8x7B-Instruct-v0.1 生成的合成数据集,包含超 3000 万个文件和 250 亿 token,目标是复现 Phi-1.5 的训练数据。
Hugging Face 公开了复现 Phi 合成预训练数据的完整流程、数据集与 1B 模型,读者可据此理解大规模合成数据的提示词设计与工程细节。
在这篇博文中,我们概述了生成数十亿token的合成数据集以复现 Phi-1.5所涉及的挑战与解决方案,这一过程最终促成了 Cosmopedia的诞生。合成数据已成为机器学习领域的核心议题,它指的是通过大型语言模型(LLMs)等人工生成的数据,用以模拟真实世界数据。
传统上,为监督式微调和指令调优创建数据集需要耗费高昂且耗时的人力标注过程。这种做法需要大量资源,限制了此类数据集的发展,仅少数业内关键参与者能涉足。然而,近期情况已有所改变。我们见证了数百个高质量的合成微调数据集的出现,主要利用GPT-3.5和GPT-4生成。社区也通过大量出版物支持这一进展,这些出版物指导了跨领域流程并应对相关挑战[1][2][3][4][5]。

图1. HF Mirror中心带有合成标签的数据集。
然而,本篇并非又一篇关于生成合成指令调优数据集的博客文章,这一主题社区已广泛探索。我们专注于从几千个样本扩展到可用于从头预训练LLM的数百万样本,这带来了一系列独特的挑战。
为何选择Cosmopedia?
微软通过其Phi系列模型[6][7][8]推动了这一领域的发展,这些模型主要基于合成数据训练,超越了在网页数据集上长时间训练的更大模型。Phi-2在过去一个月内下载量超过61.7万次,是HF Mirror中心最受欢迎的20个模型之一。
尽管Phi系列模型的技术报告,如“教科书即一切”论文,揭示了模型卓越的性能和创造过程,但它们在合成训练数据集的策展方面留下了大量细节未提及。此外,这些数据集本身并未公开。这引发了爱好者和怀疑者之间的争论。一些人对模型的能力表示赞赏,而批评者则认为它们可能只是过度拟合了基准测试;甚至有人将基于合成数据预训练模型的方法称为“垃圾进,垃圾出”。然而,完全控制数据生成过程并复现Phi模型高性能的想法引人入胜,值得探索。
这就是开发Cosmopedia的动机,旨在复现Phi-1.5的训练数据。本文中,我们将分享初步发现,并讨论改进当前数据集的一些计划。我们深入探讨创建数据集的方法论,详细介绍提示策展方法和技术堆栈。Cosmopedia完全开放:我们发布了端到端流程的代码、数据集,以及基于其训练的10亿参数模型cosmo-1b。这使得社区能够复现结果并在其基础上继续发展。
Cosmopedia创建背后的故事
除了缺乏关于 Phi 数据集创建的信息外,另一个缺点是他们使用专有模型来生成数据。为了解决这些不足,我们推出了 Cosmopedia,这是一个由 Mixtral-8x7B-Instruct-v0.1 生成的合成教科书、博客文章、故事、帖子和 WikiHow 文章的数据集。它包含超过 3000 万个文件和 250 亿个 token,是迄今为止最大的开放合成数据集。
注意:如果你期待的是关于在数百块 H100 GPU 上部署大规模生成任务的故事,实际上 Cosmopedia 的大部分时间都花在了细致的提示工程上。
提示词整理
生成合成数据看似简单,但在扩大规模时,保持多样性——这对最佳性能至关重要——会变得极具挑战性。因此,精心策划覆盖广泛主题并尽量减少重复输出的多样化提示词至关重要,因为我们不想把计算资源花在生成数十亿本教科书上,结果却因为彼此过于相似而丢弃大部分。在数百块 GPU 上启动生成之前,我们花了大量时间使用 HuggingChat 等工具反复迭代提示词。在本节中,我们将介绍为 Cosmopedia 创建超过 3000 万个提示词的过程,涵盖数百个主题,并将重复内容控制在 1% 以下。
Cosmopedia 旨在生成大量高质量、主题覆盖广泛的合成数据。根据 Phi-1.5 的技术报告,作者策划了 20,000 个主题来生成 200 亿 token 的合成教科书,同时使用来自网络数据集的样本以增加多样性,并指出:
我们精心挑选了 20K 个主题来为这一新合成数据的生成提供种子。在生成提示词中,我们使用来自网络数据集的样本以增加多样性。
假设平均文件长度为 1000 个 token,这意味着使用了大约 2000 万个不同的提示词。然而,将主题与网络样本结合以增加多样性的方法仍然不清楚。
我们结合两种方法来构建 Cosmopedia 的提示词:以策划来源为条件和以网络数据为条件。我们将所依据的数据来源称为“种子数据”。

图 2. 构建 Cosmopedia 提示词的数据来源分布(左图)以及策划来源类别内部的来源分布(右图)。
策划来源
我们使用来自知名教育资源的主题,如斯坦福课程、可汗学院、OpenStax 和 WikiHow。这些资源涵盖了许多对 LLM 学习有价值的主题。例如,我们提取了各种斯坦福课程的纲要,并构建提示词,要求模型为这些课程中的各个单元生成教科书。图 3 展示了这样一个提示词的示例。
尽管这种方法能产出高质量的内容,但其主要局限在于可扩展性。我们受限于每个来源中可用资源和主题的数量。例如,我们只能从 OpenStax 中提取 16,000 个独特单元,从斯坦福中提取 250,000 个。考虑到我们生成 200 亿 token 的目标,我们至少需要 2000 万个提示词!
利用受众和风格的多样性
增加生成样本多样性的一种策略是利用受众和风格的多样性:同一个主题可以通过改变目标受众(例如,幼儿 vs. 大学生)和生成风格(例如,学术教科书 vs. 博客文章)来多次重新利用。然而,我们发现,仅仅将提示从“为大学生写一个关于‘为什么要去太空?’的教科书详细课程单元”修改为“写一篇关于‘为什么要去太空?’的详细博客文章”或“为幼儿写一本关于‘为什么要去太空?’的教科书”,并不足以防止高比例的重复内容。为了缓解这一问题,我们强调了受众和风格的变化,提供了关于格式和内容应如何不同的具体说明。
图 3 展示了我们如何针对不同受众调整基于同一主题的提示。

图 3. 为幼儿、专业人士和研究人员以及高中生生成同一本教科书的提示。
通过针对四种不同的受众(幼儿、高中生、大学生、研究人员)并利用三种生成风格(教科书、博客文章、wikiHow 文章),我们最多可以获得 12 倍数量的提示。然而,我们可能想要包含这些资源中未涵盖的其他主题,而且这些来源的体量很小,仍然限制了这种方法,并且距离我们目标的 2000 多万条提示还很远。这时网络数据就派上了用场;如果我们生成涵盖所有网络主题的教科书会怎样?在下一节中,我们将解释我们如何选择主题并使用网络数据来构建数百万条提示。
网络数据
使用网络数据构建提示被证明是最具可扩展性的,贡献了 Cosmopedia 中使用的超过 80% 的提示。我们使用像 RefinedWeb 这样的数据集,将数百万个网络样本聚类为 145 个簇,并通过提供 10 个随机样本的摘录并要求 Mixtral 找出它们的共同主题来识别每个簇的主题。有关此聚类的更多详细信息,请参见技术栈部分。
我们检查了这些簇,并排除了任何被认为教育价值较低的内容。被移除内容的例子包括露骨成人材料、名人八卦和讣告。保留的 112 个主题以及被移除主题的完整列表可在此处找到。
然后,我们通过指示模型根据聚类生成与其所属主题范围内的某个网络样本相关的教科书来构建提示。图 4 提供了一个基于网络的提示示例。为了增强多样性并考虑到主题标注中可能存在的任何不完整之处,我们仅在 50% 的情况下以主题为条件,并如前一节所述更改受众和生成风格。我们最终使用这种方法构建了 2300 万条提示。图 5 显示了 Cosmopedia 中种子数据、生成格式和受众的最终分布。

图 4. 网络摘录及关联提示的示例。

图 5. Cosmopedia 数据集中种子数据、生成格式和目标受众的分布。
除了随机网络文件外,我们还使用了 AutoMathText 中的样本,这是一个精心整理的数学文本数据集,目标是包含更多科学内容。
指令数据集和故事
在我们对使用生成的教科书训练的模型进行初步评估时,我们发现模型缺乏小学教育典型的常识和基础知识。为了解决这个问题,我们利用 UltraChat 和 OpenHermes2.5 指令微调数据集中的文本作为提示的种子数据,创作了融入日常知识和基本常识的故事。这些数据集涵盖广泛的主题。例如,我们从 UltraChat 中使用了“关于世界的问题”子集,它涵盖了关于世界的 30 个元概念。对于另一个多样化且高质量的指令微调数据集 OpenHermes2.5,我们省略了不适合故事创作的来源和类别,例如用于编程的 glaive-code-assist 和用于高级化学的 camelai。图 6 展示了我们用于生成这些故事的提示示例。

图 6. 用于从 UltraChat 和 OpenHermes 样本生成面向幼儿、普通受众和 reddit 论坛的故事的提示。
这就是我们构建 3000 多万个多样化提示、提供重复内容极少的提示工程故事。下图展示了 Cosmopedia 中存在的聚类,该分布与网络数据中的聚类相似。你还可以在这里找到来自 Nomic 的可点击地图。

图 7. Cosmopedia 的聚类,使用 Mixtral 进行标注。
你可以使用数据集查看器自行调查该数据集:

图 8. Cosmopedia 的数据集查看器。
技术栈
我们在以下位置发布了用于构建 Cosmopedia 的所有代码:https://github.com/huggingface/cosmopedia
在本节中,我们将重点介绍用于文本聚类、大规模文本生成以及训练 cosmo-1b 模型的技术栈。
主题聚类
我们使用 text-clustering 代码库为 Cosmopedia 提示中使用的网络数据实现了主题聚类。下图展示了查找和标注聚类的流程。我们还在标注步骤中要求 Mixtral 为聚类给出满分 10 分的教育评分;这有助于我们在主题检查步骤中的工作。你可以在这个演示中找到网络聚类及其评分的演示。

图 9. text-clustering 的流程。
大规模教科书生成
我们利用 llm-swarm 库,使用 Mixtral-8x7B-Instruct-v0.1 生成了 250 亿个 token 的合成内容。这是一个可扩展的合成数据生成工具,使用本地 LLM 或 HF Mirror Hub 上的推理端点。它支持 TGI 和 vLLM 推理库。我们在 HF Mirror Science 集群的 H100 GPU 上使用 TGI 本地部署了 Mixtral-8x7B。生成 Cosmopedia 的总计算时间超过 1 万 GPU 小时。
以下是在 Slurm 集群上使用 2 个 TGI 实例对 10 万个 Cosmopedia 提示运行 Mixtral 生成的示例:
# clone the repo and follow installation requirements
cd llm-swarm
python ./examples/textbooks/generate_synthetic_textbooks.py \
--model mistralai/Mixtral-8x7B-Instruct-v0.1 \
--instances 2 \
--prompts_dataset "HuggingFaceTB/cosmopedia-100k" \
--prompt_column prompt \
--max_samples -1 \
--checkpoint_path "./tests_data" \
--repo_id "HuggingFaceTB/generations_cosmopedia_100k" \
--checkpoint_interval 500
你甚至可以使用 wandb 跟踪生成过程,以监控吞吐量和生成的 token 数量。

图 10. llm-swarm 运行的 Wandb 图表。
注意:
我们使用 HuggingChat 进行提示词的初始迭代。然后,我们使用llm-swarm为每个提示词生成几百个样本,以发现不寻常的模式。例如,模型为教科书使用了非常相似的开场短语,并且经常以相同的短语开始故事,如“从前”和“太阳低垂在天边”。明确要求模型避免这些开场陈述并具有创造性解决了这个问题;它们仍然被使用,但频率降低了。
基准去污染
鉴于我们生成合成数据,种子样本或模型训练数据中存在基准污染的可能性。为了解决这个问题,我们实施了一个去污染流水线,以确保我们的数据集不包含任何来自测试基准的样本。
与 Phi-1 类似,我们使用 10-gram 重叠来识别可能受污染的样本。在检索到候选样本后,我们使用difflib.SequenceMatcher将数据集样本与基准样本进行比较。如果len(matched_substrings)与len(benchmark_sample)的比率超过 0.5,我们就丢弃该样本。这个去污染过程应用于使用 Cosmo-1B 模型评估的所有基准,包括 MMLU、HellaSwag、PIQA、SIQA、Winogrande、OpenBookQA、ARC-Easy 和 ARC-Challenge。
我们报告从每个数据集划分中移除的受污染样本数量,以及它们对应的唯一基准样本数量(括号内):
| 数据集组 | ARC | BoolQ | HellaSwag | PIQA |
|---|---|---|---|---|
| web data + stanford + openstax | 49 (16) | 386 (41) | 6 (5) | 5 (3) |
| auto_math_text + khanacademy | 17 (6) | 34 (7) | 1 (1) | 0 (0) |
| 故事 | 53 (32) | 27 (21) | 3 (3) | 6 (4) |
我们发现 MMLU、OpenBookQA 和 WinoGrande 的受污染样本少于 4 个。
训练栈
我们在 Cosmopedia 上使用 Llama2 架构训练了一个 1B LLM 来评估其质量:https://hf-mirror.com/HuggingFaceTB/cosmo-1b。
我们使用datatrove库进行数据去重和分词,使用nanotron进行模型训练,使用lighteval进行评估。
该模型在 ARC-easy、ARC-challenge、OpenBookQA 和 MMLU 上表现优于 TinyLlama 1.1B,在 ARC-challenge 和 OpenBookQA 上与 Qwen-1.5-1B 相当。然而,我们注意到与 Phi-1.5 相比存在一些性能差距,这表明更好的合成生成质量,这可能与用于生成的 LLM、主题覆盖范围或提示词有关。

图 10. Cosmo-1B 的评估结果。
结论与下一步
在这篇博客文章中,我们概述了创建 Cosmopedia 的方法,这是一个用于预训练模型的大型合成数据集,旨在复现 Phi 数据集。我们强调了精心制作提示词以覆盖广泛主题的重要性,确保生成多样化的内容。此外,我们分享并开源了我们的技术栈,这使得生成过程能够扩展到数百个 GPU。
不过,这仅仅是 Cosmopedia 的初始版本,我们正在积极努力提升所生成内容的质量。生成内容的准确性和可靠性在很大程度上取决于生成过程中使用的模型。具体而言,Mixtral 有时可能会产生幻觉并生成错误信息,例如在 AutoMathText 和 KhanAcademy 子集中的历史事实或数学推理方面。缓解幻觉问题的一种策略是使用检索增强生成(RAG)。这涉及检索与种子样本相关的信息,例如从维基百科中获取,并将其融入到上下文中。幻觉测量方法也可以帮助评估哪些主题或领域最容易受到影响 [9]。将 Mixtral 的生成结果与其他开源模型进行比较也会很有趣。
合成数据的潜力巨大,我们期待看到社区在 Cosmopedia 基础上构建出什么。
参考文献
[1] Ding 等。《通过扩展高质量指令对话增强聊天语言模型》。网址 https://arxiv.org/abs/2305.14233
[2] Wei 等。《Magicoder:源代码就是一切》。网址 https://arxiv.org/abs/2312.02120
[3] Toshniwal 等。《OpenMathInstruct-1:一个 180 万数学指令调优数据集》。网址 https://arxiv.org/abs/2402.10176
[4] Xu 等。《WizardLM:赋能大型语言模型遵循复杂指令》。网址 https://arxiv.org/abs/2304.12244
[5] Moritz Laurer。《合成数据:利用开源节省金钱、时间和碳排放》。网址 https://hf-mirror.com/blog/synthetic-data-save-cost
[6] Gunasekar 等。《教科书就是你所需要的》。网址 https://arxiv.org/abs/2306.11644
[7] Li 等。《教科书就是你所需要的 II:phi-1.5 技术报告》。网址 https://arxiv.org/abs/2309.05463
[8] Phi-2 博客文章。网址 https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/
[9] Manakul, Potsawee and Liusie, Adian and Gales, Mark JF。《Selfcheckgpt:面向生成式大型语言模型的零资源黑盒幻觉检测》。网址 https://arxiv.org/abs/2303.08896
来源:Hugging Face Blog · hf-mirror.com