Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
0aaa754
Prompt cache for --serve
eddoursul Sep 24, 2026
8029fa9
Unsloth Dynamic 3.0 model files
eddoursul Sep 24, 2026
240c8be
Short prompt parts through verify windows
eddoursul Sep 25, 2026
83d83e7
Build without compiler warnings
eddoursul Sep 25, 2026
8d4210f
MTP draft head from Q6_K output heads
eddoursul Sep 25, 2026
7317dad
Speculation benchmarks on fixed text (--spec-follow)
eddoursul Sep 25, 2026
7efc36c
One adaptive VRAM tier for both decode loops; routing concentration i…
eddoursul Sep 25, 2026
cce6294
A second GPU as another expert tier (--second-gpu)
eddoursul Sep 25, 2026
35036d9
README: the second GPU; UD-Q4_K_XL speeds with --adapt-every 2
eddoursul Sep 25, 2026
5a84ece
--main-gpu: the CUDA device the engine runs on
eddoursul Sep 25, 2026
48ba798
Device ordinals in nvidia-smi's order (CUDA_DEVICE_ORDER=PCI_BUS_ID u…
eddoursul Sep 25, 2026
dd97f87
--window-profile: GPU time of each stage of the verify window
eddoursul Sep 25, 2026
6bc67de
Verify window: one gather-combine reads only the host's rows over PCI…
eddoursul Sep 25, 2026
22f4b8c
Verify window: multi-token router, indexer projections and shared-exp…
eddoursul Sep 25, 2026
9ef275e
Faster multi-token hyper-connection read: norm per (token, stream), p…
eddoursul Sep 25, 2026
939add2
Verify window: the QSA layer's per-token kernels batched; --window-ha…
eddoursul Sep 25, 2026
7671fd2
Prompt path: the PLE block and the indexer appends over the whole chu…
eddoursul Sep 25, 2026
af76f64
QSA: block scores sized to the blocks in use; the prompt path's atten…
eddoursul Sep 25, 2026
40e1a7a
Prompt path GDN: the conv over the whole chunk at once, a faster recu…
eddoursul Sep 25, 2026
f8de703
Prompt path: the experts the main GPU's cache lacks run on the second…
eddoursul Sep 26, 2026
6e38648
Prompt path: its buffers on the second GPU borrow that GPU's cache sl…
eddoursul Sep 26, 2026
83349c7
Prompt path: dense work in 2048-token sub-chunks over shared scratch,…
eddoursul Sep 26, 2026
2acfac4
Prompt path: expert blobs of long chunks copied ahead while the dense…
eddoursul Sep 26, 2026
becaa0b
--feed-max default 128: the batched prompt path now breaks even with …
eddoursul Sep 26, 2026
f4ee9b5
Second GPU: the next layer's likeliest experts copied to it while the…
eddoursul Sep 26, 2026
c2a2bb6
CPU pool: the second GPU's share is launched once the workers have st…
eddoursul Sep 26, 2026
2823347
Verify window: the commit graph runs beside the MTP draft (it was lau…
eddoursul Sep 26, 2026
b01a3fb
--ple-io ram: the PLE table read into RAM once the experts are loaded…
eddoursul Sep 26, 2026
e34cea0
--second-gpu-prefetch-mb (default 12) instead of an expert count: the…
eddoursul Sep 26, 2026
00974d2
Second GPU: without free VRAM there the engine runs on the main GPU a…
eddoursul Sep 26, 2026
a085c36
README: speeds with the second GPU for prompts and generation; --feed…
eddoursul Sep 26, 2026
536bff0
Merge upstream main (6da1f66): Swift 1.5 support, a short README with…
eddoursul Sep 26, 2026
00aa7bb
The output head is loaded before the expert cache is sized: UD-Q4_K_X…
eddoursul Sep 26, 2026
8b783bb
Prefetch: a prediction that comes after the CPU's rows is waited for …
eddoursul Sep 26, 2026
d538e3f
QSA block selection: scores read each key once for all queries, the t…
eddoursul Sep 26, 2026
ae3f3c6
The draft layer's prompt K/V in the batched prompt path
eddoursul Sep 26, 2026
21ec11f
PLE rows of a verify window read while layer 0 runs, the drafts' whil…
eddoursul Sep 26, 2026
8d8af3b
--window-hashes reads the final rows from mapped memory the graph writes
eddoursul Sep 26, 2026
92d1abb
Verify window: the PLE flag is raised even when a row read fails
eddoursul Sep 26, 2026
81d271e
DETAILS.md: the RTX 3090 speeds with the new QSA selection, draft pas…
eddoursul Sep 26, 2026
3f3c26d
Verify window: the 3090 decides its cache hits in the graph, the shar…
eddoursul Sep 26, 2026
cf307ea
Grouped native experts in two kernels: gate/up with SwiGLU and q8_1, …
eddoursul Sep 26, 2026
a3f14e4
--window-profile: the wait for the CPU's rows as a histogram
eddoursul Sep 26, 2026
8208f3f
I-quant dot products: the signs as byte masks
eddoursul Sep 26, 2026
70e73db
DETAILS.md: the speeds with the 3090's expert phase reworked
eddoursul Sep 26, 2026
738e166
Verify window: the dense projections of 2+ tokens read an interleaved…
eddoursul Sep 26, 2026
803e165
Hyper-connection read: the up projection's per-token sums in one xor …
eddoursul Sep 26, 2026
81e276d
Verify window: the router, the doorbell and the hit plan in one kernel
eddoursul Sep 26, 2026
34a35db
Verify window: the GDN gates and the QSA indexer beside the mixer's p…
eddoursul Sep 26, 2026
b063c13
Verify window: more of the layer on short branches
eddoursul Sep 26, 2026
96c30c0
DETAILS.md: the speeds with fewer serial kernels per layer
eddoursul Sep 26, 2026
e1e64f4
Prompt path: the QSA attention of INT8 pools on the tensor cores
eddoursul Sep 27, 2026
dcf63ac
DETAILS.md: the speeds with the prompt path's attention on the tensor…
eddoursul Sep 27, 2026
f67f228
MTP draft layer: experts in GGUF formats through the native expert ke…
eddoursul Sep 27, 2026
7a5038f
CPU expert pool: idle workers sleep; the server stops on Ctrl+C
eddoursul Sep 27, 2026
1d49251
generate: --window-logits, the verify windows' top 64 tokens per emit…
eddoursul Sep 27, 2026
8290279
xor_scatter: the steps by template recursion, the halves chosen by a …
eddoursul Sep 27, 2026
3d133ba
Hyper-connection read: the down projection split by input slices, the…
eddoursul Sep 27, 2026
f145912
verify_router: the input's mapped copy in blocks of its own, one roun…
eddoursul Sep 27, 2026
df5166e
fused_gr, native_router, xor_scatter: lines within 120 columns
eddoursul Sep 27, 2026
2130de2
Second GPU: the adaptive tier's copies between windows
eddoursul Sep 27, 2026
4567875
DETAILS.md: the speeds with the second GPU's adaptive tier copying be…
eddoursul Sep 27, 2026
3ab7c61
Second GPU: the prefetch predicted from an estimate of the next layer…
eddoursul Sep 28, 2026
84c3984
Second GPU: its rows reach the 3090 on a branch while the CPU works; …
eddoursul Sep 28, 2026
d9ce223
Verify window: the router kernel writes the FFN input as the pool's Q…
eddoursul Sep 28, 2026
f06e9c2
DETAILS.md: generation with the second GPU's rows on a branch and the…
eddoursul Sep 28, 2026
bedc0c6
QSA block scores: query batches in a per-thread GEMM form; bitwise
eddoursul Sep 28, 2026
0046ba6
Prompt-path QSA attention: each fetch warp issues its cells' K and V …
eddoursul Sep 28, 2026
fdba43b
DETAILS.md: speeds after the batched QSA block scores and the attenti…
eddoursul Sep 28, 2026
962b99c
Verify window: the shared expert and the prediction fork before the r…
eddoursul Sep 28, 2026
aa209f7
Verify window: the shared expert's gate in the combine, fewer QSA mix…
eddoursul Sep 28, 2026
b67a291
Verify window: the projections' rows a warp by format and tokens, the…
eddoursul Sep 28, 2026
fd23d91
QSA decode attention: the prompt path's kernels split among blocks, t…
eddoursul Sep 28, 2026
37c1d81
Prompt lookup: windows of up to 8 tokens from the text's earlier occu…
eddoursul Sep 29, 2026
4404541
Prompt parts through verify windows as wide as the verifier's (8 toke…
eddoursul Sep 29, 2026
7105fcc
The 3090 tier's copies in pieces while its link carries nothing else
eddoursul Sep 29, 2026
5137b33
The host thread on the last core, the pool off the second GPU's inter…
eddoursul Sep 29, 2026
6fe6825
The pool's threads move off the processors that take interrupts
eddoursul Sep 29, 2026
b02ed63
Merge upstream main (a790805, engine 0.1.27): sampling, the web app, …
eddoursul Sep 30, 2026
45dae9d
The full expert profile: both GPUs' tiers start filled
eddoursul Sep 30, 2026
fbb8bfa
The argmax and the draft's top probability over many blocks a row
eddoursul Sep 30, 2026
22b46b6
The draft round graph runs the draft layer's front once
eddoursul Sep 30, 2026
235784c
A one-token window commits itself
eddoursul Sep 30, 2026
d3d48b1
The draft pass's kernels in the main layer's forms
eddoursul Sep 30, 2026
96af377
The verify head across both GPUs
eddoursul Sep 30, 2026
2ec7a80
The final mixer in one fused read
eddoursul Sep 30, 2026
a06a7b3
Prompt path: the hyper-connection reads without their FP32 rows, the …
eddoursul Sep 30, 2026
e8ade66
Prompt path: the second GPU's sums back a sub-chunk at a time, each l…
eddoursul Sep 30, 2026
7706c1b
Prompt path: the experts through llama.cpp's MMQ kernels (upstream's …
eddoursul Sep 30, 2026
6f3ef7f
Prompt path: the second GPU's input in pieces as it reaches host memo…
eddoursul Sep 30, 2026
0bbd8f5
Prompt path: a chunk's PLE rows read on a thread, the next chunk's wh…
eddoursul Sep 30, 2026
61521be
docs: this fork against llama.cpp and upstream Strata on an RTX 3090 …
eddoursul Sep 30, 2026
d300342
examples/: this fork's configs for IQ3_S and UD-Q4_K_XL, the paths in…
eddoursul Sep 30, 2026
25e86c7
examples/: a launcher per config; the README says where the packs and…
eddoursul Sep 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ td.log
/run-*.sh
/strata-*.json
/strata-*.log
# the web app's settings shared with other apps, written next to the config the server runs (examples/)
*.shared-settings.json
/build-strata.bat

# image encoder (setup.py --vision): build output and the generated build script
Expand Down
469 changes: 142 additions & 327 deletions CMakeLists.txt

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ of a word): faster than you can read.

- **Free and open source.**

> **This fork** (branch `custom`) is tuned for a PC with an RTX 3090 and an RTX 5070 Ti: the second card works as another
> expert tier, unsloth's K-quant files run too, and prompts and answers are faster. How it compares with llama.cpp and
> upstream Strata on that PC: [docs/COMPARISON.md](docs/COMPARISON.md). Its configs, and how to run them:
> [examples/](examples/README.md).

> **Jump to:** [How fast?](#how-fast-is-it) · [Which model?](#which-model-should-i-pick) · [Install](#install) ·
> [Using it](#using-it) · [Problems?](#something-went-wrong) · [How it works](#how-does-it-work) ·
> [All the details](docs/DETAILS.md)
Expand Down Expand Up @@ -140,8 +145,9 @@ the same way - nothing big is downloaded again.
- **Experimental speed projection (off by default):** an experimental control vector that setup can turn on; it
changes how the model answers - read [what it does](docs/DETAILS.md#experimental-speed-projection-experimental-off-by-default) first.

**Good to know:** it answers one request at a time. The first message of a chat is read in full (about 1 minute per
30,000 tokens); after that it keeps the conversation and reads only what is new, so follow-ups start in seconds.
**Good to know:** it answers one request at a time. The next turn of a chat continues from what it has already read,
so only the new text is processed; a long document it reads for the first time takes about 1 minute per 30,000 tokens
before it starts writing.

## Something went wrong?

Expand Down
Binary file modified data/draft_vocab.bin
Binary file not shown.
149 changes: 149 additions & 0 deletions docs/COMPARISON.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# This fork, upstream Strata and llama.cpp on one PC

Qwen3.8-Flash-Next in two quantizations, IQ3_S and UD-Q4_K_XL, through three engines on an RTX 3090 + RTX 5070 Ti PC.
The llama.cpp and upstream columns were measured once (2026-09-30). This fork's columns are kept current: measured at
0bbd8f5 (2026-09-30).

**In short**, with both GPUs:

- **IQ3_S:** this fork reads prompts 4.2-5.0x as fast as llama.cpp and 2.3-2.4x as fast as upstream Strata, and
writes answers 4.2-7.9x as fast as llama.cpp and 1.5-2.0x as fast as upstream (the most on long contexts and on
answers that quote the prompt). On the 3090 alone, against upstream there: prompts 1.6x, answers 1.4-1.7x.
- **UD-Q4_K_XL:** prompts 5.0-6.2x and answers 4.8-8.8x as fast as llama.cpp; upstream cannot run the file.
- A follow-up turn after a 16K-token prompt starts in 0.2-0.3 s (llama.cpp 0.6-0.7 s; upstream 0.35 s on the 3090,
1.1 s on both GPUs).
- The next-token distributions match llama.cpp's as closely as llama.cpp's own CPU and CUDA backends match each other
(IQ3_S; UD-Q4_K_XL somewhat further, from llama.cpp's 8-bit rounding of the file's Q8_0 hyper-connection weights).

## The PC and the engines

- **PC:** Ryzen 7 9700X (8 cores), 160 GB DDR5-5600 (2 x 32 + 2 x 48 GB), Windows 11. An RTX 3090 (24 GB, PCIe 4.0
x4, nothing else on it) and an RTX 5070 Ti (16 GB, PCIe 5.0 x16, driving the display).
- **Models:** ISTA-DASLab's GSQ-RCO **IQ3_S** (shard 1 54.8 GB: experts 46.8 GiB, i-quants with Q2_0 and IQ4_NL down
projections) and unsloth's **UD-Q4_K_XL** (111 GB: experts 71.7 GiB, Q4_K / Q5_K with Q5_1 / Q8_0 downs). Each has
a 28.8 GB IQ4_NL n-gram table (the per-layer embeddings) besides.
- **llama.cpp** build 11116 (709fe755d, MSVC), its ggml-cuda.dll patched to pin the CPU experts' buffers (prompts
1.8x faster than unpinned). Both GPUs with the layers split (the 5070 Ti first), the experts that do not fit in VRAM
in RAM: UD-Q4_K_XL by `--fit`, IQ3_S by fit's placement with its Q2_0 down projections kept on the GPUs (llama.cpp
has no x86 SIMD kernel for Q2_0: 30.5 instead of 27.2 t/s). 8-bit KV cache, 8 threads, 1024-token micro-batches,
the n-gram table in RAM. No speculative decoding: llama.cpp has no graph for this model's MTP layer.
- **Upstream Strata** a790805 (engine 0.1.27) with the config its setup writes for IQ3_S on this PC: MTP drafts, 8-bit
KV kept in RAM past 32K cells, the expert cache sized by the free VRAM. On the 3090, and on both GPUs as its setup
recommends here (a layer split with the newer 5070 Ti first: layers 0-25 there, 26-47 on the 3090). It cannot run
UD-Q4_K_XL: it has no K-quant expert kernels.
- **This fork** with its configs ([examples](../examples/README.md)): the 3090 runs the model and the 5070 Ti is a
second expert tier (12.2-12.4 GiB of experts; its share of each layer's experts, the next layer's likely experts
copied ahead, the prompt path's experts the 3090 lacks, and with IQ3_S part of the output head). MTP drafts and
prompt lookup, 8-bit KV in VRAM, 16K-token prompt chunks. And on the 3090 alone.

## Speed through the API

The same requests to each server's OpenAI API: greedy, one at a time, the prompt caches off except for the follow-up
turn. Prompts: 16K-128K tokens of llama.cpp's sources with a question (400 tokens of answer), a 28-token coding request
(up to 300), a coding task with thinking on (3,000), and a Python module to return with a class renamed (the edit, up
to 3,000 tokens that mostly quote the prompt). The follow-up turn sends the 16K prompt, its answer and a new question:
its prompt time is the processing of what the engine did not keep. Each engine writes its own text and the texts part
at the first near-tie, so the generation speeds compare different texts of one kind, one run each. The memory rows
come from a second start of each server (the model file then in the OS cache): the GPUs' memory taken, and the RAM
taken as the drop in the system's available memory.

### IQ3_S

<!-- matrix:api-iq3_s -->
| | llama.cpp, both GPUs | upstream Strata, 3090 | upstream Strata, both GPUs | this fork, both GPUs | this fork, 3090 |
|---|---|---|---|---|---|
| Prompt, 16K tokens (t/s) | 581 | 1029 | 1060 | 2466 | 1605 |
| Prompt, 32K tokens (t/s) | 562 | 1120 | 1119 | 2666 | 1768 |
| Prompt, 64K tokens (t/s) | 551 | 1139 | 1148 | 2688 | 1791 |
| Prompt, 128K tokens (t/s) | 527 | 1111 | 1143 | 2650 | 1787 |
| Generation: code, 28-token prompt (t/s) | 31.0 | 74.1 | 84.8 | 167.7 | 113.9 |
| Generation: thinking, 3,000 tokens | 31.3 | 77.1 | 89.0 | 130.2 | 111.2 |
| Generation: edit, the prompt's file returned (2.4K tokens) | 31.1 | 99.4 | 117.2 | 234.8 | 171.3 |
| Generation after the 16K prompt | 29.8 | 75.7 | 85.4 | 151.2 | 108.1 |
| Generation after the 32K prompt | 26.9 | 80.6 | 94.2 | 150.2 | 122.1 |
| Generation after the 64K prompt | 22.0 | 73.3 | 85.3 | 139.6 | 113.9 |
| Generation after the 128K prompt | 16.4 | 67.6 | 76.8 | 129.2 | 110.2 |
| Follow-up turn after the 16K prompt: new tokens, prompt time | 34 in 0.62 s | 34 in 0.35 s | 440 in 1.12 s | 34 in 0.21 s | 34 in 0.34 s |
| Start to the API, the model file cached (s) | 21 | 16 | 21 | 21 | 20 |
| VRAM taken: 3090 / 5070 Ti (GiB) | 22.9 / 13.0 | 22.9 / 0.0 | 21.9 / 14.6 | 22.5 / 13.1 | 22.6 / 0.0 |
| RAM taken (GB) | 57 | 56 | 60 | 53 | 52 |
<!-- /matrix:api-iq3_s -->

### UD-Q4_K_XL

Upstream Strata cannot run this file: it has no kernels for K-quant experts.

<!-- matrix:api-ud-q4_k_xl -->
| | llama.cpp, both GPUs | this fork, both GPUs | this fork, 3090 |
|---|---|---|---|
| Prompt, 16K tokens (t/s) | 467 | 2341 | 1099 |
| Prompt, 32K tokens (t/s) | 453 | 2645 | 1184 |
| Prompt, 64K tokens (t/s) | 444 | 2662 | 1209 |
| Prompt, 128K tokens (t/s) | 426 | 2627 | 1221 |
| Generation: code, 28-token prompt (t/s) | 23.5 | 121.3 | 76.8 |
| Generation: thinking, 3,000 tokens | 23.7 | 114.3 | 74.3 |
| Generation: edit, the prompt's file returned (2.4K tokens) | 23.7 | 160.0 | 113.4 |
| Generation after the 16K prompt | 22.6 | 126.7 | 67.6 |
| Generation after the 32K prompt | 21.7 | 138.4 | 75.7 |
| Generation after the 64K prompt | 18.6 | 119.7 | 66.4 |
| Generation after the 128K prompt | 14.5 | 127.5 | 69.2 |
| Follow-up turn after the 16K prompt: new tokens, prompt time | 34 in 0.69 s | 34 in 0.26 s | 34 in 0.48 s |
| Start to the API, the model file cached (s) | 68 | 41 | 36 |
| VRAM taken: 3090 / 5070 Ti (GiB) | 22.3 / 12.9 | 22.7 / 13.1 | 22.7 / 0.0 |
| RAM taken (GB) | 86 | 81 | 80 |
<!-- /matrix:api-ud-q4_k_xl -->

## Generation on fixed text (this fork)

Each run emits the model's reference text (`--spec-follow`), so runs and builds compare on the same tokens and
experts: two runs, averaged, tokens a verify pass in parentheses. The code text's reference repeats its answer after
the end of the turn, which prompt lookup drafts and a server never generates.

<!-- matrix:fixed -->
| Text | IQ3_S t/s (tokens a pass) | UD-Q4_K_XL t/s (tokens a pass) |
|---|---|---|
| code (400 tokens) | 181.5 (4.02) | 114.6 (3.69) |
| thinking (1,200) | 137.8 (2.07) | 105.4 (1.71) |
| after the 16K prompt (400) | 145.2 (2.71) | 124.7 (2.65) |
| edit (2,397) | 243.7 (7.51) | 160.8 (7.51) |
<!-- /matrix:fixed -->

## Agreement with llama.cpp

Argmax agreement and mean KL divergence (nats) of the next-token distributions along llama.cpp's greedy text, which
this fork follows (`--spec-follow`, `--window-logits`), with `--adapt-every 0`. The two baselines differ from each
other only in rounding: llama.cpp's CPU backend against its CUDA backend, and this fork in one-token windows against
its four-token windows. Any change of rounding moves 2-4% of the thinking text's argmaxes, all near-ties.

<!-- matrix:parity -->
| | Code, ~260 tokens | Thinking, 1,200 | After the 16K prompt, 300 |
|---|---|---|---|
| IQ3_S: this fork vs llama.cpp | 100.0%, 1.3e-04 | 98.0%, 2.1e-03 | 99.3%, 1.0e-03 |
| llama.cpp's CPU vs CUDA backend | 100.0%, 2.2e-04 | 96.9%, 3.2e-03 | 99.0%, 1.4e-03 |
| this fork, one-token vs four-token windows | 100.0%, 1.8e-04 | 98.3%, 1.9e-03 | 99.7%, 3.8e-04 |
| UD-Q4_K_XL: this fork vs llama.cpp | 99.3%, 5.3e-04 | 95.8%, 6.7e-03 | 97.7%, 3.5e-03 |
| llama.cpp's CPU vs CUDA backend | 99.6%, 1.3e-04 | 96.8%, 3.3e-03 | 100.0%, 1.6e-03 |
| this fork, one-token vs four-token windows | 99.6%, 1.0e-04 | 97.2%, 2.3e-03 | 98.7%, 5.4e-04 |
<!-- /matrix:parity -->

UD-Q4_K_XL's CPU baseline after the 16K prompt covers 181 positions: llama-server's greedy text itself differed between
two runs there, and the CPU backend was forced along the other one, which parts after 180 tokens.

## The two files

llama.cpp's perplexity over 28 chunks of 4,096 tokens of llama.cpp's own docs, C++ and Python sources (lower is
better): UD-Q4_K_XL 1.8849, IQ3_S 1.8946 (+0.5%), and ISTA-DASLab's IQ3_XXS, which IQ3_S replaced in this fork's
configs, 1.9215 (+1.9%). IQ3_S's experts take 46.8 GiB, UD-Q4_K_XL's 71.7: on this PC IQ3_S generates 16-58%
faster on fixed text, and reads prompts about as fast.

## Features

| | llama.cpp | Upstream Strata | This fork |
|---|---|---|---|
| Model files | any GGUF of the model | ISTA-DASLab's GSQ-RCO sizes (Q2_0 to IQ3_S), their Coder, Swift 1.5: i-quant and Q2_0 experts | those, and every quant of unsloth's (K-quant, Q5_1 and Q8_0 experts) |
| Speculative decoding | none: no graph for this model's MTP layer | the MTP layer's drafts, up to 3 a pass; prompt lookup (up to 5 tokens where it pays) | the MTP layer's drafts; prompt lookup (up to 7 tokens after a 16+-token match) |
| Several GPUs | a layer or row split | a layer split, each card holding its layers' experts | the second card as an expert tier: its share of each layer, the next layer's likely experts copied ahead, the prompt's experts the first card lacks, part of the output head |
| Experts in VRAM | a fixed placement | ranked by use, updated every 4 verify passes | ranked by use on both cards, updated every pass |
| KV cache | 8-bit, in VRAM | 8-bit, in RAM past 32K cells | 8-bit, in VRAM |
| Prompt cache | the live slot, states saved to RAM | checkpoints at turns and every 16K tokens | the live sequence, checkpoints at turns and chunks, replaced conversations kept in RAM with their K/V |
| Sampling, APIs | full; OpenAI and Anthropic | per request; OpenAI and Anthropic, a web app, MCP tools | upstream's |
Loading