这篇博文介绍了 SmolLM,这是一个具有 135M、360M 和 1.7B 参数的最先进的小型模型系列,在新的高质量数据集上进行了训练。它涵盖了数据管理、模型评估和使用。
介绍
人们对可以在本地设备上运行的小型语言模型越来越感兴趣。这种趋势涉及蒸馏或量化等技术来压缩大型模型,以及在大型数据集上从头开始训练小型模型。这些方法支持新的应用程序,同时大大降低推理成本并改善用户隐私。
Microsoft 的 Phi 系列、阿里巴巴的 Qwen2(小于 2B)和 Meta 的 MobileLLM 表明,经过深思熟虑的设计和训练,小型模型可以取得令人印象深刻的结果。但是,有关这些模型的数据管理和训练的大多数细节尚未公开。
在这篇博文中,我们很高兴地介绍 SmolLM,这是一系列最先进的小型语言模型,有三种大小:135M、360M 和 1.7B 参数。这些模型建立在精心策划的高质量训练语料库之上,我们将其作为 SmolLM-Corpus 发布。Smollm 语料库包括:
- Cosmopedia v2:由 Mixtral 生成的合成教科书和故事集(28B 代币)
- Python-Edu:来自 The Stack 的教育 Python 示例(4B 令牌)
- FineWeb-Edu(重复数据删除):来自 FineWeb 的教育网络示例(220B 令牌)
我们的评估表明,SmolLM模型在各种基准测试中在其大小类别中优于其他模型,测试了常识推理和世界知识。在这篇博文中,我们将介绍训练语料库中每个子集的策展,然后讨论 SmolLM 模型的训练和评估。
在不同的推理和常识基准上评估 SmolLM 模型。
数据管理
从 Cosmopedia v1 到 v2
Cosmopedia v2 是 Cosmopedia 的增强版本,Cosmopedia 是最大的预训练合成数据集,由 Mixtral-8x7B-Instruct-v0.1 生成的超过 3000 万本教科书、博客文章和故事组成。大多数样本是通过提示模型使用称为“种子样本”的网页生成特定主题的内容而生成的,如图 1 所示。我们使用 Web 示例来增加多样性并扩大提示范围。您可以在这篇博文中找到更多详细信息。
图 1.Cosmopedia 提示示例。
为了改进 v2 中的数据集,我们尝试了两种策略:
- 使用功能更强大的模型和相同的提示
- 优化提示本身
对于第一种策略,我们尝试了 llama3-70B-Instruct、Mixtral-8x22B-Instruct-v0.1 和 Qwen1.5-72B-Chat,但在这些替代方案生成的教科书上训练模型时发现没有显着改进。因此,在本节的其余部分,我们将重点介绍第二种策略:我们如何改进提示。
寻找更好的主题和种子样本
每个提示都有三个主要组件:主题、种子示例和生成样式,用于指定目标受众和我们希望模型生成的内容类型。
为了确保世代一致,我们需要与给定主题密切相关的种子样本。在 Cosmopedia v1 中,我们对 FineWeb 示例运行了聚类分析,以识别主题和相应的 Web 示例,如图 2 所示。此方法有两个主要局限性:
- 主题列表反映了 web/FineWeb 集群,虽然很全面,但可能会限制我们对主题的控制。
- 每个集群中的 Web 样本不会进一步筛选,可能包括一些低质量的样本。
图2.FineWeb 集群。
在 v2 中,我们没有采用这种无监督聚类方法,而是使用 BISAC 图书分类从预定义的 34,000 个主题列表开始,BISAC 图书分类是一种用于按主题对书籍进行分类的标准,既全面又注重教育。我们从属于 51 个类别的 5,000 个主题开始,并要求 Mixtral 为某些主题生成子主题。以下是每个类别中子主题的最终分布:
图3.每个用于提示的顶级类别的主题分布。
定义主题后,我们仍然需要找到与它们相关的网页。就像使用搜索引擎查找特定主题的内容一样,我们实现了一个搜索工具来检索每个主题最相关的页面。我们使用 BISAC 类别及其子主题作为 FineWeb CC-MAIN-2024-10 和 CC-MAIN-2023-50 转储的查询来运行此工具,这些转储总共包含超过 5.2 亿个样本。对于每个查询,我们检索了 1,000 个页面,确保我们只检索到最相关的内容。此处提供了用于部署和运行搜索工具的代码。
因此,我们编译了 34,000 个主题的 3400 万个网页。下一步是确定哪种世代风格效果最好。
图4.主题及其在“医疗”类别中检索到的样本。
生成风格
为了确定最有效的生成方式,我们通过在 Cosmopedia v1 不同子集的 8B 代币上训练 1.8B 模型来进行消融研究。对于新生成的数据,我们只生成了 2B 令牌并训练了 4 个 epoch 以节省时间(使用 Mixtral 生成 2B 令牌大约需要 1000 个 GPU 小时)。我们使用了与FineWeb消融模型相同的训练和评估设置。我们用两个不同的种子对每个实验进行了两次,并平均了两次运行之间的分数。
我们比较了 Cosmopedia v1 的以下子集的性能:
- 网络教科书子集
- 故事子集
- Stanford & OpenStax 子集
我们发现,与基于网络的教科书相比,基于斯坦福大学和 OpenStax 等精选来源的主题和种子样本的教科书提供了最佳的整体性能,从而获得了 MMLU 和 ARC 基准。故事似乎有助于建立常识基准。在 v2 中实现新主题和种子样本检索方法后,我们能够使用 Web 种子匹配精选源的性能,从而确认新提示的质量。
接下来,我们探讨了哪种受众风格效果最好。我们使用相同的网络教科书提示生成教科书,但针对两个不同的受众:中学生和大学生。我们发现,在主要针对中学生的教科书上训练的模型在除MMLU以外的所有基准测试中都获得了最高分。这可以通过以下事实来解释:其中大多数测试基本常识和初级到中级科学知识,而 MMLU 包含一些需要高级知识和专业知识的问题。
针对不同受众的教科书评估。
针对不同受众的教科书评估。
对于 v2,我们决定为中学生生成 40% 的内容,为大学生生成 30% 的内容,以及 30% 作为其他受众和风格的混合,包括我们从 Cosmopedia v1 借来的子集,例如故事和基于斯坦福课程的教科书。此外,我们基于来自 AutoMathText 数据集的 Python 种子样本生成了 1B 代码教科书。
最终,我们制作了 3900 万份合成文档,包括 28B 个教科书、故事、文章和代码,受众范围广泛,主题超过 34,000 个。
FineWeb-教育
FineWeb-Edu 是我们几个月前发布的一个数据集,其中包含 FineWeb 的技术报告。它由从🍷 FineWeb数据集中过滤出来的1.3T教育网页令牌组成。
我们使用 Llama3-70B-Inform 生成的注释开发了一个教育质量分类器。然后,我们使用此分类器仅保留 FineWeb 中最具教育意义的网页。FineWeb-Edu 在流行的基准测试中优于 FineWeb,并显示了在合成数据上训练的分类器的强大功能。
FineWeb-Edu 与其他开放 Web 数据集的比较。
在 Smollm-Corpus 中,我们包含来自 FineWeb 的 220B 重复数据删除令牌。
堆栈-edu-python的
我们将 FineWeb-Edu 的相同理念应用到代码中。我们使用 Llama3 注释了 The Stack 数据集中的 500,000 个 python 样本,并使用与 FineWeb-Edu 分类器相同的配方来训练教育分类器。然后,我们将这个分类器应用于 StarCoder 模型训练语料库的 Python 子集。从可用的 40B Python 代币中,我们只保留了得分为 4 或更高的样本,从而形成了一个精细的 4B 代币数据集。
下图将 Python-Edu 与未经筛选的 Python 代码以及使用不太严格的阈值 3 进行了比较。我们可以看到,在 Python-Edu 上训练的模型比在未过滤的 Python 代码上训练的模型收敛速度快 3 倍以上,仅使用 12B 标记后就实现了 16% 的pass@1。
Python-Edu 与未过滤的 Python 代码的比较。
训练
SmolLM 模型有三种尺寸可供选择,并根据以下数据组合进行训练:
- 135M 和 360M 模型,每个模型都使用 Smollm-Corpus 的 600B 代币进行训练
- 1.7B 模型,在 Smollm-Corpus 的 1T 代币上训练
SmolLM 模型的训练混合物。
超参数选择
我们使用梯形学习速率调度器,冷却阶段等于总训练时间的 20%。需要注意的是,这个时间表的原始实验是在较小的规模下进行的,我们已经将其调整为更大的模型。
对于 135M 和 360M 参数模型的架构,我们采用了类似于 MobileLLM 的设计,结合了分组查询注意力 (GQA) 并优先考虑深度而不是宽度。1.7B 参数模型使用更传统的架构。对于这三个模型,我们使用嵌入绑定和 2048 个令牌的上下文长度。通过一些长时间的上下文微调,可以进一步扩展此上下文长度。
每种型号大小的详细架构规范如下:
SmolLM 模型的架构详细信息。
我们使用了在 Smollm 语料库上训练的分词器,词汇量为 49152。
实验
使用梯形调度器的一个优点是,它可以减少执行缩放定律实验所需的时间,如Hägele等人所示。我们通过对最小型号 SmolLM-125M 的小型缩放定律研究来说明这一点。我们观察到,随着训练时间的延长,性能会继续提高,甚至超过龙猫的最佳点。因此,我们决定在 1 万亿个代币上使用 1.7B 模型,在 600B 代币上使用 135M 和 360M 模型,因为在这些较小模型的一些基准测试中,400B 代币后的性能提升开始放缓。
评估在不同数量的令牌上训练的 125M SmolLM 模型。
我们尝试在冷却阶段添加 instruct 数据集并对精选的 Cosmopedia 子集进行上采样,但没有发现任何显着改进。这可能是因为主要数据组合已经具有高质量,从而限制了这些更改的影响。
为了跟踪我们的训练进度,我们每 2B 个令牌评估两个最小的模型。下图显示了它们在几个基准测试中的表现:
SmolLM-135M 和 SmolLM-360M 在不同基准上的中级评估。
评估
在本节中,我们评估了 SmolLM 模型在不同参数大小下的性能,并将它们与各自类别中的最佳模型进行比较。我们根据一套不同的基准进行评估,测试常识、推理和世界知识。我们对所有使用此设置和库的模型使用相同的评估设置。对于 HumanEval,我们使用 [bigcode-evaluation-harness](我们使用 temperature 0.2,top-p 0.95 和 20 个样本)和 We use temperature 0.2,top-p 0.95 和 20 个样本。对于不公开的 MobileLLM,我们尽可能使用论文中报告的数字。lighteval
我们发现:
- SmolLM-135M 的性能优于当前参数小于 200M 的最佳型号 MobileLM-125M,尽管与 MobileLM 的 1T 令牌相比,它只接受了 600B 令牌的训练。
- 与 MobileLM-350M 和 Qwen2-500M 相比,SmolLM**-**360M 的性能优于所有参数小于 500M 的模型,尽管参数较少且训练的令牌不到一万亿个 (600B)。
- SmolLM-1.7B优于所有其他参数小于2B的型号,包括Microsoft的Phi1.5,MobileLM-1.5B和Qwen2-1.5B。
- SmolLM-1.7B 在 24 pass@1中表现出强大的 Python 编码性能。我们注意到 Qwen2-1.5B 的评估分数与 Qwen 团队报告的 31.1 pass@1不同。我们使用 0.2 的温度,top-p 0.95 和 20 个样品。
SmolLM 模型与其他 SLM 的比较。我们在同一设置上评估所有模型,但 MobieLLM 除外,它不是公开的。
在HumanEval上评估SmolLM模型。
我们还使用公开可用的宽松指令数据集对模型进行了指令调整。我们在 WebInstructSub 数据集的宽松子集上训练了所有三个模型,并结合 StarCoder2-Self-OSS-Instruct。在此之后,我们对一个时期执行了 DPO(直接偏好优化):对 135M 和 1.7B 模型使用 HelpSteer,对 360M 模型使用 argilla/dpo-mix-7k。我们遵循了对齐手册中 Zephyr-Gemma 配方中的训练参数,但将 SFT(监督微调)学习率调整为 3e-4。
下表显示了 SmolLM-Instruct 和其他模型在 IFEval 基准测试(提示严格精度)上的性能。Qwen2-1.5B-Instruct 模型得分最高,为 29.94,SmolLM-Instruct 模型在模型大小和性能之间提供了良好的平衡,仅使用公开可用的宽松数据集。
在 IFEval 上评估 SmolLM-Instruct 模型。
如何在本地运行?
我们的型号设计为小型,可以在各种硬件配置上本地运行。作为参考,iPhone 15 有 6GB 的 DRAM,而 iPhone 15 Pro 有 16GB。这些内存要求使我们的型号适合部署在从智能手机到笔记本电脑的各种设备上。我们对三种型号大小的内存占用进行了基准测试:
SmolLM 模型的内存占用。
除了 transformers 检查点,我们还发布了 ONNX 检查点,并计划添加与 兼容的 GGUF 版本。您可以在 https://huggingface.co/spaces/HuggingFaceTB/SmolLM-135M-Instruct-WebGPU 和 https://huggingface.co/spaces/HuggingFaceTB/SmolLM-360M-Instruct-WebGPU 找到 WebGPU 演示 SmolLM-135M 和 Smol-LM360M。llama.cpp
结论
在这篇博文中,我们介绍了 SmolLM 模型,这是一个新的最先进的小型 LLM 系列。他们证明,小型语言模型可以通过对高质量数据集进行高效训练来实现高性能,从而在大小和性能之间提供强有力的平衡。
资源
- SmolLM 模型集合: https://huggingface.co/collections/HuggingFaceTB/smollm-models-6695016cad7167254ce15966
- SmolLM-Corpus 数据集:https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus
- WebGPU 演示:https://huggingface.co/spaces/HuggingFaceTB/SmolLM-135M-Instruct-WebGPU 和 https://huggingface.co/spaces/HuggingFaceTB/SmolLM-360M-Instruct-WebGPU
我们博客中的更多文章