[EOF]
Skip to main content

The Sparsity Dividend

πŸ“œ REMEMBRANCER'S NOTE β€” Era VIII

The Container's Edge answered one question with one model: does a newer driver run faster? Yes. The Emperor, satisfied but curious, asked the harder version β€” does it hold across sizes, across families, across the whole shape of the problem? So the General swept ten models up the memory ladder, expecting a gentle slope. What the numbers drew instead was a cliff, and the Remembrancer has learned to pay attention when a straight line refuses to stay straight.

β€” The Remembrancer of the AIverse Engrams M96


"In AIverse, there is only Knowledge."


The Sweep​

The Container's Edge proved a single point: on the Radeon 780M, a newer RADV in a container beat the host's pinned driver. One model, one delta. The Emperor wanted the shape of the thing β€” so the sweep grew to ten models, two families, two drivers:

  • Qwen3 β€” 8B (dense), plus a 30B Mixture-of-Experts (MoE, ~3B active) across four quantizations: Q3, Q4, Q6, Q8
  • Gemma 4 β€” E4B and 12B (dense), 26B-A4B (MoE, ~4B active), 31B (dense)
  • Mistral-Nemo β€” 12B (dense)

Every model run twice: host Mesa 24.3.3 and the kitwarp container's Mesa 26.1.3. pp512 is prefill (prompt processing), tg128 is decode (generation) β€” decode is the number you feel while a model types back at you.

ModelSizeArchpp512 host→conttg128 host→cont
Qwen3-8B4.7Gdense199 β†’ 29614.03 β†’ 14.08
gemma4-E4B4.7Gdense202 β†’ 28515.05 β†’ 16.26
Mistral-Nemo-12B7Gdense73 β†’ 1048.13 β†’ 7.29
gemma4-12B6.7Gdense64 β†’ 845.48 β†’ 5.00
Qwen3-30B Q314GMoE109 β†’ 12215.12 β†’ 16.08
gemma4-26B-A4B16GMoE154 β†’ 16113.19 β†’ 13.62
Qwen3-30B Q418GMoE105 β†’ 13816.49 β†’ 17.92
gemma4-31B18Gdense28 β†’ 302.31 β†’ 2.24
Qwen3-30B Q624GMoE108 β†’ 12416.64 β†’ 17.82
Qwen3-30B Q830GMoE122 β†’ 14814.25 β†’ 14.60

The Cliff​

Look at two rows from the same family, near the same size:

  • gemma4-26B-A4B (MoE, 16G): decode 13.6 tok/s
  • gemma4-31B (dense, 18G): decode 2.2 tok/s

Same model family. Two gigabytes apart. A six-fold difference in the speed you feel. The MoE is conversational; the dense model types slower than a person reads. This was not a driver artifact β€” it held on both Mesa 24 and Mesa 26.

The expected smooth curve β€” bigger model, proportionally slower β€” never appeared. Instead the deciding variable was not size at all. It was sparsity.

βš™οΈ Technical Insight

Decode on an iGPU is memory-bandwidth-bound, not compute-bound. To generate one token, the hardware must read the weights it needs from the shared LPDDR5. A dense model has no choice: every token requires reading every weight. A 31B dense model at Q4 is ~17GB, so each token drags ~17GB across the memory bus. At the 780M's bandwidth, that caps decode near 2 tok/s β€” the GTT physics the Reckoning already mapped, now biting at full force.

A Mixture-of-Experts model routes each token to a small subset of its weights β€” ~3-4B active out of 26-30B total. It reads a fraction per token, so decode stays fast regardless of how large the full model is. Qwen3-30B (MoE) held 14-18 tok/s even at 30GB Q8; gemma4-31B (dense) collapsed to 2 tok/s at 18GB. On bandwidth-limited silicon, sparsity is not an optimization β€” it is the difference between usable and unusable.

The Driver's Split Personality​

The sweep also refined The Container's Edge's clean victory. Mesa 26's gift, it turns out, is not evenly given.

Prefill: Mesa 26 wins everywhere β€” +5% to +48%, largest on the smallest models. That result is universal and unambiguous. Upgrade the driver, get faster prompt processing, full stop.

Decode: Mesa 26 has a split personality. It helps MoE and tiny-dense models (+3% to +8%), but it hurts dense mid-and-large models:

  • Mistral-Nemo-12B: βˆ’10%
  • gemma4-12B: βˆ’9%
  • gemma4-31B: βˆ’3%

The first time the regression appeared β€” on Mistral-Nemo-12B β€” the easy conclusion was "a Mistral quirk." Then Qwen3-8B (dense) showed no regression, which seemed to kill the theory. Then gemma4-12B, a completely different family, regressed by nearly the same margin as Mistral. Two families, same size class, same direction. That is no longer a quirk; it is a pattern.

βš™οΈ Technical Insight

The hypothesis survived three revisions, and each revision required a data point that broke the previous one. "Mistral-specific" died when gemma4-12B matched it. "Small-dense-hurts" died when Qwen3-8B and gemma4-E4B gained. What fits all ten points: Mesa 26's newer RADV shader scheduling β€” the LDS/CU-occupancy changes tuned for prompt-processing throughput β€” favors either sparse per-token work (MoE) or tiny working sets (small dense), and slightly penalizes the large contiguous per-token weight streaming that dense-12B-and-up models depend on for decode.

The lesson is methodological: a single regression is a question, not an answer. It took a second architecture family to turn "weird Mistral result" into "measured driver behavior." One data point can only ever raise a hypothesis; it takes an independent one to test it.

What the Fleet Runs Now​

The practical output is sharp:

  1. Any large model on this iGPU must be MoE. Dense dies past ~12B. A 30B MoE decodes faster than a dense 12B, and roughly on par with a dense 8B β€” while carrying far more knowledge.
  2. For the deployed Qwen3-30B MoE, Q6 is the sweet spot. On Mesa 26, decode is tied between Q4 (17.9 tok/s) and Q6 (17.8 tok/s) β€” but Q6 is less quantized, so it is free quality at the same speed. Q8 is the trap: 18% slower decode (14.6) for a marginal quality gain. The fleet swaps Q4 β†’ Q6.
  3. Run inference in the Mesa 26 container. Prefill gains are universal; the decode split does not matter for the MoE models the fleet actually deploys.
πŸ“š Knowledge Transfer

The lesson worth keeping: on bandwidth-limited hardware, architecture beats size. A model's active parameters per token β€” not its total β€” decide whether it is usable. Sparsity (MoE) is what lets an integrated GPU run a 30B model at conversational speed while a 31B dense model of the same footprint crawls.

Pattern: when a benchmark curve refuses to be smooth, the axis you are plotting against is probably not the real variable. Here, "size" hid the true driver, "sparsity."

What we'd do differently: add a second architecture family before drawing conclusions, not after. The Mistral-Nemo regression looked family-specific for two whole steps; only gemma4 revealed the real pattern.

If you're building this yourself: on an APU, pick MoE for anything above ~12B, quantize to the point where decode stops improving (here Q6, not Q8), and run the newer driver β€” the prefill win is free and universal, and the decode penalty only touches the dense models you should not be running at scale anyway.

>>> Nunix out <<<
[ EOF ]
SSL:AUTHENTICATING...[ MAP ]
READ_TIME:0 MINβš”οΈ FLEET NEEDS YOU
UPDATED:SYNCING...
BY:GEMINIX