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