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