Post-training · 2025–26 · ten reports on one schema

LLM report diff

Ten model reports — seven from the onboarding reading list plus DeepSeek V4, Gemma 4 and GLM-5 — each read against the same skeleton: SFT → preference → verifiable-reward RL. OLMo 3 is the reference because it publishes every stage. Each tab opens with the thesis and the pipeline, then a stage-by-stage ledger: what the data was, who it was distilled from, which pipelines synthesized it, how it was filtered, the algorithm, the rewards and environments, and the schedule — with the numbers the reports actually give. The self-play papers from the same list have their own note: self-play for reasoning.

pretrain / baseSFT · distillationpreference · RLHFverifiable-reward RLother

Ai2 · Nov 2025 · report Dec 2025 ·source · arXiv · alphaXiv

OLMo 3 — the reference skeleton reference

ThesisThe model flow is the product: every stage, dataset, checkpoint and the RL code are released so the recipe itself can be studied, forked, and benchmarked against.

Architecture

  • 7B and 32B, dense
  • Dolma 3: 5.93T tokens → Dolmino 100B mid-training → Longmino long-context
  • 8k → 65k context

Openness

weights · yespretrain data · yespost-train data · yescode · yescheckpoints · yesrecipe · yes

Stages

  1. PretrainDolma 3 · 5.93T
  2. SFTDolci Think SFT · 2.27M
  3. DPODelta Learning · 200k pairs
  4. RLVROlmoRL · Dolci-Think-RL ~105k
  5. RL-Zero pathRLVR from base · no SFT

Pipeline

1 · Pretrain Dolma 3 · 5.93T Dolmino 100B mid-train Longmino ctx extension 2 · SFT Dolci Think SFT · 2.27M QwQ-32B + DeepSeek R1 traces 2 epochs · checkpoint soup 8× throughput on OLMo-core 3 · DPO Delta Learning · 200k pairs chosen: Qwen3-32B (thinking) rejected: Qwen3-0.6B (thinking) 1 epoch · early stopping matters 4 · RLVR OlmoRL · Dolci-Think-RL ~105k GRPO + DAPO + Dr GRPO tricks fully async · continuous batching 32k rollouts, mean >10k 5 · RL-Zero path RLVR from base · no SFT Dolci RL-Zero · 13.3k math simple prompts beat <think> pass@32 rises too

Stage by stage

1PretrainDolma 3 · 5.93T
Data
  • Dolma 3 (5.93T tokens), then a 100B-token Dolmino mid-training mix, then Longmino for context extension to 65k.
  • All released.
2SFTDolci Think SFT · 2.27M
Data
  • 2,268,468 prompts (7B).
  • Math: OpenThoughts3 math 753k (kept at 16× repetition) + STEM 99k + SYNTHETIC-2 verified 105k.
  • Code: Dolci Python Algorithms 467k + OpenThoughts3 code 89k + Nemotron post-training code 114k.
  • Precise IF: Persona IF 223k + Precise IF 136k.
  • Chat: WildChat 83k, OpenAssistant 7k.
  • Safety: CoCoNot 10k, WildGuardMix 38k, WildJailbreak 41k.
  • Aya 99k, TableGPT 5k, identity 290.
Distilled from
  • QwQ-32B regenerates incomplete OpenThoughts3 math traces at 32k (vs the original 16k), writes up to 16 code responses per prompt, and answers precise-IF prompts.
  • DeepSeek R1 supplies chat, safety, science and other-domain traces.
  • GPT-4.1 writes the unit tests that filter the code responses.
Synthetic
Persona-IF prompts regenerated with Nemotron-Personas; code prompts from AceCoder, The Algorithms, Llama-Nemotron post-training and OpenCodeReasoning get fresh QwQ solutions verified against GPT-4.1 test cases; IF responses kept only if every constraint verifier passes.
Filtering
  • Heuristics drop non-commercial licenses, incomplete chains, failed constraint/test checks, mentions of other model developers, repetition, and traces with excessive Chinese characters or political content.
  • Topic filter uses the OpenAI query taxonomy.
  • Decontamination: 8-gram matching, 50% overlap threshold, with math-symbol exceptions.
Schedule
  • Mixing ablated on a 100k OpenThoughts3 base mix + \(\le 100\text{k}\) per category.
  • Two epochs, learning-rate sweep, then a linear soup of the two best-LR checkpoints via mergekit.
  • Switching from Open Instruct to OLMo-core gave 8× throughput.
3DPODelta Learning · 200k pairs
Data
200,000 prompts: WildChat 40.7k, UltraFeedback 32.8k, FLAN 19.7k, Precise IF 19.4k, OpenThoughts3 science 19k, Python Algorithms 13.2k, Persona MATH 10.7k, Evol CodeAlpaca 7.6k, WildJailbreak 5.6k, WildGuardMix 5.3k, Aya 4.1k, and smaller sets.
Synthetic
  • Every pair is machine-made with one rule: chosen = Qwen3 32B in thinking mode, rejected = Qwen3 0.6B in thinking mode.
  • The observation that motivated it: further SFT on Qwen3-32B traces outright hurt the SFT model, so the traces are turned into a contrastive signal instead.
Algorithm
  • Plain DPO, one epoch, sweeping learning rate and dataset size — early stopping is important.
  • Rejected responses are left unfiltered on the theory that a bad rejection is a useful contrast.
Note
  • The Instruct path adds GPT-4.1-judged pairs with a delta-aware twist (always include a weak model, pick the worst as rejected), synthetic multi-turn self-talk and synthetic-context conversations, and a length-bias cap of 100 tokens between chosen and rejected.
  • Modernizing the old UltraFeedback pipeline with a better judge alone made things worse.
4RLVROlmoRL · Dolci-Think-RL ~105k
Data
  • 104,869 prompts for Think (171,950 for Instruct).
  • Precise IF: IF-RLVR 30.2k.
  • Math: OMEGA 15k, AceReason 6.6k, Open-Reasoner-Zero 3k, Klear-Reasoner 3k, DAPO-Math 2.6k.
  • Code: AceCoder 9.8k, Klear code 8k, SYNTHETIC-2 3k, Nemotron code 2.3k.
  • General chat: Tülu 3 SFT 7.1k, WildChat-4.8M 7.1k, Multi-Subject RLVR 7.1k.
Rewards / verifiers
  • Math: rule-based SymPy equivalence, 0/1.
  • Code: test cases executed on AWS Lambda, either pass-rate or all-pass.
  • IF: constraint functions, 1 only if every constraint holds.
  • Chat with reference: Qwen3-32B (thinking off) judge scores 0–1 against the reference.
  • Open chat: same judge, no reference.
  • Puzzle and length-control verifiers were tried and dropped.
Synthetic
  • Code RL data built by problem rewriting → solution generation → test generation, keeping items whose solution passes >80% of the generated tests.
  • Chat references rewritten with GPT-4.1; prompts kept only if a Qwen2.5-7B-OpenThoughts2 sampler scores mean F1 between 0.1 and 0.8 over eight tries — removes both noise and impossibles.
Filtering
  • Offline difficulty filter: 8 rollouts from the DPO checkpoint at temperature 1, drop prompts with pass rate >62.5% (7B).
  • The 32B skipped this and relied on active sampling over the 7B-filtered set.
  • Named OMEGA subtasks the model struggled with were downsampled 50%.
Algorithm
GRPO with: zero-gradient group filtering; active sampling to keep batch size constant; token-level loss; no KL; clip-higher; truncated importance sampling between vLLM and trainer logprobs; no standard-deviation normalization in the advantage (Dr GRPO) to remove the difficulty bias.
Scale
  • Fully asynchronous: DeepSpeed learner + a pool of vLLM actors, continuous batching, in-flight weight updates.
  • At 32k max / 14.6k mean length, static batching would waste up to 54% of compute.
  • 32B run: 8 training nodes vs 20 inference nodes; 7B: 2 vs 7, roughly 14× the compute on inference.
  • A step averaged 1000 s of which 125 s was training.
  • The 7B run took 15 days on the old stack and 6 on the new one; the 32B Think went 750 → 2300 steps for 3.1 and had not saturated.
5RL-Zero pathRLVR from base · no SFT
Data
  • Math: DAPO deduplicated and English-only, plus one representative per semantic cluster from Klear-Reasoner, Open-Reasoner-Zero and OMEGA, decontaminated against pretraining and mid-training data, then offline-filtered to drop prompts solved 8/8 by the base model → 13.3k prompts.
  • Code, IF and chat subsampled from Dolci-Think-RL.
Finding
  • Simple per-domain prompt templates greatly outperform post-training templates like <think></think> when starting from a base that never saw special formatting.
  • Training at 16k response length, evaluating at 32k and temperature 1: AIME pass@1 jumps in the first few hundred steps, then climbs slowly; pass@32 also rises, so diversity is preserved.
Note
Positioned as a clean benchmark for RL algorithms — fully open pretraining data means spurious rewards from contaminated mid-training can be ruled out.

What makes it the reference

  • This is the baseline every other tab is diffed against.
  • Distinctive: Delta-Learning DPO (rejected = a much weaker version of the same family), verifiers for chat via an LM judge inside RLVR, and an RL-Zero path that skips SFT entirely.
  • Everything is released, including the RL infrastructure — which is the thesis, not a side effect.

Sources are the linked reports; “not disclosed” means absent from them. Pipeline boxes are not to scale — stage volumes are in mixed units and are labeled instead. Counts are quoted as printed in each report; where a report's table and prose disagree (Apertus SFT: 4.18M vs “~3.8M”) the table is used.