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#

KomponensMéretHely
Dense súlyok (attention, norm, embed, routing)~2 GBGPU
MoE expert súlyok~33 GBSystem RAM
KV cache (turbo3, 256k)~1 GBGPU
mmproj (BF16 vision)~861 MBGPU
Scratch buffer + overhead~1.7 GBGPU + 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)#

Kontextustok/sTTFT
12869 – 211~1 – 3 mp
1k390 – 393~3.2 mp
4k436 – 439~11 mp
8k434 – 435~23 mp
16k438 – 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)#

Kontextustok/sms/token
12831 – 53~19 – 32
512 – 1k~52~19
4k47 – 51~20 – 21
8k49 – 50~20
16k46 – 47~21

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

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

MetrikaGPU-only (Q4_K_XL, 100k)CPU-MoE (Q8₀, 256k)Arány
GPU model buffer~21 GB~2 GB10× 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álat23 GB5.8 GB4× kevesebb
Max kontextus~100k256k2.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.