Local models on Ryzen AI MAX+ 395 / Radeon 8060S — which one should write your code?

Ryzen AI MAX+ 395 / Radeon 8060S — Ryzen AI MAX+ 395, 16-core / 32-thread · Radeon 8060S gfx1151, 40 CU · Vulkan/RADV · 128 GB LPDDR5 (BIOS: 64 GB VRAM + 62 GB RAM; Vulkan VRAM+GTT ≈ 95 GB) · llama.cpp Vulkan. 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-01 17:21.

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
115/126 coding tasks · 27.8 tok/s · 28.8 GB
fastest
86.2 tok/s decode · 102/126 coding tasks
lightest of the accurate tier
0.2 GB · 72.3 tok/s · 104/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 VulkanMoE115/126427.8 ±028.8——3.6346/4824/2420/248/98/96/9———3/3
gpt-oss-120b llama.cpp VulkanMoE109/126451.4 ±00.3——171.0842/4824/2419/247/99/96/9———2/3
laguna-s 2.1 117B llama.cpp VulkanMoE107/126133.6 ±00.3——8.5048/4824/2418/246/99/92/9———0/3
gemma-4-26b llama.cpp VulkanMoE105/126347.1 ±00.5——17,52543/4824/2415/247/99/94/9———3/3
qwen3-coder-next 80B llama.cpp VulkanMoE105/126355.5 ±01.4——7.0342/4821/2420/246/98/95/9———3/3
qwen3.8-27b llama.cpp Vulkandense105/126012.2 ±02.6——6.3045/4824/2415/246/99/93/9———3/3
gpt-oss-20b llama.cpp VulkanMoE104/126672.3 ±00.2——123.5845/4824/2416/246/98/95/9———0/3
nemotron-3-super 120B llama.cpp VulkanMoE104/126117.5 ±02.9——4.1845/4824/2415/245/99/93/9———3/3
glm-4.7-flash llama.cpp VulkanMoE103/126163.7 ±00.3——17.1045/4824/2415/246/97/93/9———3/3
laguna-xs.2 llama.cpp VulkanMoE102/126486.2 ±00.3——13.1034/4824/2421/246/99/96/9———2/3
qwen3.6-27b llama.cpp Vulkandense100/126112.5 ±02.6——6.5536/4824/2421/247/99/93/9———0/3
devstral-2 24b llama.cpp Vulkandense96/126014.7 ±00.5——4.8236/4824/2418/243/96/96/9———3/3
qwen3.5-35b llama.cpp VulkanMoE95/126358.7 ±01.2——6.2036/4824/2416/245/98/93/9———3/3
qwen3.6-35b llama.cpp VulkanMoE94/126158.5 ±01.2——6.3639/4821/2418/246/96/93/9———1/3
qwen3.5-122b-a10b llama.cpp VulkanMoE93/126022.2 ±02.4——4.8836/4824/2415/246/99/93/9———0/3
qwen3.5-27b llama.cpp Vulkandense93/126012.5 ±02.6——6.3933/4824/2415/243/99/96/9———3/3
k2-horizon 36B-A4B llama.cpp VulkanMoE91/126148.3 ±00.4——7.9036/4821/2416/246/96/93/9———3/3
qwen3-coder-30b llama.cpp VulkanMoE87/126385.0 ±00.3——9.0636/4824/2414/246/95/90/9———2/3
seed-oss 36b llama.cpp Vulkandense86/1261010.2 ±00.6——9.0534/4824/2417/242/94/92/9———3/3
mistral-small-4 119B llama.cpp VulkanMoE82/126142.2 ±00.2——5.0937/4821/2412/246/93/93/9———0/3
aya-23 35b llama.cpp Vulkandense64/12619.6 ±02.1——6.1527/4821/2412/240/93/90/9———1/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 +191%284.6
gpt-oss-120bMoE117B5.1B128, top-487%5110.1
laguna-s 2.1 117BMoE117B3B256, top-10 +1 shared85%3411.2
gemma-4-26bMoE25.2B3.8B128, top-8 +183%4712.4
qwen3-coder-next 80BMoE80B3B512, top-10 +183%5618.5
qwen3.8-27bdense27B27B—83%12—
gpt-oss-20bMoE21B3.6B32, top-483%7220.1
nemotron-3-super 120BMoE120B12B512, top-22 +183%171.5
glm-4.7-flashMoE30B3B64, top-4 +182%6421.2
laguna-xs.2MoE33.4B3B256 +1 shared81%8628.7
qwen3.6-27bdense27B27B—79%12—
devstral-2 24bdense24B24B—76%15—
qwen3.5-35bMoE35B3B256, top-8 +175%5919.6
qwen3.6-35bMoE35B3B256, top-8 +175%5919.5
qwen3.5-122b-a10bMoE122B10B256, top-8 +174%222.2
qwen3.5-27bdense27B27B—74%13—
k2-horizon 36B-A4BMoE36B4B—72%4812.1
qwen3-coder-30bMoE30B3B128, top-869%8528.3
seed-oss 36bdense36B36B—68%10—
mistral-small-4 119BMoE119B6B128, top-465%427.0
aya-23 35bdense35B35B—51%10—
harness check — not a contestant
kimi-k3 (referee) solved 44/44
A cloud model was given the same tasks to confirm they're all solvable and that no failure below is a harness artifact. It's kept out of the ranking because it got one attempt per task rather than 3 trials (44 samples vs 126), ran no research task, and authored the harness. Read it as a ceiling, not a score.

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
qwen3-coder-30bMoE2.10.90.73.71.8
laguna-xs.2MoE2.40.90.94.22.0
glm-4.7-flashMoE2.71.21.35.22.6
k2-horizon 36B-A4BMoE3.11.21.35.72.8
mistral-small-4 119BMoE3.61.41.56.53.2
qwen3.6-35bMoE3.71.41.76.83.3
gemma-4-26bMoE4.21.81.37.33.6
qwen3-coder-next 80BMoE3.82.01.77.53.6
qwen3.5-35bMoE4.31.41.77.53.6
laguna-s 2.1 117BMoE5.72.02.09.74.7
qwen3.5-122b-a10bMoE8.63.33.215.17.4
nemotron-3-super 120BMoE8.73.83.215.77.7
qwen3.8-flash-next 125BMoE8.64.13.115.87.7
devstral-2 24bdense11.14.22.918.38.9
gpt-oss-120bMoE9.04.36.419.79.6
gpt-oss-20bMoE10.44.08.222.611.0
aya-23 35bdense15.15.96.927.813.6
qwen3.8-27bdense15.57.65.728.714.0
qwen3.6-27bdense17.36.56.430.214.7
qwen3.5-27bdense19.87.37.134.316.7
seed-oss 36bdense228.4103.1110.6442.0215.6

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
qwen3.8-flash-next 125BMoE38/418.7s39/419.5s+11 frontier
gemma-4-26bMoE35/414.2s36/415.5s+12 frontier
laguna-xs.2MoE34/412.7s35/413.6s+13 frontier
gpt-oss-120bMoE34/4112.2s37/4114.7s+34 beaten
gpt-oss-20bMoE36/4113.3s37/4119.5s+15 beaten
laguna-s 2.1 117BMoE36/416.1s36/417.3s+06 beaten
qwen3-coder-next 80BMoE32/414.8s35/416.8s+37 beaten
glm-4.7-flashMoE34/413.2s34/414.7s+08 beaten
nemotron-3-super 120BMoE34/4110.2s34/4113.1s+09 beaten
qwen3.8-27bdense34/4116.9s34/4124.1s+010 beaten
qwen3.6-27bdense33/4118.6s34/4127.4s+111 beaten
qwen3.5-35bMoE31/414.9s32/417.8s+112 beaten
seed-oss 36bdense28/41292.3s32/41487.3s+413 beaten
qwen3.6-35bMoE31/414.5s31/417.1s+014 beaten
qwen3.5-122b-a10bMoE31/4110.5s31/4115.1s+015 beaten
devstral-2 24bdense31/4111.8s31/4121.5s+016 beaten
k2-horizon 36B-A4BMoE29/414.2s30/416.6s+117 beaten
qwen3.5-27bdense30/4123.4s30/4139.2s+018 beaten
qwen3-coder-30bMoE29/412.7s29/414.7s+019 beaten
mistral-small-4 119BMoE28/415.5s28/419.1s+020 beaten
aya-23 35bdense21/4126.8s21/4161.9s+021 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.