SmolLM3: 小型、多语言、长上下文推理器
随着用户寻求能够高效部署的强大模型,小型语言模型变得越来越重要。社区已经开发出了一系列功能强大、令人着迷的小型模型,每个都在这个规模上突破了可能的界限。通过 SmolLM3,我们很高兴能贡献一个全新的、具有竞争力的完全开放的 3B 模型。
- 基础模型:https://huggingface.co/HuggingFaceTB/SmolLM3-3B-Base
- 指令和推理模型:https://huggingface.co/HuggingFaceTB/SmolLM3-3B
SmolLM3 位于效率的最佳点。我们的 3B 模型性能优于 Llama-3.2-3B 和 Qwen2.5-3B,同时与更大的 4B 替代品(Qwen3 和 Gemma3)保持竞争力。除了性能数据,我们还将分享如何使用公共数据集和训练框架构建它。
模型摘要
- 3B 模型,在 11T token 上训练,在 3B 规模上达到最新技术水平,并与 4B 模型具有竞争力。
- 具有双模式推理的指令模型,支持
think
/no_think
模式。 - 支持 6 种语言:英语、法语、西班牙语、德语、意大利语和葡萄牙语的多语言支持。
- 使用 NoPE 和 YaRN,长上下文可达 128k。
完整配方:我们正在发布 SmolLM3,并附带我们的工程蓝图。它包括架构细节、精确的数据混合,展示了我们如何通过三阶段预训练方法逐步提升跨领域的性能,以及构建混合推理模型的方法。通常,实现这些结果需要数月的时间进行逆向工程。相反,我们提供了完整的方法。
无论您是构建自己的模型还是想了解在这个规模上是什么驱动性能,这份蓝图都展示了实现具有竞争力 3B 性能背后的工程故事。
让我们来看看预训练阶段。
预训练
SmolLM3 改变了其前身的架构和数据混合。我们先来看看架构和训练配置!
架构和训练细节
SmolLM3 沿用 SmolLM2 类似的Transformer解码器架构,并采用共享嵌入,以 Llama 架构为基础,并进行了一些关键修改,以优化效率和长上下文性能。
分组查询注意力 (GQA): 我们用 4 个组的分组查询注意力取代了多头注意力。我们对在 FineWeb-Edu 的 100B token 上训练的 3B 模型进行消融实验表明,GQA 在显著减少推理过程中 KV 缓存大小的同时,与多头注意力的性能相匹配。
NoPE: 我们实现了“RoPE 到 NoRoPE 再回来:一种新的混合注意力策略”(Yang 等人,2025 年)中的 NoPE,选择性地从每第 4 层移除旋转位置嵌入。这种方法在不影响短上下文能力的情况下提高了长上下文性能,这已通过我们的消融实验证实。
文档内掩码: 在训练过程中,我们使用注意力掩码来确保同一训练序列中不同文档的 token 之间不会相互关注。与 Llama 3 类似,这有助于更快、更稳定的长上下文训练,同时保持短上下文性能。
训练稳定性: 按照 OLMo 2 的做法,我们从嵌入层中移除权重衰减以提高训练稳定性。这项修改有助于更稳定的训练动态,嵌入范数在训练期间自然地稳定在更健康的数值,而不会影响我们消融实验中的整体性能。
所有这些更改都通过使用在 FineWeb-Edu 的 100B token 上训练的相同 3B 架构进行的消融实验进行了验证,确保每次修改都能够提高性能或保持性能,同时提供其他好处。
训练配置:我们使用 2.36M token 的全局批大小,序列长度为 4096,学习率为 2e-4,并使用 AdamW 优化器(beta1:0.9,beta2:0.95),权重衰减为 0.1,梯度裁剪为 1。我们使用 WSD(Warmup-Stable-Decay)调度器,具有 2000 个预热步,并在最后 10% 的训练步中线性衰减到 0。我们使用 nanotron 框架进行训练,datatrove 进行数据处理,lighteval 进行评估。该模型在 384 个 H100 GPU 上训练了 24 天。您可以在下图看到分布式训练设置。
除了架构更改,我们还对训练配方进行了消融和改进。让我们仔细看看。
数据混合和训练阶段
沿袭 SmolLM2 的多阶段方法,我们使用三阶段训练策略在 11.2T token 上训练 SmolLM3,该策略混合了网络、数学和代码数据,并不断调整比例。我们对在 50B 到 100B token 上训练的 3B 模型进行了广泛的消融实验,以确定数据混合和比例。
预训练包括这些阶段,也如上图所示:
- 第一阶段:稳定阶段(0T → 8T token)这个基础阶段通过我们的核心数据集混合建立了强大的通用能力。
- 网络:85% (12% 多语言) - FineWeb-Edu, DCLM, FineWeb2 和 FineWeb2-HQ
- 代码:12% - The Stack v2(16 种编程语言)、StarCoder2 拉取请求、Jupyter 和 Kaggle 笔记本、GitHub 问题以及 StackExchange。
- 数学:3% - FineMath3+ 和 InfiWebMath3+
- 第二阶段:稳定阶段(8T → 10T token)我们引入了更高质量的数学和代码数据集,同时保持了良好的网络覆盖率。
- 网络:75%(12% 多语言)
- 代码:15% - 增加了 Stack-Edu
- 数学:10% - 引入了 FineMath4+、InfiWebMath4+ 和 MegaMath(包括 Qwen 问答、Pro 合成重写和文本-代码交错块)
- 第三阶段:衰减阶段(10T → 11.1T token)最后阶段进一步增加了数学和代码数据采样。
- 网络:63%(12% 多语言)
- 代码:24% - 高质量代码数据采样增加
- 数学:13% - 数学数据采样增加,并引入了指令和推理数据集,例如 OpenMathReasoning
通过这些阶段和混合,我们为基础模型实现了非常有竞争力的性能。更多内容请参见评估部分。带有确切数据权重的 nanotron 训练配置可以在这里找到。我们还将分享我们的训练日志以及中间检查点。
在主要预训练之后,我们在中期训练阶段改进了模型的长上下文和推理能力。
中期训练
我们将长上下文适应和推理适应称为“中期训练”。它们比主要的预训练短得多,但仍然具有一定的通用性,旨在改进模型在这两个领域的能力。我们首先来看看长上下文训练。
长上下文扩展
在主要预训练之后,我们对 SmolLM3 进行了额外的 100B token 训练,以扩展其上下文长度。我们分两个阶段顺序扩展了上下文窗口,每个阶段 50B token:首先从 4k 转换到 32k 上下文,RoPE theta 增加到 1.5M;然后从 32k 转换到 64k 上下文,RoPE theta 增加到 5M。这两个阶段都上采样了数学、代码和推理数据。在消融实验中,我们发现上采样特定的长上下文数据(如代码仓库、书籍和长网页,超出我们混合中自然较长的样本)并未进一步提升 RULER 和 HELMET 基准测试的性能。使用 NoPE 并以更长序列和增加的 RoPE theta 值训练衰减混合就足以达到 64k 的竞争性长上下文性能。
根据 Qwen2.5,我们使用 YARN 超出训练上下文长度进行推断。在推理过程中,模型可以处理多达 128k 的上下文(比 64k 训练长度扩展 2 倍)。
中期训练推理
在扩展模型上下文长度后,我们在中期训练阶段对其进行训练,以整合推理能力。中期训练阶段与预训练和后训练阶段的主要区别在于,我们针对的是一种通用能力,而不是专注于特定领域。在我们的案例中,我们希望训练模型进行推理,而不针对特定领域,例如数学或计算机代码。
我们的中期训练数据集包含来自 Open Thought 的 OpenThoughts3-1.2M 和 NVIDIA 的 Llama-Nemotron-Post-Training-Dataset-v1.1 中带有 R1 推理轨迹的子集,共计 35B token。我们使用了 ChatML 聊天模板和 packed 封装,以避免为模型提供过多结构。我们对模型进行了 4 个周期(约 140B token)的训练,并将检查点用于后续的 SFT 阶段。
后训练
DeepSeek R1 和 Qwen3 等推理模型的发布,证明了当模型能够进行显式推理时所展现的强大能力。然而,社区仍然缺乏完全开放的配方,利用公共数据集来构建同时支持推理和非推理模式的双指令模型。大多数现有方法涉及复杂的强化学习过程和专有数据集,这使得研究人员难以复现和在此基础上进行研究。
在本节中,我们解释了如何应对这些挑战,并分享了构建双指令模型的完整配方。我们详细介绍了如何通过精心设计的训练流程平衡推理和非推理模式之间的性能,该流程包括通用推理能力的中期训练、合成数据生成的监督微调以及使用锚定偏好优化 (APO)(DPO 的最新变体)进行对齐。
构建聊天模板
在深入研究训练方法之前,了解用户如何与我们的双模式模型交互至关重要。聊天模板充当了在推理和非推理模式之间无缝切换的界面,其设计直接影响我们的训练数据格式和模型行为。SmolLM3 的聊天模板允许用户在对话期间控制推理模式。用户可以通过在系统提示中分别包含 /think
和 /no_think
标志来激活推理或非推理模式。在非推理模式下,我们用空的思考块预填充模型的响应,类似于 Qwen3,以确保直接回答而无需明确的推理。
SmolLM3 支持工具调用,其聊天模板包含两个独立的工具描述部分:XML 工具和 Python 工具。这种特定的分类在我们的实验中被证明对模型准确解释每种格式的工具定义有益。
聊天模板为两种推理模式提供默认系统消息,以及一个包含日期、知识截止日期和当前推理模式的元数据部分。用户可以通过提供带有 system
角色的系统消息来替换默认系统消息。元数据部分可以通过在系统提示中使用 /system_override
标志来排除,从而为特定用例提供灵活性。
监督微调
在推理中期训练阶段之后,我们对模型进行了监督微调 (SFT),以在数学、代码、通用推理、指令遵循、多语言和工具调用等推理和非推理模式下集成能力。训练双模式模型需要仔细平衡数据混合,以在所有目标域的两种模式下保持强大的性能。为了评估 SmolLM3 在整个训练过程中的性能,我们跟踪了以下领域:数学、代码、通用推理、指令遵循和多语言。
在构建推理模式数据集时,我们遇到的主要挑战是某些领域缺乏包含推理痕迹的数据集。为了解决这个问题,我们通过使用现有非推理数据集中的提示来提示 Qwen3-32B 在推理模式下生成合成数据。这使我们能够提高模型在推理模式下最初表现不佳的领域(例如多轮对话、多语言和日常对话)的性能。
我们的最终数据混合是经过大量消融实验的结果,这些实验旨在探索推理和非推理 token 的最佳比例以及每种模式中的组成。最终的 SFT 数据集包含 1.8B token:非推理模式下 1B,推理模式下 0.8B,包括 12 个非推理数据集和 10 个包含推理痕迹的数据集。我们使用 BFD(最佳拟合递减)打包训练了 4 个 epoch(约 8B token),其中损失对用户轮次和工具调用结果进行了掩码。
我们将发布此数据混合以及我们的完整训练脚本,以使社区能够复现并在此基础上进行工作。
使用锚定偏好优化 (APO) 进行离策略模型对齐
在 SFT 步骤之后,我们使用 Tulu3 偏好数据集(用于非推理模式)和新的合成偏好对(用于推理模式,我们从 Qwen3-32B 和 Qwen3-0.6B 生成)的组合进行了一轮模型对齐。为了确保非思考数据集覆盖所有领域,我们生成了互补的思考模式偏好对。我们选择了 Qwen3-32B 生成的结果作为“选定”,并将 Qwen3-0.6B 的响应作为“拒绝”,以与锚定偏好优化进行对齐。
锚定偏好优化 (APO) 是 直接偏好优化 (DPO) 的一个变体,它提供了更稳定的优化目标。在 DPO 中,奖励函数 r_θ(x,y) 衡量训练期间序列概率与训练开始时模型(参考模型)概率的对数比
这里的 β 控制着被优化的模型相对于参考模型能够改变的程度。DPO 损失优化了提示 x、选定的 y_w 和拒绝的 y_l 响应的三元组
APO 目标已被证明更加稳定,我们还在内部消融实验中观察到更高的下游性能。
虽然下游评估显示数学、科学、指令遵循、编码、聊天和多语言任务都有所改进,但我们观察到 RULER 等长上下文基准测试的性能下降。我们将这种下降追溯到推理中期训练阶段,该阶段对推理能力的关注影响了长上下文性能。此外,APO 训练数据限制在 24k token,因为我们绝大多数推理数据集的长度都低于此值。
为了缓解这种性能下降,我们探索了模型合并作为一种解决方案。
模型合并
模型合并是一种流行且强大的技术,它允许结合不同模型的优点,而无需集成计算开销或额外的训练。我们使用 MergeKit 库执行模型合并,因为它包含了多种合并方法,包括线性合并和非线性合并。
我们的合并方法包含两个步骤:
- 获取每个 APO 检查点并创建模型“汤”。
- 将模型汤与具有强大长内容性能的中期训练检查点结合。对 APO 模型汤和中期训练检查点分别采用 0.9 和 0.1 的权重进行线性合并,取得了最佳性能。我们能够恢复基础模型在高达 128k token 上下文的 RULER 分数。
由此产生的模型是我们今天发布的检查点。它在各种任务中保持了性能。现在让我们来看看该模型以及基础模型的评估结果。
评估
我们评估了基础模型和指令模型在推理和非推理模式下的性能。我们首先介绍基础模型的性能!
基础模型
下图显示了 SmolLM3 在评估知识、推理、数学和编码能力的 12 个流行基准测试中的胜率。SmolLM3 始终优于其他 3B 模型,并与包括 Qwen3-4B 和 Gemma3-4B 在内的更大 4B 模型达到竞争性能。
胜率评估基准:HellaSwag、ARC、Winogrande、CommonsenseQA、MMLU-CF、MMLU Pro CF、PIQA、OpenBookQA、GSM8K、MATH、HumanEval+、MBPP+
SmolLM3 在知识和推理基准测试(HellaSwag、ARC、BoolQ)中名列第一或第二,展示了在这些核心能力方面的强大性能。数学和编码性能在 3B 级别中具有竞争力。Ruler 64k 上的长上下文性能表明模型可以有效处理扩展序列。
该模型在 Global MMLU、MLMM HellaSwag、Flores-200、Belebele 等多语言基准测试中表现出强大的多语言性能,这些测试评估了知识、常识推理、文本理解和翻译。这表明 SmolLM3 在英语之外的语言中也能保持一致的性能。
总而言之,基础模型在许多领域表现非常出色。让我们看看这如何转化为指令模型的性能。
双指令/推理模型
由于 SmolLM3 具有指令模式和推理模式,因此我们需要在两种模式下评估模型,并与具有相同功能的模型进行比较。
无扩展思考评估
我们评估了 SmolLM3 与其他 3B 非推理模型在多个基准测试中的表现,并将其与 Qwen3 推理模型在无思考模式下的表现进行比较。如图所示,SmolLM3 优于其他 3B 非推理模型,包括 Llama3.2 3B Instruct 和 Qwen2.5 3B Instruct,并在推理模型之间处于效率最佳点,显著优于 Qwen3 1.7B,同时以更低的计算成本接近 4B 模型的性能。
因此,该指令模型正好位于性能和成本的帕累托前沿。让我们看看推理模型的表现如何!
扩展思考评估
在启用扩展思考模式评估 SmolLM3 的推理能力时,模型在大多数基准测试中都比其非推理版本有显著改进。我们观察到在 AIME 2025(36.7% vs 9.3%)、LiveCodeBench 上的竞争性编程(30.0% vs 15.2%)和 GPQA Diamond 上的研究生级推理(41.7% vs 35.7%)等具有挑战性的任务中取得了显著的进步。
虽然 Qwen3 4B 通常在思考和非思考模式下都取得了最高分,但 SmolLM3 在 3B 参数类别中表现出具有竞争力的性能,尤其擅长数学推理和复杂问题解决任务。模型的双模式能力允许用户在无需推理的更快推理或需要扩展思考的更彻底分析之间进行选择。
那么最后一个问题是:你如何使用这个模型?
如何本地运行
SmolLM3 的建模代码在 transformers v4.53.0
中可用,因此请确保升级您的 transformers 版本。您也可以使用最新的 vllm
加载模型,它使用 transformers 作为后端。
pip install -U transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "HuggingFaceTB/SmolLM3-3B"
device = "cuda" # for GPU usage or "cpu" for CPU usage
# load the tokenizer and the model
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
).to(device)
# prepare the model input
prompt = "Give me a brief explanation of gravity in simple terms."
messages_think = [
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages_think,
tokenize=False,
add_generation_prompt=True,
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# Generate the output
generated_ids = model.generate(**model_inputs, max_new_tokens=32768)
# Get and decode the output
output_ids = generated_ids[0][len(model_inputs.input_ids[0]) :]
print(tokenizer.decode(output_ids, skip_special_tokens=True))
我们建议在采样参数中设置
temperature=0.6
和top_p=0.95
。
启用和禁用扩展思考模式
我们默认启用扩展思考功能,因此上述示例将生成带有推理轨迹的输出。为了选择是否启用,您可以通过系统提示提供 /think
和 /no_think
标志,如下面的代码片段所示,以禁用扩展思考。生成带有扩展思考的响应的代码将相同,只是系统提示应包含 /think
而不是 /no_think
。
prompt = "Give me a brief explanation of gravity in simple terms."
messages = [
{"role": "system", "content": "/no_think"},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
)
Agentic 用法
SmolLM3 支持工具调用!只需在参数 xml_tools
(用于标准工具调用)或 python_tools
(用于在 片段中调用 Python 函数等工具)下传递您的工具列表。
from transformers import AutoModelForCausalLM, AutoTokenizer
checkpoint = "HuggingFaceTB/SmolLM3-3B"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint)
tools = [
{
"name": "get_weather",
"description": "Get the weather in a city",
"parameters": {"type": "object", "properties": {"city": {"type": "string", "description": "The city to get the weather for"}}}}
]
messages = [
{
"role": "user",
"content": "Hello! How is the weather today in Copenhagen?"
}
]
inputs = tokenizer.apply_chat_template(
messages,
enable_thinking=False, # True works as well, your choice!
xml_tools=tools,
add_generation_prompt=True,
tokenize=True,
return_tensors="pt"
)
outputs = model.generate(inputs)
print(tokenizer.decode(outputs[0]))
结论
我们发布了 SmolLM3,一个小型、长上下文、多语言的推理器,支持高达 128k 的上下文。除了模型检查点,我们还发布了完整的训练配方,包括预训练、中期训练、后训练和合成数据生成以及数据集(即将发布)。我们希望这个模型能对社区有所帮助,并且这个配方能让其他团队在其基础上进行改进。
资源
- 带有量化检查点的模型集合:链接
- SmolLM GitHub 仓库,包含预训练配置和评估代码:https://github.com/huggingface/smollm
- 我们的 HuggingFace 组织:https://huggingface.co/HuggingFaceTB