跳到正文
北京时间
原文
Hugging Face:Blog·· 2025-07-08精选AI 评分76

Hugging Face 发布全开源 3B 模型 SmolLM3,支持 128k 长上下文与双模式推理

SmolLM3: smol, multilingual, long-context reasoner

AI 导读

Hugging Face 发布全开源 3B 模型 SmolLM3,基于 11T token 预训练,官方称在 3B 规模上超越 Llama-3.2-3B 和 Qwen2.5-3B,并与 Qwen3、Gemma3 等 4B 模型竞争。

推荐理由

官方完整公开 3B 模型的架构改动、三阶段数据配比和双模式训练配方,想复现或改进小模型的人可据此省去数月逆向工程。

正文 · AI 翻译

随着用户寻求能够高效部署的高性能模型,小型语言模型正变得越来越重要。社区已经推出了一系列引人注目且能力出众的小型模型,每一个都在这个规模上不断突破可能性的边界。借助 SmolLM3,我们很高兴能贡献一个全新的、具有竞争力的、完全开放的 3B 模型:

SmolLM3 处于效率的最佳平衡点。我们的 3B 模型性能优于 Llama-3.2-3B 和 Qwen2.5-3B,同时与更大的 4B 替代方案(Qwen3 和 Gemma3)保持竞争力。除了性能数字之外,我们还完整分享了如何使用公开数据集和训练框架构建它。


模型摘要:

  • 3B 模型,在 11T token 上训练,在 3B 规模上达到 SoTA,并与 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 to NoRoPE and Back Again: A New Hybrid Attention Strategy”(Yang 等人,2025)的 NoPE,选择性地从每第 4 层移除旋转位置嵌入。我们的消融实验证实,这种方法在不影响短上下文能力的情况下提升了长上下文性能。

文档内掩码:遵循“Analysing The Impact of Sequence Composition on Language Model Pre-Training”,在训练期间,我们使用注意力掩码来确保同一训练序列中来自不同文档的 token 不会相互关注。与 Llama 3 类似,这有助于更快、更稳定的长上下文训练,同时保持短上下文性能。

训练稳定性:遵循 OLMo 2 的做法,我们从嵌入层移除了权重衰减,以提升训练稳定性。这一修改带来了更稳定的训练动态,嵌入范数在训练过程中自然稳定在更健康的数值上,且在我们的消融实验中未影响整体性能。

所有这些改动都通过消融实验进行了验证,实验使用相同的 3B 架构,在来自 FineWeb-Edu 的 100B token 上训练,确保每项修改要么提升了性能,要么在保持性能的同时带来其他好处。

训练配置:我们使用全局批量大小 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,该策略混合了网络、数学和代码数据,且比例不断演变。我们在 3B 模型上进行了大量消融实验,使用 50B 到 100B token 进行训练,以确定数据混合和比例。


预训练包含以下阶段,如上图所示:

  • Stage 1: Stable phase (0T → 8T tokens) This foundation stage establishes strong general capabilities with our core dataset mixture:
    • 网络:85%(12% 多语言)- FineWeb-Edu、DCLM、FineWeb2 和 FineWeb2-HQ
    • 代码:12% - The Stack v2(16 种编程语言)、StarCoder2 拉取请求、Jupyter 和 Kaggle 笔记本、GitHub issues 以及 StackExchange。
    • 数学:3% - FineMath3+ 和 InfiWebMath3+
  • Stage 2: Stable phase (8T → 10T tokens) We introduce higher quality math and code datasets while maintaining good web coverage:
    • 网络:75%(12% 多语言)
    • 代码:15% - 添加 Stack-Edu
    • 数学:10% - 引入 FineMath4+、InfiWebMath4+ 和 MegaMath(包括 Qwen Q&A、Pro 合成重写以及文本-代码交错块)
  • Stage 3: Decay Phase (10T → 11.1T tokens) The final stage further upsamples math and code data
    • 网络:63%(12% 多语言)
    • 代码:24% - 对高质量代码数据进行上采样
    • 数学:13% - 对数学数据进行上采样,并引入指令和推理数据集,如 OpenMathReasoning

通过这些阶段和混合比例,我们为基础模型实现了非常有竞争力的性能。更多内容见评估部分。包含精确数据权重的 nanotron 训练配置可在此处找到。我们还将分享训练日志以及中间检查点。

在主要预训练之后,我们在中期训练阶段对模型进行了长上下文和推理方面的改进。

中期训练

我们将长上下文适应和推理适应称为“中期训练”。它们比主要预训练短得多,但仍然具有一定通用性,旨在提升模型在这两个领域的能力。让我们先看看长上下文训练。

长上下文扩展


在主预训练之后,我们又在 SmolLM3 上额外训练了 100B tokens,以扩展其上下文长度。我们分两个阶段依次扩展上下文窗口,每个阶段 50B tokens:首先从 4k 上下文过渡到 32k 上下文,RoPE theta 增加到 1.5M,然后从 32k 上下文过渡到 64k 上下文,RoPE theta 增加到 5M。两个阶段都对数学、代码和推理数据进行了上采样。在消融实验中,我们发现对特定的长上下文数据(如代码仓库、书籍和长网页,超出我们混合数据中自然存在的长样本)进行上采样,并没有进一步提升模型在 RULER 和 HELMET 基准上的性能。使用 NoPE 并在衰减混合数据上以更长的序列和更高的 RoPE theta 值进行训练,就足以在高达 64k 的上下文长度上实现有竞争力的长上下文性能。

继 Qwen2.5 之后,我们使用 YARN 来外推到训练上下文长度之外。在推理时,模型可以处理高达  128k 上下文(在 64k 训练长度基础上扩展 2 倍)。

推理中期训练

在扩展模型的上下文长度之后,我们在中期训练阶段对其进行了训练,以融入推理能力。中期训练阶段与预训练和后训练阶段的主要区别在于,我们针对的是一种通用能力,而尚未聚焦于特定领域。在我们的案例中,我们希望训练模型进行推理,而不针对数学或计算机代码等特定领域。

我们的中期训练数据集包含 35B tokens,来源于 Open Thought 的 OpenThoughts3-1.2M 以及 NVIDIA 的 Llama-Nemotron-Post-Training-Dataset-v1.1 的一个子集,其中包含来自 R1 的推理轨迹。我们使用了 ChatML 聊天模板和 wrapped packing ,以避免给模型提供过多的结构。我们将模型训练了 4 个 epoch(约 140B tokens),并将该检查点用于后续的 SFT 阶段。

后训练

像 DeepSeek R1 和 Qwen3 这样的推理模型的发布,展示了当模型能够进行显式推理时所涌现出的强大能力。然而,社区仍然缺乏带有公开数据集的完全开放的配方,来构建同时支持推理和非推理模式的双指令模型。大多数现有方法涉及复杂的强化学习过程和专有数据集,使得研究人员难以复现并在此基础上继续发展。

在本节中,我们解释了如何应对这些挑战,并分享了构建双指令模型的完整配方。我们详细介绍了如何通过精心设计的训练流程来平衡推理和非推理模式之间的性能,该流程包括针对通用推理能力的中期训练、带有合成数据生成的监督微调,以及使用 Anchored Preference Optimization (APO)——DPO 的一种近期变体——进行对齐。


构建聊天模板

在深入探讨训练方法之前,有必要明确用户如何与我们的双模式模型交互。聊天模板作为实现推理模式与非推理模式无缝切换的接口,其设计直接影响我们的训练数据格式和模型行为。SmolLM3 的聊天模板允许用户在对话过程中控制推理模式。用户可以通过在系统提示中分别加入 /think 和 /no_think 标志来激活推理或非推理模式。在非推理模式下,我们预先填充模型的响应为空思考块,类似于 Qwen3,以确保直接回答而不进行显式推理。

SmolLM3 支持工具调用,其聊天模板包含两个不同的工具描述部分:XML 工具和 Python 工具。这种特定的分类在我们的实验中被证明有助于模型准确解释每种格式的工具定义。

聊天模板为两种推理模式提供了默认系统消息,以及一个包含日期、知识截止日期和当前推理模式的元数据部分。用户可以通过提供具有 system 角色的消息来替换默认系统消息。通过在系统提示中使用 /system_override 标志,可以排除元数据部分,为特定用例提供灵活性。

监督微调

在推理中期训练阶段,我们在 140B 通用推理数据标记上训练了模型,随后进行监督微调(SFT),以整合数学、代码、通用推理、指令遵循、多语言和工具调用方面的推理与非推理模式能力。训练双模式模型需要仔细平衡数据混合,以在所有目标领域中保持两种模式的强大性能。为了评估 SmolLM3 在整个训练过程中的性能,我们跟踪了以下领域:数学、代码、通用推理、指令遵循和多语言。

在构建推理模式数据集时,我们遇到的主要挑战是某些领域缺乏包含推理轨迹的数据集。为了解决这一差距,我们通过使用现有非推理数据集的提示,在推理模式下提示 Qwen3-32B 来生成合成数据。这使我们能够在模型最初在推理模式下表现不佳的领域(如多轮对话、多语言和日常对话)提高性能。


我们的最终数据混合是广泛消融实验的结果,这些实验考察了推理与非推理标记的最佳比例以及每种模式内的组成。最终的 SFT 数据集包含 1.8B 标记:非推理模式 1B,推理模式 0.8B,包括 12 个非推理数据集和 10 个带有推理轨迹的数据集。我们使用 BFD(最佳适应递减)打包 训练了 4 个周期(约 8B 标记),并在用户轮次和工具调用结果上屏蔽了损失。

我们将发布这个数据混合以及完整的训练脚本,以使社区能够复现并基于我们的工作构建。

基于锚定偏好优化(APO)的离策略模型对齐

在 SFT 步骤之后,我们使用 Tulu3 偏好数据集(用于非推理模式)以及我们从 Qwen3-32B 和 Qwen3-0.6B 生成的新合成偏好对(用于推理模式)的组合,进行了一轮模型对齐。为确保非思考数据集中所有领域都得到覆盖,我们生成了补充性的思考模式偏好对。我们选择 Qwen3-32B 的生成结果作为“chosen”,Qwen3-0.6B 的响应作为“rejected”,用于 Anchored Preference Optimization 对齐。


Anchored Preference Optimization(APO)是 Direct Preference Optimization(DPO)的一种变体,提供了更稳定的优化目标。在 DPO 中,奖励函数 r_θ(x,y) 衡量的是训练过程中序列概率与训练开始时模型(即参考模型)概率的对数比:


这里 β 控制被优化模型相对于参考模型可以改变的程度。DPO 损失优化的是提示 x、chosen 响应 y_w 和 rejected 响应 y_l 组成的三元组:


APO 目标已被证明更加稳定,我们也在内部消融实验中观察到更高的下游性能。


虽然下游评估显示在数学、科学、指令遵循、编码、聊天和多语言任务上都有改进,但我们观察到在 RULER 等长上下文基准上性能下降。我们将这一下降追溯到推理中期训练阶段,在该阶段对推理能力的关注影响了长上下文性能。此外,APO 训练数据被限制在 24k tokens,因为我们的推理数据集绝大多数都低于这一长度。

为缓解这一性能下降,我们探索了模型合并作为解决方案。

模型合并

模型合并是一种流行且强大的技术,它允许结合不同模型的优势,而无需集成带来的计算开销,也无需额外训练。我们使用 MergeKit 库来执行模型合并,因为它包含多种合并方法,包括线性和非线性合并。

我们的合并配方包含两个步骤:

  1. 取每个 APO 检查点并创建一个模型“soup”。
  2. 将模型 soup 与一个具有强长上下文性能的中期训练检查点结合。对 APO 模型 soup 和中期训练检查点分别使用 0.9 和 0.1 权重的线性合并取得了最佳性能。我们能够在高达 128k tokens 的上下文上恢复基础模型的 RULER 分数。

得到的模型就是我们今天发布的检查点。它在广泛任务上保持了性能。那么让我们来看看这个模型以及基础模型的评估结果。

评估

我们在推理和非推理模式下评估基础模型和指令模型。让我们先介绍基础模型的性能!

基础模型

下图展示了 SmolLM3 在 12 个评估知识、推理、数学和编码能力的流行基准上的胜率。SmolLM3 始终优于其他 3B 模型,并与更大的 4B 模型(包括 Qwen3-4B 和 Gemma3-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 在英语之外也能保持一致的性能。


总而言之,基础模型在许多领域都展现出非常强劲的性能。让我们看看这如何转化为 instruct 模型的性能。

双模式 Instruct / 推理模型

由于 SmolLM3 同时具有 instruct 和推理模式,我们需要在两种模式下评估该模型,并与具有相同能力的模型进行比较。

不扩展思考评估

我们在多个基准测试中将 SmolLM3 与其他 3B 非推理模型进行评估,并在无思考模式下将其与 Qwen3 推理模型进行比较。如性能图表所示,SmolLM3 优于其他 3B 非推理模型,包括 Llama3.2 3B Instruct 和 Qwen2.5 3B Instruct,并处于推理模型之间的效率最佳点,显著优于 Qwen3 1.7B,同时以更低计算成本接近 4B 模型的性能。


因此,instruct 模型正好处于性能与成本的帕累托前沿。让我们看看推理模型表现如何!

扩展思考评估

在启用扩展思考评估 SmolLM3 的推理能力时,与不推理的对应模型相比,该模型在大多数基准测试中都显示出显著提升。我们在具有挑战性的任务中观察到明显增益,例如 AIME 2025(36.7% 对 9.3%)、LiveCodeBench 上的竞赛编程(30.0% 对 15.2%),以及 GPQA Diamond 上的研究生水平推理(41.7% 对 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,
)

智能体使用

SmolLM3 支持工具调用!只需在参数 xml_tools 下传入你的工具列表(用于标准工具调用),或 python_tools (用于在 <code> 代码片段中调用类似 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 上下文的小型、长上下文、多语言推理模型。除了模型检查点外,我们还发布了完整的训练配方,包括预训练、中期训练、后训练和合成数据生成,以及数据集(即将推出)。我们希望这个模型对社区有用,并且该配方能让其他团队在此基础上进一步改进。

资源

引用

@misc{bakouch2025smollm3,
  title={{SmolLM3: smol, multilingual, long-context reasoner}},
  author={Bakouch, Elie and Ben Allal, Loubna and Lozhkov, Anton and Tazi, Nouamane and Tunstall, Lewis and Patiño, Carlos Miguel and Beeching, Edward and Roucher, Aymeric and Reedi, Aksel Joonas and Gallouédec, Quentin and Rasul, Kashif and Habib, Nathan and Fourrier, Clémentine and Kydlicek, Hynek and Penedo, Guilherme and Larcher, Hugo and Morlon, Mathieu and Srivastav, Vaibhav and Lochner, Joshua and Nguyen, Xuan-Son and Raffel, Colin and von Werra, Leandro and Wolf, Thomas},
  year={2025},
  howpublished={\url{https://huggingface.co/blog/smollm3}}
}

来源:Hugging Face:Blog · huggingface.co