Qwen 3.6 CPU-MoE offload teszt: 33 GB expertet kinyomtam a RAM-ba, de megvolt az ára
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 mindenffn_up/down/gate_expstensort - 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:
- GPU kiszámolja a routing gate-t → top-k expert ID-k
- Scheduler bitsetet épít (~9/256 expert)
- CPU → GPU DMA a kiválasztott expert szeletekkel (~300–600 MB/token)
- 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.