~/satyajit

Limite 1B - Violetto: the throughput claim is in config.json, not the blog

mdjsonmcp

2026-09-22 · 11 min · llm · architecture · kv-cache · long-context · math · benchmarks · small-models

Paradigma released Limite 1B - Violetto yesterday, and it comes with two different taglines. The GitHub README says "A model for high-frequency mathematical intelligence." The release blog says "high-throughput solutions of difficult mathematical problems" and, in its meta description, "high-throughput mathematical reasoning."

Neither page contains a tokens-per-second number, a latency figure, a batch size, a hardware target, or the word "milliseconds". I grepped both. The serving instructions are a vLLM plugin that requires tensor_parallel_size=1, and that is the whole of the deployment story.

So the interesting question is not whether the claim is true. It is whether the claim is attached to anything. It is — just not in the prose. config.json is unusually explicit for a model with no technical report yet, and one field in it does all the throughput work.

paradigma-inc/limite-1b-violetto@9402e42 · snapshot 2026-09-22
parameters
1.04B
repo size
2.08 GB
architecture
LimiteForCausalLM
task
text-generation
license
apache-2.0
safetensors
1 shard
largest file
2.07 GB
files
10
downloads
904
likes
48
parameters by dtype
BF161.04BF32112.8K
mathematicsreasoningvllm

repo last modified 2026-09-22

The stack, from the config

config.json, drawn — 48 blocks, hidden 1280, 10 heads over 2 KV heads1,035,253,888 params
MuDD → block 24MuDD → block 47block 0 · sliding window, 1,025 keysblock 1 · sliding window, 1,025 keys · value embedding injectedblock 2 · sliding window, 1,025 keysblock 3 · global attention, NoPE, full 131,072-token spanblock 4 · sliding window, 1,025 keys · value embedding injectedblock 5 · sliding window, 1,025 keysblock 6 · sliding window, 1,025 keysblock 7 · global attention, NoPE, full 131,072-token span · value embedding injectedblock 8 · sliding window, 1,025 keysblock 9 · sliding window, 1,025 keysblock 10 · sliding window, 1,025 keys · value embedding injectedblock 11 · global attention, NoPE, full 131,072-token spanblock 12 · sliding window, 1,025 keysblock 13 · sliding window, 1,025 keys · value embedding injectedblock 14 · sliding window, 1,025 keysblock 15 · global attention, NoPE, full 131,072-token spanblock 16 · sliding window, 1,025 keys · value embedding injectedblock 17 · sliding window, 1,025 keysblock 18 · sliding window, 1,025 keysblock 19 · global attention, NoPE, full 131,072-token span · value embedding injectedblock 20 · sliding window, 1,025 keysblock 21 · sliding window, 1,025 keysblock 22 · sliding window, 1,025 keys · value embedding injectedblock 23 · global attention, NoPE, full 131,072-token spanblock 24 · sliding window, 1,025 keysblock 25 · sliding window, 1,025 keys · value embedding injectedblock 26 · sliding window, 1,025 keysblock 27 · global attention, NoPE, full 131,072-token spanblock 28 · sliding window, 1,025 keys · value embedding injectedblock 29 · sliding window, 1,025 keysblock 30 · sliding window, 1,025 keysblock 31 · global attention, NoPE, full 131,072-token span · value embedding injectedblock 32 · sliding window, 1,025 keysblock 33 · sliding window, 1,025 keysblock 34 · sliding window, 1,025 keys · value embedding injectedblock 35 · global attention, NoPE, full 131,072-token spanblock 36 · sliding window, 1,025 keysblock 37 · sliding window, 1,025 keys · value embedding injectedblock 38 · sliding window, 1,025 keysblock 39 · global attention, NoPE, full 131,072-token spanblock 40 · sliding window, 1,025 keys · value embedding injectedblock 41 · sliding window, 1,025 keysblock 42 · sliding window, 1,025 keysblock 43 · global attention, NoPE, full 131,072-token span · value embedding injectedblock 44 · sliding window, 1,025 keysblock 45 · sliding window, 1,025 keysblock 46 · sliding window, 1,025 keys · value embedding injectedblock 47 · global attention, NoPE, full 131,072-token spanvalue embeddings — a second 151,680 × 256 table, injected at 16 blocks03112324354736 sliding-window blocks · 12 global NoPE blocks · window 1024 (span 1025 keys)rms norms carry no learnable weight · attention softmax scale pinned to 0.1 · logits softcapped
Every position and count is read from config.json. The 3:1 local-to-global ratio is the only one of these choices that shows up in the KV-cache arithmetic; the rest are sample-efficiency tricks that cost nothing at inference.

1,035,253,888 parameters, bf16, 2.07 GB on disk. 48 blocks, hidden 1280, intermediate 3328, 10 query heads over 2 KV heads at head_dim 128, Qwen's tokenizer (bos 151643, vocab padded to 151,680), tie_word_embeddings: true. Nothing surprising so far.

Then the rest of the file, which reads like a NanoGPT speedrun changelog rather than a model card:

{
  "global_every": 4,
  "global_layers": [3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47],
  "global_nope": true,
  "sliding_window": 1024,
  "sliding_window_convention": "k >= q - sliding_window, inclusive of the query token",
  "ve_layers": [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46],
  "ve_dim": 128,
  "mudd": true, "mudd_layers": [24, 47], "mudd_taps": 3,
  "mudd_tap_idx": { "24": [0, 12, 24], "47": [0, 23, 47] },
  "attn_gate_applied": "per_head_before_o_proj",
  "qk_norm": "rms_pre_rope",
  "rms_norm_has_weight": false,
  "attention_softmax_scale": 0.1,
  "rope_base_global": 1024.0,
  "rope_frac": 0.5,
  "softcap_logits": { "kind": "sigmoid", "a": 23.0, "b": 5.0, "c": 7.5 }
}

Four of these are worth stopping on, because the blog's one sentence about architecture — "strongly inspired by recent advancements made by the community on pre-training speedrun competitions" — is the only explanation on offer, and the fields say more than the sentence.

Value embeddings. model.value_embeds.weight is a second embedding table, 151,680 × 256, 38.8M parameters, injected at 16 of the 48 blocks. ve_stored_heads: 2 and ve_head_slice: "first_num_key_value_heads" mean it feeds the V path of the two KV heads directly from the token id, before QK-norm. This is the speedrun's U-net value-embedding trick, and it is 3.8% of the model spent on a lookup table that skips the residual stream entirely.

MuDD. Multi-way dynamic dense connections, at exactly two sites: block 24 taps the outputs of blocks 0, 12 and 24, and block 47 taps 0, 23 and 47. The parameters are trivial — mudd.dense1 is [32, 1280], dense2 is [48, 3, 32] — so this is a routing structure, not a capacity addition. Two deliberate long-range shortcuts at the half-way point and the exit.

Norms with no weight. rms_norm_has_weight: false throughout. Every RMSNorm is a pure normalisation with no learnable gain. That is a speedrun-derived simplification and it removes a hundred-odd thousand parameters, which is not the point; the point is that it removes a family of scale degrees of freedom that usually have to be tuned.

A pinned softmax scale. attention_softmax_scale: 0.1, not 1/sqrt(128) = 0.0884. Combined with rope_base_global: 1024.0 — three to four orders of magnitude below the 10⁶–10⁷ that a 131K-context model normally uses — and rope_frac: 0.5, so only half the head dimension is rotated at all, with the 12 global blocks using no positional encoding whatsoever. The positional scheme here is: local blocks get short-range RoPE on half their channels, global blocks get nothing and rely on the causal mask. It is the NoPE-plus-local-RoPE arrangement, committed to harder than most.

None of these four costs anything at inference. The fifth field does.

The only derivable throughput claim

KV cache per sequence, derived from config.json3.91× smaller than all-global
1K131,072 tokens131K
as shipped12 global + 36 windowed1.65 GB44 concurrent on one 80 GB cardall 48 globalthe same model, no window6.44 GB11 concurrent on one 80 GB card
KV bytes = 2 × kv_heads(2) × head_dim(128) × 2 bytes = 1024 B per token per block; a windowed block stops at 1,025 keys. Concurrency assumes the 2.07 GB bf16 checkpoint resident and 4 GB reserved for activations and runtime, with no paging or KV quantisation — an upper bound on a bound, not a measurement. Paradigma publishes no throughput figure of its own.

36 of 48 blocks attend over 1,025 keys regardless of how long the sequence is. Only 12 grow.

The arithmetic is four numbers from config.json and nothing else. KV bytes per token per block = 2 (K and V) × num_key_value_heads (2) × head_dim (128) × 2 bytes = 1024 B. A global block at 131,072 tokens holds 134 MB; a windowed block stops at 1.05 MB. So the full 131K cache is 12 × 134 MB + 36 × 1.05 MB = 1.65 GB, against 6.44 GB if all 48 blocks were global. A factor of 3.91.

That is the mechanism behind "high-throughput", and it is worth saying plainly what kind of claim it is. It is not a speed claim — a windowed block and a global block cost roughly the same per token at short context. It is a concurrency claim: on one 80 GB accelerator with the 2.07 GB checkpoint resident and 4 GB set aside for activations and runtime, the 73.9 GB left over holds 44 simultaneous 131K-token sequences instead of 11. For a workload that is thousands of independent competition problems run in parallel, which is exactly what a maths model is for, that is the whole game.

It is also the ceiling, not a measurement. Nobody has published a real one.

paradigma-inc/limite-violetto@cd68d27 · snapshot 2026-09-22
tracked files
17
license
Apache-2.0
branch
main
tests
1 file
source
77.8 kB
commit date
2026-09-22
source by language
Python77.8 kB(8)

by size of tracked source at this commit, file counts in brackets; docs, data and vendored trees excluded

local clone, 2026-09-22 at cd68d27 branch, commit, commitDate, fileCount, hasTests, languages, license, licenseFile, testFileCount

The maths, and the one column that behaves differently

The headline is 94.01% on AIME 2026 at an estimated 1.71 × 10²¹ training FLOPs.

A dark scatter chart titled 'AIME 2026 performance vs. estimated training compute'. The x-axis is estimated training compute in 6ND FLOPs on a log scale from 10 to the 21 to beyond 10 to the 24; the y-axis is AIME 2026 percentage from 40 to 100. A large purple dot marks Limite 1B - Violetto at 94.01% and 1.71 times 10 to the 21 FLOPs, far to the left. A dashed horizontal line at that score runs right across the chart to models that match it: MiniCPM5 2B near 10 to the 22, VibeThinker 3B and Nemotron Cascade 2 near 10 to the 23, Nemotron 3 Super and Qwen3.5 4B near 10 to the 24, and Qwen3.5 9B beyond it. OLMo 3 7B Think sits at about 69% and OLMo 3 7B Instruct at about 44%.
The release's headline figure: AIME 2026 against estimated pre-training compute, log x. The footnote is load-bearing — compute is 6ND with RL excluded, and the counted stages differ by model. (Paradigma, 'Limite 1B - Violetto', 2026-09-21.)

The 6ND estimate is checkable. 6 × 1.035e9 × 275e9 = 1.71e21, so the x position implies about 275 billion training tokens — consistent with the blog's "less than 300B highly curated tokens", and a genuine 1–3 orders of magnitude below the models on the same dashed line. Sample efficiency is the real result here.

But read the axis footnote: "RL excluded; counted training stages vary by model." The blog credits its competition-level maths to "a mix of synthetic data generation, curated SFT and RL post-training", and the compute axis excludes the last of those for everyone. The chart is therefore a pre-training-efficiency chart wearing a capability headline, and the gap it shows is real but measured on the stage that is not the one doing the final work.

A dense evaluation table of 17 models with columns for release date, total parameters, AIME 2026, HMMT February 2026, APEX Shortlist, BeyondAIME, AIME 2025, HMMT February 2025 and ArXivMath May 2026. The top row, highlighted, is Limite-1B-Violetto at 1B with 94.01, 83.62, 50.80, 74.25, 90.21, 91.35 and 25.08. Larger models below include MUSE-Glimmer-30B, Gemma-4-31B-IT, NVIDIA-Nemotron-3-Super at 120B and GLM 5.2 at 753B, which scores 99.20, 92.50, 68.09 and 56.67. A footnote marks daggered results as sourced from model cards or MathArena rather than rerun.
The full evaluation table as published. Seven benchmarks, 17 models, and a ragged grid — several large models have a score in only two or three columns. (Paradigma, 'Limite 1B - Violetto', 2026-09-21.)

Rank Limite in its own table, column by column:

Limite's rank in Paradigma's own table, column by column17 models · ragged table, denominator printed
BeyondAIME1 of 11 · 74.25AIME 20263 of 17 · 94.01HMMT Feb. 20253 of 14 · 91.35AIME 20254 of 12 · 90.21HMMT Feb. 20265 of 17 · 83.62APEX Shortlist6 of 15 · 50.80ArXivMath May 20267 of 12 · 25.08← better · rank among models with a score in that column · worse →
Blue is a competition-format short-answer benchmark; red is the one column that is not. Limite is first on BeyondAIME, top-five on five more — and seventh of twelve on ArXivMath, behind a 3B, a 4B, a 9B, a 30B and a 31B. Ranks are computed from the release's own table; daggered rows in that table were sourced from model cards or MathArena rather than rerun.

Six of the seven columns are competition-format short-answer maths — AIME, HMMT, BeyondAIME, an olympiad shortlist — and Limite is first, third, third, fourth, fifth and sixth on them, against models up to 730 times its size. That is a real result and the BeyondAIME number in particular (74.25 against MUSE-Glimmer-30B's 70.00, which the blog names) is not a rounding artefact.

The seventh column is ArXivMath May 2026, and Limite is 7th of 12 at 25.08 — behind VibeThinker-3B (29.77), Qwen3.5-9B (31.64), Gemma-4-31B-IT (35.78) and a long way behind GLM 5.2 (56.67). It is also behind Qwen3.5-4B (26.33), a model it beats by four points on AIME 2026.

That inversion is the most informative thing in the table. On every benchmark whose format is "produce a boxed integer", the 1B is top-six. On the one benchmark whose format is not, the ordering reverts to something much closer to parameter count. Paradigma does not hide this — the column is right there in their own table, and the blog is unusually frank about the model's limits elsewhere, printing four worked examples of Violetto reinterpreting "What is photosynthesis?" as a cell-division recurrence and "What causes the seasons?" as a calendar arithmetic problem. A model described as "as lightly instruction-tuned as possible, to challenge the assumption that models need to be embedded in an assistant persona" is going to do that, and saying so with receipts is the right call.

It does mean the honest summary is narrower than "mathematical intelligence." This is a competition-problem solver. MiniCPM5-2B appears in the same table two rows down, and the comparison holds up: 90.21 to Limite's 94.01 on AIME 2026, at twice the parameters — but 21.80 to Limite's 25.08 on ArXivMath, a much smaller gap.

What is actually released

Four repositories under paradigma-inc: limite-1b-violetto (the RL'd model), limite-1b-base, limite-1b-base-soup and limite-1b-value-model — the training-time value model, which is an unusual and useful thing to release. The serving code is Apache-2.0, as are the Violetto and value-model repos; the two base checkpoints carry no licence tag on the Hub at the time of writing, which is presumably an oversight and is worth fixing before anyone builds on them. The base and Violetto configs are byte-identical apart from the weights, so the post-training changed no architecture.

What is not released: the technical report ("to be released soon"), the training data, the RL recipe, the eval harness, and any performance measurement at all. For a model whose name is "high-frequency", the last omission is the one to fix first, and it is an afternoon's work: vllm bench serve against the plugin at a few concurrencies, on a named card, with the prompt distribution the model is for.

What would change my mind

5 claims above, and what would falsify each

  1. Neither the blog nor the README publishes any latency or throughput measurement.

    A page on paradigma.inc, or a section of the technical report when it lands, carrying tokens/sec, time-to-first-token, or a concurrency sweep. My check is a grep of the rendered blog HTML and the GitHub README on 2026-09-22 for throughput, latency, tok/s, ms, batch and per second; the only hits are the marketing phrase itself. A number posted on X or Discord would also overturn it and I would not have seen it.

  2. The hybrid attention stack is the mechanism behind the throughput claim, worth 3.91x on the KV cache at 131K.

    The factor is arithmetic on four config fields and is not in doubt. What would change my mind about it being the mechanism is a measured throughput number that does not improve with concurrency the way a KV-bound workload should — for instance if the custom plugin serialises something and the model is compute-bound at batch one, in which case the window is buying memory nobody is using.

  3. Limite's wins are concentrated in competition-format benchmarks.

    A second non-competition maths benchmark — MathArena's proof tasks, miniF2F, PutnamBench, or anything with a free-form answer — where the 1B places as highly as it does on AIME. One column is one column, and ArXivMath May 2026 is recent enough that I cannot rule out a contamination or harness quirk that depresses everyone's score unevenly.

  4. The compute-efficiency chart excludes the training stage that produces the headline capability.

    The chart's own footnote says "RL excluded". If the technical report shows the RL stage is a small fraction of total FLOPs — plausible for a 1B — then including it would move Limite's point negligibly and the chart is fine as drawn. The report would settle this in one number.

  5. The architecture is a NanoGPT-speedrun parts list rather than a novel design.

    A technical report describing value embeddings, MuDD taps at 24 and 47, weightless norms and a 0.1 softmax scale as independently derived, or showing an ablation where the combination behaves differently from the sum of the published tricks. I am inferring lineage from field names and the blog's own one-line attribution to speedrun competitions; that is provenance, not a claim that nothing here is new.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Limite 1B - Violetto: the throughput claim is in config.json, not the blog", ai.thesatyajit.com, September 2026.

bibtex
@misc{ghana2026limite1bvioletto,
  author = {Satyajit Ghana},
  title  = {Limite 1B - Violetto: the throughput claim is in config.json, not the blog},
  url    = {https://ai.thesatyajit.com/articles/limite-1b-violetto},
  year   = {2026}
}
share