Paper Reading Notes · Quick-Read Edition · arXiv:2608.16157

FreeToken: Edge-Native MoE Serving
with Bandwidth-Adaptive Execution

Treat the personal computer as one unified, elastic inference platform: an 8GB-VRAM laptop runs a 35B model, a gaming desktop runs 284B, and a single workstation GPU runs the 753B GLM-5.2 — fast enough to sustain real agentic workloads.
Authors: Shuo Yang, Xiaoze Fan, Melissa Pan, Haocheng Xi, Zhe Wang, Shanlin Sun, Kurt Keutzer, Song Han, Matei Zaharia, Chenfeng Xu, Ion Stoica (UC Berkeley / UT Austin et al.; co-first authors; corresponding: Chenfeng Xu & Ion Stoica) Paper: arXiv:2608.16157 Code: github.com/FlashML-org/FreeToken
Edge InferenceMoE ServingExpert Offloading CPU-GPU Hybrid ExecutionAgentic WorkloadsKV / State Caching
01 · Overview

Overview: the claim and the key numbers

MoE models are a natural fit for the edge: each token passes through only a few of hundreds of experts. But saving computation doesn't save weights — the full expert pool can exceed VRAM by orders of magnitude. FreeToken's core claim: don't treat edge hardware as a "mini GPU"; treat the whole machine as one elastic inference platform, continuously remapping GPU, CPU, memory and PCIe interconnect according to the bandwidth and capacity actually available at runtime.

8GB laptop → 35B model
39.3 tok/sRTX 4060 laptop (NVFP4), coding-agent decode — 1.8× the best baseline
One workstation GPU → 753B
14.9 tok/sGLM-5.2 on a single RTX PRO 6000 — 2.0× llama.cpp (7.3)
TTFT tail (multi-turn agents)
< 44 s worst roundevery baseline exceeds 150 s somewhere (KTransformers: 946 s)
Decode stability
≤ 12% decayfrom single-turn W1 to the most agentic workload; KTransformers loses 31% by W2
One-sentence summary:once MoE fits the computation onto consumer silicon, local inference stops being about "does the model fit" and becomes about "how well the system orchestrates the whole machine". FreeToken derives a closed-form ratio from two measured bandwidths ($B_P$, $B_H$) and hands the residual cache misses simultaneously to PCIe transfer and CPU compute — exact outputs, saturated links — bringing 35B–753B open-weight inference from the data center back to machines people already own.
02 · Background

Background: the usability gap

Open models are rapidly closing the capability gap with closed ones (Kimi-K3, GLM-5.2, DeepSeek-V4-Flash-0731…); the access gap is not closing — frontier models still live on million-dollar data-center GPUs, and continuous API spending weighs on individuals and small teams. MoE opens a door: DeepSeek-V4-Flash has 284B parameters across 43 MoE layers, each with 256 routed experts of which only 6 activate per token — 13B active parameters, which fits an RTX 5090's 32GB at deployment precision. But sparsity saves per-token compute, not the memory of the full expert pool: the complete weights still far exceed VRAM, so inactive experts must live in host memory (or disk) and stream in on demand. MoE thus hands us both the opportunity (computation is feasible) and the systems challenge (serving is hard).

The infrastructure reality backing the claim: Steam has 200M+ monthly active users, ~72% of systems with a discrete NVIDIA GPU — hundreds of millions of "capable but idle" machines. What's scarce isn't hardware, but a serving system that treats heterogeneous consumer machines as one platform and automatically maps GPU/CPU/memory/interconnect onto the strongest runnable configuration.

Existing edge engines (llama.cpp, KTransformers, Ollama) fall short of the theoretical capability on three axes: prefill destroys sparsity (the union of routes over thousands of prompt tokens touches nearly every expert per layer — the working set turns dense); decode is the opposite trap (few experts per token, but misses cause repeated transfer/eviction/in-memory execution with no principled policy); and edge resources are diverse and dynamic (VRAM budgets shift under the browser and the game). The cost–capability picture, and where FreeToken lands:

Figure 1: FreeToken serves frontier-class models on consumer hardware at interactive speed — price/Elo frontier and decode throughput versus existing engines
Figure 1:FreeToken serves the models on the cost–capability Pareto frontier, at interactive speed on consumer hardware. (a) Blended API list price (9:1 input:output mix, following the token economics measured on real coding-agent traces) versus Code Arena Elo for representative hosted models. Blue squares mark models FreeToken serves, tagged with the consumer GPU class that serves them; the frontier segment from DeepSeek-V4-Flash to GLM-5.2 is exactly this set. (b) Mean decode throughput on real agentic workloads for the strongest model each hardware tier holds, against actively maintained edge engines. The dashed line marks the median decode speed of Codex in production traces (33 tok/s); × marks configurations an engine cannot serve. (a) X axis is blended hosted-API price (9:1 input:output), y axis is Code Arena web-dev Elo — cheap-and-strong sits bottom-right. The blue squares are exactly the models FreeToken runs natively on consumer GPUs: 35B-class → 4060 laptop, 284B-class → 5090 desktop, 753B-class → RTX PRO 6000. (b) The dashed line is Codex's production median decode speed of 33 tok/s: FreeToken meets or beats it in every hardware tier, while many baseline configurations are simply infeasible (×). The point of the figure: the old "cheap = weak" assumption is broken — locally-free models sit on the paid APIs' capability frontier.

💡 Click any image to view the original 300-DPI version; click again or press Esc to close.

03 · Challenges

Three challenges of agentic MoE on the edge

Challenge 1: prefill = expert transfer + recomputation, a double cost

Every prefill adds seconds of expert streaming. Decode touches k experts per token, but prefill is thousands of tokens × every layer — the union of routes activates essentially the whole expert pool, so one prefill streams the entire pool from host memory across the CPU–GPU link. For FP4-deployed DeepSeek-V4-Flash: ~140GB of expert weights needs ~2 s over PCIe 5.0 ×16 (~60GB/s, RTX 5090), 5 s over PCIe 4.0 ×16 (~25GB/s, RTX 4090/3090), 10+ s over the ×8 links common in laptops. In engines that fetch experts on demand, those seconds are pure GPU idle.

And agent tool calls trigger re-prefill constantly. Hybrid-attention architectures (full attention + sliding window, as in DSV4-Flash / GPT-OSS; or recurrent layers like Qwen3.6's gated DeltaNet, Kimi-K3's Delta Attention) compress past context into a single state or a recent window; each state costs as much KV memory as hundreds of tokens, so engines keep only a few checkpoints. But agents edit the context almost every turn — dropping old tool outputs, trimming thinking segments — invalidating every checkpoint after the edit point and forcing a re-prefill of thousands of tokens back to the nearest survivor. Consumer GPUs can't afford the repetition: an RTX 5090's dense BF16 compute is ~1/5 of an H100's and ~1/10 of a B200's.

Challenge 2: how to serve decode misses is decided by two measured bandwidths

Three root causes behind slow baselines: static placement misses routing traffic — llama.cpp splits MoE tensors across devices at load time, KTransformers pins "hot" experts at load time, but routing changes token by token, so placement frozen at prefill catches only a fraction of traffic and leaves GPU and PCIe idle. Consumer CPUs alone can't carry decode — at small batch, expert execution is memory-bandwidth-bound; consumer CPUs with dual-channel memory deliver ~50GB/s (DDR4) or 80–90GB/s (DDR5) against 1–1.8TB/s from GPU HBM. The right split is hardware-dependent — a miss can be transferred over PCIe and run on the GPU, or executed in place on the CPU, and neither is universally optimal; an RTX 4060 laptop (LPDDR5) and an RTX 5090 desktop (DDR5) sit at opposite ends of the "memory bandwidth vs. PCIe bandwidth" scale, and the optimal mix can't be read off a spec sheet — it must be measured on the real machine.

Challenge 3: no dedicated resources on the edge — even startup is slow

VRAM budgets fluctuate: the GPU shares with the compositor, the browser, the game — hundreds of MB to several GB get snatched at any moment; agent sessions accumulate context across turns while the expert working set stays fixed, so the KV/expert split chosen in round one is wrong many rounds later. The split must be adjustable at runtime without restarting the engine. Startup is slow and frequent: reading DSV4-Flash's ~140GB FP4 pool from 7GB/s NVMe takes ~20 s before any warm-up; edge users open and close engines and switch models constantly.

04 · Design

Design: two-tier expert memory + three mechanisms

The system is organized around a two-tier expert memory hierarchy: the expert pool in CPU memory (the complete routed-expert weights, always the source of truth) + a single elastic all-layer shared expert cache on the GPU (each slot holds all tensors for one "layer–expert" pair; residency, lookup and execution all use the logical (layer, expert) identity, not tensor shards). Non-expert weights stay resident on the GPU.

Figure 2: FreeToken overview — double-buffered prefill with semantic anchors, and decode miss handling by the q* policy
Figure 2:FreeToken overview. (1) Prefill: expert loading is double-buffered at full-layer granularity, streaming layer l+1 over PCIe while the GPU computes layer l; recurrent-state checkpoints are anchored at special-token boundaries, so a context edit resumes from the nearest surviving anchor and re-prefills only the new suffix. (2) Decode: most routed experts hit the shared LRU expert cache (here 8 of 12, following temporal locality). The m=4 misses are divided by q*=m·B_P/B_H between cache fills over PCIe (one expert) and in-place CPU execution (three), using bandwidths profiled on the deployed machine; the GPU and CPU partial outputs merge exactly. The host-resident expert pool remains the source of truth throughout. Top half (1) is prefill: while the GPU computes layer l from buffer A, a dedicated stream fills buffer B with layer l+1's complete expert set — whole-layer transfer needs no routing results. On the right, "semantic anchors": state checkpoints (▲) pinned at special-token boundaries (thinking / response / tool call / tool output / answer); after an edit (✂ deleted block) execution resumes from the nearest surviving anchor and only the new suffix is re-prefilled. Bottom half (2) is decode: the GPU router picks top-12 experts; 8 hit the LRU cache; the 4 misses (m=4) split by q* = m·B_P/B_H — this machine profiles B_P:B_H ≈ 1:4, so 1 expert is filled over PCIe (into the cache, reusable later) and 3 execute in place on the CPU; the partial outputs y_GPU and y_CPU merge exactly into y. The figure's point: every decision follows this machine's measured bandwidths, and the output merge is exact — no approximation.

Mechanism ① · Prefill: full-layer double buffering + semantics-aware state cache

Double buffering hides transfer behind compute.Because prefill activates nearly every expert per layer, FreeToken doesn't fetch on demand: it borrows two "full-layer buffers" from the global slot pool — while the GPU computes layer l's routed experts from buffer A, a dedicated transfer stream fills buffer B with layer l+1's complete expert set. Whole-layer transfer needs no routing results, so weight streaming proceeds continuously in the background. The buffers share one slot pool with the decode cache — no separate prefill cache, no phase handoff; entries surviving prefill serve latency-sensitive decode directly. When the pool can't free two whole layers, it falls back to on-demand loading and never oversubscribes VRAM.

Semantic anchors let recurrent states survive edits.Hybrid-attention models carry a second prefix resource besides the KV cache: the recurrent layers' "evolving state". Full-attention KV is managed by a radix prefix tree (as in SGLang); recurrent states can't be partially reused, so they live on checkpoints taken during prefill/decode. FreeToken keeps a small semantics-aware state cache: checkpoints hang on prefix-tree nodes, and a new request resumes from the nearest checkpoint that survives the edit. The checkpoint budget goes to special-token boundaries — thinking segments, tool calls, tool outputs, turn boundaries — precisely where agent frameworks edit: OpenClaw strips thinking blocks from all but the latest assistant turn, OpenCode replaces tool outputs beyond a protection window with placeholders, SWE-agent keeps only the last n observations. Frameworks preserve the exact prefix up to the edited block, so checkpoints anchored there are the most likely to survive; full-attention layers reuse KV up to the edit point, recurrent layers resume from the anchor, and only the genuinely new suffix is re-prefilled.

Mechanism ② · Decode: semantics-aware expert cache + the q* bandwidth-adaptive policy

At decode, the GPU router plus a cache lookup identify the set H of active experts already cached (executed on the GPU directly); the remaining m unique missing experts M are the hard part. Routing has strong temporal locality across steps (the same layer's consecutive tokens repeatedly route to overlapping/recent experts — measured across model families, Liang et al. 2025), so instead of a load-time placement, FreeToken keeps one all-layer shared LRU residency space: hits refresh recency, fills absorb newly selected experts, evictions drop the least recently demanded — scarce VRAM continuously tracks the current working set. The cache can't eliminate all misses (cold start, working-set shifts, capacity limits); the residual misses go to bandwidth-adaptive execution.

Split the m misses into a cache-fill set F and a CPU-execution set C (M = F ∪ C, q = |F|): F's experts transfer into cache slots, execute on the GPU, and stay for reuse; C's experts execute directly from the resident host pool without touching residency state. The two branches run concurrently: fills run at full PCIe speed while the CPU consumes only the host bandwidth left after the link saturates — turning "residual bandwidth" into progress on the current token without stalling cache updates.

The optimal split falls out of a residual-bandwidth argument. With S bytes per expert, and expert DMA sharing the host memory subsystem with CPU execution, the bandwidth left after PCIe saturates is:

$$B_R = \max(B_H - B_P,\ 0)$$

The two branches take:

$$T_{\text{fill}}(q) \approx \frac{qS}{B_P},\qquad T_{\text{cpu}}(m-q) \approx \frac{(m-q)S}{B_H - B_P}$$

Balancing the two concurrent branches (the layer's exposed latency is the slower of the two):

$$\frac{q}{m-q} \approx \frac{B_P}{B_H - B_P} \quad\Longrightarrow\quad q^{*} \approx m \cdot \frac{B_P}{B_H}$$

This single formula covers the whole hardware spectrum: as $B_H$ approaches $B_P$, $q^*$ approaches m and the system degenerates to pure on-demand cache filling (no separate execution branch needed). In practice q* is rounded; which experts enter F is the replacement policy's business; and at least one fill is always kept, so the cache keeps warming even when the CPU carries most of the load. Both bandwidths are profiled on the target machine at deployment.

Mechanism ③ · Elastic memory: VRAM affects performance, never correctness

Because the CPU-resident pool is the source of truth, any change in GPU memory moves performance only. Runtime cache reconfiguration:after non-expert weights and runtime state are allocated, the remaining budget splits between KV pages and whole expert slots — and the split isn't pinned at startup: at any scheduling safe point the GPU expert cache can be rebuilt with a revised budget, without restarting the engine or reloading the host pool, re-capturing the execution path dynamically. Fast startup:weights read directly into their final host layout and pin memory only after filling (pinning empty buffers first faults in and zeroes several GB of pages for nothing); no warm-up is needed — the first request starts cold, misses flow through the ordinary decode path of §3.2, and the cache warms up by serving.

Exactness:the CPU branch starts first; the GPU then walks the miss path (cache update → batched copies for F → grouped evaluation over the merged set G = H ∪ F) while CPU workers process C concurrently; the layer's exposed latency is the slower branch — exactly the quantity the formula balances. GPU and CPU compute partial sums that merge exactly, preserving the exact MoE output with no algorithmic approximation. The whole per-layer control flow (miss detection, set sizing, victim selection, CPU branch) is statically captured into a CUDA Graph — Section 5 explains how.
05 · Implementation

Implementation: putting "dynamic" inside a "static" CUDA Graph

FreeToken keeps the SGLang/vLLM GPU-centric architecture (paged KV + radix prefix reuse) and plugs into community kernel libraries (FlashInfer, Flash Linear Attention). On top sit two layers: a graph-compatible expert cache and storage/platform plumbing.

A CUDA-Graph-compatible LRU cache

The expert cache is inherently dynamic — which experts are missing, how many to fetch, which slots to evict change every step; host-driven control flow would pay an expensive device sync per MoE layer. FreeToken keeps all routing-related control on the GPU, expressing dynamic behavior with data captured inside a static graph: fixed-shape work buffers + a device-side valid count. A single GPU kernel per MoE layer deduplicates routed experts, classifies them against the residency table, derives q from the bandwidths, picks eviction victims, and rewrites logical routing IDs into physical slot IDs (or flags "CPU-execute"). Victim selection avoids the classic LRU trap of scanning the whole cache per eviction: one kernel pass finds the K least-recently-used candidate slots up front, and the miss path consumes the first q ≤ K on demand — victim discovery always costs one pass, independent of miss count. The resulting copy work-list drives a single fused transfer; expert banks share one logical-ID→slot mapping, so one device-side source/destination index list, launched once in fixed shape, applies to every bank; valid counts mask unused work. Result: fewer kernel launches, high PCIe utilization, and routing decisions moved off the host.

CPU execution resident in the graph

The CPU branch is captured into the same graph: for each supported decode batch size, stable pinned I/O buffers and persistent task descriptors are prepared, and the device→host copy, host-function submission node, concurrent GPU path, synchronization node and host→device result copy are all captured together. A replay is the complete heterogeneous step — no per-token Python scheduling. Workers are a persistent C++ pool pinned to physical cores, consuming expert weights with architecture-specific SIMD + in-kernel dequantization to stay bandwidth-bound, and returning gate-weighted per-token partial outputs.

Expert storage and platform plumbing

Expert banks + the FTW format:model-specific checkpoint layouts are normalized into a few expert banks, each with the flattened "layer–expert" ID (lE+e) as the leading dimension; rows with the same ID across banks compose one complete expert, and the GPU kernels and CPU executor share the same logical identity. FTW (FreeToken Weight) pre-merges expert weights into the runtime bank layout, so startup skips tensor discovery and repacking — parallel direct I/O reads aligned blocks straight into exactly-sized host banks, pinning only after the fill. Platform adaptation:GPU kernels are selected at load by expert representation/GPU architecture/CUDA environment; the CPU executor dispatches to available SIMD implementations and core topologies. When the full pool can't be pinned/registered for DMA (OS and driver limits), a pure-CPU MoE backend kicks in: weights stay in pageable host memory, all routed experts execute on the CPU, non-expert layers stay on the GPU, and only activation-sized inputs, routing metadata and aggregated outputs cross the CPU–GPU boundary — trading peak transfer bandwidth for "deployable even when the fast path can't come up".

06 · Evaluation

Evaluation: 4 real agent workloads × 6 machines × 4 baselines

Setup

Hardware:six discrete-GPU systems — five consumer machines + one workstation (RTX PRO 6000 Blackwell, 96GB). The 3090/4090/5090 are rented dual-socket servers whose CPUs far outclass edge hosts, so all serving and bandwidth measurements cap them at 6 CPU threads pinned to the GPU's NUMA node; capped this way they deliver 56.7–77.3GB/s host bandwidth, the same magnitude as the two real edge machines at full threads (desktop 16-core: 53.8; laptop 14-core: 47.5). All bandwidths are measured on deployed tensor shapes, not taken from spec sheets.

Table 1: the six test systems with measured B_P and B_H
Table 1:Test systems. B_P is the measured host-to-device expert-transfer bandwidth over PCIe; B_H is the measured effective bandwidth of the CPU-side MoE expert kernel. On the three rented servers the CPU-thread and DRAM columns give container quotas. B_P = measured PCIe expert-transfer bandwidth, B_H = measured effective CPU-side expert-kernel bandwidth. Note that the three "servers" are edge hosts simulated by capping cores and bandwidth; the real edge machines are the 5090 desktop (Ryzen 9950X3D, DDR5) and the 4060 laptop (LPDDR5). B_P:B_H spans 52.7:77.3 ≈ 1:1.5 (5090 server) to 11.8:47.5 ≈ 1:4 (4060 laptop) — the whole breadth of the scale, which is exactly why a fixed split policy can't work and q* must be measured per machine. The PRO 6000 has 512GiB DDR5 and high B_H (178GB/s), supporting the 753B-class demo.

Models:DeepSeek-V4-Flash (284B/13B active, natively MXFP4-quantized experts) and Qwen3.6-35B-A3B (BF16; the 8GB laptop uses the official NVFP4 build); the cross-hardware study adds GLM-5.2 (753B/40B active, NVFP4, 433GB checkpoint). Workloads:W1 math reasoning (AIME — long CoT, no tools, single-turn, decode-dominated); W2 coding agent (SWE-bench tasks through the OpenCode framework with real tool execution); W3 coding agent on its native protocol (the same tasks through Claude Code's Anthropic-compatible endpoint, spawning concurrent sub-agents, sessions reaching 56–65k tokens); W4 email/calendar agent (OpenClaw default config for thirteen rounds, its 120s idle watchdog disabled so slower engines remain testable, ~24.5k-token system-context base). Coding tasks must produce the reference gold patch; W4 must complete all thirteen rounds. Baselines:llama.cpp / Ollama / KTransformers / MoE-Infinity (where supported), weight formats bit-aligned (MXFP4 blocks bit-exact). Metrics:mean per-request decode throughput and mean TTFT; agent trajectories differ per engine, so total wall-clock is not compared.

End-to-end results (RTX 5090)

Figure 3: end-to-end serving on the RTX 5090 across four workloads and two models — decode TPS and TTFT
Figure 3:End-to-end serving on the RTX 5090 across four workloads (1. AIME, 2. OpenCode+SWE, 3. Claude Code+SWE, 4. OpenClaw+Email/Cal) and two models (Qwen3.6-35B-A3B BF16 and DeepSeek-V4-Flash MXFP4). Top: decode TPS; bottom: mean TTFT (log scale). × marks configurations an engine cannot serve (Ollama and MoE-Infinity lack DSV4 support; MoE-Infinity provides no usable server for multi-turn agents). Top — decode speed: on Qwen3.6 FreeToken holds 77–83 tok/s, 1.8–2.3× the strongest baseline per workload (usually llama.cpp); on DSV4-Flash 22–25 tok/s, 1.5–1.9×. And the more agentic the workload, the more stable FreeToken stays: within 12% of its single-turn W1 rate, while the most context-hungry baseline (KTransformers on DSV4) has already lost 31% by W2 — single-stream benchmarks overstate baselines' agentic performance. MoE-Infinity only runs W1 (8.8 tok/s); long prompts abort at its per-expert prefill cap. Bottom — TTFT (log scale): FreeToken takes 5 of the 6 multi-turn cells for lowest mean (the exception, Qwen3.6×W3, goes to KTransformers' GPU-prefill arm); W1's short single-turn prompts go to llama.cpp. The tail gap is bigger than the means: FreeToken's worst round stays under 44 s while every baseline exceeds 150 s somewhere (llama.cpp 232 s, Ollama 179 s, KTransformers 946 s) — beyond OpenClaw's 120 s watchdog and Claude Code's default request timeout, real agent clients would simply abandon the request. Tail TTFT is an availability boundary, not a latency statistic.

Attribution: where the gains come from

Pipelined prefill (Figure 4a).Double buffering makes prefill transfer-bound: with overlap on, each 8,192-token chunk completes in 1.19–1.22 s — exactly the time to stream the 64.4GB expert pool at 52.7GB/s, i.e. the practical limit of PCIe 5.0 ×16, with expert compute fully hidden; throughput reaches 6.7k tok/s at 16k tokens. Disabling the second buffer serializes transfer and compute, losing 19% / 25% / 26% at 4k / 8k / 16k — the penalty grows with prompt length.

Expert locality (Figure 4b).Decode routing has strong short-range locality — per-miss LRU beats any placement chosen at prefill time. Replaying identical routing traces from all four workloads over three placement policies at equal cache capacity: at RTX 5090 capacity (37% of Qwen3.6's expert pool, 11% of DSV4-Flash's), FreeToken's global LRU achieves decode expert-read miss rates of 16% / 39%, KTransformers' prefill-updated placement 41% / 59%, and llama.cpp's routing-blind static split 62% / 89% — the ordering holds at every capacity short of the full pool.

Figure 4: prefill TPS versus prompt length, and decode expert miss rate versus cache size under three placement policies
Figure 4:(a) Prefill TPS versus prompt length (RTX 5090, Qwen3.6-35B BF16), with and without FreeToken's pipelined full-layer loading. (b) Decode-time expert miss rate versus cache size (as a percentage of the expert pool) under the three engines' placement policies, replayed on identical routing traces; lines are means over W1–W4, bands the min–max range. (a) Prefill throughput vs. prompt length from 1k→16k: FreeToken (solid) rides the transfer ceiling and clearly separates from the no-overlap variant and KTransformers/llama.cpp/Ollama past 2k — the gap reaches 2–3× from 4k, confirming the value of hiding whole-layer transfers inside compute. (b) Miss rate vs. cache capacity (% of expert pool, min–max bands) for Qwen3.6 and DSV4-Flash: the policy curves order identically everywhere — FreeToken (LRU) < KTransformers (prefill update) < llama.cpp (static) — and the smaller the capacity, the wider the gaps. Static placement can't catch routing traffic; LRU follows the working set.

Cross-hardware serving (Figure 5).W2 repeats on five consumer machines: FreeToken leads the best baseline by 1.3× (3090/4090), 1.9× (5090 server), 2.1× (5090 desktop), 1.8× (4060 laptop); on the 8GB ×8-lane laptop the NVFP4 build sustains 39.3 tok/s — 92% of a 4090. The two 5090 columns share silicon and differ only in the host: swapping from the multi-channel server to the dual-channel consumer desktop costs FreeToken 4% of decode speed, while llama.cpp — whose CPU-resident experts starve on dual-channel DDR5 — drops to 80%: dynamic split following measured bandwidths at work. Frontier tier: on a single RTX PRO 6000, FreeToken serves GLM-5.2 at 14.9 tok/s vs. llama.cpp's 7.3 (2.0×), with bit-identical expert weights and comparable mean TTFT (7.5 vs. 7.8 s); KTransformers has no servable path on this machine at all — its GLM-5.2 approach needs 753GB–1.5TB of host memory (the machine has 512GiB) and its CPU kernels can't read GLM-5.2's NVFP4 layout.

Figure 5: coding-agent decode TPS across consumer GPUs, plus the GLM-5.2 demonstration on RTX PRO 6000
Figure 5:Coding-agent decode TPS across consumer GPUs (SWE issues via the OpenCode harness), Qwen3.6-35B-A3B. 4060 laptop using NVFP4, the other Qwen3.6 columns BF16. The RTX PRO 6000 column is a separate demonstration: GLM-5.2 (753B-A40B, NVFP4) on the math workload; Ollama is not run there. × marks configurations an engine cannot serve. Six bars: 4060 laptop (8GB, weakest) → 3090 → 4090 → 5090 server → 5090 desktop → RTX PRO 6000 (GLM-5.2, separate demo). FreeToken tops every bar — 50+ tok/s in the desktop class, and even the 4060 laptop reaches ~39 tok/s, above the 33 tok/s production-Codex median. llama.cpp and KTransformers are simply infeasible (×) on the 4060 laptop — on the machines that need this system most, the baselines are absent.
Evaluation in one paragraph:① at equal VRAM, LRU following routing vs. static placement cuts miss rates from ~60%/~90% to ~16%/~39%; ② layered miss serving keeps FreeToken ahead across the whole host-bandwidth spectrum from 47 to 77GB/s; ③ throughput stays stable under agentic load (TTFT tail < 44 s) while baselines blow past client timeouts; ④ the demos push "what can run" from 35B to 284B to 753B.
07 · Commentary

Commentary: strengths and open questions

Highlights

Open questions

Positioning:between the "MoE as sparse computation" academic line (MoE-Infinity et al.) and the "CPU as a second engine" engineering line (KTransformers et al.), FreeToken adds a third coordinate: splitting miss service by measured bandwidth, validated on agentic rather than single-turn benchmarks. The two transferable ideas: ① semantic boundaries are cache anchors — any frontend that edits context is telling you where it will truncate; ② residual bandwidth is free compute — after PCIe saturates, the CPU shouldn't idle; it should eat the experts that can't be moved but can be computed.
Glossary

Glossary

Hover any dotted-underlined abbreviation in the text, or come back here any time.

Reading glossary (abbreviations with dotted underlines are hoverable in the text)
Abbr.Full nameOne-line explanation
MoEMixture-of-ExpertsLayers with hundreds of experts; each token routes to only a few — computation is sparse
$B_P$PCIe expert-transfer bandwidthMeasured host→GPU expert-transfer bandwidth; sets the fill branch's rate
$B_H$Host expert-processing bandwidthMeasured effective CPU-side expert-kernel bandwidth; sets the CPU branch's rate
$q^*$optimal fill countq* ≈ m·B_P/B_H — of the m missed experts, how many to fill over PCIe vs. execute on the CPU
TTFTTime To First TokenRequest-to-first-token latency; what agents feel between tool rounds
KV cacheKey-Value cacheAttention layers' cached keys/values; often exceeds VRAM at the edge, hence a memory-management target
LRULeast Recently UsedEvict the least recently used entry first; FreeToken's expert cache follows routing locality with it
CUDA GraphCaptures a sequence of kernels as a static graph replayed as a whole, eliminating per-launch and sync overhead
FTWFreeToken WeightFreeToken's weight format: pre-merged into the runtime bank layout, so startup skips repacking
MXFP4 / NVFP44-bit float formats4-bit floating-point quantization formats; DSV4-Flash ships native MXFP4, some newer models NVFP4
radix prefix treeTree structure sharing KV/state by prefix; naturally supports cross-request prefix reuse
agentic workloadMulti-turn, tool-calling workloads with continuously edited context; TTFT-sensitive
gated DeltaNet / Delta AttentionRecurrent attention variants compressing the prefix into an evolving state; checkpoints needed for reuse