Hugging Face 发布 SmolLM 系列小模型并开源 SmolLM-Corpus
SmolLM - blazingly fast and remarkably powerful
Hugging Face 发布 SmolLM 系列小语言模型,包含 135M、360M、1.7B 三种参数规模,并开源训练语料 SmolLM-Corpus。该语料由 Mixtral 生成的 Cosmopedia v2(28B tokens)、Python-Edu(4B tokens)和去重后的 FineWeb-Edu(220B tokens)组成。
SmolLM 把数据配比、训练细节和评测结果一并公开,可供读者判断小模型在端侧可用的边界。
简而言之
本篇博文介绍 SmolLM,这是一个拥有 135M、360M 和 1.7B 参数的最先进小型模型系列,基于全新的高质量数据集训练。内容涵盖数据整理、模型评估及使用。
引言
能在本地设备上运行的小型语言模型越来越受到关注。这一趋势涉及通过蒸馏或量化等技术来压缩大型模型,以及从零开始在大型数据集上训练小型模型。这些方法不仅能够实现新颖的应用,还能大幅降低推理成本并提升用户隐私。
微软的 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 的增强版,这是用于预训练的最大合成数据集,包含由 Mixtral-8x7B-Instruct-v0.1 生成的超过 3000 万本教科书、博客文章和故事。大多数样本是通过使用一个被称为“种子样本”的网页,提示模型生成特定主题的内容,如图 1 所示。我们利用网络样本来增加多样性并扩展提示范围。更多详情可参见此博客文章。

图 1. Cosmopedia 提示示例。
为了在 v2 中改进数据集,我们尝试了两种策略:
- 使用更强大的模型配合相同的提示
- 优化提示本身
对于第一种策略,我们试验了 llama3-70B-Instruct、Mixtral-8x22B-Instruct-v0.1 和 Qwen1.5-72B-Chat,但在这些替代模型生成的教科书上训练模型时并未发现显著改进。因此,在本节的剩余部分,我们将重点讨论第二种策略:我们如何改进提示。
寻找更好的主题和种子样本
每个提示包含三个主要组成部分:主题、种子样本以及生成风格,生成风格指定了目标受众和希望模型生成的内容类型。
为了确保生成内容的一致性,我们需要与给定主题密切相关的种子样本。在 Cosmopedia v1 中,我们对 FineWeb 样本进行了聚类,以识别主题及相应的网络样本,如图 2 所示。这种方法有两个主要局限:
- 主题列表反映了网络/FineWeb 的聚类结果,虽然全面,但可能限制了我们对于主题的控制。
- 每个聚类内的网络样本未进一步筛选,可能包含一些低质量样本。

图 2. FineWeb 聚类。
在 v2 中,我们并未采用这种无监督聚类方法,而是从使用 BISAC 图书分类 预定义的 34,000 个主题列表开始,这是一个全面且注重教育的按学科分类图书的标准。我们从 51 个类别下的 5,000 个主题出发,要求 Mixtral 为特定主题生成子主题。下面是每个类别中子主题的最终分布:

图 3. 用于提示的顶级类别中主题的分布。
定义好主题后,我们仍需找到与之相关的网页。就像使用搜索引擎查找特定主题的内容一样,我们实施了一个搜索工具,为每个主题检索最相关的页面。我们使用 BISAC 分类及其子主题作为查询词,在包含超过 5.2 亿样本的 FineWeb CC-MAIN-2024-10 和 CC-MAIN-2023-50 数据转储上运行此工具。对于每个查询,我们检索了 1,000 个页面,确保只获取最相关的内容。部署和运行搜索工具的代码可在此处获取。
结果,我们汇总了覆盖 34,000 个主题的 3,400 万个网页。下一步是确定哪种生成风格效果最佳。

图 4. “医学”类别中的主题及其检索到的样本。
生成风格
为了确定最有效的生成风格,我们通过在不同 Cosmopedia v1 子集上使用 8B 令牌训练 1.8B 模型进行了消融研究。对于新生成的数据,我们仅生成了 2B 令牌并训练了 4 个周期以节省时间(使用 Mixtral 生成 2B 令牌大约需要 1000 GPU 小时)。我们使用了与 FineWeb 消融模型 相同的训练和评估设置。每个实验使用两个不同的随机种子运行两次,并取两次运行的平均分。
我们比较了 Cosmopedia v1 中以下子集的性能:
- 网络教科书子集
- 故事子集
- 斯坦福 & OpenStax 子集
我们发现,基于主题和来自斯坦福和 OpenStax 等精选资源的种子样本的教科书提供了最佳的整体性能,相较于基于网络的教科书,在 MMLU 和 ARC 基准测试中表现更优。故事似乎有助于常识性基准测试。在 v2 中实施新的主题和种子样本检索方法后,我们能够使用网络种子达到精选资源的性能,证实了新提示的质量。
接下来,我们探究了哪种受众风格效果最佳。我们使用相同的网络教科书提示生成了针对不同受众的教科书:中学生和大学生。我们发现,主要针对中学生编写的教科书训练出的模型,在除 MMLU 外的所有基准测试中得分最高。这可以解释为,这些测试大多考察基本的常识以及初级至中级的科学知识,而 MMLU 则包含一些需要高级知识和专业技能的问题。

不同受众教科书评估。

不同受众教科书评估。
对于 v2,我们决定生成的内容中 40% 面向中学生,30% 面向大学生,剩余 30% 则混合其他受众和风格,包括我们从 Cosmopedia v1 借鉴的子集,如故事和基于斯坦福课程的教科书。此外,我们还基于 AutoMathText 数据集中的 Python 种子样本,生成了 10 亿条代码教科书。
最终,我们生产了 3900 万份合成文档,包含 280 亿个 token 的教科书、故事、文章和代码,覆盖了多样化的受众和超过 34,000 个主题。
FineWeb-Edu
FineWeb-Edu 是我们几个月前随 FineWeb 的技术报告一同发布的数据集。它包含从 🍷 FineWeb 数据集中筛选出的 1.3T token 的教育网页。
我们利用 Llama3-70B-Instruct 生成的标注开发了一个教育质量分类器。随后,我们使用该分类器仅保留 FineWeb 中最具教育意义的网页。FineWeb-Edu 在流行的基准测试中优于 FineWeb,展示了基于合成数据训练的分类器的强大能力。

FineWeb-Edu 与其他开放网络数据集的对比。
在 Smollm-Corpus 中,我们包含了来自 FineWeb 的 2200 亿个去重后的 token。
Stack-Edu-Python
我们将 FineWeb-Edu 的相同理念应用到了代码上。我们使用 Llama3 对 The Stack 数据集中的 50 万个 Python 样本进行了标注,并采用与 FineWeb-Edu 分类器相同的配方,用这些标注训练了一个教育代码分类器。然后,我们将这个分类器应用于 StarCoder 模型训练语料库的 Python 子集。在可用的 400 亿个 Python token 中,我们仅保留了得分在 4 分或以上的样本,最终得到了一个包含 40 亿 token 的精选数据集。
下图对比了 Python-Edu 与未经过滤的 Python 代码以及使用较宽松阈值 3 的情况。我们可以看到,在 Python-Edu 上训练的模型比在未经过滤的 Python 代码上训练的模型收敛速度快三倍以上,仅用了 120 亿个 token 就达到了 16% 的 pass@1。

Python-Edu 与未经过滤的 Python 代码的对比。
训练
SmolLM 模型提供三种不同规模,并且基于以下数据混合进行训练:
- 1.35 亿和 3.6 亿参数的模型,各自使用来自 Smollm-Corpus 的 6000 亿个 token 进行训练
- 17 亿参数的模型,使用来自 Smollm-Corpus 的 1 万亿个 token 进行训练

SmolLM 模型的训练数据混合。
超参数选择
我们采用了梯形学习率调度器,冷却阶段占总训练时间的 20%。需要注意的是,使用该调度器的初始实验是在较小规模下进行的,我们已将其适配到我们更大的模型上。
对于我们的 135M 和 360M 参数模型的架构,我们采用了类似于 MobileLLM 的设计,融入了分组查询注意力(GQA),并优先考虑深度而非宽度。1.7B 参数模型则使用了更传统的架构。对于所有三个模型,我们都使用了嵌入绑定(embedding tying)和 2048 个 token 的上下文长度。这个上下文长度可以通过一些长上下文微调进一步扩展。
每个模型大小的详细架构规格如下:

SmolLM 模型的架构细节。
我们使用了一个在 Smollm 语料库上训练的分词器,词汇量为 49152。
实验
使用梯形调度器的一个优势是它可以减少执行缩放定律实验所需的时间,如 Hägele 等人 所示。我们通过在我们最小的模型 SmolLM-125M 上进行一个小型缩放定律研究来说明这一点。我们观察到,随着训练时间的延长,性能持续提升,甚至超过了 Chinchilla 最优点。因此,我们决定在 1 万亿 token 上训练 1.7B 模型,并在 6000 亿 token 上训练 135M 和 360M 模型,因为对于这些较小的模型,在 4000 亿 token 之后,某些基准测试上的性能增益开始放缓。

在不同数量的 token 上训练的 125M SmolLM 模型的评估。
我们在冷却阶段尝试添加指令数据集并对精选的 Cosmopedia 子集进行上采样,但没有发现显著改进。这可能是因为主要数据混合已经具有高质量,限制了这些变化的影响。
为了跟踪我们的训练进度,我们每 2B token 对我们两个最小的模型进行评估。以下图表显示了它们在几个基准测试上的性能:

SmolLM-135M 和 SmolLM-360M 在不同基准测试上的中间评估。
评估
在本节中,我们评估 SmolLM 模型在不同参数大小下的性能,并将它们与各自类别中最好的模型进行比较。我们在多样化的基准测试集上评估,测试常识推理和世界知识。我们使用相同的评估设置对所有模型进行评估,使用此 设置 和 lighteval 库。对于 HumanEval,我们使用 [bigcode-evaluation-harness](我们使用温度 0.2,top-p 0.95,20 个样本。)使用温度 0.2,top-p 0.95,20 个样本。对于 MobileLLM,由于未公开可用,我们尽可能使用论文中报告的数字。
我们发现:
- SmolLM-135M 在少于 200M 参数的模型中表现优于当前最佳模型 MobileLM-125M,尽管仅训练了 600B token,而 MobileLM 训练了 1T token。
- SmolLM**-**360M 在少于 500M 参数的模型中表现优于所有模型,尽管参数更少且训练 token 少于 1 万亿(600B),而 MobileLM-350M 和 Qwen2-500M 则不同。
- SmolLM-1.7B 在少于 2B 参数的模型中表现优于所有其他模型,包括微软的 Phi1.5、MobileLM-1.5B 和 Qwen2-1.5B。
- SmolLM-1.7B 展示了强大的 Python 编码性能,pass@1 为 24。我们注意到 Qwen2-1.5B 的评估分数与 Qwen 团队报告的 31.1 pass@1 不同。我们使用温度 0.2,top-p 0.95,20 个样本。

SmolLM 模型与其他 SLM 的比较。我们在相同设置下评估所有模型,除了 MobieLLM,因为它未公开可用。

SmolLM 模型在 HumanEval 上的评估。
我们还使用公开可用的宽松指令数据集对模型进行了指令微调。我们在 WebInstructSub 数据集 的宽松子集上,结合 StarCoder2-Self-OSS-Instruct,对全部三个模型训练了一个 epoch。随后,我们进行了一个 epoch 的 DPO(直接偏好优化):135M 和 1.7B 模型使用 HelpSteer,360M 模型使用 argilla/dpo-mix-7k。我们遵循了 alignment handbook 中 Zephyr-Gemma 配方的训练参数,但将 SFT(监督微调)学习率调整为 3e-4。
下表展示了 SmolLM-Instruct 和其他模型在 IFEval 基准(Prompt 严格准确率)上的表现。Qwen2-1.5B-Instruct 模型得分最高,为 29.94,SmolLM-Instruct 模型在模型大小和性能之间提供了良好的平衡,且仅使用公开可用的宽松数据集。

SmolLM-Instruct 模型在 IFEval 上的评估。
如何在本地运行?
我们的模型设计为小型化,可在各种硬件配置上本地运行。作为参考,iPhone 15 拥有 6GB DRAM,而 iPhone 15 Pro 拥有 8GB。这些内存需求使我们的模型适合部署在从智能手机到笔记本电脑的各类设备上。我们对三种模型大小的内存占用进行了基准测试:

SmolLM 模型的内存占用。
除了 transformers 检查点外,我们还发布了 ONNX 检查点,并计划添加兼容 llama.cpp 的 GGUF 版本。您可以在 https://hf-mirror.com/spaces/HuggingFaceTB/SmolLM-135M-Instruct-WebGPU 和 https://hf-mirror.com/spaces/HuggingFaceTB/SmolLM-360M-Instruct-WebGPU 找到 SmolLM-135M 和 Smol-LM360M 的 WebGPU 演示。
结论
在这篇博客文章中,我们介绍了 SmolLM 模型,这是一个新的最先进的小型 LLM 系列。它们证明了小型语言模型可以通过对高质量数据集的高效训练实现高性能,在大小和性能之间提供了强大的平衡。
资源
- SmolLM 模型合集:https://hf-mirror.com/collections/HuggingFaceTB/smollm-models-6695016cad7167254ce15966
- SmolLM-Corpus 数据集:https://hf-mirror.com/datasets/HuggingFaceTB/smollm-corpus
- WebGPU 演示:https://hf-mirror.com/spaces/HuggingFaceTB/SmolLM-135M-Instruct-WebGPU 和 https://hf-mirror.com/spaces/HuggingFaceTB/SmolLM-360M-Instruct-WebGPU
来源:Hugging Face Blog · hf-mirror.com