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

NVIDIA GB10 · spark-5dfc — 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 · 33.6 tok/s · 36.3 GB
fastest
93.6 tok/s decode · 102/126 coding tasks
lightest of the accurate tier
3.7 GB · 81.0 tok/s · 102/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/126033.6 ±036.3———45/4824/2418/246/99/96/9———3/3
qwen3-coder-next 80B llama.cpp CUDAMoE108/126051.2 ±08.9———45/4821/2421/246/96/96/9———3/3
laguna-s 2.1 117B llama.cpp CUDAMoE108/126035.3 ±04.9———48/4824/2418/246/99/93/9———0/3
gpt-oss-120b llama.cpp CUDAMoE107/126454.2 ±03.8———40/4824/2416/249/99/96/9———3/3
nemotron-3-super 120B llama.cpp CUDAMoE105/126016.4 ±09.2———48/4824/2415/246/99/93/9———0/3
gpt-oss-20b llama.cpp CUDAMoE102/126381.0 ±03.7———46/4824/2415/244/97/96/9———0/3
gemma-4-26b llama.cpp CUDAMoE102/126055.8 ±06.6———42/4824/2415/246/99/93/9———3/3
qwen3.8-27b llama.cpp CUDAdense102/126011.0 ±09.6———42/4824/2415/246/99/93/9———3/3
qwen3.6-35b llama.cpp CUDAMoE102/126059.6 ±19.3———42/4821/2418/249/96/93/9———3/3
laguna-xs.2 llama.cpp CUDAMoE102/126393.6 ±04.3———38/4824/2418/245/99/95/9———3/3
qwen3.6-27b llama.cpp CUDAdense99/126011.2 ±09.3———33/4824/2421/246/99/93/9———3/3
devstral-2 24b llama.cpp CUDAdense98/126214.3 ±01.4———35/4824/2418/246/96/96/9———3/3
qwen3.5-35b llama.cpp CUDAMoE96/126068.8 ±09.3———39/4821/2418/243/99/93/9———3/3
glm-4.7-flash llama.cpp CUDAMoE96/126267.4 ±01.7———45/4824/2418/241/93/93/9———2/3
qwen3.5-27b llama.cpp CUDAdense96/126012.6 ±09.3———36/4824/2415/243/99/96/9———3/3
qwen3.5-122b-a10b llama.cpp CUDAMoE93/126022.4 ±09.4———33/4824/2415/246/99/93/9———3/3
qwen3-coder-30b llama.cpp CUDAMoE90/126091.1 ±22.1———39/4824/2412/246/96/90/9———3/3
k2-horizon 36B-A4B llama.cpp CUDAMoE88/126350.8 ±03.4———36/4823/2412/246/94/94/9———3/3
mistral-small-4 119B llama.cpp CUDAMoE83/126543.1 ±01.3———33/4822/2414/245/93/93/9———3/3
seed-oss 36b llama.cpp CUDAdense81/12649.1 ±08.8———30/4824/2420/243/93/90/9———1/3
aya-23 35b llama.cpp CUDAdense73/12628.8 ±09.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%345.6
qwen3-coder-next 80BMoE80B3B512, top-10 +186%5117.1
laguna-s 2.1 117BMoE117B3B256, top-10 +1 shared86%3511.8
gpt-oss-120bMoE117B5.1B128, top-485%5410.6
nemotron-3-super 120BMoE120B12B512, top-22 +183%161.4
gpt-oss-20bMoE21B3.6B32, top-481%8122.5
gemma-4-26bMoE25.2B3.8B128, top-8 +181%5614.7
qwen3.8-27bdense27B27B—81%11—
qwen3.6-35bMoE35B3B256, top-8 +181%6019.9
laguna-xs.2MoE33.4B3B256 +1 shared81%9431.2
qwen3.6-27bdense27B27B—79%11—
devstral-2 24bdense24B24B—78%14—
qwen3.5-35bMoE35B3B256, top-8 +176%6922.9
glm-4.7-flashMoE30B3B64, top-4 +176%6722.5
qwen3.5-27bdense27B27B—76%13—
qwen3.5-122b-a10bMoE122B10B256, top-8 +174%222.2
qwen3-coder-30bMoE30B3B128, top-871%9130.4
k2-horizon 36B-A4BMoE36B4B—70%5112.7
mistral-small-4 119BMoE119B6B128, top-466%437.2
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.90.80.73.41.6
glm-4.7-flashMoE2.81.11.25.12.5
qwen3.5-35bMoE3.21.11.15.32.6
k2-horizon 36B-A4BMoE3.21.11.15.52.7
mistral-small-4 119BMoE3.41.31.46.13.0
qwen3-coder-next 80BMoE3.31.41.56.33.1
qwen3.6-35bMoE3.61.41.76.73.3
gemma-4-26bMoE3.51.41.86.83.3
laguna-s 2.1 117BMoE5.21.81.88.84.3
qwen3.8-flash-next 125BMoE6.22.62.511.45.5
qwen3.5-122b-a10bMoE9.03.23.215.47.5
nemotron-3-super 120BMoE9.33.93.216.38.0
gpt-oss-120bMoE7.83.95.317.08.3
devstral-2 24bdense10.84.12.817.88.7
gpt-oss-20bMoE9.54.55.219.39.4
aya-23 35bdense16.26.36.729.314.3
qwen3.5-27bdense16.37.27.430.915.1
qwen3.6-27bdense18.56.36.230.915.1
qwen3.8-27bdense17.38.36.532.015.6
seed-oss 36bdense258.7115.4143.4517.5252.5

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/4110.0s37/4111.8s+11 frontier
laguna-s 2.1 117BMoE36/415.2s36/416.5s+02 frontier
qwen3-coder-next 80BMoE35/413.7s35/415.6s+03 frontier
laguna-xs.2MoE31/412.3s34/413.1s+34 frontier
qwen3.8-flash-next 125BMoE36/416.5s36/419.7s+05 beaten
gpt-oss-20bMoE36/419.4s36/4114.6s+06 beaten
nemotron-3-super 120BMoE35/419.7s35/4112.1s+07 beaten
qwen3.6-35bMoE33/414.2s33/416.1s+08 beaten
gemma-4-26bMoE33/414.3s33/416.7s+09 beaten
devstral-2 24bdense33/4110.6s33/4117.8s+010 beaten
qwen3.8-27bdense33/4119.6s33/4130.3s+011 beaten
glm-4.7-flashMoE32/413.3s32/415.5s+012 beaten
qwen3.6-27bdense32/4119.4s32/4135.5s+013 beaten
qwen3.5-35bMoE31/413.5s31/416.1s+014 beaten
qwen3.5-27bdense31/4120.1s31/4133.1s+015 beaten
k2-horizon 36B-A4BMoE29/413.6s30/416.6s+116 beaten
qwen3.5-122b-a10bMoE30/4110.5s30/4115.8s+017 beaten
qwen3-coder-30bMoE29/412.4s29/414.2s+018 beaten
mistral-small-4 119BMoE26/415.0s29/418.3s+319 beaten
seed-oss 36bdense26/41412.5s28/41787.0s+220 beaten
aya-23 35bdense23/4125.2s25/4151.4s+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.