Someone will tell you a 671-billion-parameter model needs a rack of eight H100s. For a dense model, they're right. For a mixture-of-experts model — which is what every frontier open-weight release now is, from DeepSeek-V3/R1 to GLM-5.2 to MiniMax M3 — they're quoting the wrong number. The parameter count on the box is the model's storage size. What matters for a single forward pass is how much of it actually runs, and for DeepSeek-V3 that's roughly 37B of the 671B. The other ~94% sits idle for any given token.
That gap is the whole trick. It's why you can serve a 671B model on one consumer GPU, and it's why almost everyone who tries reaches for the wrong offload first.
The naive split, and the one that works#
The obvious way to fit a model bigger than your VRAM is to put some of its layers on the GPU and the rest on the CPU — the classic --n-gpu-layers dial that everyone learns first. For a dense model that's the only lever you have, and it's miserable: every layer runs on every token, so the CPU-resident layers throttle the whole pipeline to CPU speed.
MoE lets you make a smarter cut. Inside each transformer block there are two very different kinds of weight. Attention — the query/key/value projections and, in DeepSeek's case, the MLA machinery plus the KV cache — is small, compute-intensive, and touched on every token. The experts — the feed-forward networks that a router picks from — are enormous in aggregate but sparse in use: DeepSeek activates 8 of 256 routed experts per token, so most of that mass never moves for a given step.
So don't split by layer. Split by role. Keep attention and the KV cache on the GPU, where their density and latency-sensitivity are rewarded. Push the expert FFN weights out to system RAM, where their size is cheap and their sparsity means you only ever stream a couple of experts' worth of bytes per token. The GPU ends up holding the part of the model that's small and hot; RAM holds the part that's huge and cold.
Almost none of a 671B MoE model is ever on the GPU. What's on the card is attention. What's in your RAM is 250-odd experts, nearly all of them asleep at any instant.
This is the insight the marketing around "run it locally" keeps burying: ordinary DDR5 is normally far too slow to serve a large model, but MoE sparsity changes the arithmetic. You're not streaming 671B of weights per token from RAM — you're streaming the ~37B that fired. That's the difference between "impossible on a desktop" and "memory-bandwidth-bound but real."
llama.cpp: two flags and a regex#
In llama.cpp the idea is now first-class. The blunt instrument is --cpu-moe, which keeps all expert FFN weights in RAM and everything else on the GPU. --n-cpu-moe N is the graduated version: offload the experts of the first N layers, keep the rest on the card until your VRAM fills. For surgical control there's --override-tensor (-ot), which takes a regex over tensor names — a pattern like blk\.\d+\.ffn_.*_exps\.=CPU says "every expert FFN tensor, in every block, lives on CPU," leaving attention on the GPU by omission. The community offload guide is a study in tuning that regex against how much VRAM you have left over.
It works, it runs everywhere ggml runs, and for "I want this model answering tonight" it's the right call. (When the weights fit your VRAM to begin with, a datacenter engine like vLLM or SGLang is still the throughput king — offload is what you reach for when they don't.)
KTransformers: the same cut, industrialized#
KTransformers, out of Tsinghua's MADSys group and the kvcache-ai team (and a SOSP 2026 paper), takes the tensor-role split and builds an engine around it. It puts the compute-heavy MLA and KV cache on the GPU and runs expert computation on the CPU with kernels tuned for Intel's AMX matrix instructions and a cache-friendly memory layout. On a showcase box — dual-socket Xeon Gold 6454S, 8-channel DDR5, a single 24GB RTX 4090D — it reports running the full 671B DeepSeek-V3/R1 on ~14GB of VRAM plus 382GB of DRAM.
The numbers it claims against a llama.cpp baseline on the same hardware are the interesting part: prefill up to 27.79x faster (a V0.3 AMX path reaching 286 tokens/sec on prefill), and decode around 3x (13.69 vs 4.51 tokens/sec on the dual-socket config). It gets there partly through an expert-deferral scheduler that reorders when experts run so CPU and GPU work overlaps instead of stalling on each other — pushing CPU utilization from the ~75% a naive offload leaves on the table toward 100%.
The lesson underneath both tools is the same, and it's a planning lesson, not a benchmark: for local MoE inference, buy RAM and memory channels, not a second GPU. Your decode speed is bounded by how fast you can stream active experts out of system memory, which is why 8-channel DDR5 and AMX move the needle more than another card would. The 24GB GPU was never the constraint. It was barely holding the model at all.



