<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex Fank</title>
    <description>The latest articles on DEV Community by Alex Fank (@alexfank).</description>
    <link>https://dev.to/alexfank</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4164144%2F14b83cac-de20-4e49-a70b-46b44f7aee2f.png</url>
      <title>DEV Community: Alex Fank</title>
      <link>https://dev.to/alexfank</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexfank"/>
    <language>en</language>
    <item>
      <title>Averages, Elo, IRT: how composite LLM indices differ</title>
      <dc:creator>Alex Fank</dc:creator>
      <pubDate>Thu, 22 Oct 2026 06:45:14 +0000</pubDate>
      <link>https://dev.to/alexfank/averages-elo-irt-how-composite-llm-indices-differ-c45</link>
      <guid>https://dev.to/alexfank/averages-elo-irt-how-composite-llm-indices-differ-c45</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/alexfank/why-averaging-llm-benchmarks-gives-the-wrong-leaderboard-boc"&gt;Part 1&lt;/a&gt; demonstrated that simply averaging benchmarks can push a model tested on just three easy boards higher than flagships evaluated across eighteen. &lt;a href="https://dev.to/alexfank/fitting-one-score-across-40-sparse-benchmarks-with-item-response-theory-1j3l"&gt;Part 2&lt;/a&gt; swapped this average for an IRT model instead. This final section takes a wider view. Many groups release one score to answer "how good is this model," yet they arrive there through very different methods.&lt;/p&gt;

&lt;p&gt;An easy way to see that the approach matters: consider the 137 models with both an LMArena rating and an llmrun Composite Score. Across all of them, the two rankings align closely, showing a rank correlation of 0.91. Among the 20 strongest models, however, they disagree completely: -0.02.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnb1g7f541ggwrc8o8ifr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnb1g7f541ggwrc8o8ifr.png" alt="LMArena text Elo vs llmrun Composite Score" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neither figure is flawed. They address different questions, and the gap appears exactly where people examine it most closely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways to get one number
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F92ifho3o7ygcrco0ddqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F92ifho3o7ygcrco0ddqr.png" alt="Full grid, pairwise votes and sparse grid: the data each design needs" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Average a fixed set of evals.&lt;/strong&gt; The publisher runs every model on identical tests and calculates a weighted mean. The Artificial Analysis Intelligence Index uses 10 evaluations split into four weighted categories. The now-retired Hugging Face Open LLM Leaderboard relied on six benchmarks, removing the random-guess baseline from each before scoring. This approach stays clean and controlled, yet it covers only what the publisher can afford to run; plus, swapping out for a new set of evals creates a fresh version that no longer compares fairly with previous results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let people vote.&lt;/strong&gt; LMArena presents users with two anonymous answers and fits a Bradley-Terry model to the votes, which is essentially an Elo system. No benchmark grid is required; only head-to-head battles suffice. The catch? It measures which answer audiences prefer, not what a model can actually do. Length emerged as the strongest style effect. LMArena's style control adjusts for length and markdown, yet a vote remains just a vote. An independent audit, &lt;a href="https://arxiv.org/abs/2504.20879" rel="noopener noreferrer"&gt;The Leaderboard Illusion&lt;/a&gt;, also revealed that closed models get sampled into more battles than open ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infer a hidden ability.&lt;/strong&gt; Item response theory treats each benchmark result as evidence about a model's ability, assigning its own difficulty to every test. The &lt;a href="https://epoch.ai/data/eci-documentation/methodology" rel="noopener noreferrer"&gt;Epoch Capabilities Index&lt;/a&gt; applies this method across more than 50 benchmarks, just like our score over 40. A major benefit is handling sparse data: two models that never shared a benchmark can still be compared via intermediate ones that overlap both. However, an estimate is only as strong as the boards supporting it, and refitting may shift old values unless the scale remains frozen.&lt;/p&gt;

&lt;h2&gt;
  
  
  At a glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Artificial Analysis Intelligence Index&lt;/strong&gt;. This is a weighted average of 10 evals it runs itself, lacking any interval for the index. It works best when comparing current models within a single harness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LMArena.&lt;/strong&gt; Uses Bradley-Terry to analyze human votes, complete with confidence intervals. Ideal for comparing chat preferences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Epoch Capabilities Index.&lt;/strong&gt; IRT across more than 50 benchmarks, using a 90% bootstrap interval. Ideal for tracking progress along the frontier over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;llmrun Composite Score&lt;/strong&gt;. It applies IRT across 40 boards using a fixed scale and sets a 90% spread for each model. This is ideal for open-weight models; check it alongside your hardware compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiveBench&lt;/strong&gt;. It runs its own evaluations using rotated questions and includes 95% bootstrap intervals. This suite works best when you need to minimize data contamination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Methods as each index documents them, checked on 2026-10-22.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading one score without fooling yourself
&lt;/h2&gt;

&lt;p&gt;Here are a few rules of thumb, using figures from our leaderboard dated 2026-10-22.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If two ranges overlap, call it a tie.&lt;/strong&gt; &lt;a href="https://llmrun.dev/model/xiaomimimo-mimo-v2-6-pro-rl" rel="noopener noreferrer"&gt;MiMo V2.6 Pro RL&lt;/a&gt; scores 133.4 while &lt;a href="https://llmrun.dev/model/moonshotai-kimi-k3" rel="noopener noreferrer"&gt;Kimi K3&lt;/a&gt; comes in at 132.8. MiMo operates on a 90% range from 130.6 to 136.2, based on 8 boards; Kimi's sits between 131.2 and 134.4 based on 30. Given the current data, they appear evenly matched, though Kimi's figure feels more reliable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you care about one skill, ignore the overall rank.&lt;/strong&gt; &lt;a href="https://llmrun.dev/model/deepseek-ai-deepseek-v4-1-flash" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; ranks fifth among open models with a score of 129.5; however, its coding ability sits at 122.2, roughly 12 points behind Kimi K3's 134.4. The model shines in reasoning, scoring 134.0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it needs to run on your machine, check memory first.&lt;/strong&gt; Kimi K3 requires around 1.7 TB of memory even at 4-bit precision. None of the top open models fit on a single 24 GB card; the &lt;a href="https://llmrun.dev/gpu/tier/24gb-vram" rel="noopener noreferrer"&gt;24 GB page&lt;/a&gt; ranks the ones that do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which one to read
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choosing a model for local use.&lt;/strong&gt; Begin with per-skill scores for open-weight options, then narrow down based on what your GPU can handle. That's exactly where our scoring system applies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Following the frontier.&lt;/strong&gt; ECI or the Artificial Analysis index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How a chat model feels.&lt;/strong&gt; LMArena, preferably with style controls engaged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worried the model saw the test?&lt;/strong&gt; LiveBench swaps out roughly one-sixth of its questions with every update.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any of them.&lt;/strong&gt; Examine the interval and determine what it actually measures. When a narrow range comes from multiple runs, it reveals little about how those specific benchmarks were chosen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where ours fits
&lt;/h2&gt;

&lt;p&gt;ECI counts as its nearest relative, with distinctions lying mainly in scope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We don't run any models; everything stems from published benchmarks like Epoch's hub, LiveBench, the SWE-bench leaderboards, and MMLU-Pro.&lt;/li&gt;
&lt;li&gt;Open-weight models are the focus here, with a look at how each one matches your hardware.&lt;/li&gt;
&lt;li&gt;The scale remains locked to a 2026-Q4 reference, meaning scores update solely when fresh results for a given model come in.&lt;/li&gt;
&lt;li&gt;A board stays active only as long as it has results from the past year. This solves the issue mentioned in Part 1.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Known gaps: most benchmarks focus on English, with no vision or multilingual domain yet; we rely entirely on what upstream sources publish. You can find the full method and changelog on the &lt;a href="https://llmrun.dev/benchmark/llmrun-score/methodology" rel="noopener noreferrer"&gt;methodology page&lt;/a&gt;, while the current ranking is on the &lt;a href="https://llmrun.dev/benchmark/llmrun-score" rel="noopener noreferrer"&gt;leaderboard&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>machinelearning</category>
      <category>benchmark</category>
      <category>ai</category>
    </item>
    <item>
      <title>Fitting one score across 40 sparse benchmarks with item response theory</title>
      <dc:creator>Alex Fank</dc:creator>
      <pubDate>Fri, 09 Oct 2026 12:39:19 +0000</pubDate>
      <link>https://dev.to/alexfank/fitting-one-score-across-40-sparse-benchmarks-with-item-response-theory-1j3l</link>
      <guid>https://dev.to/alexfank/fitting-one-score-across-40-sparse-benchmarks-with-item-response-theory-1j3l</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/alexfank/why-averaging-llm-benchmarks-gives-the-wrong-leaderboard-boc"&gt;Part 1&lt;/a&gt; described how our averaged composite failed: a model measured on three saturated legacy boards outranked flagships measured across eighteen, because hard boards lower a mean and easy boards raise it. Minimum counts and per-board z-scores did not fix it, so we changed the model. This part covers the replacement and the decisions behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea from psychometrics
&lt;/h2&gt;

&lt;p&gt;Psychometrics has a standard way to compare people who sat different exams. Each person has one latent ability, written θ. Each test item has a difficulty b and a discrimination a, how sharply it separates weaker from stronger test takers. In the two-parameter logistic (2PL) model, the expected result is a sigmoid of the gap between ability and difficulty.&lt;/p&gt;

&lt;p&gt;We treat each benchmark as one item. A result is first rescaled to 0–1 between the board's random-guess baseline and its ceiling, and the model is then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;y(i, j) = sigmoid( a_j * (θ_i − b_j) )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here y is the normalized result of model i on board j, θ_i is the model's ability, b_j is the board's difficulty and a_j its discrimination (we parameterize a_j = exp(α_j) so it stays positive).&lt;/p&gt;

&lt;p&gt;With this form a hard board stops penalizing whoever was run on it: it sits higher on the difficulty axis, and a low raw score there is what the model expects. Models that share no board also become comparable. If A and B have no board in common but each shares boards with a third model C, the fitted a and b values tie all three to one axis. Most models in our data appear on a fraction of the boards, so the whole scale rests on this linking; we check below whether it holds.&lt;/p&gt;

&lt;p&gt;Epoch AI's Capabilities Index uses the same family of model, performance = σ(α_b [C_m − D_b]), fitted at the benchmark level; its methodology is at &lt;a href="https://epoch.ai/data/eci-documentation/methodology" rel="noopener noreferrer"&gt;https://epoch.ai/data/eci-documentation/methodology&lt;/a&gt;. IRT has also been applied to LLM evaluation at the item level, to estimate ability from far fewer questions: tinyBenchmarks (&lt;a href="https://arxiv.org/abs/2402.14992" rel="noopener noreferrer"&gt;arXiv 2402.14992&lt;/a&gt;), metabench (&lt;a href="https://arxiv.org/abs/2407.12844" rel="noopener noreferrer"&gt;arXiv 2407.12844&lt;/a&gt;) and Fluid Benchmarking (&lt;a href="https://arxiv.org/abs/2509.11106" rel="noopener noreferrer"&gt;arXiv 2509.11106&lt;/a&gt;). Like Epoch, we work with per-board aggregates, since leaderboards do not publish per-question responses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbunj1cf5lbz1r5hj4xsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbunj1cf5lbz1r5hj4xsc.png" alt="Item characteristic curves for four real benchmarks" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The figure shows four boards with their fitted reference parameters. MMLU-Pro is easy (b = −1.05, a = 1.44) and separates models only at the low end. Humanity's Last Exam is hard (b = 1.87, a = 1.03), and only high-ability models leave the floor. ARC-AGI-2 is the most discriminating board in the reference (a = 3.64, b = 1.05). Its curve is nearly a step. ForecastBench sits at the other extreme (a = 0.31, b = −0.82); its curve is almost flat, and θ depends on it only weakly. A plain average would give all four the same weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fitting, and what one board can do
&lt;/h3&gt;

&lt;p&gt;We fit by maximum a posteriori estimation with weakly informative priors: θ ~ N(0, 1), b ~ N(0, 2²) and log a ~ N(0, 0.5²). The last keeps discrimination near 1 unless a board's data say otherwise. The optimizer is full-batch Adam with no random initialization, so the same data always produce the same numbers.&lt;/p&gt;

&lt;p&gt;The prototype showed us how little a standard error from one board is worth. Hy4 Preview ranked first among open models on the strength of a single math board, and its standard error came out small. With one observation and fixed item parameters, the Laplace approximation returns a number that is too tight. The prototype report proposed gating on standard error below a threshold; we did not adopt it, since that gate relies on the very quantity that had misled us. We gate on coverage instead: a model needs at least 4 boards, spanning at least 2 categories, including reasoning or coding.&lt;/p&gt;

&lt;p&gt;Every published score carries a 90% range from the same approximation, θ ± 1.645 standard errors mapped to the display scale. On the methodology page we give a hypothetical pair, both at 130.0: the well-covered model has a range of 126–134 and the thinly covered one 112–149.&lt;/p&gt;

&lt;h3&gt;
  
  
  The scale: changed once, then frozen
&lt;/h3&gt;

&lt;p&gt;We first shipped the score as a bounded 0–100 number, the expected result on a typical benchmark. It saturated near 100, and the top models were hard to tell apart. On 2026-10-04, a day after launch, we moved to an open linear scale, 100 + 25θ. A score of 100 is the average model of the 2026-Q4 reference field (θ = 0), 25 points is one standard deviation of ability, and there is no ceiling. Every number changed and the order of models did not.&lt;/p&gt;

&lt;p&gt;A free refit re-standardizes θ each time, so one new hard board would shift every model's score. We froze the a and b of 40 boards as a reference named 2026-Q4. Live fits hold those values as anchors and estimate θ, plus parameters for any board not yet in the snapshot, and a model's number moves only when new data about that model arrive. The price is that 100 means the average of a fixed field, so scores compare within one version; a rebase would ship as a new version with an old-to-new table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which boards count
&lt;/h3&gt;

&lt;p&gt;Elo-style boards such as LMArena are relative ratings with no baseline or ceiling to normalize against, so they cannot be placed on the 0–1 result axis. They stay on separate leaderboards; Epoch's ECI excludes them on the same grounds. We also drop a board if more than 25% of its normalized results sit exactly at 0 or 1, since that suggests the baseline or ceiling we assumed is wrong.&lt;/p&gt;

&lt;p&gt;Some boards that our earlier composite held out at weight 0 are admitted again. The weights existed because a plain average let a hard, narrowly covered board penalize the few frontier models run on it, which the IRT model does not do.&lt;/p&gt;

&lt;p&gt;Domain scores for coding, agents, math, science and reasoning use the same global board parameters. Each is the ability estimated from that domain's boards alone, needs at least 2 of them, and is directly comparable with the overall score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;p&gt;We hold out results and predict them. In 5-fold cross-validation, the IRT model reaches a held-out RMSE of 0.093 on the 0–1 scale. A baseline with a per-model offset plus a per-board mean reaches 0.177, and the plain board average 0.246.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp61t2au4un6d7m0yv66j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp61t2au4un6d7m0yv66j.png" alt="Held-out error" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coverage improved too: in the prototype, 239 open models were estimable, against 78 that passed the earlier composite's gate. In a leave-one-board-out check, dropping any single large board moved the top 20 open models by at most about 5 places. The largest moves came from one board (5 places) and from ARC-AGI-2 (4).&lt;/p&gt;

&lt;p&gt;Some rankings changed a great deal, and we went through the large moves one by one. DeepSeek R1 0528 fell from 5th under the earlier composite to 36th in the prototype. Under the average its rank depended on which boards it happened to be measured on; per-board difficulty places the same results below newer models that did well on those boards. Qwen3 235B A22B moved from 14th to 46th, and Seed OSS 36B, which had only 4 boards, from 7th to 37th. In the other direction MiniMax M2.7 rose from 76th to 29th and Inkling Small from 51st to 9th.&lt;/p&gt;

&lt;h2&gt;
  
  
  What readers of Part 1 asked
&lt;/h2&gt;

&lt;p&gt;Two readers asked in the comments on Part 1 about things we had assumed and not measured. One asked whether models measured on disjoint benchmark sets end up on one scale at all, whether neighbouring ranks can be told apart, and which date the 365-day rule for active boards uses. The other raised contamination and missing data, which we come back to at the end. We ran the checks on 2026-10-09 with the production fitting code and data; our refit reproduced the live open ranking exactly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it one scale?
&lt;/h3&gt;

&lt;p&gt;We built the bipartite graph of models and boards and counted connected components. There is one, holding all 1,076 entities with data and all 40 boards. No entity sits outside it, gate-passing or otherwise.&lt;/p&gt;

&lt;p&gt;Had there been a second component, a free fit would have located it only through the priors. θ ~ N(0, 1) would pull its models toward θ = 0, which displays as 100, the reference average, and that 100 would look like a measurement without being one. In the frozen fit this cannot happen for a board in the 2026-Q4 reference, because its a and b are fixed and a model is placed on the scale through its own boards whatever the graph looks like. The risk returns only for a new non-reference board observed solely by models with no anchored boards; today all 40 boards are anchored.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can neighbours be told apart?
&lt;/h3&gt;

&lt;p&gt;The published ranges come from a Laplace approximation and ignore which boards a model happened to be run on. To capture that, we resampled boards: 500 replicates, each drawing the 40 boards with replacement, with item parameters frozen at their reference values and each model's θ refit on the drawn boards (a result counts as many times as its board was drawn). The eligible set was held fixed at the 99 open models that pass the gate on full data, and ranks are among those 99.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh47ljmetolca73m18y52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh47ljmetolca73m18y52.png" alt="90% rank intervals from resampling benchmarks" width="800" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kimi K3 is first in 93.8% of replicates and never below second, for a 90% rank interval of 1–2. All 14 adjacent pairs in the open top 15 have overlapping 90% rank intervals. If we ask instead how often the higher-placed model stays ahead, only one pair clears 95%: DeepSeek V4 Pro 0813 over DeepSeek V4 Flash 0731 (#3 over #4), at 97.4%. Kimi K3 over GLM 5.3 comes close at 94.4%, and from #9 down each adjacent order holds in 48–59% of replicates, about a coin flip.&lt;/p&gt;

&lt;p&gt;The top three stay within ranks 1–4, #4 to #7 form a second block, and from #8 down the intervals spread over roughly 6 to 16. Width tracks coverage more than score: DeepSeek V4.1 Flash, scored on 10 boards, has an interval of #2–11, and MiMo V2.5 Pro, on 6 boards, #9–23, while GLM 5.2 with 24 boards sits at #5–8. We now read the open leaderboard in these tiers and would not defend a one-place gap below the top.&lt;/p&gt;

&lt;h3&gt;
  
  
  What date the 365-day rule uses
&lt;/h3&gt;

&lt;p&gt;A board counts toward the score while it is still receiving current results, meaning its newest date is at most 365 days old. That date is the latest of three per-board values: the newest as_of on an open-model result, the newest as_of on an external result, and the newest release date of an open model scored on the board. Our code comments call the release date a fallback, but the code takes the maximum.&lt;/p&gt;

&lt;p&gt;That makes the rule looser than it reads. We counted, for each of the 40 active boards, the entities with a result dated on or after 2025-10-10. Four boards have fewer than five: Fiction.LiveBench and SWE-bench Lite one each, Aider Polyglot and MATH Level 5 two each. SWE-bench Lite is the weakest case. Its one recent entry is DeepSeek V3.2, whose result is dated 2025-01-11; the board stays active because that model's catalogue release date is 2025-12-01, and under an as_of-only rule it would already be out. MATH Level 5 ages out on 2026-10-15 unless new results arrive. We treat this as a known weakness and intend to tighten the rule, for example by requiring a minimum number of recent results per board.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contamination and missing data
&lt;/h3&gt;

&lt;p&gt;The second reader pointed out that which boards a model is run on is not random, and that uneven contamination could distort how discriminating a board appears. Non-random coverage is what broke the average in Part 1; in the IRT model a missing board carries no penalty and only widens the range, and the resampling above shows how far ranks move with the choice of boards. We list contamination as a limitation and have not measured its effect on a. The a values are fitted once on the 2026-Q4 field and then frozen, so they reflect that field's published results as they stand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands, 2026-10-09
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynypgamiii37z37iznp4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynypgamiii37z37iznp4.png" alt="Top open models with 90% ranges" width="800" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the live fit, 40 reference boards and 4,344 observations produce a published overall score for 384 models, 99 of them open. The open top three are Kimi K3 at 133.6 (90% range 131.9–135.4), GLM 5.3 at 129.9 (127.9–131.8) and DeepSeek V4 Pro 0813 at 129.2 (127.4–131.0); given the rank intervals above, the order of the second and third is not settled. The best model overall, GPT 6 Astra at 157.1, is 23.5 points ahead of the best open one, about 0.94 standard deviations of ability. It has results on only 6 boards, and its range of 150.6–163.7 is more than three times as wide as Kimi K3's.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Contamination inflates scores whenever test questions reach training data; rotating or private sets reduce it and do not remove it. Some leaderboards accept developer-submitted runs with their own scaffolds, and we use each source's published figure as is. Where a proprietary model has several effort variants, we use the best published one. The inputs are English-centric, and knowledge, long context, instruction following, multilingual ability and vision are not covered yet. The scale is tied to a frozen snapshot of the field. The score also says nothing about whether a model fits your hardware; we estimate that separately.&lt;/p&gt;

&lt;p&gt;Part 3 looks at how other composite indices approach the same problem (Epoch's ECI, Artificial Analysis, Arena and others) and what each choice trades away.&lt;/p&gt;

&lt;p&gt;The full method is on the &lt;a href="https://llmrun.dev/benchmark/llmrun-score/methodology" rel="noopener noreferrer"&gt;methodology page&lt;/a&gt;, and current scores are on the &lt;a href="https://llmrun.dev/benchmark/llmrun-score" rel="noopener noreferrer"&gt;leaderboard&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>machinelearning</category>
      <category>statistics</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Why averaging LLM benchmarks gives the wrong leaderboard</title>
      <dc:creator>Alex Fank</dc:creator>
      <pubDate>Mon, 05 Oct 2026 15:20:16 +0000</pubDate>
      <link>https://dev.to/alexfank/why-averaging-llm-benchmarks-gives-the-wrong-leaderboard-boc</link>
      <guid>https://dev.to/alexfank/why-averaging-llm-benchmarks-gives-the-wrong-leaderboard-boc</guid>
      <description>&lt;p&gt;Every few weeks new open-weight model is released with a table of benchmark results, and every few weeks we asked the same practical question: is it better than the one we already run? A single ranked list should answer that. Building one turned out to be harder than we expected, and our first attempt failed in an instructive way. This is the first of three posts about that work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem space
&lt;/h2&gt;

&lt;p&gt;There is no shortage of benchmarks. Epoch AI's capabilities index alone draws on &lt;a href="https://epoch.ai/data/eci-documentation" rel="noopener noreferrer"&gt;more than 50 distinct benchmarks&lt;/a&gt;. The trouble is that no model has been measured on all of them, and numbers that do exist are not always comparable.&lt;/p&gt;

&lt;p&gt;Vendors report results with their own prompts, harnesses and reasoning-effort settings. Hugging Face found that different implementations of MMLU &lt;a href="https://huggingface.co/blog/open-llm-leaderboard-mmlu" rel="noopener noreferrer"&gt;"give widely different numbers and even change the ranking order of the models"&lt;/a&gt;. Independent boards run models themselves, which helps, but every board makes its own choices, and a model appears only on the boards whose maintainers got to it.&lt;/p&gt;

&lt;p&gt;Benchmarks also age. The authors of MMLU-Pro &lt;a href="https://arxiv.org/abs/2406.01574" rel="noopener noreferrer"&gt;note&lt;/a&gt; that performance on earlier benchmarks had begun to plateau, making differences between models hard to discern. GSM8K is a familiar example: a freshly written look-alike set, GSM1k, showed &lt;a href="https://arxiv.org/abs/2405.00332" rel="noopener noreferrer"&gt;accuracy drops of up to 8%&lt;/a&gt; for some model families. New, harder benchmarks appear to separate the frontier models, and the older ones stay on the books.&lt;/p&gt;

&lt;p&gt;Some boards rotate their questions on purpose. LiveBench replaces &lt;a href="https://arxiv.org/abs/2406.19314" rel="noopener noreferrer"&gt;about one sixth of its questions in each update&lt;/a&gt;, so snapshot from one month is not strictly comparable to one from another. We treat each LiveBench snapshot as a unit and never mix scores across snapshots.&lt;/p&gt;

&lt;p&gt;The result is that every model is measured on a different, sparse subset of the available boards. Any composite has to decide what to do about the holes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built first
&lt;/h2&gt;

&lt;p&gt;Our first version, which launched in June 2026, was deliberately plain. We normalized each result with 0 to 1 range between the board's random-guess baseline and its ceiling. Within each category (reasoning, coding, math and so on) we averaged whatever normalized scores a model had. The overall number was then an equal-weight mean of the category sub-scores. Missing entries were never filled with zeros; category a model had no data for was simply absent.&lt;/p&gt;

&lt;p&gt;To keep thin evidence out of the ranking we added a coverage gate: a model needed results in at least three categories, and at least one of them had to be reasoning or coding. There was no minimum number of benchmarks.&lt;/p&gt;

&lt;p&gt;This looked reasonable. It resembles the way several public leaderboards combine results, it is easy to explain, and no benchmark is privileged. We shipped it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it broke
&lt;/h2&gt;

&lt;p&gt;On 2026-09-20 we looked at the open-model ranking after adding several new boards and found something we could not defend. Phi 3.5 MoE Instruct was measured on three benchmarks: PIQA (0.886), GSM8K (0.887) and BoolQ (0.846). Its composite was 83.5. Kimi K3 had results on eighteen benchmarks, including some of the hardest current ones, and its composite was 66.7. The ranking put the three-benchmark model well above the eighteen-benchmark one. Overall, Kimi K3 sat at number 8, behind Llama 2 70B and Phi 3.5 MoE. The top three open entries each had exactly three boards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xkssn2ovoc195zlaanj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xkssn2ovoc195zlaanj.png" alt="v1 leaderboard: three easy benchmarks beat eighteen hard ones" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The mechanism is straightforward once it is visible. Hard modern boards produce low scores, even for excellent models. A model that has been run on many of them gets lower mean for it. A model that was only ever submitted to saturated classics, where nearly everyone scores near the ceiling, is never exposed to that penalty. The average rewards avoiding difficult tests.&lt;/p&gt;

&lt;p&gt;We checked that this was not an artifact of the new boards. Recomputing without the six boards added that day still left the older models on top, with Kimi K3 at number 13.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two fixes we measured and rejected
&lt;/h2&gt;

&lt;p&gt;The first obvious fix is a minimum benchmark count. We tried it. Models with four to eleven easy boards still beat flagships, because the problem is which boards a model has, not how many.&lt;/p&gt;

&lt;p&gt;The second is to standardize each benchmark with a z-score across all models, so an easy board stops being easy. This also failed. A legacy board has a legacy population: a 2023 model compared against other 2023-era models still earns a high z-score. With z-scores over the full field, Kimi K3 only reached number 2, and Falcon 180B and StableBeluga2 were still in the top six.&lt;/p&gt;

&lt;p&gt;We kept a floor of four benchmarks anyway, partly because it matched how we already labeled confidence: three-benchmark composites swing wildly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix that worked for v2: an active panel
&lt;/h2&gt;

&lt;p&gt;What the failures had in common was that old boards were still voting. A benchmark carries information about today's models only while today's models are still being submitted to it. So we changed the rule: a benchmark counts toward the composite only if the newest result on it comes from a model released within the last 365 days.&lt;/p&gt;

&lt;p&gt;The rule is derived from the data rather than curated by hand. Nobody on our side decides that a board is obsolete; if a board goes quiet upstream, it leaves the panel by itself. With this rule, 27 boards were active, and ten saturated classics dropped out, among them GSM8K, HellaSwag, PIQA, BoolQ and MMLU. The four-benchmark floor stayed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ebhc4ug5cxj7ndc5ys1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ebhc4ug5cxj7ndc5ys1.png" alt="Active panel" width="800" height="1400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The chart shows the panel as it stands on 2026-10-05: with more boards imported since, 40 are active, and the same ten classics remain frozen.&lt;/p&gt;

&lt;p&gt;There was a cost, and we accepted it deliberately. 60 of 126 previously ranked models lost their overall rank, because they had been scored mostly on the frozen boards and fell below the floor of four active ones. Qwen2.5-7B-Instruct, with 9.7 million downloads, was among them. We chose not to hide this: a model's benchmarks page now says plainly that it no longer qualifies, instead of silently dropping the section. An absent score means there is not enough current evidence, not that the model is weak.&lt;/p&gt;

&lt;p&gt;After the change Kimi K3 ranked number 1 of 67.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why v2 was still not enough
&lt;/h2&gt;

&lt;p&gt;The active panel fixed the visible absurdity, but it is a patch on the same estimator, and the weakness remained. Averaging still penalizes models that were submitted to hard boards. We saw this directly later on: when we considered folding in two new Epoch boards, our check showed that doing so would move 107 standings, because a drop-and-average penalizes the frontier models that a hard, narrowly covered board was run on. We held those boards out at weight 0, which treats the symptom.&lt;/p&gt;

&lt;p&gt;It also cannot compare models whose benchmark sets do not overlap. If one model was tested on boards A and B, and another on boards C and D, an average of raw scores says nothing about which is stronger. The two sets of boards may differ in difficulty, and nothing in the average tells us by how much.&lt;/p&gt;

&lt;p&gt;That is not a new problem. It is the situation psychometrics has dealt with for decades: people sit different exams, and the exams have to be placed on one scale, with the difficulty of each test estimated from the responses rather than assumed. The tool for that is item response theory. In the second part we will describe how we applied it to benchmark results, and what it changed in the rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  The live leaderboard
&lt;/h2&gt;

&lt;p&gt;The current leaderboard, and the written methodology behind it, are here: &lt;a href="https://llmrun.dev/benchmark/llmrun-score" rel="noopener noreferrer"&gt;llmrun Score leaderboard&lt;/a&gt;. The full method is documented on the &lt;a href="https://llmrun.dev/benchmark/llmrun-score/methodology" rel="noopener noreferrer"&gt;methodology page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>machinelearning</category>
      <category>benchmark</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Estimating tokens/s for Mixture-of-Experts models: active parameters, plus a routing term</title>
      <dc:creator>Alex Fank</dc:creator>
      <pubDate>Mon, 05 Oct 2026 14:33:15 +0000</pubDate>
      <link>https://dev.to/alexfank/estimating-tokenss-for-mixture-of-experts-models-active-parameters-plus-a-routing-term-1oni</link>
      <guid>https://dev.to/alexfank/estimating-tokenss-for-mixture-of-experts-models-active-parameters-plus-a-routing-term-1oni</guid>
      <description>&lt;p&gt;&lt;a href="https://llmrun.dev/how-it-works" rel="noopener noreferrer"&gt;llmrun.dev&lt;/a&gt; estimates whether a given LLM can be run locally and how fast it will decode. The first part of that question is arithmetic. The second required several iterations, and Mixture-of-Experts models were the case where the initial formula was least accurate. This note describes the estimator in its current form, the calibration behind it, and the cases in which it is known to fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decode is a bandwidth problem
&lt;/h2&gt;

&lt;p&gt;During generation, each output token requires reading the weights from memory once. Batch size is 1 on a local machine, so there is almost no arithmetic over which to amortize that read, and speed is set by how fast bytes stream out of VRAM or unified memory. The dense formula used is the standard one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tok/s = (bandwidth GB/s / model size GB) x efficiency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Efficiency is a per-platform constant covering software overhead and the gap between spec-sheet and achievable bandwidth. In the code it is 0.65 for NVIDIA (CUDA), 0.60 for AMD (ROCm 7.x), 0.50 for Intel (oneAPI) and 0.70 for Apple (Metal). These values were taken from community llama.cpp and Ollama results and are treated as calibration constants, not physical quantities. The basis of the estimate is dated in the code (last reviewed 2026-09-21, against llama.cpp / Ollama with GGUF weights), and the methodology page prints that date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why dense math fails for MoE
&lt;/h2&gt;

&lt;p&gt;A Mixture-of-Experts model holds all its experts in memory but routes each token through only a few. VRAM therefore scales with total parameters, while bytes read per token scale with active parameters. gpt-oss-20b has 20.9B total parameters and 3.6B active. Applying the dense formula to its 12.9 GB footprint on an RTX 4090 (1008 GB/s, from the spec sheet) gives about 51 tok/s, whereas llama.cpp's &lt;code&gt;llama-bench&lt;/code&gt; measures about 222 on that card. The dense formula is off by more than 4x, in the pessimistic direction.&lt;/p&gt;

&lt;p&gt;The first correction is to scale the bytes read by the active fraction: the in-memory model size is multiplied by active/total parameters. This is an approximation, since attention and shared weights are not routed and the active count already includes them, but it allows a single ratio taken from the model's config to be used instead of modelling tensors separately. A model takes this path only if active parameters are below 90% of total. Anything denser is treated as dense, in which case the function returns exactly the dense result.&lt;/p&gt;

&lt;h2&gt;
  
  
  The routing term
&lt;/h2&gt;

&lt;p&gt;Scaling bytes alone overshoots. When only 3.6B parameters are read per token, the bandwidth term becomes very small, and a fixed per-layer cost that the formula ignored begins to dominate: evaluating the router and dispatching to expert kernels, once per layer, per token. This cost is modelled as an additive time per layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;seconds/token = active_GB / (bandwidth x efficiency)
              + layers x per_layer_overhead_ms / 1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The per-layer overhead constants are 0.055 ms for NVIDIA and 0.2 ms for Apple, AMD and Intel, with 0.1 ms when the brand is unknown. The NVIDIA value is much lower because CUDA graphs amortize launch cost better than the other llama.cpp backends do. If the layer count is missing, a fallback of 48 is used, the median across MoE models in the catalogue at the time of calibration. The constants were fitted against &lt;code&gt;llama-bench&lt;/code&gt; tg128 (decode) results for gpt-oss-20b and gpt-oss-120b on 8 hardware combinations. They are kept in the test suite as fixtures, so a change to any constant that breaks one of them fails the build.&lt;/p&gt;

&lt;p&gt;Two worked examples follow, computed from the constants above. The bandwidth values are the GPU/SoC spec values used in the fixtures. The measured figures are the &lt;code&gt;llama-bench&lt;/code&gt; results in the fixtures.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;RTX 4090, gpt-oss-20b&lt;/th&gt;
&lt;th&gt;M2 Ultra, gpt-oss-120b&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model in memory&lt;/td&gt;
&lt;td&gt;12.9 GB&lt;/td&gt;
&lt;td&gt;65 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active / total params&lt;/td&gt;
&lt;td&gt;3.6B / 20.9B&lt;/td&gt;
&lt;td&gt;5.1B / 116.8B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bytes read per token&lt;/td&gt;
&lt;td&gt;2.22 GB&lt;/td&gt;
&lt;td&gt;2.84 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth (spec) x efficiency&lt;/td&gt;
&lt;td&gt;1008 x 0.65&lt;/td&gt;
&lt;td&gt;800 x 0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth term&lt;/td&gt;
&lt;td&gt;3.39 ms&lt;/td&gt;
&lt;td&gt;5.07 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layers x overhead&lt;/td&gt;
&lt;td&gt;24 x 0.055 = 1.32 ms&lt;/td&gt;
&lt;td&gt;36 x 0.2 = 7.20 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estimate&lt;/td&gt;
&lt;td&gt;212 tok/s&lt;/td&gt;
&lt;td&gt;81.5 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Measured (llama-bench)&lt;/td&gt;
&lt;td&gt;222&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 4090 case is dominated by bandwidth. In the M2 Ultra case, routing overhead accounts for more than half of the per-token time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accuracy
&lt;/h2&gt;

&lt;p&gt;The test suite asserts that every fixture lies within 18% of its measured value. The public page states an expected error of roughly plus or minus 20% on decode tok/s, and quoting a tighter figure is not justified. Eight fixtures on two model families constitute a small sample. The constants fit gpt-oss well. They have not been validated on every MoE shape (many fine-grained experts, large shared experts), and misses of more than 20% are expected for some of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it breaks
&lt;/h2&gt;

&lt;p&gt;CPU and RAM offload is the largest gap. Once part of the model resides in system RAM, decode speed is pulled toward the slowest tier from which weights are read, and a single bandwidth number is no longer meaningful. The methodology page lists offload as not modelled. Fit still indicates whether the model loads, but the tok/s figure assumes that everything is in fast memory.&lt;/p&gt;

&lt;p&gt;Prefill is a different regime. Reading the prompt is compute-bound, so it is estimated separately: prefill tok/s = dense FP16 TFLOPS x 1e12 x MFU / (2 x active parameters), with MFU of 0.45 for NVIDIA, 0.22 for AMD, 0.18 for Intel and 0.20 for Apple, calibrated on llama.cpp pp512 runs with Q4_K_M weights. Time to first token is the number of prompt tokens divided by that rate. MoE benefits prefill as well, since FLOPs scale with active parameters, but the error bar is wider, about 30%, and wider still where no verified compute figure is available. A fast-decoding card can therefore still impose a long wait before the first token.&lt;/p&gt;

&lt;p&gt;Context length is a further, less visible source of error. The decode formula accounts for the weights and nothing else, so it ignores the growing KV cache that attention also reads on every token. The cache itself is straightforward to size: 2 (K and V) x KV heads x head dim x layers x 2 bytes (FP16) per token. Some architectures keep a full cache on only some layers (linear attention, sliding window), and the VRAM code accounts for that. The speed estimate, however, does not decrease with context, so long-context numbers are optimistic. Quantized KV cache is also not modelled.&lt;/p&gt;

&lt;p&gt;Quantization carries its own overhead. Model size is derived from effective bits per weight, so Q4_K_M files are not exactly 4 bits per weight, and measured sizes from Ollama or llama.cpp are preferred over the computed estimate whenever they exist. Batching, speculative decoding, multi-GPU interconnects and flash-attention variants are likewise outside the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fit, briefly
&lt;/h2&gt;

&lt;p&gt;The fit side is simpler. VRAM is weights (parameters x bits per weight / 8) plus KV cache plus about 0.3 GB of framework overhead. When architecture data is unavailable, the fallback is a flat 10% overhead. "Fits" is judged with room reserved for a 16K-token context, because a model that loads with a 2K cache is not usable for a real conversation.&lt;/p&gt;

&lt;p&gt;The arithmetic for an individual model is printed on its page, for example &lt;a href="https://llmrun.dev/model/openai-gpt-oss-20b" rel="noopener noreferrer"&gt;gpt-oss-20b&lt;/a&gt;. Measurements from &lt;code&gt;llama-bench&lt;/code&gt; that disagree with an estimate by more than the stated error are welcome, since this is how the constants are corrected.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>localllm</category>
      <category>machinelearning</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
