SmolLM - 速度极快且功能强大
概述
这篇博客文章介绍了 SmolLM,这是一个由1.35亿、3.6亿和17亿参数组成的先进小型模型系列,在新的高质量数据集上进行训练。它涵盖了数据整理、模型评估和使用。
引言
人们对可以在本地设备上运行的小型语言模型越来越感兴趣。这种趋势涉及蒸馏或量化等技术来压缩大型模型,以及从头开始在大型数据集上训练小型模型。这些方法能够实现新颖的应用,同时大大降低推理成本并提高用户隐私。
微软的Phi系列、阿里巴巴的Qwen2(小于2B)和Meta的MobileLLM都表明,精心设计和训练的小型模型可以取得令人印象深刻的结果。然而,关于这些模型的数据整理和训练的大部分细节并未公开。
在这篇博客文章中,我们很高兴地介绍 SmolLM,这是一个最先进的小型语言模型系列,提供三种尺寸:1.35亿、3.6亿和17亿参数。这些模型建立在一个精心策划的高质量训练语料库上,我们将其发布为 SmolLM-Corpus。SmolLM语料库包括:
- Cosmopedia v2:由Mixtral生成的合成教科书和故事合集(280亿个token)
- Python-Edu:来自The Stack的教育性Python样本(40亿个token)
- FineWeb-Edu (去重):来自FineWeb的教育性网络样本(2200亿个token)
我们的评估表明,SmolLM模型在测试常识推理和世界知识的各种基准测试中,其性能优于同等规模的其他模型。在这篇博客文章中,我们将介绍训练语料库中每个子集的整理,然后讨论SmolLM模型的训练和评估。
SmolLM模型在不同推理和常识基准上的评估。
数据整理
从 Cosmopedia v1 到 v2
Cosmopedia v2 是 Cosmopedia 的增强版本,它是最大的预训练合成数据集,包含超过3000万本教科书、博客文章和由 Mixtral-8x7B-Instruct-v0.1 生成的故事。大多数样本是通过提示模型使用网页(称为“种子样本”)生成特定主题的内容,如图1所示。我们使用网络样本来增加多样性并扩大提示的范围。您可以在这篇博客文章中找到更多详细信息。
图1. Cosmopedia 提示示例。
为了改进 v2 中的数据集,我们尝试了两种策略
- 使用相同提示的更强大模型
- 优化提示本身
对于第一种策略,我们尝试了 llama3-70B-Instruct、Mixtral-8x22B-Instruct-v0.1 和 Qwen1.5-72B-Chat,但发现在这些替代模型生成的教科书上训练模型并没有显著改进。因此,在本节的其余部分,我们将重点关注第二种策略:我们如何改进提示。
寻找更好的主题和种子样本
每个提示有三个主要组成部分:主题、种子样本和生成风格,其中指定了预期的受众和我们希望模型生成的内容类型。
为了确保生成的一致性,我们需要与给定主题密切相关的种子样本。在 Cosmopedia v1 中,我们对 FineWeb 样本进行了聚类,以识别主题和相应的网络样本,如图2所示。这种方法有两个主要限制:
- 主题列表反映了网络/FineWeb 聚类,虽然全面,但可能限制我们对主题的控制。
- 每个聚类中的网络样本没有进一步筛选,可能包含一些低质量样本。
图2. FineWeb 聚类。
在 v2 中,我们没有采用这种无监督聚类方法,而是从一个包含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 的不同子集上训练18亿个模型,并使用80亿个 token 进行了消融研究。对于新生成的数据,我们只生成了20亿个 token,并训练了4个 epoch 以节省时间(使用 Mixtral 生成20亿个 token 大约需要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.3万亿个 token** 的教育网页。
我们使用 Llama3-70B-Instruct 生成的注释开发了一个教育质量分类器。然后,我们使用这个分类器从 FineWeb 中只保留最具教育意义的网页。FineWeb-Edu 在流行的基准测试中优于 FineWeb,并展示了在合成数据上训练的分类器的强大功能。
FineWeb-Edu 与其他开放网络数据集的比较。
在 Smollm-Corpus 中,我们包含2200亿个去重后的 FineWeb 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 代码上训练的模型快3倍以上,在仅经过120亿个 token 后就达到了16%的 pass@1。
Python-Edu 与未过滤 Python 代码的比较。
训练
SmolLM 模型有三种尺寸,并在以下数据混合上进行训练:
- 1.35亿和3.6亿参数模型,每个都在 SmolLM-Corpus 的6000亿个 token 上训练
- 17亿参数模型,在SmolLM-Corpus的1万亿个token上训练
SmolLM 模型的训练混合。
超参数选择
我们使用了梯形学习率调度器,其冷却阶段等于总训练时间的20%。值得注意的是,该调度器最初的实验是在较小规模下进行的,我们已将其应用于我们的更大模型。
对于我们的1.35亿和3.6亿参数模型的架构,我们采用了类似于MobileLLM的设计,集成了分组查询注意力(GQA),并优先考虑深度而非宽度。1.7亿参数模型使用更传统的架构。对于所有这三个模型,我们都使用嵌入绑定和2048个 token 的上下文长度。这个上下文长度可以通过一些长上下文微调进一步扩展。
每个模型尺寸的详细架构规格如下:
SmolLM模型的架构详情。
我们使用了在SmolLM语料库上训练的tokenizer,词汇量大小为49152。
实验
使用梯形调度器的一个优点是它可以减少执行缩放律实验所需的时间,如Hägele 等人所示。我们通过对最小模型 SmolLM-125M 进行一项小型缩放律研究来说明这一点。我们观察到,即使超过 Chinchilla 最佳点,性能也会随着更长的训练而持续提高。因此,我们决定在1万亿个 token 上训练1.7亿参数模型,并在6000亿个 token 上训练1.35亿和3.6亿参数模型,因为对于这些较小的模型,在4000亿个 token 之后,某些基准的性能增益开始放缓。
在不同数量的token上训练的1.25亿SmolLM模型的评估。
我们尝试在冷却阶段添加指令数据集并对精选的 Cosmopedia 子集进行上采样,但没有发现显著改进。这可能是因为主要数据混合的质量已经很高,限制了这些变化的影响。
为了跟踪训练进度,我们每20亿个 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 优于目前参数少于2亿的最佳模型 MobileLM-125M,尽管 SmolLM 仅在6000亿个 token 上训练,而 MobileLM 训练了1万亿个 token。
- SmolLM**-**360M 优于所有参数少于5亿的模型,尽管其参数更少,且训练的 token 少于1万亿(6000亿),而 MobileLM-350M 和 Qwen2-500M 则不然。
- SmolLM-1.7B 优于所有其他参数少于20亿的模型,包括微软的 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,对所有三个模型进行了1个 epoch 的训练。之后,我们进行了1个 epoch 的 DPO(直接偏好优化):1.35亿和1.7亿模型使用 HelpSteer,3.6亿模型使用 argilla/dpo-mix-7k。我们遵循 alignment handbook 中 Zephyr-Gemma 的训练参数,但将 SFT(监督微调)学习率调整为3e-4。
下表显示了 SmolLM-Instruct 和其他模型在 IFEval 基准(Prompt Strict Accuracy)上的性能。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://huggingface.co/spaces/HuggingFaceTB/SmolLM-135M-Instruct-WebGPU 和 https://huggingface.co/spaces/HuggingFaceTB/SmolLM-360M-Instruct-WebGPU 找到 WebGPU 演示 SmolLM-135M 和 Smol-LM360M。
结论
在这篇博客文章中,我们介绍了 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