White paper · 2026-10-29 · updated 2026-11-02
How AlphaInfer makes local decoding fast
AlphaInfer is the engine backend inside AlphaLlama and its server, AlphaServe (alphallama-serve). It runs large open-weight models on one consumer GPU, including models that do not fit in that GPU's memory. This paper explains where single-user decode time goes and the engineering choices that recover it. Each claim comes with the measurement behind it.
Numbers are decode tokens per second (prompt processing excluded), greedy, one user, unless stated otherwise. Every number carries its date, GPU, model and mode. Local inference moves fast, so read each one as a measurement at that point, not as a permanent property. For current head-to-head results under one set of rules, see InferArena.
1. The problem: batch-1 decode is a byte problem
Generating one token for one user means reading every active weight of the model once, plus the attention cache, and doing very little arithmetic on each byte. On a consumer GPU this makes decode memory-bandwidth-bound, not compute-bound. The cost of a token is set by:
| Cost | What drives it |
|---|---|
| Weight bytes | Model size × quantisation. Mixture-of-experts (MoE) models read only the routed experts, but each token routes to a different set. |
| Launch and host overhead | A transformer layer is dozens of small GPU kernels. At batch 1 many are shorter than their own launch latency. |
| Host↔GPU transfers | When the model is larger than the GPU (expert offload), missing experts must come over PCIe or be computed on the CPU. |
| Tokens per step | Plain decoding produces one token per full pass over the weights. Speculative decoding can commit several. |
AlphaInfer attacks all four. Its working rule comes from repeated measurement: at batch 1, only removing bytes, removing launches from the critical path, or committing more tokens per weight pass pays. Fusing work into a kernel that is already bandwidth-saturated moves bytes around but saves no time.
2. One captured graph per decode round
A decode round (one forward pass over 1–8 token rows) is recorded once and replayed as a single CUDA graph. Everything that changes per request is ingress data written into fixed buffers, so graphs are never rebuilt during generation: token ids, positions, which expert lives where, and draft tokens. The engine owns its round capture, mixing ggml subgraphs and AlphaInfer's native kernels in one graph. It has no graph IR and no virtual dispatch inside the layer loop.
Measured on an RTX 3090, Qwen3.6-35B-A3B Q4_K_M, September 2026:
| Milestone | Decode | vs the llama.cpp-derived fork, same session |
|---|---|---|
| Adapters over the fork's kernels, eager | 111 tok/s | 0.75× |
| Rounds recorded once per KV bucket, replayed | 157.9 tok/s | 1.06× |
| Own round capture + native MoE merge kernel + zero-copy fused projections | 171 tok/s | 1.14× |
The 1.14× was measured on one 1,024-token prompt, 3 interleaved runs per arm, against a fork baseline of 150 tok/s with CUDA graphs on.
What did not pay. Saving a launch inside an already-captured graph is worth roughly nothing; replay hides it. What pays is deleting a latency-bound kernel from the critical path, which saves its full duration.
3. Speculative decoding, priced by the verify column
Speculative decoding drafts several tokens cheaply, then verifies them in one wider pass. Every accepted draft is a token that cost no extra weight pass. AlphaInfer supports three drafters:
- MTP head. The model's own multi-token-prediction layer drafts 2–5 tokens.
- Prompt lookup / suffix copy. For copy-heavy work (editing a file, renaming across a file, rewriting code), the draft is copied from the prompt or the output so far. It can be up to 16–64 tokens wide.
- DFlash2 block drafter for the dense 27B.
3.1 The insight: a draft's real price is its verify column
Profiling the 35B on the 3090 (2026-09-18) split the cost of one extra MTP draft into two parts:
| Part | Cost |
|---|---|
| The extra verify column | ~1.13 ms |
| Producing the draft | ~0.60 ms |
The column is expensive because, in an MoE model, each extra verified token routes to experts the other tokens did not need, so it adds weight bytes. Tuning the drafter attacks the smaller half. AlphaInfer therefore optimises which drafts are worth verifying.
3.2 Confidence-gated verify width
The MTP head's max-softmax confidence is well calibrated: the probability that a draft is accepted tracks it closely. AlphaInfer verifies the leading drafts only while their cumulative confidence stays above a threshold τ. A draft is worth verifying only if its expected acceptance exceeds (column cost ÷ time per token).
| Measurement | Result |
|---|---|
| 35B, RTX 3090, 8 prompts × 2 | fast mode +4.65% ± 1.21%; exact mode +5.4%, output still bit-identical |
| 35B, RTX 5090, 12 prompts, shipped defaults (fast τ = 0.2, exact τ = 0.3) | fast +2.85% vs no gate |
The gate is off for the dense 27B in fast mode, where a column costs only ~0.9 ms against ~5 ms per token, so it cannot pay.
3.3 Script-adaptive draft vocabulary
To keep drafting cheap, the draft head scores a 131,072-row subset of the vocabulary. A fixed "first 131K ids" subset left 79% of Arabic, 55% of Russian and 38% of Korean output tokens impossible to draft. AlphaInfer picks the same number of rows per request from the Unicode scripts in the prompt, so drafting costs the same.
| Language | MTP speed change (35B, k = 3, identical text) |
|---|---|
| Arabic | +82% |
| Russian | +62% |
| Korean | +55% |
| Japanese | +21% |
| Spanish | +15% |
| German | +10% |
English was unchanged. A benchmark run on English prompts only had hidden this.
3.4 Copy-heavy work: many tokens per round
When the output largely repeats the input, lookup drafting commits whole spans per round. The 3090 maximum-speed record (2026-10-21) came from this: 1,153.5 tok/s single-stream on the 35B in fast mode, on a rewrite-the-file prompt. It averaged 24 tokens per round at 21 ms per round, with all 504 lookup drafts accepted.
3.5 Two drafters, two probability lines: MTP and the n-gram copy
Both drafters are judged by the same quantity: for the k-th drafted token, the probability that the verify pass accepts it, given that drafts 1 to k−1 were accepted. We call this the conditional hit rate. Multiplying the conditional rates for 1 to k gives the chain survival: the chance that a draft delivers at least k tokens. The two drafters draw very different lines, and how AlphaInfer combines them follows from that shape:
- MTP starts high and decays with depth.
- The n-gram copy starts lower on new text, but once it aligns it stays flat, because it is copying.
| Setting | Value |
|---|---|
| Model | Qwen3.8-Flash-Next IQ3_XXS (~125B MoE) with expert offload |
| GPU | RTX 3090 |
| Prompts | The three InferArena sets: A = 4 short chat and code requests (mostly new text), V = 14 held-out tasks, R = 7 edits and rewrites |
| Decoding | Greedy (temperature 0), one pass |
| MTP | Depth 3, draft min-p 0.5 |
| N-gram copy | Longest suffix match of 3–16 tokens, most recent occurrence, copies up to 15 tokens |
| Data | Every decode round logged: 1,983 rounds with both drafters, 2,753 rounds with MTP only |
MTP: high at depth 1, falling with depth. Measured with MTP only, so the copy never takes the easy rounds:
| Set | d1 | d2 | d3 | |
|---|---|---|---|---|
| A | conditional hit rate | 0.867 | 0.870 | 0.912 |
| head's own top-1 probability | 0.875 | 0.925 | 0.937 | |
| chain survival | 0.867 | 0.754 | 0.688 | |
| V | conditional hit rate | 0.892 | 0.919 | 0.907 |
| head's own top-1 probability | 0.910 | 0.948 | 0.953 | |
| chain survival | 0.892 | 0.819 | 0.743 | |
| R | conditional hit rate | 0.948 | 0.956 | 0.953 |
| head's own top-1 probability | 0.950 | 0.977 | 0.979 | |
| chain survival | 0.948 | 0.907 | 0.865 |
- The falling line is the chain survival: it loses 10–13 points per depth on new text.
- The conditional rate stays flat, because min-p 0.5 stops drafting before a low-confidence token. A draft the head is unsure of is never verified.
- The head is well calibrated: its own top-1 probability is within 1–4 points of the measured hit rate at every depth.
Each extra depth also costs a verify column plus a draft step (§3.1), so MTP is capped at depth 3, which delivers 3.2–3.6 tokens per round.
The n-gram copy: low where text is new, high and flat where it repeats. Replayed at every output position, so this is what the copy would have done whether or not it was used:
| Set | positions with a match | n1 | n2 | n3 | n4 | n8 | n12 | n15 | tokens per matched position |
|---|---|---|---|---|---|---|---|---|---|
| A: conditional | 15.6% | 0.481 | 0.420 | 0.476 | 0.400 | – | – | – | |
| A: chain survival | 0.481 | 0.202 | 0.096 | 0.038 | – | – | – | 0.8 | |
| V: conditional | 50.7% | 0.844 | 0.897 | 0.926 | 0.944 | 0.959 | 0.964 | 0.970 | |
| V: chain survival | 0.844 | 0.756 | 0.700 | 0.659 | 0.547 | 0.465 | 0.420 | 8.6 | |
| R: conditional | 83.0% | 0.968 | 0.983 | 0.988 | 0.988 | 0.991 | 0.994 | 0.995 | |
| R: chain survival | 0.968 | 0.949 | 0.935 | 0.920 | 0.877 | 0.847 | 0.828 | 13.3 |
- Short requests (A). The copy rarely applies (15.6% of positions), and its first copied token is right only 48% of the time, against MTP's 87%. Its line is the low one.
- Held-out tasks (V). The first copied token (0.844) is still below MTP's first draft (0.892), but the copy's conditional rate rises with offset, to 0.97 by token 15: a copy that has started to match keeps matching. Where it runs, it delivers 8.6 tokens per matched position, against MTP's ceiling of 4.
- Edits (R). The high line: 0.968 on the first token and still 0.828 chain survival at 15 tokens, so a matched position yields 13.3 tokens on average, which no MTP depth can approach.
The copies the server actually takes are better than this replay, because its policy filters out weak ones before they are verified: on V the first copied token is accepted 98.8% of the time, and chain survival at 15 tokens is 0.494 instead of 0.420.
How AlphaInfer combines them. Each round prefers MTP and switches to the copy only when two conditions hold:
- A suffix match exists and MTP's own first draft agrees with the copy's first token, which catches spurious repeats in new text.
- For short matches (under 6 tokens), the copy's expected tokens per millisecond beats the MTP draft's by 3%. The expectation is measured online for each match length.
| Set | MTP only: rounds | Both: MTP rounds (tokens/round) | Both: copy rounds (tokens/round) | Rounds saved |
|---|---|---|---|---|
| A | 211 | 209 (3.17) | 2 (2.0) | 0% |
| V | 1,669 | 1,207 (3.07) | 168 (11.5) | 18% |
| R | 873 | 213 (2.93) | 184 (14.1) | 55% |
On short requests the copy almost never fires and MTP carries the set. On held-out tasks the copy takes 12% of rounds but delivers 11.5 tokens in each. On edits it takes nearly half the rounds at 14 tokens each and halves the number of rounds. A verify round costs about the same however wide it is (§3.1), so rounds saved is time saved.
Result against Strata 0.2.8. The InferArena run of 2026-11-01/02 (AlphaLlama v2 release candidate in fast mode against Strata 0.2.8 at its own 32K launch configuration, one window per GPU, two passes with the second in reversed order, a fresh server per arm). Decode tok/s, per-prompt mean of the two passes, geometric mean per set:
| GPU | Set | AlphaLlama (fast) | Strata 0.2.8 | AlphaLlama ÷ Strata |
|---|---|---|---|---|
| RTX 3090 | A | 143.5 | 143.8 | 1.00 |
| V | 153.9 | 150.2 | 1.02 | |
| R | 251.5 | 173.0 | 1.45 | |
| A/V/R geomean | 177.1 | 155.2 | 1.14 | |
| RTX 4080 | A | 124.8 | 119.4 | 1.05 |
| V | 134.5 | 135.7 | 0.99 | |
| R | 210.9 | 164.4 | 1.28 | |
| A/V/R geomean | 152.4 | 138.6 | 1.10 | |
| RTX 5090 | A | 265.2 | 276.3 | 0.96 |
| V | 309.4 | 312.1 | 0.99 | |
| R | 540.5 | 390.0 | 1.39 | |
| A/V/R geomean | 354.0 | 322.8 | 1.10 |
The R lead is the copy line above. On A and V, where MTP carries most rounds, the two engines are level. Across the three GPUs the InferArena fast board's Speed Index is AlphaLlama 1.09, Strata 1.00.
4. Exact mode and fast mode
Speculative decoding can change the output text: a wider verify pass can round differently from a one-token pass, and in a near-tie that flips a token. AlphaInfer offers two modes.
| Mode | Guarantee | Default? |
|---|---|---|
| Exact | Output identical to plain (non-speculative) decoding of the same build | Default where the model fits the card (the RTX 3090 35B and 27B rows) |
| Fast | Output may differ slightly from plain greedy text on long outputs; quality is gated by paired NLL | Default on the 16 GB offload rows (RTX 4080 35B and 27B); always labelled in benchmarks |
Making speculation exact took specific engineering:
- Column-position invariance. The same token is verified in different column slots in different rounds, so every 2–8-column kernel must give bit-identical results for a column whatever its index. One tensor-core kernel broke this because the compiler contracted the even- and odd-column epilogues differently. It was fixed with explicitly rounded FMA/multiply intrinsics, and every verify kernel is now gated by a column-rotation test.
- Batch-invariant attention where the verify width would otherwise change the attention split.
- A teacher-forced comparator. It forces the drafts to the plain run's tokens and diffs logits bitwise at each position. Matching generated text over a short horizon is not evidence of exactness: our early "MTP == plain" results were argmax agreement over short outputs, and the comparator showed the first decoded position already differed at 2e-3.
Status as of 2026-10-29
| Model and setting | Result |
|---|---|
| Qwen3.8-27B, RTX 3090, batch-invariant build, q4_0 KV, wide exact verify K = 7 | exact == plain, 4/4 prompts at ctx 131,072 |
| Qwen3.8-27B, RTX 4080 shipped config (4 FFN layers + embeddings on the CPU, the only way it fits 16 GB), K = 3 | exact == plain 1/4: exactness depends on the fit settings |
| Qwen3.6-35B-A3B, RTX 3090, q8_1 activation staging off | exact == plain, 4/4 at ctx 32,768 (staging on: 1/4). Staging is now off by default for this reason. |
| Qwen3.6-35B-A3B, RTX 4070, expert offload, drafting off, per-request residency reset | output repeatable 4/4 across starts in both request orders (repeatability, not exact == plain) |
| Flash-Next serving, RTX 4080, expert offload, exact mode (no MTP), per-request residency reset | output independent of request order through AlphaServe: set A forward vs reversed 4/4, same-order control 4/4 (2026-10-29; not yet checked on the 3090) |
The 35B at ctx 98,304 (staging off) is still open. The Flash-Next reset costs +0.3–0.5 s TTFT per request (the expert slots are recopied); decode is unchanged.
5. Running models larger than the GPU: expert offload v2
MoE models such as Qwen3.6-35B-A3B (22.7 GB) and Qwen3.8-Flash-Next (~125B parameters, ~71 GB at IQ3_XXS) do not fit a 16–24 GB card. AlphaInfer keeps the hottest experts in VRAM and serves the rest from system RAM. The design goal is no host round trip inside a decode round.
| Mechanism | What it does |
|---|---|
| Device expert table | The GPU kernels read expert → slot (VRAM), host tier, or miss from a device table. No per-layer host sync. |
| Doorbells + CPU miss workers | The GPU writes the routed ids and activations to mapped host memory. CPU workers compute the missing experts with the same quantised formats. The GPU spin-waits behind the shared expert and the hits. |
| Profile fill at load | Slots are filled from a per-model routing profile before the server reports ready. |
| Admission between rounds | The hottest missed experts are copied into the coldest slots on a copy stream. They are published in the table only after the copy lands, so no round reads a slot in flight. |
| Grouped expert kernels | Each distinct expert's weights are decoded once and applied to every routed row, with fused gate + up + SwiGLU. |
| Pinned RAM tier | Experts that are not resident live in pinned host memory, not demand-paged files. |
5.1 What the measurements taught us
- Shared slot banks. Per-layer fixed slots capped the warm hit rate at 98.5%, because early layers touch far more distinct experts. One shared bank across layers with the same expert types removed those warm misses entirely, using the same memory: 146.1 tok/s vs the fork's 137.1 on the 35B on a 4080, and 295 tok/s with MTP k = 3.
- "Async" copies are not free. Admission DMAs queued at the round boundary delayed the next round's own small uploads, because they share the link in issue order. Queuing them after the round launches made rounds +10–11% faster, with identical tokens (3090).
- Time the host before blaming the GPU. On Flash-Next, a 3.7 ms per-round gap was serial reads of hashed embedding rows from a 29 GB table on NVMe, not GPU kernels. Prefetching the round's rows first (fadvise WILLNEED) took one prompt from 97.9 to 111.7 tok/s, identical text.
- CPU thread placement is a first-order lever. On a 64-core Threadripper, a spinning miss pool on every core starved the GPU-launch thread through its SMT siblings. Capping and spreading the pool took plain decode from 66 to 112–116 tok/s with the same hit rate. AlphaInfer now isolates the launch thread's core by default.
- Prefill copies can block the host. Thousands of per-expert copies filled the copy queue and stalled kernel launches for 1.0 s at 16K tokens. Coalescing consecutive experts into one copy cut 16K prefill from 6.9 to 6.5 s with identical output (4080).
- Batched state folds. After each speculative round, the recurrent (GDN) state of every layer is folded with 3 launches instead of 72+, on a side stream that overlaps the next draft (3090: commit 0.70 → 0.34 ms per round).
5.2 The automatic path: AlphaServe detects the model and the GPU, then picks the offload layout
A user should not have to know whether a model fits. alphallama-serve -m model.gguf, with no other flags, reads the GGUF metadata and the GPU's free memory before loading anything, then sets every switch the operator left unset. It reads the architecture, MoE or dense, the size and bits per weight of the expert tensors, and whether a draft head is in the file or in a sidecar next to it. Any explicit setting wins; ALPHA_AUTO=0 turns the whole thing off. Because some engine switches are read before main(), the server re-executes itself once with the chosen settings, so they actually take effect.
| What the server finds | What it picks |
|---|---|
| A model + GPU pair with a validated AlphaInfer row (matched by file hash and GPU architecture) | The AlphaInfer engine with that row's tested configuration (sections 2–5.1) |
| The model fits (model + 2 GB ≤ VRAM) | Everything resident; MTP on for dense models |
| An MoE that does not fit | Fused-infer (below), with the routing profile shipped beside the model, a larger prompt micro-batch on 16 GB cards, and MTP at depth 2 when a head is present |
| A dense model that misses by a little | Every layer on the GPU with a 4K context and MTP off, instead of partial offload: each layer left on the CPU costs ~17% |
The plain llama-server-derived binary in the same package routes itself the same way. When an MoE does not fit and the command line asks for nothing the server-only engine lacks, it hands the request to AlphaServe. This is roughly 8× faster on such a model than running it partially on the CPU.
Fused-infer: three memory tiers as one expert store
The GPU sees a model several times its VRAM as if it were resident:
| Tier | Role |
|---|---|
| VRAM expert pool | The hottest experts, read in place through a device table (expert → slot), with no copy |
| Pinned RAM hot tier | The rest of the experts, held in pinned host memory and filled at load |
| SSD | The memory-mapped model file, for anything the RAM tier cannot hold |
Device-resolved experts (DRE). Decode reads each routed expert through that table. A non-resident expert is not copied over PCIe (~12 GB/s on these cards). Instead it is computed by CPU workers where it already sits in RAM (~50–70 GB/s), joined through a doorbell, with one CUDA graph per token instead of ~146 host-synchronised splits.
- The idea behind it: the CPU path is a second bandwidth pipe that runs in parallel with PCIe, so it routes around the link rather than waiting on it.
- It was first shown with the earlier expert cache's CPU-inline split (122B MoE, RTX 3090, 2026-07-19): CPU-only 12.4, GPU pool-direct 14.3, both pipes balanced 15.6 tok/s.
- Flash-Next on the RTX 4080, 2026-10-04, decode at 1K / 4K / 16K, the first DRE build vs the earlier expert cache: 45.6 / 42.9 / 33.2 → 48.3 / 50.4 / 41.6 tok/s.
- The auto profile now picks DRE for every MoE that does not fit, because it beat the expert cache at every pool size tried.
What the measurements taught us about the automatic path
- Pace the admission copies. Admission DMAs share the copy engine with each graph's small input uploads, which are served in submission order. Draft steps took 5.0 ms with admission on vs 1.6 ms off. A pacer that feeds admissions in 256 KB chunks brought drafts to 1.1–1.2 ms (Flash-Next, 4080).
- Size the CPU pool to the host, not to the core count. On a 64-core Threadripper, the default "every core but one" pool starved the decode and driver threads. 32 pool threads took Flash-Next from 66 to 112 tok/s (+70%, RTX 5090, 2026-10-22), with the same ~96% pool hit rate.
- Let the prompt borrow the expert pool. A long prompt streams nearly every expert per micro-batch chunk, about 43 GB over PCIe per chunk on Flash-Next. On 16 GB cards the auto profile prefills a 16–18K prompt in one 18,432-row micro-batch, which borrows pool memory and restores it before decode. That brought 16K time-to-first-token to parity with Strata on the 4080 (2026-10-20).
- Reuse the recurrent state across turns. Hybrid (attention + recurrent) models cannot drop a KV suffix, so chat turns used to re-prefill everything. Checkpointing the recurrent state at the prompt boundary makes the next turn continue from it. The output is byte-identical, and multi-turn TTFT fell from 3.1 to 0.32 s (−90%).
- Pinned memory has a host-side cost. The pinned RAM tier lets a 71 GB Flash-Next run on a 62 GB-RAM 3090 box with no settings. But any large pinned region feeds the kernel's memory-compaction daemon, which can make some starts run slow on a busy box (seen on both engines). Huge-page hints made this worse, so the tier is filled without them by default.
Measured on a bare -m (server decode counter, 2026-10-13)
| Box | Model | Auto profile | Comparison |
|---|---|---|---|
| RTX 3090 24 GB | Flash-Next IQ3_XXS (fused-infer) | 88.9 tok/s | hand-tuned 88–91 |
| RTX 3090 24 GB | Qwen3.8-27B (MTP) | 63.0 tok/s | plain decode 45.5 |
| RTX 4070 Laptop 8 GB | Qwen3.6-35B (fused-infer + MTP) | 57.1 tok/s | FreeToken, matched settings, 23.1 |
Where a validated AlphaInfer row exists, it is faster than this generic path. On the 4080 Flash-Next protocol run (2026-10-28), AlphaInfer v2 gave 113.3 / 129.0 / 201.0 against the built-in path's 73.8 / 70.6 / 81.2. The automatic path is the floor: it makes any MoE GGUF run well on any card without a validated row.
6. Results
6.1 Dense and MoE models that fit: AlphaInfer vs NInfer (RTX 5090)
Same rented box, interleaved, NInfer at its own published invocation.
| Row (2026-10-01) | AlphaInfer | NInfer | Δ |
|---|---|---|---|
| 35B plain | 403.6 | 395.6 | +2.0% |
| 35B MTP | 757.4 | 772.8 | −1.6% |
| 27B plain | 91.4 | 89.6 | +2.0% |
| 27B MTP (k = 7) vs NInfer MTP3 | 232.2 | 211.8 | +8.3% |
On a 12-prompt mix, d0–d3 plus 8 languages (2026-10-07, n = 36 paired):
| Comparison | Δ |
|---|---|
| 35B fast vs NInfer MTP3 | +6.7% (English-only Bench A: −2.4%; 8 languages: +11.2%) |
| 27B DFlash2 vs NInfer DFlash2 | +8.0% |
NInfer leads on English MTP rounds; AlphaInfer leads on non-English prompts, through the script-adaptive draft rows.
6.2 A 22 GB model on a 16 GB card (RTX 4080, AlphaServe auto config, 2026-10-24)
| Task | AlphaServe | FreeToken 0.2.0 (same box, 2026-10-23) |
|---|---|---|
| Edit a source file | 378 | 98 |
| Rename across a file | 501 | — |
| Code rewrite | 546 | — |
| Log triage | 335 | — |
| English chat | 187 | — |
| Chinese chat | 206 | — |
6.3 Flash-Next (~125B MoE) with expert offload vs Strata 0.1.47 (2026-10-28, superseded)
Same IQ3_XXS file. AlphaInfer v2 in fast mode (not token-identical) (MTP k = 2, FAST verify, auto slots), selected with alphallama-serve --backend alphainfer: Flash-Next has no validated AlphaInfer row yet, so a bare -m still routes it to the built-in fused-infer engine (section 5.2; on the same protocol the built-in engine gave 73.8 / 70.6 / 81.2 on the 4080, 2026-10-28). Strata 0.1.47 (commit 011c9e60) at its defaults: spec 4, route tail skip 7, which skips low-ranked experts.
Benchmark protocol, through the AlphaServe server (2026-10-28). Set geometric means, one config for all prompts, both engines in the same window:
| GPU | Set | AlphaInfer v2 (fast) | Strata 0.1.47 |
|---|---|---|---|
| RTX 4080 16 GB | A | 113.3 | 111.2 |
| RTX 4080 16 GB | V | 129.0 | 122.6 |
| RTX 4080 16 GB | R (copy-heavy) | 201.0 | 157.9 |
| RTX 3090 24 GB | A | 122.2 | 144.3 |
| RTX 3090 24 GB | V | 137.9 | 157.6 |
| RTX 3090 24 GB | R (copy-heavy) | 234.5 | 192.7 |
On the 4080, AlphaInfer leads Strata on all three sets. On the 3090, it leads on copy-heavy work and trails on A and V.
The engineering runs below break these down by prompt length. They are single instances, measured through the C API test program (the calls the server makes), not through the server.
RTX 4080 16 GB (decode tok/s, request 1 / request 2 with prefix reuse). AlphaInfer on 2026-10-27; R with the suffix-copy drafter on. Strata from the 2026-10-26 same-box run, a different day:
| Prompt | AlphaInfer v2 | Strata 0.1.47 |
|---|---|---|
| V (2,381-token prompt, fresh text) | 113.0 / 127.5 | 104.9 / 108.9 |
| R (816-token prompt, copy-heavy) | 152.5 / 222.0 | 119.2 / 149.5 |
| 16K-token prompt | 74.6 / 82.0 | 84.2 / 85.1 |
RTX 3090 24 GB (256 tokens, 2026-10-28, both engines in one window):
| Prompt | AlphaInfer v2 | Strata 0.1.47 |
|---|---|---|
| R 816 | 209 | 159 |
| V 2,381 | 135 | 148 |
| 4K card | 103 | 137 |
| 16K card | 96 | 134 |
Reading these honestly
- On the 4080, AlphaInfer leads on fresh and copy-heavy text, and Strata leads on the 16K-token prompt.
- On the 3090, Strata still leads everywhere except copy-heavy work, in both the protocol and the engineering runs.
- The 3090 gap is round cost, not drafting: both engines accept ~2.4–2.5 tokens per round. Our decode cycle is ~25 ms against Strata's ~17.4 ms.
- Strata also keeps 90–97% of routed experts in VRAM by adapting to the context, against our ~74%.
- Closing this gap is active work. Single-instance numbers swing about ±10% run to run in both engines.
7. How we measure (and why it matters)
Most wrong performance conclusions we have made came from the measurement, not the engine. Our standing rules:
- Use the competitor's protocol. Same prompts, context, chat template, token count and box. A speedup measured at a 7.5K-token context shrank from +20% to +0.2% at a competitor's ~200-token protocol.
- Always run a same-session control arm. Throughput drifts ~4% across sessions on the same box.
- Decompose before crediting. Split tok/s into ms per round (engine speed) and tokens per round (acceptance, which follows the generated text). A kernel change that alters the text can "win" by luck of the trajectory.
- Time uninstrumented. Node-level GPU tracing inflates eager launches far more than captured graphs, so tracing makes a graph-based engine look relatively better than it is.
- Check the hardware state. A PCIe link stuck at Gen1 and slow-host starts (memory-compaction stalls, about 1 in 3 starts on one box) each produced fake "regressions".
- Re-sweep defaults on every new GPU architecture. One routing kernel was +0.85% on the 3090 and −3.0% on the 5090. Defaults are now keyed to the architecture they were measured on.
8. Limitations and open work (as of 2026-11-02)
| Area | Status |
|---|---|
| Flash-Next vs Strata 0.2.8 (fast mode) | Ahead overall on the RTX 3090, 4080 and 5090 (about 1.1×, section 3.5), but level on short requests and held-out tasks (A and V), and behind on reading and explaining code by 7–10%: each verify round carries about 3 ms more fixed GPU time than Strata's. Long prompts (4K / 16K), where an earlier engineering build trailed by 25–30%, are not yet re-measured on the release candidate. Levers: fewer micro-kernels in the verify round, context-adaptive expert residency, lower host latency between verify, commit and draft. |
| Long-prompt prefill | Strata and NInfer lead on 16K TTFT (e.g. 6.85 vs 8.29 s on the 3090). |
| 35B exact at very long context | Exact == plain verified at ctx 32,768 with q8 staging off; open at 98,304. |
| 27B exact on 16 GB cards | The 4080 fit (FFN layers on the CPU) gives exact == plain on 1/4 prompts only. |
| Exact serving TTFT with offload | Restoring the expert placement per request adds ~0.3–0.5 s TTFT (4080). Decode is unchanged. Not yet checked on the 3090. |
| Fast mode | Not token-identical to plain decoding; always labelled. |
Sources: AlphaInfer engineering reports and same-box head-to-head runs, 2026-09-17 to 2026-11-02. Competitor versions: NInfer v3 (abb7f14, 2026-10), Strata 0.2.8 (870aedd9, 2026-10-29; section 3.5 and InferArena), Strata 0.1.47 (011c9e60, 2026-10-21; the superseded section 6.3), FreeToken 0.2.0.