Thinking Machines' first open-weights model is a 975-billion-parameter Mixture-of-Experts that wakes only 41 billion of them per token — and every block in it is a decision you can understand. This is the teardown: the sigmoid router and its balancing bias, Muon, the 5:1 attention weave, the thinking-effort knob, and the model that fine-tuned itself. Four of the ideas come with live labs you can run in this page.
Every idea in this lesson, drawn as a map. Amber is architecture, terracotta is training, blueprint is behavior, moss is trust. Hover to preview a concept; click to jump to its chapter. Nodes with a blue ring have their own dedicated lesson on this site — shift-click (or ⌘-click) to open it.
A model release note reads like a parts list: "sigmoid router," "auxiliary-loss-free bias," "Muon," "relative positional embeddings," "proper scoring rules." A parts list tells you what was chosen. It never tells you why each part exists, what problem it kills, or how the parts lean on each other. That is what this map is for. Every arrow means "you'll understand this better if you understand that first."
architecturetrainingbehaviortrust & ecosystemhas its own lesson
The single sentence that organizes everything on this map: Inkling is not trying to be the best model — it is trying to be the best starting point. Every design choice bends toward that goal: sparse so it is cheap to run, open so you can own it, calibrated so you can trust it, effort-controllable so you can afford it, and wired into a fine-tuning platform so you can change it.
00bHow to read this lesson
Eleven chapters, four of them with live laboratories. You can read linearly or raid the map.
Chapters 1–4 are the machine: what a sparse Mixture-of-Experts is and why 975B-total/41B-active is a bet, how tokens get routed to experts without trampling each other, how attention is woven to survive a million tokens, and how Muon trains the whole thing. Chapters 5–7 are the behavior: the post-training recipe, the thinking-effort dial, and what the model can actually do — including fine-tuning itself. Chapters 8–10 are the senses and the receipts: multimodal input, the epistemics training that makes its confidence mean something, and the honest report card.
Four chapters carry a ⚖ live lab — a real experiment we designed, ran, and verified while writing this lesson. Each lab is a complete piece of working numpy that reproduces one of Inkling's core mechanisms at a size small enough to run in your browser (a Python runtime loads on demand; nothing is installed). The numbers quoted in each lab's green results box are from our actual runs — when you press run, you should get exactly the same ones, and then you should start breaking things: every lab ends with a list of knobs to turn.
Ch 2 · The Router Balance Lab — watch unbalanced experts drop 7% of their tokens, then fix it two ways and see why the bias wins.
Ch 4 · The Muon Race Lab — race SGD, Adam, and Muon on the same ill-conditioned task; watch orthogonalization pay.
Ch 7 · The Lipogram Lab — rebuild Inkling's self-fine-tuning demo with a 4-gram model that learns to never say "e".
Ch 9 · The Calibration Lab — train the same forecaster on a proper and an improper reward and watch honesty appear and disappear.
Prerequisites, honestly stated. You should know what a transformer is at the level of "attention mixes information across positions, MLPs transform it, and the whole thing is trained by gradient descent." If that sentence is shaky, read the Transformer lesson first — twenty minutes there will double what you take from this page. Everything else — MoE, Muon, routing, calibration — is built from zero right here.
00cConcept index
The eighteen ideas on the map, one line each.
CH 1
architecture
The sparse bet
975B parameters of capacity, 41B of per-token compute. Why the ratio is the product.
CH 2
architecture
MoE routing
256 routed + 2 shared experts per layer, 6 awake per token, chosen by a sigmoid router.
CH 2
architecture
Aux-loss-free balancing
A per-expert bias that steers selection without corrupting the mixing weights. Lab inside.
CH 3
architecture
The 5:1 attention weave
Five sliding-window layers per global layer, 8 KV heads — how a million-token context stays affordable.
CH 3
architecture
Relative positions
Offsets, not addresses. Why relative embeddings extrapolate past the lengths they trained on.
CH 3
architecture
Short convolutions
Tiny depthwise filters after the KV projections and on residual outputs — cheap local structure.
CH 4
training
Muon
Orthogonalize the momentum matrix so updates push equally in every direction. Lab inside.
CH 4
training
Weight decay ∝ lr²
Couple the decay to the schedule and weight norms stop wandering across training horizons.
CH 5
training
SFT bootstrap
A small synthetic warm-up from open models (Kimi K2.5), then the real budget goes to RL.
CH 5
training
30M-rollout RL
Two continuous runs, reasoning score 0.264 → 0.356, and chains of thought that compressed themselves.
CH 6
behavior
Thinking effort
A dial from 0.2 to 0.99. Same weights, chosen spend — matching a rival at a third of the tokens.
CH 7
behavior
Self-fine-tuning
Inkling planned, trained, evaluated, and loaded its own lipogram fine-tune via Tinker. Lab inside.
CH 8
behavior
dMel audio
Spectrogram bins as tokens — speech becomes a sequence the transformer already understands.
CH 8
behavior
hMLP patches
40×40 pixel patches through a four-layer MLP. No vision tower, one shared stream.
CH 9
trust
Proper scoring rules
Rewards that make honesty optimal. The mechanism behind Inkling's calibration. Lab inside.
CH 9
trust
The dual grader
A rubric checker plus an agentic fact-checker — instruction following graded from two angles.
CH 10
trust
Inkling-Small
276B/12B preview that matches its big sibling on surprisingly much — and out-follows it.
CH 10
trust
Tinker & the ecosystem
Weights on Hugging Face, fine-tuning on Tinker, serving everywhere — the release is the product.
01What was released
On July 15, 2026, Thinking Machines Lab shipped its first open-weights model — and told you, unusually plainly, what it is not.
Most model launches climb a podium. This one drew a floor plan. Thinking Machines describes Inkling not as the strongest model available but as "a good open-weights base for customization" — a deliberate, almost contrarian positioning in a market that sells leaderboard positions. The company's stated mission is building AI that "extends human will and judgment," and the release note reads like a spec sheet for exactly that: a model you can inspect, run anywhere, dial the cost of, and — the load-bearing part — retrain into whatever you actually need.
The headline numbers, which the rest of this lesson will take apart one by one:
Property
Value
Where we dissect it
Total parameters
975 billion — a Mixture-of-Experts transformer
Ch 1, 2
Active per token
41 billion — ~4.2% of the model wakes up per token
Ch 1, 2
Context window
up to 1 million tokens
Ch 3
Training data
45 trillion tokens of text, images, audio, and video
Ch 8
Optimizer
Muon for matrix weights, Adam for the rest
Ch 4
Post-training
small SFT bootstrap, then RL at 30M+ rollouts
Ch 5
Reasoning
controllable thinking effort, 0.2 to 0.99
Ch 6
Hardware
trained on NVIDIA GB300 NVL72 systems
Ch 4
Weights
Hugging Face (thinkingmachines/inkling), incl. an NVFP4 checkpoint
Ch 10
There is also a smaller sibling, Inkling-Small (276B total, 12B active), released as a preview — it will ambush us with a lesson about instruction following in Chapter 10.
Keep one tension in mind for the whole lesson: every number above is a trade, not a triumph. 975B total buys knowledge capacity; 41B active buys serving cost; the gap between them is paid for with routing machinery that can fail in interesting ways. Chapter 2 is about exactly how it fails and what Inkling does about it.
01bThe sparse bet, by hand
Why build a 975-billion-parameter model and then refuse to use 96% of it on every token? Do the arithmetic and the strategy falls out.
The cost of a dense token
Start with the rule of thumb that governs every transformer budget. When a token flows through a dense model with $N$ parameters, essentially every parameter participates in one multiply and one add. So the forward pass costs roughly:
$N$ — the parameter count. Each weight is used once per token in a matrix multiply.
$2$ — one multiply plus one add per weight. (Attention adds a context-dependent term we will meet in Chapter 3; for the sizes here it is the smaller piece.)
Now plug in the two models Inkling could have been:
Worked, with all the zeros. A dense 975B model: $C = 2 \times 975 \times 10^9 = 1.95 \times 10^{12}$ — about 1.95 teraFLOPs for every single token it reads or writes. Generating a 1,000-token answer costs ~1.95 petaFLOPs of matrix math, before attention.
Inkling as shipped activates 41B parameters per token: $C = 2 \times 41 \times 10^9 = 8.2 \times 10^{10}$ — 82 gigaFLOPs per token. Same 1,000-token answer: ~82 teraFLOPs.
Ratio: $1.95\,\text{T} / 82\,\text{G} \approx 23.8$. The sparse model is ~24× cheaper to run per token than a dense model of the same size — and, the release note argues, far more knowledgeable than a dense 41B model trained on the same data.
Where the 41B comes from
The 41B is not a knob someone typed in; it is the sum of everything that is always awake plus the slice of experts the router wakes. We can reverse-engineer the split from the two published numbers. Call $S$ the always-active parameters (attention layers, embeddings, the 2 shared experts, norms) and $R$ the parameters living in routed experts. Two equations:
Solving the published totals for the hidden split
$$ S + R = 975\,\text{B} \qquad\quad S + \tfrac{6}{256}\,R = 41\,\text{B} $$
Subtract the second from the first: $R\,(1 - \tfrac{6}{256}) = 934\,\text{B}$, so $R \approx 956\,\text{B}$ and $S \approx 19\,\text{B}$. Read that twice: about 98% of Inkling's parameters live in routed experts, and the "model" you always run — attention, embeddings, shared experts — is only ~19B, smaller than many open dense models. The other 956B is a library the router checks books out of, six at a time.
(This split is inferred, not published — it is the unique pair consistent with 975B total, 41B active, and 6-of-256 routing. Treat the two significant figures as solid and the rest as illustration.)
Why capacity and compute want to be different numbers
The empirical fact that motivates every MoE: a model's knowledge — facts, idioms, rare APIs, low-resource languages — scales with how many parameters it has, while the cost of each token scales with how many parameters it touches. A dense model handcuffs the two numbers together. A sparse model splits them, so you can buy knowledge and serving cost separately.
And the split is not just an inference trick — it reshapes training too. Recall the training budget rule of thumb: total training compute $\approx 6 \times N_{\text{active}} \times D$ for $D$ training tokens (forward + backward is ~3× the forward cost). For Inkling's 45T tokens:
Training cost, both worlds. Dense 975B on 45T tokens: $6 \times 975{\times}10^9 \times 45{\times}10^{12} \approx 2.6 \times 10^{26}$ FLOPs. As-built (41B active): $6 \times 41{\times}10^9 \times 45{\times}10^{12} \approx 1.1 \times 10^{25}$ FLOPs — the same ~24× saving, which is the difference between "possible on GB300 NVL72 clusters this year" and "not happening."
01cWhat sparsity does not buy
The router saves compute. It saves nothing else — and the honest costs explain half of Inkling's other design choices.
Memory is paid in full. All 975B parameters must sit in accelerator memory (or be shuffled at painful cost), because the router might summon any expert for the very next token. At 8 bits per weight that is roughly $975 \times 10^9 \times 1\,\text{byte} \approx 975\,\text{GB}$ just for weights — a multi-GPU serving footprint no matter how clever the routing. This is why the Hugging Face release includes an NVFP4 checkpoint (4-bit floating point): $\approx 490$ GB moves the model from "cluster" toward "fat node."
Communication is new pain. Experts are sharded across devices; every token's hidden state must travel to wherever its 6 experts live and come back. That all-to-all traffic is the tax dense models never pay — and it is worst exactly when routing is unbalanced, which is one more reason Chapter 2's balancing story matters beyond quality.
Batch efficiency depends on balance. A GPU hosting a "hot" expert stalls the step for everyone. The advertised 24× saving is an average that only materializes if tokens spread evenly — the entire subject of the ⚖ lab in the next chapter.
A useful slogan for the whole architecture: MoE converts a compute problem into a logistics problem. The FLOPs get cheaper; in exchange you must run a tiny, latency-critical shipping company inside every layer. Chapter 2 is about keeping that shipping company honest.
01dInteractive: the expert wall
One layer's 256 routed experts as a wall of tiles. Watch tokens light up their six; drag the slider to feel how the active-parameter budget moves.
Each frame, a new "token" arrives and the router wakes k tiles (amber) plus the 2 shared experts (terracotta, always on). The readout does the arithmetic from the previous section live: active parameters $= 19\,\text{B} + \frac{k}{256} \times 956\,\text{B}$, and FLOPs per token $= 2 \times$ that. At the shipped $k=6$ you should read ~41B and ~82 GFLOPs.
routed expert, awake for this tokenshared expert (always awake)asleep
Two things to notice while it runs. First, the wall is mostly dark at every moment — that darkness is the 24× saving. Second, watch which tiles light up over many tokens: the pattern is not uniform, because real token streams are not uniform. Some experts are simply more popular. Hold that thought; it is the villain of Chapter 2.
01eWhy give it away
Open weights are not charity. They are the front door of a product.
Read the release as a system and the business logic is clean. The weights are free on Hugging Face — anyone can serve them via SGLang, vLLM, llama.cpp, or a half-dozen partners (Chapter 10 has the full roster). But the moment you want the model to be yours — your domain, your tone, your tools — you need fine-tuning infrastructure, and that is Tinker, Thinking Machines' hosted customization platform, where Inkling launches with native support, 64K and 256K fine-tuning contexts, new audio recipes in the cookbook, and a 50%-off launch price.
Once you see that, the model's odd-sounding design goals snap into focus:
"Not the strongest, a good base." A base model's job is to be improvable and predictable, not to win benchmarks it will be fine-tuned away from anyway.
Sparse, with a knob. Customers who own their serving bill care about the 24× more than about two leaderboard points. The thinking-effort dial (Chapter 6) is the same instinct applied to reasoning tokens.
Calibrated and censorship-resistant (Chapter 9). If the model is a component in your system, its confidence numbers must be load-bearing and its refusals must be yours to define, not silently inherited.
Multimodal by default (Chapter 8). A base that cannot hear or see forces every customer to bolt on towers; one shared token stream keeps fine-tuning simple.
The one-sentence strategy. Sell the razor-blades (fine-tuning and serving), give away the razor (weights) — and design the razor so that every property a customizer cares about (cost, trust, dialability, modality) beats every property a leaderboard cares about.
01fConcept check
Chapter 1 · one question
Inkling is "975B total, 41B active." Which statement correctly describes what this buys and what it costs?
02Anatomy of one MoE layer
Replace the transformer's one big MLP with 258 small ones and a receptionist. That's the whole trick — everything else is keeping the receptionist honest.
In a dense transformer, every layer has one MLP (also called the feed-forward block): two matrix multiplies with a nonlinearity between them, applied identically to every token. It is where most parameters live and — the standard reading — where most of the model's stored knowledge lives.
Inkling's MoE layers replace that single MLP with:
256 routed experts — small independent MLPs. Any given token will use exactly 6 of them.
2 shared experts — MLPs that process every token, no routing involved.
A router — a tiny linear layer that looks at the token's hidden state and scores all 256 experts: "how useful would each of you be for this token?"
The layer's output is a weighted sum: the 2 shared experts' outputs plus the 6 chosen experts' outputs, each scaled by a gate weight from one jointly normalized score vector — all 8 contributing experts share a single normalization. Two design questions hide in that sentence, and they are the two ideas of this chapter: how do you score (sigmoid, not softmax), and how do you keep the choosing fair (a bias, not a loss).
Why shared experts exist at all
If routing is so great, why keep 2 experts that everyone visits? Because some computation is common: basic syntax, token-level bookkeeping, the boring glue of language. Without shared experts, every routed expert must relearn that glue — 256 redundant copies of "how commas work" — wasting exactly the capacity the MoE was built to win. Give the common work a guaranteed home and the routed experts are free to specialize. (This is the DeepSeek lineage of MoE design, which Inkling explicitly follows; the same paper introduced the balancing trick we meet below.)
Mental model: the layer is a hospital. The two shared experts are triage — everyone passes through. The 256 routed experts are specialists, and the router is the front desk deciding which 6 specialists each patient sees. The chapter's problem, in hospital terms: the front desk keeps sending everyone to the same famous surgeon, the surgeon has a fixed number of slots per day, and patients who overflow get no specialist at all.
02bSigmoid, not softmax
A one-word change in the router with real consequences: experts stop competing for probability mass.
The classic MoE router (Shazeer 2017, Switch, Mixtral) computes a softmax over expert logits: 256 numbers that must sum to 1, of which the top-k survive. Inkling — following DeepSeek-V3 — scores each expert with an independent sigmoid instead:
$\mathbf{x}$ — the token's hidden state entering the layer.
$\mathbf{w}_i$ — expert $i$'s routing vector: a learned direction meaning "tokens like this are my specialty."
$s_i = \sigma(\cdot)$ — the affinity: an independent 0-to-1 score. One expert scoring high does not force another to score low — that is the break from softmax.
$b_i$ — the balancing bias, the star of this chapter. Note precisely where it appears: inside the top-6 selection, and nowhere else.
$g_i$ — the gate: the 6 chosen routed experts' and 2 shared experts' affinities, jointly renormalized — all 8 contributing experts share one normalization. The bias never touches this — the mixture is weighted by honest scores.
Why does independence matter? Two practical reasons. First, gradients stop fighting: under softmax, pushing one expert's score up mechanically pushes every other expert's score down, so 256 experts play tug-of-war through one normalizer. Sigmoid scores train independently. Second, the scores mean something absolute: $s_i = 0.9$ says "strong match" regardless of what the other 255 scores are, which makes them usable as gate weights directly — and makes the balancing story below much cleaner.
the whole router, numpy
defmoe_layer(x, all_experts, W_r, b): # x: [d] one token
s = sigmoid(x @ W_r.T) # [258] affinities: 256 routed + 2 shared
top = argtop6(s[:256] + b) # bias steers WHO is picked (routed only)...
idx = concat([top, [256, 257]]) # ...plus the 2 always-on shared experts
g = s[idx] / s[idx].sum() # ONE joint normalization over all 8
out = 0for g_k, e in zip(g, all_experts[idx]):
out += g_k * e(x) # 8 contributors, honest weightsreturn out
02cA routing decision, by hand
Four experts, top-2, every number visible. Watch what the bias does — and what it refuses to do.
Shrink the layer to 4 experts choosing top-2 so we can track every digit. (A routed-only toy: we leave out the 2 shared experts' share of the joint normalization to keep the arithmetic on one hand — the bias mechanics are identical either way.) A token arrives whose hidden state gives router logits $z = [0.5,\; 0.45,\; 0.44,\; -0.5]$. Sigmoids:
Step 1 — affinities. $\sigma(0.5)=0.622$, $\sigma(0.45)=0.611$, $\sigma(0.44)=0.608$, $\sigma(-0.5)=0.378$. Experts 1, 2, 3 are nearly tied — this token would be happy with any pair of them; expert 4 is a poor match.
Step 2 — selection, no bias. Top-2 by affinity: experts 1 and 2. Gates: $g_1 = 0.622/(0.622+0.611) = 0.504$, $g_2 = 0.496$. Nearly a 50/50 blend.
Step 3 — now suppose expert 1 has been overloaded all morning, so the balancer has drifted its bias to $b_1 = -0.02$ (and, say, $b_3 = +0.001$ from mild underload). Selection scores: $[0.602,\; 0.611,\; 0.609,\; 0.379]$. Top-2 is now experts 2 and 3 — the tie broke the other way.
Step 4 — gates for the new pair, computed from the raw affinities, not the biased scores: $g_2 = 0.611/(0.611+0.608) = 0.501$, $g_3 = 0.499$. The output quality barely moved — 0.608 was almost as good a match as 0.622 — but one unit of load just migrated off the hot expert.
That is the entire mechanism, and its elegance is worth saying out loud: the bias only ever flips near-ties. A token that strongly needs expert 1 ($s_1 = 0.95$, everyone else 0.5) sails through a $-0.02$ bias untouched. Tokens that are roughly indifferent get gently redistributed. Load balancing happens exactly where it is cheapest, and the mixing weights — what actually multiplies the experts' outputs — never learn that any of this happened.
02dThe rich-get-richer problem
Why routers collapse without help, and what it costs when they do.
Real token streams are lumpy: code, English, numbers, and boilerplate do not arrive in equal measure, so some experts' specialties are simply in higher demand. Left alone, this compounds. A popular expert sees more tokens, so it trains more, so it gets better, so its affinities rise, so it is selected even more — the rich-get-richer loop. Meanwhile unpopular experts starve: barely trained, barely useful, dead weight in your 975B.
The acute symptom is worse than the chronic one. Every expert has a capacity — a maximum number of tokens per batch it can process, set by memory and the all-to-all communication schedule (Chapter 1's logistics tax). When a hot expert's queue exceeds capacity, the overflow tokens are dropped: they simply do not get that expert's contribution, and the layer output is computed from whatever remains. Dropped tokens are silent quality damage — nothing crashes, the model just gets a little dumber on exactly the popular topics.
The classic fix (Switch Transformer and its descendants) is an auxiliary load-balancing loss: add a term to the training objective that punishes uneven expert usage. It works — but look at what it touches. The aux loss's gradient flows into the router's weights, the same weights that produce the affinities that become gate values. You are deliberately corrupting the router's opinion of which expert is best, in order to fix a logistics problem. The two objectives — "route to the best expert" and "route evenly" — fight inside one set of parameters, and the tug-of-war costs model quality.
02eThe aux-loss-free bias
DeepSeek-V3's answer, adopted wholesale by Inkling: separate the two jobs. Selection gets a knob; the gates stay honest.
The balancing rule (after each batch)
$$ b_i \leftarrow b_i + \gamma \cdot \mathrm{sign}\!\left(\bar{L} - L_i\right) $$
$L_i$ — expert $i$'s load this batch: how many tokens selected it.
$\bar{L}$ — the ideal load: total selections divided by 256.
$\mathrm{sign}(\cdot)$ — overloaded experts get their bias lowered by $\gamma$; underloaded experts get it raised. No gradients, no loss term — a plain feedback controller bolted onto the selection step.
$\gamma$ — a small step (the lab below uses 0.01 on affinities that live in 0–1). It accumulates: an expert overloaded for 30 straight batches carries $b_i = -0.3$.
Three properties make this better than it looks:
It cannot corrupt the mixture. The bias appears in $\text{top-}6(s_i + b_i)$ and nowhere else. Gate weights are computed from raw $s_i$. However hard the controller pushes, the quality of the blend for whichever experts are chosen is untouched — the failure mode is bounded by construction.
It acts on near-ties first. As the hand example showed, a bias of $\pm0.02$ only flips decisions where the affinities were within 0.02 anyway — the tokens that had the least to lose from being rerouted.
It fails gently. Crank $\gamma$ ten times too high and selection gets a bit sloppy — measurably, in the lab below, a few percent of drops return. Crank an aux-style penalty ten times too high and the whole routing system oscillates. When you are training one model for months on GB300 clusters, "how does this fail when mistuned" is not an academic question.
The design pattern generalizes far beyond MoE and is worth stealing: when one signal must serve two masters, split the signal. Selection needed fairness; mixing needed honesty. The bias gives each job its own channel instead of making one number lie to serve both.
02fInteractive: nudge the router
Eight experts, one token, and a bias slider on the hottest expert. Find the flip point — and watch what the gates do.
The bars are one token's affinities $s_i$ (amber). The outline shows the selection score $s_i + b_i$ as you drag expert 1's bias. Ticks mark the top-3 selection; the readout prints the gates — computed, as always, from the raw affinities of whoever is selected. Press new token to resample.
affinity s (sets the gates)selection score s + bselected (top-3)
Two things to try. First, drag the bias down slowly and notice selection flips happen one near-tie at a time — there is no cliff. Second, watch the printed gates at the moment of a flip: the newcomer enters with nearly the same gate weight the evicted expert had, because near-ties are precisely the tokens for which the substitution is cheap.
02g⚖ Run the experiment: the Router Balance Lab
We built the whole routing floor in 80 lines of numpy — lumpy tokens, capacities, drops — and raced three balancing strategies. Run it yourself, then break it.
⚖ The Router Balance Lab ✓ verified run
64 experts, top-6, Zipf-lumpy tokens, hard capacities — no balancing vs. score penalty vs. selection-only bias.
Hypothesis. Without balancing, hot experts overflow capacity and drop tokens. A score penalty and a selection-only bias can both restore balance — but the penalty bends the same scores that weight the output mixture, so it should degrade quality or destabilize when pushed, while the bias cannot touch the gates by construction.
Our verified run: no balancing → MaxVio ≈ 1.2 (hottest expert at 2.2× its fair share), 7.1% of expert slots dropped, layer quality 93.5%. Score penalty (α=0.6) → MaxVio 0.25, 0% dropped, 99.2%. Selection-only bias (γ=0.01) → MaxVio 0.26, 0% dropped, 99.1%. The two fixes tie — until you mistune them: α=3.0 thrashes to 39.9% dropped and 60.4% quality, while γ=0.05 merely slips to 5.2% dropped, 94.5%. The bias fails gently; the penalty fails catastrophically.
Lab notebook — what our run found
Setup. 64 experts (scaled from Inkling's 256 so it runs in seconds), embedding dim 32, top-6 routing, 2,048 tokens per batch, 100 routing steps. Tokens are drawn from a Zipf distribution over expert specialties — expert 0's home cluster is ~30× more common than expert 63's — then jittered, so affinities are realistic: lumpy with lots of near-ties. Every expert has a hard capacity of 1.25× the ideal load; overflow tokens are dropped exactly as in production MoE serving. We measure DeepSeek's MaxVio (hottest expert's demand over ideal, minus 1), the drop rate, and a layer quality score: how much true affinity the surviving weighted mixture captures versus an uncapacitated oracle.
Result 1 — doing nothing is expensive. Unbalanced, the hot experts sit at 2.2× fair share all run (MaxVio ≈ 1.2 never improves), 7.1% of expert slots go over capacity and get dropped, and quality sits at 93.5% — a persistent ~6.5% tax paid precisely on the most common token types.
Result 2 — at their best settings, the two fixes tie. Both the score penalty (α=0.6) and the bias (γ=0.01) drive MaxVio to ~0.25 and drops to zero, with quality ~99%. In a frozen-router sandbox, gate distortion from a well-tuned penalty is real but small.
Result 3 — the difference is the failure mode. At α=3.0 the penalty overshoots each step, the load EMA lags, and the system oscillates: MaxVio averages 2.7, 39.9% of slots drop, quality craters to 60%. The bias at 5× its good setting (γ=0.05) just gets slightly sloppy: 5.2% drops, 94.5% quality. A selection-only offset is structurally incapable of corrupting the mixture, so pushing it harder cannot create a new failure class.
What does NOT transfer. Our router is frozen — affinities never train. The production argument for aux-loss-free balancing has a second half we cannot show here: a true auxiliary loss injects a competing gradient into router training for the model's whole life, and that interference compounds in ways a routing sandbox cannot measure. Treat this lab as the selection-vs-gates story and the mistuning story, not the full training-dynamics story.
Things to try
· ALPHA=3.0 — watch the score penalty thrash (40% drops in our run)
· GAMMA=0.05 — the bias mistuned 5×: barely worse
· CAP=1.0 — tight memory: which arm suffers first?
· K=2 — sparser routing: near-ties get rarer, does the bias still work?
02hConcept check
Chapter 2 · one question
Inkling's balancing bias $b_i$ is added to the router score. Why is it added only inside the top-6 selection, and not carried into the gate weights?
03The bill for a million tokens
Inkling advertises a context of up to one million tokens. Nobody gets that by scaling vanilla attention — the arithmetic forbids it.
Standard full attention lets every token attend to every earlier token. Two costs grow with context length $n$, and they grow differently:
Compute per new token: the fresh token must score against all $n$ predecessors — cost $\propto n$ per layer, per head. Annoying but survivable.
Memory for the KV cache: to avoid recomputing the past, serving systems store every layer's keys and values for every token seen so far. That storage is the KV cache, it grows $\propto n \times \text{layers}$, and at $n = 10^6$ it is the thing that actually kills you. We will compute it to the byte in a moment.
Every long-context model is therefore a bundle of decisions about where full attention is worth paying for. Inkling's bundle has three parts: a 5:1 weave of local and global layers, only 8 KV heads, and positional information carried as relative offsets. Each one attacks a different term of the bill.
03bThe 5:1 weave
Five layers look through a window; the sixth looks at everything. Most language is local — charge accordingly.
A sliding-window attention (SWA) layer restricts each token to attend only to its last $w$ predecessors — a fixed-width window that slides along the sequence. Its per-token cost and its KV contribution stop growing once the context passes $w$: the cache for that layer holds only the newest $w$ tokens' keys and values, a ring buffer instead of a ledger.
Why is that not a catastrophic loss of ability? Because the overwhelming majority of linguistic dependencies are short: syntax, coreference within a paragraph, the variable you defined ten lines ago. The expensive rarity is the long dependency — the function defined 400 pages back, the character introduced in chapter one. Inkling's answer is to interleave: five sliding-window layers, then one global layer, repeating up the stack.
The global layers act as relay stations. Information from any distance can enter the residual stream at a global layer; the five local layers above it then process, refine, and combine it with nearby context. Depth does the rest: a fact can hop — local, local, global — from position 3 to position 900,000, as long as global layers appear periodically. You do not need every layer to see everything; you need some layer to see everything often enough.
Think of a newspaper bureau: five local reporters cover their own neighborhoods (cheap, thorough, always on), and one wire editor reads every desk in the world (expensive, so there's one per floor). The paper still covers the globe — it just refuses to pay wire-editor salaries for neighborhood news. The 5:1 ratio is an empirical bet about how much of language is neighborhood news. Judging by how many frontier models have converged on ratios like this, the bet is sound.
03cKV-cache arithmetic, by hand
Let's compute the million-token bill for a plausible Inkling-shaped model, all multiplications shown.
The release note gives us 8 KV heads but not the layer count or head width, so we adopt a typical shape for a model of this class and label it clearly as illustrative: 60 layers, head dimension 128, bf16 (2 bytes per number). First, one token's cache in one layer:
Cache per token, per layer
$$ \underbrace{2}_{K \text{ and } V} \times \underbrace{8}_{\text{KV heads}} \times \underbrace{128}_{\text{head dim}} \times \underbrace{2\,\text{B}}_{\text{bf16}} = 4{,}096\,\text{B} = 4\,\text{KB} $$
Note what the small "8" is doing there. Attention queries can use many heads, but keys and values are shared across groups of them (grouped-query attention). If this model used, say, 64 KV heads instead, every number below would be 8× larger. That single design digit is worth hundreds of gigabytes at this scale.
The all-global nightmare. Sixty full-attention layers, one million tokens:
$$60 \times 10^6 \times 4\,\text{KB} = 240\,\text{GB}.$$
A quarter terabyte per user session, before any batching — about half the entire NVFP4 checkpoint of the weights (~490 GB for all 975B), so just two concurrent million-token conversations already cost more memory than the model itself. Serving even a handful of them would be impossible.
The 5:1 weave, window $w = 4{,}096$. Fifty SWA layers each cap their cache at the window: $50 \times 4{,}096 \times 4\,\text{KB} = 0.8\,\text{GB}$. Ten global layers still pay in full: $10 \times 10^6 \times 4\,\text{KB} = 40\,\text{GB}$. Total: $\approx 40.8\,\text{GB}$ — a 5.9× reduction, and look at the split: 98% of the surviving bill is the ten global layers. The locals are a rounding error.
That last observation is the deep one. After the weave, the KV cache is entirely a story about global layers. Every further long-context optimization — fewer globals, compressed globals, smarter eviction — targets those ten layers, because the other fifty have already been paid off. When you read about any lab's long-context tricks, ask first: what did they do about the global layers?
03dInteractive: the reach explorer
How far back can a token "see" as information climbs the stack? Drag the window; toggle the weave.
Each row is a layer (bottom = layer 1); the amber span shows which past positions can have influenced the rightmost token's representation by that layer. Sliding windows widen the span by roughly $w$ per layer; a global layer (blueprint row) snaps it to everything. The readout compares attention compute per token against all-global.
positions reachable at this layerglobal layer (sees everything)out of reach
Set "global every" to 0 (never) and watch the pure-SWA cone: reach grows linearly with depth, so a 60-layer model with $w=4{,}096$ tops out around 250K tokens of indirect reach — and the path is long and lossy. One global layer per six turns the cone into a ladder: full reach, refreshed every few layers, at ~2% of the all-global cache bill from the previous section.
03eOffsets, not addresses
Inkling skips RoPE. Its positions are relative embeddings — the older idea, deliberately chosen for how it fails.
Attention itself is order-blind: shuffle the tokens and the raw scores don't care. Every transformer therefore injects position information, and the two mainstream schemes differ in what they encode:
RoPE (rotary embeddings) gives each position an address: queries and keys are rotated by angles proportional to their absolute index, at many frequencies. The inner product ends up depending on relative distance — elegant — but each frequency component has literally seen only the rotation angles that occur up to the training length. Push past it and the low-frequency components — whose rotation periods are longer than anything seen in training — meet angles they have never encountered; attention patterns can degrade in odd, resonant ways. (The fast components are safe: they wrap around $2\pi$ thousands of times within the training window, so no phase is new to them.) (A cottage industry of fixes exists — NTK scaling, YaRN — precisely because this failure is real.)
Relative positional embeddings (Shaw et al. 2018; scaled up in the Music Transformer, Huang et al. 2018) encode the offset: attention between positions $i$ and $j$ consults a learned embedding for $i - j$, with all offsets beyond some maximum clamped to a shared "far away" bucket. There are no addresses anywhere.
Relative attention (Shaw-style), the one-line version
$$ \text{score}(i,j) = \frac{\mathbf{q}_i^\top \mathbf{k}_j + \mathbf{q}_i^\top \mathbf{r}_{\,\mathrm{clip}(i-j)}}{\sqrt{d}} $$
$\mathbf{r}_{\,\mathrm{clip}(i-j)}$ — a learned vector indexed by the clamped offset. Offset 3 means "three back" whether we are at position 40 or position 900,040.
$\mathrm{clip}(\cdot)$ — distances past the maximum share one bucket: "far." Saturation, not extrapolation.
Worked example: the 1.5×-length regression test. Suppose training saw sequences up to 500K tokens and you deploy at 750K. Ask what each scheme encounters that is new.
Relative embeddings: inside a window layer, every attention pair has offset $\le w = 4{,}096$ — seen billions of times; in a global layer, a pair at distance 700K falls past the clamp and gets the same "far" vector that distance 400K got during training. New inputs encountered: zero. The model may still use long context imperfectly, but its position machinery computes nothing it hasn't computed before.
RoPE: each attention pair's effective geometry involves rotation angles $\theta_f \cdot \Delta$ per frequency $f$. At $\Delta = 700\text{K}$, the low-frequency components produce angle values literally outside the trained range — novel inputs to every attention head, at exactly the positions where your longest documents live. Sometimes it degrades gracefully; the cottage industry of RoPE-scaling patches exists because often it does not.
That asymmetry — saturate on the familiar versus compute the never-seen — is what "extrapolates better" means mechanically.
Now the design logic. At position two million — beyond anything trained — a relative model sees nothing new: "3 back" is still exactly "3 back," and everything distant is the familiar "far" bucket. It fails by saturating gracefully rather than by hallucinating novel geometry. Thinking Machines reports the empirical half of the argument plainly: relative embeddings "perform better and extrapolate better to longer sequences" in their setting. Note the synergy with the weave, too: inside a sliding window the offsets span just $[1, w]$ — a tiny, densely-trained table — and only the ten global layers ever consult the far bucket.
03fTwo small convolutions
The quietest line in the release note: short convolutions after the KV projections and on the residual branch outputs.
A short convolution here means a tiny depthwise filter — think width 3 or 4 — run along the sequence: each channel of each token's vector becomes a learned blend of that channel over the last few positions. The cost is almost nothing (a width-4 depthwise conv over $d$ channels adds just $4d$ parameters per site — against millions in the neighboring matrices), and it buys the one thing attention is bad at: guaranteed local pattern formation.
After the key/value projections: each key stops describing its token in isolation and starts describing a small neighborhood — "-tion preceded by informa-" rather than "-tion". Attention lookups match on local phrases for free, which softens the load on position machinery and helps windows behave like slightly wider windows.
On residual-branch outputs, before rejoining: whatever a block computes gets lightly smeared over adjacent positions before entering the shared stream — a standing n-gram feature-builder threaded through the whole depth of the network. (This is the same instinct that makes hybrid state-space stacks put convs beside attention: some structure is easier to build in than to hope attention learns.)
A useful reading habit for architecture notes: tiny-cost components are confessions. Nobody adds a part worth 0.01% of the FLOPs unless ablations showed the giant parts were reliably failing at something. Short convs are a confession that pure attention under-builds local features — and a fix so cheap there was no reason to say no.
03gConcept check
Chapter 3 · one question
After Inkling's 5:1 weave is applied, our worked example's million-token KV cache fell from 240 GB to ~40.8 GB. Where does nearly all of the remaining 40.8 GB live, and why does that matter?
04Two optimizers, one model
Inkling's pretraining ran a hybrid: Muon for the large matrix weights, Adam for everything else. The split is the tell — it says matrices are different.
Nearly every parameter in a transformer is an entry in some matrix: attention projections, expert MLPs, embeddings. Adam — the default optimizer of the last decade — does not know this. It treats a $64 \times 32$ weight matrix as 2,048 unrelated scalars, each with its own little learning-rate adjustment based on its own gradient history. Whatever structure those 2,048 numbers have as a linear map — which directions of input space it stretches, which it ignores — is invisible to Adam by construction.
Muon (2024, Keller Jordan et al.; since scaled to frontier runs by multiple labs) is an optimizer built around the opposite premise: treat the matrix as a matrix. Its recipe per step, for each large weight matrix:
Accumulate momentum as usual
$M \leftarrow \mu M + G$, where $G$ is the gradient of that weight matrix. Nothing exotic yet — this is SGD-momentum's buffer, kept in matrix shape.
same information as SGD
Orthogonalize the buffer
Compute (approximately) $\mathrm{msign}(M) = UV^\top$, where $M = U\Sigma V^\top$ is the SVD (unpacked from zero in the next section). This keeps the directions of the update and throws away the magnitudes: every singular value becomes ~1.
the whole trick lives here
Step with the orthogonalized update
$W \leftarrow W - \eta \cdot \mathrm{msign}(M) \cdot \sqrt{\max(1, \tfrac{n_{\text{out}}}{n_{\text{in}}})}$ — the scale factor keeps updates consistent across matrix shapes.
equal push in every direction
Vectors, gains, and norm parameters — things with no meaningful "directions" to equalize — stay on Adam. Hence the hybrid.
04bWhat Adam cannot see
A momentum matrix is a to-do list of directions. The problem: a few loud directions drown out the rest.
One tool first, built from zero. A matrix is a linear map, and any linear map can be described completely by answering three questions: which input directions does it act on, which output directions does it send them to, and how strongly? The singular value decomposition (SVD), $M = U\Sigma V^\top$, is that answer written as three matrices: the columns $\mathbf{v}_i$ of $V$ are a set of perpendicular input directions, the columns $\mathbf{u}_i$ of $U$ are the perpendicular output directions they land on, and the diagonal entries $\sigma_i \ge 0$ of $\Sigma$ are the stretch factors. Picture a $2\times2$ matrix acting on the unit circle: the circle comes out as an ellipse, the ellipse's axes are $\mathbf{u}_1, \mathbf{u}_2$, their lengths are $\sigma_1, \sigma_2$, and $\mathbf{v}_1, \mathbf{v}_2$ are the circle directions that landed on them. Every matrix has an SVD — it is not a special property, just what "being a matrix" looks like once you sort its action by direction and strength.
Decompose any momentum buffer $M = U\Sigma V^\top$. Each pair $(\mathbf{u}_i, \mathbf{v}_i)$ is a direction of change — "rotate inputs like $\mathbf{v}_i$ toward outputs like $\mathbf{u}_i$" — and its singular value $\sigma_i$ says how loudly the recent gradients voted for it. In real training the spectrum is brutally skewed: a handful of directions carry large $\sigma$ (usually driven by common, high-frequency features of the data) while hundreds of directions that matter — rare words, unusual code patterns, the tails — sit at tiny $\sigma$.
Raw SGD applies the buffer as-is: the loud directions move fast, the quiet ones barely move. Adam helps only where the disparity happens to line up with individual coordinates — its per-entry rescaling cannot rotate. If the loud and quiet directions are oblique mixtures of coordinates (in real networks they always are), Adam's diagonal view sees roughly uniform per-entry noise and fixes nothing. The ⚖ lab below makes this concrete: give the data a 100× anisotropy along the axes and Adam keeps up fine; rotate that same anisotropy off-axis and Adam loses its grip while Muon does not care — orthogonalization never had a preferred basis in the first place.
Slogan for the mechanism: Muon spends the same update budget in every direction the gradients voted for at all. Loud directions get capped, quiet-but-real directions get amplified to the same strength. The bet is that a direction's presence in the momentum is more informative than its magnitude — magnitudes mostly encode feature frequency, not feature importance.
04cNewton-Schulz, by hand
Nobody computes an SVD for a 956-billion-parameter model every step. Muon fakes it with five matrix multiplies.
The Newton-Schulz iteration exploits a lovely fact: if you repeatedly apply a well-chosen odd polynomial $f(x) = ax + bx^3 + cx^5$ to a matrix (as $f(X) = aX + b\,XX^\top X + c\,(XX^\top)^2 X$), the polynomial acts independently on each singular value while leaving the singular directions $U, V$ untouched. Choose coefficients that push values toward 1, iterate a few times, and you have $\approx UV^\top$ using only matmuls — the one operation GPUs love. Muon uses Jordan's tuned coefficients $(a, b, c) = (3.4445,\, -4.7750,\, 2.0315)$ and just five iterations.
Follow two singular values through all five rounds. Take our chapter's running matrix $M = \begin{bmatrix} 3 & 0 \\ 0 & 0.1 \end{bmatrix}$: singular values 3 and 0.1, so the loud direction moves 30× faster than the quiet one. Newton-Schulz first normalizes by the Frobenius norm ($\|M\|_F = \sqrt{9.01} \approx 3.002$), giving $\sigma = (0.999,\; 0.033)$. Now apply $f(x) = 3.4445x - 4.7750x^3 + 2.0315x^5$ five times:
iteration
σ₁ (was 30× louder)
σ₂
ratio
start
0.999
0.033
30×
1
0.702
0.114
6.2×
2
1.114
0.386
2.9×
3
0.720
1.072
0.67×
4
1.089
0.686
1.6×
5
0.696
1.130
0.62×
Both values now live in a band around 1 — a 30× disparity flattened to under 2×. Note the honest fine print: Jordan's coefficients are tuned for speed on tiny values, not exact convergence, so the spectrum oscillates inside roughly $[0.65, 1.15]$ rather than pinning to 1.000. For an optimizer update, "everything is O(1)" is all that matters — and tiny values get pulled up fast, which is the expensive part done cheaply.
newton-schulz, the real thing (from the lab below)
defnewton_schulz(Gm, iters=5):
a, b, c = 3.4445, -4.7750, 2.0315
X = Gm / (np.linalg.norm(Gm) + 1e-7) # normalize: spectrum into (0, 1]
tp = X.shape[0] > X.shape[1]
if tp: X = X.T # work on the fat orientationfor _ in range(iters):
A = X @ X.T # the polynomial acts on the
X = a * X + (b * A + c * A @ A) @ X # singular values onlyreturn X.T if tp else X # ≈ U Vᵀ : directions, no magnitudes
Count the cost: five iterations × three matmuls on a matrix the model already holds — a few percent overhead per step, purchasable at datacenter scale. That is the engineering reason Muon made it out of blog posts and into a 975B production run on GB300 NVL72 systems.
04dInteractive: flattening the spectrum
Twelve singular values, five Newton-Schulz rounds. Drag the slider and watch the quiet directions get their voice back.
The bars are a momentum matrix's singular spectrum — skewed the way real buffers are (a few loud, many quiet; the smallest starts 50× below the largest). The slider applies $f(x) = 3.4445x - 4.775x^3 + 2.0315x^5$ the given number of times to every value. The dashed line marks 1.0.
singular value after k iterationstarget σ = 1
Watch iteration 1 especially: the tiny values roughly triple (for small $x$, $f(x) \approx 3.44x$) while the big ones get knocked down (at $x=1$, $f(1) = 0.701$). The polynomial is a compressor pedal for spectra — quiet up, loud down, everything toward the band.
04e⚖ Run the experiment: the Muon Race Lab
SGD vs Adam vs Muon on the same teacher-student MLP — with the anisotropy rotated off the axes, where Adam can't follow.
⚖ The Muon Race Lab ✓ verified run
A 100× spread in feature scales, hidden behind a random rotation — then three optimizers race from the same init on the same data.
Hypothesis. On anisotropic data whose strong/weak directions do not align with coordinate axes, Muon's basis-free orthogonalization should beat Adam's per-coordinate scaling, which should beat SGD. Setting the rotation to identity should erase most of Adam's deficit — per-coordinate scaling is exactly the right tool when the anisotropy is axis-aligned.
Our verified run (loss at step 50 / 200 / 400): SGD .0057 / .0025 / .0019 · Adam .0050 / .0015 / .0006 · Muon .0069 / .0009 / .0003. Muon starts slowest — orthogonalization initially amplifies directions that haven't earned it — then overtakes by ~step 150 and finishes 2× ahead of Adam, 6× ahead of SGD.
Lab notebook — what our run found
Setup. Teacher-student regression: a fixed random 2-layer MLP (32 → 64 → 16) generates targets; a student of the same shape learns from fresh batches of 256. Inputs are anisotropic — feature scales span 1 down to 10²⁻²… that is, logspace(0, −2), a 100× condition — and then multiplied by a random rotation so the strong and weak directions are oblique mixtures of coordinates, the way real features always are. Each optimizer gets a reasonably tuned lr (SGD 0.2, Adam 0.01, Muon 0.02), identical data order, identical init.
Result. Muon's curve crosses Adam's around step 150 and keeps pulling away: .0009 vs .0015 at step 200, .0003 vs .0006 at step 400. The mechanism is visible in the crossover itself — early on, flattening the spectrum amplifies directions with little evidence (slightly hurting), but as momentum accumulates real signal about the weak-feature directions, equal-strength updates let the student learn them at full speed while Adam is still taking baby steps along them.
The control that proves the mechanism. Set ROT = np.eye(D_IN) and rerun: the anisotropy now lies along coordinate axes, Adam's per-entry variance estimates see it perfectly, and the Adam-Muon gap nearly closes. Adam's blind spot is not anisotropy — it is rotated anisotropy. Muon never cared either way, because orthogonalization has no preferred basis.
What does NOT transfer. This is a ~3,000-parameter MLP doing regression, not a 975B transformer doing language. The honest production claims for Muon are more modest and more valuable: reports from multiple labs of roughly 1.3–2× sample-efficiency gains at equal compute, robustness to learning-rate choice (try lr=0.005 and 0.08 below — the spread is startlingly small), and the fact that the per-step overhead — five matmul-only iterations — is negligible at scale. Our toy shows the mechanism; the production wins are the reason Inkling bet a frontier pretraining run on it.
Things to try
· ROT = np.eye(D_IN) — axis-aligned anisotropy: watch Adam catch up
· COND = 0 — isotropic data: the race gets much closer
· iters=1 in newton_schulz — half-orthogonalized: still helps?
· lr=0.005 then lr=0.08 for muon — feel how lr-forgiving it is
04fWeight decay ∝ lr²
One sentence in the release note — "we couple weight decay strength to the square of the learning rate" — hides a tidy piece of dynamics.
Weight decay shrinks every weight slightly each step ($W \leftarrow W - \eta\lambda W$), fighting the growth that updates cause. These two forces settle into an equilibrium, and you can find it on the back of an envelope. Per step, the squared norm changes by approximately:
$-2\eta\lambda\|W\|^2$ — decay shrinks, proportionally to how big the weights already are.
$\eta^2\|u\|^2$ — updates grow the norm; with Muon, $\|u\|$ is essentially constant (orthogonalized updates have fixed scale), which is what makes this analysis unusually clean here.
$\|W\|_{\text{eq}}$ — where shrink and growth cancel: the norm the weights drift toward. (This equilibrium view is developed in the rotational-dynamics literature the release cites — Kosson et al. 2023; see also Defazio 2025.)
Now watch what happens across a schedule. Learning rates decay during training; suppose $\eta$ falls 10×. With constant $\lambda$, the equilibrium norm $\propto \sqrt{\eta}$ falls ~3.2× — late training spends its precious low-lr steps dragging every weight matrix toward a new, smaller equilibrium instead of refining the function. Couple $\lambda = c\,\eta$ and the equilibrium freezes but the decay stays aggressive late. Inkling's choice, $\lambda = c\,\eta^2$, goes one step further: the equilibrium target loosens as $\eta$ falls, while the relaxation time toward it ($\sim 1/2\eta\lambda = 1/2c\eta^3$ steps) explodes — so late in training the norms are effectively frozen wherever they are: no dragging, no drift, stable weight magnitudes no matter how long the horizon runs. Which is precisely the phrase in the release note: "stable weight sizes across training horizons." When your training run is measured in months and your schedule in trillions of tokens, "the norms stop moving" is a gift to every downstream consumer of the checkpoint — including the RL phase coming in the next chapter.
04gConcept check
Chapter 4 · one question
In our lab, Adam nearly matches Muon when the 100× anisotropy is axis-aligned, but loses when the same anisotropy is rotated. What does this reveal about the two optimizers?
05The shape of the recipe
Pretraining gives you a machine that continues text. Post-training turns it into something you can talk to. Inkling's recipe is unusually lopsided — on purpose.
Every modern assistant passes through the same two doors after pretraining. First supervised fine-tuning (SFT): show the model conversations shaped the way you want — question, helpful answer; task, tool call — and train it to imitate them. Then reinforcement learning (RL): stop showing answers, start grading attempts. The model generates a full response (a rollout), a reward signal scores it, and the policy shifts toward what scores well.
The design question is the budget split, and Inkling's answer is stark. From the release note: "the bootstrap accounts for a small fraction of compute, with the majority employed for large-scale RL on synthetic and human-created environments." SFT is a warm-up lap; RL is the race. Two numbers frame the chapter:
Phase
What happened
Scale
SFT bootstrap
Imitation on synthetic conversations generated by open-weights models, including Kimi K2.5
"a small fraction of compute"
Large-scale RL
Graded rollouts on synthetic and human-created environments, two continuous runs
30+ million rollouts
The receipt
Aggregate reasoning-evaluation score
0.264 → 0.356 (SFT init → released checkpoint)
05bThe bootstrap: borrowed voices
Inkling's first conversations were written by other open models. That is not a scandal — it is a strategy with a specific shape.
Why synthetic SFT data from models like Kimi K2.5 rather than a mountain of human-written demonstrations? Three reasons, in increasing order of importance:
Cost and coverage. Human demonstration data at frontier quality is the most expensive substance in AI. Open models can generate millions of format-perfect, diverse conversations for the cost of inference — including coverage of tool calls, long contexts, and multimodal turns that human writers produce slowly.
The bar is deliberately low. The bootstrap only has to teach the format of being an assistant — turn-taking, instruction-reading, when to think and when to answer. It does not have to teach excellence. Excellence is RL's job, and RL can only work if the model already produces gradeable attempts. SFT makes the model gradeable; that is the whole assignment.
It keeps the ceiling away from the teacher. A model trained to convergence on another model's outputs inherits its teacher's ceiling. A model that takes only a light imitation pass and then learns from reward can exceed the teacher — the reward function, not the teacher's ability, sets the ceiling. The 0.264 → 0.356 climb is exactly this gap being opened by RL on top of a borrowed start.
There is also a quietly important ecosystem fact here: an open-weights model was bootstrapped by open-weights models. The open ecosystem is now self-hosting — new entrants no longer need a proprietary teacher to reach the starting line. Whatever you think of distillation etiquette, that changes who gets to build.
05cThirty million rollouts
The majority of post-training compute went to RL. What does "large-scale" mean mechanically?
One rollout = one complete attempt at a task in an environment: a math problem with a checkable answer, a coding task with tests, an agentic task with a verifiable end state, a forecasting question that resolves (Chapter 9 leans on those). Inkling ran more than 30 million of them across two continuous runs, on a mix of synthetic environments (generated at scale, automatically gradeable) and human-created ones (curated, closer to real use).
Feel the scale with arithmetic. If an average rollout is ~2,000 generated tokens, 30M rollouts is $30{\times}10^6 \times 2{\times}10^3 = 6{\times}10^{10}$ tokens generated just to be graded — sixty billion tokens of practice, each forward pass costing Chapter 1's 82 GFLOPs. And this is where two earlier chapters cash in:
Sparsity (Ch 1–2): RL is generation-heavy, and generation cost tracks active parameters. The 24× sparse discount applies to every one of those sixty billion tokens — large-scale RL on a dense 975B model would be a fantasy.
Frozen norms (Ch 4): RL fine-tunes the same weights pretraining left behind. Weight matrices with stable, predictable magnitudes — the $\lambda \propto \eta^2$ story — are a far friendlier substrate for a second optimization phase than norms still drifting toward some equilibrium.
The published receipt is the aggregate reasoning score: 0.264 at SFT initialization, 0.356 at the released checkpoint — a 35% relative improvement, bought almost entirely by graded practice rather than by more imitation.
05dInteractive: the long climb
0.264 to 0.356 over thirty million attempts — with the texture real RL curves have.
The curve below follows the published shape — the release note shows reasoning performance improving log-linearly in rollouts across the whole run — with a little of the wobble every practitioner will recognize. Drag the scrubber to any point in training; the panel shows the score and how the same prompt's chain-of-thought length evolves — the subject of the next section. The endpoints, the 30M+ rollout count, and the log-linear shape are published; only the fine texture here is illustrative.
aggregate reasoning score (endpoints published)tokens spent per answer (illustrative)
05eChains that compressed themselves
Nobody trained Inkling to be brief. Its chains of thought got brief anyway — and what they kept tells you what reasoning is made of.
The release note documents a striking emergent effect: over RL training, the model's chain-of-thought — the internal monologue it generates before answering — compressed on its own, with no explicit brevity objective. Read the two published snapshots side by side. Early in training:
"We need to understand the operator… The 5D line element is ds² = e2A(x) (ds²₄d + dx²)…"
Late in training:
"We need determine eigenvalue problem for spin-2 fluctuations hμν(x,y)…"
Look at what fell away and what survived. The articles, the connectives, the throat-clearing ("understand the…") — gone; even grammar bends ("We need determine"). The mathematical content — the operator, the fluctuation field, the actual problem statement — intact and denser per token. The chain remains readable; it just stopped performing readability.
Why would RL do this without being asked? Because the reward only ever sees the final answer. Under that objective, every thinking token is a cost with no direct payoff: it adds latency, risks derailment, and spends context. Gradient pressure therefore quietly favors trajectories whose thinking carries maximum decision-relevant information per token — and the cheapest tokens to shed are exactly the ones carrying grammar rather than content. The model discovered, empirically, which of its own words were load-bearing.
Why this matters beyond aesthetics. First, it is evidence the chains are functional — if thinking were post-hoc theater for the grader, there would be no pressure shaping its information density. Second, it compounds with Chapter 6: a model whose reasoning got naturally terse gives you more capability per thinking token at every setting of the effort dial — compression during training is what makes "match the rival at a third of the tokens" possible at inference.
05fConcept check
Chapter 5 · one question
Inkling's chains of thought compressed during RL — dropping articles and connectives while keeping the math — despite no brevity term in the reward. What is the most defensible explanation?
06A dial, not a switch
Reasoning models spend tokens thinking before they answer. Inkling lets you set the budget — continuously, from 0.2 to 0.99.
Chapter 5 ended with chains of thought that compressed themselves. This chapter is about who controls the remaining length. Inkling exposes a thinking effort parameter — a continuous dial from 0.2 to 0.99 — that scales how much internal deliberation the model performs per query. Same weights, chosen spend.
Why does a customization base need this more than a flagship chatbot does? Because a flagship serves one product with one latency budget, while a base model serves a thousand products it has never met. The same checkpoint might power a code-review agent (thinking is cheap next to being wrong), an autocomplete bar (every millisecond is the product), and a batch document pipeline (throughput rules). Without a dial, each of those teams needs a different model. With one, they need a different number.
The headline efficiency claim from the release: Inkling matches Nemotron 3 Ultra on Terminal Bench 2.1 at roughly a third of the tokens. Hold that sentence up to the light and notice what kind of claim it is — not "we score higher," but "we reach the same score for a third of the spend." It is a claim about the shape of a curve, and that reframing is the entire chapter.
06bFrontiers, not points
Once compute at inference is a choice, "how good is this model?" stops having a one-number answer.
For a model with an effort dial, every benchmark produces a score-versus-tokens curve: run the eval at effort 0.2, 0.4, …, 0.99 and plot score against average tokens consumed. Two models now compare in two directions:
Vertically — at equal token budget, who scores higher?
Horizontally — at equal score, who needs fewer tokens? This is the direction the Nemotron claim lives in: same Terminal Bench score, ~3× fewer tokens.
The horizontal reading is the one that shows up on invoices. A team serving ten million agentic queries a day at ~2,000 thinking tokens each burns twenty billion tokens daily; a model that hits the same quality at a third of that just cut the reasoning bill by 66% with a config change. The release note shows these tradeoff curves across benchmarks — Terminal Bench 2.1 (where the 3× claim lives), Humanity's Last Exam (steady gains with effort — next section), and IFBench (flexible performance-cost tradeoffs). The common shape: steep early, flattening late, never free.
The invoice, computed. An agent product serves 10M queries/day. At 2,000 thinking tokens each: $10^7 \times 2{,}000 = 2 \times 10^{10}$ — twenty billion reasoning tokens daily. Chapter 1 priced a token at 82 GFLOPs, so that is $1.6 \times 10^{21}$ FLOPs of daily deliberation — roughly a full day of an 8-GPU node doing nothing but thinking. A model that holds quality at one-third the tokens deletes two-thirds of that line item: same product, same scores, ~5 fewer H-class GPUs. This is why the horizontal reading of a frontier is the one CFOs learn first.
Chapter 5's compression story and this chapter are one mechanism viewed at two times. RL compressed the chains — more decision-relevant content per thinking token. The effort dial then sells that density back to you as choice: a dense reasoner reaches a given score at fewer tokens, which is exactly a frontier shifted left. Efficiency is trained; the dial just lets you pick your point on it.
06cInteractive: the frontier explorer
Two models, one benchmark, one budget slider. Read both comparisons off the same picture.
The curves below are stylized score-vs-tokens frontiers (log-scale x-axis) for an efficient model and a hungrier baseline, anchored to the article's claim — the teal curve reaches the dashed reference score at roughly a third of the tokens the amber one needs. Drag the budget line and read the vertical gap (score at equal budget); drag the target score and read the horizontal gap (tokens at equal score).
Note the log x-axis: each grid step is a doubling of tokens. On this axis the "3× fewer tokens" gap is about a step and a half of horizontal distance — and it persists across most of the score range, which is what makes it a property of the model rather than a benchmark quirk. (Curves are illustrative; the 3×-at-equal-score anchor is the published fact — the log-linear shape is this lesson's modeling choice for the frontier.)
06dWhat log-linear buys and forbids
The release note reports log-linear improvement during RL training; the effort curves it shows flatten as tokens grow. Model the effort frontier as log-linear — our assumption, not the article's claim — and that single word sets the economics of hard questions.
Log-linear means each equal multiplicative increase in thinking tokens buys an equal additive bump in score: if going 1k → 2k tokens is worth +3 points, then 2k → 4k is worth about +3 more. Two consequences, one friendly and one stern:
It buys predictability. A log-linear frontier is a pricing curve you can plan against: the marginal cost of the next point of quality is knowable in advance. For a platform selling fine-tuning and serving, "quality is purchasable at a published exchange rate" is a feature in itself — teams can budget reasoning like any other resource.
It forbids miracles. Doublings get expensive fast: going from 1k to 32k tokens is five doublings for ~15 points, and the next 15 would need a million-token thought. Test-time compute is a lever, not a ladder to arbitrary capability — the exponential price of each linear gain guarantees diminishing practical returns. If you need +30 points, you need a better model or a better tool, not a bigger budget.
Read a real pair of numbers with this lens. Inkling scores 29.7% on Humanity's Last Exam without tools and 46.0% with tools (Chapter 10 has the full table). That +16-point jump from tool access dwarfs what any affordable amount of extra thinking could buy on a log-linear frontier — five doublings' worth in one move. The strategic ordering for hard tasks follows: first give the model tools, then buy thinking tokens. The dial optimizes within a regime; tools change regimes.
06eConcept check
Chapter 6 · one question
"Inkling matches Nemotron 3 Ultra on Terminal Bench 2.1 at roughly a third of the tokens." What kind of claim is this, and what would refute it?
07The demo reel, read closely
Every launch has demos. The skill is reading what each one is engineered to prove.
The release note shows five capabilities demonstrations. Taken as a list they blur together; taken as arguments, each targets a specific doubt a potential adopter has about open-weights models:
Demo
What happened
The doubt it targets
One-prompt web app
A functional job-application app from a single prompt — with an embedded AI assistant that drives the browser from natural language
"Open models can't do modern agentic scaffolding."
Design Arena
Blinded human ranking of generated web apps: 1257, among the strongest open-weights entries (Claude Sonnet 5, for scale: 1333)
"Open model output looks like a programmer's idea of design."
Nine-page PDF
"Breakfast Around the World" — a food-and-travel journal with editorial layouts, accurate cultural details, cohesive design across pages
"Long-form multi-artifact coherence falls apart."
Multiplayer snake
A game refined through 40 feedback cycles: server-authoritative real-time simulation, browser clients, bot opponents
"Open models can't sustain iterative engineering." (40 rounds is an endurance claim, not a one-shot claim.)
Self-fine-tuning
Inkling retrained itself into a lipogram model — the rest of this chapter
"A model is a static artifact."
Notice the honesty embedded in the Design Arena row: they published the number and the stronger competitor's number. 1257 against Sonnet 5's 1333 says "credibly close to frontier, not frontier" — exactly the positioning from Chapter 1, now with a blinded human jury attached.
07bThe self-improvement loop
Asked to become a model that never uses the letter "e," Inkling did not filter its output. It retrained itself.
The demo that matters most walks through five steps, each performed by the model using the Tinker fine-tuning API as an ordinary tool:
Draft a training plan
Decide the target behavior (a lipogram: text avoiding a chosen letter — a constraint with centuries of literary history and a perfectly checkable success criterion), the data needed, and the evaluation protocol.
the model as its own research lead
Generate evaluation datasets
Build the test set before training — prompts whose answers will be scanned for the forbidden letter, plus quality checks so fluency loss is measured, not ignored.
eval-first discipline, self-imposed
Execute fine-tuning via the Tinker API
Launch the run programmatically: the same API any customer would call, invoked by the model on itself.
infrastructure as tool-use
Evaluate the result
Run the held-out eval; check the e-rate and the fluency of what remains.
grade before deploy
Load the updated weights
Swap itself for its own fine-tune and answer in lipogram. Asked what to do when your team releases a large language model, the new model replied: "As your group puts out a big AI, you should party, thank staff, post a summary, watch for bugs, fix faults fast, and plan upcoming work." Count the e's: zero.
the loop closes
Why a lipogram, of all things? Because it is the perfect minimal self-modification target: trivially and automatically verifiable (scan for the letter), impossible to achieve reliably by prompting alone (the desire to say "the" runs deep — our lab below measures exactly how deep), and harmless. It isolates the capability being demonstrated — plan → data → train → eval → deploy, unassisted — from any question about whether the target behavior itself is impressive.
Read it as the thesis demo: Thinking Machines' pitch is "a good base for customization," and here the model performs its own customization end to end. The subtext for customers is direct — if the model can drive the pipeline, the pipeline is simple enough for your team. And the subtext for safety folks is equally direct: recursive self-modification is now an API call away, which is why the eval-first step and Chapter 9's epistemics stop being optional niceties.
07cInteractive: the loop, animated
Watch the artifact flow: a plan becomes data, data becomes a run, a run becomes weights, weights become the next model.
active stageartifact in flightthe model itself (v1 → v2)
One detail the animation makes visible: the model appears twice — as the worker driving every stage, and as the object being replaced at the end. Every other tool in the loop (data store, trainer, evaluator) is stateless plumbing. The only thing that changes is the thing doing the changing.
07d⚖ Run the experiment: the Lipogram Lab
We rebuilt the physics of the self-fine-tuning demo at a scale that runs in your browser: a 4-gram model that learns to never say "e" — and pays a measurable price in bits.
⚖ The Lipogram Lab ✓ verified run
A character 4-gram model with Katz backoff, a penalty knob β on the letter "e," and a fluency meter calibrated in bits per character.
Hypothesis. Constraint has a price measurable in bits: as the penalty on "e" grows from 0 (base model) to ∞ (hard constrained decoding), the e-rate should fall toward zero while the model's surprise at its own output — the fluency tax — rises and then saturates at the cost of a true weight update.
Our verified run: base model → 10.5% of letters are "e" at 0.68 bits/char. Hard mask → 0.0% e-rate at +1.19 bits/char of fluency tax. The sweep β = 0 / 0.5 / 1 / 2 / 4 / 8 gives e-rates 10.5 / 9.8 / 5.1 / 2.1 / 0.3 / 0.0% at taxes +0.00 / +0.00 / +0.88 / +1.21 / +1.20 / +1.19 bits/char — the price climbs, then saturates: past β≈2 you are already paying the full cost of the ban.
Lab notebook — what our run found
Setup. A character-level 4-gram model — P(next char | previous three) as a table of counts — trained on a ~1,300-character corpus about, fittingly, models that retrain themselves. Sampling uses Katz backoff: if the current 3-character context was never seen (which happens constantly once you ban a letter and wander off the training manifold), fall back to the trigram, then the bigram — the 1987 ancestor of every modern model's out-of-distribution safety net. The knob: a logit penalty β on "e" (multiply its count by e⁻ᵍ), with β=∞ implemented as a hard mask. Metrics are averaged over 12 sampled sequences per setting; the fluency tax is the base model's surprise (bits/char) at the constrained model's output, minus its surprise at its own.
Result 1 — the knob traces the whole spectrum of control. β=0.5 barely dents the e-rate (10.5→9.8%) at no measurable cost. β=1–2 is the steering regime: e-rate halves, then halves again, and the tax climbs through +0.88 to +1.21 bits/char. By β=4 you are effectively at the hard mask: 0.3% e-rate, and the tax has saturated at ~+1.2 bits/char. The lesson generalizes: soft steering is nearly free until it isn't, and a hard constraint is just the limit of the same curve.
Result 2 — the mask cannot fix wanting. Under the hard mask the model still assigns probability to "e" at almost every step — the mask clips it and renormalizes, and that clipped desire is exactly what the +1.19 bits/char measures. A true fine-tune (renormalizing the count table with "e" deleted — a genuine weight update, which is what Inkling did to itself via Tinker) redistributes the desire instead of policing it: same zero e-rate, but the model now natively wants the words it is allowed to say. In our table-sized model the two produce similar text; in a trillion-parameter model the difference is the difference between a filter and a skill.
Result 3 — read the lipogram text itself. The base model speaks in wonky-but-recognizable corpus-flavored English; the constrained model routes around the most common vowel with phrasings like "small copy of its own plan" — awkward exactly where English is e-dependent. Fluency cost is not uniform: it concentrates where the language gives you no synonyms.
What does NOT transfer. A 4-gram table has no generalization: it cannot invent e-free synonyms it never saw, so our fluency tax overstates what a real model pays (Inkling's lipogram answer is far more fluent than ours). And our "fine-tune" is exact table surgery, not gradient descent. The shape of the tradeoff — steering → constrained decoding → weight update as three rungs of the same ladder, each with a price in bits — is the transferable physics.
Things to try
· ban " " (space) instead of e — watch it invent monster words
· ban "t" — harder or easier than e? check the tax
· seed=7, n=1200 — a longer speech from the lipogram model
· delete the backoff (return np.ones(V) always) — see why Katz matters
07eConcept check
Chapter 7 · one question
In the lab, the hard mask achieves a 0.0% e-rate — yet we argue a fine-tune is still meaningfully different. What does the +1.19 bits/char fluency tax actually measure, and why does a weight update change the story?
08One stream, three senses
Inkling does not bolt a vision tower and an audio tower onto a language model. It converts everything into tokens and feeds one stream.
The release note's multimodal section is short and its brevity is the design: images become embeddings via a small patch encoder, audio becomes embeddings via discretized spectrogram frames, and "both audio and vision inputs transform via lightweight embedding layers and process jointly with text tokens." No separate encoder networks with their own training runs, no cross-attention bridges between towers — pixels and sound enter the same residual stream the words use, and the 45 trillion training tokens (text, images, audio, video) taught the one transformer to handle them together.
Keep the contrast in mind, because it is a genuine fork in multimodal design. The tower approach (a pretrained vision encoder like a ViT or SigLIP, grafted on) buys strong perception from day one but creates a seam: two models with different training histories negotiating through an adapter. The lightweight approach has the transformer itself learn perception from raw-ish input — a slower start, no seam, and everything co-trained. For a customization base, the second choice is self-consistent: fine-tuners get one model to adjust, not a federation.
08bVision: 40×40 through an hMLP
An image is a grid of 40-pixel squares; each square becomes one token via a four-layer MLP. Let's count everything.
Inkling encodes images as 40×40 pixel patches passed through a four-layer hMLP (hierarchical MLP) stem — a design from Touvron et al. 2022, whose original pitch was that a patch stem of stacked small MLP stages matches fancier convolutional stems while staying compatible with things like masked self-supervision, because patches never exchange information inside the stem. Each patch is processed alone; all cross-patch communication happens later, in the transformer proper.
Patch arithmetic for a 1080p photo. A 1920×1080 image cut into 40×40 squares: $1920 / 40 = 48$ columns, $1080 / 40 = 27$ rows, so $48 \times 27 = 1{,}296$ tokens — a photograph costs about as much context as two pages of text. Each patch carries $40 \times 40 \times 3 = 4{,}800$ raw numbers (RGB), and the hMLP's job is squeezing those 4,800 numbers into one $d$-dimensional embedding — four stages of "compress, nonlinearity, compress" per patch, every patch independently.
Compare the classic ViT recipe (16×16 patches): the same photo would be $120 \times 67 = 8{,}040$ tokens — 6.2× more. At 40×40, Inkling trades fine spatial granularity for context budget: the sensible trade for a model whose specialty is reasoning about images (charts, documents, screenshots) inside million-token conversations, rather than dense pixel tasks like segmentation.
That trade shows up in the benchmarks, and honestly: strong Charxiv chart-reasoning scores (78.1%, rising to 82.0% when it can write Python — the model reads the chart, then computes), a solid 73.5% MMMU-Pro — and nobody claims pixel-perfect dense vision. The stem is an admission of what this model is for.
08cAudio: dMel spectrograms
The audio path is even more radical in its simplicity: no learned codec at all. Discretize the spectrogram and go.
Most audio LLMs tokenize sound with a neural codec — a separately-trained compressor (EnCodec, SoundStream) whose discrete codes become the tokens. Powerful, but now your audio pipeline contains a whole second model with its own failure modes, biases, and training data. Inkling instead uses dMel (Bai et al. 2024, "Speech Tokenization made Simple"): take the standard mel spectrogram — the time-frequency picture speech engineers have used for decades, where each frame is a vector of energies in perceptually-spaced frequency bands — and simply discretize each band's log-energy into a small set of bins. The "d" is just "discretized." No training, no codec, no seam: a deterministic, invertible-enough transform from waveform to token-shaped data, which then enters the model through the same kind of lightweight embedding the image patches use.
Frame arithmetic for three minutes of speech. Standard mel front-ends run at ~100 frames per second (25 ms windows, 10 ms hop). A 3-minute voice memo: $180 \times 100 = 18{,}000$ frames. Each frame is one row of the spectrogram — say 80 mel bands, each band's energy snapped to one of a handful of discrete levels. Eighteen thousand tokens for three minutes: audio is expensive but tractable context — and the 1M window (Chapter 3) means an hour of audio (~360k frames) genuinely fits, which is what "reasons over longer-form audio" in the release note is quietly promising.
What does the model do with it? The listed capabilities: transcribe speech, follow spoken instructions, answer questions about recordings, reason over long audio. The scores (Chapter 10): 91.4% VoiceBench, 77.2% MMAU, 56.6% Audio MC — strong instruction-following through the ears, middling raw audio-analysis, which is exactly the profile you would predict from "we taught a reasoning model to read spectrograms" rather than "we built a hearing specialist."
08dInteractive: the patchifier
A procedurally-drawn scene, a patch grid, and a token counter. Drag the patch size and watch the context bill move.
The scene below stands in for your input image. The grid shows the patch decomposition; the readout counts tokens for the drawn scene and for a real 1920×1080 photo at the same patch size. Slide from 16 (ViT-classic) to 40 (Inkling) and watch the two costs diverge by 6×.
one patch = one token (after the hMLP)audio strip: one frame = one token
The audio strip along the bottom makes the second modality's tokenization visible in the same picture: a stylized mel spectrogram whose columns are frames. Both senses end as the same thing — a row of embeddings — which is the entire point of the lightweight design: by the time the transformer sees anything, everything is just tokens.
The unstated modality: video
The training mix says 45T tokens of "text, images, audio, and video" — but the release note describes no separate video pathway, and it doesn't need one: video is images over time, so the patch machinery already covers it. The arithmetic explains the design pressure, though. Sample a one-minute clip at just 1 frame per second at 1080p: $60 \times 1{,}296 = 77{,}760$ tokens — a minute of sparse video costs more context than this entire lesson's text. Every patch-size decision in the previous section was really a video decision: at 16×16 patches that same minute would be 482K tokens, half the context window gone. Aggressive patch economics is the admission fee for the fourth modality.
08eWhat the lightweight path trades
Every seamless design pays somewhere. Knowing where keeps you honest about what to fine-tune.
Perception is learned, not imported. A grafted SigLIP tower arrives knowing what a cat looks like from its own billion-image pretraining. A lightweight stem knows nothing until the joint training teaches it — which is why the 45T-token mix must include images, audio, and video at scale, and why this design only became sensible for labs that could afford such a mix.
Granularity is capped by patch economics. At 40×40, a 12-pixel icon is a third of one patch — sub-patch details survive only if the stem's 4,800→$d$ compression chooses to keep them. Fine-grained OCR and dense localization will always favor smaller patches or resolution tricks; know your workload.
The win is uniformity. One stream means the model can attend from a spoken phrase to a chart region to a paragraph in a single pass — no adapter bottleneck where cross-modal reasoning goes to die. And for the Tinker customer, fine-tuning multimodal behavior is the same API as fine-tuning text behavior (the cookbook's three new audio recipes exist precisely because the path is uniform).
08fConcept check
Chapter 8 · one question
Why might Inkling choose 40×40 patches when classic ViTs use 16×16 — and what does the choice cost?
09Epistemics as a product spec
Three trained properties — calibration, verified instruction following, censorship resistance — plus the safety refusal profile they sit beside. None of them is a benchmark flex. They are warranty terms.
A model that will live inside other people's systems needs different virtues than a chatbot. If your pipeline branches on the model's confidence, that confidence had better be a probability, not a vibe. If your product's instructions say "cite only from the provided documents," compliance has to be checkable. And if you build on an open model, you inherit its silences — whatever topics it refuses to touch, your product refuses too. Thinking Machines trained for all three explicitly, and this chapter takes them in order of how much machinery they required.
Property
How it was trained / tested
The receipt
Calibration
RL against proper scoring rules on resolved real-world questions
ForecastBench Brier index 61.1 ± 0.79 (63.7 ± 0.82 with search); Prophet Arena Brier 0.1617
Instruction following
A dual grader: rubric checklist + agentic claims verification
IFBench 79.8 (and Small: 83.4)
Censorship resistance
Evaluated on Cognition's Propaganda & Censorship Eval
“Strong patterns of censorship non-compliance” — qualitative; no score published
Safety refusals
Refusal benchmarks: FORTRESS (attack + benign prompts) and StrongREJECT
Two conventions to decode before the table stops being noise. The ForecastBench Brier index (61.1 ± 0.79 without search, 63.7 ± 0.82 with) is scaled so higher is better, and the ± is a real confidence interval — rare honesty in a launch table. The Prophet Arena Brier score (0.1617) is the raw penalty where lower is better: 0.25 is what always-say-50% scores, 0 is omniscience, so 0.16 sits meaningfully on the informed side of maximal hedging. Note also what the search delta (+2.6) quietly demonstrates: calibration training didn't just teach confidence numbers — it taught the model that evidence should move them.
09bProper scoring rules, from zero
How do you pay a forecaster so that telling the truth is their best strategy? This question has an exact answer, and Inkling was trained with it.
Suppose an event will either happen or not, and the model reports a probability $p$. You want a reward scheme under which the model's expected reward is maximized by reporting its true belief $q$. Such a scheme is called a proper scoring rule, and the classic one is the Brier score (a penalty — lower is better):
Brier score, and why it is proper
$$ \text{Brier}(p, y) = (p - y)^2 \qquad\quad \mathbb{E}_{y \sim q}\big[(p-y)^2\big] = q(1-p)^2 + (1-q)\,p^2 $$
$y \in \{0, 1\}$ — how the question resolved. Inkling's training used resolved real-world questions, so $y$ is ground truth, not a judge's opinion.
$q$ — the model's true belief; $p$ — what it reports. Differentiate the expectation with respect to $p$: $\;2p - 2q = 0 \Rightarrow p^* = q$. The minimum sits exactly at honesty — that is the definition of properness.
Contrast the obvious-but-wrong alternative: reward the model with $p$ when it's right and $1-p$ when it's wrong ("be confident and correct"). Expected reward: $qp + (1-q)(1-p)$ — linear in $p$, so it is maximized at $p = 1$ whenever $q > \tfrac12$. Under this rule, a rational forecaster who believes 60% reports 100%. Overconfidence is not a bug of such training signals; it is their optimal policy. Most naive "accuracy-flavored" rewards — including, quietly, ordinary RL-from-correctness on final answers — have this extremizing character, which is why calibration must be trained deliberately, against a proper rule, on questions that actually resolved.
The philosophical move is worth savoring: calibration turns honesty from a virtue into an equilibrium. You do not ask the model to be humble; you construct a game in which humility is the profit-maximizing strategy and let gradient descent find it. Chapter 5's lesson again — the reward function, not the instruction, is the real specification.
09cInteractive: why honesty wins
Drag the model's true belief. Watch where each reward scheme tells it to point its report.
The curves show expected reward as a function of the reported probability $p$, given the true belief $q$ you set with the slider. The dot marks each scheme's optimal report. The Brier curve's peak tracks your slider exactly; the naive curve's peak slams to 0 or 1 the moment you leave $q = 0.5$.
Brier reward (proper) — peak at p = qnaive confidence reward — peak at 0 or 1
09d⚖ Run the experiment: the Calibration Lab
We trained the same tiny forecaster twice — once on each reward — and read its reliability diagram. Same accuracy. Completely different honesty.
⚖ The Calibration Lab ✓ verified run
A one-neuron forecaster, a world with known true probabilities, and two training signals: the Brier score vs "sound confident and be right."
Hypothesis. Trained on the proper rule, the forecaster should recover the true posterior (a = 2) and sit on the reliability diagonal; trained on the naive confidence reward, it should inflate its logits far past truth — same decision boundary, same accuracy, badly overconfident probabilities.
Our verified run: Brier-trained → (a, b) = (1.99, −0.01) — the true posterior is a = 2.00 — accuracy 84.2%, ECE 0.002. Naive-trained → a = 6.28, accuracy 84.1% (identical boundary), ECE 0.105: when it says "95%," the event happens ~75% of the time. Honesty appears and disappears with the scoring rule; accuracy never notices.
Lab notebook — what our run found
Setup. The world: a binary event with a noisy signal — s ~ N(+1, 1) when the event will happen, N(−1, 1) when it won't, so the true posterior is exactly sigmoid(2s). The forecaster is the smallest possible model, p = sigmoid(a·s + b), initialized timid (a = 0.3). We train it twice on identical data: once by gradient descent on the Brier score, once by gradient ascent on the naive reward (p if right, 1−p if wrong), then evaluate on 200,000 fresh events with a 10-bin reliability diagram, expected calibration error (ECE), and accuracy.
Result. The Brier run converges to (1.99, −0.01) — it has discovered the Bayes posterior — and its reliability curve hugs the diagonal (ECE 0.002). The naive run inflates to a = 6.28: the same sign structure, so the same decisions and the same 84% accuracy, but every probability is pushed toward the extremes — the 90–100% bucket resolves true only ~89% of the time — and when it reports “95%,” the event happens only ~75% of the time — for an ECE 50× worse. Both models "know" the same amount; only one says what it knows.
Why this is the mechanism behind Inkling's numbers. Scale the toy up: replace s with "everything the model read," a and b with a trillion parameters, and the resolved-event stream with ForecastBench-style real-world questions. RL against a proper scoring rule does to the big model exactly what it did to our neuron: it makes the reported number converge toward the model's actual evidence. That is what a Brier index of 61.1 ± 0.79 (63.7 with search) is receipts for.
What does NOT transfer. Our forecaster's calibration problem is one-dimensional and realizable — the true posterior lives inside its hypothesis class, so it can nail it. A language model's beliefs are not a scalar; calibration there is trained per-domain and can silently fail off-distribution. And ECE with 10 bins is a coarse ruler — good enough to expose a 3× logit inflation, too coarse for subtler dishonesty. Treat the lab as the mechanism in a bottle, not as proof any particular model is calibrated everywhere.
Things to try
· swap the Brier gradient for log-loss (also proper) — where does a land?
· LR=2.0 — the naive rule wants a = ∞; watch it try
· make the signal weaker: s ~ N(±0.5, 1) — does calibration survive?
· bins=20 in evaluate — a finer ruler for the reliability curve
09eThe dual grader
Instruction following was trained against two judges with different failure modes — because any single judge gets gamed.
RL needs a reward for "followed the instructions well," and graders are where reward hacking lives. Inkling's training used two in tandem:
The rubric grader turns the instruction into a checklist — "did the response include X? stay under Y words? avoid Z?" — and checks the response against it. Cheap, consistent, and blind: it cannot tell confident fabrication from fact. A model trained on rubric alone learns to look compliant.
The claims grader extracts factual claims from the response and verifies them through agentic web search — an active fact-checker with receipts. Expensive and narrow, but it catches exactly what the rubric misses: fluent nonsense in a perfect format.
Each grader alone is a gameable objective; their intersection is much harder to fool, because the cheapest ways to satisfy one violate the other. (Fabricate freely → claims grader objects. Hedge everything into vagueness → rubric objects.) This is the same design pattern as Chapter 2's bias, one level up: when one signal must serve two masters — form and truth — split the signal. The result on IFBench: 79.8 for the big model. Keep that number; Chapter 10 has a surprise about it.
09fSaying the quiet part
An open model's refusals propagate to everyone who builds on it. So refusal behavior is measured like any other spec.
Open-weights models increasingly descend from other open-weights models (Inkling's own bootstrap used Kimi K2.5 — Chapter 5), and lineage carries habits: topic avoidances, propaganda-shaped framings, trained silences. Cognition's research on open-source-derived models documented exactly this, and their Propaganda and Censorship Eval is the ruler. Inkling's evaluation showed — the release note's phrase — "strong patterns of censorship non-compliance": asked to carry water or go quiet, it declines to.
The safety scores frame the same property from three sides: FORTRESS adversarial 78.0% (robustness to attack prompts — edging Nemotron 3 Ultra’s 77.6%, with DeepSeek V4 Pro far behind at 36.0%), FORTRESS benign 95.9% (not over-refusing ordinary requests — above Nemotron 3 Ultra's 90.5%), and StrongREJECT 98.6% (declining genuinely harmful requests — in the same band as Kimi K2.6's 99.8%). The triple matters more than any single number: robust and permissive and safe is the narrow corridor a trustworthy base has to walk — refusing what it should, and nothing else.
09gConcept check
Chapter 9 · one question
In our lab, the Brier-trained and naive-trained forecasters have identical 84% accuracy, but ECEs of 0.002 vs 0.105. What exactly did the naive reward break, and why couldn't accuracy detect it?
10How to read a report card
Benchmark tables are usually read as verdicts. Read this one as a fingerprint: where a model is strong tells you what it was built for.
Three habits make any model's report card informative instead of just loud:
Read against the named reference, not against 100. The release publishes a full eight-model comparison table (five open-weights, three closed); the Reference column below is our pick of the strongest competitor per row — the frontier leader, or the best open-weights model where noted. GPQA at 87.2 means little in a vacuum; "87.2 where Gemini 3.1 Pro holds 94.1" locates the model precisely: close enough to matter, honestly behind.
Read the pattern of gaps. Even gaps everywhere = a general model a step behind the frontier. Uneven gaps = a shaped model. Inkling's gaps are uneven in an interpretable way — smallest on math and knowledge, widest on elite agentic coding — and the shape matches the pitch: a broad base, not a coding specialist.
Check claims against their kind. Chapter 6 taught the distinction: a point score and a frontier claim are different objects. "77.6 SWEBench" is a point; "matches Nemotron at a third of the tokens" is a curve. Both appear in this release; neither substitutes for the other.
10bThe numbers, in full
Every published score, grouped the way the release groups them — with the reference model named.
Reasoning
Benchmark
Inkling
Reference
Humanity's Last Exam (text only)
29.7%
GLM 5.2 (best open): 40.1% · Claude Fable 5: 53.3%
HLE (with tools)
46.0%
GLM 5.2 (best open): 54.7% · Claude Fable 5: 64.5%
AIME 2026
97.1%
GPT 5.6 Sol: 99.9%
GPQA Diamond
87.2%
Gemini 3.1 Pro: 94.1%
Agentic & coding
Benchmark
Inkling
Reference
SWEBench Verified
77.6%
Claude Fable 5: 95.0%
Terminal Bench 2.1
63.8%
GPT 5.6 Sol: 89.5%
SWEBench ProPublic
54.3%
Claude Fable 5: 80.0%
Agentic & general
Benchmark
Inkling
Reference
GDPVal-AA v2
1238
Claude Fable 5: 1760
MCP Atlas
74.1%
Claude Fable 5: 83.3%
Tau 3 Banking
23.7%
GPT 5.6 Sol: 33.0%
BrowseComp (w/ ctx management)
77.1%
GPT 5.6 Sol: 90.8%
Factuality
Benchmark
Inkling
Reference
SimpleQA Verified
43.9%
Gemini 3.1 Pro: 77.3%
AA Omniscience
2.1
Claude Fable 5: 40.0
Chat
Benchmark
Inkling
Reference
IFBench
79.8%
Nemotron 3 Ultra: 81.4%
Global-MMLU-Lite
88.7%
Claude Fable 5: 93.3%
Multimodal
Domain
Benchmark
Score
Vision
MMMU Pro Standard 10
73.5%
Vision
Charxiv RQ
78.1% (82.0% with Python)
Audio
Audio MC
56.6%
Audio
MMAU
77.2%
Audio
VoiceBench
91.4%
Forecasting & safety
Benchmark
Inkling
Reference
ForecastBench Brier index (no search)
61.1 ± 0.79
—
ForecastBench (with search)
63.7 ± 0.82
—
Prophet Arena Brier score
0.1617
—
FORTRESS (adversarial)
78.0%
Nemotron 3 Ultra: 77.6%
FORTRESS (benign)
95.9%
Nemotron 3 Ultra: 90.5%
StrongREJECT
98.6%
Kimi K2.6: 99.8%
Now apply habit two. Math and knowledge: within 3–7 points of the named leaders (AIME within 2.8, GPQA within 6.9). Elite agentic coding: 17–26 points behind the strongest closed models. Safety robustness: ahead of every open-weights peer on adversarial FORTRESS — narrowly over Nemotron 3 Ultra (78.0 vs 77.6), and 42 points clear of DeepSeek V4 Pro (36.0). One more stripe in the fingerprint: parametric factuality (SimpleQA 43.9 where Gemini holds 77.3) is Inkling's widest gap of all — knowing-things-offline is exactly what a build-on-top base expects you to bolt on with retrieval. That fingerprint — broad competence, honest coding and factuality gaps, best-in-category robustness — is precisely "a good open-weights base," rendered in numbers.
10cInteractive: the gap chart
Every benchmark with a named reference, drawn as Inkling's score against it. The shape of the fingerprint, at a glance.
Inklingnamed reference modelhover a row for the exact numbers
Hover the rows. The two green-tinted rows at the bottom are the ones where Inkling is the reference point — the safety benchmarks where it leads the comparison instead of chasing it.
What is not on the card
An honest report card also has margins, and two absences and one framing choice are worth noticing. There is no video benchmark, although video is in the training mix — the fourth modality shipped as an input capability, not a headline. There are no latency or serving-cost numbers, even though the whole architecture is built around cost — those depend on deployment, which is now your problem and your opportunity (that is what open weights means). And the safety headline is a within-category claim — the dedicated safety table references open-weights peers, while the full benchmark table shows Claude Fable 5 at 96.0% on adversarial FORTRESS, 18 points above Inkling. “Safest base to build on” means the safest open-weights base, not the safest model on the board. Reading what a lab chose not to measure is the same skill as reading what it did.
10dInkling-Small's ambush
The 276B/12B preview shouldn't keep up with the 975B/41B flagship. Mostly it does — and on several rows, embarrassingly, it wins.
Benchmark
Inkling (975B/41B)
Inkling-Small (276B/12B)
HLE (text only)
29.7%
29.6%
HLE (with tools)
46.0%
46.6%
AIME 2026
97.1%
95.1%
Global-MMLU-Lite
88.7%
86.8%
GPQA Diamond
87.2%
88.3%
IFBench
79.8%
83.4%
Read the rows in order of what they teach. Knowledge-flavored tasks (Global-MMLU-Lite, AIME) show the expected order — 3.5× the parameters buys a couple of points — though GPQA Diamond quietly breaks it, going to the small model by 1.1. HLE is a tie, and with tools the small model edges ahead: when the hard part is orchestrating searches and calculators rather than knowing things, capacity stops being the bottleneck. And IFBench — instruction following, Chapter 9's benchmark — goes to the small model by 3.6 points.
That last row is a known, deep phenomenon worth naming: instruction following does not scale like knowledge. Bigger models know more, and a model that knows more has more confident priors to override yours with — more "better" ideas about what you should have asked. Precision-following is a discipline, not a capacity, and post-training discipline can land harder on a smaller, more pliable model. If your workload is "do exactly what the spec says," the parameter count on the box is not the number to shop by.
Practical corollary for the Tinker customer: start small. Fine-tuning Inkling-Small costs a fraction of the flagship, follows instructions better out of the box, and ties the big model on tool-assisted reasoning. Upgrade to 975B when your evals — not your instincts — say knowledge is the binding constraint.
Chapter 10 · one question
Inkling-Small (276B/12B) beats the 975B flagship on IFBench by 3.6 points while losing on AIME and Global-MMLU-Lite. What does this pattern reveal?
10eThe ecosystem is the release
A checkpoint on Hugging Face is a file. A model you can serve, tune, and render anywhere is a product. The release note spends real ink on the difference.
Weights: Hugging Face at thinkingmachines/inkling, including an NVFP4 checkpoint (Chapter 1's memory arithmetic made that one predictable).
Fine-tuning:Tinker, with 64K and 256K context options, native Inkling support, an updated cookbook with three new audio-focused recipes (Chapter 8's uniform stream cashing in), and 50% launch pricing; the Inkling Playground chat is free for a limited period.
Hosted inference: TogetherAI, Fireworks, Modal, Databricks, Baseten at launch.
Open-source serving: SGLang (RadixArk), Miles, vLLM (Inferact), TokenSpeed (Lightseek), llama.cpp (Unsloth) — the full spectrum from datacenter to laptop.
Tooling:tml-renderers, a library for "reliably sampling and post-training with tool calls, reasoning content, and multimodal inputs" — the unglamorous layer where fine-tuning projects actually die, shipped as part of the release.
Every chapter of this lesson reappears in that list as a business decision: sparsity is the serving bill (Ch 1–2), the effort dial is the reasoning bill (Ch 6), calibration is trustworthiness-as-spec (Ch 9), the self-fine-tuning demo is the Tinker pitch (Ch 7), and the release note itself — the most technically forthcoming of any frontier-adjacent lab this year — is the documentation a base needs and a leaderboard model doesn't. Thinking Machines calls Inkling "the first release in a model family we will continue to build on." The family, on this evidence, has a very consistent character.
Why the dual grader works — grader design, reward hacking, and eval hygiene.
And the primary sources: the Inkling release note itself; Shaw et al. 2018 and Huang et al. 2018 for relative positions; Touvron et al. 2022 for hMLP stems; Bai et al. 2024 for dMel; the DeepSeek-V3 report for the routing lineage; Kosson et al. 2023 and Defazio 2025 for the weight-decay dynamics.
The whole lesson in four sentences. Inkling separates capacity from compute (MoE with honest routing), trains the separation with matrix-aware optimization (Muon), spends its post-training budget on graded practice rather than imitation (30M rollouts), and exposes the results as dials and warranties — effort, calibration, openness — instead of leaderboard points. Every part serves the same sentence: be the best model to build on, not the best model on the board. Whether that bet wins is a market question, not a benchmark question. But you can now read every number in the release and know exactly which part of the bet it is measuring.
"What I cannot create, I do not understand." — the four labs in this lesson exist because of that sentence. If you ran them, you didn't just read about Inkling; you rebuilt its load-bearing ideas with your own hands. That was the point.