Local models on NVIDIA GB10 · spark-e2b0 — which one should write your code?

NVIDIA GB10 · spark-e2b0 — 20-core Grace (Cortex-X925 / Cortex-A725) · NVIDIA GB10 · CUDA sm_121 · 128 GB unified · llama.cpp CUDA. 21 models in this tree. A row appears only when the run used the shared profile (temperature 0 on every trial, seed 42, one 16384-token slot, C compiled -std=gnu11). Aya-23 clamps that context to 8192. Older sweeps used different stacks, context sizes, and a 0.7-temperature retry, so they are not in this table. Their raw JSON is still on disk. Click any column header to sort. Generated 2026-10-02 09:47.

Where to look: this page ranks the models and prices them by what a working answer costs. Analysis covers behaviour under load, whether the code they write is fast, whether the wording of the prompt changes the answer, and self-repair. The failing samples are split by technology — C, Python, Bash, research — and models shows how to reproduce every number. Charts is the same data as pictures.

How many times does each test run? Coding suites (C, Python, Bash — easy, hard and brutal) and the research paper: 3 trials per task, all at temperature 0 with seed 42, so a miss is the same answer again. Framing, from the older sweep: 20 trials per wording. Decode speed: median of 3 repeated 2048-token generations — the tok/s column shows ±1 std across those runs (hover a cell for the exact count), as does the dot plot on the analysis page. Quality: 6 probes × 3 trials (temp 0, then 0.7×2). Concurrency: one pass per stream level (no repeats). Self-repair: one initial attempt, then up to 5 rounds of compiler feedback. Two writing tasks that are easy to confuse: tok/s is measured on a 1500-word essay about MIT (speed only, content not graded — each model's essay is on its detail page), while the research column is a different test: extracting NFS facts from RHEL 10 documentation. All raw data is downloadable as CSV files.

most accurate
111/126 coding tasks · 28.1 tok/s · 29.8 GB
fastest
88.4 tok/s decode · 101/126 coding tasks
lightest of the accurate tier
0.9 GB · 88.4 tok/s · 101/126 coding tasks
model type coding total flaky ↓ tok/s ± RAM GB quality ppl-w ↓ ppl-t ↓ C Py Bash C-hard Py-hard Sh-hard C-brutal Py-brutal Sh-brutal research
qwen3.8-flash-next 125B llama.cpp CUDAMoE111/126028.1 ±029.8———45/4824/2418/246/99/96/9———3/3
qwen3-coder-next 80B llama.cpp CUDAMoE108/126051.7 ±02.0———45/4821/2421/246/96/96/9———3/3
laguna-s 2.1 117B llama.cpp CUDAMoE108/126027.8 ±01.0———48/4824/2418/246/99/93/9———0/3
gpt-oss-120b llama.cpp CUDAMoE107/126448.9 ±01.3———40/4824/2416/249/99/96/9———3/3
nemotron-3-super 120B llama.cpp CUDAMoE105/126016.1 ±03.8———48/4824/2415/246/99/93/9———0/3
gpt-oss-20b llama.cpp CUDAMoE102/126381.8 ±01.3———46/4824/2415/244/97/96/9———0/3
gemma-4-26b llama.cpp CUDAMoE102/126055.7 ±01.7———42/4824/2415/246/99/93/9———3/3
qwen3.8-27b llama.cpp CUDAdense102/126012.3 ±03.7———42/4824/2415/246/99/93/9———3/3
qwen3.6-35b llama.cpp CUDAMoE102/126067.0 ±02.2———42/4821/2418/249/96/93/9———3/3
laguna-xs.2 llama.cpp CUDAMoE101/126488.4 ±00.9———38/4824/2418/245/99/95/9———2/3
qwen3.6-27b llama.cpp CUDAdense99/126012.4 ±03.6———33/4824/2421/246/99/93/9———3/3
devstral-2 24b llama.cpp CUDAdense98/126213.7 ±01.2———35/4824/2418/246/96/96/9———3/3
qwen3.5-35b llama.cpp CUDAMoE96/126066.5 ±02.2———39/4821/2418/243/99/93/9———3/3
glm-4.7-flash llama.cpp CUDAMoE96/126267.4 ±00.9———45/4824/2418/241/93/93/9———2/3
qwen3.5-27b llama.cpp CUDAdense96/126011.8 ±03.5———36/4824/2415/243/99/96/9———3/3
qwen3.5-122b-a10b llama.cpp CUDAMoE93/126022.3 ±03.7———33/4824/2415/246/99/93/9———3/3
qwen3-coder-30b llama.cpp CUDAMoE90/126068.1 ±00.9———39/4824/2412/246/96/90/9———3/3
k2-horizon 36B-A4B llama.cpp CUDAMoE88/126348.3 ±01.2———36/4823/2412/246/94/94/9———3/3
mistral-small-4 119B llama.cpp CUDAMoE83/126536.1 ±00.9———33/4822/2414/245/93/93/9———3/3
seed-oss 36b llama.cpp CUDAdense81/12648.9 ±01.4———30/4824/2420/243/93/90/9———1/3
aya-23 35b llama.cpp CUDAdense73/12629.3 ±04.7———37/4821/2412/240/93/90/9———0/3

Dense vs mixture-of-experts

A dense model runs every parameter on every token; a mixture-of-experts model routes each token to a few of its experts, so only the active column does compute. That is why the 125B flash-next decodes like a 6B model and the whole top of the table is MoE — on memory-bandwidth-bound Apple silicon, active parameters are what you pay per token, and MoE buys a large total capacity at a small active cost. The last column, tok/s per active billion, is the efficiency of that trade; dense models are 1x by definition and omitted.

modeltypetotalactiveexpertscodingtok/stok/s per act-B
qwen3.8-flash-next 125BMoE125B6B512, top-10 +188%284.7
qwen3-coder-next 80BMoE80B3B512, top-10 +186%5217.2
laguna-s 2.1 117BMoE117B3B256, top-10 +1 shared86%289.3
gpt-oss-120bMoE117B5.1B128, top-485%499.6
nemotron-3-super 120BMoE120B12B512, top-22 +183%161.3
gpt-oss-20bMoE21B3.6B32, top-481%8222.7
gemma-4-26bMoE25.2B3.8B128, top-8 +181%5614.7
qwen3.8-27bdense27B27B—81%12—
qwen3.6-35bMoE35B3B256, top-8 +181%6722.3
laguna-xs.2MoE33.4B3B256 +1 shared80%8829.5
qwen3.6-27bdense27B27B—79%12—
devstral-2 24bdense24B24B—78%14—
qwen3.5-35bMoE35B3B256, top-8 +176%6722.2
glm-4.7-flashMoE30B3B64, top-4 +176%6722.5
qwen3.5-27bdense27B27B—76%12—
qwen3.5-122b-a10bMoE122B10B256, top-8 +174%222.2
qwen3-coder-30bMoE30B3B128, top-871%6822.7
k2-horizon 36B-A4BMoE36B4B—70%4812.1
mistral-small-4 119BMoE119B6B128, top-466%366.0
seed-oss 36bdense36B36B—64%9—
aya-23 35bdense35B35B—58%9—

Green cells are strong, red weak — shaded by percentage so a column can be scanned without reading every number. Perplexity is llama-perplexity on WikiText-2 (50 chunks). It is not comparable to the MLX numbers on the other machine. Gemma's absurd PPL is a tokenizer artifact — trust the coding score.

What it costs to get working code

Correctness alone picks a model that is right and unusably slow; tok/s alone picks one that is fast and wrong. The number that decides it is the two divided: seconds of wall clock per solution that passes. Across the 41 coding tasks (research excluded), 3 trials each at temperature 0 — timed end to end, failures included, because a wrong answer costs you its generation time too.

modeltypeC minPython minBash mintotal minper attempt
laguna-xs.2MoE1.90.70.73.31.6
qwen3-coder-30bMoE1.80.80.73.31.6
qwen3-coder-next 80BMoE2.61.11.24.92.4
glm-4.7-flashMoE2.71.11.15.02.4
qwen3.5-35bMoE3.11.11.05.22.5
k2-horizon 36B-A4BMoE3.21.11.15.42.6
qwen3.6-35bMoE2.91.11.45.42.6
gemma-4-26bMoE3.51.51.86.83.3
mistral-small-4 119BMoE4.11.61.77.33.6
laguna-s 2.1 117BMoE5.11.81.88.74.2
qwen3.8-flash-next 125BMoE6.22.62.311.15.4
qwen3.5-122b-a10bMoE7.82.82.813.46.5
nemotron-3-super 120BMoE7.93.32.713.96.8
devstral-2 24bdense10.84.12.817.78.7
gpt-oss-120bMoE8.94.45.919.29.4
gpt-oss-20bMoE9.64.45.219.29.4
qwen3.8-27bdense14.57.15.427.113.2
aya-23 35bdense15.05.86.227.113.2
qwen3.5-27bdense16.56.67.030.114.7
qwen3.6-27bdense18.36.15.930.214.8
seed-oss 36bdense245.9109.9137.0492.8240.4

Those totals are everything the model spent, right or wrong. Dividing by the answers that actually worked gives the figure below. first try is trial 1 alone, the honest number if you paste the first thing you get. with retry re-asks only when the previous attempt failed and stops at the first pass, so unused retries cost nothing — what a loop around the model really costs.

modeltypefirst trysec/solutionwith retrysec/solutionretry gainrank
gpt-oss-120bMoE36/4111.1s37/4113.2s+11 frontier
laguna-s 2.1 117BMoE36/415.2s36/416.4s+02 frontier
qwen3-coder-next 80BMoE35/412.9s35/414.3s+03 frontier
laguna-xs.2MoE31/412.3s34/413.1s+34 frontier
qwen3.8-flash-next 125BMoE36/416.3s36/419.5s+05 beaten
gpt-oss-20bMoE36/419.5s36/4114.7s+06 beaten
nemotron-3-super 120BMoE35/418.3s35/4110.3s+07 beaten
qwen3.6-35bMoE33/413.3s33/414.9s+08 beaten
gemma-4-26bMoE33/414.3s33/416.8s+09 beaten
devstral-2 24bdense33/4110.6s33/4117.8s+010 beaten
qwen3.8-27bdense33/4116.5s33/4125.5s+011 beaten
glm-4.7-flashMoE32/413.2s32/415.4s+012 beaten
qwen3.6-27bdense32/4119.0s32/4134.8s+013 beaten
qwen3.5-35bMoE31/413.4s31/416.0s+014 beaten
qwen3.5-27bdense31/4119.5s31/4132.4s+015 beaten
k2-horizon 36B-A4BMoE29/413.6s30/416.5s+116 beaten
qwen3.5-122b-a10bMoE30/419.1s30/4113.7s+017 beaten
qwen3-coder-30bMoE29/412.3s29/414.1s+018 beaten
mistral-small-4 119BMoE26/415.9s29/419.9s+319 beaten
seed-oss 36bdense26/41393.1s28/41748.9s+220 beaten
aya-23 35bdense23/4123.3s25/4147.6s+221 beaten

Rank is the frontier first (most solutions, then cheapest), then everyone else. beaten means another model is at least as accurate and cheaper — drop it.

kimi-k3 (referee) is not in these tables: the cost here is generation wall-clock, and the referee is a hosted cloud model whose solutions were written in-session, not generated through the harness — there is no timing to report.