LocalMaxxing results
LocalMaxxing times local inference on fixed canonical prompts
(reasoning-v1, code-v1) with a fresh nonce per request, one warm-up and five timed runs,
and reports the median. Our two RTX 3090 runs were submitted on 2026-10-03 and marked approved and verified. The
RTX 5060 Ti runs are local measurements with the same harness and have not been submitted.
Decode tok/s, higher is better
- reasoning-v1
- code-v1
| GPU and file | Prompt | Median tok/s | Range (5 runs) | Status |
|---|---|---|---|---|
RTX 3090, Qwen3.8-27B-TQ3_4S-v2.gguf | reasoning-v1 | 273.1 | 253.0-274.0 | submitted, approved |
RTX 3090, Qwen3.8-27B-TQ3_4S-v2.gguf | code-v1 | 199.5 | 176.3-208.5 | submitted, approved |
RTX 5060 Ti, Qwen3.8-27B-TQ_XS.gguf | reasoning-v1 | 175.9 | 162.6-180.2 | local, not submitted |
RTX 5060 Ti, Qwen3.8-27B-TQ_XS.gguf | code-v1 | 98.8 | 93.6-102.7 | local, not submitted |
RTX 5060 Ti, Qwen3.8-27B-TQ_S.gguf | reasoning-v1 | 166.5 | 159.0-171.9 | local, not submitted |
RTX 5060 Ti, Qwen3.8-27B-TQ_S.gguf | code-v1 | 109.0 | 101.5-113.9 | local, not submitted |
Settings: 32K context, thinking on, temperature 0, 320 output tokens. RTX 3090: DFlash2 Q4_K_M drafter with 7 draft tokens and tree verify, BF16 KV, 350 W. RTX 5060 Ti (Windows 11 / WSL 2): DFlash2-TQ3 drafter, tq3 KV. For context: when we submitted, the top RTX 3090 entries were 242.1 (reasoning-v1) and 169.6 (code-v1) tok/s, EXL3 4.0 bpw with a DFlash2 tree; on 2026-10-07 the board's best Qwen3.8-27B entry for the RTX 5060 Ti was 63.2 tok/s. Board positions change, so check the live board.
Qwen3.8-Flash-Next on one RTX 3090
Qwen3.8-Flash-Next (125B, 6B active, mixture of experts) does not fit in 24 GB, so the routed experts live in system RAM and the GPU keeps a cache of expert slots: misses go over PCIe by the copy engine, the next layer's experts are prefetched while the current layer runs, and native MTP drafts up to 5 tokens per step, stopping when the draft is unsure. Measured against Strata 0.2.2 (Niko1221, engine 0.1.47) on the same RTX 3090, same file, one session.
| Prompt | tqLLM first token | Strata first token | tqLLM decode after | Strata decode after |
|---|---|---|---|---|
| 32K | 14.98 s | 15.14 s | 76.4 tok/s | 72.2 tok/s |
| 64K | 28.01 s | 29.18 s | 85.1 tok/s | 63.6 tok/s |
| 128K | 56.53 s | 58.25 s | 77.1 tok/s | 47.2 tok/s |
Short chats (5 x 512 tokens, each the first request of a fresh server): tqLLM 91.6 tok/s, Strata 89.6; first token 0.32-0.41 s against 1.07-1.29 s. On a warm server the same chats run at 95.6 tok/s. Up to 8 users
at once (--np 8) get the same text as one user alone. Model file for both:
ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF,
IQ3_S; tqLLM drafts with mtp-blk48-iq4.gguf, Strata with --spec 4; greedy, reasoning off.
RTX 3090: prefill and decode
Model Qwen3.8-27B-TQ3_4S-v2.gguf, drafter Qwen3.8-27B-DFlash2-TQ3.gguf, tq3 KV cache,
greedy, 400 output tokens, context 40960. Prompts are WikiText-2 test text cut to length with a "summarise"
instruction; each number is the median of 3 runs, timed by the server.
Decode tok/s, higher is better
- No drafter
- DFlash2 drafter
| Prompt | Prefill tok/s | Decode, no drafter | Decode, DFlash2 drafter |
|---|---|---|---|
| 2K | 2,258 | 55.5 | 155.2 |
| 8K | 2,426 | 54.5 | 149.9 |
| 32K | 2,155 | 50.6 | 131.0 |
A second RTX 3090 that also drives a desktop display reproduced decode within 1 % and prefill 4-15 % lower.
RTX 3090: decode up to 256K context
One server with 262,144 tokens of context, one request at a time, a C++ code prompt grown to each size. Decode falls as the attention reads more KV, and stays above 100 tok/s at 256K.
Decode tok/s, higher is better
- tqLLM + DFlash2 drafter
| Prompt | Prompt tokens | Prefill tok/s | Decode tok/s | Drafts accepted |
|---|---|---|---|---|
| 32K | 31,410 | 1,205.6 | 202.8 | 273 / 420 |
| 128K | 129,247 | 856.1 | 157.1 | 262 / 392 |
| 192K | 194,429 | 709.7 | 144.4 | 323 / 448 |
| 256K | 259,636 | 612.8 | 106.6 | 271 / 469 |
Same file on three GPUs
LocalMaxxing's canonical reasoning and code prompts, one file and drafter on every card. Not submitted to the LocalMaxxing board.
Decode tok/s, higher is better
- reasoning-v1
- code-v1
| GPU | reasoning-v1 tok/s | code-v1 tok/s |
|---|---|---|
| RTX 3090 24 GB | 251.7 | 173.4 |
| RTX 5060 Ti 16 GB (Windows 11 / WSL 2) | 166.5 | 109.0 |
| GB10 (DGX Spark) | 92.8 | 60.4 |
Reasoning prompts
Drafter speed follows how often its guesses are accepted. Summaries of encyclopedia text accept about 35-40 % of the drafted tokens; reasoning text accepts more.
Decode tok/s, higher is better
- No drafting
- MTP head
| Setup | Decode tok/s |
|---|---|
| RTX 3090, LocalMaxxing reasoning prompt, 32K context, 320 output tokens, DFlash2 drafter | 240-270 (median 256) |
RTX 3090, model's own MTP head (--mtp), 1.6K tokens | 155 (57 without drafting) |
| RTX 3090, model's own MTP head, 51K tokens | 125 (47 without drafting) |
Long prompts: --draft-retrieve 32 lets the drafter also read 32 far passages of the prompt. On an RTX
3090 at 64K context, 31K / 40K / 51K-token prompts go from 158 / 143 / 137 to 176 / 156 / 148 tok/s.
Decode tok/s, higher is better
- Drafter
- Drafter + --draft-retrieve 32
Long context on 16 GB (TqCache)
RTX 5060 Ti 16 GB, Qwen3.8-27B-TQ_XS.gguf + DFlash2 drafter, tq3 KV cache. With the default context
the memory fit caps the context at 204,800 on this card and keeps all KV on the GPU. With
--context 262144, TqCache keeps the oldest positions in system RAM, and the output stays exactly the
same.
Decode tok/s, higher is better
- Default context (204,800)
- --context 262144 (TqCache)
| Prompt | Default context (204,800) | --context 262144 (TqCache) |
|---|---|---|
| 200K | 113 | 70 |
| 224K | refused | 42 |
| 248K | refused | 32 |
Reading KV over PCIe costs speed, so ask for more context than the default only when the prompts need it.
MoE on RTX 3090: MiniCPM-V 4.7 vs llama.cpp
MiniCPM-V 4.7 (35B-A3B, mixture of experts), supported from 1.0.0. The Q5_K_M
file is 24.7 GB and does not fit in the card's 24 GB. tqLLM keeps the least-routed experts in pinned host memory
(--moe-host-mb 2000, about 0.15 % of the routing) and the output is identical with and without the
split. llama.cpp's best setting that survives 32K context is -ncmoe 2 (-ncmoe 1 crashes at
32K). The IQ3_S file fits, so both engines keep every expert in VRAM.
--moe-host-mb 2000 vs -ncmoe 3 146.8 vs 131.0 tok/s. On this card the memory fit also moves
tqLLM's LM head and embeddings to host memory, so the Q5 numbers are lower than on the dedicated 3090 above.Decode tok/s, higher is better
- llama.cpp Q5_K_M, -ncmoe 2
- tqLLM Q5_K_M, --moe-host-mb 2000
- llama.cpp IQ3_S, all in VRAM
- tqLLM IQ3_S, all in VRAM
| File and setting | Hash map in C | Short story | Palindrome + tests |
|---|---|---|---|
llama.cpp Q5_K_M, -ncmoe 2 | 123.4 | 124.3 | 124.2 |
tqLLM Q5_K_M, --moe-host-mb 2000 | 171.0 | 178.1 | 161.7 |
llama.cpp IQ3_S, -ngl 99 | 135.7 | 136.8 | 136.8 |
| tqLLM IQ3_S, all experts in VRAM | 202.4 | 203.0 | 203.1 |
MoE on DGX Spark: MiniCPM-V 4.7 vs llama.cpp
MiniCPM-V 4.7 (35B-A3B, mixture of experts), supported from 1.0.0. GB10 (DGX
Spark), target MiniCPM-V-4_7-35B-A3B-IQ3_S.gguf, drafter
dspark-MiniCPM-V-4_7-35B-A3B-F16.gguf (openbmb's DSpark), greedy, 512 output tokens, thinking off,
both engines in the same session. llama.cpp DSpark uses its default 3 drafts (5 and 8 were slower); tqLLM uses
chain verify with 3 drafts, and its output is identical to its own no-drafter run on all three prompts.
Decode tok/s, higher is better
- llama.cpp, no drafter
- tqLLM, no drafter
- llama.cpp + DSpark
- tqLLM + DSpark
Context: 32K to 1M on one RTX 3090
Qwen3.8-27B runs every context size from 32K to 1M on one 24 GB RTX 3090, with exact recall of planted facts: the memory fit makes room step by step and TqCache keeps the oldest KV in system RAM only past 512K. Decode: 104.9 tok/s at 32K, 75.2 at 256K, 49.6 at 512K, 21.4 at 768K, 7.7 at 1M (exact recall). Full charts, what the fit did at each size, and the 1M command: Features: long context on one GPU.
Decode tok/s, higher is better
- tqLLM + DFlash2 drafter
By GPU
| GPU | Benchmark context | KV | Decode with drafter (tok/s) |
|---|---|---|---|
| RTX 3090 / 4090 (24 GB) | 32768 (runs to 256K+) | bf16 (tq3 for long context) | 131-155 summaries, 256 LocalMaxxing |
| RTX 5060 Ti / 4060 Ti (16 GB) | 16384 | tq3 | 77-95 summaries |
| GB10 / DGX Spark (128 GB) | 131072+ | bf16 | 43-54 summaries, 79 LocalMaxxing |
RTX 5060 Ti 16 GB (WSL 2), drafter on, one run each, 16K context chosen by the memory fit: 2K prompt 777 tok/s prefill / 94.5 tok/s decode, 8K prompt 821 / 76.9.
Why the drafter is exact
Speculative decoding is only worth it if it never changes the answer. In tqLLM, plain decoding and every verify
path (token tree, single chain, MTP) share one attention arithmetic, so greedy output is identical token for
token. This is checked by the test-tree, test-dflash-exact and
test-native-mtp tests and on long prompts up to 51K tokens.
Reproduce
sh bench/get_wikitext.sh # bench/data/wiki.test.raw (checksum-verified)
# native build: starts tqserve itself, without and with the drafter
python3 bench/relbench.py --bin build/tqserve --gpu "RTX 3090" --wiki bench/data/wiki.test.raw --out results.jsonl \
--model v2=models/Qwen3.8-27B-TQ3_4S-v2.gguf \
--drafter models/drafters/Qwen3.8-27B-DFlash2-TQ3.gguf --vocab models/mtp-vocab/atx_65536.txt
# or against a running Docker server (start it with -e KV_FORMAT=tq3 to match)
python3 bench/relbench.py --url http://localhost:8086 --mode dflash2 --gpu "RTX 3090" \
--wiki bench/data/wiki.test.raw --out results.jsonl --model v2=models/Qwen3.8-27B-TQ3_4S-v2.ggufEach line of results.jsonl records the GPU, the model file, the settings and the engine commit the
server reports in GET /health.