inference/research

27 — Affordable 35B-class fit matrix

Which recorded accelerators can hold a ~35B-class model, and what does the cheapest one cost per unit of decode throughput.

Refresh note (docs/fit-matrix-oct14, Oct-18, this pass). Re-ran python tools/fit_matrix_35b.py on local main 547e8ad (236 accelerator records, 218 supply records, 4,667 benchmarks — #287 through #294 on top of the #286 matrix, which was itself stamped on 81b8382). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. None of the eight commits adds an accelerator or a purchase price. What they add is two more offload-shaped MoE checkpoints, a 74B hybrid whose 4-bit packing sits between the 24 GB fit bar and the 48 GB stretch bar, a diffusion LM whose cache field is zero, and one more graph-capture offload paper measured on the same 35B-A3B class this ceiling is built for.

  • SeqMoE says a 24 GB card holds 40% of Qwen3.6-35B-A3B-BF16 and still returns three quarters of full-load decode. SeqMoE: Toward Full-Load Performance via Predictive and Graph-Compatible MoE Offloading measures batch-1 decode with the cache at 45% of experts (40% for Qwen3.6): 75.69% of full-load throughput on Qwen3.6-35B-A3B-BF16, against 84.82% on Qwen3-30B-A3B-FP8, 79.20% on GPT-OSS-120B-MXFP4 and 76.65% on DeepSeek-V4-Flash, averaged to 80.22% in the abstract. Full-load means every weight resident, with pipeline parallelism when one GPU cannot hold them. The same section puts an eager offload at about 2% of full-load, so the gap this paper claims is the orchestration, not the bandwidth. Hardware in its Section 9.1 is three cards already in this table: NVIDIA GeForce RTX 4090 (rank 22, 24 GB) with 120 GB host RAM over PCIe 4.0, NVIDIA GeForce RTX 5090 (rank 12, 32 GB) with 120 GB over PCIe 5.0, and NVIDIA RTX PRO 6000 Blackwell Workstation Edition (rank 34, 96 GB) with 256 GB over PCIe 5.0. On the 4090 over PCIe 4.0 one layer of Qwen3-30B-FP8 compute overlaps 1.39 expert transfers, which is why a one-layer lookahead cannot hide the copy. The predictor itself is 120 MB, 228 MB, 112 MB and 223 MB on those four models, and the authors say the remaining miss (3.25% average, abstract hit rate 96.97%) is still the largest single piece of decode time. These are the authors' measurements; no independent tok/s is in the record, and Figure 6's absolute tok/s were not transcribed. Nothing here changes a fit flag: a Y is still "the 20 GB Q4 file fits," and 75.69% of full-load is a different question this table does not answer.

  • Intern-S2-397B is the same 17B-active body as Qwen3.5-397B-A17B, and the file is what does not fit. Intern-S2-397B is 403.423B total / 17B active, 10 of 512 routed experts plus one shared expert, continued from Qwen3.5-397B-A17B. 17/20 = 0.85× the 20 GB the 35B ceiling divides by (derived) — closer to a dense read than Qwen3.6-35B-A3B's 3/20 = 0.15, and the ceiling still divides by the resident file. A 4-bit packing of the safetensors count is 403.423e9 / 2 = 201,711,500,000 bytes = 201,711,500,000 / 1,073,741,824 = 187.86 GiB (derived). That is past 24 GB, past the 48 GB the 70B column tests, and past the 96 GB of rank 34; it needs the 192 GB row (Apple M2 Ultra, rank 33) or larger, or the offload the record describes. The notes derive KV on the 15 full-attention layers as 15 × 2 × 256 × 2 × 2 = 30,720 B/token, the same figure the base record stores. 30,720/20,480 = 1.50× the Qwen3.6-35B-A3B geometry (derived). 8,192 tokens is 30,720 × 8,192 = 240 MiB (derived), and the 4 GB the fit flag reserves holds 4 × 1,024³ / 30,720 = 139,810 tokens (derived). The record's kv_cache_bytes_per_token field is 15,360, half the notes' arithmetic and not what this paragraph uses. No benchmark of this checkpoint lands on a card in §4b.

  • DeepSeek-V4-Pro-0813 is a post-train of the 1.6T preview, not a smaller file. DeepSeek-V4-Pro-0813 keeps the preview nameplate: 1,600B total / 49B active, 6 of 384 routed experts plus one shared expert. 49/20 = 2.45× the 20 GB denominator (derived), so the dense-equivalent ceiling overstates a 49B-active decode relative to the 3B-active model it was built for, and the file is the part that does not fit anywhere in the priced table as a single resident checkpoint. A 4-bit packing of the nameplate is 1,600e9 / 2 = 800,000,000,000 bytes = 800,000,000,000 / 1,073,741,824 = 745.06 GiB (derived) — past the 512 GB M3 Ultra (rank 41). The record's own weights are the FP4/FP8 mixed release (safetensors metadata 1,650,497,936,906 parameters, dominated by I8), so the on-disk checkpoint is below that 4-bit-of-BF16 figure, and kv_cache_bytes_per_token stays null because the compressor layers do not collapse to one byte count. Six experts per token is narrower than the 8-expert routing the SeqMoE paper's overlap number was measured against. The card's Terminal-Bench 2.1 is 87.9, a vendor claim, and it is not a tok/s.

  • Nemotron 3.5 Bolt is the 24 GB-class cut of the 120B Super VL, and the BF16 parent does not fit 24 GB. NVIDIA Nemotron 3.5 Bolt 74B-A9B is 74B total / 9B active, 8 attention blocks out of 88. 9/20 = 0.45× the 20 GB denominator (derived). A 4-bit packing of the card's round 74B is 74e9 / 2 = 37,000,000,000 bytes = 37,000,000,000 / 1,073,741,824 = 34.46 GiB (derived): past the 24 GB the 35B fit flag tests (so a 24 GB card is still - for the file) and inside the 48 GB the 70B column tests. The card's recommended artifact is a separate 2-bit checkpoint it says fits in 24 GB; this record is the BF16 parent, and that quant is not a record here. KV on the 8 attention blocks is 8 × 2 × 128 × 2 × 2 = 8,192 B/token, 8,192/20,480 = 0.40× the Qwen3.6 figure (derived) — the same ratio the previous note computed for the 120B parent. 8,192 tokens is 64 MiB (derived), and 4 GB holds 4 × 1,024³ / 8,192 = 524,288 tokens (derived). The Mamba state is extra and is not in that KV number.

  • K2-Horizon-MoVA's 4-bit file fits inside the 20 GB the ceiling divides by; its KV does not fit inside the 4 GB headroom. K2-Horizon-MoVA-36B-A4B is 37.445B total / 4B active, 8 of 100 routed experts plus one shared expert. 4/20 = 0.20× the denominator (derived). A 4-bit packing is 37.445e9 / 2 = 18,722,500,000 bytes = 18,722,500,000 / 1,073,741,824 = 17.44 GiB (derived), under the 20 GB weights budget, so a card the 35B column marks Y holds this file with room to spare. The cache does not: kv_cache_bytes_per_token is 196,608, 196,608/20,480 = 9.60× the Qwen3.6 geometry (derived), because the Mixture-of-Values heads ride on top of ordinary GQA. 8,192 tokens is 196,608 × 8,192 = 1.50 GiB (derived), and the 4 GB headroom holds 4 × 1,024³ / 196,608 = 21,845 tokens (derived) before the cache is the thing that spills. Terminal-Bench 2.1 at 58.6 is a vendor claim and not a tok/s.

  • LLaDA2.2-mini is the one new checkpoint a 12 GB card can hold, and it is not an autoregressive decode. LLaDA2.2-mini is 16.256B total / 1.4B active, 8 of 256 experts. 1.4/20 = 0.07× the denominator (derived). A 4-bit packing is 16.256e9 / 2 = 8,128,000,000 bytes = 8,128,000,000 / 1,073,741,824 = 7.57 GiB (derived), inside the 12 GB of Intel Arc B580 (rank 2), which the 35B column marks -. kv_cache_bytes_per_token is 0: the record is iterative block diffusion with use_cache false, so the 4 GB headroom is not a KV budget. A full bidirectional K+V buffer, which the notes say is not what the field records, would be 20 × 4 × 128 × 2 × 2 = 40,960 B/token (the notes' arithmetic). The card's own serving example is still SGLang at tensor-parallel size 8, because the diffusion block and the 128K context are the constraint, not the parameter count. No absolute tok/s is in the record.

  • #294 measures the stretch model on the unpriced 48 GB card, and the prefill half of the same page. Hardware Corner Jun 2025: Quadro RTX 8000, ExLlamaV2 0.2.9, Llama 3.3 70B 5.0 bpw, decode 10.43 t/s at 8k is 10.43 decode tok/s on NVIDIA Quadro RTX 8000 (Turing, 48 GB) (48 GB, 672 GB/s, Y/Y/Y, 35B ceiling 672/20 = 33.6 tok/s (derived), no purchase price, so it stays in §4) for Llama 3.3 70B EXL2 5.0 bpw at 8k, and Hardware Corner Jun 2025: Quadro RTX 8000, llama.cpp b5508, Llama 3.3 70B Q5_K_M, decode 7.59 t/s at 8k is 7.59 tok/s for the same card on Llama 3.3 70B Q5_K_M. The 70B ceiling is 672/40 = 16.8 tok/s (derived); 10.43/16.8 = 0.62× and 7.59/16.8 = 0.45× that floor (derived). Both sit under it, which is what a 5-bit file does against a ceiling built for a 4-bit 40 GB file, and neither is the 35B-A3B workload the ranking sorts on. The rest of the commit is batch-1 llama.cpp prompt processing, not decode. Qwen3 30B-A3B Q4_K_XL on the rank-11 3090 is 1,958.99 tok/s at 16k and 1,336.79 at 32k (Hardware Corner Dec 2025 ranking: RTX 3090, llama.cpp CUDA, Qwen3 30B-A3B Q4_K_XL GGUF, prefill 1958.99 t/s @16K ctx, Hardware Corner Dec 2025 ranking: RTX 3090, llama.cpp CUDA, Qwen3 30B-A3B Q4_K_XL GGUF, prefill 1336.79 t/s @32K ctx). The rank-34 RTX PRO 6000 Blackwell runs the same model at 5,084.45 / 3,863.04 / 2,864.83 / 1,270.31 tok/s for 16k / 32k / 65k / 131k (Hardware Corner Dec 2025 ranking: RTX Pro 6000, llama.cpp CUDA, Qwen3 30B-A3B Q4_K_XL GGUF, prefill 5084.45 t/s @16K ctx, Hardware Corner Dec 2025 ranking: RTX Pro 6000, llama.cpp CUDA, Qwen3 30B-A3B Q4_K_XL GGUF, prefill 3863.04 t/s @32K ctx, Hardware Corner Dec 2025 ranking: RTX Pro 6000, llama.cpp CUDA, Qwen3 30B-A3B Q4_K_XL GGUF, prefill 2864.83 t/s @65K ctx, Hardware Corner Dec 2025 ranking: RTX Pro 6000, llama.cpp CUDA, Qwen3 30B-A3B Q4_K_XL GGUF, prefill 1270.31 t/s @131K ctx). Prefill is not the memory-bandwidth roofline this table divides by, so none of those cells enters the $/tok-s ranking.

  • #293's other benchmark cites do not move a byte. The same commit attaches vendor scores to Qwen3.6-35B-A3B (SWE-bench Verified 73.4, GPQA Diamond 86.0, MMLU-Pro 85.2) and to Qwen3.8-27B (SWE-bench Verified 77.2), plus scores on checkpoints whose geometry the earlier notes already sized (VeriLoop E2, Solar Open 2, NVIDIA Nemotron 3.5 Super VL 120B-A12B, Step 5 Preview, Naive-N0.5-Flash, Ornith-1.5-35B-A3B, Qwen3.5-122B-A10B, Qwen3.5-397B-A17B, MiMo-V2.6-Pro-RL, Ling-3.1-flash, Beam 1.0 501B-A23B, AliceAI-Foundation-80B-A3B-Base, Kimi-K2.6, MiMo-V2.6-Flash-RL, NVIDIA Nemotron Labs Dory 1.0 4B, Ornith-1.5-9B, Xing4.0-29B-A4B). None of those edits changes params_b, active_params_b, or a KV byte count, and none is a measured tok/s, so none enters §4b. SpecPrefetch: Parameter-Efficient Expert Prefetching for Sparse MoE Foundation Models was already on main before the #286 stamp; this pass does not re-derive it.

Refresh note (docs/fit-matrix-oct14, Oct-18, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 81b8382 (236 accelerator records, 218 supply records, 4,532 benchmarks — #286 on top of the #285 matrix, which was itself stamped on 84256e2). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. #286 adds no accelerator and no purchase price. What it adds is a 120B vision-language hybrid whose 4-bit packing clears the 48 GB stretch bar and still fits a 96 GB card, with a KV cache smaller than the 35B-A3B the ceiling is built for.

  • Nemotron 3.5 Super VL is a 12B-active read of a 120B file, and the file is the part that does not fit. NVIDIA Nemotron 3.5 Super VL 120B-A12B is 120B total / 12B active, hybrid Mamba-2 plus MoE plus attention, 22 of 512 routed experts plus one shared expert. 12/20 = 0.60× the 20 GB the 35B ceiling divides by (derived) — the dense-equivalent ceiling understates a 12B-active decode by less than it understates Qwen3.6-35B-A3B's 3B (3/20 = 0.15), and it still divides by the resident file. The record's params_b is the card's round 120B, not a safetensors count, so a 4-bit packing is 120e9 / 2 = 60,000,000,000 bytes = 60,000,000,000 / 1,073,741,824 = 55.88 GiB (derived, 4-bit = 0.5 B/param). That is past the 24 GB the 35B fit flag tests and past the 48 GB the 70B column tests, and it is inside the 96 GB of NVIDIA RTX PRO 6000 Blackwell Workstation Edition (rank 34) and the 80 GB A100/H100 rows. The card says the other ~490 experts stay in RAM and only the 22 move per token, so the resident-file test and the per-token read are different numbers; this table's Y is the file. KV is the 8 attention blocks only: 8 × 2 kv heads × 128 × 2 × 2 = 8,192 B/token, 8,192/20,480 = 0.40× the Qwen3.6-35B-A3B figure (derived). 8,192 tokens is 8,192 × 8,192 = 64 MiB (derived), and the 4 GB the fit flag reserves holds 4 × 1,024³ / 8,192 = 524,288 tokens (derived) before that headroom is the cache. A 128k window is 8,192 × 131,072 = 1.00 GiB (derived). The record says the Mamba recurrent state is the other memory term and is not in the 8,192. No benchmark of this checkpoint, so it does not enter §4b, and it does not move a fit flag: the 24 GB line is a weight test.

Refresh note (docs/fit-matrix-oct14, Oct-18, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 84256e2 (236 accelerator records, 218 supply records, 4,532 benchmarks — #280, #282 and #283 on top of the #281 matrix, which was itself stamped on db47423). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. None of the three commits adds an accelerator or a purchase price. What they add is a 37.4B MoE whose 4-bit packing fits inside the 20 GB the 35B column divides by, a 250B hybrid whose 4-bit packing does not, a CPU expert kernel whose own numbers are ratios and not tok/s, and the first four measurements on a 72 GB card §4 already lists as unpriced.

  • K2-Horizon-MoVA-36B-A4B packs inside the 20 GB column, and its KV does not. K2-Horizon-MoVA-36B-A4B is 37.445B / 4B active, 8 of 100 routed plus one shared expert, and the first three layers are dense. 4/20 = 0.20× the 20 GB the 35B ceiling divides by (derived). A 4-bit packing of the safetensors count is 37.445e9 / 2 = 18,722,500,000 bytes = 17.44 GiB (derived, 4-bit = 0.5 B/param), under the 20 GB weight bar and under the 24 GB the fit flag actually tests. KV is the ordinary GQA formula, and the record says the MoVA value routing is not in it: 48 layers × 8 kv heads × 128 × 2 × 2 = 196,608 B/token, 196,608/20,480 = 9.60× the Qwen3.6-35B-A3B figure (derived). 8,192 tokens is 196,608 × 8,192 = 1,536 MiB (derived), and the 4 GB the fit flag reserves holds 4 × 1,024³ / 196,608 = 21,845 tokens (derived) before the headroom is gone. 17.44 + 1.50 = 18.94 GiB of weights plus that 8k cache (derived), which is why a 24 GB card still holds the short context and why a 128k window does not. The card's Terminal-Bench 2.1 of 58.6 is a vendor claim against Xing4.0-29B-A4B at 57.50, so it does not enter §4b. No benchmark, no rank.
  • Solar Open 2 is the other shape: the active slice is small and the checkpoint is not. Solar Open 2 is 250.288B / 15B active, 8 of 320 plus one shared expert, hybrid attention with KV only on 12 of 48 layers. 15/20 = 0.75× that same denominator (derived) — closer to a dense 20 GB read than Qwen3.6-35B-A3B's ~3B, so the ceiling overstates it less and the card still cannot hold the file. A 4-bit packing is 250.288e9 / 2 = 125,144,000,000 bytes = 116.55 GiB (derived), past the 24 GB bar, past the 48 GB the 70B column tests, and past the 96 GB PRO 6000. Growing KV is the 12 softmax layers only: 49,152 B/token, 49,152/20,480 = 2.40× the Qwen3.6-35B-A3B geometry (derived), and 8,192 tokens is 49,152 × 8,192 = 384 MiB (derived). The record's own check is that all 48 layers would be 4× that, 196,608 B/token, which is the quarter the card claims. The 36 linear-attention layers are a fixed recurrent state. LiveCodeBench v6 of 92.4 is a vendor claim. No benchmark, so it does not enter §4b, and it does not move a fit flag: the 24 GB line is a weight test.
  • HiNa-MoE changes the CPU expert kernel. It does not change a ceiling. HiNa-MoE: High-Performance, Non-Intrusive MoE Inference on CPUs with Matrix Engines keeps routed-expert weights in plain row-major and fuses the AMX layout transform into the gathered-token matrix, so one buffer serves the CPU path and the GPU path. The authors' own FFN kernel, geometric mean, averages 1.73× over IPEX and 1.68× over KTransformers (peaks 3.37× and 2.16×) and reaches 96% of measured local bandwidth on a dual Xeon Gold 6430 (STREAM local 234 GB/s, cross-socket 95 GB/s, 95/234 = 0.41× (derived)). End to end, batch 1, 128 in and 128 out, dual 6430 plus an NVIDIA RTX A6000: decode averages 1.99× / 1.70× / 1.22× over vLLM CPU-only, IPEX and KTransformers, and the record says the IPEX and KTransformers builds already contain the HiNa-MoE operators. No absolute decode tok/s is printed. Prefill on Qwen2-57B-A14B with GQA on the A6000 and experts on the CPU is 1,526.66 tok/s at 2K against 1,187.43 for SGLang plus KTransformers (1.29×, 1526.66/1187.43 (derived)) and 2,085.47 at 32K against 1,252.54 (1.67× (derived)). A6000 stays the unpriced §4 row at 768 GB/s (38.4 tok/s ceiling (derived, 768/20)) and the §4b cell at 131.2 tok/s. A kernel ratio on a host-RAM expert path does not move that row.
  • The 72 GB PRO 5000 now has four numbers, and none of them is the 35B-A3B. NVIDIA RTX PRO 5000 72GB Blackwell Workstation Edition is already the §4 row at 72 GB, 1,344 GB/s, ceiling 1,344/20 = 67.2 tok/s (derived), Y/Y/Y, no bare-card price — tied with the 48 GB sibling on bandwidth, with the extra 24 GB buying the stretch model and no tok/s. HOSTKEY's own Ollama table (quant, prompt length and output length unstated, confidence 0.55) is the first published set: deepseek-r1:14b 67.71 (HOSTKEY: RTX PRO 5000 72GB Blackwell, deepseek-r1:14b, Ollama, avg decode, 67.71/67.2 = 1.01× the 20 GB floor (derived)), deepseek-r1:32b 32.89 (HOSTKEY: RTX PRO 5000 72GB Blackwell, deepseek-r1:32b, Ollama, avg decode, 32.89/84.0 = 0.39× the 27B ceiling of 1,344/16 (derived)), gpt-oss:20b 149.38 (HOSTKEY: RTX PRO 5000 72GB Blackwell, gpt-oss:20b, Ollama, avg decode, 149.38/67.2 = 2.22× (derived) — the wrong byte count for a ~21B MoE, same caveat the 4080/5080 note already uses), and qwen3-coder-next 74.34 (HOSTKEY: RTX PRO 5000 72GB Blackwell, qwen3-coder-next, Ollama, avg decode, 74.34/67.2 = 1.11× (derived)). The page says that last model is about 51 GB, so the dense-equivalent read is 1,344/51 = 26.4 tok/s and 74.34/26.4 = 2.82× (derived), which is a calibration of a ~51 GB file, not a Q4 35B-A3B. The 48 GB sibling's §4b cell stays 188.8 at 4k on a stated Q4_K; these four are a different engine with the quant unpublished, so they are not averaged into that cell and they do not enter §4b. Still no purchase price, so the row stays in §4.

Refresh note (docs/fit-matrix-oct14, Oct-18, prior pass). Re-ran python tools/fit_matrix_35b.py on local main db47423 (236 accelerator records, 218 supply records, 4,528 benchmarks — #275, #276, #278 and #279 on top of the #274 matrix, which was itself stamped on 4f8ec2e). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. None of the four commits adds an accelerator or a purchase price. What they add is a 27.8B dense hybrid that fits the same cards the 27B column already tests, a 2023 sub-1-bit expert kernel whose own end-to-end number is slower than the uncompressed baseline, 113 ranking-page cells that are a different Hardware Corner page from the ones §4b already quotes, and a draft-selection rule that cuts host-to-device expert copies rather than moving a bandwidth ceiling.

Refresh note (docs/fit-matrix-oct14, Oct-18, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 4f8ec2e (236 accelerator records, 218 supply records, 4,415 benchmarks — #268 through #273 on top of the #267 matrix, which was itself stamped on d17b963). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. None of the six commits adds a purchase price. What they add is six Apple bins that miss the bandwidth floor, four more offload-shaped MoE checkpoints (and the active-parameter count the previous note left null), and two more offload papers.

Refresh note (docs/fit-matrix-oct14, Oct-18, prior pass). Re-ran python tools/fit_matrix_35b.py on local main d17b963 (230 accelerator records, 218 supply records, 4,382 benchmarks — #263, #264, #265 and #266 on top of the #262 matrix, which was itself stamped on c104441). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. None of the four commits adds an accelerator or a purchase price. What they add is three more offload-shaped MoE checkpoints and one prefetch paper, plus the mid-context Hardware Corner cells the 3090 and 5090 rows in §4b were missing.

  • Step 5 Preview is a 27B per-token read of a 600B file, and the file is what has to be resident. Step 5 Preview is 600B total / 27B active, 8 of 352 experts plus one shared expert of width 1536, and 88 of 92 backbone layers are MoE. CORRECTED 2026-10-18: an earlier version of this note called the 27B active slice's 27e9 × 0.5 = 13.5 GB Q4 figure "inside the 16 GB the 27B column divides by". That compared a per-token read against a capacity and implied a 600B checkpoint fits a 16 GB card. The two numbers are different: 13.5 GB is the weights read per token (derived), not the memory required. The resident file at 4-bit is 600e9 × 0.5 = 300,000,000,000 bytes = 279.4 GiB (derived), or about 1,118 GiB at BF16. It fits 16 GB, 24 GB and 48 GB on no reading, which is the same conclusion the card's own serving configs give (FP8 on 4 B300s or 8 H200s). 27 / 20 = 1.35× (derived) described only how much larger the active set is than a 3B one; it was never a fit test, because the 20 GB denominator is the byte count of a 35B file and this is a 600B one. Its growing KV counts only the 23 full-attention layers: 70,656 B/token, so 8,192 tokens is 70,656 × 8,192 = 578,813,952 bytes = 552 MiB (derived). The 69 sliding layers are a fixed 512-token window, 103.5 MiB (the record's figure), not part of the per-token number. The BF16 checkpoint is about 1,118 GiB (derived, 600e9 × 2 / 1,073,741,824); the card's serving configs start at FP8 on 4 B300s or 8 H200s. No single-GPU offload recipe and no benchmark, so it does not enter §4b and does not move a fit flag. The 24 GB line is unchanged.
  • Ling-3.1-flash is the small-active shape again, and MiMo-V2.6-Pro-RL is the one whose KV the 4 GB headroom does not cover. Ling-3.1-flash is 560B total / 25B active, 8 of 512 experts plus one shared expert, FP8 on disk. Its growing KV is the 9 MLA layers only: 10,368 B/token, 10,368 / 20,480 = 0.51× the Qwen3.6-35B-A3B geometry (derived), and 8,192 tokens is 10,368 × 8,192 = 81 MiB (derived). 25 / 20 = 1.25× the 20 GB denominator (derived). MiMo-V2.6-Pro-RL is the page's round 1T with active_params_b left null (the card publishes no active count), routing 8 of 384 experts and no shared expert. Its growing KV is the 10 global layers: 10 × 8 × (192 + 128) × 2 = 51,200 B/token, 51,200 / 20,480 = 2.50× the 35B-A3B geometry and 51,200 / 70,656 = 0.72× Step 5's (derived). 8,192 tokens is 51,200 × 8,192 = 400 MiB (derived), still inside the 4 GB the fit flag reserves; a 128k context is 51,200 × 131,072 = 6,710,886,400 bytes = 6.25 GiB (derived), which is the headroom and not the weights. The 60 sliding layers are a fixed 128-token window, 39.3 MB (the record's figure). Neither checkpoint has a benchmark, so neither enters §4b.
  • DuoServe-MoE is a prefetch schedule, and the cards it was measured on are already in the corpus. DuoServe-MoE: Dual-Phase Expert Prefetch and Caching for LLM Inference QoS Assurance splits the expert fetch by phase: prefill pipelines one expert at a time, decode predicts the next layer, and the on-device expert cache is sized to k rather than to the pool. The authors' own band is TTFT 1.78× to 5.34× and end-to-end 1.42× to 7.55× against on-demand fetch and full-layer prefetch, single request, PCIe 4.0, on an RTX A5000 24 GB and an RTX A6000 48 GB. The A3B-shaped cell is Qwen3-30B-A3B in FP8: TTFT over 5× versus full-layer prefetch and about 1.95× to 1.99× versus on-demand fetch, with peak GPU memory 1.54 GB versus 1.24 / 1.80 / 7.67 GB. NVIDIA RTX A5000 is 24 GB at 768 GB/s, a 38.4 tok/s ceiling on the 20 GB column (derived, 768/20) and unpriced, so it stays in §4. NVIDIA RTX A6000 is already the §4b row at 131.2 tok/s (3.4× its 38.4 floor). The paper's ratios are against other offload schedules, not against that roofline, so they do not enter the × column and do not move a rank.

Refresh note (docs/fit-matrix-oct14, Oct-18, prior pass). Re-ran python tools/fit_matrix_35b.py on local main c104441 (230 accelerator records, 218 supply records, 4,306 benchmarks — #257, #258 and #259 on top of the #256 matrix, which was itself stamped on e525b48). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. None of the three commits adds an accelerator or a purchase price. What they add is the named 35B-A3B checkpoint the 20 GB column was written for, plus two larger MoE checkpoints and one prefetch paper.

  • The 20 GB column now has the model the brief names. Qwen3.6-35B-A3B is 35.952B total / 3B active, 256 experts with 8 routed plus one shared expert, and its KV is 20,480 B/token — the same geometry the previous note recorded for Ornith-1.5-35B-A3B. The record's own safetensors count is 35,951,822,704 BF16 parameters, so the checkpoint is 35,951,822,704 × 2 = 71,903,645,408 bytes = 71,903,645,408 / 1,073,741,824 = 66.97 GiB (derived). A 4-bit packing of the same count is a quarter of that, 66.97 / 4 = 16.74 GiB (derived), inside the 20 GB the ceiling divides by. The 4 GB headroom at 8,192 tokens is 20,480 × 8,192 = 167,772,160 bytes = 160 MiB (derived), so the 4 GB the fit flag reserves is runtime and the OS, not the KV. Same threshold as before: nothing in the new record moves the 24 GB line, and there is no benchmark of it, so it does not enter §4b.
  • Two more MoE checkpoints, and neither is the 20 GB file. AliceAI-Foundation-80B-A3B-Base activates the same 3B per token (10 of 512 experts plus one shared expert) but the record's safetensors count is 81,286,433,408 BF16 parameters, so the checkpoint is 81,286,433,408 × 2 = 162,572,866,816 bytes = 151.41 GiB (derived) and a 4-bit packing is 151.41 / 4 = 37.85 GiB (derived). That clears the 35B-A3B 24 GB bar and misses the 70B-Q4 48 GB bar, and its KV is 24,576 B/token, so 8,192 tokens is 24,576 × 8,192 = 192 MiB (derived). Beam 1.0 501B-A23B is 501.3B total / 23.4B active, 8 of 256 experts and no shared expert. The record's BF16 count is 501,203,374,528 parameters, so a 4-bit packing is 501,203,374,528 / 2 = 250,601,687,264 bytes = 233.39 GiB (derived) — past every priced row except the 512 GB Apple M3 Ultra (Mac Studio, 2025), and past the 48 GB the 70B column tests. Its growing KV is only the 9 full-attention layers, 36,864 B/token, which at 8,192 tokens is 36,864 × 8,192 = 288 MiB (derived); the record's own note puts the 43 sliding layers at a fixed 172.5 MiB that does not grow with context. The active-byte read is the other way around: 23.4 / 20 = 1.17× (derived) the 20 GB the ceiling divides by, so for this checkpoint the dense-equivalent ceiling overstates the rate, where for the 3B-active models it understates it.
  • ProMoE: Fast MoE-based LLM Serving using Proactive Caching is why a card the fit flag marks - can still serve the MoE, and it does not change a rank. With routed experts in host RAM the miss is only known when the expert GEMM is about to run, so the PCIe fetch sits on the critical path; the paper's fix is to predict the next layer's experts from the current hidden state and copy them while the current layer computes, then preempt with the real gate result. Every number in the record is the authors' own, on one NVIDIA GeForce RTX 4090 (rank 24, already Y/Y/- at 24 GB) at batch 1 over PCIe 4.0: decode 2.07× average and 5.02× best against transformers with an LRU expert cache, and only 1.34× average against llama.cpp, because a faster GPU-side MoE kernel leaves less idle compute to hide the copy behind. The same record says the gain falls further as the batch grows (batch 4 cuts the decode speedup from 2.28× to 1.59×). That is a software multiplier on an offload path, not a bandwidth or a price, so it does not move a ceiling, a fit flag, or the $/tok-s order. Ranks 1 and 2 stay -/-/-.

Refresh note (docs/fit-matrix-oct14, Oct-18, prior pass). Re-ran python tools/fit_matrix_35b.py on local main e525b48 (230 accelerator records, 218 supply records, 4,322 benchmarks — #249 through #255 on top of the #248 matrix, which was itself stamped on d72800f). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match the table already below, so the ranked table does not move and no rank is renumbered. None of the seven commits adds an accelerator or a purchase price. What they add is model geometry, and one technique record that explains why a card under 24 GB can still serve the MoE the fit flag marks -.

  • The 20 GB column is now the named checkpoint, not only the brief. Ornith-1.5-35B-A3B is 35.952B total / ~3B active, qwen3_5_moe, 256 experts with 8 routed, and its KV is 20,480 B/token — the same geometry as Qwen3.5-35B-A3B (35B / 3B, 20,480 B/token). BF16 of that checkpoint is 71,903,645,408 bytes, which is 71,903,645,408 / 1,073,741,824 = 66.97 GiB (derived). A 4-bit packing of the same count is about a quarter of that, 66.97 / 4 = 16.74 GiB (derived), inside the 20 GB the ceiling divides by. The 4 GB headroom at 8,192 tokens is 20,480 × 8,192 = 167,772,160 bytes = 160 MiB (derived), so the 4 GB the fit flag reserves is runtime and the OS, not the KV. Nothing in the new record changes the 24 GB threshold, and there is no benchmark of it, so it does not enter §4b.
  • Three more records sit in the same ~3–4B-active class and none of them is the 20 GB file. Kolibri-1 is 78.103B / 3.458B active, KV 20,480 B/token, but 78.103 × 2 = 156.2 GB of BF16 (derived, one-pass 2 bytes/param) — a resident Q4 of that is closer to 40 GB than to 20 GB, so it is a 70B-column problem, not a 35B one. Xing4.0-29B-A4B is 31.215B / 4B active with KV 46,080 B/token, more than double the 20,480 of the named MoE, so its context headroom is the thing that moves, not the weight bar. Mellum2.1 Thinking 12B A2.5B is 12.15B / 2.5B active and the record's own note puts the BF16 checkpoint at about 24 GB; a Q4 of it is a small-model file and does not use the 20 GB denominator.
  • The dense 27B sibling and the two Flash-class records do not move a byte assumption either. Qwen3.8-27B is dense, 27.781B, KV 65,536 B/token: 27.781 × 0.5 = 13.89 GB at 4-bit (derived), inside the 16 GB the 27B column divides by. MiMo-V2.6-Flash-RL is 309B / 15B active (KV 23,040 B/token) and GLM-5.3-Flash is 320B / 18B active (KV 11,264 B/token, geometry filled by #251). Both are expert-offload machines, not single-device 24 GB fits, so neither gets a fit flag here. Ornith-1.5-9B is a 9.653B dense model and is out of scope.

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main d72800f (230 accelerator records, 218 supply records, 4,305 benchmarks — #246 on top of 841d639). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #246 adds no accelerator and no purchase price. What it adds is the first Qwen3.5-35B-A3B and Qwen3.5-27B llama.cpp cells for the W7900 and a second protocol for the R9700, plus an MLX long-decode scorecard on the rank-41 Mac Studio.

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 267e65c (230 accelerator records, 218 supply records, 4,203 benchmarks — #242 and #243, the same Xeon 6 MLPerf v6.1 ingest, on top of 3c5cf8e). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. No new supply record, so no new price. What landed is four Granite Rapids host CPUs plus sixteen llama3.1-8b INT8 aggregate rows and one whisper samples/s row. None of the four enters the 159.

Refresh note (docs/fit-matrix-oct14, Oct-17, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 3c5cf8e (226 accelerator records, 218 supply records, 4,187 benchmarks — #240 on top of 80aee58). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #240 adds no accelerator and no purchase price. What it adds is the Next/Flash class itself, at Q4 and with MTP, on the rank-37 box, plus two larger Flash MoEs at Q2 and a 1.2B calibration on a card §4 already lists.

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 80aee58 (226 accelerator records, 218 supply records, 4,167 benchmarks — #238 and #237 on top of 2d884b8). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. Neither commit adds an accelerator or a purchase price.

  • LLaDA2.2-mini is a model, not a row. LLaDA2.2-mini is a 16.256B diffusion MoE with 1.4B active and kv_cache_bytes_per_token 0. The BF16 checkpoint is about 32 GB, which clears the 24 GB 35B-A3B bar as a weight footprint and is not the 20 GB Q4 denominator this doc divides by. The card publishes no absolute tok/s for the mini, so there is no measured cell to set against a ceiling and nothing enters §3 or §4b.
  • The OpenRouter Llama 3.3 70B re-read is a hosted service, not a card. #237 moves the Groq row on OpenRouter hosted API router from 0.51 s / 198 tok/s to 0.52 s / 191 tok/s. List prices did not move. A hosted tok/s is not memory_bandwidth_gbps / 20, so it does not re-rank §3. The stretch goal this doc prices is still Llama-3.3-70B Q4 resident on a single device at 48 GB.

Refresh note (docs/fit-matrix-oct14, Oct-17, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 2d884b8 (226 accelerator records, 218 supply records, 4,167 benchmarks — #235 and #234 on top of a641583). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. Neither commit adds an accelerator or a purchase price. #234 files a vendor headline for the Hailo-10H (9.9 tok/s on Llama-3.2-1B, Hailo-10H Pi AI HAT+ 2 Llama-3.2-1B compiled-model TPS); that part is under the 8 GB gate and was never a row. #235 is the one that lands on parts this doc already lists.

Refresh note (docs/fit-matrix-oct14-p232, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main a641583 (226 accelerator records, 218 supply records, 4,152 benchmarks — #232 on top of 46c83ee). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #232 adds no accelerator and no purchase price. What it adds is the named model itself, Qwen3.6-35B-A3B UD-Q4_K_XL, at depth 0 and concurrency 1, on two parts this doc already lists (Local LLM Benchmarks speed dataset (Donato Capitella, results.json)). The protocol is a server endpoint (2048-token prompt, 128 generated, TTFT excluded), not llama-bench tg128, so the new cells are not averaged with the llama-bench rows already on file.

Refresh note (docs/fit-matrix-oct14-p230, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 46c83ee (226 accelerator records, 218 supply records, 4,144 benchmarks — #230 on top of 0947ba3). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #230 adds no accelerator and no purchase price. What it adds is a 2-card gptj-99 box on a part §4 already lists:

Refresh note (docs/fit-matrix-oct14-p228, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 5c30835 (226 accelerator records, 218 supply records, 4,142 benchmarks — #228 on top of 3b34129; #227 is a model-record KV fill and moves nothing here). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #228 adds no accelerator and no purchase price. What it adds is one shared llama.cpp b7083 Vulkan run (Phoronix: llama.cpp Vulkan, Arc B580 vs RX 9000 vs RTX 50 (b7083, Dec 2025)) on three cards the matrix already lists, all of them -/-/-: the rank-2 Arc B580, the unpriced RX 9070, and the unpriced RX 9060 XT. Every cell is Q8_0, geometric mean of N=3, one request, tg128 or pp1024. Q8 moves about twice the bytes the 20 GB Q4 denominator assumes, so none of the ratios below is a Q4 measurement and none enters §4b.

Refresh note (docs/fit-matrix-oct14-p225, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 77f4f6b (226 accelerator records, 218 supply records, 4,112 benchmarks — #225 on top of 19d2ccc). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #225 adds no accelerator and no purchase price. What it adds is a second box on a part §4 already lists, and a second reading of the rank-9 card plus the first time that card's stretch model is actually measured:

Refresh note (docs/fit-matrix-oct14-p221, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 5ba1be0 (226 accelerator records, 218 supply records, 4,106 benchmarks — #221 and #222 on top of 58a57fa). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #221 adds no accelerator and no purchase price. #222 adds a model record, not a card. What #221 adds is the long-context half of a sweep §4b already cites at default context, on the same part:

#223 re-reads OpenRouter's Llama-3.3-70B provider table. It moves no purchase price and no accelerator, so it does not enter this matrix.

Refresh note (docs/fit-matrix-oct14-p219, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main d5c152f (226 accelerator records, 218 supply records, 3,765 benchmarks — #219 on top of 6eb566d). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #219 adds no accelerator and no purchase price. What it adds is a second protocol on a part §4 already lists, plus a two-card vLLM episode the single-card fit flag does not cover:

Refresh note (docs/fit-matrix-oct14-p217, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 84863d2 (226 accelerator records, 218 supply records, 3,752 benchmarks — #217 on top of 111572f). The selection rule still yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #217 adds no accelerator and no purchase price. What it adds is a context sweep on a part §4 already lists and §4b already quotes at short context:

Refresh note (docs/fit-matrix-oct14-p215, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main c45efa7 (226 accelerator records, 218 supply records, 3,728 benchmarks — #214 and #215 on top of 2ae5d01). The selection rule now yields 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #214 adds sixteen accelerators and 123 llama.cpp scoreboard rows; #215 re-reads six service rows. None of the new accelerators has a purchase-price supply record, so the priced set stays 43.

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 2e3d05f (210 accelerator records, 218 supply records, 3,605 benchmarks — #211 and #212 on top of add09bf). The selection rule still yields 154 qualifying / 43 priced / 111 unpriced (68 of the unpriced fit 35B-A3B, 43 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #211 adds a model record and fills one active-param field; #212 re-reads six service rows. Neither adds an accelerator, a supply row, or a benchmark, so the gate is the same 154 the previous note counted.

  • The new model is the dense 27B this table already uses 16 GB for, and it does not change the byte count. Qwen3.8-27B is Qwen3.8-27B, dense hybrid, params_b 27.781 and active_params_b 27.781 (safetensors total 27,781,427,952 BF16; the card rounds it to 27B). The 27B column stays weights = 16 GB + 4 GB KV, needing vram_gb >= 20. Nothing in the new record is a measured Q4 file size, so the 16 GB assumption is not revised here. The card's own comparison (Terminal Bench 2.1 73.0 vs 63.4, SWE-bench Pro 61.7 vs 53.5, GPQA Diamond 89.2 vs 87.8 against Qwen3.6-27B) is a quality claim, not a bandwidth one, and it does not enter §3.
  • The Q4 measurement of that model was already on file, on a part §3 already prices. Apple M3 Max (MacBook Pro 16-inch, Nov 2023) is rank 39 (128 GB, 400 GB/s, 27B ceiling 400/16 = 25.0 tok/s (derived), $3,400 → $170.00/tok-s (derived) from eBay used MacBook Pro M3 Max 16in 128GB (Oct 2026)). Ollama's llama.cpp backend runs Qwen3.8-27B Q4_K_M at 12.0 tok/s (Ollama (llama.cpp backend) on MacBook Pro M3 Max 128GB: Qwen3.8-27B Q4_K_M decode tokens/s). 12.0/25.0 = 0.48× that ceiling (derived) — under the floor, the same shape the M2 Max IQ3_S cell already shows at 0.43× and the R9700 UD-Q4_K_XL cell at 0.77×, on different silicon and different protocols, so the three ratios are not a ranking. The MLX sibling on the same machine is 42.5 tok/s (Ollama (MLX backend) on MacBook Pro M3 Max 128GB: Qwen3.8-27B 4-bit decode tokens/s), format_id null, methodology says NVFP4. 42.5/25.0 = 1.70× (derived), and 42.5/12.0 = 3.54× (derived) between the two backends. NVFP4 is not Q4_K_M, so the 1.70× is not a Q4 reading and it does not enter §4b. $3,400/12.0 = $283.33 per measured Q4 tok/s (derived) — not a re-rank; the ranking stays on the 20 GB ceiling.
  • GLM-5.3's filled active-param field is the wrong model class. GLM-5.3 is 753.3B total with active_params_b now 40 (the card's figure; the record's notes keep the 40.93B config arithmetic beside it). A 40B-active MoE is not the 35B-A3B, the 27B dense, or the 70B dense this table fits, and the fill adds no accelerator and no price.
  • #212 moves hosted tok/s, which this table does not rank. The OpenRouter re-read moves the Groq row on Llama 3.3 70B from 0.50 s / 198 tok/s to 0.49 s / 209 tok/s, and the DeepInfra, Novita, SambaNova, Vertex and Together P50s move in notes. Those are service records (OpenRouter hosted API router, DeepInfra serverless inference, Novita AI serverless endpoints, SambaNova Cloud inference, Google Cloud Vertex AI generative inference, Together AI serverless inference), not purchase prices, so no $/tok-s cell changes.

Refresh note (docs/fit-matrix-oct17-p11, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 42edb33 (210 accelerator records, 218 supply records, 3,605 benchmarks — #209 on top of c9ca28e). The selection rule still yields 154 qualifying / 43 priced / 111 unpriced (68 of the unpriced fit 35B-A3B, 43 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #209 adds one accelerator and no purchase price. The new chip does not clear the gate, and the one new row that is the named 35B-A3B target sits on a part §4 already lists:

  • Base M4 does not qualify. Apple M4 (base, Mac mini) is a Mac mini base M4, 24 GB unified LPDDR5X at 120 GB/s. 24 GB meets the 35B-A3B bar and the 27B bar and misses the 48 GB 70B bar (Y/Y/-), but 120 GB/s misses the 300 GB/s bandwidth floor, and there is no purchase-price supply record at <= $3,000 (no data/supply/ row names this id), so the selection rule keeps it out of the 154 — the same shape as GB10 and Jetson AGX Thor, at less than half their bandwidth. The arithmetic the ceiling column uses gives 120/20 = 6.0 tok/s (derived), 120/16 = 7.5 tok/s (derived) on the 27B column, and 120/40 = 3.0 tok/s (derived) on the 70B column. It does not enter §3 or §4. The record's own note says the comment does not print a GPU-core count, so this is the base M4 and not the M4 Pro or the M4 Max already ranked at 40.
  • The two rows on that chip are the wrong byte count. llama.cpp discussion #4167, Metal, build 2e97c5f, batch 1: llama 3.2 3B Q4_K_M (1.87 GiB) tg128 45.95 (llama.cpp Metal on Apple M4 (Mac mini, 10 CPU cores, 24 GB): llama 3.2 3B Q4_K_M tg128) and Qwen2.5-Coder 7B Q4_K_M (4.36 GiB) tg128 22.60 (llama.cpp Metal on Apple M4 (Mac mini, 10 CPU cores, 24 GB): Qwen2.5-Coder 7B Q4_K_M tg128). Against the 6.0 floor those are 45.95/6.0 = 7.66× and 22.60/6.0 = 3.77× (derived) — a 1.87 GiB file and a 4.36 GiB file, not a 20 GB one, so the multiples are small-model calibrations and not evidence the 120 GB/s pool decodes the 35B-A3B at those rates. Neither enters §4b. No purchase price, so no $/tok-s cell.
  • M2 Max, already in §4, now has the named 35B-A3B at Q4, and the chip in the comment is the slower SKU. Apple M2 Max (MacBook Pro 14/16-inch & Mac Studio, 2023) (96 GB, record bandwidth 400 GB/s, 35B ceiling 400/20 = 20.0 tok/s (derived), Y/Y/Y, unpriced). The same discussion, comment 18555918, is an M2 Max 30-core GPU, 32 GB, not the 38-core / 96 GB the record's bandwidth is published for — the record's own basis says the 30-core configuration is listed at 300 GB/s. llama-bench, batch 1, build unprinted: Qwen3.6-35B-A3B Q4_K_M (20.22 GiB) decodes at 58.56 tok/s tg128 (llama.cpp Metal on Apple M2 Max (30-core GPU, 32 GB): Qwen3.6-35B-A3B Q4_K_M tg128) and prefills at 671.4 tok/s pp4096 (llama.cpp Metal on Apple M2 Max (30-core GPU, 32 GB): Qwen3.6-35B-A3B Q4_K_M pp4096). Against the record's 20.0 floor that is 58.56/20.0 = 2.93× (derived). Against the 300 GB/s the comment's own SKU is listed at, 300/20 = 15.0 tok/s (derived) and 58.56/15.0 = 3.90× (derived). The 20.22 GiB file is the byte count the floor assumes, which is why this row enters §4b and the 7B rows above do not. It does not enter §3: still no purchase price, and the 32 GB machine is not the 96 GB the fit flag is computed against — 20.22 GiB of weights plus the OS on 32 GB is the record's own "context headroom is small" caveat, not a 70B fit.
  • The dense sibling on the same comment lands under the floor, and it is the wrong quant. Qwen3.8-27B IQ3_S (11.20 GiB) decodes at 10.82 tok/s (llama.cpp Metal on Apple M2 Max (30-core GPU, 32 GB): Qwen3.8-27B IQ3_S tg128) and prefills at 106.78 (llama.cpp Metal on Apple M2 Max (30-core GPU, 32 GB): Qwen3.8-27B IQ3_S pp4096). The 27B ceiling on the record is 400/16 = 25.0 tok/s (derived); 10.82/25.0 = 0.43× (derived). IQ3_S is not Q4 and 11.20 GiB is not 16 GB, so the ratio is a smaller file than the denominator, which makes 0.43× a lower bound on how far a Q4 dense 27B would sit under the floor, not a Q4 measurement. The MoE-vs-dense gap on one comment is 58.56/10.82 = 5.41× (derived) at decode and 671.4/106.78 = 6.29× (derived) at prefill — the same shape the 3090 note already records (179.0 vs 33.5 at 4k), now on a 400 GB/s unified pool. The comment's MTP sweep is an ollama draft-head run and is not these rows.
  • The rest of #209 is Llama-2-7B, so it calibrates and does not re-rank. On the priced M1 Ultra (rank 28, 800 GB/s, ceiling 40.0 tok/s (derived)): Q4_0 tg128 113.79 (llama.cpp Metal on Apple M1 Ultra (64-core GPU, 128 GB): llama 7B Q4_0 tg128 (discussion #4167, c1d0e7a)), 113.79/40.0 = 2.84× (derived) — a 7B file, not a 20 GB one. On the priced M3 Max (rank 39, 400 GB/s, ceiling 20.0 (derived), tied with the M2 Max): Q4_0 tg128 81.57 (llama.cpp Metal on Apple M3 Max (MBP 16, 40-core GPU): llama 7B Q4_0 tg128 (discussion #4167, c1d0e7a)), 81.57/20.0 = 4.08× (derived), same caveat. The M5 / M5 Pro / M5 Max / M5 Ultra cells in the same ingest are the same 7B protocol on parts §4 already lists. None of them is an A3B, so none enters §4b, and none carries a purchase price, so §3 does not move.

Refresh note (docs/fit-matrix-oct17-p10, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main c9ca28e (209 accelerator records, 218 supply records, 3,549 benchmarks — #206 on top of 5bebcc4). The selection rule now yields 154 qualifying / 43 priced / 111 unpriced (68 of the unpriced fit 35B-A3B, 43 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #206 adds two accelerators and no purchase price. Both clear the bandwidth floor and fit none of the three workloads, so both land in the does-not-fit list and neither enters §3 or §4:

Refresh note (docs/fit-matrix-oct17-p9, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 6b863a4 (207 accelerator records, 218 supply records, 3,541 benchmarks — #203 on top of e68a507). The selection rule still yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #203 adds one accelerator and no purchase price. The new card does not clear the gate:

  • Arc Pro B50 does not qualify. Intel Arc Pro B50 is 16 GB GDDR6 at 224 GB/s, 70 W, half-height. 16 GB misses the 24 GB 35B-A3B bar and the 20 GB 27B bar (-/-/-), and 224 GB/s misses the 300 GB/s bandwidth floor. There is no purchase-price supply record at <= $3,000 (no data/supply/ row names this id), so the selection rule keeps it out of the 152 — the same shape as RTX PRO 2000 Blackwell, except that card clears the bandwidth floor and this one does not. The arithmetic the ceiling column uses gives 224/20 = 11.2 tok/s (derived), 224/16 = 14.0 tok/s (derived) on the 27B column, and 224/40 = 5.6 tok/s (derived) on the 70B column. It does not enter §3 or §4. The record's own note says a 4-bit 14B fits and a 4-bit 32B dense does not, which is the same 16 GB miss the fit flags encode.
  • The two new rows are a 4-card aggregate, and they are the wrong byte count. MLPerf Inference v6.0 closed, PyTorch vLLM, Llama-3.1-8B INT8, vendor-measured on 4× MAXSUN Arc Pro B50: Offline 1,721.84 tok/s aggregate (Intel Arc Pro B50 x4, MLPerf v6.0 Offline: Llama-3.1-8B INT8 aggregate tok/s) and Server 1,187.13 tok/s aggregate (Intel Arc Pro B50 x4, MLPerf v6.0 Server: Llama-3.1-8B INT8 aggregate tok/s). The record says the submission does not publish a per-card split; dividing by 4 is an average only, 1,721.84/4 = 430.46 and 1,187.13/4 = 296.78 tok/s per card (derived). Against the 11.2 floor those are 38.4× and 26.5× (derived) (430.46/11.2 = 38.43, 296.78/11.2 = 26.50) — an INT8 8B, not a Q4 20 GB file, so the multiple is a small-model calibration and not evidence the 16 GB card holds the 24 GB model. Offline is a throughput scenario and Server is latency-bounded; neither is a batch-1 decode, and neither enters §4b. The same submitter's 4× Arc Pro B60 Offline row on Llama-3.1-8B FP8 is 3,347.43 (Intel Arc Pro B60 24GB x4, MLPerf v6.0 Offline: Llama-3.1-8B aggregate tok/s); 3,347.43/1,721.84 = 1.94× (derived), different silicon, different quant (FP8 vs INT8), same 4-card shape, not a re-rank. Intel Arc Pro B60 stays at rank 16 ($650, 24 GB, Y/Y/-). No purchase price on the B50, so no $/tok-s cell.

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main af598e8 (206 accelerator records, 218 supply records, 3,539 benchmarks — #201 on top of c49175c). The selection rule still yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #201 adds no accelerator and no purchase price. What it adds is three Database Mart tables on parts the previous note already placed: one priced, one unpriced-and-fits, one that qualifies and does not fit.

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main b0ff5fd (206 accelerator records, 218 supply records, 3,507 benchmarks — #199 on top of 35d3ae1). The selection rule still yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #199 adds one accelerator and no purchase price. The new card does not clear the gate:

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 0e0a10b (205 accelerator records, 218 supply records, 3,467 benchmarks — #197 on top of 684bd5c). The selection rule still yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #197 adds no accelerator and no purchase price. What it adds is the first MLPerf LLM rows and the first vendor vLLM table for a part this doc already keeps outside the gate:

  • Jetson AGX Thor still does not qualify, and the new vendor row is a Qwen3-30B-A3B decode on the same 273 GB/s bus. NVIDIA Jetson AGX Thor 128GB is 128 GB unified LPDDR5X at 273 GB/s. That clears the 24 GB fit bar and misses the 300 GB/s bandwidth floor, and there is still no purchase-price supply record at <= $3,000 (the record's accelerator_ids are joined to nothing in data/supply/), so the selection rule keeps it out of the 152. The same arithmetic the ceiling column uses gives 273/20 = 13.7 tok/s (derived), 273/16 = 17.1 tok/s (derived) on the 27B column, and 273/40 = 6.8 tok/s (derived) on the 70B column. NVIDIA's Jetson Benchmarks page (vLLM, JetPack 7.0, input 2048 / output 128, concurrency 1, weight dtype not stated so format_id is null) measures Qwen3 30B-A3B at 61.0 tok/s per request (NVIDIA Jetson page: Thor vLLM Qwen3 30B-A3B, concurrency 1, 61 tok/s). 61.0/13.7 = 4.5× that 20 GB floor (derived) (61.0 ÷ (273/20) = 4.47). The same page's concurrency-8 column is 226.4 tok/s aggregate (NVIDIA Jetson page: Thor vLLM Qwen3 30B-A3B, concurrency 8, 226.4 tok/s aggregate), 226.4/8 = 28.3 per stream (derived) — an aggregate, not a second per-request rate, and not comparable to the 61.0.
  • The dense rows on the same page land under the floor, which is what a dense read looks like on this bus. Qwen3 32B decodes at 13.19 tok/s (NVIDIA Jetson page: Thor vLLM Qwen3 32B, concurrency 1, 13.19 tok/s) against the 27B ceiling of 17.1 → 13.19/17.1 = 0.77× (derived). Llama 3.3 70B decodes at 4.7 tok/s (NVIDIA Jetson page: Thor vLLM Llama 3.3 70B, concurrency 1, 4.7 tok/s) against the 70B ceiling of 6.8 → 4.7/6.8 = 0.69× (derived). A 32B file is larger than the 16 GB denominator and a 70B file is larger than the 40 GB one, and the page does not state the quant, so both ratios are a lower bound on a Q4 read rather than a Q4 measurement. Neither enters §4b: the part is outside the selection rule, and the dtype is unnamed. Llama 3.1 8B at 41.3 tok/s (NVIDIA Jetson page: Thor vLLM Llama 3.1 8B, concurrency 1, 41.3 tok/s) is the wrong byte count for the 20 GB ceiling (41.3/13.7 = 3.0× (derived)) and stays a small-model calibration.
  • The named 35B-A3B target was already on this part, and the new row is not it. The third-party SGLang cell already cited below is Qwen3.6-35B-A3B FP8 at 14.6 tok/s (Jetson AGX Thor SGLang: Qwen3.6-35B-A3B FP8 decode (Multimodalflow)), 14.6/13.7 = 1.07× the same floor (derived). 61.0/14.6 = 4.2× (derived) between the vendor's unnamed-dtype 30B-A3B and that FP8 35B-A3B. Different model, different quant, different engine (vLLM vs SGLang), same bus — the gap is not a claim that Thor got faster, and neither number is a Q4. The 30B-A3B row does not enter the §4b proxy set for the same reason the GB10 note gives: no price, and the part is outside the selection rule. It does corroborate the direction that note already records, that an A3B on 273 GB/s sits several times above the dense-equivalent floor when the quant is not FP8.
  • The MLPerf rows are aggregate throughput, not a decode ceiling. v5.0 llama2-70b-99 FP16 Offline is 573.765 tok/s aggregate on one Thor (MLPerf v5.0 Jetson AGX Thor: llama2-70b-99 Offline 573.765 tok/s aggregate, TensorRT 10.8, open division). Offline is a throughput scenario; the record says so, and 573.765 is not divided into the 6.8 tok/s per-request floor. v6.0 llama3.1-8b-edge FP4 Offline is 350.605 tok/s aggregate (MLPerf v6.0 Jetson AGX Thor: llama3.1-8b-edge Offline 350.605 tok/s aggregate); the SingleStream siblings are TTFT and TPOT, not tok/s, so they are not a ceiling either. None of the 18 new rows is a purchase price, so none moves a $/tok-s rank.

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 4170507 (205 accelerator records, 218 supply records, 3,449 benchmarks — #192, #193, #194 and #195 on top of 166dd51). The selection rule still yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #193 is a 7B model-parameter fill, #194 is the consumer-hardware ingest already reflected in the counts above, and #195 is a services telemetry re-read; none of the three adds an accelerator or a purchase price. #192 adds no accelerator and no purchase price either. What it adds is the flash-attention half of the llama.cpp Vulkan #10879 Llama-2-7B Q4_0 table, 82 rows (41 tg128 + 41 pp512) on cards the selection rule already covers:

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 166dd51 (205 accelerator records, 218 supply records, 3,367 benchmarks — #190 on top of b739d00). The selection rule still yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #190 adds no accelerator and no purchase price. What it adds is the depth sweep §4b said the 3090 Ti did not have, on a part the table already prices at rank 10:

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main d8214c6 (205 accelerator records, 218 supply records, 3,305 benchmarks — #186, #187 and #188 on top of 2c7fa57). The selection rule still yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #186 is a 4B model record and #187 is a services price; neither touches an accelerator, a supply row, or a benchmark. #188 adds no accelerator and no purchase price. What it adds is the first current-generation dense 27B decode on a part §4 already lists and cannot price:

  • Radeon AI PRO R9700, unpriced, fits 35B and 27B, not 70B, and the dense row lands under the 27B ceiling. AMD Radeon AI PRO R9700 is 32 GB GDDR6 at 640 GB/s (same bus as AMD Radeon RX 9070 XT, which is priced and does not fit). 35B ceiling 640/20 = 32.0 tok/s (derived); 27B ceiling 640/16 = 40.0 tok/s (derived). Flags stay Y/Y/- (32 ≥ 24, 32 ≥ 20, 32 < 48). local-llm-benchmarks.dev measures Qwen3.8-27B UD-Q4_K_XL, concurrency 1, depth 0, a 2048-token prompt and 256 generated tokens, TTFT excluded, llama.cpp 0.5.0-dev. ROCm 10.0 decodes at 30.66 tok/s (R9700 1-GPU ROCm Qwen3.8-27B UD-Q4_K_XL depth-0 decode; repeat means 30.826 and 30.485) and prefills at 3,048.78 tok/s (R9700 1-GPU ROCm Qwen3.8-27B UD-Q4_K_XL depth-0 prefill). Vulkan on the same host and the same file decodes at 28.39 (R9700 1-GPU Vulkan RADV Qwen3.8-27B UD-Q4_K_XL depth-0 decode) and prefills at 1,016.06 (R9700 1-GPU Vulkan RADV Qwen3.8-27B UD-Q4_K_XL depth-0 prefill). Against the 27B ceiling that is 30.66/40.0 = 0.77× and 28.39/40.0 = 0.71× (derived). Under the floor, which is what a dense Q4 read looks like on this bus — the same shape the 3090's Qwen3.5-27B Q4_K cell already shows at 0.57× (33.5/58.5), on a different card and a different protocol, so the two ratios are not a ranking. Dividing the same ROCm decode by the 20 GB 35B denominator instead gives 30.66/32.0 = 0.96× (derived), and that division is the wrong byte count for a 27B file; it is not an A3B measurement and it does not enter §4b. The older rows on this card stay where they were: Llama-2-7B Q4_0 tg128 is a small-model calibration (Vulkan 145.67 no-flash-attention, ROCm 97.98 with flash attention), and the Q1_0 Bonsai-27B row is a 3.53 GiB file, not this Q4. No street price, so the card cannot enter §3. The ROCm-vs-Vulkan gap on one file is 30.66 vs 28.39 on decode and 3,048.78 vs 1,016.06 on the 2048-token prefill — a backend gap, not a bandwidth one.

Refresh note (docs/fit-matrix-oct14, Oct-17, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 2c7fa57 (205 accelerator records, 218 supply records, 3,301 benchmarks — #183 and #184 on top of 6180a58). The selection rule now yields 152 qualifying / 43 priced / 109 unpriced (68 of the unpriced fit 35B-A3B, 41 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #184 is a services price refresh and touches no accelerator, supply, or benchmark. #183 adds no purchase price. What it adds to the gate is four bandwidth-qualified cards that fit nothing in this doc's model class, all -/-/-, all unpriced, so they extend the §4 close rather than §3 or §4:

Refresh note (docs/fit-matrix-oct14, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 6180a58 (200 accelerator records, 218 supply records, 3,281 benchmarks — #181 on top of 2925c06). The selection rule is unchanged and still yields 148 qualifying / 43 priced / 105 unpriced (68 of the unpriced fit 35B-A3B, 37 do not). Every priced cell was re-diffed against the generator: id, VRAM, bandwidth, the three fit flags, the 35B ceiling, the supply id, the price, the derived $/tok-s, and the order all match, so the ranked table does not move and no rank below is renumbered. #181 adds no accelerator and no purchase price.

  • The new rows are not the 35B-A3B workload, and they are not cited as measurements here. #181 is 231 third-party llama.cpp rows from geerlingguy/ai-benchmarks issues #36, #39, #40, #45 and #46, covering NVIDIA GeForce RTX 2080 Ti (11 GB, new to this doc), NVIDIA RTX A4000 (16 GB, new to this doc), NVIDIA GeForce RTX 3080 Ti (12 GB), NVIDIA GeForce RTX 3060 12GB (12 GB) and NVIDIA GeForce RTX 4070 Ti (12 GB). All five have vram_gb under 24, so none clears the 35B-A3B fit (20 GB weights + 4 GB KV) or the 70B fit; the 16 GB A4000 also misses the 27B fit (16 + 4). They sit in the 37-row does-not-fit set, not in §3 or §4. The models are TinyLlama 1.1B, Llama-3.2-3B, Llama-2-7B, Llama-2-13B, DeepSeek-R1-Distill-Qwen-14B and gpt-oss-20b, all Q4_K_M — every one of them is the wrong byte count for the 20 GB ceiling, so none enters §4b.

  • Do not divide these records into the ceiling until they are re-transcribed. A spot check of the stored decode_tok_s rows against the tables those five issues actually print matches on 10 rows and disagrees on 46. The stored RTX A4000 gpt-oss-20b tg128 is 168.03 (Geerling llama.cpp Vulkan on rtxa4000 (pc host): gpt-oss-20b Q4_K_M tg128 168.03 tok/s); the issue prints 93.55. The stored RTX 3080 Ti number is 167.86 (Geerling llama.cpp Vulkan on rtx3080ti (pc host): gpt-oss-20b Q4_K_M tg128 167.86 tok/s) against a printed 167.47, and the two cards — 448 GB/s and 912 GB/s — were recorded within 0.2 tok/s of each other, which is the signature of a copied sibling table rather than two measurements. The 2080 Ti and 3060 batches have the same shape of error, including rows for a llama-2-7b run issue #36 does not contain. Quoting a ×-over-floor from them would launder a bad transcription into the ranking. Left for a data pass; not fixed in this doc pass.

Refresh note (docs/fit-matrix-oct17, Oct-17, this pass). Re-ran python tools/fit_matrix_35b.py on local main 2925c06 (200 accelerator records, 218 supply records, 3,050 benchmarks — #179 on top of cd120be). The selection rule still yields 148 qualifying / 43 priced / 105 unpriced (68 of the unpriced fit 35B-A3B, 37 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #179 adds no accelerator and no purchase price. 48 of the 55 new rows are llama.cpp Vulkan #10879 no-flash-attention Llama-2-7B Q4_0 pp512/tg128 pairs on cards this doc already covers (5090, 4090, 5080, 3090, 4080 Super, 5070 Ti, 4070 family, 5060 Ti, 3060, 3080 10GB, 5090 Laptop, 7900 XTX, 9070 XT, R9700, MI50, A100 80GB PCIe, GB10, M4 Max, Tesla P100/P40/M40). A 7B dense model is the wrong byte count for the 20 GB ceiling, so none of them enters §4b and none moves a rank. The seven that are the workload are a second protocol on a part the table already prices:

Refresh note (docs/fit-matrix-oct14, Oct-16, this pass). Re-ran python tools/fit_matrix_35b.py on local main bd282fe (200 accelerator records, 218 supply records, 2,995 benchmarks — #176 and #177 on top of 5b1cadc). The selection rule now yields 148 qualifying / 43 priced / 105 unpriced (68 of the unpriced fit 35B-A3B, 37 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #177 is a services telemetry re-read and touches no accelerator, supply, or benchmark. #176 adds no purchase price. What it does add is a bandwidth that was previously null: FuriosaAI RNGD (Renegade) moved from memory_bandwidth_gbps: null / vram_gb: null to 48 GB HBM3 at 1,500 GB/s (vendor product page, cited on the record). 48 ≥ 24, 48 ≥ 20 and 48 ≥ 48, so the fit flags are Y/Y/Y; the 35B ceiling is 1500/20 = 75.0 tok/s (derived), which slots it in §4 between Biren BR100 GPGPU (2-die OAM training accelerator) (80.0) and Huawei Ascend 910B (70.0). It stays unpriced: the only Furiosa supply row, FuriosaAI RNGD (Renegade) - eval-only, no retail channel, has price_usd: null, kind: oem-direct, and its accelerator_ids still point at the Warboy, not the RNGD. The seven new benchmarks are vendor ranges and multi-card aggregates (4× EXAONE 3.5 32B batch-1 decode, 4× Qwen3-32B aggregate TPS, a Hot Chips ~10B range, a GPT-J 6B queries/s figure). None is a single-card batch-1 A3B decode, so none enters §4b and none moves a rank.

Refresh note (docs/fit-matrix-oct16-3090-a3b, Oct-16, this pass). Re-ran python tools/fit_matrix_35b.py on local main 5b1cadc (200 accelerator records, 218 supply records, 2,988 benchmarks — the Phase-C Oct-16 p20 llama.cpp Vulkan #10879 rows for 12 previously uncovered cards, #172, on top of ece538c). The selection rule now yields 147 qualifying / 43 priced / 104 unpriced (67 of the unpriced fit 35B-A3B, 37 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order), and #172 adds no purchase price. What it does add to the gate is five bandwidth-qualified cards that fit nothing in this doc's model class, all -/-/-, all unpriced, so they extend the §4 close rather than the table: AMD Radeon RX 6800 (16 GB, 512 GB/s, 35B ceiling 25.6 tok/s (derived)), NVIDIA GeForce RTX 2070 SUPER and NVIDIA GeForce RTX 3060 Ti (both 8 GB, 448 GB/s, ceiling 22.4 (derived)), AMD Radeon RX 6750 XT (12 GB, 432 GB/s, ceiling 21.6 (derived)) and AMD Radeon RX 6700 XT (12 GB, 384 GB/s, ceiling 19.2 (derived)). The other seven new records miss the gate: AMD Radeon RX 7600 (288 GB/s), AMD Radeon RX 6650 XT (280), AMD Radeon RX 6600 XT (256) and AMD Radeon RX 6600 (224) are under 300 GB/s with no <= $3,000 purchase record, and Intel Arc B570, NVIDIA GeForce GTX 1080 Ti and NVIDIA RTX A2000 12GB have a null bandwidth. The 44 new benchmarks are Llama-2-7B Q4_0, so none of them is an A3B measurement. What this pass actually lands is a hole in §4b: the part the headline calls the honest mainstream buy, NVIDIA GeForce RTX 3090, had a full Qwen3-30B-A3B Q4_K depth sweep in the corpus since #147 and was never cited. The 4090, 6000 Ada and A6000 sweeps from the same ingest were in the same state. None of them moves a rank — they are the same lab, the same model, a longer context than the one cell §4b already quoted.

Refresh note (docs/fit-matrix-oct14, Oct-16, prior pass). Re-ran python tools/fit_matrix_35b.py on local main a2e890e (188 accelerator records, 218 supply records, 2,944 benchmarks — the Phase-C Oct-16 p19 official DGX Spark llama-bench rows, #169, on top of 1b2f366). The selection rule still yields 142 qualifying / 43 priced / 99 unpriced (67 of the unpriced fit 35B-A3B, 32 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #169 adds no purchase price and no accelerator. What it does add is the first maintainer llama.cpp decode series on a part this doc already treats as outside the gate, and the model is the 30B-A3B class:

Refresh note (docs/fit-matrix-oct14, Oct-16, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 2e37ebe (188 accelerator records, 218 supply records, 2,884 benchmarks — the Phase-C Oct-16 p18 llama.cpp #15013 rows, #167, on top of ed08dce). The selection rule now yields 142 qualifying / 43 priced / 99 unpriced (67 of the unpriced fit 35B-A3B, 32 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #167 adds no purchase price. What it does add is four accelerator records, all of which clear the 8 GB / 300 GB/s gate and none of which has a supply row, plus the first llama.cpp Llama-2-7B Q4_0 tg128 cell on a part §4 already listed:

Refresh note (docs/fit-matrix-oct14, Oct-16, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 1c2a269 (184 accelerator records, 218 supply records, 2,876 benchmarks — the Phase-C Oct-16 p17 tt-metal matrix rows, #165, on top of 3438151). The selection rule still yields 138 qualifying / 43 priced / 95 unpriced (63 of the unpriced fit 35B-A3B, 32 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #165 adds no purchase price and no accelerator. What it does add is the first tt-metal decode numbers on three parts this doc already ranks, and none of them is an A3B-class model, so none of them enters §4b or moves a rank:

Refresh note (docs/fit-matrix-oct14, Oct-16, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 18b33eb (184 accelerator records, 218 supply records, 2,869 benchmarks — the Phase-C Oct-16 p16 Hardware Corner long-context cells, #163, on top of d4b79fb). The selection rule still yields 138 qualifying / 43 priced / 95 unpriced (63 of the unpriced fit 35B-A3B, 32 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #163 adds no purchase price and no accelerator. What it does add, and what this pass lands, is the rest of the context sweep on one §4 part and the first gpt-oss-20B depth rows on two parts that do not fit 35B-A3B:

Refresh note (docs/fit-matrix-oct14, Oct-16, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 16ea04a (184 accelerator records, 218 supply records, 2,813 benchmarks — the Phase-C Oct-16 p13 Ollama / Thor backfill, #161, on top of 37c67d2). The selection rule still yields 138 qualifying / 43 priced / 95 unpriced (63 of the unpriced fit 35B-A3B, 32 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #161 adds no purchase price. What it does add, and what this pass lands, is the first Qwen3.6-35B-A3B measurement in the corpus plus dense cross-checks on two parts this doc already lists as unpriced:

Refresh note (docs/fit-matrix-oct14, Oct-16, prior pass). Re-ran python tools/fit_matrix_35b.py on local main 37c67d2 (184 accelerator records, 218 supply records, 2,801 benchmarks — the llama.cpp Llama-2-7B scoreboard backfill, #159, on top of b7921d5). The selection rule still yields 138 qualifying / 43 priced / 95 unpriced (63 of the unpriced fit 35B-A3B, 32 do not). The ranked $/tok-s table is unchanged: every priced cell was re-diffed against the generator and matches (price, ceiling, fit flags, supply id, order). #159 adds no purchase price and no A3B-class measurement — its rows are Llama-2-7B Q4_0 — so it cannot move this ranking. What this pass does land is one measured A3B row the previous table never cited:

Refresh note (docs/fit-matrix-oct14, Oct-16, prior pass). Re-ran python tools/fit_matrix_35b.py on local main b7921d5 (184 accelerator records, 218 supply records, 2,742 benchmarks). The selection rule now yields 138 qualifying / 43 priced / 95 unpriced (63 of the unpriced fit 35B-A3B, 32 do not). Two things actually moved; the rest of the ranked order did not:

Ranked order of the other 42 priced rows is unchanged from the note below, including the RTX 5070 Ti measured cell at 111.11 tok/s.

Refresh note (docs/fit-matrix-oct14, Oct-16). Re-ran python tools/fit_matrix_35b.py on local main 069e36f (162 accelerator records, 214 supply records). Selection rule still yields 118 qualifying / 42 priced / 76 unpriced (57 of the unpriced fit 35B-A3B, 19 do not). Ranked $/tok-s order is unchanged from the p6 table already on this tree. The only numeric edit is §4b: the RTX 5070 Ti measured decode cell is restored to the benchmark record's own value, 111.11 tok/s (Hardware Corner: RTX 5070 Ti, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 111.11 t/s @16k ctx), not the rounded 111.1 the p6 prose left behind. 2.5× vs the 44.8 tok/s ceiling is unchanged (111.11/44.8 = 2.48, still 2.5× (derived)).

Refresh note (docs/fit-matrix-oct16-p6, Oct-16). Re-run of python tools/fit_matrix_35b.py against local main e128197 (162 accelerator records, 214 supply records, 1,595 benchmarks — the Phase-C Oct-16 p7 benchmark backfill on top of origin/main). The selection rule yields 118 qualifying accelerators, of which 42 have a usable purchase price and 76 are bandwidth-qualified but unpriced (57 of those fit 35B-A3B, 19 do not). The ranked $/tok-s table is unchanged from the Oct-16 docs/fit-matrix-oct14 refresh; what this pass does is land that table on the tree that actually contains the Atlas join and the four §4b rows, and quote two measured values at the record's own precision. Three things moved since the Oct-15 pass-3 doc:

§4 grew from 52 to 57 fit-but-unpriced rows (DGX-1, RTX A6000, A40, RTX 5000 Ada, M1 Max, M2 Max). §4b adds four measured A3B decode rows that landed after the last refresh (RTX PRO 6000 Blackwell, A100 40 GB SXM4, A100 40 GB PCIe, RTX A6000).

Prior refresh (docs/fit-matrix-oct14, third refresh): re-run on the Phase-C Oct-15 pass-3 tree. Ranked table then 41 priced rows; §4 at 52.

Scope, set by the commissioning brief. The target class is a 35B-A3B Mixture-of-Experts model (~3B active parameters at decode), a ~27B dense model, and Llama-3.3-70B at Q4 as the stretch goal. The question is narrow: does it fit, and what is the cheapest $/(tok/s) for the 35B-A3B job. This doc does not try to rank serving quality, concurrency, or prefill — those need the measured-benchmark join in docs/08-cost-per-token.md, not a roofline.

Every number in the tables is either copied verbatim from a record or marked (derived). Derived means the arithmetic is shown below and a reader can re-run it. Nothing here is a measurement.

1. The selection rule (which records got a row)

This build is a re-run of tools/fit_matrix_35b.py on main 81b8382 (236 accelerators, 218 supply, 4,532 benchmarks). The selection rule is unchanged and the counts did not move with #286: 159 qualifying / 43 priced / 116 unpriced (69 of the unpriced fit 35B-A3B, 47 do not). #286 adds a model, not an accelerator and not a purchase price. NVIDIA Nemotron 3.5 Super VL 120B-A12B packs to 55.88 GiB at 4-bit — past the 24 GB bar and past the 48 GB the 70B column tests, inside a 96 GB card. The prior stamp, kept in the note above, was 84256e2 / 4,532 benchmarks. See the refresh note above.

An accelerator record gets a row when all of these hold:

  • vram_gb >= 8 — below this there is no useful quantised-7B headroom either.
  • memory_bandwidth_gbps >= 300 OR it has a linked supply record with a purchase price <= $3,000.

The <= $3,000 arm exists so that a cheap-but-slow card (the used-Tesla slice) is not filtered out by the bandwidth floor before its price can speak. That rule yields 159 qualifying accelerators, of which 43 have a usable purchase price and 116 are bandwidth-qualified but have no bare-card/system price in data/supply/ (69 of those fit 35B-A3B; 47 qualify and do not).

One exception to the vram_gb gate. A unified_memory part (an APU/SoC whose GPU shares the CPU's memory pool) leaves vram_gb null on purpose — there is no dedicated VRAM to report. The >= 8 gate would silently drop it. For those, tools/fit_matrix_35b.py substitutes the configured memory of the cheapest linked supply record (a whole system, so its RAM is the usable pool). Two records need the override: AMD Radeon 8060S (Ryzen AI Max+ integrated GPU) (Strix Halo, 128 GB configured) and AMD EPYC 9554 (Genoa, 64-core, 12-channel DDR5 host CPU) (the 384 GB DDR5 pool of Used single-socket EPYC 9004 'Genoa' build (12ch DDR5, ~384GB)). The Apple Ultra parts already carry an explicit vram_gb.

2. The three fit columns and the one ceiling

Model footprints used for the fit flags (these are the brief's numbers, kept as stated):

workload weights + KV / runtime headroom needs vram_gb >=
35B-A3B MoE, Q4 ~20 GB 4 GB 24 GB
27B dense, Q4 ~16 GB 4 GB 20 GB
70B dense, Q4 ~40 GB 8 GB 48 GB

fit = vram_gb >= (weights + headroom), read off each accelerator record's own vram_gb. A Y means resident on a single device — no multi-GPU span, no offload. The 35B-A3B threshold of 24 GB is why every 24 GB card in the table is a Y by exactly zero margin.

The ceiling. tok/s ceiling (derived) = memory_bandwidth_gbps / model_weights_gb. This is the standard decode roofline: at batch-1 each output token must read the resident weights once, so a perfectly bandwidth-bound decode cannot exceed bandwidth / bytes-read. It is a ceiling, not a forecast — real decode lands well under it because of kernel inefficiency, KV reads, and the fact that a MoE reads only its active experts. It is also optimistic for MoE: a 35B-A3B that activates ~3B/token reads closer to the active-expert bytes than the full 20 GB resident, so the same ceiling formula on a dense-equivalent basis overstates the value of a big resident pool for MoE. The doc divides by the full resident weights (20 GB) anyway, which makes the ceiling a conservative lower bound on the achievable rate and keeps the arithmetic identical across the three columns.

How conservative shows up the moment a low-bandwidth part enters the table: AMD Radeon 8060S (Ryzen AI Max+ integrated GPU) (Strix Halo, 256 GB/s shared) derives to a 12.8 tok/s ceiling on the 20 GB column, but the corpus's own measurement of the exact target model — AMD Ryzen AI Max+ Radeon 8060S iGPU (RDNA 3.5) under Ollama: Qwen3.5 35B-A3B MoE generation throughput, 100% GPU offload — records 42.04 tok/s on it, ~3.3× the derived ceiling, because the MoE reads only ~3B active experts per token, not the 20 GB resident. The roofline ranks capex against a dense-equivalent number; it understates real MoE throughput most where bandwidth is scarcest. Treat every ceiling cell as the floor, not the forecast.

$/tok-s (derived) = cheapest purchase price ÷ the 35B-A3B ceiling. It ranks "how little silicon do I buy to move 20 GB of weights." It is a capex-efficiency figure, not a cost-per-token-served figure — it ignores power, the chassis/baseboard several of these parts need (§5), and that $/tok-s for a 14 tok/s card and a 240 tok/s card are not the same product.

A third calibration sweep landed with the Phase-C pass-5 ingest. The hardware-corner 16k-context sweep now holds five third-party measured decode rows on Qwen3-30B-A3B (MoE) Q4_K XL — the closest corpus proxy to the 35B-A3B target — at a ~16,384-token context, batch-1 per-request:

|| part | measured tok/s | derived ceiling (BW ÷ 20 GB) | measured ÷ ceiling | ||---|---|---|---| || NVIDIA GeForce RTX 3090 Ti | 98.25 (Hardware Corner: RTX 3090 Ti, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 98.25 t/s @16k ctx) | 50.4 | 1.95× | || NVIDIA GeForce RTX 4090 | 109.57 (Hardware Corner: RTX 4090, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 109.57 t/s @16k ctx) | 50.4 | 2.17× | || NVIDIA RTX 6000 Ada Generation | 104.88 (Hardware Corner: RTX 6000 Ada, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 104.88 t/s @16k ctx) | 48.0 | 2.19× | || NVIDIA GeForce RTX 4080 (16 GB) | 85.04 (Hardware Corner: RTX 4080, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 85.04 t/s @16k ctx) | 35.8 | 2.37× | || NVIDIA GeForce RTX 5070 Ti | 111.11 (Hardware Corner: RTX 5070 Ti, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 111.11 t/s @16k ctx) | 44.8 | 2.48× |

Two of the five (3090 Ti, 4090) are also priced rows in §3 — the ranking on them can now be sanity-checked against a measured number: both beat their dense roofline by ~2× at 16k context, corroborating the direction the Strix Halo anchors set (MoE reads ~3B active bytes, not the resident 20 GB). The ordering is not pure bandwidth — the 5070 Ti (896 GB/s) edges the 4090 (1,008 GB/s) at 16k, so generation/architecture effects are real at long context — but every measured value sits above its derived ceiling, i.e. the ceilings in the table remain floors, and the $/tok-s ranking undervalues nothing below a measured anchor. Caveat: the hwcorner sweep measures 30B-A3B, not the 35B-A3B target — the active-parameter ratio is the same shape (~3B active of ~30B vs ~3B of ~35B resident), so the direction transfers, not the exact figure.

3. Ranked: purchase-priced parts by $/tok-s for the 35B-A3B job

Sorted by derived $/tok-s, lowest first. Fits columns are 35B/27B/70B. Only rows with a usable purchase price appear; the ← supply column is the record the price was read from. A Y on Fits is bolded. Every ceiling and every $/tok-s cell is (derived): ceiling = memory_bandwidth_gbps / 20 and $/tok-s = price / ceiling.

rank accelerator VRAM BW GB/s Fits 35B ceil (derived) price ← supply $/tok-s (derived)
1 NVIDIA Tesla P100 SXM2 16GB (GP100) 16 732 -/-/- 36.6 $115 eBay used NVIDIA Tesla P100 16GB PCIe card 3.14
2 Intel Arc B580 12 456 -/-/- 22.8 $199.99 Newegg Refreshed (first-party refurbished) Intel Arc B580 12GB tier 8.77
3 NVIDIA V100 SXM2 32GB 32 900 Y/Y/- 45.0 $500 eBay used NVIDIA V100 32GB SXM2 bare module (needs carrier + heatsink) 11.11
4 AMD Instinct MI100 32 1228 Y/Y/- 61.4 $720 eBay used AMD Instinct MI100 32GB 11.73
5 NVIDIA Tesla M40 24GB 24 288 Y/Y/- 14.4 $189 Used / secondary market: NVIDIA Tesla M40 24GB (mining-era / server pull) 13.12
6 Intel Gaudi 2 96 2460 Y/Y/Y 123.0 $2,000 eBay used Intel Gaudi 2 HL-225(B) 96GB OAM module 16.26
7 NVIDIA V100 32GB PCIe 32 900 Y/Y/- 45.0 $750 eBay used NVIDIA V100 32GB PCIe card (ex-datacenter pull) 16.67
8 NVIDIA Tesla P40 24GB 24 347 Y/Y/- 17.4 $290 eBay used NVIDIA Tesla P40 24GB (multi-option-listing trap priced in) 16.71
9 AMD Radeon RX 7900 XTX 24 960 Y/Y/- 48.0 $875 Used AMD RX 7900 XTX 24GB (eBay/peer market) 18.23
10 NVIDIA GeForce RTX 3090 Ti 24 1008 Y/Y/- 50.4 $950 Used RTX 3090 Ti 24GB - Oct-2026 band 18.85
11 NVIDIA GeForce RTX 3090 24 936 Y/Y/- 46.8 $950 Used NVIDIA RTX 3090 24GB - Oct-2026 corrected street price 20.30
12 NVIDIA GeForce RTX 5090 32 1792 Y/Y/- 89.6 $1,999 NVIDIA Marketplace (US consumer GPU storefront) 22.31
13 Huawei Ascend 310P (Da Vinci edge inference NPU) 24 204.8 Y/Y/- 10.2 $265 Used Huawei Ascend 310P (Atlas 300I Pro, 24GB) 25.88
14 Huawei Atlas 300I Pro inference card (24 GB, 310-series) 24 204.8 Y/Y/- 10.2 $265 Taobao used Huawei Atlas 300I Pro (Ascend 310P) 24GB 25.88
15 AMD Radeon RX 9070 XT 16 640 -/-/- 32.0 $829 Used / secondary market: AMD Radeon RX 9070 XT 16GB (open-box / marketplace) 25.91
16 Intel Arc Pro B60 24 456 Y/Y/- 22.8 $650 New Intel Arc Pro B60 24GB retail 28.51
17 Cambricon MLU370 (Siyuan 370) AIDC accelerators 48 307.2 Y/Y/Y 15.4 $450 Used Cambricon MLU370-S4 (48GB LPDDR5) PCIe card 29.30
18 AMD Instinct MI250 128 3200 Y/Y/Y 160.0 $4,950 eBay used AMD Instinct MI250/MI250X 128GB OAM 30.94
19 AMD Instinct MI250X 128 3200 Y/Y/Y 160.0 $4,950 eBay used AMD Instinct MI250/MI250X 128GB OAM 30.94
20 Intel Arc Pro B70 32 608 Y/Y/- 30.4 $949 New Intel Arc Pro B70 32GB (Newegg preorder) 31.22
21 NVIDIA A100 40GB SXM4 40 1555 Y/Y/- 77.8 $2,499 eBay used bare A100 40GB SXM4 module (ex-datacenter pull, compliance-gated) 32.14
22 NVIDIA GeForce RTX 4090 24 1008 Y/Y/- 50.4 $2,000 eBay used graphics-card market (GeForce RTX 4090 as reference used accelerator) 39.68
23 AMD Instinct MI210 64 1600 Y/Y/Y 80.0 $4,000 eBay used AMD Instinct MI210 64GB 50.00
24 Tenstorrent Wormhole n300 24 576 Y/Y/- 28.8 $1,449 New Tenstorrent Wormhole n300 50.31
25 Tenstorrent Blackhole Tensix (p100a / p150a / p150b) 32 512 Y/Y/- 25.6 $1,399 New Tenstorrent Blackhole p150 (retail) 54.65
26 Qualcomm Cloud AI 100 (family: HHHL-Pro / HHHL-Std / HHHL-Lite / Dual M.2 / Dual M.2e) 32 137 Y/Y/- 6.8 $400 Used Qualcomm Cloud AI 100 (Standard/Pro PCIe card) 58.39
27 Cambricon MLU270-S4 16 102.4 -/-/- 5.1 $317 eBay used Cambricon MLU270-S4 61.91
28 Apple M1 Ultra (Mac Studio, 2022) 128 800 Y/Y/Y 40.0 $2,500 Used Apple Mac Studio M1 Ultra 128GB 62.50
29 Tenstorrent Grayskull Tensix (e75 / e150) 8 118 -/-/- 5.9 $400 Used Tenstorrent Grayskull e75/e150 67.80
30 Tenstorrent Wormhole Tensix (n150 / n300) 12 288 -/-/- 14.4 $999 New Tenstorrent Wormhole n150 69.38
31 NVIDIA H100 SXM 80 3350 Y/Y/Y 167.5 $12,999 eBay used bare H100 SXM5 80GB module (single-module listing, tested) 77.61
32 NVIDIA A100 40GB PCIe 40 1555 Y/Y/- 77.8 $7,000 eBay used A100 40GB PCIe card 90.03
33 Apple M2 Ultra 192 800 Y/Y/Y 40.0 $3,700 Used Apple Mac Studio M2 Ultra 192GB 92.50
34 NVIDIA RTX PRO 6000 Blackwell Workstation Edition 96 1792 Y/Y/Y 89.6 $8,650 New RTX PRO 6000 Blackwell 96GB 96.54
35 NVIDIA A100 80GB SXM4 80 2039 Y/Y/Y 102.0 $10,449.95 eBay: bare used datacenter accelerator modules (A100 80GB SXM4 observed) 102.50
36 NVIDIA A100 80GB PCIe 80 1935 Y/Y/Y 96.8 $12,099 eBay used bare A100 80GB PCIe cards (the mainstream ex-datacenter consumer path) 125.05
37 AMD Radeon 8060S (Ryzen AI Max+ integrated GPU) 128* 256 Y/Y/Y 12.8 $1,900 New Minisforum MS-S1 MAX 128GB (Strix Halo) 148.44
38 AMD Ryzen AI Max+ 395 (Framework Desktop, Strix Halo) 128 256 Y/Y/Y 12.8 $2,099 New Beelink GTR9 Pro 128GB 163.98
39 Apple M3 Max (MacBook Pro 16-inch, Nov 2023) 128 400 Y/Y/Y 20.0 $3,400 eBay used MacBook Pro M3 Max 16in 128GB (Oct 2026) 170.00
40 Apple M4 Max (MacBook Pro 14-inch, 2024) 128 546 Y/Y/Y 27.3 $4,700 eBay used MacBook Pro M4 Max 16in 128GB (Oct 2026) 172.16
41 Apple M3 Ultra (Mac Studio, 2025) 512 819 Y/Y/Y 41.0 $9,000 eBay used Mac Studio M3 Ultra 512GB (Oct 2026) 219.78
42 AMD EPYC 9554 (Genoa, 64-core, 12-channel DDR5 host CPU) 384* 460.8 Y/Y/Y 23.0 $7,500 Used single-socket EPYC 9004 'Genoa' build (12ch DDR5, ~384GB) 325.52
43 NVIDIA H100 PCIe 80 2000 Y/Y/Y 100.0 $43,000 Used / secondary market: NVIDIA H100 80GB PCIe (bare card, ASKING band) 430.00

* Two rows are unified_memory and the capacity shown is not the record's vram_gb (that field is null). The 8060s Strix Halo 128 GB is the configured LPDDR5x pool of the cheapest linked supply record (New Minisforum MS-S1 MAX 128GB (Strix Halo)). The EPYC 9554 384 GB is the configured DDR5 pool of Used single-socket EPYC 9004 'Genoa' build (12ch DDR5, ~384GB) — a whole self-build, not a bare CPU. The sibling amd-ryzen-ai-max-395-framework-desktop record carries an explicit vram_gb=128 for the same Strix Halo silicon, priced at the Beelink whole-system row. See §1 and §6.

The headline read

4. Qualified but no purchase price — the "fits, can't price it" list

These records satisfy the bandwidth/fit rule and fit 35B-A3B but have no bare-card or system purchase price in data/supply/ (they may have a rental price in the cloud records — that is a different join, see tools/cost_per_token.py). Listed so a future supply pass can close them; sorted by the 35B ceiling (derived). 69 rows. This pass adds NVIDIA Tesla K80 (24 GB board total, 480 GB/s, ceiling 24.0 (derived), Y/Y/- — dual GK210, and the scoreboard row is one 12 GB GPU; see the refresh note). The prior pass added FuriosaAI RNGD (Renegade) (48 GB, 1,500 GB/s, ceiling 75.0 (derived), Y/Y/Y, no purchase price — see the refresh note). The prior pass added the four #167 records: NVIDIA GeForce RTX 4090 D (China, AD102-250) (1,008 GB/s, tied on ceiling with the priced 4090), NVIDIA GeForce RTX 5090 Laptop GPU (GB203, 24 GB) (896 GB/s, tied with the PRO 4500 Blackwell), NVIDIA Quadro RTX 8000 (Turing, 48 GB) (48 GB, fits 70B) and NVIDIA Quadro RTX 6000 (Turing, 24 GB) (24 GB, does not) — both 672 GB/s, tied with the PRO 4000 Blackwell.

accelerator VRAM BW GB/s Fits 35B ceil (derived) note
Huawei CloudMatrix 384 (CM384) supernode — 384x Ascend 910C 49,152 1,228,800 Y/Y/Y 61440.0 384-socket supernode; whole-rack figures, no unit price
AMD Instinct MI350X 288 8,000 Y/Y/Y 400.0 integrator/OEM channel only (AMD Instinct GPU server solutions via AMD's OEM and system-builder partners)
AMD Instinct MI355X 288 8,000 Y/Y/Y 400.0 integrator + cloud-hour only
NVIDIA GB200 NVL72 (per-accelerator) 186 8,000 Y/Y/Y 400.0 rack unit, not a bare card
NVIDIA GB300 (Blackwell Ultra GPU as fitted in the GB300 NVL72 rack, per-GPU figures) 279 8,000 Y/Y/Y 400.0 rack unit, not a bare card
NVIDIA B200 180 7,700 Y/Y/Y 385.0 enterprise/cloud channel only
NVIDIA B300 (Blackwell Ultra) 270 7,700 Y/Y/Y 385.0 enterprise/cloud channel only
Google TPU7x (Ironwood) 192 7,380 Y/Y/Y 369.0 cloud only
AMD Instinct MI325X 256 6,000 Y/Y/Y 300.0 integrator/OEM only
AMD Instinct MI300A 128 5,300 Y/Y/Y 265.0 APU variant, integrator only
AMD Instinct MI300X 192 5,300 Y/Y/Y 265.0 integrator + cloud-hour (Oracle OCI bare-metal AMD Instinct MI300X / MI355X per-GPU-hour list price)
AWS Trainium3 144 4,900 Y/Y/Y 245.0 AWS only
NVIDIA H200 NVL 141 4,800 Y/Y/Y 240.0 integrator only
NVIDIA H200 SXM 141 4,800 Y/Y/Y 240.0 cloud/rental only
Rebellions Rebel100 144 4,800 Y/Y/Y 240.0 no price record
AMD Instinct MI350P 144 4,000 Y/Y/Y 200.0 integrator only
NVIDIA GH200 Grace Hopper (96GB HBM3) 96 4,000 Y/Y/Y 200.0 unified-memory Grace+Hopper superchip; integrator/cloud only
NVIDIA H20 96 4,000 Y/Y/Y 200.0 export part; the 37-ridge decode specialist of 09-model-memory-envelope
NVIDIA H100 NVL 94 3,938 Y/Y/Y 196.9 cloud/integrator only
Intel Gaudi 3 (HL-325 OAM / HL-338 PCIe) 128 3,700 Y/Y/Y 185.0 integrator only
Intel Data Center GPU Max 1550 128 3,276 Y/Y/Y 163.8 no price
Huawei Ascend 910C (dual-910B package) 128 3,200 Y/Y/Y 160.0 no price record
AWS Trainium2 96 2,875 Y/Y/Y 143.8 AWS only
Google Cloud TPU v5p 95 2,765 Y/Y/Y 138.2 cloud only
Cambricon MLU590 (Siyuan 590) training accelerator 192 2,400 Y/Y/Y 120.0 no price record
Google Cloud TPU v6e (Trillium) 32 1,638 Y/Y/- 81.9 cloud only
Biren BR100 GPGPU (2-die OAM training accelerator) 64 1,600 Y/Y/Y 80.0 no price record
FuriosaAI RNGD (Renegade) 48 1,500 Y/Y/Y 75.0 eval-only, no retail price (FuriosaAI RNGD (Renegade) - eval-only, no retail channel is price_usd: null and still points at the Warboy); bandwidth is a vendor claim
Huawei Ascend 910B 64 1,400 Y/Y/Y 70.0 no price record
NVIDIA RTX PRO 5000 72GB Blackwell Workstation Edition 72 1,344 Y/Y/Y 67.2 no bare-card price in supply/; #283's first four cells are Ollama with the quant unstated — deepseek-r1:32b 32.89 (0.39× the 84.0 tok/s 27B ceiling, (derived)), gpt-oss:20b 149.38 (2.22× the 67.2 floor, wrong byte count for a ~21B MoE), qwen3-coder-next 74.34 (~51 GB, 2.82× a 51 GB read). Not an A3B cell, so not in §4b — see the Oct-18 #283 note
NVIDIA RTX PRO 5000 Blackwell Workstation Edition 48 1,344 Y/Y/Y 67.2 no bare-card price in supply/
Google Cloud TPU v4 32 1,200 Y/Y/- 60.0 cloud only
Apple M5 Ultra (Mac Studio, 2026) 512 1,200 Y/Y/Y 60.0 no bare-part price
AMD Radeon Instinct MI50X 32 1,024 Y/Y/- 51.2 no price record
AMD Radeon Instinct MI60 32 1,024 Y/Y/- 51.2 no price record
NVIDIA GeForce RTX 4090 D (China, AD102-250) 24 1,008 Y/Y/- 50.4 China-only 4090 cut; same 1,008 GB/s, no bare-card price
NVIDIA RTX 6000 Ada Generation 48 960 Y/Y/Y 48.0 cloud/rental only; 48 GB fit, thin BW
NVIDIA A30 24 933 Y/Y/- 46.6 enterprise-distributor only
Google Cloud TPU v3 32 900 Y/Y/- 45.0 cloud only
NVIDIA DGX-1 (8x Tesla V100 32GB SXM2, NVLink) 256 900 Y/Y/Y 45.0 8-GPU server; the $4,000 chassis rows are system prices, not joined (see §6)
NVIDIA GeForce RTX 5090 Laptop GPU (GB203, 24 GB) 24 896 Y/Y/- 44.8 mobile GB203, not the desktop 5090; no bare-GPU price
NVIDIA RTX PRO 4500 Blackwell Workstation Edition 32 896 Y/Y/- 44.8 no price record
AMD Radeon PRO W7900 48 864 Y/Y/Y 43.2 no price record; #246's llama.cpp Qwen3.5-35B-A3B Q4_K_M is 123.7 tok/s AMDVLK, 2.86× the 43.2 floor (derived) — see the Oct-17 #246 note and §4b
NVIDIA L40 (Ada, 48 GB) 48 864 Y/Y/Y 43.2 no bare-card price in supply/; Ada sibling of the L40S
NVIDIA L40S 48 864 Y/Y/Y 43.2 cloud/rental only; second-highest ridge in the repo per docs/09
AWS Inferentia2 32 820 Y/Y/- 41.0 AWS only
Apple M4 Ultra (Mac Studio, 2025) 192 819 Y/Y/Y 41.0 no bare-part price; whole-Mac-Studio silicon
AWS Trainium (first generation, Trn1 / Trn1n) 32 800 Y/Y/- 40.0 AWS only
Moore Threads MTT S4000 LLM training/inference accelerator 48 768 Y/Y/Y 38.4 no price record
NVIDIA RTX A5000 24 768 Y/Y/- 38.4 no bare-card price in supply/
NVIDIA RTX A6000 48 768 Y/Y/Y 38.4 no bare-card price in supply/
NVIDIA A40 48 696 Y/Y/Y 34.8 no bare-card price in supply/
NVIDIA Quadro RTX 6000 (Turing, 24 GB) 24 672 Y/Y/- 33.6 Turing TU102, not the 6000 Ada; no price record
NVIDIA Quadro RTX 8000 (Turing, 48 GB) 48 672 Y/Y/Y 33.6 48 GB Turing; fits 70B, same BW as the 6000; no price record
NVIDIA RTX PRO 4000 Blackwell 24 672 Y/Y/- 33.6 no bare-card price in supply/
AMD Radeon AI PRO R9700 32 640 Y/Y/- 32.0 no price record; dense 27B Q4 measured at 30.66 tok/s ROCm (0.77× the 40.0 tok/s 27B ceiling, (derived) — see the Oct-17 #188 note). #219's 2× vLLM FP8 cell is 135.853 tok/s at concurrency 8 and does not move this row (see the Oct-17 #219 note). #232's single-card Qwen3.6-35B-A3B UD-Q4_K_XL is 114.19 tok/s Vulkan / 76.43 ROCm, 3.57× / 2.39× the 32.0 floor (derived) — see the Oct-17 #232 note and §4b. #240's LFM2.5-1.2B BF16 ROCm cell is 184.234 tok/s, 5.76× the 32.0 floor (derived) — a 1.2B, not the 35B-A3B, so it does not enter §4b (see the Oct-17 #240 note) #246's llama.cpp Q4_K_M (~2.9K prompt) is 133.0 AMDVLK / 112.0 RADV / 68.8 ROCm, 4.16× / 3.50× / 2.15× the 32.0 floor (derived) — see the Oct-17 #246 note and §4b
Cambricon MLU370-X8 AIDC accelerator (dual Siyuan 370, train+infer) 48 614.4 Y/Y/Y 30.7 dual-die card; no price record
Apple M5 Max (MacBook Pro 14-inch, 2026) 128 614 Y/Y/Y 30.7 no bare-part price
NVIDIA A10 24 600 Y/Y/- 30.0 cloud/distributor only
NVIDIA RTX 5000 Ada Generation 32 576 Y/Y/- 28.8 no bare-card price in supply/
Qualcomm Cloud AI 100 Ultra (AI200 accelerator) 128 548 Y/Y/Y 27.4 no price record
AMD Radeon PRO V620 32 512 Y/Y/- 25.6 no price record
Huawei Ascend 950DT NPU (per-accelerator, Atlas 650E / 950 SuperPoD) 96 500 Y/Y/Y 25.0 no price record
NVIDIA Tesla K80 24 480 Y/Y/- 24.0 dual GK210, 12 GB / 240 GB/s per GPU; scoreboard row is one GPU; no price
Huawei Atlas 300I Duo inference card (dual 310-series, 48/96 GB) 96 408 Y/Y/Y 20.4 no price record (the 24 GB Pro sibling is priced; this Duo is not)
Apple M1 Max 64 400 Y/Y/Y 20.0 no bare-part price; laptop/desktop silicon
Apple M2 Max (MacBook Pro 14/16-inch & Mac Studio, 2023) 96 400 Y/Y/Y 20.0 no bare-part price; named 35B-A3B Q4_K_M measured at 58.56 tok/s on the 30-core / 32 GB SKU (2.93× the 20.0 ceiling, (derived) — the record's 400 GB/s is the 38-core figure; see the Oct-17 #209 note)
Apple M5 Pro (MacBook Pro 14-inch, 2026) 64 307 Y/Y/Y 15.3 no bare-part price
NVIDIA L4 24 300 Y/Y/- 15.0 cloud/distributor only

Forty-seven further accelerators qualify on the bandwidth-or-price rule and do not fit 35B-A3B (all unpriced). The highest-bandwidth near-misses, all -/-/- except the two 20 GB parts which fit 27B only: AMD Radeon Pro VII (16 GB, 1024 GB/s), NVIDIA GeForce RTX 5080 (16 GB, 960), NVIDIA GeForce RTX 3080 Ti (12 GB, 912), NVIDIA GeForce RTX 5070 Ti (16 GB, 896), Google Cloud TPU v5e (16 GB, 819), AMD Radeon RX 7900 XT (20 GB, 800, -/Y/-), NVIDIA GeForce RTX 3080 10GB (10 GB, 760), NVIDIA GeForce RTX 4080 SUPER / NVIDIA GeForce RTX 4080 (16 GB), Google Cloud TPU v2 (16 GB, 700), NVIDIA GeForce RTX 5070 (12 GB, 672), NVIDIA GeForce RTX 4070 Ti SUPER, AMD Radeon RX 9070 (16 GB, 640), NVIDIA RTX A4500 (20 GB, 640, -/Y/-), and NVIDIA RTX 4000 Ada Generation (20 GB, 360 GB/s, -/Y/-). Five of the thirty-seven are new with #172 and sit at the bottom of that list, all -/-/-: AMD Radeon RX 6800 (16 GB, 512 GB/s, 35B ceiling 25.6 tok/s (derived)), NVIDIA GeForce RTX 2070 SUPER and NVIDIA GeForce RTX 3060 Ti (both 8 GB, 448 GB/s, 22.4), AMD Radeon RX 6750 XT (12 GB, 432 GB/s, 21.6) and AMD Radeon RX 6700 XT (12 GB, 384 GB/s, 19.2). Four of the forty-one are new with #183 and sit in that same does-not-fit list, all -/-/- and all unpriced: AMD Radeon VII (16 GB, 1,024 GB/s, 35B ceiling 51.2 tok/s (derived) — tied with AMD Radeon Pro VII on bandwidth, and the highest-bandwidth near-miss in the set), Intel Arc A770 16GB (16 GB, 560 GB/s, ceiling 28.0 (derived)), AMD Radeon RX Vega 64 (8 GB, 484 GB/s, ceiling 24.2 (derived)) and AMD Radeon RX Vega 56 (8 GB, 410 GB/s, ceiling 20.5 (derived)). NVIDIA TITAN V shipped in the same ingest and is not one of the 43: its bandwidth is null, so it never clears the gate. Two of the forty-three are new with #206 and sit in that same does-not-fit list, both -/-/- and both unpriced: Intel Arc A750 8GB (8 GB, 512 GB/s, 35B ceiling 25.6 tok/s (derived) — tied with the 16 GB RX 6800 / 6800 XT / 6900 XT on bandwidth) and AMD Radeon Pro W5700 (8 GB, 448 GB/s, ceiling 22.4 tok/s (derived) — tied with the RX 5700 XT and the RTX 2070 SUPER / 3060 Ti / 3070). Four of the forty-seven are new with #214 and sit in that same does-not-fit list, all -/-/- and all unpriced: NVIDIA TITAN Xp (12 GB, 547.7 GB/s, 35B ceiling 27.4 tok/s (derived)), AMD Radeon Instinct MI25 (16 GB, 484 GB/s, ceiling 24.2 (derived) — tied with the RX Vega 64), NVIDIA GeForce RTX 2060 SUPER (8 GB, 448 GB/s, ceiling 22.4 (derived) — tied with the RX 5700 XT and the RTX 2070 SUPER / 3060 Ti / 3070) and NVIDIA Quadro RTX 4000 (8 GB, 416 GB/s, ceiling 20.8 (derived)). The full 159-row list, including these 47, is python tools/fit_matrix_35b.py.

4b. Roofline vs. measured — the A3B-MoE cross-check

The 35B ceiling column divides by the full resident 20 GB, which makes it a dense-equivalent floor for a MoE that reads only ~3B active per token (§2). The Phase-C benchmark backfill landed 22+ third-party decode_tok_s records on real A3B-class MoE models (Qwen3-30B-A3B / Qwen3.5/3.6-35B-A3B, Q4-class quants, batch-1 per-request) — enough to check how far off the floor each part actually lands. measured ÷ ceiling below is derived arithmetic; the measured numbers themselves come from the cited records.

accelerator BW GB/s ceiling (derived) measured tok/s × over floor (derived) benchmark record
NVIDIA GeForce RTX 5090 1792 89.6 234.3 2.6× RTX 5090 llama.cpp: Qwen3 30B-A3B (MoE) Q4_K_XL decode at 4k ctx (Hardware Corner) (4k; a second page on the same card, same quant, same depth is 226.1 → 2.5× NVIDIA RTX 5090 llama.cpp: Qwen3 30B A3B (Q4_K) token generation at 4k context, 226.1/89.6 = 2.52 (derived). The two are not averaged.)
NVIDIA RTX PRO 5000 Blackwell Workstation Edition 1344 67.2 188.8 2.8× RTX PRO 5000 Blackwell llama.cpp: Qwen3 30B-A3B (MoE) decode at 4k (Hardware Corner) (4k; 16k is 148.5 → 2.2×, RTX PRO 5000 Blackwell llama.cpp: Qwen3 30B-A3B (MoE) decode at 16k (Hardware Corner). #163 continues the same series: 123.2 at 32k → 1.8× RTX PRO 5000 Blackwell llama.cpp: Qwen3 30B-A3B (MoE) tg at 32k (Hardware Corner), 91.9 at 64k → 1.4× RTX PRO 5000 Blackwell llama.cpp: Qwen3 30B-A3B (MoE) tg at 64k (Hardware Corner), 61.4 at 128k → 0.91× RTX PRO 5000 Blackwell llama.cpp: Qwen3 30B-A3B (MoE) tg at 128k (Hardware Corner), 37.0 at 256k → 0.55× RTX PRO 5000 Blackwell llama.cpp: Qwen3 30B-A3B (MoE) tg at 256k (Hardware Corner). All ÷ 67.2, (derived). The floor is crossed between 64k and 128k. Unpriced — §4, not §3.)
NVIDIA GeForce RTX 4090 1008 50.4 207.3 4.1× Hardware Corner Mar 2026: RTX 4090 Qwen3 30B A3B (Q4_K) decode @ 4k ctx (4k; same series 139.2 at 16k → 2.8× Hardware Corner Mar 2026: RTX 4090 Qwen3 30B A3B (Q4_K) decode @ 16k ctx, 105.1 at 32k → 2.1× Hardware Corner Mar 2026: RTX 4090 Qwen3 30B A3B (Q4_K) decode @ 32k ctx, 68.2 at 64k → 1.4× Hardware Corner Mar 2026: RTX 4090 Qwen3 30B A3B (Q4_K) decode @ 64k ctx. All ÷ 50.4, (derived). The 109.57 cell at 16k Hardware Corner: RTX 4090, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 109.57 t/s @16k ctx is a different page and still stands. The card stays above the floor through 64k.)
NVIDIA GeForce RTX 3090 Ti 1008 50.4 98.25 1.9× Hardware Corner: RTX 3090 Ti, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 98.25 t/s @16k ctx (16k; the 32k cell on the same card is 91.97 → 1.8×, Hardware Corner: RTX 3090 Ti 24GB, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 91.97 t/s @32k ctx, 91.97/50.4 = 1.82 (derived). The March per-card page adds the 4k cell this row used to say was missing: 166.9 → 3.3×, RTX 3090 Ti llama.cpp: Qwen3 30B-A3B (MoE) decode at 4k (Hardware Corner per-card page), 166.9/50.4 = 3.31 (derived), and reprints 16k at 121.9 and 32k at 92.0 — RTX 3090 Ti llama.cpp: Qwen3 30B-A3B (MoE) decode at 16k (Hardware Corner per-card page), RTX 3090 Ti llama.cpp: Qwen3 30B-A3B (MoE) decode at 32k (Hardware Corner per-card page). The 32k pair agrees (92.0 vs 91.97); the 16k pair does not (121.9 vs 98.25). Both kept, not averaged. See the refresh note.)
NVIDIA GeForce RTX 3090 936 46.8 179.0 3.8× Hardware Corner Mar 2026: RTX 3090 Qwen3 30B A3B (Q4_K) decode @ 4k ctx (4k; same Q4_K series is 98.3 at 16k → 2.1× Hardware Corner Mar 2026: RTX 3090 Qwen3 30B A3B (Q4_K) decode @ 16k ctx, 58.8 at 32k → 1.3× Hardware Corner Mar 2026: RTX 3090 Qwen3 30B A3B (Q4_K) decode @ 32k ctx, 32.8 at 64k → 0.70× Hardware Corner Mar 2026: RTX 3090 Qwen3 30B A3B (Q4_K) decode @ 64k ctx. All ÷ 46.8, (derived). The floor is crossed between 32k and 64k. A second 4k page on this card is 153.6 → 3.3× NVIDIA RTX 3090 llama.cpp: Qwen3 30B A3B (Q4_K) token generation at 4k context; the two are not averaged.)
NVIDIA RTX 6000 Ada Generation 960 48.0 199.6 4.2× Hardware Corner Mar 2026: RTX 6000 Ada Qwen3 30B A3B (Q4_K) decode @ 4k ctx (4k; same series 120.1 at 16k → 2.5× Hardware Corner Mar 2026: RTX 6000 Ada Qwen3 30B A3B (Q4_K) decode @ 16k ctx, 74.3 at 32k → 1.5× Hardware Corner Mar 2026: RTX 6000 Ada Qwen3 30B A3B (Q4_K) decode @ 32k ctx, 40.8 at 64k → 0.85× Hardware Corner Mar 2026: RTX 6000 Ada Qwen3 30B A3B (Q4_K) decode @ 64k ctx. All ÷ 48.0, (derived). The floor is crossed between 32k and 64k. The 104.88 cell at 16k Hardware Corner: RTX 6000 Ada, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 104.88 t/s @16k ctx is a different page and still stands. Unpriced — §4.)
NVIDIA GeForce RTX 5070 Ti 896 44.8 111.11 2.5× Hardware Corner: RTX 5070 Ti, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 111.11 t/s @16k ctx
NVIDIA GeForce RTX 4080 (16 GB) 716.8 35.8 85.04 2.4× Hardware Corner: RTX 4080, llama.cpp CUDA, Qwen3 30B-A3B (MoE) Q4_K XL GGUF, decode 85.04 t/s @16k ctx
Apple M5 Max (MacBook Pro 14-inch, 2026) 614 30.7 128.0 4.2× ss-m5max-48-qwen35-35b-mlx-4bit decode (MLX path; llama.cpp Q4_K_M row lands 89.4 → 2.9×, ss-m5max-48-qwen35-35b-llamacpp-q4km decode)
Apple M4 Max (MacBook Pro 14-inch, 2024) 546 27.3 113.33 4.2× MLX-LM on 64GB Apple M4 Max: Qwen3-30B-A3B-Instruct-2507 4-bit generation throughput (128 tokens)
Apple M4 Max (MacBook Pro 14-inch, 2024) 546 27.3 92.09 3.4× ss-m4max-40core-qwen3-30b-mlx-q4 decode (second, community run on the same part)
Apple M4 Max (MacBook Pro 14-inch, 2024) 546 27.3 91.47 3.35× M4 Max 128GB llama.cpp b8353 Qwen3.5-35B-A3B Q4_K_M tg128 depth 0 (llama.cpp b8353, Qwen3.5-35B-A3B Q4_K_M, tg128, depth 0, batch 1. 91.47/27.3 = 3.35 (derived). Depth 8192 is 82.31 → 3.02×, M4 Max 128GB llama.cpp b8353 Qwen3.5-35B-A3B Q4_K_M tg128 depth 8192, 82.31/27.3 = 3.02 and 82.31/91.47 = 0.900 (derived). 91.47/92.09 = 0.993 against the community MLX cell above — not averaged, different engine. The dense Q4_K_M sibling is under its own floor: 24.18/34.125 = 0.71×, M4 Max 128GB llama.cpp b8353 Qwen3.5-27B Q4_K_M tg128 depth 0. Rank 40, $4,700 whole laptop. See the Oct-17 #235 note.)
Apple M1 Max 400 20.0 58.5 2.93× M1 Max 64GB llama-server b8139 Qwen3-Coder-30B-A3B IQ4_XS generation average (llama-server b8139, generation average inside a 4096 cap, prompt length unpublished — not a pp512/tg128 cell. 58.5/20.0 = 2.93 (derived). Same prompt set: Nemotron-3-Nano-30B-A3B Q4_K_XL 43.7 → 2.19× M1 Max 64GB llama-server b8139 Nemotron-3-Nano-30B-A3B Q4_K_XL generation average, GLM-4.7-Flash Q4_K_XL 36.8 → 1.84× M1 Max 64GB llama-server b8139 GLM-4.7-Flash Q4_K_XL generation average. 58.5/43.7 = 1.34 and 43.7/36.8 = 1.19 (derived). Not averaged. Unpriced — §4.)
Apple M2 Max (MacBook Pro 14/16-inch & Mac Studio, 2023) 400 20.0 58.56 2.93× llama.cpp Metal on Apple M2 Max (30-core GPU, 32 GB): Qwen3.6-35B-A3B Q4_K_M tg128 (Qwen3.6-35B-A3B Q4_K_M, 20.22 GiB, tg128, batch 1, on a 30-core / 32 GB machine — the record's 400 GB/s is the 38-core SKU. 58.56/20.0 = 2.93 (derived). Against the 300 GB/s the 30-core config is listed at, 300/20 = 15.0 and 58.56/15.0 = 3.90× (derived). The dense IQ3_S sibling is 10.82 → 0.43× the 25.0 tok/s 27B ceiling, llama.cpp Metal on Apple M2 Max (30-core GPU, 32 GB): Qwen3.8-27B IQ3_S tg128. Unpriced — §4.)
AMD EPYC 9454P (Genoa, 48-core, 12-channel DDR5 host CPU) 460.8 23.0 63.1 2.7× EPYC 9454P (12ch DDR5) llama.cpp Qwen3-30B-A3B MoE decode
Apple M5 Pro (MacBook Pro 14-inch, 2026) 307 15.3 41.9 2.7× ss-m5pro-64-qwen35-35b-llamacpp-q4kl decode
AMD Radeon 8060S (Ryzen AI Max+ integrated GPU) 256 12.8 72.35 5.7× lhl 8060S Qwen3-30B-A3B-UD-Q4_K_XL Vulkan tg1 decode (best of 20 Strix Halo runs; the pass-7 row kyuz0 Strix Halo sweep: Qwen3.6-35B-A3B-UD-Q4_K_XL vulkan_radv decode_tok_s on Radeon 8060S (gfx1151) at 60.43 → 4.7× still stands. #232 remeasures the named Q4 on a server endpoint: RADV 60.68 → 4.74×, Strix Halo 8060S Vulkan RADV Qwen3.6-35B-A3B UD-Q4_K_XL depth-0 decode, 60.68/12.8 = 4.74 and 60.68/60.43 = 1.004 (derived); ROCm 10.0 51.26 → 4.00×, Strix Halo 8060S ROCm 10.0 Qwen3.6-35B-A3B UD-Q4_K_XL depth-0 decode. Not averaged.)
AMD Radeon AI PRO R9700 640 32.0 114.19 3.57× R9700 Vulkan RADV Qwen3.6-35B-A3B UD-Q4_K_XL depth-0 decode (Qwen3.6-35B-A3B UD-Q4_K_XL, depth 0, concurrency 1, server endpoint — not llama-bench. 114.19/32.0 = 3.57 (derived). The ROCm 10.0 sibling is 76.43 → 2.39×, R9700 ROCm 10.0 Qwen3.6-35B-A3B UD-Q4_K_XL depth-0 decode, 76.43/32.0 = 2.39 and 114.19/76.43 = 1.49 (derived). The dense 27B Q4 on the same card is under its own floor: 30.66/40.0 = 0.77×, R9700 1-GPU ROCm Qwen3.8-27B UD-Q4_K_XL depth-0 decode. Unpriced — §4. See the Oct-17 #232 note.)
AMD Radeon AI PRO R9700 640 32.0 133.0 4.16× R9700 llama.cpp AMDVLK Vulkan: Qwen3.5-35B-A3B decode at 2.9K prompt (u/neuromacmd) (llama.cpp, Qwen3.5-35B-A3B UD-Q4_K_M, batch 1, ~2.9K prompt, AMDVLK. 133.0/32.0 = 4.16 (derived). RADV is 112.0 → 3.50× R9700 llama.cpp RADV: Qwen3.5-35B-A3B decode at 2.9K prompt (u/neuromacmd, commit 48cda24), ROCm is 68.8 → 2.15× R9700 llama.cpp ROCm: Qwen3.5-35B-A3B decode at 2.9K prompt (u/neuromacmd). 112.0/114.19 = 0.981 against the server-endpoint row above — not averaged, different harness. Dense Q4_K_M sibling is under its floor: 30.6/40.0 = 0.77× R9700 llama.cpp AMDVLK Vulkan: Qwen3.5-27B decode at 2.9K prompt (u/neuromacmd). Unpriced — §4. See the Oct-17 #246 note.)
AMD Radeon PRO W7900 864 43.2 123.7 2.86× W7900 llama.cpp AMDVLK Vulkan: Qwen3.5-35B-A3B decode at 2.9K prompt (u/neuromacmd) (llama.cpp, Qwen3.5-35B-A3B UD-Q4_K_M, batch 1, ~2.9K prompt, AMDVLK. 123.7/43.2 = 2.86 (derived). RADV 114.3 → 2.65× W7900 llama.cpp RADV: Qwen3.5-35B-A3B decode at 2.9K prompt (u/neuromacmd, commit 48cda24), ROCm 78.9 → 1.83× W7900 llama.cpp ROCm: Qwen3.5-35B-A3B decode at 2.9K prompt (u/neuromacmd). Dense Q4_K_M sibling is under its floor: 31.8/54.0 = 0.59× W7900 llama.cpp AMDVLK Vulkan: Qwen3.5-27B decode at 2.9K prompt (u/neuromacmd). 123.7/133.0 = 0.93 against the R9700 AMDVLK cell — the 1.35× bus does not show up. Unpriced — §4.)
Apple M3 Ultra (Mac Studio, 2025) 819 41.0 95.2 2.32× M3 Ultra 256GB rapid-mlx: Qwen3.5-35B-A3B 4bit long decode (rapid-mlx, Qwen3.5-35B-A3B 4-bit, long decode, token count unpublished, on a 256 GB machine — not the 512 GB SKU the rank-41 $9,000 prices. 95.2/41.0 = 2.32 (derived). The 8-bit sibling is 80.0 → 1.95× M3 Ultra 256GB rapid-mlx: Qwen3.5-35B-A3B 8bit long decode, 80.0/95.2 = 0.84 (derived). Dense 4-bit sibling is under its floor: 37.7/51.2 = 0.74× M3 Ultra 256GB rapid-mlx: Qwen3.5-27B 4bit long decode. Not a re-rank — see the Oct-17 #246 note.)
NVIDIA RTX PRO 6000 Blackwell Workstation Edition 1792 89.6 198.7 2.2× Hardware Corner Mar 2026: RTX PRO 6000 Blackwell Qwen3 30B A3B Q4_K decode @ 4k ctx (4k context; the same card's 256k row is 38.4 and is a context effect, not a roofline one)
NVIDIA A100 40GB SXM4 1555 77.8 148 1.9× A100 40GB SXM4 llama.cpp b10808: Ornith-1.5-35B-A3B Q4_K_M (MoE, 3B active) decode
NVIDIA A100 40GB PCIe 1555 77.8 136 1.7× A100 40GB PCIe llama.cpp b9935: Qwen3.6-35B-A3B UD-Q4_K_XL (MoE) decode
NVIDIA RTX A6000 768 38.4 131.2 3.4× NVIDIA RTX A6000 llama.cpp: Qwen3 30B A3B (Q4_K) token generation at 4k context (4k; the 16k cell already quoted is 75.35 → 2.0× Hardware Corner: RTX A6000 48GB, llama.cpp CUDA, Qwen3 30B-A3B Q4_K_XL GGUF, decode 75.35 t/s @16k ctx. 131.2/38.4 = 3.42, (derived). Unpriced — §4.)

Three reads:

  • The ordering is the same at one context depth, and it is not at 4k. The 16k cells this section was built on sit in a ~2–2.6× band and do not reorder the bandwidth ranking. The 4k cells now cited do reorder within a generation: the 3090 at 179.0 (3.8×) and the 6000 Ada at 199.6 (4.2×) both clear the 4090's 16k number and do not clear the 4090's own 4k number (207.3). The RTX 5090 still leads the short-context list (234.3). The RTX PRO 5000 Blackwell cell (188.8 tok/s, 2.8×) still slots between the 5090 and the PRO 6000 on bandwidth and on the 4k measurement, which is what the floor predicts. What the new sweep adds is the depth at which the floor stops being a floor: 3090 and 6000 Ada cross it between 32k and 64k, the PRO 5000 between 64k and 128k.
  • The floor is ~2–6× low, and where it is lowest is systematic. The tightest-margin parts (Strix Halo now at 5.7× on its best run, M5 Max and M4 Max at 4.2×) are exactly the bandwidth-starved ones — the MoE reads only ~3B/token, so a 256 GB/s pool sustains ~72 tok/s real where the dense-equivalent floor says 12.8. The discrete GPUs cluster at ~2–2.6× because KV reads and kernel overhead bite closer to the roofline. The engine matters too: the same M5 Max measures 128.0 tok/s under MLX but 89.4 under llama.cpp — a 1.4× swing on one part, wider than some cross-part gaps. Do not use the ceiling column to compare a MoE target across architectures — it ranks $/tok-s correctly only because the error is monotonic in bandwidth.
  • The cheapest measured A3B answer depends on the context depth. At the 16k cell this section used to quote, NVIDIA GeForce RTX 3090 Ti at $950 with 98.25 tok/s is still ~$9.67/measured-tok/s (derived), and its 1.9× margin was the worst of the set that had been cited. The 3090's own sweep, now in the table, changes the short-context read and not the deep one: 179.0 tok/s at 4k on the same $950 sticker is $5.31/measured-tok/s (derived, 950/179.0), the cheapest verified fit at that depth, at 3.8× its floor — no longer the worst margin. By 64k the same card is at 32.8 tok/s and under the floor (0.70×), while the 4090 is still above it (68.2, 1.4×) and costs $9.65/measured-tok/s at its 4k cell (derived, 2000/207.3). The Ti now has a 4k cell, and it does not win that comparison: 166.9 tok/s (RTX 3090 Ti llama.cpp: Qwen3 30B-A3B (MoE) decode at 4k (Hardware Corner per-card page)) on the same $950 sticker is $5.69/measured-tok/s (derived, 950/166.9), above the 3090's $5.31 at 179.0. The two pages are different cards, and the Ti's new 16k cell (121.9) disagrees with the 98.25 this paragraph's $9.67 is computed from, so neither page is promoted to a re-rank. Strix Halo's 5.7× multiplier (10.2× on the depth-0 wiki row, which is a different protocol and not the cell this paragraph ranks on) is why AMD Strix Halo is an MoE part, not a dense-70B part - the ~256 GB/s wall caps dense decode at ~5 tok/s calls the MoE target the workload that part is for.

5. Why the cheap rows are cheap — read before buying

The $/tok-s ranking is honest arithmetic on asking prices for the part as listed, and four of the top six are cheap for a reason the price doesn't show. These are the corpus's own gotcha records, not new claims:

6. Assumptions and what this table deliberately ignores

  • Price class: every purchase price is an asking price (used-market, reseller, or MSRP), not a realised transaction price. The repo stamps each with a PRICE CLASS and a RE-VERIFY BY date; the Oct-2026 used records are freshest. $/tok-s inherits that uncertainty.
  • Unit price ≠ system price. Prices are per bare card/module where the record gives one. Several rows price a whole system instead — the part is not sold bare: Used Apple Mac Studio M1 Ultra 128GB ($2,500), Used Apple Mac Studio M2 Ultra 192GB ($3,700), eBay used Mac Studio M3 Ultra 512GB (Oct 2026) ($9,000 — the 512 GB config the accelerator record's vram_gb describes; the 96 GB Studio at $3,700 is a different machine and is not joined) are whole Mac Studios, and all six Strix Halo rows (New Minisforum MS-S1 MAX 128GB (Strix Halo) $1,900, New Framework Desktop 128GB (Ryzen AI Max+ 395), New Beelink GTR9 Pro 128GB (Strix Halo), New GMKtec EVO-X2 128GB (Ryzen AI Max+ 395 Strix Halo), New Beelink GTR9 Pro 128GB, New GMKtec EVO-X3 128GB) are whole mini-PCs/boards, plus the DGX-1 (below), two whole MacBook Pro laptops (eBay used MacBook Pro M3 Max 16in 128GB (Oct 2026) $3,400 and eBay used MacBook Pro M4 Max 16in 128GB (Oct 2026) $4,700), and — new this pass — a whole EPYC self-build, Used single-socket EPYC 9004 'Genoa' build (12ch DDR5, ~384GB) ($7,500: used CPU + SP5 board + 384 GB DDR5 + chassis, joined to AMD EPYC 9554 (Genoa, 64-core, 12-channel DDR5 host CPU)). Dividing a whole-system price by a per-device ceiling is an apples/orange flagged here, not hidden — the laptop rows price the screen, battery and logic board as well as the unified pool, and the Genoa row prices the DRAM and the motherboard, which is why both sit at the bottom of the ranking despite a Y/Y/Y fit. These parts are listed because no bare-silicon price exists, and for the unified-memory rows the system is the product. Capacity-mismatched Apple SKUs stay unjoined. eBay used Mac Studio M1 Ultra 64GB (Oct 2026) ($1,850) is a 64 GB chassis against a record whose vram_gb is 128; eBay used Mac Studio M3 Ultra 256GB (Oct 2026) ($6,250) and Used Apple Mac Studio M3 Ultra 96GB ($3,700) price less pool than the M3 Ultra record's 512 GB. Joining either would rank a cheaper machine against a fit flag it does not have.
  • Derived, not measured. docs/08-cost-per-token.md joins measured benchmarks to rental prices; this doc joins roofline ceilings to purchase prices. They answer different questions and neither substitutes for the other. A Y here and a cheap $/tok-s do not mean the part serves the model well at concurrency.
  • Deliberately dropped joins (the raw accelerator_ids link would over-attribute, per the same trap tools/cost_per_token.py documents):
    • ebay-used-accelerator-market ($10,449.95) is one A100 80GB SXM4 listing; its H100/H200 ids are "obtainable," not "priced at $10,450." Not joined to H100/H200.
    • ebay-used-a100-40gb-sxm4 ($2,499) prices a 40GB module but points at the 80GB id (no 40GB record when written). Mapped to NVIDIA A100 40GB SXM4, not the 80GB part.
    • microcenter-refurb-rtx-3090 is two tiers: 3090 $1,099.99 / 3090 Ti $1,239.99 — each joined at its own price.
    • new-retail-rtx-5090-amazon headline is the 5090 band; the 5080 sibling band lives in notes and is not the headline price. 5080 not joined.
    • new-retail-rtx-4090-3090-consumer headline $3,299 is the 4090 median; the 3090 median is $1,514 in notes. 3090 not joined at $3,299.
  • Whole-system rows kept for context but not mis-joined: used-dgx1-8x-v100 and used-dgx1-8xv100-32gb-chassis ($4,000) are 8-GPU servers → ~$500/GPU-equivalent (derived), consistent with the $500 bare-SXM2 row but system prices. gaudi2-8x-oam-tray-supermicro-820gh ($11,995) is an 8-module OAM tray → ~$1,500/module-equivalent (derived), a system price not a module price. ebay-used-a100-40gb-rack-liquidator ($249,000) is a 32-GPU rack; used-8x-h100-sxm-node-system ($180,000) is an 8-GPU server. None are bare-card prices.
  • Edge/SBC whole-board prices are not accelerator prices. new-raspberry-pi-ai-hat-2 ($200, Hailo-10H + a Pi 5), new-rockchip-rk3588-sbc ($140, RK3588 board) and used-google-coral-edge-tpu ($90) price a whole single-board computer, not the NPU alone — and their accelerator records carry no vram_gb >= 8 anyway (Hailo-10H has 8 GB but no memory_bandwidth_gbps; the other two are vram_gb-null unified-memory SoCs), so they would not qualify even if joined. Left unjoined so the price column stays a GPU/part price.

7. Reproduce

python tools/fit_matrix_35b.py            # the full 159-row matrix, all three sections, re-run on 81b8382 (GB10, Jetson AGX Thor, TITAN V, RTX PRO 2000 Blackwell, Arc Pro B50, the base M4, the GTX 1070 Ti, Jetson AGX Orin 64GB, Tesla P4 and Radeon 880M are outside the gate; see the Oct-16 p19 note, the Oct-17 #183 note, the Oct-17 #197 note, the Oct-17 #199 note, the Oct-17 #203 note, the Oct-17 #209 note and the Oct-17 #214 note)
python tools/validate.py                  # record integrity (no new records added here)

Every figure above is generated by that tool against the committed data/ records; where the tool's arithmetic disagrees with a table cell, the tool is right and the cell is stale. The tool also carries the two judgement calls the table depends on, documented inline: the curated PRICE_JOIN (which corrects the raw accelerator_ids over-attribution the same way tools/cost_per_token.py does) and UNIFIED_MEM_GB (the configured-memory override that keeps vram_gb-null unified-memory parts like Strix Halo from being silently filtered out by the >= 8 GB gate).