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:

CostWhat drives it
Weight bytesModel size × quantisation. Mixture-of-experts (MoE) models read only the routed experts, but each token routes to a different set.
Launch and host overheadA transformer layer is dozens of small GPU kernels. At batch 1 many are shorter than their own launch latency.
Host↔GPU transfersWhen the model is larger than the GPU (expert offload), missing experts must come over PCIe or be computed on the CPU.
Tokens per stepPlain 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:

MilestoneDecodevs the llama.cpp-derived fork, same session
Adapters over the fork's kernels, eager111 tok/s0.75×
Rounds recorded once per KV bucket, replayed157.9 tok/s1.06×
Own round capture + native MoE merge kernel + zero-copy fused projections171 tok/s1.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:

PartCost
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).

MeasurementResult
35B, RTX 3090, 8 prompts × 2fast 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.

LanguageMTP 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.

This is an upper bound, not typical speed. On the same prompts exact mode ran at 423 tok/s. Typical held-out prompts run at 360–400 tok/s on that card (RTX 3090, Qwen3.6-35B-A3B).

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.
Figure 3.5. Chain survival: the chance that a draft delivers at least k accepted tokens. Solid: the MTP head, to its depth cap of 3. Dashed: the n-gram copy, measured at positions 1–4, 8, 12 and 15. Qwen3.8-Flash-Next on an RTX 3090, greedy, the 25 InferArena prompts (2026-11-01).
SettingValue
ModelQwen3.8-Flash-Next IQ3_XXS (~125B MoE) with expert offload
GPURTX 3090
PromptsThe three InferArena sets: A = 4 short chat and code requests (mostly new text), V = 14 held-out tasks, R = 7 edits and rewrites
DecodingGreedy (temperature 0), one pass
MTPDepth 3, draft min-p 0.5
N-gram copyLongest suffix match of 3–16 tokens, most recent occurrence, copies up to 15 tokens
DataEvery 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:

Setd1d2d3
Aconditional hit rate0.8670.8700.912
head's own top-1 probability0.8750.9250.937
chain survival0.8670.7540.688
Vconditional hit rate0.8920.9190.907
head's own top-1 probability0.9100.9480.953
chain survival0.8920.8190.743
Rconditional hit rate0.9480.9560.953
head's own top-1 probability0.9500.9770.979
chain survival0.9480.9070.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:

Setpositions with a matchn1n2n3n4n8n12n15tokens per matched position
A: conditional15.6%0.4810.4200.4760.400–––
A: chain survival0.4810.2020.0960.038–––0.8
V: conditional50.7%0.8440.8970.9260.9440.9590.9640.970
V: chain survival0.8440.7560.7000.6590.5470.4650.4208.6
R: conditional83.0%0.9680.9830.9880.9880.9910.9940.995
R: chain survival0.9680.9490.9350.9200.8770.8470.82813.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.
SetMTP only: roundsBoth: MTP rounds (tokens/round)Both: copy rounds (tokens/round)Rounds saved
A211209 (3.17)2 (2.0)0%
V1,6691,207 (3.07)168 (11.5)18%
R873213 (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:

GPUSetAlphaLlama (fast)Strata 0.2.8AlphaLlama ÷ Strata
RTX 3090A143.5143.81.00
V153.9150.21.02
R251.5173.01.45
A/V/R geomean177.1155.21.14
RTX 4080A124.8119.41.05
V134.5135.70.99
R210.9164.41.28
A/V/R geomean152.4138.61.10
RTX 5090A265.2276.30.96
V309.4312.10.99
R540.5390.01.39
A/V/R geomean354.0322.81.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.

Caveats. The RTX 3090 rows ran with no routing profile and the default expert tail skip. On the RTX 5090, Strata ran its fastest (tuned) setup for that card. Strata is scored on all 25 prompts: on some prompts it sends several tokens per streamed chunk, and those rows count because their output carries the full token count. The acceptance tables come from a separate same-day logging run (one pass, 25 requests per arm); the rates beyond n12 rest on 1,200–2,300 positions per set, and the MTP conditional rate is measured after the min-p cut, so it describes the drafts that were verified, not the head's raw accuracy.

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.

ModeGuaranteeDefault?
ExactOutput identical to plain (non-speculative) decoding of the same buildDefault where the model fits the card (the RTX 3090 35B and 27B rows)
FastOutput may differ slightly from plain greedy text on long outputs; quality is gated by paired NLLDefault 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 settingResult
Qwen3.8-27B, RTX 3090, batch-invariant build, q4_0 KV, wide exact verify K = 7exact == 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 = 3exact == plain 1/4: exactness depends on the fit settings
Qwen3.6-35B-A3B, RTX 3090, q8_1 activation staging offexact == 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 resetoutput 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 resetoutput 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.

MechanismWhat it does
Device expert tableThe GPU kernels read expert → slot (VRAM), host tier, or miss from a device table. No per-layer host sync.
Doorbells + CPU miss workersThe 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 loadSlots are filled from a per-model routing profile before the server reports ready.
Admission between roundsThe 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 kernelsEach distinct expert's weights are decoded once and applied to every routed row, with fused gate + up + SwiGLU.
Pinned RAM tierExperts 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 findsWhat 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 fitFused-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 littleEvery 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:

TierRole
VRAM expert poolThe hottest experts, read in place through a device table (expert → slot), with no copy
Pinned RAM hot tierThe rest of the experts, held in pinned host memory and filled at load
SSDThe 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)

BoxModelAuto profileComparison
RTX 3090 24 GBFlash-Next IQ3_XXS (fused-infer)88.9 tok/shand-tuned 88–91
RTX 3090 24 GBQwen3.8-27B (MTP)63.0 tok/splain decode 45.5
RTX 4070 Laptop 8 GBQwen3.6-35B (fused-infer + MTP)57.1 tok/sFreeToken, 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)AlphaInferNInferΔ
35B plain403.6395.6+2.0%
35B MTP757.4772.8−1.6%
27B plain91.489.6+2.0%
27B MTP (k = 7) vs NInfer MTP3232.2211.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)

Qwen3.6-35B-A3B Q4_K_M, 512 generated tokens, mean of 2 fresh servers. Fast mode (not token-identical): expert offload + MTP + prompt-lookup drafting. Pre-release build with the v2 offload library, not a public release.
TaskAlphaServeFreeToken 0.2.0 (same box, 2026-10-23)
Edit a source file37898
Rename across a file501—
Code rewrite546—
Log triage335—
English chat187—
Chinese chat206—

6.3 Flash-Next (~125B MoE) with expert offload vs Strata 0.1.47 (2026-10-28, superseded)

Superseded by the release-candidate run against Strata 0.2.8 on the RTX 3090, 4080 and 5090 in section 3.5, which is also what InferArena publishes. This section is kept as the earlier record.

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:

GPUSetAlphaInfer v2 (fast)Strata 0.1.47
RTX 4080 16 GBA113.3111.2
RTX 4080 16 GBV129.0122.6
RTX 4080 16 GBR (copy-heavy)201.0157.9
RTX 3090 24 GBA122.2144.3
RTX 3090 24 GBV137.9157.6
RTX 3090 24 GBR (copy-heavy)234.5192.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:

PromptAlphaInfer v2Strata 0.1.47
V (2,381-token prompt, fresh text)113.0 / 127.5104.9 / 108.9
R (816-token prompt, copy-heavy)152.5 / 222.0119.2 / 149.5
16K-token prompt74.6 / 82.084.2 / 85.1

RTX 3090 24 GB (256 tokens, 2026-10-28, both engines in one window):

PromptAlphaInfer v2Strata 0.1.47
R 816209159
V 2,381135148
4K card103137
16K card96134

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:

  1. 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.
  2. Always run a same-session control arm. Throughput drifts ~4% across sessions on the same box.
  3. 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.
  4. 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.
  5. 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".
  6. 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)

AreaStatus
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 prefillStrata and NInfer lead on 16K TTFT (e.g. 6.85 vs 8.29 s on the 3090).
35B exact at very long contextExact == plain verified at ctx 32,768 with q8 staging off; open at 98,304.
27B exact on 16 GB cardsThe 4080 fit (FFN layers on the CPU) gives exact == plain on 1/4 prompts only.
Exact serving TTFT with offloadRestoring the expert placement per request adds ~0.3–0.5 s TTFT (4080). Decode is unchanged. Not yet checked on the 3090.
Fast modeNot 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.