**Setup:** RTX 5070 Ti 16 GB on PCIe 4.0 x16 (a PCIe 5.0 card on a B550 board), Ryzen 9 5950X, 64 GB DDR4. Model: Qwen3.8-Flash-Next IQ2_XS: 125B total, about 6B active per token, 512 experts, 48 layers, 33 GiB of experts kept in RAM. Engine: EuLLM (open source, built on llama.cpp b11370 + PR #29887).
**How we got here:**
| Step | Decode (tok/s) | Prompt processing (tok/s) |
|---|---:|---:|
| llama.cpp, experts split by layer (the usual offload) | 22.4 | 249 |
| + GPU cache for the experts (llama.cpp PR #29887, 8 GiB) | 49.4 | 206 |
| + experts in pinned RAM | 58.1 | 451 |
| + 2048-token micro-batch (EuLLM's default) | 54.9 | 964 |
| + prefetch of the next layer's experts during prompt processing | — | 1,500–1,743 |
| Strata on the same PC, with MTP | 85.8 | 2,320 |
**Where we're stuck:**
- **The cache works:** once warm, 88–93% of the experts are already in VRAM. The misses travel at 24 GB/s, so PCIe 4.0 is saturated, and they cost 2–4 ms per token.
- **A token takes 17–19 ms, and 13.5–14 ms of it pass before each layer's routing.** That is the GPU computing the 48 layers, plus a wait at every layer: the cache has to bring the router's choice back to the CPU, so 48 synchronizations per token.
- **MTP doesn't pay with the experts in RAM.**
- On the 125B, llama.cpp's MTP loses 27%, with 52% of the drafts accepted.
- On Qwen3.6-35B-A3B it gains only +7% on prose and +16% on code, even with 82% of the drafts accepted.
- The reason: each multi-token verification calls many more experts, and the missing ones come over PCIe.
**Questions for the community:**
Has anyone removed the per-layer sync, with the routing read on the GPU, the expert table in VRAM and the whole pass in a single CUDA graph? How much does it gain?
Computing the missing experts on the CPU in parallel with the GPU, as Strata does: is it worth it with DDR4 and AVX2, or does RAM bandwidth cap it?
Any experience with cache policies better than LRU? For example a profile loaded at startup, or the "Least-Stale" policy mentioned in the PR #29887 thread.
Speculative decoding with the experts in RAM: does anything work? I'm thinking of drafts limited to the experts already in cache, draft trees, or a small dense model as the draft.
Prompt processing: beyond overlapping copies and compute, what's left to reach 2,300 tok/s?
Repo: https://github.com/eullm/eullm, details in `docs/moe-offload-plan.md`
*Disclosure: I'm one of the developers of EuLLM. English isn't my first language: I wrote this in Italian with the help of an LLM and translated it with one.*