Summary
Qwen3-Coder-Next (80B MoE, 3B active) achieves ~7.7 tok/s on consumer hardware when benchmarks of comparable MoE models suggest it should be closer to 35-60 tok/s. This was previously reported in #17936 (closed as stale), but we now have fresh controlled benchmarks comparing it against a dense model on the same hardware, showing the anomaly clearly.
Environment
- CPU: AMD Ryzen AI 9 HX PRO 370 (Zen 5, 12c/24t, 4.37 GHz)
- RAM: 96GB DDR5-5600 dual-channel (2x48GB)
- OS: TrueNAS SCALE (Linux 6.12.15)
- Runtime: Ollama 0.15.6 (Docker, CPU-only)
- llama.cpp version: Build 7973 (39bf692)
- CPU features: AVX, AVX2, AVX-512, AVX-512_VBMI, AVX-512_VNNI, AVX-512_BF16, FMA, F16C
Benchmark Results
Same hardware, same conditions, same prompt
| Model |
Quant |
Size |
Active Params |
Gen tok/s |
Architecture |
| qwen2.5-coder:32b |
Q4_K_M |
19GB |
32.8B (100%) |
3.54 |
Dense |
| qwen3-coder-next |
Q4_K_M |
51GB |
3B (3.75%) |
7.74 |
MoE |
The anomaly
Q3CN activates only 3B of 80B params per token — 3.75% of the model. A dense 32B model reads 100% of its weights per token. By bandwidth math alone:
- Dense 32B reads ~19GB per token → 3.54 tok/s (matches DDR5-5600 bandwidth ceiling of ~65 GB/s)
- MoE 80B reading 3B active should read ~2-3GB per token → expected 20-30+ tok/s
- Actual: 7.74 tok/s — roughly 3-4x slower than the bandwidth math predicts
Cross-reference with #17936
The original reporter tested on AMD EPYC 9454P (48c/96t):
| Model |
Active Params |
tok/s |
| Qwen3-MoE-30B |
~3B |
63.10 |
| Qwen3-Next-80B |
~3B |
11.76 |
| GPT-OSS-120B |
~5B |
35.75 |
Same pattern: Qwen3-Next is 5.4x slower than Qwen3-MoE despite identical active parameter counts.
Thread scaling (rules out threading issues)
| Threads |
Gen tok/s |
| 4 |
2.72 |
| 6 |
3.37 |
| 8 |
3.49 |
| 12 (physical cores) |
3.54 |
| 24 (with SMT) |
2.84 |
12 threads (physical cores) is optimal. SMT hurts. CPU governor (performance vs powersave) makes zero difference — confirming this is bandwidth-bound, not compute-bound.
Why this matters
Qwen3-Coder-Next is one of the most capable open-weight coding models available. The MoE architecture (3B active / 80B total) was specifically designed to run on consumer hardware. But the CPU inference path in llama.cpp isn't taking advantage of the sparse activation pattern — it appears to be reading far more data than the 3B active params require.
The fork ik_llama.cpp reports ~1.9x faster MoE inference through fused MoE operations, better AVX-512 utilization, and MoE-specific optimizations. This suggests the performance gap is addressable in the llama.cpp backend.
Expected behavior
MoE models with 3B active params should achieve inference speeds comparable to dense 3B models on CPU (adjusted for routing overhead). On DDR5-5600 (~65 GB/s real-world bandwidth), a 3B active model should achieve 20-30+ tok/s generation.
Related
Summary
Qwen3-Coder-Next (80B MoE, 3B active) achieves ~7.7 tok/s on consumer hardware when benchmarks of comparable MoE models suggest it should be closer to 35-60 tok/s. This was previously reported in #17936 (closed as stale), but we now have fresh controlled benchmarks comparing it against a dense model on the same hardware, showing the anomaly clearly.
Environment
Benchmark Results
Same hardware, same conditions, same prompt
The anomaly
Q3CN activates only 3B of 80B params per token — 3.75% of the model. A dense 32B model reads 100% of its weights per token. By bandwidth math alone:
Cross-reference with #17936
The original reporter tested on AMD EPYC 9454P (48c/96t):
Same pattern: Qwen3-Next is 5.4x slower than Qwen3-MoE despite identical active parameter counts.
Thread scaling (rules out threading issues)
12 threads (physical cores) is optimal. SMT hurts. CPU governor (
performancevspowersave) makes zero difference — confirming this is bandwidth-bound, not compute-bound.Why this matters
Qwen3-Coder-Next is one of the most capable open-weight coding models available. The MoE architecture (3B active / 80B total) was specifically designed to run on consumer hardware. But the CPU inference path in llama.cpp isn't taking advantage of the sparse activation pattern — it appears to be reading far more data than the 3B active params require.
The fork
ik_llama.cppreports ~1.9x faster MoE inference through fused MoE operations, better AVX-512 utilization, and MoE-specific optimizations. This suggests the performance gap is addressable in the llama.cpp backend.Expected behavior
MoE models with 3B active params should achieve inference speeds comparable to dense 3B models on CPU (adjusted for routing overhead). On DDR5-5600 (~65 GB/s real-world bandwidth), a 3B active model should achieve 20-30+ tok/s generation.
Related