<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>AI compute infrastructure: GPUs, runtimes, inference - LeCompute</title><description>English edition of LeCompute: technical deep dives on AI compute, from GPUs, memory bandwidth and silicon to LLM inference runtimes and serving costs.</description><link>https://lecompute.fr/en/</link><atom:link href="https://lecompute.fr/en/rss.xml" rel="self" type="application/rss+xml"/><language>en-us</language><copyright>© 2026 LeCompute</copyright><lastBuildDate>Tue, 14 Jul 2026 08:12:06 GMT</lastBuildDate><generator>Astro + @astrojs/rss</generator><ttl>60</ttl><docs>https://www.rssboard.org/rss-specification</docs><managingEditor>redaction@lecompute.fr (LeCompute)</managingEditor><webMaster>redaction@lecompute.fr (LeCompute)</webMaster><image><url>https://lecompute.fr/logo_no_name.png</url><title>AI compute infrastructure: GPUs, runtimes, inference - LeCompute</title><link>https://lecompute.fr/en/</link></image><item><title>Nobody knows how to measure coding agents anymore</title><link>https://lecompute.fr/en/runtimes/crise-mesure-agents-codage/</link><guid isPermaLink="true">https://lecompute.fr/en/runtimes/crise-mesure-agents-codage/</guid><description>In five months, OpenAI declared both reference benchmarks for agentic coding broken: SWE-bench Verified in February (at least 16% defective tasks, measured contamination), then SWE-Bench Pro on July 8 (~30% broken tasks), the very one it had been recommending. This is not a scandal, it is metrology: benchmarks saturate under the progress they measure (noise ceiling around 70%), half of the &apos;successful&apos; patches would not be merged by a human maintainer, and the harness effect (10 to 36 points at identical model) weighs as much as a model generation. At the frontier, a public score starts an evaluation; it concludes none. The only reliable eval is the one you build on your own code.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;En bref&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;En bref&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;On July 8, 2026, OpenAI retracted its recommendation of SWE-Bench Pro (~30% broken tasks), five months after abandoning SWE-bench Verified, the instrument it had built itself. Three generations of benchmarks, three obsolescences coming ever faster.&lt;/li&gt;
&lt;li&gt;The mechanism is metrological, not scandalous: models went from 23.3 to 80.3% in eight months and bump against a noise ceiling (~70%) made of defective tasks; beyond it, the gaps measured no longer measure anything. And half of the “successful” patches would not be merged by a human maintainer.&lt;/li&gt;
&lt;li&gt;The dominant variable is no longer the model: at identical model, changing &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1&quot; aria-expanded=&quot;false&quot;&gt; harness &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;harness&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Everything wrapped around a model to turn it into an agent: the exposed tool set and their schemas, the system prompt, project-context injections, the execution loop with permissions and sandbox, the subagents, hooks and MCP servers. At identical model, switching harness moves scores by tens of points on agentic evaluations.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  moves scores by 10 to 36 points, the equivalent of a generation. The only evaluation that really concerns you is the one you run on your own code.&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;a-tweet-at-1141-pm&quot;&gt;A tweet at 11:41 pm&lt;/h2&gt;
&lt;p&gt;On the evening of July 8, OpenAI’s official account posts a message few vendors would dare write: “We audited SWE-Bench Pro, one of the most used AI coding benchmarks, and found that it no longer reliably measures coding capability at the frontier. We estimate that 30% of its tasks are broken, and we retract our earlier recommendation to use it as a reference evaluation.” The next morning, the same company launched GPT-5.6, its new coding model.&lt;/p&gt;
&lt;p&gt;You have to savor the situation in all its depth. SWE-Bench Pro is not an obscure benchmark: it is the one the trade press, comparison tables and discussion threads cite first to separate coding agents. It is also the one OpenAI had officially been recommending since February. And February, precisely: it was already the second time. Five months earlier, the same company had declared the predecessor, SWE-bench Verified, unusable, and advised migrating to Pro. In five months, the sector’s leading lab has therefore declared broken, one after the other, both reference instruments of its own discipline, including the one it had itself crowned.&lt;/p&gt;
&lt;p&gt;The temptation is to read a scandal into it, rigged numbers, a maneuver. The reality is more interesting and more uncomfortable: it is a story of metrology. Code benchmarks did not become bad; they went obsolete under the progress of what they measured, and a second variable, long ignored, started to weigh more heavily than the model itself. This report takes the mechanism apart, piece by piece, because it concerns anyone who has ever chosen a model on the strength of a score table.&lt;/p&gt;
&lt;h2 id=&quot;how-a-benchmark-task-breaks&quot;&gt;How a benchmark task breaks&lt;/h2&gt;
&lt;p&gt;Let us start with what SWE-Bench Pro measures, because the principle is sound. You give the model a real code repository and a real ticket (“this parser mishandles such a case”), it must produce a patch, and hidden tests decide whether the patch is good. No multiple choice, no artificial puzzle: engineering work, judged as in production. On paper, it is the best protocol we know.&lt;/p&gt;
&lt;p&gt;The problem is industrial: these tasks are mass-produced, extracted programmatically from real code changes. But a real code change is not designed to become an exam question. OpenAI’s audit sorts the breakages into four families, and each deserves a moment.&lt;/p&gt;
&lt;p&gt;The biggest: overly strict tests. The ticket asks to fix a behavior, the hidden tests additionally check implementation details that no one specified. A perfectly correct solution fails because it is not &lt;em&gt;the&lt;/em&gt; historical solution. Then comes its mirror image, the under-specified statement: requirements do exist, but only in the tests, invisible from the ticket. The example flagged by the audit is telling: a task from the OpenLibrary project shows a string with a single space in the statement, and the hidden test requires two. No human engineer would pass that kind of test other than by luck. Third family, the exact reverse: tests with too little coverage, which let incomplete patches through. And finally the misleading statement, which actively steers toward the wrong approach.&lt;/p&gt;
&lt;p&gt;Note what these four families have in common: none of them talks about the model. They are task-design defects, statements and tests that do not align. This is an important point, because the February diagnosis on Verified was different (we are coming to it): code benchmarks do not all die of the same disease.&lt;/p&gt;
&lt;h2 id=&quot;the-noise-ceiling-or-why-an-instrument-goes-obsolete&quot;&gt;The noise ceiling, or why an instrument goes obsolete&lt;/h2&gt;
&lt;p&gt;OpenAI’s wording deserves a word-by-word reading: SWE-Bench Pro “no &lt;em&gt;longer&lt;/em&gt; measures” the frontier reliably. No longer. So it did measure something, for a time. What happened in between? Models improved.&lt;/p&gt;
&lt;p&gt;The numbers tell the story better than any speech: on the public set of 731 tasks, the best models went from 23.3% success to 80.3% in eight months. But if roughly 30% of the tasks are broken, the maximum score actually reachable by a perfect agent tops out somewhere around 70%. As long as models struggle at 25 or 40%, this ceiling bothers no one: the gaps between models play out on the valid tasks, and the instrument ranks correctly. But as soon as scores approach the ceiling, everything flips. The points left to win are, for the most part, defective tasks; separating them amounts to measuring which model best guesses the whims of badly designed tests. Like a saturated sensor, the instrument crushes everything above into the same flat zone, and the gaps you read there are noise.&lt;/p&gt;
&lt;p&gt;This is the central mechanism of this report, and it is general: a benchmark is not true or false in the absolute, it is usable within a range. The 2026 frontier has simply left the useful range of benchmarks designed in 2024. They were not wrong; they were surpassed, in the literal sense.&lt;/p&gt;
&lt;p&gt;The audit itself is worth the detour, for its method and its irony. OpenAI first ran an analysis pipeline over the models’ attempts, their failure traces and the task metadata, with Codex-based investigator agents, able to open the real repositories and run the tests. This pipeline flagged 200 broken tasks (27.4%). In parallel, five experienced engineers ran a human annotation campaign, which identified 249 (34.1%), with 74% agreement between the two approaches, hence the median estimate of about 30%. The method is serious. The irony too: it was Codex agents that audited the benchmark tasked with evaluating Codex. The judged tool now certifies the measuring instrument; you could not better illustrate where the discipline stands.&lt;/p&gt;
&lt;h2 id=&quot;three-generations-of-instruments-three-deaths-the-timeline&quot;&gt;Three generations of instruments, three deaths: the timeline&lt;/h2&gt;
&lt;p&gt;Let us pick up the thread from the start, because on one hand the exact scopes of each figure are precisely what the press mangles most, and on the other the July retraction is not the second episode of this story. It is the third.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Timeline of the SWE-bench, Verified and Pro benchmarks, from creation to abandonment&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Instrument&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Born&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Declared broken&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Main cause&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;SWE-bench (Princeton)&lt;/th&gt;&lt;td&gt;late 2023&lt;/td&gt;&lt;td&gt;2024, by OpenAI&lt;/td&gt;&lt;td&gt;unsolvable or under-specified tasks&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;SWE-bench Verified (OpenAI)&lt;/th&gt;&lt;td&gt;August 2024, 500 hand-sorted tasks&lt;/td&gt;&lt;td&gt;February 23, 2026&lt;/td&gt;&lt;td&gt;test defects + contamination + saturation&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;SWE-Bench Pro (Scale AI)&lt;/th&gt;&lt;td&gt;September 2025, anti-contamination design&lt;/td&gt;&lt;td&gt;July 8, 2026&lt;/td&gt;&lt;td&gt;~30% broken tasks (design)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: Three generations of agentic coding benchmarks, three obsolescences coming ever faster.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;At the origin, there is plain SWE-bench, created by Princeton researchers in late 2023: the founding idea, brilliant, of turning real GitHub tickets into exam questions. By 2024, OpenAI finds the benchmark riddled with unsolvable or under-specified tasks, and publishes the remedy: SWE-bench &lt;em&gt;Verified&lt;/em&gt;, 500 tasks hand-sorted by professional developers paid to reread each statement. Keep this detail, it gives the rest its true depth: Verified was not one benchmark among others, it was already &lt;em&gt;the corrected version&lt;/em&gt;, human-validated, co-built by OpenAI itself. It is that remedy which breaks in February 2026. And SWE-Bench Pro, designed at Scale AI precisely to resist the next ailment (&lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-2&quot; aria-expanded=&quot;false&quot;&gt; contamination &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-2&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;contamination&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The presence of a benchmark&apos;s data (problems, solutions) in a model&apos;s training corpus. The score then measures &lt;em&gt;memorization&lt;/em&gt;, not capability: the model recognizes the test instead of solving it. Inevitable in the long run for any public benchmark built from public repositories.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , with repositories under deterrent licenses and a private set), is the remedy’s remedy. It will have lasted less than a year. Three generations, three ever more careful designs, three ever faster obsolescences: this is not a series of accidents, it is a race between the instruments and what they measure, and the instruments are losing it.&lt;/p&gt;
&lt;p&gt;On February 23, 2026, then, OpenAI publishes “Why we no longer evaluate SWE-bench Verified.” The audit does not cover the whole benchmark: it targets the 138 problems (out of 500) that its o3 model repeatedly failed over 64 attempts, the hard subset. Verdict: at least 59.4% of &lt;em&gt;that subset&lt;/em&gt; has substantial defects, tests or description, including 35.5% of overly strict tests. Related to the entire benchmark, that comes to at least 16% broken tasks, not 59: the spectacular figure is true, but on a scope that must be cited with it. The symptom that had triggered the audit speaks for itself: model progress there was stalling, from 74.9 to 80.9% in six months, the characteristic flattening of an instrument hitting its limit.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-warn&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;⚠&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;Scopes, precisely, are the exact spot where these numbers deform as they circulate. The “59.4%” covers the 138 tasks of Verified’s hard subset, not the entire benchmark (where the established floor is ~16%). The “~30%” covers SWE-Bench Pro’s 731 public tasks. Citing one for the other is manufacturing a false statistic out of two true numbers.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;p&gt;Added to this was an ailment Pro does not have to the same degree: contamination. A paper accepted at NeurIPS, with a limpid title (“The SWE-Bench Illusion”), had shown that the best models recovered the file to fix in 76% of cases &lt;em&gt;from the ticket text alone&lt;/em&gt;, without even seeing the repository, against 53% on tasks from repositories outside the benchmark. The models did not always solve the problem; sometimes, they remembered it.&lt;/p&gt;
&lt;p&gt;On March 10, the METR evaluation institute adds the missing piece: even when the tests pass, is the work good? Four maintainers of major open-source projects reread 296 AI-generated patches declared “resolved” by the automatic grader. Their merge verdict is about 24 points below the benchmark scores: around 72% of “successful” tasks, about 48% of patches a maintainer would actually accept. Half of the green displayed would not have passed a human code review, for the usual reasons: missed functionality, regression elsewhere, insufficient quality.&lt;/p&gt;
&lt;p&gt;And on July 8, then, Pro falls in turn, for task-design reasons this time. Three different diagnoses in five months (contamination, test/mergeable gap, defective tasks), three angles on the same finding: at the frontier, the displayed number and real capability have divorced.&lt;/p&gt;
&lt;h2 id=&quot;the-hidden-variable-worth-a-model-generation&quot;&gt;The hidden variable worth a model generation&lt;/h2&gt;
&lt;p&gt;There is still a floor missing from the explanation, and it is the most counter-intuitive. Grant a benchmark with perfect tasks: would the score obtained finally measure “the model”? Not that either. Because a model never sits a benchmark alone: it sits it in a harness, that gear of tools, system prompt, execution loop and context management we dissected in &lt;a href=&quot;https://lecompute.fr/en/couts/gpt-5-6-codex-remontada/&quot;&gt;the report on OpenAI’s comeback&lt;/a&gt;. And the harness effect on scores is not a second-order detail. It is a term of the same order of magnitude as the progress of a model generation.&lt;/p&gt;
&lt;p&gt;The measurements pile up:&lt;/p&gt;
&lt;figure class=&quot;blog-bar-chart&quot; aria-label=&quot;Harness effect: same model, two harnesses, gaps of 14 to 36 points&quot;&gt; &lt;div class=&quot;blog-bar-chart__head&quot; aria-hidden=&quot;true&quot;&gt; &lt;figcaption&gt;Success (%)&lt;/figcaption&gt; &lt;div class=&quot;blog-bar-chart__legend&quot; aria-label=&quot;Légende&quot;&gt; &lt;span class=&quot;blog-bar-chart__legend-item is-neutral&quot;&gt; &lt;i aria-hidden=&quot;true&quot;&gt;&lt;/i&gt; Minimal / native harness &lt;/span&gt;&lt;span class=&quot;blog-bar-chart__legend-item is-accent&quot;&gt; &lt;i aria-hidden=&quot;true&quot;&gt;&lt;/i&gt; Optimized harness &lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&quot;blog-bar-chart__frame&quot; aria-hidden=&quot;true&quot;&gt; &lt;div class=&quot;blog-bar-chart__axis&quot; aria-hidden=&quot;true&quot;&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;25&lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;span&gt;75&lt;/span&gt;&lt;span&gt;100&lt;/span&gt; &lt;/div&gt; &lt;div class=&quot;blog-bar-chart__plot&quot; role=&quot;img&quot; aria-label=&quot;Harness effect: same model, two harnesses, gaps of 14 to 36 points&quot;&gt; &lt;div class=&quot;blog-bar-chart__group&quot;&gt; &lt;div class=&quot;blog-bar-chart__bars&quot;&gt; &lt;div class=&quot;blog-bar-chart__bar is-neutral&quot; title=&quot;Minimal / native harness - GPT-5.5 (Endor Labs): 61.5&quot;&gt; &lt;span class=&quot;blog-bar-chart__value&quot;&gt;61.5&lt;/span&gt; &lt;/div&gt;&lt;div class=&quot;blog-bar-chart__bar is-accent&quot; title=&quot;Optimized harness - GPT-5.5 (Endor Labs): 87.2&quot;&gt; &lt;span class=&quot;blog-bar-chart__value&quot;&gt;87.2&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class=&quot;blog-bar-chart__group&quot;&gt; &lt;div class=&quot;blog-bar-chart__bars&quot;&gt; &lt;div class=&quot;blog-bar-chart__bar is-neutral&quot; title=&quot;Minimal / native harness - Opus (independent test): 42&quot;&gt; &lt;span class=&quot;blog-bar-chart__value&quot;&gt;42&lt;/span&gt; &lt;/div&gt;&lt;div class=&quot;blog-bar-chart__bar is-accent&quot; title=&quot;Optimized harness - Opus (independent test): 78&quot;&gt; &lt;span class=&quot;blog-bar-chart__value&quot;&gt;78&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class=&quot;blog-bar-chart__group&quot;&gt; &lt;div class=&quot;blog-bar-chart__bars&quot;&gt; &lt;div class=&quot;blog-bar-chart__bar is-neutral&quot; title=&quot;Minimal / native harness - deepagents-cli (LangChain): 52.8&quot;&gt; &lt;span class=&quot;blog-bar-chart__value&quot;&gt;52.8&lt;/span&gt; &lt;/div&gt;&lt;div class=&quot;blog-bar-chart__bar is-accent&quot; title=&quot;Optimized harness - deepagents-cli (LangChain): 66.5&quot;&gt; &lt;span class=&quot;blog-bar-chart__value&quot;&gt;66.5&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&quot;blog-bar-chart__labels&quot;&gt; &lt;p&gt;GPT-5.5 (Endor Labs)&lt;/p&gt;&lt;p&gt;Opus (independent test)&lt;/p&gt;&lt;p&gt;deepagents-cli (LangChain)&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;table class=&quot;blog-bar-chart__data sr-only&quot;&gt; &lt;caption&gt;Harness effect: same model, two harnesses, gaps of 14 to 36 points (Success (%))&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Minimal / native harness&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Optimized harness&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-5.5 (Endor Labs)&lt;/th&gt; &lt;td&gt;61.5&lt;/td&gt;&lt;td&gt;87.2&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Opus (independent test)&lt;/th&gt; &lt;td&gt;42&lt;/td&gt;&lt;td&gt;78&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;deepagents-cli (LangChain)&lt;/th&gt; &lt;td&gt;52.8&lt;/td&gt;&lt;td&gt;66.5&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p class=&quot;blog-bar-chart__caption&quot;&gt;Same model, two harnesses: three independent measurements (Endor Labs on SWE-bench, an independent test on Opus, LangChain on Terminal Bench). The harness moves the score as much as a model generation.&lt;/p&gt; &lt;/figure&gt;
&lt;p&gt;A dedicated research paper (Claw-SWE-Bench) quantifies gaps of up to 27.4 points of success between harnesses, on the same model and the same 350 tasks. Endor Labs measured GPT-5.5 at 61.5% in Codex’s native harness and 87.2% in Cursor’s, the same week: 25.7 points. An independent test swung Opus from 42% with minimal scaffolding to 78% with Claude Code’s full harness: 36 points, without touching the model. LangChain gained 13.7 points on Terminal Bench by changing only its harness, model strictly identical. The trade press settles on a range of 10 to 20 points of routine gap on SWE-bench at constant model, and OpenAI provides an involuntary demonstration in the GPT-5.6 announcement itself: Sol alone gets 88.8% on Terminal-Bench 2.1, and 91.9% when its “ultra” mode coordinates four agents. Same model, plus three points, all it took was changing the orchestration.&lt;/p&gt;
&lt;p&gt;And even at a fixed model-harness pair, ordinary variance remains. An agent is not deterministic: from one run to the next, it explores differently, fails or passes borderline tasks. Serious protocols average several random seeds (OpenAI’s cyber evaluations use five per measurement); the press tables, meanwhile, often compare single runs. Two or three points of gap between models, on one run, with no confidence interval: that is not a ranking, it is a draw.&lt;/p&gt;
&lt;p&gt;The consequence is brutal for how we talk about these systems: “model X’s score” does not exist. Only the score of a model-harness pair exists, in a given configuration, on a given date, averaged or not. When two tables give incompatible numbers for “the same model”, there is a good chance both are accurate.&lt;/p&gt;
&lt;p&gt;That leaves the question of why the instruments go obsolete faster and faster, and the answer lies in an old law of measurement: when a metric becomes a target, it ceases to be a good metric. A public reference benchmark is not a neutral thermometer set beside the market; it is the target, explicit or not, of labs worth hundreds of billions that communicate in points gained. Each training cycle absorbs a little more of the benchmark, through direct contamination of the corpora or through simple selection pressure on what scores. The faster the industry optimizes, the shorter the useful life of a public yardstick. The original SWE-bench did not last a year before requiring its corrected version; Verified lasted eighteen months; Pro, less than a year. The rest is predictable.&lt;/p&gt;
&lt;h2 id=&quot;what-vendors-publish-and-what-to-make-of-it&quot;&gt;What vendors publish, and what to make of it&lt;/h2&gt;
&lt;p&gt;This landscape casts a particular light on the July 9 communication. Far from skipping benchmarks, the GPT-5.6 announcement lines up the full range: the classic academic ones (GPQA, AIME, MMLU) as well as the agentic ones. It even publishes a figure on that very SWE-Bench Pro the company had just declared broken, and on which Sol actually stays behind Fable 5, 64.6% against 80%. Two anchors, however, call for caution: Artificial Analysis’s index, given as a third party, is an OpenAI pre-evaluation partner, a quality judge more than an independent one; and a footnote specifies that the latencies and costs shown are simulated offline, not measured in production.&lt;/p&gt;
&lt;p&gt;The sequence also has to be reported in its exact order, because it feeds a reading you can neither assert nor ignore. On SWE-Bench Pro, Anthropic’s models dominated clearly: 69.2% for Opus 4.8 against 58.6% for GPT-5.5 in the spring. The benchmark where OpenAI was most visibly losing is the one it disavowed on July 8, the eve of its model’s launch. In its favor, the next day’s announcement did not hide the figure: the unfavorable score is there, disavowal included. If there is a maneuver, it is therefore subtler: publish the number and discredit the yardstick in the same gesture. There are the dated facts; the strategic reading remains a hypothesis, and honesty requires saying that the methodological critique, for its part, is solid, corroborated by independent work with nothing to sell (the NeurIPS paper on contamination, the METR note). Add the full irony: the retraction spares no one. Anthropic’s 69.2% rests on the same instrument declared broken; the scores brandished one way or the other now float on the same 30% of defective tasks. No one comes out taller from a warped yardstick.&lt;/p&gt;
&lt;h2 id=&quot;measuring-yourself&quot;&gt;Measuring yourself&lt;/h2&gt;
&lt;p&gt;What is left, then? OpenAI’s recommendation fits in one line and it is demanding: benchmarks built directly by experienced engineers, with human supervision integrated from the design stage, not generated in bulk then verified after the fact. Concretely, this looks like the GDPval-type evaluations the company now promotes: tasks written one by one by professionals in the field, with a rubric, judged by humans, at an accepted production cost. It is the admission that quality measurement does not industrialize: what made SWE-bench appealing (thousands of free tasks extracted from GitHub) is exactly what killed it. No successor is anointed for all that; the discipline is starting over from the drawing board.&lt;/p&gt;
&lt;p&gt;In the meantime, two families of tools keep their value, precisely because they have internalized the problem. The independent trackers, first: Marginlab runs Codex daily on a contamination-resistant subset of tasks, fifty instances a day, with no custom harness, with a statistical test before declaring a drift; it is this protocol that detected an 8-point degradation of Claude Code in late May, invisible in static benchmarks. Scale SEAL, which we were already citing in &lt;a href=&quot;https://lecompute.fr/couts/glm-5-2-open-weight-souverainete/&quot;&gt;the GLM-5.2 report&lt;/a&gt;, plays the same role of standardized yardstick. Their value comes not from miraculously perfect tasks, but from the protocol: constant conditions, repeated measurements, significance thresholds. Metrology, in the full sense.&lt;/p&gt;
&lt;p&gt;The second family is yours. The teams that come out best have stopped reading other people’s tables and built themselves internal evaluations on their own code: real defects injected into their own pull requests, their languages, their conventions, judged on what a human reviewer would accept. On a smaller scale, the minimal protocol fits in one sentence: before switching model or tool, take five real tasks from your backlog, run them in A/B, measure review time and error rate, and decide on that. Five tasks from your repository are worth more than seven hundred broken tasks from someone else’s.&lt;/p&gt;
&lt;p&gt;A method confession, to finish, because it illustrates the reflex to install. Our GLM-5.2 report, published three weeks before the retraction, cited SWE-Bench Pro scores. We had labeled them vendor figures, not replicated, with the independent aggregate index as the only level anchor; that is what lets them age with dignity today: the label survived the instrument. It is exactly the contract that coding-agent measurement now imposes on everyone, vendors, press and readers: each figure with its scope, its date, its harness and its judge. The frontier advances faster than its instruments; there is no reason for that to stop, and the benchmarks that replace SWE-Bench Pro will go obsolete in turn. Measurement is no longer a reading, it has become work again. Yours, preferably.&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Editorial freeze date: July 11, 2026. Labels: &lt;strong&gt;verified fact&lt;/strong&gt; (primary source), &lt;strong&gt;estimate&lt;/strong&gt; (third-party analysis), &lt;strong&gt;hypothesis&lt;/strong&gt; (assumed reading).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The July 8 retraction&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: OpenAI, &lt;em&gt;Separating signal from noise in coding evaluations&lt;/em&gt; (&lt;a href=&quot;https://openai.com/index/separating-signal-from-noise-coding-evaluations/&quot;&gt;openai.com&lt;/a&gt;, July 8, 2026) and official @OpenAI post on X (July 8, 11:41 pm): 731 tasks, pipeline 200 (27.4%), human review 249 (34.1%), 74% agreement, ~30% estimate; four defect families; progress 23.3 → 80.3% in eight months.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The genealogy of the instruments&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: SWE-bench: Jimenez et al., Princeton (&lt;a href=&quot;https://arxiv.org/abs/2310.06770&quot;&gt;arXiv 2310.06770&lt;/a&gt;, ICLR 2024). SWE-bench Verified: OpenAI, &lt;em&gt;Introducing SWE-bench Verified&lt;/em&gt; (August 2024, 500 human-validated tasks). SWE-Bench Pro: Scale AI (September 2025, anti-contamination design).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: OpenAI, &lt;em&gt;Why we no longer evaluate SWE-bench Verified&lt;/em&gt; (&lt;a href=&quot;https://openai.com/index/why-we-no-longer-evaluate-swe-bench-verified/&quot;&gt;openai.com&lt;/a&gt;, February 23, 2026): 138/500 problems audited, ≥ 59.4% of that subset defective (35.5% overly strict tests), stagnation 74.9 → 80.9%.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: &lt;em&gt;The SWE-Bench Illusion&lt;/em&gt; (&lt;a href=&quot;https://arxiv.org/abs/2506.12286&quot;&gt;arXiv 2506.12286&lt;/a&gt;, Purdue/Microsoft, NeurIPS 2025): 76% identification of the faulty file from the ticket alone, 53% outside the benchmark, verbatim similarity 35% against 18%.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: METR, &lt;em&gt;Many SWE-bench-passing PRs would not be merged into main&lt;/em&gt; (&lt;a href=&quot;https://metr.org/notes/2026-03-10-many-swe-bench-passing-prs-would-not-be-merged-into-main/&quot;&gt;metr.org&lt;/a&gt;, March 10, 2026): 296 PRs reread by 4 maintainers, verdict ~24 points below the automatic grader, “golden” baseline 68%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The harness effect and variance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Claw-SWE-Bench (&lt;a href=&quot;https://arxiv.org/abs/2606.12344&quot;&gt;arXiv 2606.12344&lt;/a&gt;): up to 27.4 points between harnesses at constant model. Endor Labs: GPT-5.5 at 61.5% (native Codex) against 87.2% (Cursor), same week. LangChain, &lt;em&gt;Improving Deep Agents with harness engineering&lt;/em&gt;: +13.7 points at fixed model.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Estimate&lt;/em&gt;: Opus from 42 to 78% depending on scaffolding (independent test published in April 2026); “10-20 points” range (trade press). The “5-15 points” range going around has no identifiable primary source: we do not repeat it.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: GPT-5.6 announcement (&lt;a href=&quot;https://openai.com/index/gpt-5-6/&quot;&gt;openai.com&lt;/a&gt;, July 9): SWE-Bench Pro Sol 64.6% against Fable 5 80%; Terminal-Bench 2.1 at 88.8% (Sol) against 91.9% (ultra mode, 4 agents); latencies and costs “simulated” (footnote 4); cyber evaluations at 5 seeds per measurement; Artificial Analysis pre-evaluation partner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Scores and trackers&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: SWE-Bench Pro: Opus 4.8 at 69.2%, GPT-5.5 at 58.6% (April GPT-5.5 post and trackers); Sol at 64.6% against 80% for Fable 5 (July 9 GPT-5.6 post, published alongside the instrument’s disavowal). &lt;a href=&quot;https://marginlab.ai/trackers/codex&quot;&gt;Marginlab&lt;/a&gt;: daily protocol, N = 50, p &amp;lt; 0.05, 8-point Claude Code degradation detected in late May 2026. Scale SEAL: standardized yardstick (cf. &lt;a href=&quot;https://lecompute.fr/couts/glm-5-2-open-weight-souverainete/&quot;&gt;GLM-5.2 report&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Method note.&lt;/strong&gt; This article reports the July 8-9 sequence (retraction on the eve of launch) as dated facts; any strategic reading is flagged as a hypothesis. The scopes of the percentages (59.4% on Verified’s hard subset; ~30% on Pro’s public set) are cited with each figure, because their confusion is precisely the deformation mode this report documents. This article is the English adaptation of a French original, &lt;a href=&quot;https://lecompute.fr/runtimes/crise-mesure-agents-codage/&quot;&gt;published on July 13, 2026&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><media:content url="https://lecompute.fr/images/photos/crise-mesure.webp" medium="image"/><media:description>A precision measuring instrument on a dark worktop, its digital display saturated and unreadable</media:description><category>Benchmarks</category><category>SWE-bench</category><category>Coding agents</category><category>Evaluation</category><category>OpenAI</category><category>Harness</category><category>Metrology</category><author>redaction@lecompute.fr (Christophe Gerardin)</author></item><item><title>GPT-5.6 and the Codex merger: anatomy of OpenAI&apos;s comeback</title><link>https://lecompute.fr/en/couts/gpt-5-6-codex-remontada/</link><guid isPermaLink="true">https://lecompute.fr/en/couts/gpt-5-6-codex-remontada/</guid><description>On July 8, 2026, OpenAI disavowed SWE-Bench Pro, the reference benchmark for agentic coding; on the 9th, it merged Codex into the ChatGPT application and launched GPT-5.6 in three tiers (Sol, Terra, Luna). On the available measurements, Sol reaches Claude Fable 5&apos;s level, and at model parity the decision shifts to economics: API price halved, token efficiency, prompt cache retained for thirty minutes, and a fast mode that draws on the plan where Anthropic bills in usage credits. OpenAI&apos;s comeback is not a victory of intelligence: it is a complete system, model, harness and plan, that has become undecidable on quality and very decidable on everything else.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;En bref&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;En bref&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;In forty-eight hours, OpenAI disavowed the benchmark it had been recommending for agentic coding (SWE-Bench Pro, ~30% broken tasks), merged Codex into a single ChatGPT application and launched GPT-5.6 in three pricing tiers. An offensive that turns less on raw intelligence than on price, product and plan.&lt;/li&gt;
&lt;li&gt;On the available measurements, GPT-5.6 Sol reaches Claude Fable 5’s level: the lead Anthropic held, which we were still describing in &lt;a href=&quot;https://lecompute.fr/couts/glm-5-2-open-weight-souverainete/&quot;&gt;the GLM-5.2 report&lt;/a&gt;, has just fallen. That parity is still measured by an OpenAI partner, with no independent replication.&lt;/li&gt;
&lt;li&gt;At model parity, the decision turns on economics and the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-3&quot; aria-expanded=&quot;false&quot;&gt; harness &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-3&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;harness&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Everything wrapped around a model to turn it into an agent: the exposed tool set and their schemas, the system prompt, project-context injections, the execution loop with permissions and sandbox, the subagents, hooks and MCP servers. At identical model, switching harness moves scores by tens of points on agentic evaluations.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; : API price halved, half as many tokens per task, cache retained thirty minutes against five, fast mode inside the plan versus &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-4&quot; aria-expanded=&quot;false&quot;&gt; usage credits &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-4&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;usage credits&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;At Anthropic, a pool of credits billed &lt;em&gt;on top of&lt;/em&gt; the subscription, at API rates, when usage falls outside the plan (fast mode, premium models like Fable 5). The opposite of an all-inclusive plan: speed or the high end trigger a second, pay-as-you-go bill.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , and an agent orchestration built into the consumer app.&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;forty-eight-hours-to-sum-up-six-months&quot;&gt;Forty-eight hours to sum up six months&lt;/h2&gt;
&lt;p&gt;On the evening of July 8, OpenAI publishes a research post that retracts its own recommendation: SWE-Bench Pro, the benchmark the company itself had been advising the community to use since February to evaluate coding agents, is said to contain roughly 30% broken tasks. The next morning, the same company merges Codex into a single ChatGPT application (the old app is renamed “ChatGPT Classic”, the Atlas browser is slated for sunset on August 9), launches GPT-5.6 in three variants, and publishes the full range of scores, down to those of the benchmark it had just declared broken.&lt;/p&gt;
&lt;p&gt;Two gestures in forty-eight hours, and the whole story fits inside them. On one side, an admission: at the frontier, public measurement instruments no longer separate much, and we will devote an entire report to this measurement crisis. On the other, a perfectly orchestrated offensive: a model that reaches Anthropic’s level, prices that slip below its own at every tier, and a product overhaul that installs OpenAI’s coding tool at the center of an application claiming 900 million weekly users.&lt;/p&gt;
&lt;p&gt;Six months ago, the question barely arose. Among developers, Claude Code dominated the usage and satisfaction surveys, and OpenAI’s models, whatever their published scores, were not convincing hands on the keyboard. Since GPT-5.5 in April, then 5.6 last week, the movement has reversed: teams are migrating, colleagues you thought were settled at Anthropic are switching back to Codex, and the sentiment going around is that you can now switch “without compromise.” This report examines what, in this comeback, belongs to the model, what belongs to price, and what belongs to everything around it. You will see that all three count, but not in the order you might think.&lt;/p&gt;
&lt;h2 id=&quot;sol-terra-luna-tiers-not-sizes&quot;&gt;Sol, Terra, Luna: tiers, not sizes&lt;/h2&gt;
&lt;p&gt;Let us start with the launch itself, because its structure already tells a strategy. GPT-5.6 has been available since July 9, after an open preview on June 26 to about twenty organizations vetted by the US government, an unprecedented arrangement that OpenAI publicly stated its opposition to. The family arrives with a new naming system: the number identifies the generation, and Sol, Terra and Luna designate “durable capability tiers”, each meant to progress at its own pace. Sol is the flagship, Terra the mid-range, Luna the fast and economical tier.&lt;/p&gt;
&lt;p&gt;The important word is “tier”, and it is as much about pricing as it is technical. The grid speaks for itself:&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Comparison of API prices for GPT-5.6 Sol, Terra, Luna and Anthropic models&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Model&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Input (€/M tokens)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Output (€/M tokens)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Note&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-5.6 Sol&lt;/th&gt;&lt;td&gt;€4.60 ($5)&lt;/td&gt;&lt;td&gt;€27.60 ($30)&lt;/td&gt;&lt;td&gt;= GPT-5.5 pricing&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-5.6 Terra&lt;/th&gt;&lt;td&gt;€2.30 ($2.50)&lt;/td&gt;&lt;td&gt;€13.80 ($15)&lt;/td&gt;&lt;td&gt;&amp;quot;competitive with 5.5&amp;quot; at half price&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-5.6 Luna&lt;/th&gt;&lt;td&gt;€0.92 ($1)&lt;/td&gt;&lt;td&gt;€5.52 ($6)&lt;/td&gt;&lt;td&gt;the volume tier&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Claude Fable 5&lt;/th&gt;&lt;td&gt;€9.20 ($10)&lt;/td&gt;&lt;td&gt;€46.00 ($50)&lt;/td&gt;&lt;td&gt;2× Sol on input, +67% on output&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Claude Opus 4.8&lt;/th&gt;&lt;td&gt;€4.60 ($5)&lt;/td&gt;&lt;td&gt;€23.00 ($25)&lt;/td&gt;&lt;td&gt;the former flagship, now affordable&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: API prices per million tokens, July 2026. At each level of need, OpenAI places a model cheaper than the one across the aisle.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;That leaves the real question: how good is Sol? On the available measurements, the answer is: the frontier. Artificial Analysis’s Coding Agent index places it at 80.0 against 77.2 for Fable 5, consuming half as many output tokens and for roughly a third less cost per task. On Terminal-Bench 2.1, Sol leads Fable 5 by more than five points. On the same evaluator’s aggregate intelligence index, Fable 5 keeps a one-point lead. One point one way, nearly three the other: at that level of proximity, and given what the instruments are worth today, the right word is parity.&lt;/p&gt;
&lt;p&gt;You have to measure what that parity represents. In &lt;a href=&quot;https://lecompute.fr/couts/glm-5-2-open-weight-souverainete/&quot;&gt;our GLM-5.2 report&lt;/a&gt;, three weeks ago, we were describing Anthropic as an anomaly: Fable 5 then Opus 4.8 towered over the whole pack, with roughly a generation’s lead over the rest of the world. It is that lead which has just fallen, and it is the model event of this launch.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-warn&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;⚠&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;Three caveats come with this parity, and they are not decorative. Artificial Analysis is an OpenAI pre-evaluation partner, not a perfectly neutral third party, and no independent replication existed the day after launch. The latencies and costs shown in the announcement are &lt;em&gt;simulated&lt;/em&gt; (per its own footnote), not measured in production. And the same announcement publishes a figure on SWE-Bench Pro, the instrument disavowed the day before, where Sol stays well behind Fable 5: 64.6% against 80. A real gap, measured on a yardstick its own maker considers ~30% broken: parity reads on the agentic indices, it is not a consensus across every instrument. It is the most solid hypothesis available; it is not yet a replicated fact.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;p&gt;One governance detail is worth the detour: the system card classifies all three tiers, Luna included, at the “High” risk level for cyber and biochem. The economical models in the range are therefore not “lightweight” versions from the standpoint of sensitive capabilities. You pay less, you do not get a throttled model.&lt;/p&gt;
&lt;h2 id=&quot;what-developers-are-doing-and-what-to-make-of-it&quot;&gt;What developers are doing, and what to make of it&lt;/h2&gt;
&lt;p&gt;The adoption figures now, keeping the labels well in sight. OpenAI claims more than 5 million weekly Codex users, “twice as many as three months ago.” It is a vendor figure, with no third-party verification, and the company’s successive snapshots are not perfectly consistent with each other either: 1.6 million in March, more than 4 million on April 21, more than 5 million in early June. The doubling in three months announced in July implies around 2.5 million in mid-April, which sits poorly with the 4 million of the 21st. The order of magnitude and the slope, though, are hardly in doubt; the precision, less so.&lt;/p&gt;
&lt;p&gt;Across the aisle, the most solid data predates the wave. The Pragmatic Engineer survey published on March 7, over 906 experienced engineers, gave Claude Code both the most used and the most loved tool, cited by 46% of respondents, twice as much as Cursor and five times as much as Copilot. JetBrains’s January barometer awarded it the best satisfaction in its category. The winter snapshot is unambiguous; it is spring that moved it.&lt;/p&gt;
&lt;p&gt;And on perceived quality, be wary of the two corpora in circulation, for symmetrical reasons. The testimonials that ground the classic “split” (Codex cheaper, Claude better on complex code) mostly date from the GPT-5.5 era: the April migrations driven by costs, the comparative tests noting that Codex truncates the middle of long sessions where Claude keeps everything. The impressions on 5.6 are a few days old: Simon Willison finds it “very competent” without being struck by any superiority over Fable on complex tasks, Matt Shumer judges Fable “clearly better” on almost everything he tested. Neither corpus settles Sol’s real quality over the long run. What the author of these lines can add to the file, in the first person and as mere testimony: using both tools daily, the step that still existed last year between what an OpenAI agent and an Anthropic agent produced, at equal instructions, is no longer felt day to day. It is precisely when the difference stops being felt that everything else starts to count double.&lt;/p&gt;
&lt;h2 id=&quot;the-trade-off-piece-by-piece&quot;&gt;The trade-off, piece by piece&lt;/h2&gt;
&lt;p&gt;Because at perceived parity, economics decide. And that economics does not reduce to the price per million tokens. It plays out in three mechanisms every agent developer knows from their bill, if not in detail.&lt;/p&gt;
&lt;p&gt;The first is token efficiency. Sam Altman claims a Sol “54% more token-efficient” on agentic coding tasks; it is an in-house figure, but Artificial Analysis’s measurement points the same way with half as many output tokens as Fable 5 for an equivalent task. On an agentic workload, where the model reasons, calls tools, rereads itself and starts over, the number of tokens emitted weighs more than the unit rate. A model half as talkative at equal price is, from the bill’s point of view, a model half as expensive.&lt;/p&gt;
&lt;p&gt;The second is the prompt cache, the mechanism that avoids re-billing the already-sent context on every turn. GPT-5.6 marks an alignment on Anthropic’s model, with writes billed at 1.25× the input rate (a first for OpenAI, it was free before) and reads at 10% of the price. But one parameter changes everything for agents: the minimum cache retention is thirty minutes at OpenAI, against five minutes by default at Anthropic. An agent loop waiting for a test suite to finish or for a human approval finds its cache still there at one vendor, and often pays for it again at the other. It is an infrastructure detail; multiplied by the context re-sent continuously, which makes up the bulk of agent bills, it becomes a budget line.&lt;/p&gt;
&lt;p&gt;The third is fast mode, and it is the most revealing, because the technique is identical and the commercial policy opposite. On both sides, “fast” means the same thing: a priority routing in the serving infrastructure, the same model served roughly 1.5 to 2.5 times faster. At OpenAI, this mode burns the subscription’s credits faster (2.5× the standard rate for GPT-5.5), but it draws on the plan. At Anthropic, fast mode, like Fable 5 itself, switches to usage credits billed at the API rate, outside the plan. In one case, accelerating drains the plan faster; in the other, accelerating triggers a second, unpredictable bill. Add the special case of GPT-5.3-Codex-Spark, a distinct model distilled for speed, served on Cerebras’s wafer-scale chips at more than 1,000 tokens per second, reserved for Pro subscribers and rationed according to demand: OpenAI has turned latency into a product, with a range.&lt;/p&gt;
&lt;p&gt;It has to be said plainly, because the reverse shortcut is going around: nothing documents that OpenAI’s compute capacity lets it sell speed for less. Fast costs more credits, Spark is rationed. What the plan changes is predictability: a developer knows what they will pay at the end of the month. And if there is one lesson spring 2026 taught teams, it is that the predictability of the bill has become a selection criterion as structuring as model quality.&lt;/p&gt;
&lt;h2 id=&quot;the-spring-the-subscriptions-cracked&quot;&gt;The spring the subscriptions cracked&lt;/h2&gt;
&lt;p&gt;That spring deserves to be told in order, because the sequence is eloquent.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Timeline of pricing events from April to July 2026&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Date&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Event&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;April 2&lt;/th&gt;&lt;td&gt;Codex moves from per-message billing to token-aligned billing&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;May 6&lt;/th&gt;&lt;td&gt;Anthropic doubles Claude Code&amp;#39;s 5-hour limits (SpaceX deal, +300 MW)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;May 13-14&lt;/th&gt;&lt;td&gt;Anthropic announces programmatic usage will leave the plans on June 15; Microsoft cancels its internal Claude Code licenses; Altman offers 2 months of Codex to enterprises&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;June 9&lt;/th&gt;&lt;td&gt;Fable 5 launches, included in the subscriptions until June 22&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;June 12&lt;/th&gt;&lt;td&gt;Fable 5 and Mythos 5 suspended by export-control directive&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;June 15&lt;/th&gt;&lt;td&gt;Anthropic cancels the plan split, on the very day it was to take effect&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;June 30 - July 1&lt;/th&gt;&lt;td&gt;Directive lifted; Fable 5 redeployed, included at 50% of the weekly limits&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;July 8-9&lt;/th&gt;&lt;td&gt;SWE-Bench Pro retraction; Codex/ChatGPT merger; GPT-5.6 launch&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 2: Three months that redrew the economics of coding agents.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;On April 2, OpenAI drops per-message billing for Codex in favor of token-aligned billing: the subscription’s credits now burn in proportion to what the requests actually cost, with a self-reported average cost of €92 to €184 per developer per month ($100 to $200), with high variance. On May 6, Anthropic doubles Claude Code’s five-hour limits and removes peak-hour throttling, leaning on an infrastructure deal with SpaceX for more than 300 megawatts. On May 13, the weekly caps gain 50% until July 13. Generosity climbs on both sides, and it climbs because capacity finally allows it.&lt;/p&gt;
&lt;p&gt;Then comes mid-May, and three events in twenty-four hours. On the 13th and 14th, Anthropic announces that programmatic usage of its subscriptions (the agent SDK, the non-interactive command-line interface, the GitHub Actions integrations) will leave the plans on June 15 to shift to a credit pool metered at the API rate. The economic logic is plain: community analyses estimated that some users extracted from their subscription a compute value of twelve to more than a hundred times its price, figures never confirmed by Anthropic but which the head of Claude Code, Boris Cherny, commented on without denying: “our subscriptions were not designed for the usage patterns of these third-party tools.” Also on May 14, The Verge reveals that Microsoft is canceling most of the internal Claude Code licenses in its Windows and Office division, deadline June 30, migration to the in-house tool, under the official banner of “unifying the toolchain.” And the same day, Sam Altman offers two months of Codex free to any company that switches within thirty days. Note the coordination.&lt;/p&gt;
&lt;p&gt;The epilogue says everything about the competitive pressure: on June 15, the very day it was to take effect, the pool switch is canceled. Anthropic explains that it is reworking the arrangement to “better support how users build with the subscriptions.” Between the announcement and the cancellation, a month had passed; over the same period, Codex’s in-house counters went from more than 4 million weekly users in late April to more than 5 million in early June.&lt;/p&gt;
&lt;p&gt;To grasp what these plans subsidize, the Uber case, documented by Forbes, serves as a benchmark: €138 to €230 per engineer per month on average ($150 to $250), intensive users between €460 and €1,840, adoption up from 32% of engineers in February to 84% in March, roughly 70% of committed code AI-originated, and an annual AI budget exhausted by April. Agentic AI coding is no longer a productivity gadget: it is a first-order budget line, and that is exactly why the subscription war has become the real battlefield.&lt;/p&gt;
&lt;h2 id=&quot;the-fable-5-aside-or-pricing-under-constraint&quot;&gt;The Fable 5 aside, or pricing under constraint&lt;/h2&gt;
&lt;p&gt;One thread of this story deserves its aside, because it shows how much pricing is now decided week by week, under a double constraint of capacity and geopolitics. We told in &lt;a href=&quot;https://lecompute.fr/couts/glm-5-2-open-weight-souverainete/&quot;&gt;the GLM-5.2 report&lt;/a&gt; the June 12 cutoff: Fable 5 and Mythos 5 switched off worldwide by export-control directive, three days after launch. What that report, frozen on June 21, could not tell is the commercial aftermath.&lt;/p&gt;
&lt;p&gt;At the June 9 launch, Fable 5 was included at no extra cost in the subscriptions until the 22nd, with removal announced for the 23rd and a switch to usage credits. The June 12 suspension interrupted the window before its term: the commercial removal never really happened, geopolitics had beaten it to it. Directive lifted on June 30, redeployment on July 1 with a new inclusion window, up to 50% of the weekly limits, until July 7, then extended until the evening of July 12. After which, back to usage credits, and a permanent reintroduction promised “when capacity allows”, with no date. In one month, the best model on the market will have been in turn included, banned, redeployed, re-included at half, extended by five days, then re-billed separately. There is the real state of the market: even Anthropic steers access to its own summit at the mercy of available megawatts.&lt;/p&gt;
&lt;h2 id=&quot;the-harness-or-what-you-are-really-buying&quot;&gt;The harness, or what you are really buying&lt;/h2&gt;
&lt;p&gt;That leaves the third floor of the comeback, the least visible and perhaps the most decisive: what surrounds the model. A language model never works alone. What turns a text generator into a coding agent is called a harness, and it supplies the model with just about everything that makes its practical effectiveness: the set of tools it can call and their schemas, the proprietary system prompt that sets its behaviors, the project-context injections (the AGENTS.md file at OpenAI, CLAUDE.md at Anthropic), the execution loop with its permissions and its sandbox, the ability to launch subagents (which is, technically, just one tool among others), the hooks that intercept the lifecycle steps, the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-5&quot; aria-expanded=&quot;false&quot;&gt; MCP &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-5&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;MCP&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Model Context Protocol&lt;/em&gt;. An open protocol (started by Anthropic, adopted by OpenAI and others) that standardizes how an agent discovers and calls external tools: an MCP server exposes typed tools, and the harness presents them to the model. The universal socket of the agentic ecosystem.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  servers, the skills, and memory management when the context overflows. The model is the engine; the harness is the whole rest of the vehicle. And the result gap between two harnesses, at identical engine, is measured in tens of points on the evaluations: we will devote the next report to it.&lt;/p&gt;
&lt;p&gt;On this ground, the two ecosystems have massively converged. Hooks on both sides (with a nuance: Codex’s own up to being a guardrail, their interception is not exhaustive, where Claude Code offers more binding control), subagents on both sides, skills, MCP, context files. Codex even offers an import command that migrates your Claude Code configuration. Differentiation no longer plays out on the feature list, but on the center of gravity: and that is where July 9 changes the game. Native git worktrees, which let you run several independent tasks on the same repository without them stepping on each other, are reserved for the desktop application. The multi-agent command post, session control from the interface, the animated companions that signal at a glance that a session is awaiting approval or has just finished: all of that lives in the app, not in the terminal. The Codex CLI stays maintained, open source, updated the very day before launch; it is simply no longer the storefront. OpenAI bet that agent orchestration is better steered from a graphical interface than from a terminal, and put the result into an application already installed by hundreds of millions of people. Anthropic keeps the favorite tool of extensibility purists; OpenAI has just built the one you do not need to install.&lt;/p&gt;
&lt;h2 id=&quot;the-counter-signals-and-what-to-watch&quot;&gt;The counter-signals, and what to watch&lt;/h2&gt;
&lt;p&gt;Honesty requires putting the other pan on the scale, because the first days of 5.6 also carry opposite signals. On Codex’s GitHub repository, users document a perceived quality regression together with rising token consumption since the move to 5.6, others a blow-up in cost per token since mid-June on 5.5. More structurally troubling: Sol’s effective context in Codex is capped around 353,000 tokens, a third of the 1.05 million window sold on the API side. Model parity does not guarantee experience parity, and Marginlab, the independent tracker that measures Codex daily on a contamination-resistant set of tasks, has not yet published a curve for 5.6. The coming weeks will tell whether the regressions are teething troubles or a real step back.&lt;/p&gt;
&lt;p&gt;They will also tell something else, because no one believes this snapshot is stable. A single, uncorroborated analyst rumor already puts GPT-6 a few weeks out and makes 5.6 the last of its line; Anthropic is preparing the next Fable. We have dated this report to July 11 and will keep the update box, because in this cycle, eight weeks are enough to overturn a conclusion.&lt;/p&gt;
&lt;p&gt;What will probably survive the next launch, on the other hand, is the shift this spring brought about. The question “which is the best model” has just lost its monopoly. A developer choosing their tool in July 2026 is arbitrating a complete system: a model, a harness, a plan policy, a price curve, and the trust they place in the figures that claim to compare them. OpenAI did not win this round by becoming the smartest again. It won it by making the comparison undecidable on the model, then making it very decidable on everything else. The next round will play out by the same rules, and nothing says there will not be, this time again, a reversal.&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Currencies converted at the indicative rate of 1 USD = 0.92 EUR (mid-2026). Editorial freeze date: July 11, 2026; an update box will be added if the facts change. Labels: &lt;strong&gt;verified fact&lt;/strong&gt; (primary source), &lt;strong&gt;estimate&lt;/strong&gt; (third-party analysis), &lt;strong&gt;self-reported&lt;/strong&gt; (vendor figure with no independent verification), &lt;strong&gt;hypothesis&lt;/strong&gt; (rumor or assumed reasoning).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GPT-5.6 launch &amp;amp; July 9 merger&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Announcement post (&lt;a href=&quot;https://openai.com/index/gpt-5-6/&quot;&gt;openai.com/index/gpt-5-6&lt;/a&gt;, July 9, 2026): Sol/Terra/Luna tiers, API prices, cited evals; Sol preview (&lt;a href=&quot;https://openai.com/index/previewing-gpt-5-6-sol/&quot;&gt;openai.com/index/previewing-gpt-5-6-sol&lt;/a&gt;, June 26); system card (all three tiers “High” cyber/bio).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Desktop merger and “ChatGPT Classic”: OpenAI help center, &lt;em&gt;Moving to the new ChatGPT desktop app&lt;/em&gt; (July 9); Atlas sunset announced July 9 for August 9 (James Sun, OpenAI, on X).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Self-reported&lt;/em&gt;: Codex adoption (1.6M in March; 4M+ on April 21; 5M+ on June 2; “×2 in three months”, r/Codex AMA of July 10): OpenAI figures, inconsistencies noted in the body of the article.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Parity &amp;amp; benchmarks&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Estimate&lt;/em&gt;: &lt;a href=&quot;https://artificialanalysis.ai/&quot;&gt;Artificial Analysis&lt;/a&gt; (Coding Agent Index v1.1, Intelligence Index, readings of July 9-10): OpenAI pre-evaluation partner, flagged as such; latencies and costs in the OpenAI announcement “simulated” (footnote 4 of the post).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Retraction of the SWE-Bench Pro recommendation: &lt;a href=&quot;https://openai.com/index/separating-signal-from-noise-coding-evaluations/&quot;&gt;openai.com/index/separating-signal-from-noise-coding-evaluations&lt;/a&gt; (July 8) and @OpenAI post on X: ~30% broken tasks out of 731, pipeline 27.4%, human review 34.1%. The next day’s 5.6 post nonetheless publishes the full range of scores, including SWE-Bench Pro: Sol 64.6% against 80% for Fable 5 (re-reading of the post, July 11).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: The Pragmatic Engineer survey (March 7, 2026, n = 906); JetBrains AI Pulse (January 2026). Dated testimonials: &lt;a href=&quot;https://simonwillison.net/2026/Jul/9/gpt-5-6/&quot;&gt;Simon Willison&lt;/a&gt; (July 9), Matt Shumer (X, via Axios, July 9).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pricing, plans &amp;amp; cache&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Codex fast mode and billing: &lt;a href=&quot;https://developers.openai.com/codex/speed&quot;&gt;developers.openai.com/codex/speed&lt;/a&gt; and &lt;a href=&quot;https://developers.openai.com/codex/pricing&quot;&gt;/codex/pricing&lt;/a&gt; (fast ×1.5, credits ×2.5 on GPT-5.5, ×2 on 5.4; token switch of April 2, rate card); GPT-5.6 prompt caching (writes 1.25×, minimum retention 30 min).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: On the Anthropic side: claude.com/pricing and support.claude.com (fast mode and Fable 5 in usage credits; cancellation of the pool split on June 15, article 15036540); 5-hour limits doubled and SpaceX deal (Anthropic, &lt;em&gt;Higher usage limits for Claude and a compute deal with SpaceX&lt;/em&gt;, May 6); weekly +50% (May 13).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Estimate&lt;/em&gt;: “twelve to more than a hundred times”: community analyses (including the OpenClaw case documented by The Register), never confirmed by Anthropic; Boris Cherny quotes (The Register, VentureBeat).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Microsoft: Tom Warren scoop (The Verge, Notepad newsletter, May 14); OpenAI response the same day (2 months of Codex free, Altman on X). Uber case: Forbes, &lt;em&gt;Uber Burns Its 2026 AI Budget In Four Months On Claude Code&lt;/em&gt; (May 17).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fable 5 saga&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Anthropic: launch and inclusion window (&lt;a href=&quot;https://www.anthropic.com/news/claude-fable-5-mythos-5&quot;&gt;anthropic.com/news/claude-fable-5-mythos-5&lt;/a&gt;, June 9); June 12 suspension (see &lt;a href=&quot;https://lecompute.fr/couts/glm-5-2-open-weight-souverainete/&quot;&gt;our GLM-5.2 report&lt;/a&gt; for the full timeline); &lt;em&gt;Redeploying Claude Fable 5&lt;/em&gt; (June 30); extension to July 12 (official channels, July 7).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Harness &amp;amp; counter-signals&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: Codex docs: worktrees (&lt;a href=&quot;https://developers.openai.com/codex/app/worktrees&quot;&gt;developers.openai.com/codex/app/worktrees&lt;/a&gt;), hooks, companions; &lt;a href=&quot;https://github.com/openai/codex&quot;&gt;github.com/openai/codex&lt;/a&gt; (Apache-2.0; issues #32161 5.6 regression, #31860 effective context ~353K, #28879 cost per token). Claude Code docs: code.claude.com/docs (hooks, subagents, skills, plugins).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fact&lt;/em&gt;: &lt;a href=&quot;https://marginlab.ai/trackers/codex&quot;&gt;Marginlab&lt;/a&gt;: independent daily tracker, no GPT-5.6 curve as of July 11.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hypothesis&lt;/em&gt;: GPT-6 “a few weeks out”, 5.6 “last of the series”: single analyst tweet (@synthwavedd, ~July 7), uncorroborated.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Method note.&lt;/strong&gt; This article was written forty-eight hours after the launch of GPT-5.6. OpenAI’s adoption and efficiency figures are given as self-reported as long as no third-party measurement has replicated them; the level anchor used is Artificial Analysis’s index, whose commercial tie with OpenAI is flagged. Quality testimonials are systematically dated, the bulk of the public comparative corpus dating from the GPT-5.5 era. This article is the English adaptation of a French original, &lt;a href=&quot;https://lecompute.fr/couts/gpt-5-6-codex-remontada/&quot;&gt;published on July 11, 2026&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><media:content url="https://lecompute.fr/images/photos/gpt-5-6-remontada.webp" medium="image"/><media:description>A developer workstation in low light: a terminal fades out on the left screen while an agent interface lights up on the right</media:description><category>GPT-5.6</category><category>Codex</category><category>Claude Code</category><category>OpenAI</category><category>Anthropic</category><category>Subscriptions</category><category>Inference cost</category><author>redaction@lecompute.fr (Christophe Gerardin)</author></item><item><title>DGX Spark vs RTX 5090: capacity or speed, the choice that decides your local LLM</title><link>https://lecompute.fr/en/silicon/dgx-spark-vs-rtx-5090/</link><guid isPermaLink="true">https://lecompute.fr/en/silicon/dgx-spark-vs-rtx-5090/</guid><description>The DGX Spark and the RTX 5090 are two opposite answers: 128 slow GB (273 GB/s) versus 32 very fast GB (1,792 GB/s), at prices that now overlap (the 5090 streets from ~$3,000 in the US and €3,900-4,400 in Europe against the Spark&apos;s $4,699). Up to ~30B the 5090 wins everything; 100B+ MoE models only exist on the Spark; dense 70B has no good candidate between the two.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;Key takeaways&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;Key takeaways&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Overlapping budgets, opposite philosophies&lt;/strong&gt;: the DGX Spark lists at $4,699; the RTX 5090 streets from ~$3,000 in the US and €3,900-4,400 in Europe, far above its $1,999 MSRP. The choice is not about price anymore, it is about your workload.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The 5090 wins everywhere the model fits in 32 GB&lt;/strong&gt;: its memory bandwidth (6.5× the Spark’s) sets a generation throughput ~4× higher, measurements included.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Spark wins where the 5090 cannot compete&lt;/strong&gt;: models past ~32 GB of weights, 100B-class MoE first, which simply do not exist on a consumer card.&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;two-objects-with-nothing-in-common-one-buying-question&quot;&gt;Two objects with nothing in common, one buying question&lt;/h2&gt;
&lt;p&gt;On one side, a 575 W card that demands a case, an oversized power supply and serious airflow. On the other, a golden cube the size of a book, complete, silent, sitting next to the monitor. Everything separates them except the moment you price them: with the shortage pushing the RTX 5090 far above MSRP (from ~$3,000 on the US street, €3,900 to €4,400 in Europe), the &lt;a href=&quot;https://lecompute.fr/en/silicon/rtx-spark-vs-dgx-spark/&quot;&gt;DGX Spark at $4,699&lt;/a&gt; now plays in a comparable envelope. At overlapping budgets, you have to choose. And the right criterion is neither the petaflop nor the core count: it is the shape of your workload.&lt;/p&gt;
&lt;p&gt;The whole duel reduces to one trade-off: memory eliminates, bandwidth ranks. Here are the two spec sheets side by side, then what the measurements say.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table&quot; aria-label=&quot;DGX Spark versus RTX 5090 comparison&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;DGX Spark (GB10)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;RTX 5090 (desktop)&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Memory&lt;/th&gt;&lt;td&gt;128 GB unified LPDDR5X&lt;/td&gt;&lt;td&gt;32 GB GDDR7&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Bandwidth&lt;/th&gt;&lt;td&gt;~273 GB/s&lt;/td&gt;&lt;td&gt;~1,792 GB/s (6.5×)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;CUDA cores&lt;/th&gt;&lt;td&gt;6,144 (RTX 5070 class)&lt;/td&gt;&lt;td&gt;21,760&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Power&lt;/th&gt;&lt;td&gt;whole machine, 240 W max (~170 W measured under load)&lt;/td&gt;&lt;td&gt;card alone, 575 W&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Form factor&lt;/th&gt;&lt;td&gt;standalone mini PC (Linux DGX OS)&lt;/td&gt;&lt;td&gt;a card to integrate (full PC required)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Observed price&lt;/th&gt;&lt;td&gt;$4,699 (official MSRP)&lt;/td&gt;&lt;td&gt;$2,999+ US street, €3,900–4,400 EU ($1,999 MSRP)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: The duel in numbers. Vendor specs (verified facts); the DGX Spark bandwidth comes from the GB10 datasheet, 5090 street prices observed July 2026.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;h2 id=&quot;what-the-measurements-say-bandwidth-decides&quot;&gt;What the measurements say: bandwidth decides&lt;/h2&gt;
&lt;p&gt;The mechanism first, because it explains every line of measurement. LLM generation re-reads the entirety of the model’s weights for every produced token: output throughput is capped by how fast memory can be traversed, almost never by compute. The 5090 traverses its 32 GB at ~1,792 GB/s; the Spark traverses its 128 GB at ~273 GB/s. On the same model, the throughput ratio follows the bandwidth ratio, and that is exactly what &lt;a href=&quot;https://lecompute.fr/en/silicon/rtx-spark-vs-dgx-spark/&quot;&gt;the LMSYS measurements on the DGX Spark&lt;/a&gt; show: on GPT-OSS 20B, ~205 tokens/s of generation for the 5090 against ~50 for the Spark. Four times less, for a bandwidth ratio of 6.5: the measured gap is a little softer than raw physics, because with so few active weights per token the 5090 no longer saturates its bandwidth (fixed runtime costs take over), while the Spark stays pinned to its memory ceiling.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-6&quot; aria-expanded=&quot;false&quot;&gt; Prefill &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-6&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;prefill&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The opening phase of LLM inference: every token of the prompt is processed at once. High arithmetic intensity, so the GPU saturates its Tensor Cores. The opposite of the &lt;em&gt;decode&lt;/em&gt; phase that follows.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (prompt ingestion) is the exception that proves the rule: that phase is compute-bound, and the Spark’s FP4 peak holds its own there. But an interactive session lives in &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-7&quot; aria-expanded=&quot;false&quot;&gt; decode &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-7&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;decode&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The autoregressive generation phase of an LLM: one token is produced at a time, re-reading the whole KV cache. Arithmetic intensity is very low, so the GPU spends most of its time waiting on memory. A real inference service is almost always dominated by decode.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , and decode reads the memory line of the spec sheet, not the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-8&quot; aria-expanded=&quot;false&quot;&gt; FLOPS &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-8&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FLOPS&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Floating-Point Operations Per Second&lt;/em&gt;. A raw throughput metric for floating-point compute, in tera or peta. For LLM inference it is rarely the limiting factor: memory bandwidth almost always comes first.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  line.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-warn&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;⚠&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;Never compare these two machines on the Spark’s “1 petaflop”: it is a &lt;em&gt;sparse&lt;/em&gt; FP4 peak (≈500 dense TFLOPS), useful for prefill, silent about generation speed. The only spec-sheet line that predicts your tokens/s is memory bandwidth. That reading trap is unpacked in &lt;a href=&quot;https://lecompute.fr/en/silicon/rtx-spark-vs-dgx-spark/&quot;&gt;our RTX Spark vs DGX Spark deep dive&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;the-verdict-by-model-size&quot;&gt;The verdict by model size&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Up to ~30B: the 5090, no contest.&lt;/strong&gt; A 30B in &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-9&quot; aria-expanded=&quot;false&quot;&gt; Q4 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-9&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;quantization&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Reducing the number of bits that encode each weight of a model (from 16 bits down to 8, 4, or fewer). It shrinks the memory footprint by the same factor, at the cost of a controlled accuracy loss, without changing the parameter count.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (~17 GB) fits in 32 GB with room for the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-a&quot; aria-expanded=&quot;false&quot;&gt; KV cache &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-a&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;KV cache&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The stored &lt;em&gt;key&lt;/em&gt; and &lt;em&gt;value&lt;/em&gt; vectors an LLM has already computed for every token it has processed. It avoids recomputing attention over the whole history, at the cost of a memory footprint that grows with the context length.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , and GDDR7 serves it at dozens of tokens/s. The Spark runs the same models four times slower, and nothing offsets that gap in interactive use. Same conclusion for 20B &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-b&quot; aria-expanded=&quot;false&quot;&gt; MoE &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-b&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;MoE&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Mixture-of-Experts&lt;/em&gt;. An architecture where the network is split into many &lt;em&gt;experts&lt;/em&gt;, of which a router activates only a small subset per token. Per-token compute follows the number of &lt;em&gt;active&lt;/em&gt; parameters; memory follows the &lt;em&gt;total&lt;/em&gt; count, since every expert must stay resident in VRAM, ready to be called.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  models: measured by LMSYS, the gap stays one to four.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dense 70B: the gap between the two.&lt;/strong&gt; In Q4_K_M, its ~42 GB of weights overflow the 5090, which must &lt;a href=&quot;https://lecompute.fr/en/silicon/how-much-vram-for-llm/&quot;&gt;offload layers to CPU RAM at collapsed throughput&lt;/a&gt;. The Spark hosts it effortlessly, then serves it at the pace its memory allows: a ~4 tokens/s physical ceiling in dense FP8, 2.7 measured by LMSYS once runtime overhead is paid. Neither machine is right for fast dense 70B; that need starts at 48 GB of fast memory, the territory of the RTX PRO 6000, dual GPUs, or rented datacenter cards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;100B+ MoE: the Spark, by forfeit.&lt;/strong&gt; A GPT-OSS 120B (~65 GB of MXFP4 weights, ~80 GB loaded) does not fit in any consumer card, 5090 included. The Spark loads it and serves it at ~38 tokens/s measured in llama.cpp (~50 with SGLang: the figure is runtime-dependent), because a MoE only reads a fraction of its weights per token: capacity pays, bandwidth strangles less. It is the only segment where the duel has a single contender, and it is precisely what the Spark exists for.&lt;/p&gt;
&lt;h2 id=&quot;the-extended-duel-rtx-5070-rtx-5090-laptop-and-rtx-spark&quot;&gt;The extended duel: RTX 5070, RTX 5090 Laptop and RTX Spark&lt;/h2&gt;
&lt;p&gt;Searches attach other names to this duel, and dismissing them properly avoids several buying mistakes. The first hides in the name itself: the &lt;strong&gt;RTX 5090 Laptop&lt;/strong&gt; is not a shrunken desktop 5090, it is a different chip (GB203, the desktop 5080’s die) with &lt;strong&gt;24 GB of GDDR7 at ~896 GB/s&lt;/strong&gt; and 10,496 cores within 95 to 150 W. For LLMs, read it as a very good 24 GB card, half the speed of the desktop 5090; every “5090” figure in this article refers to the desktop card. The &lt;strong&gt;RTX 5070&lt;/strong&gt; shares its CUDA core count (6,144) with the Spark’s GPU, which makes it the “compute equivalent” on paper; but its 12 GB of GDDR7 (~672 GB/s) confine it to ~13B models in 4-bit. It is an honorable entry into local LLMs, not a Spark rival: you do not compare 12 GB to 128. The &lt;strong&gt;RTX Spark (N1X)&lt;/strong&gt;, expected in fall 2026 on Windows on Arm, is &lt;a href=&quot;https://lecompute.fr/en/silicon/rtx-spark-vs-dgx-spark/&quot;&gt;the DGX Spark’s consumer cousin&lt;/a&gt;: same 128 GB unified pool, same &lt;del&gt;273 GB/s wall. Against the 5090 it will replay this article’s duel exactly, with a probably lower entry price; the analyst estimates in circulation (&lt;/del&gt;$2,899) cover its 16-32 GB entry configurations only.&lt;/p&gt;
&lt;h2 id=&quot;how-to-decide&quot;&gt;How to decide&lt;/h2&gt;
&lt;p&gt;Ask the model question before the machine question. &lt;strong&gt;Does your largest model fit in 32 GB, weights and KV cache included?&lt;/strong&gt; If yes, the 5090 is objectively superior: comparable money, four times the throughput. &lt;strong&gt;Are you targeting a 100B+ MoE locally?&lt;/strong&gt; The Spark is the only contender under $5,000, and the experience stays comfortable as long as the model is MoE. &lt;strong&gt;Are you in between, on fast dense 70B?&lt;/strong&gt; Neither: move up to fast 48 GB+ memory, or rent by the hour until you have measured your real need.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This duel has no winner; it has two winners on disjoint terrain, and a no man’s land in between. The 5090 is the machine for mid-size models served fast; the Spark is the machine for the big MoE you simply could not run at home before it. What to watch next: fall 2026, when the RTX Spark replays this match at a lower price, and the LPDDR6 generation, the only thing capable of moving the 273 GB/s wall that defines the capacity camp today. The day a unified SoC crosses 500 GB/s, this duel changes nature; until then, it is decided by model size.&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;This article is the “Spark versus GeForce” spoke of our Spark coverage: the shared figures (GB10 datasheet, measurements, prices) are established and sourced in &lt;a href=&quot;https://lecompute.fr/en/silicon/rtx-spark-vs-dgx-spark/&quot;&gt;RTX Spark vs DGX Spark&lt;/a&gt; and were re-verified on July 4, 2026. A French version of this article, &lt;a href=&quot;https://lecompute.fr/silicon/dgx-spark-vs-rtx-5090/&quot;&gt;published July 8, 2026&lt;/a&gt;, is the original.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verified facts.&lt;/strong&gt; DGX Spark bandwidth and memory (~273 GB/s, 128 GB LPDDR5X, 256-bit bus): &lt;a href=&quot;https://www.nvidia.com/en-us/products/workstations/dgx-spark/&quot;&gt;DGX Spark / GB10 datasheet&lt;/a&gt;. RTX 5090 (32 GB GDDR7, ~1,792 GB/s, 21,760 cores, 575 W) and RTX 5070 (12 GB, ~672 GB/s, 6,144 cores): NVIDIA spec sheets. DGX Spark MSRP at $4,699: raised from $3,999 in February 2026 (Tom’s Hardware, VideoCardz). GPT-OSS 120B weights (~65 GB MXFP4, ~80 GB loaded): OpenAI model card. DGX Spark power: 240 W peak system, GB10 SoC at 140 W TDP (&lt;a href=&quot;https://docs.nvidia.com/dgx/dgx-spark/hardware.html&quot;&gt;NVIDIA hardware guide&lt;/a&gt;); the ~170 W under AI load is a press observation (StorageReview, NVIDIA forums), workload-dependent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Measurements (proxy).&lt;/strong&gt; GPT-OSS 20B throughput (5090 ≈ 205 tokens/s; DGX Spark ≈ 50), GPT-OSS 120B on Spark (≈ 38 tokens/s in llama.cpp, ≈ 50 in SGLang) and Llama 3.1 70B FP8 on Spark (2.7 tokens/s decode): &lt;a href=&quot;https://lmsys.org/blog/2025-10-13-nvidia-dgx-spark/&quot;&gt;LMSYS review of October 13, 2025&lt;/a&gt; and community benchmarks, detailed in the Spark deep dive. Measured under Linux (DGX OS); read as orders of magnitude.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Credible estimates.&lt;/strong&gt; RTX 5090 street prices: &lt;del&gt;$2,999+ on the US secondary market (gpudrip, videocardz) and €3,900-4,400 in EU retail (bestvaluegpu, VideoCardz), observed early July 2026 in a DRAM-shortage market. RTX Spark N1X (&lt;/del&gt;$2,899 for 16-32 GB entry configurations): Morgan Stanley estimates, June 2026, unconfirmed by NVIDIA.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stated assumptions.&lt;/strong&gt; The ~4 tokens/s ceiling for dense 70B FP8 on the Spark is the division 70 GB ÷ 273 GB/s (memory ceiling, single sequence); the matching LMSYS measurement is 2.7 tokens/s, below the ceiling as expected (runtime overhead, KV cache traffic). The ~4× throughput ratio between the 5090 and the Spark is measured on GPT-OSS 20B; it varies with model, runtime and batch. The LPDDR6 projection and the ~500 GB/s threshold in the conclusion are trend hypotheses, not a confirmed roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image credit.&lt;/strong&gt; Header photo: &lt;em&gt;KXRORS S300 SFF PC with GeForce RTX 5070 Founders Edition next to NVIDIA DGX Spark&lt;/em&gt; by &lt;a href=&quot;https://commons.wikimedia.org/wiki/User:dllu&quot;&gt;Daniel Lu&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;CC BY-SA 4.0&lt;/a&gt;, via &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:KXRORS_S300_SFF_PC_with_GeForce_RTX_5070_Founders_Edition_next_to_NVIDIA_DGX_Spark_2026_dllu.jpg&quot;&gt;Wikimedia Commons&lt;/a&gt;, cropped.&lt;/p&gt;</content:encoded><media:content url="https://lecompute.fr/images/photos/spark-vs-5090.webp" medium="image"/><media:description>A compact PC with its GeForce Founders Edition card next to a golden NVIDIA DGX Spark, on a wooden desk</media:description><category>DGX Spark</category><category>RTX 5090</category><category>RTX Spark</category><category>Local LLM</category><category>Unified memory</category><category>GDDR7</category><author>redaction@lecompute.fr (Killian Pluenet)</author></item><item><title>Prefill/decode disaggregation reaches production: state of play, May 2026</title><link>https://lecompute.fr/en/runtimes/disaggregation-prefill-decode-production/</link><guid isPermaLink="true">https://lecompute.fr/en/runtimes/disaggregation-prefill-decode-production/</guid><description>Prefill/decode disaggregation has left the research-paper stage. As of May 2026, three runtimes ship it in production (Dynamo, SGLang, TRT-LLM), Tenstorrent poses the unified-hardware counter-argument, and MLPerf v6.0 measures software gains on fixed silicon for the first time.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;Key takeaways&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;Key takeaways&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-c&quot; aria-expanded=&quot;false&quot;&gt; Disaggregation &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-c&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;disaggregation&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Splitting the inference pipeline into distinct phases (prefill, decode) run on specialized node pools. It lets you assign &lt;em&gt;compute-bound&lt;/em&gt; hardware to prefill and &lt;em&gt;memory-bound&lt;/em&gt; hardware to decode, instead of running both on the same GPU that stays underused on one of the two phases.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (splitting the inference pipeline into specialized prefill and decode node pools) moved from paper to production&lt;/strong&gt; in three months: Dynamo 1.0, SGLang 0.5.12, and TensorRT-LLM 1.3 each implement disaggregated serving with native KV transfer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tenstorrent poses the hardware counter-argument&lt;/strong&gt;: Galaxy Blackhole unifies compute and memory in a system with 6.2 GB of SRAM and 2.9 PB/s of internal bandwidth, reaching 350+ tokens/s/user in decode on DeepSeek-R1 671B without disaggregation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MLPerf v6.0 validates the software lever&lt;/strong&gt;: the cycle’s most spectacular gains come from orchestration, not silicon. NVIDIA improves its DeepSeek-R1 score by 2.7× over its own earlier submission, on identical hardware.&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;where-things-stood&quot;&gt;Where things stood&lt;/h2&gt;
&lt;p&gt;On May 17, 2026, our article on the Vera Rubin platform laid out a thesis: LLM inference is no longer a homogeneous GPU problem. &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-d&quot; aria-expanded=&quot;false&quot;&gt; Prefill &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-d&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;prefill&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The opening phase of LLM inference: every token of the prompt is processed at once. High arithmetic intensity, so the GPU saturates its Tensor Cores. The opposite of the &lt;em&gt;decode&lt;/em&gt; phase that follows.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , the phase that processes the whole prompt at once, is &lt;em&gt;compute-bound&lt;/em&gt;: it saturates the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-e&quot; aria-expanded=&quot;false&quot;&gt; Tensor Cores &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-e&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;Tensor Cores&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Hardware units specialized in low-precision matrix multiplication, introduced by NVIDIA with Volta (2017). Each generation adds supported formats: FP16 → FP8 (Hopper) → FP6/FP4 (Blackwell). They run the bulk of the inference compute.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; . &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-f&quot; aria-expanded=&quot;false&quot;&gt; Decode &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-f&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;decode&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The autoregressive generation phase of an LLM: one token is produced at a time, re-reading the whole KV cache. Arithmetic intensity is very low, so the GPU spends most of its time waiting on memory. A real inference service is almost always dominated by decode.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , the token-by-token generation, is &lt;em&gt;memory-bound&lt;/em&gt;: it waits on &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-g&quot; aria-expanded=&quot;false&quot;&gt; HBM &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-g&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;HBM&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;High Bandwidth Memory&lt;/em&gt;. Memory stacked in layers and soldered right next to the GPU, with several TB/s of bandwidth (versus ~50 GB/s for DDR5). Indispensable beyond a certain model size.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , the GPU’s high-bandwidth memory. Bolting the two onto the same GPU underuses the hardware on one of the two phases. NVIDIA acknowledged this at the silicon level by integrating a dedicated Groq LPU for decode into the Vera Rubin platform, and by launching Dynamo 1.0 as the orchestrator.&lt;/p&gt;
&lt;p&gt;A week later, the thesis is no longer an architectural projection. Three software stacks offer disaggregation in production. A hardware challenger disputes the principle itself. And the first MLPerf cycle of the disaggregation era measures what software is worth against silicon. This is the state of play this article surveys.&lt;/p&gt;
&lt;h2 id=&quot;the-disaggregated-pipeline-in-one-diagram&quot;&gt;The disaggregated pipeline in one diagram&lt;/h2&gt;
&lt;figure class=&quot;article-flow-figure&quot;&gt; &lt;div class=&quot;article-flow&quot; aria-label=&quot;Disaggregated inference pipeline: request, prefill GPU, KV cache transfer, decode GPU, response&quot;&gt; &lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;Request&lt;/strong&gt; &lt;span&gt;User prompt&lt;/span&gt; &lt;small&gt;Input&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;Prefill&lt;/strong&gt; &lt;span&gt;Tensor Cores saturated, compute-bound&lt;/span&gt; &lt;small&gt;Dedicated GPU nodes&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;KV transfer&lt;/strong&gt; &lt;span&gt;RDMA / NVLink / NIXL / MORI-IO&lt;/span&gt; &lt;small&gt;Critical point&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;Decode&lt;/strong&gt; &lt;span&gt;HBM bandwidth, memory-bound&lt;/span&gt; &lt;small&gt;GPU or LPU nodes&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;Response&lt;/strong&gt; &lt;span&gt;Generated tokens&lt;/span&gt; &lt;small&gt;Output&lt;/small&gt; &lt;/div&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Simplified disaggregated pipeline. The KV transfer between prefill and decode is the critical point: this is where NIXL, Mooncake, and MORI-IO come in.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;The difficulty of this pipeline lives in the third column. The &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-h&quot; aria-expanded=&quot;false&quot;&gt; KV cache &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-h&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;KV cache&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The stored &lt;em&gt;key&lt;/em&gt; and &lt;em&gt;value&lt;/em&gt; vectors an LLM has already computed for every token it has processed. It avoids recomputing attention over the whole history, at the cost of a memory footprint that grows with the context length.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , the attention keys and values the model computes from the prompt and reuses for every later token, is produced by the prefill node and must reach the decode node &lt;em&gt;before&lt;/em&gt; generation can start, and that transfer is measured in gigabytes per request. On a 70B model in &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-i&quot; aria-expanded=&quot;false&quot;&gt; FP8 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-i&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP8&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;An 8-bit floating-point format. A versatile working format for inference (and training) on recent GPUs. It halves the memory footprint and bandwidth needed versus FP16, for a marginal accuracy loss on most models.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , an 8k-token context amounts to &lt;a href=&quot;https://lecompute.fr/en/runtimes/kv-cache-objet-central-serving/&quot;&gt;~1.3 GB of KV cache&lt;/a&gt;. On a DeepSeek-R1 671B with a 100k context, it runs to tens of gigabytes. If the transfer is slower than decode itself, disaggregation &lt;em&gt;degrades&lt;/em&gt; latency instead of improving it. Each runtime solves this its own way.&lt;/p&gt;
&lt;h2 id=&quot;dynamo-10-the-orchestrator-in-production&quot;&gt;Dynamo 1.0: the orchestrator in production&lt;/h2&gt;
&lt;p&gt;NVIDIA shipped Dynamo 1.0 as a production release on March 16, 2026, the same day as the Vera Rubin announcement. That timing is deliberate: Dynamo is the software link between the hardware thesis (silicon specialized per phase) and its execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Dynamo does.&lt;/strong&gt; It is an inference orchestration framework, open source (GitHub: ai-dynamo/dynamo), that coordinates a cluster of prefill and decode nodes. It routes requests in real time, transfers the KV cache between nodes, and manages the elasticity of the pool. Its native mode is &lt;em&gt;disaggregated serving&lt;/em&gt;: the prefill nodes compute the prompt, the KV cache is transferred over &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-j&quot; aria-expanded=&quot;false&quot;&gt; NVLink &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-j&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;NVLink&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;NVIDIA&apos;s proprietary GPU-to-GPU interconnect. NVLink 5 (Blackwell) reaches 1.8 TB/s per GPU; NVLink 6 (Rubin) doubles that to 3.6 TB/s. It lets several cards share their memory and behave almost like a single accelerator.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (NVIDIA’s chip-to-chip interconnect) or RDMA to the decode nodes, and generation starts without the prefill node being blocked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What sets it apart from the runtimes.&lt;/strong&gt; Dynamo is not an inference runtime: it relies on TensorRT-LLM or SGLang as the execution backend. Its role sits &lt;em&gt;above&lt;/em&gt;: KV-aware routing, topological placement across the cluster, and above all DGDR (&lt;em&gt;Dynamo Graph Deployment Request&lt;/em&gt;), a mechanism that translates SLOs (target latency, minimum throughput) into a concrete deployment on the cluster. Where a runtime answers “how do I serve this model on this GPU”, Dynamo answers “how do I spread this model across 72 GPUs to hold these constraints”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multimodal E/P/D.&lt;/strong&gt; Since March 2026, Dynamo extends the model to three phases (Embedding, Prefill, Decode) with a dedicated embedding cache. On image requests with Qwen3-VL-30B-A3B-Instruct in FP8 on GB200, NVIDIA measures a 30% reduction in TTFT (time to first token) and a 25% throughput gain (verified fact, NVIDIA source). The extension to video is underway: FastVideo plus SGLang Diffusion generates 5 seconds of video in ~40 seconds on a single Hopper GPU.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes integration.&lt;/strong&gt; The K8s Inference Gateway plugin implements KV-aware routing directly inside Kubernetes infrastructure: requests that share a KV prefix are routed to the node that already holds it. NVIDIA measures a 20× faster TTFT and a 4× faster end-to-end latency on requests with a common prefix (verified fact). Grove (GitHub: ai-dynamo/grove) rounds out the picture with topology-aware scheduling for GB300 NVL72: it places workloads according to the rack’s NVLink topology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adoption.&lt;/strong&gt; The list of confirmed adopters as of May 24, 2026 includes AstraZeneca, Baseten, ByteDance, CoreWeave, Crusoe, DigitalOcean, Gcore, GMI Cloud, Nebius, Meituan, Pinterest, Prime Intellect, Rednote, SoftBank Corp., Tencent Cloud, Together AI, and Vultr. Cloud integrations: AWS, Azure, GCP, OCI, Alibaba Cloud.&lt;/p&gt;
&lt;h3 id=&quot;the-baseten-case-the-nuanced-numbers&quot;&gt;The Baseten case: the nuanced numbers&lt;/h3&gt;
&lt;p&gt;Baseten published a field report as early as October 2025, as an early adopter. The post’s title (&lt;em&gt;“How Baseten Achieved 2x Faster Inference with NVIDIA Dynamo”&lt;/em&gt;) sums up a TTFT cut in half. The detailed measurements, by Abu Qader, Michael Feil, and Rachel Rapp, are more granular: &lt;strong&gt;a 50% reduction in TTFT&lt;/strong&gt;, &lt;strong&gt;a 61% increase in requests per second&lt;/strong&gt;, and &lt;strong&gt;a 62% increase in tokens per second&lt;/strong&gt; on Qwen3 Coder 480B with prompts of about 50k tokens. The “2×” applies to TTFT, not to overall throughput. And the “no additional hardware cost” claim comes from social media, not from the technical post.&lt;/p&gt;
&lt;p&gt;The aggregate throughput figure NVIDIA cites (7× throughput with disaggregation plus extended Expert Parallelism on GB200 NVL72, measured on DeepSeek R1-0528 in &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-k&quot; aria-expanded=&quot;false&quot;&gt; FP4 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-k&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP4&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;A 4-bit floating-point format, the 2026 frontier of high-throughput inference. Four times less memory than FP16, but a very narrow dynamic range: it only holds up with fine-grained scaling through block formats (MXFP4, NVFP4).&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , 1k/1k context) comes from a SemiAnalysis InferenceX benchmark dated March 3, 2026, relayed by NVIDIA. It is a &lt;em&gt;vendor-cited&lt;/em&gt; figure: representative of an optimized case, not of an average production throughput.&lt;/p&gt;
&lt;h2 id=&quot;sglang-0512-native-disaggregation&quot;&gt;SGLang 0.5.12: native disaggregation&lt;/h2&gt;
&lt;p&gt;SGLang 0.5.12 shipped on May 16, 2026, and it is the first version of the runtime to treat prefill/decode disaggregation as a first-class citizen. Where Dynamo is an orchestrator &lt;em&gt;above&lt;/em&gt; the runtime, SGLang builds the machinery &lt;em&gt;into&lt;/em&gt; the runtime itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The mechanism.&lt;/strong&gt; The &lt;em&gt;GPU Staging Buffer&lt;/em&gt; is an intermediate VRAM buffer that accumulates the KV cache on the prefill side and transfers it block by block to the decode node. The &lt;em&gt;Decode Radix Cache&lt;/em&gt; on the decode side organizes the received KV in a radix tree that enables prefix matching: if two requests share the same first 2,000 tokens, the cache is transferred only once. Three transport backends are supported: NIXL (NVIDIA), Mooncake (an open-source framework), and MORI-IO (AMD), which makes SGLang the only runtime to natively support disaggregation on &lt;em&gt;both&lt;/em&gt; GPU ecosystems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DeepSeek V4 day-0.&lt;/strong&gt; SGLang 0.5.12 is the first runtime to support the full DeepSeek V4 inference path from launch day. This matters: DeepSeek models use a MoE (&lt;em&gt;Mixture of Experts&lt;/em&gt;) architecture with a very large number of experts, and serving them efficiently demands Tensor Parallelism, Expert Parallelism, Context Parallelism, and Data Parallel Attention at once. SGLang supports TP16 on H100 and H20.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HiSparse: proactive offload of idle KV.&lt;/strong&gt; HiSparse is a mechanism specific to sparse-attention models of the DeepSeek family (V3.2, GLM-5.1). Instead of waiting for VRAM to saturate before starting the offload, HiSparse &lt;em&gt;proactively&lt;/em&gt; identifies the KV entries that no longer participate in attention and moves them to CPU memory. The measured gain: 3× throughput at 256 concurrent requests, up to 5× on long contexts. The limit: it works only on sparse-attention models (DSA). On a classic dense-attention Llama, the mechanism does not apply.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HiCache&lt;/strong&gt; complements HiSparse by adding a unified radix tree (&lt;em&gt;UnifiedRadixTree&lt;/em&gt;) that tiers the KV cache across VRAM, CPU RAM, and SSD via Mooncake. It extends the logic of PagedAttention, which pages the KV cache the way an operating system pages virtual memory, to three storage levels instead of two.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Native Blackwell.&lt;/strong&gt; The TokenSpeed MLA backend is optimized for Blackwell Tensor Cores with an FP8 KV cache. The W4A4 MegaMoE kernels target 4-bit-quantized MoE models, and &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-l&quot; aria-expanded=&quot;false&quot;&gt; speculative decoding &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-l&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;speculative decoding&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;A decode-acceleration technique that uses a small fast model (&lt;em&gt;draft model&lt;/em&gt;) to propose several candidate tokens, then verified in a single pass by the main model. Correct tokens are accepted at no extra cost: you trade redundant compute for fewer autoregressive passes.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  V2, where a lightweight draft path proposes several tokens that the full model then verifies in one batch, improves the acceptance rate on MTP (&lt;em&gt;Multi-Token Prediction&lt;/em&gt;) models. DeepSeek-R1 ships a native MTP layer, extended to 3 for the performance peak in Dynamo plus TRT-LLM.&lt;/p&gt;
&lt;h2 id=&quot;tensorrt-llm-13-helix-parallelism-and-the-kv-connectors&quot;&gt;TensorRT-LLM 1.3: Helix Parallelism and the KV connectors&lt;/h2&gt;
&lt;p&gt;TensorRT-LLM 1.3 has been in a fast pre-release cycle since March 2026: rc7 on March 10, rc12 on April 17, rc15 on May 21. Each release candidate adds a piece of the disaggregation puzzle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Service discovery for disaggregated serving&lt;/strong&gt; (rc12): prefill and decode nodes discover each other automatically on the cluster, with no static configuration. It is the prerequisite for Dynamo to route requests without a hard-coded registry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KV Cache Connector API&lt;/strong&gt; (introduced in v1.1, refined in the 1.3 release candidates): an abstraction API for KV transfer between nodes. The runtime does not need to know &lt;em&gt;how&lt;/em&gt; the KV is transferred (NVLink, RDMA, S3/Azure blob): the connector handles it. Dynamo uses this API to offload KV to object storage, a feature shipped in March 2026.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sparse Attention&lt;/strong&gt; (rc13): support for MQA and GQA sparse attention, needed for DeepSeek models and sparse-attention architectures.&lt;/p&gt;
&lt;h3 id=&quot;helix-parallelism-the-central-mechanism&quot;&gt;Helix Parallelism: the central mechanism&lt;/h3&gt;
&lt;p&gt;Helix Parallelism is TRT-LLM 1.3’s most significant contribution to disaggregated serving. Its mechanism deserves the detail, because it solves a problem that existing parallelism strategies handled poorly.&lt;/p&gt;
&lt;p&gt;Here is the problem. On a MoE model like DeepSeek-R1 671B, each transformer layer consists of two blocks: attention (which is dense, every parameter participates) and the FFN (&lt;em&gt;feed-forward network&lt;/em&gt;, which is sparse, only a few experts fire per token). Classic Tensor Parallelism splits &lt;em&gt;all&lt;/em&gt; operations uniformly across the GPUs. On dense attention, that is optimal: each GPU does its share. On the sparse FFN, it is waste: the GPUs hosting inactive experts sit idle, while those hosting the hot experts saturate.&lt;/p&gt;
&lt;p&gt;Helix resolves this imbalance by applying &lt;em&gt;two different parallelism strategies depending on the block&lt;/em&gt;. During attention, it uses KV Parallelism: each GPU holds a partition of the KV cache and computes its share of attention independently. During the FFN, it switches to TP (Tensor Parallelism) for dense models, or TP×EP (Tensor Parallelism × Expert Parallelism) for MoE models. This dynamic switching between two parallelism regimes within a single layer (hence the name &lt;em&gt;Helix&lt;/em&gt;, which evokes interleaving) is what sets the approach apart. The paper (arXiv: 2507.07120) measures up to a 1.5× reduction in TTL (&lt;em&gt;Token-to-Token Latency&lt;/em&gt;) and the ability to support 32× larger batches under the same latency constraint, on DeepSeek-R1 on Blackwell.&lt;/p&gt;
&lt;p&gt;It is a &lt;em&gt;software&lt;/em&gt; answer to the same problem that hardware disaggregation attacks on the silicon side: match the execution regime to the workload profile, layer by layer.&lt;/p&gt;
&lt;h3 id=&quot;rocketkv-compression-without-training&quot;&gt;RocketKV: compression without training&lt;/h3&gt;
&lt;p&gt;RocketKV (arXiv: 2502.14051, ICML 2025, NVlabs) is a two-stage KV compression technique integrated into TRT-LLM 1.3. The first stage, SnapKV++, evicts the KV entries that contribute little to attention, by measuring their accumulated importance score. The second stage applies a hybrid top-k sparse attention on the remaining entries. The gain measured on H100: a 3× decode speedup, a 31% reduction in peak memory use. The distinctive point: no retraining is required. The compression applies &lt;em&gt;at inference&lt;/em&gt;, on an existing model.&lt;/p&gt;
&lt;h2 id=&quot;the-counter-argument-tenstorrent-galaxy-blackhole&quot;&gt;The counter-argument: Tenstorrent Galaxy Blackhole&lt;/h2&gt;
&lt;p&gt;All the solutions above start from one premise: disaggregation is necessary because the general-purpose GPU is structurally sub-optimal on one of the two phases. Tenstorrent disputes that premise.&lt;/p&gt;
&lt;p&gt;On April 28, 2026, Tenstorrent launched Galaxy Blackhole into general availability. The positioning is explicit in their press release: &lt;em&gt;“Other solutions require bolting together separate accelerators across fragmented infrastructure.”&lt;/em&gt; Their thesis: rather than fragmenting the pipeline across different silicon linked by a network, you unify compute, memory, and network in a &lt;em&gt;single system&lt;/em&gt; built so that the internal bandwidth is high enough that the prefill/decode distinction loses its relevance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The specs behind the thesis.&lt;/strong&gt; Galaxy Blackhole bundles 32 Blackhole chips into a single system. Compute reaches 23 PFLOPS in Block FP8. Memory is split across two tiers: 6.2 GB of SRAM at 2.9 PB/s of internal bandwidth, so that &lt;em&gt;the SRAM alone&lt;/em&gt; offers a bandwidth on a different scale from the HBM of a classic GPU. For reference, an H100 SXM5 tops out at ~3.35 TB/s of HBM3, a B200 at ~8 TB/s of HBM3E. Above that sits 1 TB of DRAM at 16 TB/s. The internal network supports up to 56 ports of 800G Ethernet.&lt;/p&gt;
&lt;p&gt;Tenstorrent’s reasoning runs as follows. The reason decode is memory-bound on a classic GPU is that HBM bandwidth (~8 TB/s on a B200) cannot keep pace with the compute. If you replace the GPU-plus-HBM hierarchy with an SRAM-first hierarchy at 2.9 PB/s, the arithmetic intensity of decode rises enough that compute becomes the limiting factor again, not memory. The result: the prefill/decode split loses its purpose. A single system does both efficiently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blitz Mode&lt;/strong&gt; makes this thesis concrete. On DeepSeek-R1-0528 (671B parameters), Tenstorrent claims: 350+ tokens/s/user in decode, TTFT under 4 seconds on a 100k-token context, batch sizes from 8 to 64, context up to 128k. These are &lt;em&gt;vendor&lt;/em&gt; figures (a verified fact as to their publication, not verified by an independent benchmark), but the sub-4-second TTFT on 100k tokens is an aggressive claim: it means the &lt;em&gt;prefill&lt;/em&gt; itself is fast despite the absence of dedicated Tensor Cores in NVIDIA’s sense of the term.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-warn&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;⚠&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;The disaggregation-versus-integration debate is not settled, and reducing it to “NVIDIA is right, Tenstorrent is wrong” would miss the point. Disaggregation solves a &lt;em&gt;utilization&lt;/em&gt; problem on the existing GPU: the general-purpose GPU that sits underused on one phase can be replaced with specialized hardware. Tenstorrent sidesteps the problem by changing the base hardware, at the cost of a younger software ecosystem and a lock-in to a proprietary architecture (the Blackhole chips and their RISC-V Tensix ISA). The choice depends on your horizon: if your NVIDIA GPU fleet already exists and has to earn its keep, software disaggregation is the immediate lever. If you start from a blank slate and per-user latency is paramount, Tenstorrent is worth the evaluation.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;The price.&lt;/strong&gt; A Galaxy Blackhole system starts at around $110,000. A 4-system supercluster starts at around $440,000. Set against the cost of a DGX GB200 NVL72 rack (press estimates put it between $2 million and $3 million), that is an order of magnitude below. The direct comparison stays misleading, because the two systems do not target the same model scale or the same inter-rack network bandwidth.&lt;/p&gt;
&lt;h2 id=&quot;amd-mori-io-and-vllm-atom&quot;&gt;AMD: MORI-IO and vLLM-ATOM&lt;/h2&gt;
&lt;p&gt;AMD has no orchestration framework equivalent to Dynamo. Its strategy is to supply the &lt;em&gt;transport building blocks&lt;/em&gt; that third-party runtimes consume, and to make sure its GPUs are first-class citizens in SGLang and vLLM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MORI-IO&lt;/strong&gt; (&lt;em&gt;Modular RDMA Interface&lt;/em&gt;) is AMD’s point-to-point communication library for low-overhead KV transfers (GitHub: ROCm/mori). It is not an inference runtime: it is an RDMA transport layer optimized for disaggregation use cases, namely the transfer of KV cache between prefill and decode nodes (the Expert Parallelism communication of MoE models falls to a separate module, MORI-EP). MORI-IO is integrated into SGLang (as a transport backend alternative to NIXL) and into vLLM. It is the piece that makes disaggregation &lt;em&gt;possible&lt;/em&gt; on AMD GPUs, exactly as NIXL makes it possible on NVIDIA.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vLLM-ATOM&lt;/strong&gt; is an external plugin published on May 7, 2026, that bundles AMD’s kernel optimizations for vLLM: AITER fused attention, custom AllReduce, optimized MoE routing, FP4 support for MI355X. AMD describes it as a &lt;em&gt;“temporary proving ground for new optimizations”&lt;/em&gt;; the stabilized kernels are upstreamed into vLLM’s native ROCm backend. The logic is pragmatic: rather than wait on upstream, AMD ships the optimizations in a plugin you install alongside, one that will disappear once upstream has absorbed them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MI350P PCIe&lt;/strong&gt; deserves a mention. Announced on May 7, 2026, it is the first AMD MI350 accelerator in PCIe Gen 5 form factor: 144 GB of HBM3E at 4 TB/s, up to 4.6 PFLOPS in MXFP4, passive dual-slot, 600 W TBP (configurable down to 450 W). It is not the same class as the MI355X (288 GB, 8 TB/s): it is a drop-in for existing air-cooled servers, designed for companies that want to enter disaggregated inference without overhauling their cooling infrastructure.&lt;/p&gt;
&lt;h2 id=&quot;what-mlperf-v60-measures&quot;&gt;What MLPerf v6.0 measures&lt;/h2&gt;
&lt;p&gt;MLPerf Inference v6.0, published on April 1, 2026 by MLCommons, is the first benchmark cycle that reflects the era of software disaggregation. 24 organizations submitted results. Five new benchmarks were added: GPT-OSS 120B, interactive DeepSeek-R1 (with speculative decoding), DLRMv3, WAN-2.2 text-to-video, and YOLOv11 edge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The most striking result is not a hardware number&lt;/strong&gt;: it is a software number. NVIDIA improved its DeepSeek-R1 score by &lt;strong&gt;2.7×&lt;/strong&gt; over its own earlier submission. The hardware did not change: 288 GPUs, 4 GB300 NVL72 racks. The gain comes from orchestration: Dynamo, disaggregation, Expert Parallelism, extended speculative decoding (MTP raised from 1 to 3 layers). The result: 2.5M tokens/s. This 2.7× has to be read precisely: it is against the earlier &lt;em&gt;NVIDIA&lt;/em&gt; submission, not against the whole MLPerf v5.1 field. It shows that software weighs as much as silicon on already-deployed hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AMD MI355X.&lt;/strong&gt; The flagship score is 100,282 tokens/s on Llama 2 70B Server, 3.1× the MI325X. In multinode (11 nodes, 87 MI355X), AMD reaches 1,042,110 tokens/s Offline and 1,016,380 tokens/s Server. These figures confirm the MI355X’s competitiveness in raw throughput, even if AMD’s software ecosystem stays a notch behind on orchestration maturity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NVIDIA Blackwell Ultra&lt;/strong&gt; reaches 2.5M tokens/s on DeepSeek-R1 with 288 GPUs spread across 4 GB300 NVL72 racks, the highest absolute score of the cycle. That this score comes largely from &lt;em&gt;software&lt;/em&gt; gains on &lt;em&gt;existing&lt;/em&gt; hardware is the most important signal of this MLPerf cycle: investing in orchestration pays as much as investing in silicon.&lt;/p&gt;
&lt;h2 id=&quot;the-implementations-compared&quot;&gt;The implementations compared&lt;/h2&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Comparison of Dynamo, SGLang, TRT-LLM, and Tenstorrent for prefill/decode disaggregation&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Criterion&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Dynamo 1.0&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;SGLang 0.5.12&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;TRT-LLM 1.3&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Tenstorrent Galaxy&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Role&lt;/th&gt;&lt;td&gt;Cluster orchestrator&lt;/td&gt;&lt;td&gt;Native runtime&lt;/td&gt;&lt;td&gt;Runtime + kernels&lt;/td&gt;&lt;td&gt;Integrated system&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Disaggregation&lt;/th&gt;&lt;td&gt;Native (E/P/D)&lt;/td&gt;&lt;td&gt;Native (P/D)&lt;/td&gt;&lt;td&gt;Via Service Discovery + KV Connector&lt;/td&gt;&lt;td&gt;Not applicable (unified)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;KV transport&lt;/th&gt;&lt;td&gt;NVLink, RDMA, S3/Azure blob&lt;/td&gt;&lt;td&gt;NIXL, Mooncake, MORI-IO&lt;/td&gt;&lt;td&gt;KV Cache Connector API&lt;/td&gt;&lt;td&gt;Internal SRAM (2.9 PB/s)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Supported GPUs&lt;/th&gt;&lt;td&gt;NVIDIA (GB200, GB300)&lt;/td&gt;&lt;td&gt;NVIDIA + AMD (H100, H20, MI355X)&lt;/td&gt;&lt;td&gt;NVIDIA only&lt;/td&gt;&lt;td&gt;Blackhole (RISC-V Tensix)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Advanced parallelism&lt;/th&gt;&lt;td&gt;Wide EP, TP, KV-aware routing&lt;/td&gt;&lt;td&gt;TP, EP, CP, DPA&lt;/td&gt;&lt;td&gt;Helix (KV-P + TP×EP)&lt;/td&gt;&lt;td&gt;Internal, 32 chips&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;KV optimization&lt;/th&gt;&lt;td&gt;KVBM offload S3, prefix caching&lt;/td&gt;&lt;td&gt;HiSparse, HiCache, Radix Cache&lt;/td&gt;&lt;td&gt;RocketKV, Sparse Attention&lt;/td&gt;&lt;td&gt;SRAM-first (6.2 GB)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Kubernetes&lt;/th&gt;&lt;td&gt;Inference Gateway + Grove&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Open source&lt;/th&gt;&lt;td&gt;Yes (ai-dynamo/dynamo)&lt;/td&gt;&lt;td&gt;Yes (sgl-project/sglang)&lt;/td&gt;&lt;td&gt;Yes (NVIDIA/TensorRT-LLM)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Entry price&lt;/th&gt;&lt;td&gt;Cloud GPU (~$2-3/h H100)&lt;/td&gt;&lt;td&gt;Cloud GPU (~$2-3/h H100)&lt;/td&gt;&lt;td&gt;NVIDIA GPU only&lt;/td&gt;&lt;td&gt;~$110,000 (system)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: prefill/decode disaggregation implementations, May 2026. The columns compare the approach, KV transport, supported models, and positioning.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;h2 id=&quot;how-to-choose&quot;&gt;How to choose&lt;/h2&gt;
&lt;p&gt;The decision matrix depends on three variables: your existing hardware fleet, your dominant constraint (latency or throughput), and your tolerance for operational complexity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You have an existing NVIDIA fleet and you serve MoE models at high concurrency.&lt;/strong&gt; Dynamo plus TRT-LLM is the most direct path. Dynamo orchestrates the disaggregation, TRT-LLM delivers the maximum per-node throughput with Helix Parallelism, and the Kubernetes plugin handles scaling. The operational cost is real (one more layer to maintain), but the measured gains (7× throughput on the NVIDIA benchmark, 2× TTFT at Baseten) justify the investment on high-concurrency workloads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You want disaggregation without hardware lock-in.&lt;/strong&gt; SGLang 0.5.12 is the only runtime that supports disaggregation natively on NVIDIA &lt;em&gt;and&lt;/em&gt; AMD, via NIXL and MORI-IO respectively. If you plan a mixed fleet or a future migration to AMD, it is the most defensible choice. HiSparse is a powerful lever if you serve DeepSeek models.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You start from scratch and per-user latency is your key metric.&lt;/strong&gt; Tenstorrent Galaxy Blackhole is worth the evaluation. The sub-4-second TTFT on 100k tokens and the 350+ tokens/s/user in decode are aggressive claims, but the entry price (~$110,000 per system) and the absence of KV-transfer complexity are real arguments. The trade-off: a young software ecosystem, no native Kubernetes, and a lock-in to the Tensix architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You serve mostly dense models (Llama, Mistral) at moderate batch.&lt;/strong&gt; Disaggregation is probably not your immediate priority. A well-configured classic runtime, vLLM with &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-m&quot; aria-expanded=&quot;false&quot;&gt; PagedAttention &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-m&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;PagedAttention&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;An algorithm introduced by vLLM that manages the KV cache like an operating system&apos;s virtual memory: in pages, without requiring a contiguous block per request. It eliminates internal and external fragmentation, letting a server handle 2 to 4× more concurrent requests on the same VRAM.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  and prefix caching, covers the majority of these cases. Disaggregation pays off mainly on MoE models at very high concurrency or on long contexts.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Software caught up with hardware in three months. The thesis Vera Rubin laid out, that inference breaks into specialized phases, is now implementable &lt;em&gt;without&lt;/em&gt; waiting for Rubin silicon. Dynamo, SGLang, and TRT-LLM let you disaggregate on existing Blackwell or Hopper hardware, and the measured gains (MLPerf v6.0: 2.7× from software alone) show that orchestration has become a lever at least as powerful as the jump to the next silicon generation.&lt;/p&gt;
&lt;p&gt;The next frontier is not disaggregation itself: it is its &lt;em&gt;automation&lt;/em&gt;. The three runtimes still demand manual sizing of the prefill/decode ratio, explicit configuration of the KV transport, and a network topology designed for the use case. Dynamo’s DGDR sketches the direction: translate an SLO into a deployment, without the operator touching the routing. Once that loop closes, an SLO goes in and a configured cluster comes out, disaggregation will stop being a specialist’s technique and become a default deployment mode.&lt;/p&gt;
&lt;p&gt;The other open question is the &lt;em&gt;fourth tier&lt;/em&gt;. Vera Rubin laid out three tiers: prefill GPU, decode LPU, orchestration CPU. The KV cache, whose transfer is the bottleneck of disaggregation, could justify a dedicated storage tier, exactly what the cancelled Rubin CPX was meant to be. If KV transfers remain the limiting factor at scale, that tier will reappear, in one form or another, in the Feynman 2028 platform.&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;This article draws on a research file closed on May 24, 2026. Labels: &lt;strong&gt;verified fact&lt;/strong&gt; = citable primary source; &lt;strong&gt;credible estimate&lt;/strong&gt; = consistent but not independently verified; &lt;strong&gt;assumption&lt;/strong&gt; = reasoning without measurement. A French version of this article, &lt;a href=&quot;https://lecompute.fr/runtimes/disaggregation-prefill-decode-production/&quot;&gt;published on May 24, 2026&lt;/a&gt;, is the original.&lt;/p&gt;
&lt;h3 id=&quot;dynamo-10&quot;&gt;Dynamo 1.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;NVIDIA Developer Blog, &lt;em&gt;NVIDIA Dynamo 1.0 Production Ready&lt;/em&gt;: &lt;a href=&quot;https://developer.nvidia.com/blog/nvidia-dynamo-1-production-ready/&quot;&gt;developer.nvidia.com/blog/nvidia-dynamo-1-production-ready/&lt;/a&gt;, March 16, 2026 (verified fact). Multimodal E/P/D figures, Kubernetes Inference Gateway, FastVideo.&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/ai-dynamo/dynamo&quot;&gt;ai-dynamo/dynamo&lt;/a&gt;, open source (verified fact).&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/ai-dynamo/grove&quot;&gt;ai-dynamo/grove&lt;/a&gt;, Grove API for topology-aware scheduling on GB300 NVL72 (verified fact).&lt;/li&gt;
&lt;li&gt;SemiAnalysis InferenceX, 7× throughput benchmark on GB200 NVL72 with DeepSeek R1-0528 FP4 (vendor-cited, relayed by NVIDIA).&lt;/li&gt;
&lt;li&gt;Baseten, &lt;em&gt;“How Baseten Achieved 2x Faster Inference with NVIDIA Dynamo”&lt;/em&gt;: &lt;a href=&quot;https://baseten.co/blog/how-baseten-achieved-2x-faster-inference-with-nvidia-dynamo/&quot;&gt;baseten.co/blog/how-baseten-achieved-2x-faster-inference-with-nvidia-dynamo/&lt;/a&gt;, October 16, 2025, Abu Qader, Michael Feil, Rachel Rapp. TTFT -50%, +61% RPS, +62% TPS on Qwen3 Coder 480B (verified fact). The “2×” claim applies to TTFT. The “no additional hardware cost” claim comes from social media, not from the technical post (editorial nuance).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sglang-0512&quot;&gt;SGLang 0.5.12&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHub release: &lt;a href=&quot;https://github.com/sgl-project/sglang/releases/tag/v0.5.12&quot;&gt;sgl-project/sglang v0.5.12&lt;/a&gt;, May 16, 2026 (verified fact).&lt;/li&gt;
&lt;li&gt;PD disaggregation with GPU Staging Buffer, Decode Radix Cache, NIXL/Mooncake/MORI-IO backends (verified fact).&lt;/li&gt;
&lt;li&gt;HiSparse: 3× throughput at 256 concurrent requests, up to 5× on long contexts (verified fact, limited to DSA models: DeepSeek-V3.2, GLM-5.1).&lt;/li&gt;
&lt;li&gt;HiCache: UnifiedRadixTree, SSD offload via Mooncake (verified fact).&lt;/li&gt;
&lt;li&gt;DeepSeek V4 day-0, TP16 on H100/H20 (verified fact).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tensorrt-llm-13&quot;&gt;TensorRT-LLM 1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Releases: rc7 (March 10) to rc15 (May 21, 2026), pre-release (verified fact).&lt;/li&gt;
&lt;li&gt;Helix Parallelism: arXiv 2507.07120, KV Parallelism (attention) + TP×EP (FFN), 1.5× TTL, 32× batch at constant latency on DeepSeek-R1/Blackwell (verified fact).&lt;/li&gt;
&lt;li&gt;RocketKV: arXiv 2502.14051, ICML 2025 (NVlabs), 3× decode speedup, -31% peak memory on H100 (verified fact).&lt;/li&gt;
&lt;li&gt;Service discovery (rc12), KV Cache Connector API (v1.1+), MQA/GQA Sparse Attention (rc13) (verified fact).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tenstorrent-galaxy-blackhole&quot;&gt;Tenstorrent Galaxy Blackhole&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Tenstorrent Newsroom, GA April 28, 2026: &lt;a href=&quot;https://tenstorrent.com/newsroom/&quot;&gt;tenstorrent.com/newsroom/&lt;/a&gt; (verified fact).&lt;/li&gt;
&lt;li&gt;Specs: 32 Blackhole chips, 23 PFLOPS Block FP8, 6.2 GB SRAM (2.9 PB/s), 1 TB DRAM (16 TB/s), 56× 800G Ethernet (verified fact).&lt;/li&gt;
&lt;li&gt;Blitz Mode: 350+ tokens/s/user decode, TTFT under 4 s on 100k context, DeepSeek-R1-0528 671B, batch 8-64, context up to 128k (verified fact as vendor publication, not verified by independent benchmark).&lt;/li&gt;
&lt;li&gt;Price: system starting at $110,000, 4-system supercluster starting at $440,000 (verified fact).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;amd&quot;&gt;AMD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ROCm Blog, vLLM-ATOM plugin: &lt;a href=&quot;https://rocm.blogs.amd.com&quot;&gt;rocm.blogs.amd.com&lt;/a&gt;, May 7, 2026 (verified fact).&lt;/li&gt;
&lt;li&gt;MORI-IO (Modular RDMA Interface): &lt;a href=&quot;https://github.com/ROCm/mori&quot;&gt;github.com/ROCm/mori&lt;/a&gt;, RDMA library for KV and EP transfer on AMD GPUs (verified fact).&lt;/li&gt;
&lt;li&gt;MI350P PCIe: AMD blog May 7, 2026, 144 GB HBM3E, 4 TB/s, 4.6 PFLOPS MXFP4, dual-slot PCIe Gen 5, 600 W TBP (verified fact).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;mlperf-inference-v60&quot;&gt;MLPerf Inference v6.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MLCommons, &lt;em&gt;MLPerf Inference v6.0 Results&lt;/em&gt;: &lt;a href=&quot;https://mlcommons.org/2026/04/mlperf-inference-v6-0-results/&quot;&gt;mlcommons.org/2026/04/mlperf-inference-v6-0-results/&lt;/a&gt;, April 1, 2026 (verified fact).&lt;/li&gt;
&lt;li&gt;NVIDIA: 2.5M tokens/s DeepSeek-R1, 288 GPUs, 4× GB300 NVL72 (verified fact). The 2.7× is against the earlier NVIDIA submission, not against the whole v5.1 field (editorial clarification).&lt;/li&gt;
&lt;li&gt;AMD MI355X: 100,282 tokens/s Llama 2 70B Server (3.1× vs MI325X), 1,042,110 tokens/s Offline / 1,016,380 Server on 11 nodes / 87 MI355X (verified fact).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;speculative-decoding&quot;&gt;Speculative decoding&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EAGLE-3 / SpecForge: arXiv 2603.18567, March 2026. Measured range: 3.27× to 4.79× on HumanEval (LLaMA-3.3-70B-Instruct, temp=0) (verified fact).&lt;/li&gt;
&lt;li&gt;P-EAGLE (AWS): March 13, 2026, main PR #32887. 1.55× at c=1, 1.05× at c=64 on MT-Bench/GPT-OSS-20B (verified fact).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;prices&quot;&gt;Prices&lt;/h3&gt;
&lt;p&gt;All prices in this article are in US dollars, as reported by the cited sources (Tenstorrent’s published pricing, cloud GPU street rates). The French edition converts them to euros at an indicative 1 USD = 0.92 EUR (mid-2026).&lt;/p&gt;</content:encoded><media:content url="https://lecompute.fr/images/photos/disaggregation-production.webp" medium="image"/><media:description>Datacenter GPU servers with high-density network cabling, illustrating disaggregated inference infrastructure</media:description><category>Disaggregation</category><category>Dynamo</category><category>SGLang</category><category>TensorRT-LLM</category><category>Tenstorrent</category><category>Prefill</category><category>Decode</category><author>redaction@lecompute.fr (Killian Pluenet)</author></item><item><title>The KV cache is no longer a side effect: it is the center of LLM serving in 2026</title><link>https://lecompute.fr/en/runtimes/kv-cache-objet-central-serving/</link><guid isPermaLink="true">https://lecompute.fr/en/runtimes/kv-cache-objet-central-serving/</guid><description>The KV cache has shifted from a VRAM side effect to a first-class object in the serving stack, with its own quantization (TurboQuant, ~3 bits), tiered storage (KVBM G1→G4), transfer connectors, and KV-aware routing that cuts TTFT by 20×.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;Key takeaways&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;Key takeaways&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The KV cache has become a product in its own right&lt;/strong&gt;, with its own quantization (TurboQuant, ~3 bits), its transfer protocol (KV Cache Connector, NIXL), and its tiered storage (KVBM G1→G4).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TurboQuant drops to ~3 bits per value&lt;/strong&gt; with no measurable degradation, and vLLM 0.20 ships it natively: at least 6× memory reduction on the cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV-aware routing&lt;/strong&gt; cuts TTFT by 20× by sending requests to the nodes that already hold the prefix’s cache, instead of recomputing.&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;what-changed-since-pagedattention&quot;&gt;What changed since PagedAttention&lt;/h2&gt;
&lt;p&gt;The KV cache, the store of attention keys and values a model keeps so it never recomputes past tokens, used to be framed as a &lt;em&gt;memory-consumption&lt;/em&gt; problem, and our French primer treated it that way: the cache grows linearly with context length and batch size, and it is the cache, not the weights, that saturates VRAM first. &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-n&quot; aria-expanded=&quot;false&quot;&gt; PagedAttention &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-n&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;PagedAttention&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;An algorithm introduced by vLLM that manages the KV cache like an operating system&apos;s virtual memory: in pages, without requiring a contiguous block per request. It eliminates internal and external fragmentation, letting a server handle 2 to 4× more concurrent requests on the same VRAM.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , the vLLM scheme that stores that cache in non-contiguous pages the way an operating system handles virtual memory, solved fragmentation; &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-o&quot; aria-expanded=&quot;false&quot;&gt; FP8 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-o&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP8&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;An 8-bit floating-point format. A versatile working format for inference (and training) on recent GPUs. It halves the memory footprint and bandwidth needed versus FP16, for a marginal accuracy loss on most models.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  quantization (one byte per value instead of two) doubled capacity; prefix caching removed redundant recomputation. Those three levers remain the foundation. But each treats the KV cache as a &lt;em&gt;local byproduct&lt;/em&gt;: a tensor the GPU owns, manages, and shares with no one.&lt;/p&gt;
&lt;p&gt;What happened between late 2025 and May 2026 goes beyond that frame. The KV cache has acquired its own &lt;em&gt;specialized quantization&lt;/em&gt;, distinct from the weights’. It now has a &lt;em&gt;transfer protocol&lt;/em&gt; for migrating from one node to another. It lives in a &lt;em&gt;four-tier memory hierarchy&lt;/em&gt;, from GPU &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-p&quot; aria-expanded=&quot;false&quot;&gt; HBM &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-p&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;HBM&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;High Bandwidth Memory&lt;/em&gt;. Memory stacked in layers and soldered right next to the GPU, with several TB/s of bandwidth (versus ~50 GB/s for DDR5). Indispensable beyond a certain model size.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (the high-bandwidth memory soldered next to the GPU) down to S3 object storage. And the inference scheduler makes its routing decisions &lt;em&gt;based on the state of the cache&lt;/em&gt; on each node.&lt;/p&gt;
&lt;p&gt;The KV cache is no longer a side effect. It is the central object around which the serving stack is reorganizing.&lt;/p&gt;
&lt;h2 id=&quot;turboquant-the-cache-drops-to-3-bits&quot;&gt;TurboQuant: the cache drops to ~3 bits&lt;/h2&gt;
&lt;p&gt;FP8 quantization of the KV cache (one byte per value instead of two) had been a production default since 2024. Going lower without hurting quality looked out of reach: the KV cache changes at every token, unlike the weights, which you calibrate once. Aggressive quantization schemes (4-bit, 2-bit) produced measurable artifacts on generation benchmarks.&lt;/p&gt;
&lt;p&gt;TurboQuant, published at ICLR 2026 by Google Research and NYU (arXiv 2504.19874), solves this with two chained mechanisms.&lt;/p&gt;
&lt;p&gt;The first, &lt;strong&gt;PolarQuant&lt;/strong&gt;, applies a random orthogonal rotation to the K and V vectors &lt;em&gt;before&lt;/em&gt; quantization. The idea is not to approximate the values as they are: it is to transform them into a space where their distribution becomes near-Gaussian, hence better suited to uniform quantization. The rotation is invertible and cheap: a randomly drawn orthogonal matrix, applied by multiplication, and undone after the attention computation. What would be expensive to store (the matrix) is handled by a fixed &lt;em&gt;seed&lt;/em&gt;: the same matrix is rebuilt on every call, never kept.&lt;/p&gt;
&lt;p&gt;The second, &lt;strong&gt;QJL&lt;/strong&gt; (&lt;em&gt;Quantized Johnson-Lindenstrauss&lt;/em&gt;), corrects the quantization residual with a 1-bit random projection. Instead of storing the error at full resolution, QJL projects it into a subspace and keeps only the &lt;em&gt;sign&lt;/em&gt; of each projected component, one bit. The Johnson-Lindenstrauss lemma guarantees that the distance between vectors is preserved with high probability in the projected subspace, which is enough for the attention computation. The combined result: about &lt;strong&gt;3 bits per coordinate&lt;/strong&gt; for a quality indistinguishable from the baseline, 2.5 bits with marginal degradation.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-accent&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;↯&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;TurboQuant’s performance numbers deserve their context. The “up to 8×” attention speedup measured on H100 is computed against an &lt;strong&gt;FP32 baseline&lt;/strong&gt;, not FP16. Against the FP8 already standard in production, the speed gain is smaller; the &lt;em&gt;memory&lt;/em&gt; gain stays major: at least &lt;strong&gt;6× reduction&lt;/strong&gt; versus FP16, which frees VRAM budget for extra batch or context.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;p&gt;The vLLM 0.20 integration has been live since April 15, 2026 (PR #38479). The CLI flag is &lt;code&gt;--kv-cache-dtype turboquant_3bit_nc&lt;/code&gt;. A FlashAttention 3/4 extension for &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-q&quot; aria-expanded=&quot;false&quot;&gt; prefill &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-q&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;prefill&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The opening phase of LLM inference: every token of the prompt is processed at once. High arithmetic intensity, so the GPU saturates its Tensor Cores. The opposite of the &lt;em&gt;decode&lt;/em&gt; phase that follows.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  followed in PR #40092. The vLLM blog of May 11, 2026 published the first systematic study. This is no longer a research paper, it is a configuration parameter.&lt;/p&gt;
&lt;h2 id=&quot;rocketkv-smart-eviction&quot;&gt;RocketKV: smart eviction&lt;/h2&gt;
&lt;p&gt;TurboQuant compresses every value in the cache. RocketKV (arXiv 2502.14051, NVlabs, ICML 2025) takes the problem from the other end: &lt;em&gt;not storing&lt;/em&gt; the entries attention will never look at.&lt;/p&gt;
&lt;p&gt;The mechanism runs in two stages. The first, &lt;strong&gt;SnapKV++&lt;/strong&gt;, performs a coarse eviction: at regular intervals it evaluates which cache blocks contributed least to the recent attention score and drops them. It is a high-pass filter on temporal relevance: old, never-consulted blocks disappear. The second stage applies a &lt;strong&gt;hybrid top-k sparse attention&lt;/strong&gt; over the surviving cache: instead of computing attention over every remaining vector, it keeps only the &lt;em&gt;k&lt;/em&gt; most relevant entries, selected by a lightweight score.&lt;/p&gt;
&lt;p&gt;Measured on H100: up to 3× &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-r&quot; aria-expanded=&quot;false&quot;&gt; decode &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-r&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;decode&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The autoregressive generation phase of an LLM: one token is produced at a time, re-reading the whole KV cache. Arithmetic intensity is very low, so the GPU spends most of its time waiting on memory. A real inference service is almost always dominated by decode.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  speedup, 31% peak-memory reduction. Its integration into TensorRT-LLM as a sparse-attention backend makes it complementary to quantization: TurboQuant shrinks the size of each entry, RocketKV shrinks the &lt;em&gt;number&lt;/em&gt; of entries.&lt;/p&gt;
&lt;h2 id=&quot;flashattention-4-prefill-comes-down-a-step&quot;&gt;FlashAttention 4: prefill comes down a step&lt;/h2&gt;
&lt;p&gt;The attention computation itself crossed a threshold in March 2026. FlashAttention 4 (arXiv 2603.05451, Zadouri, Dao et al., Together AI) reaches ~1,613 TFLOPS/s at 71% utilization on Blackwell &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-s&quot; aria-expanded=&quot;false&quot;&gt; Tensor Cores &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-s&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;Tensor Cores&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Hardware units specialized in low-precision matrix multiplication, introduced by NVIDIA with Volta (2017). Each generation adds supported formats: FP16 → FP8 (Hopper) → FP6/FP4 (Blackwell). They run the bulk of the inference compute.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (SM100+): the paper measures ~1.3× cuDNN and ~2.7× Triton on B200. The gain does not come from an “inference-only” mode: FA4 does have a backward pass and serves training too. It comes from an algorithm/kernel co-design: asymmetric pipelining cut for Blackwell, a faster exponential, better overlap of the MMAs (the Tensor Core matrix-multiply-accumulate operations).&lt;/p&gt;
&lt;p&gt;vLLM 0.20 uses it as the default MLA backend for prefill on Blackwell (SM100+); on Hopper, FA3 fills that role. The link to the KV cache is direct: the faster the prefill, the less the cache-filling time weighs in the TTFT (time to first token), which makes prefix caching &lt;em&gt;less critical&lt;/em&gt; on short sequences and &lt;em&gt;even more valuable&lt;/em&gt; on long ones.&lt;/p&gt;
&lt;h2 id=&quot;the-kv-cache-memory-hierarchy-kvbm-g1g4&quot;&gt;The KV cache memory hierarchy: KVBM G1→G4&lt;/h2&gt;
&lt;p&gt;Until 2025, the KV cache lived in HBM or did not exist. CPU offloading existed as a prototype (vLLM, LMCache), but with no tier management, no migration policy, no persistent storage. The cache was an ephemeral object, destroyed when the request ended.&lt;/p&gt;
&lt;p&gt;NVIDIA Dynamo 1.0, generally available since March 16, 2026, changes that posture radically. Its &lt;strong&gt;KVBM&lt;/strong&gt; (&lt;em&gt;KV Block Manager&lt;/em&gt;) subsystem organizes the cache into a four-tier storage hierarchy that borrows its logic from CPU memory hierarchies (L1 / L2 / L3 / DRAM), but at datacenter scale.&lt;/p&gt;
&lt;figure class=&quot;article-flow-figure&quot;&gt; &lt;div class=&quot;article-flow&quot; aria-label=&quot;KVBM hierarchy: G1 HBM to G2 CPU RAM to G3 SSD to G4 object storage&quot;&gt; &lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;G1&lt;/strong&gt; &lt;span&gt;GPU HBM&lt;/span&gt; &lt;small&gt;hot, ~µs&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;G2&lt;/strong&gt; &lt;span&gt;Cross-node CPU RAM&lt;/span&gt; &lt;small&gt;warm, ~ms&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;G3 / G3.5&lt;/strong&gt; &lt;span&gt;Local SSDs + ICMS flash&lt;/span&gt; &lt;small&gt;cold, ~10 ms&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;G4&lt;/strong&gt; &lt;span&gt;S3 / Azure Blob&lt;/span&gt; &lt;small&gt;archive, ~100 ms&lt;/small&gt; &lt;/div&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Figure 1: The four KVBM tiers of Dynamo 1.0; the KV cache migrates from GPU HBM down to remote object storage according to its reuse frequency.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;G1: GPU HBM.&lt;/strong&gt; The hot tier, where the cache lives during the attention computation. Access latency on the order of a microsecond, bandwidth of several TB/s. This is the tier PagedAttention has managed since 2023. The difference is that KVBM treats it as &lt;em&gt;one floor among four&lt;/em&gt; rather than the cache’s only living space.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;G2: CPU RAM, potentially distributed.&lt;/strong&gt; The cache of a finished or interrupted request migrates to host RAM instead of being destroyed. If a later request presents the same prefix, the cache is promoted back to G1 with no recomputation. The cost: one PCIe round trip, on the order of a millisecond for a typical block. Dynamo distributes G2 across several CPU nodes: a prefix’s cache is not confined to local RAM, it is reachable from any node in the cluster.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;G3 / G3.5: local SSDs and ICMS.&lt;/strong&gt; For caches whose reuse frequency no longer justifies RAM, KVBM steps down to flash storage. The standard G3 tier uses local or pooled NVMe. The G3.5 tier is specific to the Vera Rubin platform: &lt;strong&gt;ICMS&lt;/strong&gt; (&lt;em&gt;Inference Context Memory Storage&lt;/em&gt;), flash storage integrated into the BlueField-4 DPUs and driven by the DOCA Memos framework. ICMS is sized for the KV cache, not for generic storage, and offers a data path that bypasses the host CPU through the NIC.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;G4: remote object storage.&lt;/strong&gt; The archive tier: S3, Azure Blob Storage. A long-session cache (an agent’s context over several hours, the history of a RAG workflow) persists in G4 and reloads on demand. Access latency is measured in tens of milliseconds, but recomputing the prefix would have cost &lt;em&gt;seconds&lt;/em&gt;. G4 offloading is part of the March 2026 Dynamo 1.0 release, not a feature bolted on afterward.&lt;/p&gt;
&lt;p&gt;The migration policy between tiers is governed by the blocks’ &lt;em&gt;reuse frequency&lt;/em&gt;. A block referenced once drops quickly to G3/G4; a block several requests share (system prompt, anchored RAG document) stays in G1 or G2. It is exactly the logic of a CPU cache with an extended LRU policy, applied to blocks of tens of megabytes instead of 64-byte lines.&lt;/p&gt;
&lt;h2 id=&quot;sglang-hisparse-and-hicache&quot;&gt;SGLang: HiSparse and HiCache&lt;/h2&gt;
&lt;p&gt;SGLang 0.5.12 attacks the same hierarchy with two distinct systems, each targeting a segment of the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HiSparse&lt;/strong&gt; handles GPU → CPU offloading for models that support sparse attention, so far DeepSeek-V3.2 and GLM-5.1, which use the DSA (&lt;em&gt;DeepSeek Sparse Attention&lt;/em&gt;) architecture. The mechanism is proactive: HiSparse identifies inactive KV cache entries &lt;em&gt;before&lt;/em&gt; they saturate HBM and moves them to host memory, while keeping a hot buffer in HBM for high-access-frequency entries. Measured effect: over 3× the baseline throughput at 256 concurrent requests, up to 5× on long contexts. The first public description came in the LMSYS blog of April 10, 2026.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HiCache&lt;/strong&gt; is a &lt;em&gt;separate&lt;/em&gt;, broader system. It implements a &lt;strong&gt;UnifiedRadixTree&lt;/strong&gt; with Sliding Window Attention support, which lets it manage fixed-attention-window models (DeepSeek V4 included) in a shared cache tree. SSD offloading goes through the &lt;strong&gt;Mooncake store&lt;/strong&gt;, a distributed cache-transfer engine that also shows up in TensorRT-LLM. HiCache and HiSparse are &lt;em&gt;complementary&lt;/em&gt;, not alternatives. HiSparse handles GPU↔CPU migration, HiCache handles the cache hierarchy extended down to SSD.&lt;/p&gt;
&lt;h2 id=&quot;transfer-connectors-the-kv-cache-in-transit&quot;&gt;Transfer connectors: the KV cache in transit&lt;/h2&gt;
&lt;p&gt;In a &lt;a href=&quot;https://lecompute.fr/en/runtimes/disaggregation-prefill-decode-production/&quot;&gt;disaggregated serving pipeline&lt;/a&gt;, where one node runs prefill and another runs decode, the KV cache has to &lt;em&gt;travel&lt;/em&gt;. A 70-billion-parameter model with 8k tokens of context produces ~2.6 GB of KV cache in FP16; in &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-t&quot; aria-expanded=&quot;false&quot;&gt; FP4 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-t&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP4&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;A 4-bit floating-point format, the 2026 frontier of high-throughput inference. Four times less memory than FP16, but a very narrow dynamic range: it only holds up with fine-grained scaling through block formats (MXFP4, NVFP4).&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (four bits per value), that is still hundreds of megabytes to move between nodes before decode can begin. Without an optimized protocol, this transfer cancels the gain of &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-u&quot; aria-expanded=&quot;false&quot;&gt; disaggregation &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-u&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;disaggregation&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Splitting the inference pipeline into distinct phases (prefill, decode) run on specialized node pools. It lets you assign &lt;em&gt;compute-bound&lt;/em&gt; hardware to prefill and &lt;em&gt;memory-bound&lt;/em&gt; hardware to decode, instead of running both on the same GPU that stays underused on one of the two phases.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; .&lt;/p&gt;
&lt;p&gt;Three connectors emerged in parallel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KV Cache Connector API&lt;/strong&gt; (TensorRT-LLM). Introduced in TRT-LLM v1.1 (not v1.3, which refines the implementation), this API standardizes the cache’s serialization, transfer and restore operations. v1.3 rc12 adds shortcuts for &lt;code&gt;lmcache&lt;/code&gt; and &lt;code&gt;kvbm&lt;/code&gt;; rc15 introduces a &lt;code&gt;cache_salt_id&lt;/code&gt; to identify cache blocks by signature rather than by address. The KV cache becomes an &lt;em&gt;addressable object&lt;/em&gt;, not an anonymous buffer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NIXL&lt;/strong&gt; (vLLM). vLLM’s internal transfer connector, redesigned in version 0.21 (May 2026) to support bidirectional transfers between P (prefill) and D (decode) nodes. v0.21 also adds the &lt;strong&gt;MooncakeStoreConnector&lt;/strong&gt; for distributed offloading, and DCP/PCP support in the offloading connector.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LMCache&lt;/strong&gt;. An independent project that combines CacheGen (KV cache compression), CPU offloading, and distributed caching. Compatible with vLLM. The approach is complementary: LMCache compresses &lt;em&gt;before&lt;/em&gt; the transfer, which cuts the inter-node bandwidth needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CacheBlend&lt;/strong&gt; (EuroSys 2025) rounds out the picture with a &lt;em&gt;selective reuse&lt;/em&gt; mechanism: instead of recomputing a RAG document’s KV cache on every request, CacheBlend restores the pre-existing parts and recomputes only the new tokens. Measured result: 2.2 to 3.3× TTFT reduction on RAG workloads.&lt;/p&gt;
&lt;h2 id=&quot;kv-aware-routing-the-scheduler-changes-its-criterion&quot;&gt;KV-aware routing: the scheduler changes its criterion&lt;/h2&gt;
&lt;p&gt;All these storage and transfer mechanisms would be useless if the scheduler kept routing requests without regard for the state of the cache. This is the last piece of the puzzle, and the one that produces the most spectacular gains.&lt;/p&gt;
&lt;p&gt;Dynamo 1.0’s Kubernetes Inference Gateway plugin embeds a &lt;strong&gt;token-aware routing algorithm&lt;/strong&gt;. Instead of assigning a request to the least-loaded node (weighted round-robin, the norm), the router first checks which nodes already hold the KV cache for the incoming request’s prefix. If a node in G1 or G2 holds the cache for the system prompt or the RAG document, the request goes straight there: the prefix’s prefill is short-circuited, and the TTFT drops.&lt;/p&gt;
&lt;p&gt;NVIDIA measures a 20× TTFT reduction and a 4× end-to-end latency reduction on workloads with recurring prefixes. Baseten, in a Dynamo deployment on Qwen3 Coder 480B with ~50k-token prompts, reports a 50% TTFT reduction, a 61% gain in requests per second, and a 62% gain in tokens per second. Their blog headline says “2x faster inference”: it is specifically the TTFT that is halved, not overall throughput.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-info&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;KV-aware routing inverts the scheduler’s priority hierarchy. CPU load and VRAM availability remain constraints, but the &lt;em&gt;primary selection criterion&lt;/em&gt; becomes the presence of the cache. It is a paradigm shift that touches no line of the model: only the scheduler changes, and the gain is immediate.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;comparison-the-kv-cache-by-runtime&quot;&gt;Comparison: the KV cache by runtime&lt;/h2&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Comparison of KV cache features across vLLM, SGLang, TensorRT-LLM and NVIDIA Dynamo&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Feature&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;vLLM 0.20-0.21&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;SGLang 0.5.12&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;TRT-LLM v1.1-1.3&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Dynamo 1.0&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;FP8 KV quantization&lt;/th&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓ (via runtime)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;TurboQuant ~3 bits&lt;/th&gt;&lt;td&gt;✓ (v0.20, PR #38479)&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Sparse attention (RocketKV)&lt;/th&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;HiSparse (DSA)&lt;/td&gt;&lt;td&gt;✓ (sparse backend)&lt;/td&gt;&lt;td&gt;—&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;FlashAttention 4 (prefill)&lt;/th&gt;&lt;td&gt;✓ (SM90+, default)&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Smart CPU offloading&lt;/th&gt;&lt;td&gt;✓ (reuse frequency)&lt;/td&gt;&lt;td&gt;✓ (HiSparse)&lt;/td&gt;&lt;td&gt;✓ (host offloading)&lt;/td&gt;&lt;td&gt;G2 (KVBM)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;SSD offloading&lt;/th&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;✓ (HiCache + Mooncake)&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;G3 / G3.5 (KVBM)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Object-storage offloading&lt;/th&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;G4 (S3 / Azure Blob)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;P/D transfer (disaggregation)&lt;/th&gt;&lt;td&gt;✓ (NIXL, bidirectional)&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;✓ (KV Cache Connector API)&lt;/td&gt;&lt;td&gt;✓ (KVBM + NIXL)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;KV-aware routing&lt;/th&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;✓ (K8s Inference Gateway)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;FlexKV (variable length)&lt;/th&gt;&lt;td&gt;✓ (v0.17.2+, Tencent TACO)&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Automatic prefix caching&lt;/th&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: KV cache features by runtime, May 2026. &amp;#39;✓&amp;#39; = available in production; &amp;#39;β&amp;#39; = available in preview/experimental; &amp;#39;—&amp;#39; = absent.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;If you are sizing your serving stack, three readings stand out. &lt;strong&gt;vLLM&lt;/strong&gt; concentrates the &lt;em&gt;quantization&lt;/em&gt; innovations (TurboQuant, FlexKV, FA4): it is the runtime where the cache is most compressed per entry. &lt;strong&gt;SGLang&lt;/strong&gt; concentrates the &lt;em&gt;local hierarchy&lt;/em&gt; innovations (HiSparse + HiCache): it is the runtime that pushes the cache furthest off the GPU, but for a subset of models. &lt;strong&gt;Dynamo&lt;/strong&gt; brings &lt;em&gt;coordination&lt;/em&gt; at the cluster level (KVBM + KV-aware routing) and plugs into vLLM or TRT-LLM as the underlying runtime. TRT-LLM provides the standardized &lt;em&gt;connector API&lt;/em&gt; and the RocketKV backend, but delegates orchestration to Dynamo.&lt;/p&gt;
&lt;h2 id=&quot;vllm-021-and-the-full-pd-pipeline&quot;&gt;vLLM 0.21 and the full P/D pipeline&lt;/h2&gt;
&lt;p&gt;vLLM version 0.21 (May 15, 2026) marks the moment the KV cache becomes a &lt;em&gt;first-class object in the disaggregated pipeline&lt;/em&gt;. The HMA (&lt;em&gt;Heterogeneous Memory Architecture&lt;/em&gt;) integration with the offloading subsystem unifies the memory paths: a KV block follows a G1 → CPU → back-to-G1 trajectory with no format change. Bidirectional transfers between P and D nodes go through the redesigned NIXL connector: a decode node can now &lt;em&gt;send&lt;/em&gt; cache back to a prefill node, not just receive it.&lt;/p&gt;
&lt;p&gt;The MooncakeStoreConnector opens distributed offloading: a P node’s cache can transit through the Mooncake store to a remote D node without going through the P node’s host RAM. And DCP/PCP support in the offloading connector lays the ground for architectures where the prefill and decode nodes are not on the same physical network.&lt;/p&gt;
&lt;p&gt;The TOKENSPEED_MLA attention backend, optimized for Blackwell GPUs, rounds out the picture by accelerating the MLA computation (&lt;em&gt;Multi-Latent Attention&lt;/em&gt;, DeepSeek V3/V4’s attention architecture) on the newest hardware.&lt;/p&gt;
&lt;h2 id=&quot;multimodal-extends-the-hierarchy&quot;&gt;Multimodal extends the hierarchy&lt;/h2&gt;
&lt;p&gt;Dynamo 1.0 is not limited to text. Its multimodal &lt;strong&gt;E/P/D&lt;/strong&gt; (&lt;em&gt;Embedding / Prefill / Decode&lt;/em&gt;) pipeline adds a third cache tier: the &lt;strong&gt;embedding cache&lt;/strong&gt; for precomputed visual representations. On Qwen3-VL-30B-A3B-Instruct in FP8 on GB200, NVIDIA measures a 30% TTFT reduction and 25% higher throughput on image requests, a gain that comes entirely from the fact that the visual embedding, expensive to compute, is computed only once.&lt;/p&gt;
&lt;p&gt;Video follows the same logic. FastVideo + SGLang Diffusion generates a 5-second 1080p video in ~4.5 s on a single B200, a throughput that makes real time plausible for the first time on standard datacenter hardware.&lt;/p&gt;
&lt;h2 id=&quot;what-comes-next-bluefield-4-and-the-cache-as-network-infrastructure&quot;&gt;What comes next: BlueField-4 and the cache as network infrastructure&lt;/h2&gt;
&lt;p&gt;The Vera Rubin platform writes the KV cache into network silicon. The &lt;strong&gt;BlueField-4 DPU&lt;/strong&gt;, announced at CES in January 2026 and expected in the second half of 2026, embeds &lt;strong&gt;DOCA Memos&lt;/strong&gt;, a framework for KV cache communication and storage directly in the DPU. The G3.5 tier (ICMS) is not an SSD the DPU addresses: it is flash storage &lt;em&gt;built into the network card&lt;/em&gt;, reachable without crossing the host CPU or the main PCIe bus.&lt;/p&gt;
&lt;p&gt;There the KV cache is treated as a &lt;em&gt;network object&lt;/em&gt;, not as application data. The DPU can route it, replicate it, compress it on the data path, the same way a smart network switch manipulates packets without the CPU getting involved. This is the next frontier: the cache is no longer only &lt;em&gt;managed&lt;/em&gt; by the runtime, it is &lt;em&gt;transported&lt;/em&gt; by the network infrastructure itself.&lt;/p&gt;
&lt;p&gt;Silicon is reorganizing around the cache too, and not only at NVIDIA: Google’s TPU 8i tripled its on-chip SRAM (384 MB) precisely to house a larger KV cache closer to the compute.&lt;/p&gt;
&lt;h2 id=&quot;mlperf-v60-the-cache-in-the-official-results&quot;&gt;MLPerf v6.0: the cache in the official results&lt;/h2&gt;
&lt;p&gt;The MLPerf Inference v6.0 round (April 1, 2026) brings an indirect but significant confirmation. NVIDIA’s submissions on B200 use the &lt;strong&gt;FP8 KV cache&lt;/strong&gt; as the reference configuration, not FP16, not FP32. It is the first time a reduced cache format appears in official benchmark submissions as a &lt;em&gt;baseline&lt;/em&gt;, not as an optional optimization. AMD, for its part, uses a &lt;em&gt;pre-shuffled KV layout&lt;/em&gt;, a pre-optimized memory arrangement of the cache to reduce HBM bank conflicts. Even among the challengers, the cache has become a first-order optimization axis.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The KV cache’s trajectory in 2026 follows the one CPU cache memory traced in the 1990s: a performance byproduct turned full-fledged subsystem, with its own hierarchy, its own policies, and its own communication primitives. The next steps are visible. AMD’s &lt;em&gt;pre-shuffled KV layout&lt;/em&gt; and LMCache’s CacheGen compression point toward a convergence on standardized cache formats, a GGUF of the KV cache portable across runtimes. DOCA Memos and BlueField-4 write the cache into the DPU, which moves the management boundary from the runtime toward the network. And Dynamo’s KV-aware routing raises the next question: if the scheduler knows the state of every node’s cache, is the next step not a &lt;em&gt;market&lt;/em&gt; for the cache, where a node that has invested compute in a prefix &lt;em&gt;sells&lt;/em&gt; it to the nodes that need it, instead of letting it die?&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TurboQuant.&lt;/strong&gt; Zandieh et al. (Google Research), ICLR 2026, arXiv &lt;a href=&quot;https://arxiv.org/abs/2504.19874&quot;&gt;2504.19874&lt;/a&gt;. vLLM integration: &lt;a href=&quot;https://github.com/vllm-project/vllm/pull/38479&quot;&gt;PR #38479&lt;/a&gt; (April 15, 2026), &lt;a href=&quot;https://github.com/vllm-project/vllm/pull/40092&quot;&gt;PR #40092&lt;/a&gt; (FA3/FA4 extension). vLLM blog “First Comprehensive Study of TurboQuant” (May 11, 2026). The 6× memory reduction and 8× attention speedup are the paper’s claims, FP32 baseline; &lt;strong&gt;verified fact&lt;/strong&gt; (paper + vLLM reproduction).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RocketKV.&lt;/strong&gt; Zhang et al., ICML 2025, arXiv &lt;a href=&quot;https://arxiv.org/abs/2502.14051&quot;&gt;2502.14051&lt;/a&gt;. 3× decode speedup and 31% peak-memory reduction on H100; &lt;strong&gt;verified fact&lt;/strong&gt; (paper). TRT-LLM integration as sparse backend; &lt;strong&gt;verified fact&lt;/strong&gt; (TRT-LLM release notes).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FlashAttention 4.&lt;/strong&gt; Zadouri, Dao et al., arXiv &lt;a href=&quot;https://arxiv.org/abs/2603.05451&quot;&gt;2603.05451&lt;/a&gt;, March 2026 (&lt;em&gt;“Algorithm and Kernel Pipelining Co-Design for Asymmetric Hardware Scaling”&lt;/em&gt;). ~1,613 TFLOPS/s, 71% utilization on B200; ~1.3× cuDNN, ~2.7× Triton; &lt;strong&gt;verified fact&lt;/strong&gt; (paper). FA4 targets Blackwell (SM100+) and has a backward pass (training). MLA prefill backend of vLLM 0.20 on Blackwell; &lt;strong&gt;verified fact&lt;/strong&gt; (vLLM 0.20 release notes).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vLLM 0.20 / 0.21.&lt;/strong&gt; Release notes: &lt;a href=&quot;https://github.com/vllm-project/vllm/releases/tag/v0.20.0&quot;&gt;vLLM 0.20.0&lt;/a&gt; (April 27, 2026), &lt;a href=&quot;https://github.com/vllm-project/vllm/releases/tag/v0.21.0&quot;&gt;vLLM 0.21.0&lt;/a&gt; (May 15, 2026). FlexKV (PR #34328, Tencent TACO) shipped since v0.17.2, not introduced in v0.20; &lt;strong&gt;verified fact&lt;/strong&gt;. Smart CPU offloading (PR #35342) appeared in v0.18.0; &lt;strong&gt;verified fact&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SGLang 0.5.12: HiSparse and HiCache.&lt;/strong&gt; LMSYS blog, April 10, 2026: &lt;a href=&quot;https://www.lmsys.org/blog/2026-04-10-sglang-hisparse/&quot;&gt;HiSparse&lt;/a&gt;. 3-5× throughput at 256 concurrent requests (DSA workloads); &lt;strong&gt;verified fact&lt;/strong&gt; (LMSYS blog). HiSparse and HiCache are distinct systems, not interchangeable; &lt;strong&gt;verified fact&lt;/strong&gt; (SGLang 0.5.12 release notes).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NVIDIA Dynamo 1.0: KVBM.&lt;/strong&gt; NVIDIA Developer blog: &lt;a href=&quot;https://developer.nvidia.com/blog/nvidia-dynamo-1-production-ready/&quot;&gt;Dynamo 1.0 Production Ready&lt;/a&gt; (March 16, 2026). G1-G4 tiers, S3/Azure Blob offloading; &lt;strong&gt;verified fact&lt;/strong&gt; (official blog). Token-aware routing: 20× TTFT, 4× e2e latency; NVIDIA figures on recurring-prefix workloads, to be read as an “up to” bound (not independently reproduced).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Baseten.&lt;/strong&gt; Blog: &lt;a href=&quot;https://baseten.co/blog/how-baseten-achieved-2x-faster-inference-with-nvidia-dynamo/&quot;&gt;How Baseten Achieved 2x Faster Inference with NVIDIA Dynamo&lt;/a&gt;. 50% TTFT reduction, 61% RPS, 62% TPS on Qwen3 Coder 480B (~50k-token input). The “2×” is specifically the TTFT; &lt;strong&gt;verified fact&lt;/strong&gt; (Baseten blog, May 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TensorRT-LLM: KV Cache Connector API.&lt;/strong&gt; Introduced in TRT-LLM v1.1, not v1.3; &lt;strong&gt;verified fact&lt;/strong&gt; (v1.1 release notes). v1.3 rc12: &lt;code&gt;lmcache&lt;/code&gt;/&lt;code&gt;kvbm&lt;/code&gt; shortcuts; rc15: &lt;code&gt;cache_salt_id&lt;/code&gt;; &lt;strong&gt;verified fact&lt;/strong&gt; (GitHub changelogs).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BlueField-4 and DOCA Memos.&lt;/strong&gt; CES January 2026 announcement. ICMS (Inference Context Memory Storage) and DOCA Memos; &lt;strong&gt;verified fact&lt;/strong&gt; (NVIDIA CES 2026 press release). H2 2026 availability; &lt;strong&gt;verified fact&lt;/strong&gt; (official roadmap).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CacheBlend.&lt;/strong&gt; EuroSys 2025. 2.2-3.3× TTFT reduction on RAG workloads; &lt;strong&gt;verified fact&lt;/strong&gt; (EuroSys paper).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MLPerf v6.0.&lt;/strong&gt; April 1, 2026. FP8 KV cache in NVIDIA B200 submissions, AMD pre-shuffled KV layout; &lt;strong&gt;verified fact&lt;/strong&gt; (public MLPerf results).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multimodal Dynamo.&lt;/strong&gt; +30% TTFT, +25% throughput on Qwen3-VL-30B/GB200 (image requests); &lt;strong&gt;verified fact&lt;/strong&gt; (NVIDIA Dynamo blog). FastVideo 1080p 5s in ~4.5s on a B200; &lt;strong&gt;verified fact&lt;/strong&gt; (NVIDIA demo).&lt;/p&gt;
&lt;p&gt;This article is the English adaptation of a French original, &lt;a href=&quot;https://lecompute.fr/runtimes/kv-cache-objet-central-serving/&quot;&gt;published on May 20, 2026&lt;/a&gt;.&lt;/p&gt;</content:encoded><media:content url="https://lecompute.fr/images/photos/kv-cache-produit.webp" medium="image"/><media:description>Abstract visualization of a tiered data pipeline in a datacenter</media:description><category>KV cache</category><category>TurboQuant</category><category>KVBM</category><category>vLLM</category><category>SGLang</category><category>Dynamo</category><category>Disaggregation</category><author>redaction@lecompute.fr (Killian Pluenet)</author></item><item><title>How much VRAM do you need to run an LLM locally?</title><link>https://lecompute.fr/en/silicon/how-much-vram-for-llm/</link><guid isPermaLink="true">https://lecompute.fr/en/silicon/how-much-vram-for-llm/</guid><description>Budget ~2 GB of VRAM per billion parameters in 16-bit, half that in 8-bit, a quarter in 4-bit; then add the KV cache and ~1 GB of overhead. A quantized 7B fits on 8 GB; a 70B in 4-bit needs ~42 GB.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;Key takeaways&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;Key takeaways&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The base rule: ~2 GB of VRAM per billion parameters&lt;/strong&gt; in 16-bit, half that in 8-bit, a quarter in 4-bit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Three line items add up&lt;/strong&gt;: the weights (fixed), the KV cache (which grows with context) and ~1 GB of system overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A quantized 7B fits on 8 GB&lt;/strong&gt;; a 70B in 4-bit needs ~42 GB, either two consumer cards or one datacenter card.&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;the-2-gb-per-billion-parameters-rule&quot;&gt;The 2 GB per billion parameters rule&lt;/h2&gt;
&lt;p&gt;A LLM parameter is nothing more than a number. The only question that sets its memory cost is: how many bytes do you store it on? Models are trained and shipped in &lt;strong&gt;16-bit&lt;/strong&gt;, the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-v&quot; aria-expanded=&quot;false&quot;&gt; FP16 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-v&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP16&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;16-bit floating point&lt;/em&gt;. A 2-byte number storage format, the default precision for an LLM&apos;s weights and activations. Two variants coexist: FP16 (IEEE half precision) and BF16 (the same range as FP32, less fractional precision). It is the baseline whose footprint quantization reduces.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  format or its cousin BF16, so 2 bytes per parameter. The arithmetic is then direct: a 7-billion-parameter model weighs 7 × 2 = 14 billion bytes, or ~13 GiB of weights. That is all the famous “2 GB per billion” rule says: it is not an empirical approximation, it is the arithmetic of the format.&lt;/p&gt;
&lt;p&gt;What makes the rule useful is that it carries over to any precision. Drop the weights to 8-bit and it is one byte per parameter, half. In 4-bit it is half a byte, a quarter. &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-w&quot; aria-expanded=&quot;false&quot;&gt; Quantization &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-w&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;quantization&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Reducing the number of bits that encode each weight of a model (from 16 bits down to 8, 4, or fewer). It shrinks the memory footprint by the same factor, at the cost of a controlled accuracy loss, without changing the parameter count.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  does not change the number of parameters, only the number of bits that encode each one: it is a multiplication, not a rewrite of the model.&lt;/p&gt;
&lt;h2 id=&quot;three-line-items-not-one&quot;&gt;Three line items, not one&lt;/h2&gt;
&lt;p&gt;The VRAM consumed by a model that &lt;em&gt;serves&lt;/em&gt; is not that of the weights file alone. Three line items add up, and it is their sum that must fit on the card:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The weights&lt;/strong&gt;: fixed, given by the rule above. It is the only line item most people compute, which is why many get it wrong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The KV cache&lt;/strong&gt;: the memory of what the model has already read. It starts at zero and grows with every token generated, proportionally to the context length &lt;em&gt;and&lt;/em&gt; to the number of requests served in parallel. It is the KV cache, not the weights, that saturates VRAM first on long contexts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The overhead&lt;/strong&gt;: the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-x&quot; aria-expanded=&quot;false&quot;&gt; CUDA &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-x&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;CUDA&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Compute Unified Device Architecture&lt;/em&gt;. NVIDIA&apos;s GPU computing platform: language, compiler and libraries (cuBLAS, cuDNN). Its software ecosystem is the main lock-in against alternatives like ROCm; at runtime, its &lt;em&gt;context&lt;/em&gt; also reserves an incompressible slice of VRAM.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  context, activation buffers, allocator fragmentation. Budget ~1 GB incompressible, plus a few percent of the weight volume.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This breakdown explains the classic trap: a model that “fits” in VRAM at load time overflows during use. The weights fit; the KV cache of a long context had not been budgeted.&lt;/p&gt;
&lt;h2 id=&quot;the-table-what-the-weights-weigh&quot;&gt;The table: what the weights weigh&lt;/h2&gt;
&lt;p&gt;Before adding the rest, you need to know what the bare model costs. The table below applies the rule to the three most common sizes, in the three deployment precisions:&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;VRAM of weights by model size and precision&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Model&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;16-bit (FP16)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;8-bit (INT8)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;4-bit&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;7–8 B&lt;/th&gt;&lt;td&gt;≈ 14–16 GB&lt;/td&gt;&lt;td&gt;≈ 7–8 GB&lt;/td&gt;&lt;td&gt;≈ 4–5 GB&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;13 B&lt;/th&gt;&lt;td&gt;≈ 26 GB&lt;/td&gt;&lt;td&gt;≈ 13 GB&lt;/td&gt;&lt;td&gt;≈ 8 GB&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;70 B&lt;/th&gt;&lt;td&gt;≈ 140 GB&lt;/td&gt;&lt;td&gt;≈ 70 GB&lt;/td&gt;&lt;td&gt;≈ 42 GB&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: VRAM of weights alone, by model size and precision. 16-bit = 2 bytes/parameter; 8-bit = 1 byte (exact arithmetic). 4-bit = real Q4_K_M: ~4.8 bits/weight, or ~0.6 byte, a bit more than the theoretical quarter, because of the per-block scale factors. Values rounded to the order of magnitude.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;The 4-bit column deserves a caveat: a quantized format never drops &lt;em&gt;exactly&lt;/em&gt; to half a byte per parameter. Schemes like &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-y&quot; aria-expanded=&quot;false&quot;&gt; GGUF &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-y&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;GGUF&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;GPT-Generated Unified Format&lt;/em&gt;. llama.cpp&apos;s file format that stores the tensors, their quantization types, the vocabulary and the model metadata in a single file. Its aligned layout lets it be read with &lt;code&gt;mmap&lt;/code&gt;, so the model &lt;em&gt;starts&lt;/em&gt; in a fraction of a second.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  Q4_K_M (the quantized weight file that llama.cpp loads) store, on top of the weights, &lt;strong&gt;per-block scale factors&lt;/strong&gt; covering a handful of values: the real footprint lands around 4.8 bits per parameter, or ~0.6 byte. That is why a 70B “in 4-bit” (Q4_K_M) weighs ~42 GB and not 35: the difference is the quantization metadata, and it is not optional.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-accent&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;↯&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;A model &lt;em&gt;starts&lt;/em&gt; if its weights fit in VRAM. What you can &lt;em&gt;do&lt;/em&gt; with it depends on what is left &lt;strong&gt;after&lt;/strong&gt; the weights: that residual space is what houses the KV cache, so it sets the reachable context length and the number of simultaneous requests. Choosing a card on the sole criterion “the weights fit” amounts to sizing a server on its memory at rest.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;which-card-for-which-model&quot;&gt;Which card for which model&lt;/h2&gt;
&lt;p&gt;In practice, available VRAM comes in tiers, those of the cards on the market. Setting the tiers against the models gives a direct decision grid:&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Usable model by card VRAM&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;VRAM&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Typical cards&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;What fits comfortably&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;8 GB&lt;/th&gt;&lt;td&gt;RTX 4060, entry-level cards&lt;/td&gt;&lt;td&gt;7–8 B in 4-bit&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;12–16 GB&lt;/th&gt;&lt;td&gt;RTX 4070, RTX 4060 Ti 16G&lt;/td&gt;&lt;td&gt;13 B in 4-bit, 7–8 B in 8-bit&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;24 GB&lt;/th&gt;&lt;td&gt;RTX 3090, RTX 4090&lt;/td&gt;&lt;td&gt;32 B in 4-bit, 13 B in 8-bit&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;32 GB&lt;/th&gt;&lt;td&gt;RTX 5090&lt;/td&gt;&lt;td&gt;32 B in 4-bit (comfortable); 70 B only in ~3-bit (very tight)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;48 GB&lt;/th&gt;&lt;td&gt;RTX A6000, 2× 24 GB&lt;/td&gt;&lt;td&gt;70 B in 4-bit&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;80 GB&lt;/th&gt;&lt;td&gt;H100, A100 80G&lt;/td&gt;&lt;td&gt;70 B in 8-bit (moderate context) or 4-bit (long context)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 2: What fits comfortably per VRAM tier, leaving margin for the KV cache and overhead. &amp;#39;Comfortable&amp;#39; = weights + usual context; &amp;#39;tight&amp;#39; = weights only, short context.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;Two readings of this table are worth spelling out. First: the price jump between 24 and 80 GB does not reflect a proportional jump in raw capacity, but access to 70B models and long contexts, which is the whole stake of the RTX 5090 versus H100 matchup for local LLMs. Second: past 24 GB, the trade-off is no longer just “buy a bigger card” but “buy or rent”: a 70B served a few hours a day costs less in cloud GPU than in amortized hardware.&lt;/p&gt;
&lt;h2 id=&quot;reducing-the-vram-you-need&quot;&gt;Reducing the VRAM you need&lt;/h2&gt;
&lt;p&gt;When the model you want does not fit, three levers exist, in decreasing order of payoff.&lt;/p&gt;
&lt;p&gt;The first, and by far the most powerful, is &lt;strong&gt;weight quantization&lt;/strong&gt;. Going from 16 to 4-bit divides the main line item by four, which fits a 70B in 4-bit (~42 GB) onto two consumer cards, where its 140 GB in FP16 force several datacenter GPUs. The quality loss of a well-calibrated Q4_K_M stays small on most workloads; it is the best-established trade-off in local inference.&lt;/p&gt;
&lt;p&gt;The second is &lt;strong&gt;KV cache management&lt;/strong&gt;. Reducing the maximum context length, quantizing the cache to &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-z&quot; aria-expanded=&quot;false&quot;&gt; FP8 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-z&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP8&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;An 8-bit floating-point format. A versatile working format for inference (and training) on recent GPUs. It halves the memory footprint and bandwidth needed versus FP16, for a marginal accuracy loss on most models.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (&lt;a href=&quot;https://lecompute.fr/en/runtimes/kv-cache-objet-central-serving/&quot;&gt;one byte per value instead of two, so double the capacity&lt;/a&gt;), or enabling prefix caching frees exactly the VRAM that long contexts were claiming. On a high-context workload, this lever returns more usable memory than a card upgrade.&lt;/p&gt;
&lt;p&gt;The third is &lt;strong&gt;offloading&lt;/strong&gt;: moving part of the layers to CPU RAM, as llama.cpp allows. It unblocks running a model too big for VRAM, but at a steep price: every layer in RAM is paid for in round trips over the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-10&quot; aria-expanded=&quot;false&quot;&gt; PCIe &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-10&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;PCIe&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Peripheral Component Interconnect Express&lt;/em&gt;. The bus linking the GPU to the CPU and RAM. Its bandwidth (a few tens of GB/s) is one to two orders of magnitude below the VRAM&apos;s, which makes the host↔GPU transfer a bottleneck as soon as data is moved off the card.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  bus, and throughput collapses. It is a last-resort fix, not a sizing strategy.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The question “how much VRAM for an LLM?” has an arithmetic answer for the weights, two gigabytes per billion divided by the precision, but the real sizing question is elsewhere. It is not “does the model fit?”, it is: &lt;em&gt;what context length and what level of concurrency do I have to absorb, and how much VRAM is left to house them once the weights are down?&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;The 2 bytes per parameter in 16-bit rule is a &lt;strong&gt;fact&lt;/strong&gt;: it follows from the IEEE 754 half-precision (FP16) and bfloat16 formats, both encoded on 16 bits. The overhead of 4-bit formats (~4.8 effective bits per parameter for Q4_K_M, or ~42.5 GB for a 70B) is measured on the GGUF k-quant schemes: see the &lt;a href=&quot;https://github.com/ggml-org/llama.cpp/blob/master/tools/quantize/README.md&quot;&gt;llama.cpp quantization documentation&lt;/a&gt; and the &lt;a href=&quot;https://huggingface.co/bartowski/Llama-3.3-70B-Instruct-GGUF&quot;&gt;GGUF file sizes published on Hugging Face&lt;/a&gt;. The Table 1 sizes are &lt;em&gt;orders of magnitude&lt;/em&gt; computed from the rule; exact values vary by a few percent from one model to another (shared heads, &lt;em&gt;tied embeddings&lt;/em&gt;). The Table 2 tiers rest on the published VRAM capacities of the cards cited (RTX 4060/4070/4090/5090, RTX 3090, A6000, A100/H100); “comfortable” is an &lt;em&gt;estimate&lt;/em&gt; incorporating a usual margin for the KV cache and overhead, not a guarantee: the real context and batch decide. The sizing of the KV cache and overhead is detailed in a dedicated article. A French version of this article, &lt;a href=&quot;https://lecompute.fr/silicon/combien-de-vram-pour-un-llm/&quot;&gt;published June 1, 2026&lt;/a&gt;, is the original.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image credit.&lt;/strong&gt; Header photo: &lt;em&gt;NVIDIA GeForce GTX 780&lt;/em&gt; PCB by &lt;a href=&quot;https://www.flickr.com/people/83620044@N06&quot;&gt;GBPublic_PR&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by/2.0/&quot;&gt;CC BY 2.0&lt;/a&gt;, via &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:NVIDIA_GeForce_GTX_780_PCB-Front.jpg&quot;&gt;Wikimedia Commons&lt;/a&gt;, cropped to the die and its ring of memory chips.&lt;/p&gt;</content:encoded><media:content url="https://lecompute.fr/images/photos/vram-pcb.webp" medium="image"/><media:description>Bare NVIDIA graphics card PCB: the GPU die ringed by its GDDR memory chips</media:description><category>VRAM</category><category>Local LLM</category><category>Quantization</category><category>KV cache</category><category>Sizing</category><author>redaction@lecompute.fr (Killian Pluenet)</author></item><item><title>RTX Spark vs DGX Spark: two different chips, one 273 GB/s wall</title><link>https://lecompute.fr/en/silicon/rtx-spark-vs-dgx-spark/</link><guid isPermaLink="true">https://lecompute.fr/en/silicon/rtx-spark-vs-dgx-spark/</guid><description>The RTX Spark (codename N1X) is NVIDIA&apos;s Grace Blackwell SoC for Windows on Arm PCs, distinct from the Linux-based DGX Spark, not a rebrand. It shares its 128 GB of unified memory and its bottleneck: ~273 GB/s of LPDDR5X. The &quot;1 petaflop&quot; is sparse FP4 (~500 dense TFLOPS). It loads a 120B model that an RTX 5090 cannot, but generates more slowly on any dense model.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;Key takeaways&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;Key takeaways&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It is not a rebadged DGX Spark.&lt;/strong&gt; The RTX Spark (codename N1X) is a distinct SoC running Windows on Arm; the DGX Spark (GB10) is a Linux mini dev workstation. Same Grace Blackwell family, two machines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The bottleneck is memory, not compute&lt;/strong&gt;: 128 GB of unified LPDDR5X at ~273 GB/s, six times less than an RTX 5090. The “1 petaflop” is &lt;em&gt;sparse&lt;/em&gt; FP4, which is ~500 dense TFLOPS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It trades speed for capacity&lt;/strong&gt;: it loads a 120B model that a 5090 cannot hold, but generates more slowly on any dense model.&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;the-rtx-spark-is-not-a-rebadged-dgx-spark&quot;&gt;The RTX Spark is not a rebadged DGX Spark&lt;/h2&gt;
&lt;p&gt;The press coverage of May 31, 2026 immediately blended two products that NVIDIA sells separately, and the conflation deserves to be untangled before any technical analysis. The &lt;strong&gt;DGX Spark&lt;/strong&gt; has existed since 2025: a Linux (DGX OS) mini AI development workstation built on the &lt;strong&gt;GB10&lt;/strong&gt; superchip, aimed at the data scientist who wants a Grace Blackwell node on their desk. The &lt;strong&gt;RTX Spark&lt;/strong&gt; announced at Computex is something else: a consumer SoC, codename &lt;strong&gt;N1X&lt;/strong&gt;, that runs &lt;strong&gt;Windows on Arm&lt;/strong&gt; and targets creators, developers and gamers.&lt;/p&gt;
&lt;p&gt;The two share the philosophy (an Arm CPU and a Blackwell GPU on the same package, 128 GB of unified memory), and Jensen Huang himself described the N1X as technically very close to the GB10 in a press Q&amp;amp;A. But &lt;em&gt;close&lt;/em&gt; is not &lt;em&gt;identical&lt;/em&gt;. These are two chips, two operating systems, two form factors, two product sheets, and probably two distinct sets of networking features. Reading the RTX Spark as a DGX Spark under another name misses what NVIDIA is actually doing: entering the premium Windows-on-Arm PC market for the first time, where Qualcomm had so far been alone.&lt;/p&gt;
&lt;p&gt;What makes the analysis possible despite NVIDIA’s near-silence on detailed specs is precisely that kinship. The DGX Spark’s GB10 is documented, measured, shipping; the N1X is not yet. The whole exercise is therefore to derive from the twin what NVIDIA has not published about the N1X, flagging at every step what is official, what comes from the GB10, and what is leak or estimate.&lt;/p&gt;
&lt;h2 id=&quot;the-silicon-grace-blackwell-for-windows&quot;&gt;The silicon: Grace Blackwell for Windows&lt;/h2&gt;
&lt;p&gt;The N1X fuses an Arm CPU and a Blackwell GPU on a single package, connected by a coherent link. Each block has its own lineage.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table&quot; aria-label=&quot;RTX Spark N1X SoC architecture&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Block&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;RTX Spark (N1X)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Where the figure comes from&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;CPU&lt;/th&gt;&lt;td&gt;20 Arm cores: 10× Cortex-X925 + 10× Cortex-A725, co-designed with MediaTek&lt;/td&gt;&lt;td&gt;Leak / reporting&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPU&lt;/th&gt;&lt;td&gt;Blackwell &amp;quot;RTX&amp;quot;, 6,144 CUDA cores (≈ RTX 5070)&lt;/td&gt;&lt;td&gt;Official (press release)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Tensor / RT Cores&lt;/th&gt;&lt;td&gt;5th-gen Tensor Cores (FP4/NVFP4), 4th-gen RT Cores&lt;/td&gt;&lt;td&gt;Official + GB10&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Compute capability&lt;/th&gt;&lt;td&gt;SM121 (≠ SM120 on the RTX 5090, ≠ SM100 datacenter)&lt;/td&gt;&lt;td&gt;GB10 (Backend.AI)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Process&lt;/th&gt;&lt;td&gt;TSMC 3 nm (&amp;quot;3nm-class&amp;quot;)&lt;/td&gt;&lt;td&gt;Official&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Memory&lt;/th&gt;&lt;td&gt;up to 128 GB unified LPDDR5X, 256-bit bus, ~273 GB/s&lt;/td&gt;&lt;td&gt;Official (128 GB) + GB10 (273 GB/s)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;CPU↔GPU link&lt;/th&gt;&lt;td&gt;NVLink-C2C, ~600 GB/s aggregate&lt;/td&gt;&lt;td&gt;Hot Chips 2025&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;OS&lt;/th&gt;&lt;td&gt;Windows on Arm&lt;/td&gt;&lt;td&gt;Official&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;TDP&lt;/th&gt;&lt;td&gt;~45–110 W depending on the OEM (power supplies up to 140 W)&lt;/td&gt;&lt;td&gt;Unofficial&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: RTX Spark (N1X) architecture, best-reported as of June 5, 2026. GPU and memory figures are derived from the twin GB10; the core split comes from heise/c&amp;#39;t reporting and leaks, not from an official NVIDIA spec sheet.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;The &lt;strong&gt;CPU&lt;/strong&gt; is a 20-core Arm design (ten Cortex-X925 performance cores, ten Cortex-A725 efficiency cores), co-designed with MediaTek, which supplies the CPU chiplets. The X925 are the same cores as in the Dimensity 9400 smartphone chip: NVIDIA did not design a custom server CPU here, the way it did with the Olympus core of its Vera CPU. It assembled a platform out of leading-edge Arm IP.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;GPU&lt;/strong&gt; is an “RTX” Blackwell with 6,144 &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-11&quot; aria-expanded=&quot;false&quot;&gt; CUDA &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-11&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;CUDA&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Compute Unified Device Architecture&lt;/em&gt;. NVIDIA&apos;s GPU computing platform: language, compiler and libraries (cuBLAS, cuDNN). Its software ecosystem is the main lock-in against alternatives like ROCm; at runtime, its &lt;em&gt;context&lt;/em&gt; also reserves an incompressible slice of VRAM.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  cores (the same count as the desktop GeForce RTX 5070), with 5th-generation &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-12&quot; aria-expanded=&quot;false&quot;&gt; Tensor Cores &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-12&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;Tensor Cores&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Hardware units specialized in low-precision matrix multiplication, introduced by NVIDIA with Volta (2017). Each generation adds supported formats: FP16 → FP8 (Hopper) → FP6/FP4 (Blackwell). They run the bulk of the inference compute.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  that wire &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-13&quot; aria-expanded=&quot;false&quot;&gt; FP4 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-13&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP4&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;A 4-bit floating-point format, the 2026 frontier of high-throughput inference. Four times less memory than FP16, but a very narrow dynamic range: it only holds up with fine-grained scaling through block formats (MXFP4, NVFP4).&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  into silicon and 4th-generation RT Cores for rendering. On the twin GB10, NVIDIA configures this GPU as 48 &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-14&quot; aria-expanded=&quot;false&quot;&gt; SMs &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-14&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;SM&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Streaming Multiprocessor&lt;/em&gt;. An independent compute block of an NVIDIA GPU, holding its own execution units, registers, shared memory and Tensor Cores. An H100 SXM5 has 132 of them. SM occupancy is the key metric for how saturated a GPU is.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  / 192 Tensor Cores. This GPU is what justifies the “RTX” badge and the gaming promise.&lt;/p&gt;
&lt;p&gt;One engineering nuance matters to anyone writing kernels. The Spark’s Blackwell is not the datacenter Blackwell. The GB10 (and therefore the N1X) is &lt;em&gt;compute capability&lt;/em&gt; &lt;strong&gt;SM121&lt;/strong&gt;, distinct from the SM120 of an RTX 5090 and the SM100 of a B200. It supports FP4/FP6/FP8 and 5th-gen Tensor Cores, but its Tensor Core programming model is closer to Ampere’s &lt;code&gt;mma.sync&lt;/code&gt; than to the &lt;code&gt;tcgen05&lt;/code&gt; instructions of datacenter Blackwell: it lacks TMEM and 2-SM cooperative MMAs. Concretely, a low-level CUDA kernel developer targeting all three now maintains &lt;em&gt;three&lt;/em&gt; code paths (Hopper, datacenter Blackwell, consumer Blackwell) instead of two. For users of runtimes like vLLM, TensorRT-LLM or llama.cpp, the abstraction layer absorbs the difference; for whoever writes the kernel, it is real.&lt;/p&gt;
&lt;h2 id=&quot;three-numbers-people-conflate&quot;&gt;Three numbers people conflate&lt;/h2&gt;
&lt;p&gt;This is where mainstream coverage slips the most, and where precision matters. Three values circulate around the RTX Spark, expressed in the same unit, and the press swaps them freely even though they describe three different things.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table&quot; aria-label=&quot;RTX Spark bandwidths: memory, bus, NVLink-C2C&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Metric&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Value&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;What it is&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;LPDDR5X memory bandwidth&lt;/th&gt;&lt;td&gt;~273 GB/s&lt;/td&gt;&lt;td&gt;Unified system memory throughput (the decode wall)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Memory bus&lt;/th&gt;&lt;td&gt;256-bit (N1X) / 128-bit (N1)&lt;/td&gt;&lt;td&gt;Channel width, not a throughput&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;NVLink-C2C&lt;/th&gt;&lt;td&gt;~600 GB/s aggregate&lt;/td&gt;&lt;td&gt;Coherent CPU↔GPU link, not memory&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 2: Three bandwidths not to confuse. The only one that sets generation speed is the first.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;The &lt;strong&gt;memory bandwidth&lt;/strong&gt; is ~273 GB/s. NVIDIA has published no official figure for the N1X; this one comes word for word from the GB10 datasheet: &lt;em&gt;“Memory Bandwidth: 273 GB/s · Memory Channels: 16 channels (256 bit) LPDDR5X 8533”&lt;/em&gt;. The arithmetic checks out: a 256-bit bus moves 32 bytes per transfer, and at 8,533 MT/s that gives 32 × 8,533 ≈ 273 GB/s. The “up to 300 GB/s” seen elsewhere is a rounding of a 9.4 Gbps clock mentioned at Hot Chips 2025; the shipping, measured value is 273.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;~600 GB/s&lt;/strong&gt; figure is something else: the aggregate bandwidth of &lt;strong&gt;NVLink-C2C&lt;/strong&gt;, the coherent link that connects the CPU die to the GPU die inside the package. NVIDIA described it at Hot Chips 2025 as offering &lt;em&gt;“5x the bandwidth of PCIe Gen 5”&lt;/em&gt;: it is an internal interconnect, not a throughput to system memory. Confusing it with memory bandwidth is like confusing the width of a datacenter node’s &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-15&quot; aria-expanded=&quot;false&quot;&gt; NVLink &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-15&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;NVLink&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;NVIDIA&apos;s proprietary GPU-to-GPU interconnect. NVLink 5 (Blackwell) reaches 1.8 TB/s per GPU; NVLink 6 (Rubin) doubles that to 3.6 TB/s. It lets several cards share their memory and behave almost like a single accelerator.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  with the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-16&quot; aria-expanded=&quot;false&quot;&gt; HBM &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-16&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;HBM&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;High Bandwidth Memory&lt;/em&gt;. Memory stacked in layers and soldered right next to the GPU, with several TB/s of bandwidth (versus ~50 GB/s for DDR5). Indispensable beyond a certain model size.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  throughput of a card: two different stages of the transport hierarchy.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-warn&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;⚠&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;The reading rule: when an RTX Spark spec sheet says “600 GB/s”, check whether it means the memory or the NVLink-C2C. To predict LLM generation throughput, &lt;strong&gt;only the first number (~273 GB/s) matters&lt;/strong&gt;. The second describes how fast CPU and GPU share memory, not how fast the GPU re-reads the model’s weights.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;p&gt;This memory is &lt;strong&gt;unified and coherent&lt;/strong&gt;: the GPU has no dedicated VRAM, it reaches the LPDDR5X through memory controllers that live in the MediaTek CPU die, transparently over NVLink-C2C. It is the same architectural principle as Apple Silicon, or as a Jetson Thor at the embedded end of the spectrum: a single pool that CPU and GPU share dynamically, with no explicit copies. The benefit is capacity: 128 GB visible to the GPU, where a consumer card tops out at 32. The cost is throughput: LPDDR5X is mobile memory, not GDDR7 and not HBM.&lt;/p&gt;
&lt;h2 id=&quot;the-1-petaflop-decoded&quot;&gt;The “1 petaflop”, decoded&lt;/h2&gt;
&lt;p&gt;The announcement’s headline number (&lt;em&gt;1 petaflop&lt;/em&gt;) is accurate and misleading at the same time, and it needs unfolding like any raw figure. NVIDIA’s official footnote is explicit: &lt;em&gt;“Theoretical FP4 TOPS using the sparsity feature”&lt;/em&gt;. Three words do all the work there.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Theoretical&lt;/em&gt;: it is a peak of the compute units, not a sustained throughput on a real workload. &lt;em&gt;FP4&lt;/em&gt;: it is the densest format of the 5th-gen Tensor Cores, four bits per value, not FP16. &lt;em&gt;Sparsity&lt;/em&gt;: it is structured 2:4 &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-17&quot; aria-expanded=&quot;false&quot;&gt; sparsity &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-17&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;sparsity&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;A compression technique that forces a fraction of the weights to zero so they need not be computed. &lt;em&gt;Structured 2:4&lt;/em&gt; sparsity (two zero weights out of every four) is exploited by the Tensor Cores to double the theoretical throughput, but few inference workloads actually benefit. Distinct from quantization, which reduces the number of bits per weight.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , where the hardware skips the half of the weights that were zeroed out in advance, doubling the advertised rate without computing more. Remove the sparsity and you get ~500 &lt;em&gt;dense&lt;/em&gt; FP4 TFLOPS, half the shop-window figure. Move up to FP16 or FP32, formats in which plenty of training and serving still happens, and the throughput falls back to that of a mid-range GPU, RTX 5060/5070 class.&lt;/p&gt;
&lt;p&gt;That FP4 peak is not useless: it serves &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-18&quot; aria-expanded=&quot;false&quot;&gt; prefill &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-18&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;prefill&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The opening phase of LLM inference: every token of the prompt is processed at once. High arithmetic intensity, so the GPU saturates its Tensor Cores. The opposite of the &lt;em&gt;decode&lt;/em&gt; phase that follows.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , the phase where the model processes the whole prompt at once and saturates the Tensor Cores. But a real inference service is almost always dominated by the next phase, &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-19&quot; aria-expanded=&quot;false&quot;&gt; decode &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-19&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;decode&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The autoregressive generation phase of an LLM: one token is produced at a time, re-reading the whole KV cache. Arithmetic intensity is very low, so the GPU spends most of its time waiting on memory. A real inference service is almost always dominated by decode.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , and that one does not read the FLOPS spec sheet.&lt;/p&gt;
&lt;h2 id=&quot;what-273-gbs-means-for-inference&quot;&gt;What ~273 GB/s means for inference&lt;/h2&gt;
&lt;p&gt;Here is the passage that decides everything else. LLM token generation is &lt;em&gt;autoregressive&lt;/em&gt;: every new token re-reads the entirety of the model’s weights plus all the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1a&quot; aria-expanded=&quot;false&quot;&gt; KV cache &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1a&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;KV cache&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The stored &lt;em&gt;key&lt;/em&gt; and &lt;em&gt;value&lt;/em&gt; vectors an LLM has already computed for every token it has processed. It avoids recomputing attention over the whole history, at the cost of a memory footprint that grows with the context length.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  accumulated so far. For a few billion useful operations, the GPU traverses tens of gigabytes of memory. The workload is &lt;em&gt;memory-bound&lt;/em&gt;: the silicon spends most of its time waiting on memory, and bandwidth, not FLOPS, sets the ceiling.&lt;/p&gt;
&lt;p&gt;Run the arithmetic on a dense case. A 70-billion-parameter model served in &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1b&quot; aria-expanded=&quot;false&quot;&gt; FP8 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1b&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP8&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;An 8-bit floating-point format. A versatile working format for inference (and training) on recent GPUs. It halves the memory footprint and bandwidth needed versus FP16, for a marginal accuracy loss on most models.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  weighs ~70 GB of weights, which must be re-read for every token. The physical floor of generation is a division: 70 GB ÷ 273 GB/s ≈ 256 ms per token, which is &lt;strong&gt;~4 tokens per second&lt;/strong&gt; at the memory ceiling, for a single sequence. An RTX 5090, with its ~1,792 GB/s of GDDR7, would read the same weights in ~39 ms, but it &lt;em&gt;cannot&lt;/em&gt; hold a 70B FP8 model: its 32 GB overflow. That is the Spark’s whole paradox: it &lt;em&gt;loads&lt;/em&gt; the model the 5090 refuses, then serves it at whatever pace its mobile memory allows. The same mobile memory that provides the 128 GB imposes the 273 GB/s; you do not get one without the other.&lt;/p&gt;
&lt;p&gt;The escape hatch is not a trick, it is a model type. &lt;strong&gt;MoE&lt;/strong&gt; architectures (&lt;em&gt;Mixture of Experts&lt;/em&gt;, where a router activates only a few experts per token out of all those available) break the equation. On a GPT-OSS 120B, only ~4 experts out of 128 fire per token: the full model (~65 GB of weights, ~80 GB loaded) must &lt;em&gt;reside&lt;/em&gt; in memory, but each token only &lt;em&gt;reads&lt;/em&gt; a fraction of it. The memory cost per token collapses, and decode throughput becomes usable again even though the model weighs 80 GB. That is precisely what the 128 GB are for: load the whole model, then pay in bandwidth only for the active experts. For a dense model, the same capacity merely &lt;em&gt;houses&lt;/em&gt; the model; it does not make it run fast.&lt;/p&gt;
&lt;p&gt;The only measured numbers available come from the &lt;strong&gt;DGX Spark&lt;/strong&gt; under Linux, to be used as a proxy while keeping in mind that the N1X’s Windows-on-Arm performance may differ (drivers were reported immature in early 2026). The pattern there is unambiguous.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Prefill and decode throughputs measured on DGX Spark, compared with RTX 5090&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Workload&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Prefill (tps)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Decode (tps)&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-OSS 20B (MXFP4, Ollama) on DGX Spark&lt;/th&gt;&lt;td&gt;≈ 2,053&lt;/td&gt;&lt;td&gt;≈ 50&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-OSS 20B on RTX 5090 (ref.)&lt;/th&gt;&lt;td&gt;≈ 8,519&lt;/td&gt;&lt;td&gt;≈ 205&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-OSS 120B (MXFP4, llama.cpp) on DGX Spark&lt;/th&gt;&lt;td&gt;≈ 1,723&lt;/td&gt;&lt;td&gt;≈ 38&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;GPT-OSS 120B on a trio of RTX 3090s (ref.)&lt;/th&gt;&lt;td&gt;≈ 1,642&lt;/td&gt;&lt;td&gt;≈ 124&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 3: Measured throughputs on the DGX Spark (GB10, Linux), indicative for the N1X. Prefill = prompt processing (compute-bound); decode = generation (memory-bound). Sources: LMSYS (Oct 13, 2025) and community benchmarks.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;The DGX Spark holds its own at prefill: it matches a trio of RTX 3090s on GPT-OSS 120B, because prefill is compute-bound and the FP4 peak earns its keep there. But on decode it generates three to four times more slowly than GDDR-equipped cards: the 5090 and the 3090 trio have the bandwidth, the Spark has the capacity. LMSYS closes its review with a sentence that sums up the product: &lt;em&gt;“the Spark’s unified LPDDR5x memory bandwidth is the main limiting factor”&lt;/em&gt;. The RTX Spark inherits that memory, and that limit, unchanged.&lt;/p&gt;
&lt;p&gt;One software lever remains, specific to the NVIDIA ecosystem: the FP4 formats. NVFP4 (NVIDIA’s variant with 16-value blocks and two-level scaling, finer-grained than the standard MXFP4) is wired into the Spark’s Tensor Cores, but it is only exploited in hardware through TensorRT-LLM or NIM; a &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1c&quot; aria-expanded=&quot;false&quot;&gt; GGUF &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1c&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;GGUF&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;GPT-Generated Unified Format&lt;/em&gt;. llama.cpp&apos;s file format that stores the tensors, their quantization types, the vocabulary and the model metadata in a single file. Its aligned layout lets it be read with &lt;code&gt;mmap&lt;/code&gt;, so the model &lt;em&gt;starts&lt;/em&gt; in a fraction of a second.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  file in llama.cpp uses its own scheme. Aggressively quantizing the weights reduces the bytes read per token, so it nudges the memory-bound ceiling upward, but it does not remove it. &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1d&quot; aria-expanded=&quot;false&quot;&gt; Continuous batching &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1d&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;continuous batching&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Iteration-level scheduling: adding and removing requests from the batch at every generation step, instead of waiting for a whole batch to finish. Formalized by Orca (OSDI 2022), popularized by vLLM. It multiplies an inference server&apos;s throughput by 2 to 4× under heavy concurrency.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  helps too: serving several concurrent requests amortizes the weight re-read across the whole batch. The counter to the 273 GB/s wall comes down to three moves (MoE models, NVFP4/MXFP4 quantization, batching): none of them changes the memory, all of them route around its slowness.&lt;/p&gt;
&lt;h2 id=&quot;the-rtx-spark-against-the-rest-of-the-market&quot;&gt;The RTX Spark against the rest of the market&lt;/h2&gt;
&lt;p&gt;The right question is not “is this a good GPU” but “what capacity/bandwidth trade-off is this”. Set against the machines a buyer actually compares, the Spark occupies a precise slot.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Comparison of RTX Spark, DGX Spark, Mac Studio M3 Ultra, RTX 5090 and RTX PRO 6000&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;System&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Memory&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Memory BW&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Indicative price&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;RTX Spark (N1X)&lt;/th&gt;&lt;td&gt;128 GB unified LPDDR5X&lt;/td&gt;&lt;td&gt;~273 GB/s&lt;/td&gt;&lt;td&gt;≈ $2,899 (est.)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;DGX Spark (GB10)&lt;/th&gt;&lt;td&gt;128 GB unified LPDDR5X&lt;/td&gt;&lt;td&gt;~273 GB/s&lt;/td&gt;&lt;td&gt;$3,999 → $4,699&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Mac Studio M3 Ultra&lt;/th&gt;&lt;td&gt;96 GB unified (256/512 GB pulled)&lt;/td&gt;&lt;td&gt;~819 GB/s&lt;/td&gt;&lt;td&gt;from $5,299&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;RTX 5090 (desktop)&lt;/th&gt;&lt;td&gt;32 GB GDDR7&lt;/td&gt;&lt;td&gt;~1,792 GB/s&lt;/td&gt;&lt;td&gt;$1,999 MSRP, $2,999+ street&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;RTX PRO 6000 Blackwell&lt;/th&gt;&lt;td&gt;96 GB GDDR7 ECC&lt;/td&gt;&lt;td&gt;~1,792 GB/s&lt;/td&gt;&lt;td&gt;$13,250 (official list)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 4: RTX Spark against competing machines. Prices in US dollars: MSRPs or analyst estimates (see Sources and method). FP4 values are vendor sparse peaks.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Against the DGX Spark&lt;/strong&gt;, it is the same capacity/bandwidth couple. The differences are the OS (Windows vs Linux), the form factor (consumer PC vs mini workstation), the lower estimated price, and probably the absence of the ConnectX-7 clustering that the DGX Spark exposes to pair two units. If what you need is a Linux AI dev node, the DGX Spark remains the product; if it is a premium Windows PC that can also do local inference, that is the RTX Spark.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Against the Mac Studio M3 Ultra&lt;/strong&gt;, the trade-off shifted mid-shortage. Apple offers three times the bandwidth (~819 vs ~273 GB/s), hence visibly faster token generation, but pulled the 256 and 512 GB options from its catalog in spring 2026 and raised the base to $5,299 for a 96 GB cap: the capacity argument switched sides. But no hardware FP4 and no CUDA. The Spark wins at prefill and on the CUDA/TensorRT ecosystem; the Mac wins at decode and on capacity. A community trick combines both in a &lt;a href=&quot;https://lecompute.fr/en/runtimes/disaggregation-prefill-decode-production/&quot;&gt;disaggregated serving setup&lt;/a&gt; (DGX Spark for prefill, Mac Studio for decode) for a ~2.8× gain over the Mac alone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Against an RTX 5090 or an RTX PRO 6000&lt;/strong&gt;, it is exactly the trade-off that already structures the consumer-versus-datacenter matchup. The GDDR7 cards have ~6.5× the Spark’s bandwidth, hence ~4× its generation throughput on models that fit in their VRAM. But 32 GB (5090) or 96 GB (6000 Pro) cap the model size. The Spark trades raw speed for capacity: it &lt;em&gt;loads&lt;/em&gt; a 120B or a 70B that a 5090 cannot, at the price of a lower token rate. To know precisely &lt;a href=&quot;https://lecompute.fr/en/silicon/how-much-vram-for-llm/&quot;&gt;what fits in each memory tier&lt;/a&gt;, you apply the full formula: weights, KV cache and overhead. The head-to-head with the 5090, verdicts by model size included, is in &lt;a href=&quot;https://lecompute.fr/en/silicon/dgx-spark-vs-rtx-5090/&quot;&gt;DGX Spark vs RTX 5090&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;price-availability-and-what-remains-unconfirmed&quot;&gt;Price, availability, and what remains unconfirmed&lt;/h2&gt;
&lt;p&gt;No price is official. The most-cited estimates come from a Morgan Stanley report relayed on June 2, 2026: N1X-based AI PCs would need to sell around &lt;strong&gt;$2,899&lt;/strong&gt; (base configurations), N1 models around &lt;strong&gt;$1,799&lt;/strong&gt;, figures that concern entry configurations (16–32 GB of memory, 512 GB to 1 TB of SSD). A 128 GB, multi-terabyte machine will cost substantially more. PCWorld cites OEM sources around $2,500 (N1X) and $2,000 (N1). The explicit target is the MacBook Pro M5 Pro, at around $2,100.&lt;/p&gt;
&lt;p&gt;Availability is announced for &lt;strong&gt;fall 2026&lt;/strong&gt;, with a slippage risk tied to the Windows-on-Arm drivers reported immature in early 2026. Every laptop shown at Computex was a non-functional mockup; only NVIDIA’s internal systems were running. More than 30 laptops and ~10 desktops are expected from ASUS, Dell, HP, Lenovo, Microsoft Surface and MSI, with Acer and Gigabyte to follow.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-info&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;The core split (10+10 for the full N1X, 9+9 variants, and the N1 at 8+4), the 256/128-bit buses and the TDP ranges come from heise/c’t reporting and VideoCardz leaks, not from an official NVIDIA spec sheet. Treat them as &lt;em&gt;best-reported&lt;/em&gt;, not &lt;em&gt;confirmed&lt;/em&gt;. Likewise, every tokens/s figure quoted here was measured on the DGX Spark under Linux, not on the N1X under Windows.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;who-it-is-for-and-what-for&quot;&gt;Who it is for, and what for&lt;/h2&gt;
&lt;p&gt;The decision reads off the shape of your workload, not off the spec sheet.&lt;/p&gt;
&lt;p&gt;To &lt;strong&gt;load a large model locally&lt;/strong&gt; (a 100 to 120B MoE that no consumer card can hold), the RTX Spark is exactly the tool: 128 GB of unified memory, and a low memory cost per token if the model is MoE. For &lt;strong&gt;a Windows creator PC&lt;/strong&gt; that must also handle inference and CUDA-accelerated rendering, it is the first Windows-on-Arm machine to offer 100% of the NVIDIA stack. To &lt;strong&gt;generate fast on a dense model&lt;/strong&gt; (a 70B served at quality at several dozen tokens/s), it is the wrong machine: its mobile memory rules that out by construction, and a GDDR card or a higher-bandwidth Mac Studio stays ahead. For &lt;strong&gt;a pure Linux AI dev node&lt;/strong&gt;, the twin DGX Spark, or renting a cloud GPU by the hour, remains the rational option.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The RTX Spark does not move the fundamental limit it shares with the DGX Spark: same memory type, same bus, same ~273 GB/s. What it brings is &lt;em&gt;capacity&lt;/em&gt; and the energy efficiency of an SoC, not token throughput on dense models. The real question is therefore not “how many petaflops” but the one every inference machine purchase poses: &lt;em&gt;how much bandwidth to re-read your weights on every token, and how much memory to house them once loaded?&lt;/em&gt; The Spark answers the second loudly and the first modestly.&lt;/p&gt;
&lt;p&gt;What will move that wall is not a better GPU, it is better memory. NVIDIA has publicly committed to three generations: Grace Blackwell today, then a Vera Rubin pairing on LPDDR6, then Rosa Feynman. LPDDR6 is precisely the lever that would lift a consumer SoC past 273 GB/s, and the same phase-specialization logic is already reshaping datacenter inference. The 2026 RTX Spark is the first step: a bet on unified capacity, while mobile bandwidth catches up.&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;This article draws on an internal research file closed on June 5, 2026, the RTX Spark having been announced on May 31 / June 1, 2026 at Computex/GTC Taipei. Since NVIDIA has published almost no detailed official N1X specs, part of the figures are derived from the twin GB10 (DGX Spark) or from leaks; each label below says which is which. A French version of this article, &lt;a href=&quot;https://lecompute.fr/silicon/rtx-spark-vs-dgx-spark/&quot;&gt;published on June 5, 2026&lt;/a&gt;, is the original.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verified facts.&lt;/strong&gt; The NVIDIA newsroom release gives the GPU at 6,144 CUDA cores, the “1 petaflop”, the 128 GB of unified memory, the 20-core CPU and Windows on Arm as the OS. The ~273 GB/s memory bandwidth, the 256-bit bus (16 LPDDR5X-8533 channels) and the SM121 &lt;em&gt;compute capability&lt;/em&gt; are &lt;strong&gt;facts verified on the twin GB10&lt;/strong&gt; (DGX Spark datasheet; Backend.AI analysis, February 2026), not on the N1X: NVIDIA has published &lt;em&gt;no&lt;/em&gt; bandwidth figure for the RTX Spark. The ~600 GB/s aggregate NVLink-C2C and the “5x PCIe Gen 5” ratio come from the Hot Chips 2025 presentation. The line “Theoretical FP4 TOPS using the sparsity feature” is NVIDIA’s official footnote; the ~500 dense FP4 TFLOPS follows from it (2:4 sparsity = ×2).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Credible estimates.&lt;/strong&gt; The prices ($2,899 / $1,799 for N1X / N1) are &lt;strong&gt;Morgan Stanley analyst estimates&lt;/strong&gt; relayed by Max Weinbach on June 2, 2026, unconfirmed by NVIDIA, against a DRAM/NAND shortage that has already pushed the DGX Spark from $3,999 to $4,699. PCWorld’s OEM sources (≈ $2,500 / $2,000) converge to the same order of magnitude. The core split (10+10, 9+9, 8+4), the 256/128-bit buses and the 45 to 110 W TDP are &lt;strong&gt;best-reported&lt;/strong&gt; (heise/c’t, VideoCardz leaks), not official.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Measurement proxy.&lt;/strong&gt; All tokens/s figures (GPT-OSS 20B and 120B, prefill/decode) are measured on the &lt;strong&gt;DGX Spark under Linux&lt;/strong&gt;, not on the RTX Spark under Windows: &lt;a href=&quot;https://lmsys.org/blog/&quot;&gt;LMSYS review of October 13, 2025&lt;/a&gt;, community benchmarks (Benjamin Marie, &lt;em&gt;The Kaitchup&lt;/em&gt;; the &lt;a href=&quot;https://github.com/ggml-org/llama.cpp/discussions/16578&quot;&gt;llama.cpp #16578&lt;/a&gt; discussion). The N1X’s Windows-on-Arm performance may differ (drivers reported immature). The RTX 5090 / RTX 3090 references are third-party measurements on the same workloads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stated assumptions.&lt;/strong&gt; The ~4 tokens/s physical floor on a dense 70B FP8 model (70 GB ÷ 273 GB/s) is a &lt;em&gt;memory-ceiling&lt;/em&gt; calculation for a single sequence, not an application throughput. The MoE reasoning (bytes read per token reduced by expert routing) is a mechanism, not a measurement on the N1X. The LPDDR6/Vera Rubin/Feynman projection rests on NVIDIA’s public roadmap, with no detailed timeline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Primary sources.&lt;/strong&gt; NVIDIA Newsroom release (Computex 2026 announcement); &lt;a href=&quot;https://www.nvidia.com/en-us/products/workstations/dgx-spark/&quot;&gt;DGX Spark / GB10 datasheet&lt;/a&gt;; &lt;a href=&quot;https://developer.nvidia.com/blog/introducing-nvfp4-for-efficient-and-accurate-low-precision-inference/&quot;&gt;NVIDIA Developer Blog: Introducing NVFP4&lt;/a&gt;; TensorRT-LLM documentation (DGX Spark target); &lt;a href=&quot;https://www.apple.com/mac-studio/specs/&quot;&gt;Apple Mac Studio M3 Ultra specs&lt;/a&gt; for the 819 GB/s.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prices.&lt;/strong&gt; All prices in this article are in US dollars: manufacturer MSRPs or analyst estimates as reported by the cited sources. The RTX 5090 street price ($2,999+ on the US secondary market against a $1,999 MSRP) and the RTX PRO 6000 official list price ($13,250 in July 2026, up from ~$8,565 at launch) reflect the DRAM shortage inflating the whole memory-heavy segment; the same shortage made Apple pull the Mac Studio’s 256/512 GB options (spring 2026, Apple store + press coverage) and raise the M3 Ultra base to $5,299. European street prices differ (VAT, local margins); the French edition quotes euro conversions at an indicative 1 USD = 0.92 EUR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image credit.&lt;/strong&gt; Header photo: &lt;em&gt;NVIDIA DGX Spark&lt;/em&gt; by &lt;a href=&quot;https://commons.wikimedia.org/wiki/User:dllu&quot;&gt;Daniel Lu&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;CC BY-SA 4.0&lt;/a&gt;, via &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Nvidia_DGX_Spark_oblique_view_dllu.jpg&quot;&gt;Wikimedia Commons&lt;/a&gt;.&lt;/p&gt;</content:encoded><atom:updated>2026-07-04T00:00:00.000Z</atom:updated><media:content url="https://lecompute.fr/images/photos/rtx-spark.webp" medium="image"/><media:description>The NVIDIA DGX Spark mini PC, a gold chassis with a metal-foam front panel, seen at a three-quarter angle on a wooden desk</media:description><category>RTX Spark</category><category>DGX Spark</category><category>Grace Blackwell</category><category>Unified memory</category><category>LPDDR5X</category><category>Local LLM</category><author>redaction@lecompute.fr (Killian Pluenet)</author></item><item><title>TorchTPU, XLA, JAX: how Google attacks NVIDIA&apos;s software lock-in</title><link>https://lecompute.fr/en/silicon/torchtpu-jax-xla-vllm-tpu/</link><guid isPermaLink="true">https://lecompute.fr/en/silicon/torchtpu-jax-xla-vllm-tpu/</guid><description>The real 2026 battle is not a FLOPS war between chips: it is the cost of migrating off CUDA. With TorchTPU (preview), Google makes the TPU &apos;behave like PyTorch&apos;. The pivot of the whole stack is not the chip, it is the XLA compiler.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;aside class=&quot;article-tldr&quot; aria-label=&quot;Key takeaways&quot;&gt; &lt;p class=&quot;article-tldr__label&quot;&gt;Key takeaways&lt;/p&gt; &lt;div class=&quot;article-tldr__body&quot;&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The real pivot is not the TPU, it is the compiler.&lt;/strong&gt; XLA is the layer that lets JAX &lt;em&gt;and&lt;/em&gt; PyTorch target the same silicon. TorchTPU is a “native PyTorch” path that goes through XLA, but leads with &lt;em&gt;eager&lt;/em&gt; where the old bridge imposed a lazy model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The 2026 battle is software, not hardware.&lt;/strong&gt; NVIDIA still holds ~81% of the datacenter AI chip market; its lock-in is called CUDA, and it is the cost of migrating off CUDA, not a FLOPS deficit, that Google attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TorchTPU is in preview, not GA.&lt;/strong&gt; Announced officially on April 7, 2026, it arrives with the 8th generation of TPU, split into two chips (8t training, 8i inference). Open question: will its maturity be enough to migrate the “PyTorch-first” shops?&lt;/li&gt;
&lt;/ul&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;why-the-real-2026-battle-is-not-a-flops-war&quot;&gt;Why the real 2026 battle is not a FLOPS war&lt;/h2&gt;
&lt;p&gt;AI compute gets endless commentary, but its software layers rarely get explained. People talk about the chips (Ironwood, Blackwell, Trainium) as if the silicon were self-sufficient. The playing field has shifted: what decides an accelerator’s adoption today is no longer its peak &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1e&quot; aria-expanded=&quot;false&quot;&gt; FLOPS &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1e&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FLOPS&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Floating-Point Operations Per Second&lt;/em&gt;. A raw throughput metric for floating-point compute, in tera or peta. For LLM inference it is rarely the limiting factor: memory bandwidth almost always comes first.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , it is the friction a developer hits getting their existing PyTorch code to run on it.&lt;/p&gt;
&lt;p&gt;This friction has a name and an address. The default path of AI development runs through &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1f&quot; aria-expanded=&quot;false&quot;&gt; CUDA &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1f&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;CUDA&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Compute Unified Device Architecture&lt;/em&gt;. NVIDIA&apos;s GPU computing platform: language, compiler and libraries (cuBLAS, cuDNN). Its software ecosystem is the main lock-in against alternatives like ROCm; at runtime, its &lt;em&gt;context&lt;/em&gt; also reserves an incompressible slice of VRAM.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; : the code stack, the kernels, the tooling, the muscle memory of debugging at 2 a.m., all of it native to NVIDIA. It is a software moat, not a hardware one, and it is exactly what Google set out to dismantle. The 2026 shift is that Google stopped answering only with silicon and started answering with a stack: a framework developers love (PyTorch), a compiler that acts as the pivot (&lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1g&quot; aria-expanded=&quot;false&quot;&gt; XLA &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1g&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;XLA&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Accelerated Linear Algebra&lt;/em&gt;. An ML compiler that takes the &lt;em&gt;whole&lt;/em&gt; computation graph instead of running each operation one after another, and rewrites it for the target (TPU, GPU, CPU). Its signature transform is &lt;em&gt;fusion&lt;/em&gt;: merging several operations into a single kernel so intermediate values are never written back to memory.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; ), a serving engine (vLLM) and, at the top, a project named TorchTPU whose ambition fits in one line from the team: &lt;em&gt;“it should feel like PyTorch”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This piece takes the problem by that friction. It speaks to two readers at once: the ML engineer who wants the detail (execution model, compilation path, install commands, benchmark numbers) and the reader who wants the whole picture: who depends on whom, and why it reshuffles the deck against NVIDIA. Each brick is explained first for what it &lt;em&gt;does&lt;/em&gt;, then for the place it holds in the edifice. We start with the keystone, because nothing stands without it: the compiler.&lt;/p&gt;
&lt;h2 id=&quot;xla-the-compiler-that-pivots-the-whole-edifice&quot;&gt;XLA: the compiler that pivots the whole edifice&lt;/h2&gt;
&lt;p&gt;XLA (Accelerated Linear Algebra) is a compiler for machine learning. To see what it changes, you have to see how a framework runs &lt;em&gt;without&lt;/em&gt; it. PyTorch, by default, handles each operation one after another: a kernel for the add, a kernel for the multiply, a kernel for the reduction. Each kernel reads its inputs from memory, computes, and writes its result back to memory, where the next kernel will read it again. On an accelerator, these memory round-trips cost far more than the computation itself.&lt;/p&gt;
&lt;p&gt;XLA does not receive an operation: it receives the &lt;strong&gt;whole compute graph&lt;/strong&gt;, and rewrites it for the target machine. Its signature transformation is called &lt;em&gt;fusion&lt;/em&gt;. On the canonical example from the OpenXLA documentation (a computation of the form &lt;code&gt;reduce_sum(x + y * z)&lt;/code&gt;), three separate kernels launch without compilation: one for the multiply, one for the add, one for the reduction. XLA melts them into a &lt;em&gt;single&lt;/em&gt; kernel, and that is the detail that decides everything: it never writes the intermediate values (&lt;code&gt;y*z&lt;/code&gt;, then &lt;code&gt;x + y*z&lt;/code&gt;) to memory. It makes them “stream” straight from one step to the next, keeping them in the GPU registers. The documentation is explicit and worth quoting word for word:&lt;/p&gt;
&lt;aside class=&quot;article-callout is-accent&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;↯&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;&lt;em&gt;“Fusion is XLA’s single most important optimization.”&lt;/em&gt; The reason fits in one sentence from the same page: memory bandwidth is an accelerator’s scarcest resource, so removing memory operations is one of the best ways to speed things up. Most ML workloads are &lt;em&gt;memory-bound&lt;/em&gt;: limited by memory, not by raw compute.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;p&gt;XLA’s operation comes down to a chain. A framework hands it a graph expressed in &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1h&quot; aria-expanded=&quot;false&quot;&gt; StableHLO &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1h&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;StableHLO&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;High Level Operations&lt;/em&gt;, in its stable, versioned form. An operation set that acts as the portability layer between frameworks (PyTorch, JAX, TensorFlow) and the XLA compiler. One StableHLO graph can target several architectures.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , the versioned operation set that serves as the portability layer between frameworks and the compiler. XLA first applies target-independent optimization passes (common-subexpression elimination, fusion, partitioning for parallelism), then hardware-specific passes, and finally emits a binary optimized for TPU, GPU or CPU. It is this independence from the target that makes XLA &lt;em&gt;portable&lt;/em&gt;: the same StableHLO graph can target several architectures.&lt;/p&gt;
&lt;p&gt;Hold onto this point, it is the key to the whole piece. XLA was originally developed inside TensorFlow; it is now the heart of the open-source OpenXLA project, and it supports three framework frontends: TensorFlow, JAX and PyTorch. The &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1i&quot; aria-expanded=&quot;false&quot;&gt; TPU &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1i&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;TPU&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Tensor Processing Unit&lt;/em&gt;. Google&apos;s ML acceleration ASIC. Not a lone chip but a network: chips linked directly by the &lt;em&gt;ICI&lt;/em&gt; interconnect in a torus topology, each combining &lt;em&gt;TensorCores&lt;/em&gt; (dense matmul) and &lt;em&gt;SparseCores&lt;/em&gt; (embeddings, collectives). It only knows how to talk to the XLA compiler.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (Tensor Processing Unit), for its part, only knows how to speak to XLA. So anything that wants to run on a TPU, JAX code as much as PyTorch code, ends up, one way or another, going through XLA. The question “how do you run PyTorch on a TPU” is therefore, at bottom, the question “how do you cleanly bring a PyTorch graph to XLA”. The rest of the piece describes the competing paths to get there.&lt;/p&gt;
&lt;h2 id=&quot;jax-the-framework-the-tpu-was-designed-for&quot;&gt;JAX: the framework the TPU was designed for&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1j&quot; aria-expanded=&quot;false&quot;&gt; JAX &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1j&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;JAX&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Google&apos;s functional ML framework. It composes four transforms (&lt;code&gt;grad&lt;/code&gt;, &lt;code&gt;jit&lt;/code&gt;, &lt;code&gt;vmap&lt;/code&gt;, &lt;code&gt;pmap&lt;/code&gt;) over NumPy-like code, using XLA for compilation and SPMD parallelism. Co-designed with the TPU.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  is Google’s ML framework. For the non-specialist reader, it is “NumPy on steroids”: the same array API, augmented with automatic differentiation and compilation for GPU/TPU. For the engineer, it is a functional-programming library whose strength is the composability of four transformations: &lt;code&gt;grad&lt;/code&gt; computes a function’s gradient (the building block of all learning); &lt;code&gt;jit&lt;/code&gt; compiles the function through XLA; &lt;code&gt;vmap&lt;/code&gt; automatically vectorizes a function written for a single vector so it operates on a batch, with no Python loop; &lt;code&gt;pmap&lt;/code&gt; parallelizes it across several accelerators under an &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1k&quot; aria-expanded=&quot;false&quot;&gt; SPMD &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1k&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;SPMD&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Single Program, Multiple Data&lt;/em&gt;. A parallelism model where every rank runs &lt;em&gt;exactly&lt;/em&gt; the same program over different shards of data. It is the model the TPU is built for; its divergent counterpart, &lt;em&gt;MPMD&lt;/em&gt; (one rank doing extra logging, say), used to break the optimization.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  model (Single Program, Multiple Data).&lt;/p&gt;
&lt;p&gt;The internal mechanism is worth unfolding, because it explains why JAX and the TPU get along so well. JAX does not “see” your values: it &lt;em&gt;traces&lt;/em&gt; them. When you apply &lt;code&gt;jit&lt;/code&gt;, JAX runs your function with symbolic values (&lt;em&gt;tracers&lt;/em&gt;) to reconstruct the sequence of operations as a &lt;strong&gt;jaxpr&lt;/strong&gt;, its functional intermediate representation, which it then lowers to StableHLO for XLA. The Python code &lt;em&gt;describes&lt;/em&gt; a computation rather than executing it step by step. It is a deliberately lazy model, and it is exactly the kind of whole graph XLA knows how to optimize.&lt;/p&gt;
&lt;p&gt;Why have TPUs historically been optimized for JAX? Because the two were tuned together. Reuters’ December 2025 reporting says it plainly: for years, TPUs were tuned first for JAX, Google’s favored internal framework, which created a &lt;em&gt;“bottleneck”&lt;/em&gt; (the term is in quotes in the article) for customers already built on PyTorch. The production JAX stack rests on &lt;strong&gt;Pathways&lt;/strong&gt;, the orchestration layer that lets a &lt;em&gt;single&lt;/em&gt; JAX client drive computations across thousands of chips, beyond the boundaries of one TPU pod. It is the system that trains Gemini internally, and labs like Anthropic, xAI and Apple use JAX as one of their foundation-model building tools.&lt;/p&gt;
&lt;p&gt;The problem, from Google’s vantage point, is the other side of the scale. PyTorch dominates research and, increasingly, production. According to the Linux Foundation’s &lt;em&gt;Shaping the Future of Generative AI&lt;/em&gt; report, relayed by the PyTorch Foundation, PyTorch leads model training with &lt;strong&gt;63% adoption&lt;/strong&gt;; the same foundation puts the share of AI research implementations that rest on it at &lt;strong&gt;over 70%&lt;/strong&gt;. It is this imbalance that Google is trying to neutralize: silicon cut for JAX, facing a code world that writes PyTorch.&lt;/p&gt;
&lt;h2 id=&quot;pytorchxla-the-bridge-that-already-exists-today&quot;&gt;PyTorch/XLA: the bridge that already exists today&lt;/h2&gt;
&lt;p&gt;Before TorchTPU, running PyTorch on a TPU went (and still goes) through &lt;strong&gt;PyTorch/XLA&lt;/strong&gt;, the &lt;code&gt;torch_xla&lt;/code&gt; package. It is a public product, installable right now (&lt;code&gt;pip install torch==2.8.0 &amp;#39;torch_xla[tpu]==2.8.0&amp;#39;&lt;/code&gt;), unlike TorchTPU. Understanding its execution model is understanding the step TorchTPU wants to remove.&lt;/p&gt;
&lt;p&gt;PyTorch/XLA rests on &lt;strong&gt;lazy tensors&lt;/strong&gt;. When you write &lt;code&gt;z = x + y&lt;/code&gt; on an XLA tensor, nothing runs: the operation is recorded into a symbolic graph. The actual computation happens only at a synchronization point, typically the call to &lt;code&gt;xm.mark_step()&lt;/code&gt;, which “cuts” the accumulated graph, compiles it and runs it on the TPU. HuggingFace’s documentation captures the contrast well:&lt;/p&gt;
&lt;aside class=&quot;article-callout is-info&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;&lt;em&gt;“CPU and CUDA tensors launch operations immediately or eagerly. XLA tensors, on the other hand, are lazy.”&lt;/em&gt; They accumulate until the next &lt;code&gt;mark_step&lt;/code&gt;, which is where the compile-and-run actually happens.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;div class=&quot;article-code-card&quot;&gt; &lt;div class=&quot;code-toolbar&quot;&gt; &lt;span class=&quot;code-toolbar__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt; &lt;span class=&quot;code-toolbar__lang&quot;&gt;torch_xla&lt;/span&gt; &lt;span class=&quot;code-toolbar__file&quot;&gt;lazy_tensor.py&lt;/span&gt; &lt;span class=&quot;code-toolbar__badge&quot;&gt;Python&lt;/span&gt; &lt;/div&gt; &lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; torch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; torch_xla.core.xla_model &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; xm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;device &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; xm.xla_device()              &lt;/span&gt;&lt;span&gt;# an XLA device, not CUDA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; torch.randn(&lt;/span&gt;&lt;span&gt;2048&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2048&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;device)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; step &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt; x                         &lt;/span&gt;&lt;span&gt;# nothing runs: the op is recorded&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; torch.tanh(y)                 &lt;/span&gt;&lt;span&gt;# the graph grows, still nothing on the TPU&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    xm.mark_step()                    &lt;/span&gt;&lt;span&gt;# here: cut the graph, compile, execute&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# A print(x) BEFORE mark_step would force a device -&amp;gt; host materialization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# and break tracing: the model&amp;#39;s ergonomic Achilles&amp;#39; heel.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; &lt;/div&gt;
&lt;p&gt;It is powerful (letting XLA see a whole graph lets it fuse and optimize), but it is also the Achilles’ heel. Any operation that demands a concrete value (a &lt;code&gt;print&lt;/code&gt;, a log, a checkpoint) forces a materialization and a device→host transfer that breaks tracing. And if the &lt;em&gt;shapes&lt;/em&gt; change at every iteration (dynamic shapes), XLA recompiles a new graph each time: a performance sinkhole, avoided by &lt;em&gt;padding&lt;/em&gt; to fixed shapes. The historical frustration shows through in a researcher’s comment on Hacker News about training research models on the old bridge: &lt;em&gt;“a mess of undocumented behavior and bugs (silently hanging after 8 hours of training!)”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Two version details, because they matter in production. Since the &lt;strong&gt;2.7 release&lt;/strong&gt; (official post dated May 2025, the repository’s C++11 notice carrying the date of March 18, 2025), &lt;strong&gt;C++11 ABI&lt;/strong&gt; builds became the default; Google no longer ships pre-C++11 ABI wheels, and these new wheels improve &lt;em&gt;tracing&lt;/em&gt; performance: on a Mixtral 8x7B on v5p-256, the repository documents 39% MFU versus 33% before. Support spans Python 3.9 to 3.13, with 2.9 nightlies available.&lt;/p&gt;
&lt;p&gt;The point that matters most for what follows is written in black and white in the official &lt;code&gt;pytorch/xla&lt;/code&gt; repository: &lt;em&gt;“Once TorchTPU is public it will replace PyTorch/XLA.”&lt;/em&gt; PyTorch/XLA is not a competitor to TorchTPU; it is its predecessor, destined to be replaced.&lt;/p&gt;
&lt;h2 id=&quot;torchtpu-making-the-tpu-behave-like-pytorch&quot;&gt;TorchTPU: making the TPU “behave like PyTorch”&lt;/h2&gt;
&lt;p&gt;Here is the heart of the piece. &lt;strong&gt;TorchTPU&lt;/strong&gt; is Google’s new engineering stack for running PyTorch &lt;em&gt;natively&lt;/em&gt; on a TPU. Its history is short: an internal project first revealed by Reuters on December 17, 2025 (the codename had leaked), then detailed officially on April 7, 2026 on the Google Developers Blog. The guiding principle is that a developer should be able to take an existing PyTorch script, switch its device to &lt;code&gt;tpu&lt;/code&gt;, and launch the training loop without touching a line of business logic.&lt;/p&gt;
&lt;blockquote class=&quot;article-quote&quot;&gt; &lt;div class=&quot;article-quote__body&quot;&gt; &lt;p&gt;The TPU should be an obvious choice for any PyTorch user to target. […] Getting access through PyTorch has always been difficult. We are changing that this year.&lt;/p&gt; &lt;/div&gt; &lt;cite&gt;Lee Howes, Engineering Lead, TorchTPU, Google (remarks reported by The Stack)&lt;/cite&gt; &lt;/blockquote&gt;
&lt;h3 id=&quot;eager-first-the-philosophical-break&quot;&gt;Eager First: the philosophical break&lt;/h3&gt;
&lt;p&gt;Where PyTorch/XLA imposed the lazy model, TorchTPU establishes an &lt;strong&gt;“Eager First”&lt;/strong&gt; philosophy. Technically, it builds on PyTorch’s &lt;strong&gt;PrivateUse1&lt;/strong&gt; interface, the extension point meant for wiring in a new device type. The integration goes deep enough that you handle real &lt;code&gt;torch.Tensor&lt;/code&gt; objects that happen to live on a TPU. The team’s phrasing: &lt;em&gt;“No subclasses, no wrappers; just ordinary, familiar PyTorch Tensors on a TPU.”&lt;/em&gt; No subclass, no wrapper: an ordinary PyTorch tensor that responds like one on CUDA.&lt;/p&gt;
&lt;div class=&quot;article-code-card&quot;&gt; &lt;div class=&quot;code-toolbar&quot;&gt; &lt;span class=&quot;code-toolbar__dots&quot; aria-hidden=&quot;true&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt; &lt;span class=&quot;code-toolbar__lang&quot;&gt;torch_tpu&lt;/span&gt; &lt;span class=&quot;code-toolbar__file&quot;&gt;eager_first.py&lt;/span&gt; &lt;span class=&quot;code-toolbar__badge&quot;&gt;Python&lt;/span&gt; &lt;/div&gt; &lt;pre class=&quot;astro-code github-dark&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; torch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# TorchTPU: PrivateUse1 interface, real torch.Tensor living on the TPU&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; torch.randn(&lt;/span&gt;&lt;span&gt;2048&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2048&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;tpu&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt; x                 &lt;/span&gt;&lt;span&gt;# eager execution, like on CUDA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(y.sum())            &lt;/span&gt;&lt;span&gt;# the value is available, no mark_step&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Custom kernel: decorate a JAX function, TorchTPU wires it via Pallas&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;@torch_tpu.pallas.custom_jax_kernel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; fused_softmax&lt;/span&gt;&lt;span&gt;(x):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; &lt;/div&gt;
&lt;p&gt;Three &lt;em&gt;eager&lt;/em&gt; modes cover the development cycle. &lt;strong&gt;Debug Eager&lt;/strong&gt; runs one operation at a time, with CPU synchronization after each step. Slow, but precious for hunting &lt;em&gt;shape mismatches&lt;/em&gt;, NaNs, &lt;em&gt;out-of-memory&lt;/em&gt; crashes. &lt;strong&gt;Strict Eager&lt;/strong&gt; dispatches op by op but asynchronously, to reproduce the default PyTorch experience. &lt;strong&gt;Fused Eager&lt;/strong&gt; is the breakthrough: by automatic reflection over the operation stream, TorchTPU fuses steps on the fly into denser blocks before handing them to the TPU. The claimed gain is &lt;em&gt;“a 50% to 100+% performance increase over Strict Eager, with no setup required”&lt;/em&gt;, no user configuration. The three modes share a &lt;em&gt;Compilation Cache&lt;/em&gt;, single-host or persistent multi-host.&lt;/p&gt;
&lt;h3 id=&quot;static-compilation-dynamo--stablehlo--xla&quot;&gt;Static compilation: Dynamo → StableHLO → XLA&lt;/h3&gt;
&lt;p&gt;For peak performance, TorchTPU integrates natively with &lt;code&gt;torch.compile&lt;/code&gt;, and the path it takes is a deliberate architectural choice. FX graph capture through &lt;strong&gt;Torch Dynamo&lt;/strong&gt;, then, instead of routing to Torch Inductor (PyTorch’s default backend), use of &lt;strong&gt;XLA&lt;/strong&gt; as the backend compiler, through a translation layer that maps PyTorch operators directly to StableHLO. Google’s justification: XLA is &lt;em&gt;“rigorously battle-tested for TPU topologies”&lt;/em&gt; and knows how to natively optimize the overlap between dense compute and collective communications across the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1l&quot; aria-expanded=&quot;false&quot;&gt; ICI &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1l&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;ICI&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;&lt;em&gt;Inter-Chip Interconnect&lt;/em&gt;. The proprietary link that connects TPU chips directly to one another, in a 2D/3D torus topology, without going through the host network. It is what makes a pod of thousands of TPUs behave like a single machine, Google&apos;s equivalent of NVLink.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (Inter-Chip Interconnect). In other words, Google is not reinventing a TPU backend for PyTorch: it is rewiring PyTorch onto the TPU backend matured over years for JAX.&lt;/p&gt;
&lt;h3 id=&quot;the-mpmd-problem-pytorchxla-could-not-solve&quot;&gt;The MPMD problem PyTorch/XLA could not solve&lt;/h3&gt;
&lt;p&gt;The real architectural progress hides here, and it is less visible than the &lt;em&gt;eager&lt;/em&gt; numbers. PyTorch/XLA supported only &lt;strong&gt;pure SPMD&lt;/strong&gt;: all ranks run exactly the same code. But real PyTorch code diverges slightly from one rank to another: rank 0 typically does a bit of extra logging. This divergence, &lt;strong&gt;MPMD&lt;/strong&gt; (&lt;em&gt;Multiple Program, Multiple Data&lt;/em&gt;), broke TPU optimization, which is cut for SPMD. TorchTPU is architected to support these divergent executions by isolating the communication primitives where necessary, &lt;em&gt;“at minimal cost”&lt;/em&gt;, while preserving the global view XLA needs. The concrete consequence: PyTorch’s DDP, FSDPv2 and DTensor distributed APIs work &lt;em&gt;“out of the box”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Portability does not erase the hardware, and Google gives the classic trap as an example. Many models hard-code an attention head dimension at &lt;strong&gt;64&lt;/strong&gt;, whereas current TPUs hit their peak matrix-multiply (&lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1m&quot; aria-expanded=&quot;false&quot;&gt; matmul &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1m&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;matmul&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Matrix multiplication, the dominant operation in a neural network&apos;s layers. When we say a GPU is &lt;em&gt;computing&lt;/em&gt;, it is doing matmul about 90% of the time.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; ) efficiency at &lt;strong&gt;128 or 256&lt;/strong&gt;. TorchTPU recommends a staged flow: first get a correct execution, then refactor suboptimal architectures or inject custom kernels. The fact that your code runs does not mean it runs &lt;em&gt;well&lt;/em&gt;: hardware awareness stays your job.&lt;/p&gt;
&lt;aside class=&quot;article-callout is-warn&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;⚠&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;TorchTPU is in &lt;strong&gt;preview&lt;/strong&gt;, not general availability. The gain figures (Fused Eager +50 to 100%) are vendor numbers, not verified by an independent benchmark. The announced 2026 roadmap: a public GitHub repository with reproducible tutorials, integration of the Helion DSL for custom kernels, first-class support for dynamic shapes through &lt;code&gt;torch.compile&lt;/code&gt; (&lt;em&gt;bounded dynamism&lt;/em&gt; in XLA, to avoid recompilations), native multi-queue support, deep integrations with vLLM and TorchTitan, and linear &lt;em&gt;scaling&lt;/em&gt; validated up to the size of a full Pod. Until these milestones are cleared, treat TorchTPU as a credible promise, not a production foundation.&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;h2 id=&quot;vllm-the-serving-layer&quot;&gt;vLLM: the serving layer&lt;/h2&gt;
&lt;p&gt;Everything above concerns training and general execution. &lt;strong&gt;vLLM&lt;/strong&gt; occupies a distinct layer: production LLM inference &lt;em&gt;serving&lt;/em&gt;. Born in 2023 at UC Berkeley’s Sky Computing Lab, it is the reference open-source inference engine, and its coupling with the TPU stack became, in late 2025, a signal about the real direction Google is taking.&lt;/p&gt;
&lt;p&gt;Its central innovation, &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1n&quot; aria-expanded=&quot;false&quot;&gt; PagedAttention &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1n&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;PagedAttention&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;An algorithm introduced by vLLM that manages the KV cache like an operating system&apos;s virtual memory: in pages, without requiring a contiguous block per request. It eliminates internal and external fragmentation, letting a server handle 2 to 4× more concurrent requests on the same VRAM.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; , attacks the memory waste of serving. To generate text, a transformer re-reads at every token the &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1o&quot; aria-expanded=&quot;false&quot;&gt; KV cache &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1o&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;KV cache&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;The stored &lt;em&gt;key&lt;/em&gt; and &lt;em&gt;value&lt;/em&gt; vectors an LLM has already computed for every token it has processed. It avoids recomputing attention over the whole history, at the cost of a memory footprint that grows with the context length.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (the stored key and value tensors for the whole sequence); naive serving pre-reserves a contiguous block sized for the maximum length, and wastes most of the reserved VRAM. PagedAttention applies the idea of an operating system’s virtual memory: the KV cache is split into blocks (16 tokens per block by default, configurable), addressed through a table and stored non-contiguously. Fragmentation collapses. The broader story, offloading and routing included, is in our piece on &lt;a href=&quot;https://lecompute.fr/en/runtimes/kv-cache-objet-central-serving/&quot;&gt;the KV cache as the central object of serving&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Second pillar: &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1p&quot; aria-expanded=&quot;false&quot;&gt; continuous batching &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1p&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;continuous batching&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Iteration-level scheduling: adding and removing requests from the batch at every generation step, instead of waiting for a whole batch to finish. Formalized by Orca (OSDI 2022), popularized by vLLM. It multiplies an inference server&apos;s throughput by 2 to 4× under heavy concurrency.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt; . Instead of waiting for the whole batch to finish, vLLM works at the granularity of the iteration: as soon as a request completes, its KV blocks are freed and the next request in the queue is inserted at the following decode step. The accelerator stays saturated. The concept comes from Orca (OSDI 2022); the most-cited figure (&lt;em&gt;up to 23×&lt;/em&gt; throughput) is Anyscale’s measurement against HuggingFace’s naive static batching, not a general gain, and it has to be presented as such.&lt;/p&gt;
&lt;p&gt;This is where it connects to the thesis of this piece. vLLM is multi-backend: NVIDIA, AMD, Intel (CPU, GPU, Gaudi), IBM Power, AWS Trainium/Inferentia via plugin, and TPU. In October 2025, vLLM TPU was rebuilt around &lt;strong&gt;&lt;code&gt;tpu-inference&lt;/code&gt;&lt;/strong&gt;, a hardware plugin that unifies JAX &lt;em&gt;and&lt;/em&gt; PyTorch under a &lt;strong&gt;single JAX→XLA lowering path&lt;/strong&gt;. A model defined in PyTorch runs on a TPU with no code change, lowered through &lt;strong&gt;Torchax&lt;/strong&gt; (a PyTorch→JAX bridge, now in its own repository &lt;code&gt;google/torchax&lt;/code&gt;), while JAX is natively supported. The vLLM blog states it unambiguously:&lt;/p&gt;
&lt;aside class=&quot;article-callout is-info&quot;&gt; &lt;span class=&quot;article-callout__icon&quot; aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt; &lt;div class=&quot;article-callout__body&quot;&gt; &lt;p&gt;&lt;em&gt;“vLLM TPU will now default to running the TPU-optimized model code in tpu-inference if it exists, otherwise, it will fallback to the PyTorch model code from vLLM upstream (lowered using JAX via Torchax).”&lt;/em&gt;&lt;/p&gt; &lt;/div&gt; &lt;/aside&gt;
&lt;p&gt;The documented gains are real: on the previous path (PyTorch/XLA), the team had obtained +3.6× throughput on Llama 3.1-8B on v6e-1 and +2.1× on Llama 3.1-70B on v6e-8; the &lt;code&gt;tpu-inference&lt;/code&gt; rebuild reaches &lt;em&gt;“nearly 5x”&lt;/em&gt; the February 2025 prototype. A limit documented by Google Cloud frames the usage: on GKE, vLLM on TPU is &lt;strong&gt;single-host&lt;/strong&gt;; multi-host is not supported, which for 400B+ models points to &lt;strong&gt;JetStream&lt;/strong&gt;, Google’s multi-host TPU inference engine.&lt;/p&gt;
&lt;p&gt;Note the detail that resonates with the rest of the piece. Even to serve &lt;em&gt;PyTorch&lt;/em&gt;, the real path on a TPU runs through JAX→XLA via Torchax. On the serving side, the destination is not “PyTorch on TPU”: it is always XLA, reached through JAX.&lt;/p&gt;
&lt;h2 id=&quot;how-it-all-fits-together-the-mental-model&quot;&gt;How it all fits together: the mental model&lt;/h2&gt;
&lt;p&gt;Here is the edifice, top to bottom. This is the diagram to keep in mind.&lt;/p&gt;
&lt;figure class=&quot;article-flow-figure&quot;&gt; &lt;div class=&quot;article-flow&quot; aria-label=&quot;TPU software stack: PyTorch and JAX frameworks, XLA / StableHLO compiler, TPU silicon linked by ICI&quot;&gt; &lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;Frameworks&lt;/strong&gt; &lt;span&gt;PyTorch · JAX&lt;/span&gt; &lt;small&gt;what you write&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;Compiler&lt;/strong&gt; &lt;span&gt;XLA / StableHLO&lt;/span&gt; &lt;small&gt;the pivot&lt;/small&gt; &lt;/div&gt;&lt;div class=&quot;flow-node&quot;&gt; &lt;strong&gt;Silicon&lt;/strong&gt; &lt;span&gt;TPU · ICI (torus)&lt;/span&gt; &lt;small&gt;where it runs&lt;/small&gt; &lt;/div&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Figure: The stack reads top to bottom: two competing frameworks at the top, a single compiler that reconciles them in the middle, a silicon that speaks only to that compiler at the bottom.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Layer 1: the frameworks&lt;/strong&gt;, what the developer writes. Two worlds: PyTorch (imperative, eager, dominant) and JAX (functional, lazy, co-designed with the TPU). Competitors at the API level, they converge on the same compiler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 2: the compiler&lt;/strong&gt;, the pivot. XLA, fed with StableHLO. JAX gets there through &lt;code&gt;jit&lt;/code&gt;/jaxpr. PyTorch gets there through three historically distinct paths: the old PyTorch/XLA bridge (lazy tensors, &lt;code&gt;mark_step&lt;/code&gt;); the new TorchTPU (eager-first, &lt;code&gt;torch.compile&lt;/code&gt; → Dynamo → StableHLO → XLA, MPMD); for serving, Torchax (PyTorch → JAX → XLA) inside vLLM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 3: the silicon&lt;/strong&gt;, where it runs. The TPU, which is not an isolated chip but a network: chips linked by the ICI in a 2D/3D torus topology, each combining &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1q&quot; aria-expanded=&quot;false&quot;&gt; TensorCores &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1q&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;Tensor Cores&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;Hardware units specialized in low-precision matrix multiplication, introduced by NVIDIA with Volta (2017). Each generation adds supported formats: FP16 → FP8 (Hopper) → FP6/FP4 (Blackwell). They run the bulk of the inference compute.&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  (dense matmul) and SparseCores (embeddings, gather/scatter, collectives). XLA can also target GPU and CPU: that is where portability comes from.&lt;/p&gt;
&lt;p&gt;Around them, the satellite tools, by tier of need. &lt;strong&gt;TorchTitan&lt;/strong&gt;: the native PyTorch platform for large-scale training (composable parallelism through DTensor and DeviceMesh), a TorchTPU integration target for 2026. &lt;strong&gt;Pathways&lt;/strong&gt;: the JAX-side orchestrator that extends an XLA computation beyond a pod. &lt;strong&gt;Helion&lt;/strong&gt;: a “PyTorch with tiles” Python DSL that automates kernel autotuning. &lt;strong&gt;Pallas / Mosaic&lt;/strong&gt;: the JAX custom-kernel language, which lowers through Mosaic onto the TPU, the way to extract the last drop of performance where XLA cannot yet optimize. &lt;strong&gt;MaxText / JetStream&lt;/strong&gt;: the reference JAX implementation for LLM training, and the multi-host TPU inference engine.&lt;/p&gt;
&lt;p&gt;The line to remember: &lt;strong&gt;PyTorch and JAX fight over the developer; XLA reconciles them on the silicon; vLLM serves the result.&lt;/strong&gt; TorchTPU is the project that turns “PyTorch can technically run on a TPU” into “PyTorch runs on a TPU like it does at home”.&lt;/p&gt;
&lt;h2 id=&quot;nvidias-real-moat-is-not-the-silicon&quot;&gt;NVIDIA’s real moat is not the silicon&lt;/h2&gt;
&lt;p&gt;NVIDIA does not dominate because its chips work some inaccessible magic. They are excellent, full stop. It dominates because the default path runs through CUDA, and that path holds a decade’s head start: tooling, optimized kernels, network effect. Over &lt;strong&gt;6.5 million developers&lt;/strong&gt; use NVIDIA software (figure released in August 2025), more than 6 million of them on CUDA. It is a software &lt;em&gt;moat&lt;/em&gt;, and it is what TorchTPU targets, not the peak FLOPS.&lt;/p&gt;
&lt;p&gt;The numbers behind the moat are eloquent. In fiscal 2026 (closed at the end of January 2026), NVIDIA posted roughly &lt;strong&gt;$194 billion&lt;/strong&gt; in datacenter revenue, up 68% year over year, about 90% of its total revenue (~$216 billion), with a non-GAAP gross margin on the order of 71% for the year (75% in Q4 alone). Networking revenue alone (NVLink, AI Ethernet) is near &lt;strong&gt;$30 billion&lt;/strong&gt;. On market share, IDC puts NVIDIA around &lt;strong&gt;81% of datacenter AI chips&lt;/strong&gt;, its closest rival, AMD, holding only about 10%: an analyst figure, to be treated as such. As for revenue visibility, it was Jensen Huang, at GTC in October 2025, who quantified it (&lt;em&gt;“the first technology company in history to have visibility into half a trillion dollars”&lt;/em&gt;) at roughly &lt;strong&gt;$500 billion&lt;/strong&gt; of Blackwell + Rubin from early 2025 to the end of 2026, a figure since raised to some &lt;strong&gt;$1 trillion&lt;/strong&gt; through the end of 2027.&lt;/p&gt;
&lt;p&gt;It is this wall that the software friction sustains, and that is why the fight plays out at the compiler level, not the die. For the exact nature of this lock-in and how it compares to ROCm, see our piece on CUDA vs ROCm in 2026.&lt;/p&gt;
&lt;h2 id=&quot;googles-answer-portability-as-a-weapon&quot;&gt;Google’s answer: portability as a weapon&lt;/h2&gt;
&lt;p&gt;Google’s idea is to turn the AI chip into a commodity by removing the switching cost. Three levers, all already engaged in 2026.&lt;/p&gt;
&lt;p&gt;The first: make the TPU “PyTorch-friendly” with TorchTPU, so PyTorch shops no longer have to rewrite their stack in JAX. The second: ally with Meta, PyTorch’s creator and keeper. Reuters reports that Google works closely with Meta and is considering open-sourcing parts of TorchTPU to speed adoption. Meta, one of NVIDIA’s biggest customers (~$72 billion in 2025 capex), has a direct interest in lowering its costs and strengthening its negotiating leverage; the reporting indicates it explored renting TPU capacity as early as 2026 and deploying them in its own datacenters from 2027. The third: multi-stack portability (JAX, PyTorch/XLA, ONNX) that lets the same model train on NVIDIA, Google or AMD with minimal changes.&lt;/p&gt;
&lt;p&gt;The business context is explosive. Sundar Pichai stated, on Alphabet’s Q3 2025 earnings, that Google Cloud had signed more deals worth over $1 billion in the first nine months of 2025 than in the previous two years combined. And above all &lt;strong&gt;Anthropic&lt;/strong&gt;: the October 23, 2025 agreement grants access to &lt;em&gt;“up to one million TPU chips… well over a gigawatt of capacity coming online in 2026”&lt;/em&gt;, valued at &lt;em&gt;“tens of billions of dollars”&lt;/em&gt;. Thomas Kurian, CEO of Google Cloud, justified it this way:&lt;/p&gt;
&lt;blockquote class=&quot;article-quote&quot;&gt; &lt;div class=&quot;article-quote__body&quot;&gt; &lt;p&gt;Anthropic’s choice to significantly expand its usage of TPUs reflects the strong price-performance and efficiency its teams have seen with TPUs for several years.&lt;/p&gt; &lt;/div&gt; &lt;cite&gt;Thomas Kurian, CEO, Google Cloud&lt;/cite&gt; &lt;/blockquote&gt;
&lt;p&gt;The agreement was extended in April 2026: a Google investment in Anthropic of up to &lt;strong&gt;$40 billion&lt;/strong&gt; (announced April 24, “up to”), and a next-generation capacity agreement through Broadcom: 3.5 GW per Broadcom’s regulatory filing, “up to 5 GW” in Google’s phrasing. A new development, finally: Google started selling TPUs for delivery to a restricted circle of customers in their own datacenters, where historically you could only rent them on Google Cloud.&lt;/p&gt;
&lt;h2 id=&quot;two-chips-for-two-jobs-the-8th-generation&quot;&gt;Two chips for two jobs: the 8th generation&lt;/h2&gt;
&lt;p&gt;At Google Cloud Next, on April 22, 2026, Google unveiled an 8th-generation TPU &lt;strong&gt;split for the first time into two distinct chips&lt;/strong&gt;. (Not to be confused: Ironwood, the 7th generation, had reached general availability back in late 2025; it is the 8t/8i &lt;em&gt;split&lt;/em&gt; that is the April 2026 announcement.) The rationale: training and inference have diverged into two workload profiles, and a single silicon serves both poorly at once, the same &lt;em&gt;phase-specialization&lt;/em&gt; logic seen on the NVIDIA side with Vera Rubin’s disaggregation.&lt;/p&gt;
&lt;figure class=&quot;article-table-figure&quot;&gt; &lt;div class=&quot;article-table-wrap&quot;&gt; &lt;table class=&quot;article-spec-table has-accent-col&quot; aria-label=&quot;Comparison of Ironwood, TPU 8t and TPU 8i&quot;&gt; &lt;thead&gt; &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Criterion&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Ironwood (TPU v7)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;TPU 8t (training)&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;TPU 8i (inference)&lt;/th&gt;&lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;HBM per chip&lt;/th&gt;&lt;td&gt;192 GB&lt;/td&gt;&lt;td&gt;216 GB&lt;/td&gt;&lt;td&gt;288 GB&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;On-chip SRAM&lt;/th&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;td&gt;128 MB&lt;/td&gt;&lt;td&gt;384 MB (×3)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Peak compute / chip&lt;/th&gt;&lt;td&gt;4,614 TFLOPS&lt;/td&gt;&lt;td&gt;12.6 PFLOPS FP4&lt;/td&gt;&lt;td&gt;10.1 PFLOPS FP4&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;HBM bandwidth&lt;/th&gt;&lt;td&gt;7.37 TB/s&lt;/td&gt;&lt;td&gt;6.53 TB/s&lt;/td&gt;&lt;td&gt;8.6 TB/s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Topology&lt;/th&gt;&lt;td&gt;3D torus&lt;/td&gt;&lt;td&gt;3D torus&lt;/td&gt;&lt;td&gt;Boardfly&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Compute blocks&lt;/th&gt;&lt;td&gt;TensorCores + SparseCores&lt;/td&gt;&lt;td&gt;+ LLM Decoder Engine&lt;/td&gt;&lt;td&gt;2 TensorCores + 1 CAE&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Scale&lt;/th&gt;&lt;td&gt;9,216-chip pod&lt;/td&gt;&lt;td&gt;9,600 superpod (Virgo fabric)&lt;/td&gt;&lt;td&gt;Boardfly ≤ 1,024 active&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Perf/$ vs Ironwood&lt;/th&gt;&lt;td&gt;reference&lt;/td&gt;&lt;td&gt;up to 2.7× (training)&lt;/td&gt;&lt;td&gt;up to 80% (inference)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;th scope=&quot;row&quot;&gt;Native PyTorch&lt;/th&gt;&lt;td&gt;via PyTorch/XLA&lt;/td&gt;&lt;td&gt;TorchTPU (preview)&lt;/td&gt;&lt;td&gt;TorchTPU (preview)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;figcaption class=&quot;article-caption&quot;&gt;Table 1: Ironwood (TPU v7) vs the split 8th generation. Google vendor specs (Cloud deep-dive, April 22, 2026). Ironwood&amp;#39;s peak compute is its announced peak; the 8t/8i are figured in native FP4.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;p&gt;The &lt;strong&gt;TPU 8t&lt;/strong&gt;, for training, bets on scale. Native &lt;span class=&quot;article-term&quot;&gt; &lt;button type=&quot;button&quot; class=&quot;article-term__trigger&quot; aria-describedby=&quot;term-1r&quot; aria-expanded=&quot;false&quot;&gt; FP4 &lt;/button&gt; &lt;span class=&quot;article-term__tooltip&quot; id=&quot;term-1r&quot; role=&quot;tooltip&quot;&gt; &lt;span class=&quot;article-term__label&quot;&gt;FP4&lt;/span&gt; &lt;span class=&quot;article-term__definition&quot;&gt;A 4-bit floating-point format, the 2026 frontier of high-throughput inference. Four times less memory than FP16, but a very narrow dynamic range: it only holds up with fine-grained scaling through block formats (MXFP4, NVFP4).&lt;/span&gt;  &lt;/span&gt; &lt;/span&gt;  that doubles MXU throughput, an &lt;strong&gt;Axion&lt;/strong&gt; ARM host, and above all a fabric named &lt;strong&gt;Virgo&lt;/strong&gt; that links over 134,000 chips with up to 47 Pb/s of non-blocking bisection bandwidth, for over 1,700 ExaFlops at near-linear scaling, enough to exceed one million chips in a training cluster, driven by JAX + Pathways. The claimed gain is &lt;strong&gt;up to 2.7× performance per dollar&lt;/strong&gt; vs Ironwood (Google’s figure; several outlets cite 2.8× or even 2.85×, which are not the primary number). The superpod counts 9,600 chips, and Google’s consumer-facing post advances 121 ExaFlops and 2 PB of HBM shared per superpod.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;TPU 8i&lt;/strong&gt;, for inference and reasoning, bets on latency. 288 GB of HBM and above all &lt;strong&gt;384 MB of on-chip SRAM&lt;/strong&gt; (×3 vs the previous generation) to house a larger KV cache as close as possible to the compute. The radical novelty is topological: dropping the 3D torus for &lt;strong&gt;Boardfly&lt;/strong&gt;, which brings a 1,024-chip configuration’s network diameter down from &lt;strong&gt;16 hops to 7&lt;/strong&gt; (−56%), for latency improved &lt;em&gt;“up to 50%”&lt;/em&gt;. And a new fixed block, the &lt;strong&gt;CAE&lt;/strong&gt; (&lt;em&gt;Collectives Acceleration Engine&lt;/em&gt;): two TensorCores and one CAE per chip replace Ironwood’s four SparseCores, and cut on-chip collectives latency &lt;em&gt;“by 5x”&lt;/em&gt;, decisive for autoregressive decoding and &lt;em&gt;chain-of-thought&lt;/em&gt;. Claimed gain: &lt;strong&gt;up to 80% performance per dollar&lt;/strong&gt; vs Ironwood in inference. The two chips share &lt;em&gt;bare-metal&lt;/em&gt; access and up to 2× perf/watt, and both &lt;em&gt;“run native PyTorch via TorchTPU in preview”&lt;/em&gt;. The 8th generation therefore arrives with TorchTPU as a front-line software argument.&lt;/p&gt;
&lt;p&gt;A structural limit to keep in mind: the TPU was long &lt;em&gt;rentable only on Google Cloud&lt;/em&gt;, never buyable standalone. NVIDIA GPUs run everywhere: multiple clouds, on-prem, workstations, edge. Google has started to correct this by selling TPUs to a few customers, but for a multi-cloud or sovereign strategy, the deployment-flexibility gap stays a decisive factor. A sign that Google is not trying to purely replace NVIDIA: it &lt;em&gt;also&lt;/em&gt; offers NVIDIA Vera Rubin NVL72 instances on its own Virgo fabric.&lt;/p&gt;
&lt;h2 id=&quot;how-to-choose-for-your-situation&quot;&gt;How to choose for your situation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;You are a PyTorch-first shop on GPU evaluating the TPU to cut the bill.&lt;/strong&gt; Migrate nothing in preview. The public, stable path stays PyTorch/XLA (&lt;code&gt;torch_xla[tpu]&lt;/code&gt;), not TorchTPU. Run an honest A/B test (the same PyTorch model on a GPU cluster and on a TPU slice) and compare sustained throughput, energy and bill. Watch two signals that change the game: the release of TorchTPU’s public GitHub repository with the flip to GA, and the validation of linear scaling at Pod size. Until these two milestones are cleared, TorchTPU is a credible promise, not a production foundation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You do LLM serving and want the best cost per token.&lt;/strong&gt; vLLM is the default option, multi-backend. On TPU, start from &lt;code&gt;tpu-inference&lt;/code&gt; (single-host on GKE); for 400B+ multi-host models, switch to JetStream. Keep your model definitions in PyTorch: Torchax lowers them with no code change. The threshold that justifies seriously evaluating the TPU for inference: an MoE or reasoning workload at high concurrency with a low latency target, exactly the profile the 8i (CAE, big SRAM) was designed for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You are starting a very large-scale research project on TPU.&lt;/strong&gt; JAX + MaxText + Pathways stays the path of least resistance and the most mature: it is the stack that trains Gemini. Adopt PyTorch-on-TPU only if your code and talent capital is already massively PyTorch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You have a multi-cloud, on-prem or sovereign constraint.&lt;/strong&gt; The NVIDIA GPU stays the safe choice as long as TPUs are not widely buyable outside Google Cloud. Keep your pipelines portable (Keras 3, ONNX, framework-agnostic models) to switch between GPU and TPU as prices and availability evolve.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;TorchTPU will not bring down the CUDA wall on its own. What it changes is the height of that wall: it turns “PyTorch can technically run on a TPU” into “PyTorch runs on a TPU like it does at home”. The day an infrastructure lead can say “we move significant workloads without heroic engineering”, the negotiating leverage flips. That is precisely what Google is trying to make true.&lt;/p&gt;
&lt;p&gt;What remains is the question that decides everything, and that no spec will settle before the first GA deployments. Will TorchTPU’s maturity be enough to migrate the PyTorch-first shops? Or will JAX/Pathways stay the path of least resistance for whoever wants the maximum out of the TPU? One clue leans &lt;em&gt;for&lt;/em&gt; TorchTPU: teams like Liquid AI moved from JAX to PyTorch in 2023 for ecosystem reasons, not code, proof that framework lock-in is more surmountable than people think. But one clue leans &lt;em&gt;against&lt;/em&gt;: even vLLM TPU, to serve PyTorch, lowers it to JAX→XLA via Torchax. At least on the serving side, the real destination stays XLA reached through JAX. The real question for 2027 is therefore no longer “can the TPU run PyTorch”: it is &lt;em&gt;how many developers will cross the bridge once it is stable&lt;/em&gt;, and which of them will find they were, without knowing it, already on the JAX side.&lt;/p&gt;
&lt;h2 id=&quot;sources-and-method&quot;&gt;Sources and method&lt;/h2&gt;
&lt;p&gt;This piece draws on verification work closed on June 9, 2026. Every figure in it is, unless noted otherwise, a &lt;strong&gt;verified fact&lt;/strong&gt; from a primary source.&lt;/p&gt;
&lt;p&gt;Software primary sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenXLA&lt;/strong&gt;: &lt;a href=&quot;https://openxla.org/xla/architecture&quot;&gt;architecture&lt;/a&gt; and &lt;a href=&quot;https://openxla.org/xla/tf2xla&quot;&gt;tf2xla&lt;/a&gt;. Definition of XLA, fusion (&lt;em&gt;“Fusion is XLA’s single most important optimization”&lt;/em&gt;, verbatim), the &lt;code&gt;reduce_sum(x + y*z)&lt;/code&gt; example, StableHLO as the portability layer, TF/JAX/PyTorch frontends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JAX&lt;/strong&gt;: &lt;a href=&quot;https://docs.jax.dev/en/latest/key-concepts.html&quot;&gt;key concepts&lt;/a&gt;. &lt;code&gt;grad&lt;/code&gt;/&lt;code&gt;jit&lt;/code&gt;/&lt;code&gt;vmap&lt;/code&gt;/&lt;code&gt;pmap&lt;/code&gt;, tracing → jaxpr → StableHLO.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyTorch/XLA&lt;/strong&gt;: &lt;a href=&quot;https://github.com/pytorch/xla&quot;&gt;pytorch/xla repository&lt;/a&gt; (install command, C++11 ABI, &lt;em&gt;“Once TorchTPU is public it will replace PyTorch/XLA”&lt;/em&gt;, verbatim) and &lt;a href=&quot;https://pytorch.org/blog/pytorch-xla-2-7-release-usability-vllm-boosts-jax-bridge-gpu-build/&quot;&gt;2.7 release post&lt;/a&gt;. The lazy/&lt;code&gt;mark_step&lt;/code&gt; model and the &lt;em&gt;“CPU and CUDA tensors… are lazy”&lt;/em&gt; quote come from the &lt;a href=&quot;https://huggingface.co/blog/pytorch-xla&quot;&gt;HuggingFace PyTorch/XLA blog&lt;/a&gt;. The &lt;em&gt;“mess of undocumented behavior and bugs”&lt;/em&gt; comment is from user &lt;code&gt;in-silico&lt;/code&gt; on &lt;a href=&quot;https://news.ycombinator.com/item?id=47881786&quot;&gt;Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TorchTPU&lt;/strong&gt;: &lt;a href=&quot;https://developers.googleblog.com/torchtpu-running-pytorch-natively-on-tpus-at-google-scale/&quot;&gt;Google Developers Blog, April 7, 2026&lt;/a&gt;. &lt;em&gt;“it should feel like PyTorch”&lt;/em&gt;, PrivateUse1, three eager modes, &lt;em&gt;“50% to 100+%”&lt;/em&gt;, Dynamo→StableHLO→XLA, MPMD, roadmap, preview. The long Lee Howes quote (&lt;em&gt;“The TPU should be an obvious choice…”&lt;/em&gt;) is reported by &lt;a href=&quot;https://www.thestack.technology/google-torchtpu-pytorch-backend-tpu/&quot;&gt;The Stack&lt;/a&gt;, not by the official post, which contains no direct quotes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM&lt;/strong&gt;: &lt;a href=&quot;https://vllm.ai/blog/2025-10-16-vllm-tpu&quot;&gt;tpu-inference blog, October 16, 2025&lt;/a&gt; (verbatim fallback quote, +3.6×/+2.1×, &lt;em&gt;“nearly 5x”&lt;/em&gt;); &lt;a href=&quot;https://docs.vllm.ai/en/stable/design/paged_attention/&quot;&gt;PagedAttention (design doc)&lt;/a&gt; and &lt;a href=&quot;https://arxiv.org/abs/2309.06180&quot;&gt;SOSP 2023 paper&lt;/a&gt;; Torchax on &lt;a href=&quot;https://github.com/google/torchax&quot;&gt;google/torchax&lt;/a&gt;; multi-host/JetStream on &lt;a href=&quot;https://docs.cloud.google.com/kubernetes-engine/docs/tutorials/serve-vllm-tpu&quot;&gt;Google Cloud GKE&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardware and business primary sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TPU 8t/8i&lt;/strong&gt;: &lt;a href=&quot;https://cloud.google.com/blog/products/compute/tpu-8t-and-tpu-8i-technical-deep-dive&quot;&gt;Google Cloud technical deep-dive (April 22, 2026)&lt;/a&gt; and the associated blog.google post: all the Table 1 specs, Virgo, Boardfly, CAE, and the “up to” figures (2.7× training, 80% inference, 5× collectives, 50% latency, 56% diameter). &lt;strong&gt;Ironwood&lt;/strong&gt;: &lt;a href=&quot;https://blog.google/products/google-cloud/ironwood-tpu-age-of-inference/&quot;&gt;Google blog (April 2025)&lt;/a&gt;, GA reached in late 2025.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA&lt;/strong&gt;: FY2026 results (8-K / NVIDIA Newsroom) for datacenter revenue of ~$194 billion ($193.7 billion at the filing), +68%, ~90% of total revenue; the “half a trillion” visibility is Jensen Huang’s at GTC (October 2025). The ~81% market share (IDC) is an &lt;strong&gt;analyst estimate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deals&lt;/strong&gt;: &lt;a href=&quot;https://www.prnewswire.com/news-releases/anthropic-to-expand-use-of-google-cloud-tpus-and-services-302593275.html&quot;&gt;Anthropic/Google announcement (October 23, 2025, PR Newswire)&lt;/a&gt; (verbatim Kurian quote, &lt;em&gt;“up to one million TPU chips”&lt;/em&gt;); the April 2026 extension (Google investment “up to $40B”, 3.5 GW capacity per the Broadcom filing / “up to 5 GW” per Google); Reuters (December 2025) for the Meta collaboration and the contemplated open-sourcing of TorchTPU. Liquid AI (JAX→PyTorch 2023): the founder’s public testimony.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Method notes and &lt;strong&gt;points to handle with care&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vendor “up to” figures.&lt;/strong&gt; All 8t/8i gains (perf/$, latency, perf/watt) are Google &lt;em&gt;claims&lt;/em&gt; phrased as “up to”, not verified by an independent benchmark. Same for Fused Eager’s +50 to 100%.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency notes.&lt;/strong&gt; NVIDIA’s 75% gross margin is the Q4 figure, not the full year (~71% non-GAAP over the year). vLLM’s “23×” is a maximum against naive static batching (Anyscale measurement), not a general gain; the concept itself comes from Orca.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secondary figures, outside Google’s primary source:&lt;/strong&gt; the “Sunfish/Zebrafish” codenames, the Broadcom (training)/MediaTek (inference) split, the TSMC 2 nm node and a “2027” GA timeline do &lt;strong&gt;not&lt;/strong&gt; appear in the official deep-dive (Google announces a GA “later this year”, i.e. 2026). The official post itself carries an internal inconsistency on the Boardfly chip count (“up to 1,152” vs “up to 1,024 active chips”).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Currencies.&lt;/strong&gt; Amounts in this article are in US dollars, as reported by the cited sources (SEC filings, analyst notes, press releases). The French edition converts to euros at an indicative 1 USD = 0.92 EUR. Direct quotes (“half a trillion dollars”, “tens of billions of dollars”) are reproduced in their original currency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preview API.&lt;/strong&gt; The TorchTPU code snippets (&lt;code&gt;device=&amp;quot;tpu&amp;quot;&lt;/code&gt;, &lt;code&gt;@torch_tpu.pallas.custom_jax_kernel&lt;/code&gt;) are &lt;em&gt;illustrative&lt;/em&gt;: the API is in preview and may change before GA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Header image.&lt;/strong&gt; Google TPU v3 board photographed by Zinskauf, &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Tensor_Processing_Unit_3.0.jpg&quot;&gt;Wikimedia Commons&lt;/a&gt;, under &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;CC BY-SA 4.0&lt;/a&gt; license, cropped for the header (illustrative image of an earlier TPU generation).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A French version of this article, &lt;a href=&quot;https://lecompute.fr/silicon/torchtpu-jax-xla-vllm-tpu/&quot;&gt;published on June 9, 2026&lt;/a&gt;, is the original.&lt;/p&gt;</content:encoded><media:content url="https://lecompute.fr/images/photos/torchtpu-tpu-v3.webp" medium="image"/><media:description>Google TPU v3 board with liquid cooling: copper cold plates and coolant tubing on a blue PCB</media:description><category>TPU</category><category>TorchTPU</category><category>PyTorch</category><category>XLA</category><category>JAX</category><category>vLLM</category><category>Google TPU</category><category>CUDA</category><author>redaction@lecompute.fr (Killian Pluenet)</author></item></channel></rss>