A múltkor azt írtam, hogy a 35B-A3B GPU-only üzemmódban elég jól megy az RTX 4090-en, de a 100k kontextus után eltalálja a VRAM falat. Gondoltam, kipróbálom ezt az új CPU-MoE feature-t a llama.cpp-ben, hátha ki tudom nyomni a 33 GB expert súlyt a system RAM-ba, és így marad hely a KV cache-nek a full 256k kontextushoz.

Bevallom előre: működik, de megvan az ára. Nem is kicsi.

Mit próbáltam?#

A lényeg, hogy a --cpu-moe flaggel a modell MoE expert súlyait nem a GPU VRAM-jába töltöd be, hanem a rendszermemóriába. Minden decode tokennél a routing gate eldönti, melyik expert kell (ez 8+1 shared a 256-ból), és azokat on-the-fly DMA-zod át CPU-RAM-ból a GPU-ba.

A konfig:

  • Modell: Qwen3.6-35B-A3B-Q8_0.gguf (Q8₀ quant, 8.52 BPW)
  • GPU layer: -ngl 999, de a --cpu-moe úgyis kiszed minden ffn_up/down/gate_exps tensort
  • KV cache: -ctk turbo3 -ctv turbo3 (3-bit TurboQuant)
  • Kontextus: --ctx-size 262144 (256k, natív max)
  • Egyéb: --no-mmap --no-warmup (mmap nélkül tisztabb a memóriaallokáció)

A hostom egy Ryzen 7 5800X3D, 64 GB DDR4, MSI B350 alaplap. Igen, B350. Ez fontos lesz később.

Memória eloszlás#

Komponens Méret Hely
Dense súlyok (attention, norm, embed, routing) ~2 GB GPU
MoE expert súlyok ~33 GB System RAM
KV cache (turbo3, 256k) ~1 GB GPU
mmproj (BF16 vision) ~861 MB GPU
Scratch buffer + overhead ~1.7 GB GPU + Host
GPU összesen ~5.8 GB
System RAM összesen ~35 GB

Tehát a GPU-n tényleg csak ~6 GB megy el, 18+ GB VRAM szabad marad. De ezt a szabad VRAM-ot semmire nem tudod használni vele, mert a --cpu-moe csak az expert FFN súlyokat pakolja át, a dense rétegeket (attention, norms, stb.) nem. Szóval ha azt hitted, majd feldobsz mellé egy másik modellt vagy növeled a quant szintet – sorry, nem fog menni.

Sebesség eredmények#

A PCIe 3.0 x16 miatt ez nem lesz szép.

Prefill (prompt feldolgozás)#

Kontextus tok/s TTFT
128 69 – 211 ~1 – 3 mp
1k 390 – 393 ~3.2 mp
4k 436 – 439 ~11 mp
8k 434 – 435 ~23 mp
16k 438 – 441 ~45 mp
32k ~437 ~90 mp

A prefill amúgy nem tragédia. 4k-tól felfelé stabilan ~440 tok/s körül megy, ami alig lassabb a GPU-only Q4_K_XL-hez képest.

Decode (token generálás)#

Kontextus tok/s ms/token
128 31 – 53 ~19 – 32
512 – 1k ~52 ~19
4k 47 – 51 ~20 – 21
8k 49 – 50 ~20
16k 46 – 47 ~21

256k-ra extrapolálva kb. 22–28 tok/s várható.

Összehasonlítás: GPU-only vs CPU-MoE#

Metrika GPU-only (Q4_K_XL, 100k) CPU-MoE (Q8₀, 256k) Arány
GPU model buffer ~21 GB ~2 GB 10× kisebb
Prefill (rövid) ~3073 tok/s ~200 tok/s ~15× lassabb
Decode (rövid) ~149 tok/s ~32 tok/s ~4.6× lassabb
VRAM használat 23 GB 5.8 GB 4× kevesebb
Max kontextus ~100k 256k 2.5× több

Itt látszik a trade-off: elveszíted a rövid kontextusos sebességet, de cserébe megkapod a full 256k-t és sokkal jobb quant minőséget (Q8₀ vs Q4_K_XL).

Mi a bottleneck?#

Nem a rendszermemória. A DDR4-ed ~30 GB/s körül tud, a PCIe 3.0 x16 meg ~14 GB/s csúcson. A PCIe 3.0 a gyilkos. Minden egyes tokennél:

  1. GPU kiszámolja a routing gate-t → top-k expert ID-k
  2. Scheduler bitsetet épít (~9/256 expert)
  3. CPU → GPU DMA a kiválasztott expert szeletekkel (~300–600 MB/token)
  4. GPU lefuttatja a ggml_mul_mat_id-t

A PCIe 3.0 ebből ~12 ms overhead/token-t pakol rá. Ha lenne egy PCIe 4.0-s alaplapom (például B550 vagy újabb), ez lemenne ~6–8 ms-ra, és a decode sebesség +15–25 tok/s-sal javulna. Szóval a megoldás tényleg ennyi egyszerű lenne: alaplap csere.

Mire jó, mire nem?#

Jó rá:

  • Batch feldolgozás, RAG pipeline-ok, ahol nem baj, ha 10-15 percet vársz az első tokenre (TTFT 256k-nál ~11–13 perc)
  • Ha meg akarod nézni, hogy a modell mit tud a full 256k kontextussal
  • Ha Q8 minőségben akarsz futtatni, de nem fér el a VRAM-ban

Rossz rá:

  • Real-time chat. 20–30 tok/s lassúnak érződik, főleg ha éppen ír egy hosszú választ.
  • Ha nincs 64 GB RAM-od. 32 GB-ra swap-elni fog, és akkor vége mindennek.
  • Ha gyors interaktív coding agent-et akarsz. Erre a GPU-only Q4_K_XL sokkal jobb.

Tanulság#

A CPU-MoE működik, de nem ingyen van. A PCIe 3.0 miatt a sebesség padlón van, kb. olyan, mintha egy középkategóriás laptop GPU-ján futtatnál egy kisebb modellt. Ha van PCIe 4.0-s platformod és 64+ GB RAM-od, akkor sokkal élhetőbb a helyzet.

A Q8₀ quant amúgy szép, csak a decode sebesség szenved érte. Ha új alaplapot veszek, megismétlem a tesztet – addig maradok a GPU-only Q4_K_XL-nél a gyorsabb munkához, és CPU-MoE-t csak hosszú kontextusú batch jobokhoz használom.

Valaki kipróbálta már PCIe 4.0-val? Kíváncsi vagyok, ti milyen számokat lóttok ki belőle.