SPB Git

spb/forge Public MIT

Forge — LLM training from scratch in pure C++20 + Metal on Apple Silicon.

C++ 61.2% C 23% Python 7.6% TeX 7.2% CMake 1.1%
16.7 KB · 169 lines markdown
Rendered Raw Blame History
1<!-- Author: Simon-Pierre Boucher — contact@spboucher.ai -->23# Rendre un modèle < 1B paramètres capable de texte logique et utile4### Rapport de recherche — état de l'art 2023–2026, orienté Forge56*Synthèse de recherche web (arXiv, HuggingFace, Meta AI, Microsoft Research, DeepMind, blogs d'ingénierie), août 2026. Trois axes couverts en parallèle : données, architecture/entraînement, post-training/inférence.*78---910## TL;DR — la thèse en une phrase1112**La taille n'est plus le facteur limitant sous 1B : c'est (1) la qualité/adéquation des données, (2) la forme du réseau et la distillation, et (3) le compute dépensé à l'inférence.** Empilées, ces trois familles de techniques permettent aujourd'hui à des modèles 0.5–3B de battre des modèles 10× à 100× plus gros sur des tâches ciblées — et à des modèles de 7M–30M de produire du texte parfaitement cohérent dans un domaine restreint.1314Les preuves les plus spectaculaires :1516| Résultat | Petit modèle | Bat | Source |17|---|---|---|---|18| Cohérence narrative | TinyStories 28M | GPT-2-XL 1.5B (54× plus gros) | arXiv 2305.07759 |19| Code (HumanEval 45%) | phi-1-small **350M** | modèles 10× plus gros | arXiv 2306.11644 |20| MATH-500 (78.2 vs 71.4) | Llama-3.2-**3B** + test-time search | Llama-3.1-**405B** | arXiv 2502.06703 |21| MATH-500 (76.4 vs 74.6) | Qwen2.5-**0.5B** + TTS | GPT-4o | arXiv 2502.06703 |22| MATH-500 83.9% | R1-Distill-Qwen-**1.5B** (SFT seul) | GPT-4o, Claude 3.5 Sonnet | DeepSeek-R1 |23| ARC-AGI-1 ~45% | Samsung TRM **7M** (récursion ×16) | scores publiés de R1 / o3-mini | arXiv 2510.04871 |2425---2627## 1. Les données : le levier n°1 (et de loin)2829### 1.1 TinyStories — adapter la largeur des données à la capacité du modèle30Le résultat fondateur (Eldan & Li 2023) : des modèles de **1M à 33M** paramètres (parfois un seul bloc transformer) génèrent des histoires fluides, grammaticales et logiques quand le corpus est restreint au vocabulaire d'un enfant de 3–4 ans (~480M tokens synthétiques GPT-3.5/4).3132- Les capacités émergent **hiérarchiquement** : grammaire d'abord, cohérence contextuelle ensuite, créativité/logique de l'intrigue en dernier (le plus coûteux en capacité).33- **Largeur ↔ connaissances factuelles ; profondeur ↔ cohérence narrative.**34- **Pourquoi ça marche** : sur du web générique, un petit modèle gaspille sa capacité en vocabulaire et connaissances du monde qu'il ne pourra jamais contenir. Restreindre le domaine libère toute la capacité pour la grammaire, la logique et la cohérence. → *C'est exactement le régime des runs Forge actuels (vocab 4096, TinyStories) — le bon choix.*3536### 1.2 phi — « Textbooks Are All You Need »37- **phi-1 (1.3B)** : 7B tokens seulement — code web filtré par classifieur + manuels synthétiques GPT-3.5 → **50.6% HumanEval**. La version **350M atteint 45%** avec le même pipeline : preuve directe que la qualité des données change la ligue d'un sous-1B.38- **phi-1.5 (1.3B)** : +20B tokens synthétiques « façon manuel scolaire » sur 20K sujets choisis → égale Llama-2-7B / Vicuna-13B sur le sens commun.39- Microsoft parle de régime **« data-optimal »** : à taille de modèle fixée, on optimise les *données*, pas le modèle.4041### 1.3 FineWeb-Edu / SmolLM2 — le filtrage par classifieur, l'astuce au meilleur ROI42- **FineWeb-Edu** : Llama-3-70B note 500K pages web (valeur éducative 0–5), un petit classifieur entraîné dessus filtre 15T → **1.3T tokens** (seuil ≥3, >90% des tokens jetés) → **+5 pts MMLU/ARC à compute égal**.43- **DCLM** : un simple classifieur **fastText** gardant le top ~10% du web → **+6 pts MMLU**. Le filtrage par modèle (même minuscule) domine toutes les heuristiques.44- **SmolLM2** (le playbook ouvert de référence) : mélange web optimal **60% FineWeb-Edu + 40% DCLM refiltré** ; les modèles 135M/360M préfèrent un **mélange uniforme de haute qualité** (pas de curriculum), le 1.7B bénéficie d'un entraînement par étapes avec maths/code de haute qualité suréchantillonnés **dans la phase de decay du LR**.45- Constat clé pour les minuscules modèles : le contenu de **niveau collège** (simple mais correct) donne les meilleurs scores presque partout.4647### 1.4 Combien de tokens ? Chinchilla est mort pour les petits modèles48Le ratio 20 tokens/param est obsolète quand le coût d'inférence compte — on **sur-entraîne massivement** :4950| Modèle | Params | Tokens | Tok/param |51|---|---|---|---|52| SmolLM2-135M | 135M | 2T | ~15 000 |53| Qwen2.5-0.5B | 0.5B | 18T | ~36 000 |54| Llama-3.2-1B | 1B | 9T (+ distillation) | ~9 000 |5556- La qualité continue de monter jusqu'à **10 000+ tokens/param**.57- Contrainte de données : répéter un corpus curé de haute qualité est **quasi gratuit jusqu'à ~4 epochs**, rendements décroissants vers ~16, destructeur au-delà (Muennighoff, data-constrained scaling). → *Recette : curer dur, puis répéter ≤4×, plutôt que diluer avec du médiocre.*5859### 1.5 Données synthétiques (Cosmopedia) et curriculum60- **Cosmopedia** : 25B tokens générés par Mixtral, diversité assurée par graines web × (audience × style) — les deux leviers anti-effondrement : **couverture des sujets par seeds** et **conditionnement d'audience** (viser un jeune public = digestible par petit modèle).61- **Curriculum fin = évidence mixte-à-négative** (BabyLM : « largely unsuccessful »). Ce qui marche : la version grossière — **mélanges par étapes avec suréchantillonnage maths/code/raisonnement dans la phase de decay** (SmolLM2/3, phi).6263---6465## 2. Architecture & entraînement : la forme compte6667### 2.1 Deep-and-thin (MobileLLM, Meta ICML 2024)68Sous 1B, **la profondeur bat la largeur** :6970| Modèle | Couches | d_model | Zero-shot moyen | vs baseline |71|---|---|---|---|---|72| MobileLLM-125M | **30** | 576 | 46.3% | OPT-125M : 42.6% |73| MobileLLM-350M | **32** | 960 | 51.3% | Pythia-410M : 46.6% |7475Quatre choix empilés : SwiGLU + deep-and-thin + **embeddings liés** (à 125M, la table d'embedding ≈ 20% des params ; la lier libère du budget pour des couches) + **GQA** (ratio 3:1). Règle pratique 100–500M : **d_model / n_layers ≈ 20–30** (GPT-2 était à ~60).7677*Les configs Forge actuelles sont trop « larges » selon ce critère : gpt-50m est à 640/10 = 64 ; une variante MobileLLM-style serait ~20 couches × d_model 448.*7879- **Partage de blocs immédiat** (MobileLLM-LS) : chaque bloc exécuté 2× de suite → **+0.7–0.8%** à zéro paramètre ajouté. Idéal sur Apple Silicon (mémoire unifiée : re-exécuter des poids chauds coûte peu, la RAM est la contrainte). C'est une feature de config (`share_pattern`), pas une refonte.80- **Recursive Transformers relâchés** (DeepMind 2024) : un bloc partagé bouclé K fois + LoRA par boucle — Gemma-1B récursif ≈ Gemma-2B (58.4 vs 58.6) après seulement 60B tokens de reprise.8182### 2.2 Distillation : le plus gros levier de qualité individuel83- **Gemma 2** : entraîné sur les **logits du teacher pendant TOUT le pretraining** (au lieu des cibles one-hot) — la raison principale pour laquelle Gemma-2-2B joue en classe ~7B.84- **Llama 3.2 1B** : pruning structuré de Llama-3.1-8B + logits 8B/70B comme cibles token par token.85- **Qwen3-0.6B** : distillation off-policy puis **on-policy** (l'élève génère, KL contre le teacher sur ses propres échantillons). **MiniLLM** : KL inverse (l'élève n'étale pas sa masse sur les queues du teacher).86-*Pour Forge : stocker offline les top-16 logits d'un teacher (Qwen2.5-1.5B via l'endpoint MLX du cluster MacLustr) et ajouter un terme KL au kernel cross-entropy fusionné. Un seul kernel à modifier.*8788### 2.3 Hyperparamètres et optimiseur89- **µP (µTransfer)** : paramétrisation rendant le LR optimal invariant à la largeur — on règle sur un proxy minuscule, on transfère. Petits modèles = gros LR (~3e-3–1e-2 µP-scaled à 100–350M, vs le folklore 3e-4).90- **Schedule WSD** (warmup–stable–decay, MiniCPM) : plateau plat + cooldown court (10–20%) ≥ cosine, **prolongeable sans fixer max_steps à l'avance**, chaque checkpoint du plateau est reprenable — parfait pour le design « resumable » de Forge. Bonus : c'est pendant le cooldown qu'on injecte les données les plus précieuses.91- **Muon** : orthogonalisation Newton–Schulz du momentum sur les matrices 2D (AdamW pour embeddings/normes) — tous les records NanoGPT-speedrun depuis oct. 2024, **~35% plus rapide vers la loss cible**. Cœur = ~15 lignes, 5 itérations Newton–Schulz = quelques matmuls → *trivial à exprimer avec le kernel matmul Metal existant.*92- **Batch critique** ≈ 4M tokens ; 0.5–1M tokens/step est sûr à 100–350M (grad accum).9394### 2.4 Stabilité et petits plus architecturaux95- **QK-norm** (RMSNorm sur Q et K avant RoPE) : tue les spikes de loss — adopté par Gemma 3. Peu coûteux, recommandé.96- **z-loss** (~1e-4·log²Z) : se compose trivialement avec le kernel CE fusionné de Forge.97- **Attention sinks** (biais appris dans le dénominateur du softmax) : une ligne dans le kernel online-softmax.98- **Tokenizer** : sweet spot 32k–64k pour 100–500M (embeddings liés) ; **SuperBPE** (tokens multi-mots) : +4% moyen / +8.2% MMLU à compute fixe et 27–33% de tokens en moins.99- SSM/hybrides (Mamba, Zamba) sous 1B : sous-performants seuls sur le raisonnement court-contexte, complexité d'implémentation élevée — **basse priorité**.100101---102103## 3. Post-training, raisonnement, inférence : la vraie « révolution »104105### 3.1 Distillation de raisonnement — ça marche, avec un plafond106- **R1-Distill-Qwen-1.5B** : SFT sur ~800K traces générées par R1 → **83.9% MATH-500**, devant GPT-4o. **Pas de RL** sur le petit modèle : DeepSeek montre que distiller un gros raisonneur bat le RL direct à petite échelle.107- **Distilling Step-by-Step** (2023) : un T5 **770M** fine-tuné sur des rationales extraites d'un LLM **bat PaLM 540B few-shot**.108- **Le plafond (Small Model Learnability Gap, ACL 2025)** : ≤3B, les modèles apprennent mieux de **chaînes courtes et simples** que des méga-traces o1-style. Remède : **Mix Distillation** (mélanger CoT longs + courts, ou teachers gros + moyens).109110### 3.2 Test-time compute — le multiplicateur le plus spectaculaire111- HuggingFace (recette DeepMind) : **Llama-3.2-1B + beam search guidé par un PRM = Llama-3.1-8B** sur MATH-500 ; le **3B dépasse le 70B** (22× sa taille).112- arXiv 2502.06703 : **3B > 405B**, **0.5B > GPT-4o**, **R1-Distill-1.5B + TTS (91.6) > o1-preview (85.5)** — à 100–1000× moins de FLOPs d'inférence que les géants.113- Baseline gratuite : **self-consistency** (échantillonner k réponses CoT, vote majoritaire).114- Limite honnête : il faut un domaine **vérifiable** (maths/code) et un bon vérificateur — le PRM est la contrainte réelle.115116### 3.3 Récursion / profondeur adaptative — la capacité sans les paramètres117- **Huginn-3.5B** : bloc récurrent bouclé en espace latent au test — la perf de raisonnement monte avec les itérations jusqu'à l'équivalent d'un ~50B. Architecture indépendante de la taille.118- **HRM 27M → Samsung TRM 7M** : un réseau de 2 couches récursant ≤16 fois atteint **~45% ARC-AGI-1** (au-dessus des scores publiés de R1/o3-mini). Caveat : solveurs spécialisés par tâche, pas des LM généraux — mais la preuve que **l'itération peut remplacer les paramètres** sur le raisonnement structuré.119120### 3.4 Post-training à petite échelle (le playbook SmolLM2)1211. **SFT** sur ~1.1M instructions curées (SmolTalk), 2 epochs.1222. **DPO** sur UltraFeedback (le plus fiable à cette échelle).1233. **GRPO/RLVR bref** : sur R1-Distill-1.5B, 7K exemples, 24h, **42$** → AMC23 63→80%. Les gains arrivent dans les 50–100 premiers steps ; au-delà, déstabilisation. Ordre gagnant : **distiller d'abord, RL ensuite** (le RL échoue sur une base sans raisonnement préexistant).1244. Leçon générale : **la curation des données > la nouveauté algorithmique** sous 1B.125126### 3.5 Décodage — de la cohérence gratuite à l'inférence127- **min-p sampling** (ICLR 2025) : troncature dynamique selon la confiance du top-token — cohérence préservée même à haute température. Défaut solide (une réplication 2025 conteste l'ampleur, pas la direction).128- **DoLa** : contraster logits couches tardives vs précoces — **+12–17 pts TruthfulQA** sans entraînement.129- **Pénalités de répétition** : disproportionnellement importantes sous 1B (les petits modèles bouclent plus). → *À ajouter au CLI `forge generate` : min-p + repetition penalty, quelques lignes.*130- **RAG** : transforme la tâche de « tout savoir » en « lire et synthétiser » — ce que les sous-1B font bien (RETRO : 7.5B + retrieval ≈ GPT-3 175B).131- Débouché économique : les sous-1B sont les **drafters** idéaux du speculative decoding (2.3–6.5× de speedup pour les gros modèles).132133### 3.6 Ce à quoi les sous-1B servent vraiment (2025–2026)134Gemma 3 270M, Qwen3-0.6B, LFM2-350M : function calling, extraction structurée, résumé sur contexte fourni, classification/guardrails, autocomplete, draft models. **Des tâches étroites, vérifiables, fine-tunées** — pas du chat ouvert. (Gemma 270M fine-tuné : 58% → 85% sur une tâche mobile en quelques minutes de QLoRA.)135136---137138## 4. La recette Forge — feuille de route par phases139140**Phase A — quick wins (configs seulement)**1411. Config **deep-and-thin** : à 50M, viser ~20 couches × d_model 448 (ratio ~22) au lieu de 10 × 640 ; comparer sur le même train.bin.1422. Ratio GQA 3:1 (déjà supporté via `n_kv_heads`).1433. Sur-entraîner : viser des milliers de tokens/param ; répéter le corpus curé ≤4 epochs.144145**Phase B — entraînement (petits changements de code)**1464. **Schedule WSD** en plus de cosine dans `scheduler.h` (+ injection de données premium pendant le cooldown).1475. **QK-norm** + **z-loss** (kernel CE fusionné) pour la stabilité.1486. **Muon** pour les matrices 2D (Newton–Schulz = 5 matmuls, kernel existant), AdamW ailleurs.1497. **Partage de blocs immédiat** (`share_pattern` en config) : profondeur effective ×2 à RAM constante — taillé pour la mémoire unifiée.150151**Phase C — données (le plus gros gain)**1528. Pipeline **FineWeb-Edu** (subset) + Cosmopedia-style dans `prepare_data.py` ; ou rester TinyStories-style mais élargir progressivement le domaine (TinyStories-Instruct pour l'instruction-following à 50–200M).1539. Tokenizer 32k (lié) quand on sort de TinyStories ; envisager SuperBPE.154155**Phase D — capacité (moyen terme)**15610. **Distillation** : top-k logits d'un teacher servi par le cluster MacLustr (endpoint MLX), terme KL dans le kernel CE.15711. SFT + DPO à la SmolTalk sur le meilleur checkpoint.15812. `forge generate` : min-p, repetition penalty ; puis self-consistency (vote majoritaire) comme premier pas de test-time compute.159160---161162## 5. Sources principales163164**Données** : [TinyStories](https://arxiv.org/abs/2305.07759) · [phi-1](https://arxiv.org/abs/2306.11644) · [phi-1.5](https://arxiv.org/pdf/2309.05463) · [SmolLM2](https://arxiv.org/abs/2502.02737) · [FineWeb/-Edu](https://arxiv.org/html/2406.17557v1) · [DCLM](https://arxiv.org/abs/2406.11794) · [Data-constrained scaling](https://arxiv.org/pdf/2305.16264) · [Cosmopedia](https://github.com/huggingface/blog/blob/main/cosmopedia.md) · [BabyLM](https://arxiv.org/abs/2504.08165) · [Beyond Chinchilla-Optimal](https://arxiv.org/abs/2401.00448)165166**Architecture/training** : [MobileLLM](https://arxiv.org/abs/2402.14905) · [Recursive Transformers](https://arxiv.org/abs/2410.20672) · [MiniLLM](https://arxiv.org/abs/2306.08543) · [GKD](https://arxiv.org/html/2306.13649v1) · [Llama 3.2](https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/) · [Qwen3](https://arxiv.org/pdf/2505.09388) · [Gemma 3](https://arxiv.org/pdf/2503.19786) · [MiniCPM/WSD](https://arxiv.org/pdf/2404.06395) · [µP](https://arxiv.org/abs/2203.03466) · [Muon](https://kellerjordan.github.io/posts/muon/) · [Vocab scaling](https://arxiv.org/pdf/2407.13623) · [SuperBPE](https://arxiv.org/abs/2503.13423) · [Critical batch size](https://allenai.org/blog/critical-batch-size)167168**Post-training/inférence** : [R1-Distill](https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B) · [Distilling Step-by-Step](https://arxiv.org/abs/2305.02301) · [Learnability Gap](https://arxiv.org/abs/2502.12143) · [HF test-time compute](https://huggingfaceh4-blogpost-scaling-test-time-compute.hf.space/) · [1B > 405B?](https://huggingface.co/papers/2502.06703) · [RL small LLMs](https://arxiv.org/abs/2503.16219) · [RETRO](https://arxiv.org/abs/2112.04426) · [min-p](https://arxiv.org/abs/2407.01082) · [DoLa](https://arxiv.org/abs/2309.03883) · [Quiet-STaR](https://arxiv.org/abs/2403.09629) · [Huginn](https://arxiv.org/abs/2502.05171) · [Samsung TRM](https://arxiv.org/abs/2510.04871) · [Gemma 3 270M](https://developers.googleblog.com/en/introducing-gemma-3-270m/) · [LFM2](https://arxiv.org/abs/2511.23404)169