Skip to content

Qwen3-Coder-Next (Qwen3-Next-80B) CPU inference ~5x slower than expected — consumer hardware benchmarks #19480

Description

@ProgenyAlpha

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions