Performance

Every number here names its GPU, model file, drafter and settings. The benchmark script is in the repository, so you can check any of them on your own card.

Why do the benchmarks say 32K context and BF16 KV? Those are LocalMaxxing's rules: every engine on the board runs the same 32K context with a 16-bit KV cache, so the numbers compare like for like. They are not tqLLM's limits. Qwen3.8-27B runs at its full 256K context on one RTX 3090 (measured: 140 tok/s at 256K with TQ4_L and the tq3 KV cache, about 23 of 24 GB in use), and up to 1M with YaRN and the trellis-coded KV cache, with exact recall at every size we measured; see Context to 1M.

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

RTX 3090 24 GB (submitted, approved)

reasoning-v1273.1
code-v1199.5

RTX 5060 Ti 16 GB (not submitted)

reasoning-v1175.9
code-v1109
  • reasoning-v1
  • code-v1
LocalMaxxing canonical prompts, 32K context, thinking on, temperature 0, 320 output tokens, median of 5. RTX 3090: Qwen3.8-27B-TQ3_4S-v2.gguf, DFlash2 Q4_K_M drafter, BF16 KV (2026-10-03). RTX 5060 Ti: reasoning Qwen3.8-27B-TQ_XS.gguf, code Qwen3.8-27B-TQ_S.gguf, DFlash2-TQ3 drafter, tq3 KV (2026-10-09).
GPU and filePromptMedian tok/sRange (5 runs)Status
RTX 3090, Qwen3.8-27B-TQ3_4S-v2.ggufreasoning-v1273.1253.0-274.0submitted, approved
RTX 3090, Qwen3.8-27B-TQ3_4S-v2.ggufcode-v1199.5176.3-208.5submitted, approved
RTX 5060 Ti, Qwen3.8-27B-TQ_XS.ggufreasoning-v1175.9162.6-180.2local, not submitted
RTX 5060 Ti, Qwen3.8-27B-TQ_XS.ggufcode-v198.893.6-102.7local, not submitted
RTX 5060 Ti, Qwen3.8-27B-TQ_S.ggufreasoning-v1166.5159.0-171.9local, not submitted
RTX 5060 Ti, Qwen3.8-27B-TQ_S.ggufcode-v1109.0101.5-113.9local, 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.

PrompttqLLM first tokenStrata first tokentqLLM decode afterStrata decode after
32K14.98 s15.14 s76.4 tok/s72.2 tok/s
64K28.01 s29.18 s85.1 tok/s63.6 tok/s
128K56.53 s58.25 s77.1 tok/s47.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

0501001502002K8K32K55.554.550.6155.2149.9131
  • No drafter
  • DFlash2 drafter
Qwen3.8-27B-TQ3_4S-v2.gguf, DFlash2-TQ3 drafter, tq3 KV, context 40,960, WikiText-2 summaries, 400 output tokens, median of 3.
PromptPrefill tok/sDecode, no drafterDecode, DFlash2 drafter
2K2,25855.5155.2
8K2,42654.5149.9
32K2,15550.6131.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

05010015020025032K128K192K256K202.8157.1144.4106.6
  • tqLLM + DFlash2 drafter
Qwen3.8-27B-TQ3_4S-v2.gguf, DFlash2 Q4_K_M drafter, T4KV cache, chain verify, server context 262,144, C++ code prompt, greedy, up to 512 output tokens (2026-10-04). Every answer compiled and passed its test.
PromptPrompt tokensPrefill tok/sDecode tok/sDrafts accepted
32K31,4101,205.6202.8273 / 420
128K129,247856.1157.1262 / 392
192K194,429709.7144.4323 / 448
256K259,636612.8106.6271 / 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

RTX 3090 24 GB

reasoning-v1251.7
code-v1173.4

RTX 5060 Ti 16 GB

reasoning-v1166.5
code-v1109

GB10 / DGX Spark

reasoning-v192.8
code-v160.4
  • reasoning-v1
  • code-v1
Qwen3.8-27B-TQ_S.gguf (12.55 GB), DFlash2-TQ3 drafter, 32K context, thinking on, median of 5 runs (3 on the 3090). KV: tq3 on the 3090 and 5060 Ti, BF16 on GB10. 2026-10-09 / 10 release engine.
GPUreasoning-v1 tok/scode-v1 tok/s
RTX 3090 24 GB251.7173.4
RTX 5060 Ti 16 GB (Windows 11 / WSL 2)166.5109.0
GB10 (DGX Spark)92.860.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

1.6K tokens

No drafting57
MTP head155

51K tokens

No drafting47
MTP head125
  • No drafting
  • MTP head
RTX 3090, Qwen3.8-27B, the MTP head built into the model, no separate draft file.
SetupDecode tok/s
RTX 3090, LocalMaxxing reasoning prompt, 32K context, 320 output tokens, DFlash2 drafter240-270 (median 256)
RTX 3090, model's own MTP head (--mtp), 1.6K tokens155 (57 without drafting)
RTX 3090, model's own MTP head, 51K tokens125 (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

31K prompt

Drafter158
Drafter + --draft-retrieve 32176

40K prompt

Drafter143
Drafter + --draft-retrieve 32156

51K prompt

Drafter137
Drafter + --draft-retrieve 32148
  • Drafter
  • Drafter + --draft-retrieve 32
RTX 3090, 64K context; the drafter also reads 32 far passages of the prompt.

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

200K prompt

Default context (204,800)113
--context 262144 (TqCache)70

224K prompt

Default context (204,800)refused
--context 262144 (TqCache)42

248K prompt

Default context (204,800)refused
--context 262144 (TqCache)32
  • Default context (204,800)
  • --context 262144 (TqCache)
Qwen3.8-27B-TQ_XS.gguf + DFlash2 drafter, tq3 KV. Without TqCache the 224K and 248K prompts are refused; with it the oldest KV sits in system RAM and the output is unchanged.
PromptDefault context (204,800)--context 262144 (TqCache)
200K11370
224Krefused42
248Krefused32

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.

Side by side on a second RTX 3090 that also drives a desktop (0.76 GB of VRAM in use), main 386e225 vs llama.cpp 60f0237, each run alone: IQ3_S all in VRAM 201.8 vs 147.3 tok/s; Q5_K_M with --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

Code: hash map in C

llama.cpp Q5_K_M, -ncmoe 2123.4
tqLLM Q5_K_M, --moe-host-mb 2000171
llama.cpp IQ3_S, all in VRAM135.7
tqLLM IQ3_S, all in VRAM202.4

Prose: short story

llama.cpp Q5_K_M, -ncmoe 2124.3
tqLLM Q5_K_M, --moe-host-mb 2000178.1
llama.cpp IQ3_S, all in VRAM136.8
tqLLM IQ3_S, all in VRAM203

Code: palindrome + tests

llama.cpp Q5_K_M, -ncmoe 2124.2
tqLLM Q5_K_M, --moe-host-mb 2000161.7
llama.cpp IQ3_S, all in VRAM136.8
tqLLM IQ3_S, all in VRAM203.1
  • 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
One RTX 3090, MiniCPM-V-4_7-35B-A3B-Q5_K_M.gguf (24.7 GB, does not fit in 24 GB) and MiniCPM-V-4_7-35B-A3B-IQ3_S.gguf, no drafter, greedy, 512 tokens, thinking off, same session. KV: llama.cpp q8_0 K/V with -fa on; tqLLM default KV at 32K context.
File and settingHash map in CShort storyPalindrome + tests
llama.cpp Q5_K_M, -ncmoe 2123.4124.3124.2
tqLLM Q5_K_M, --moe-host-mb 2000171.0178.1161.7
llama.cpp IQ3_S, -ngl 99135.7136.8136.8
tqLLM IQ3_S, all experts in VRAM202.4203.0203.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

Code: hash map in C

llama.cpp, no drafter82.2
tqLLM, no drafter96.7
llama.cpp + DSpark105.8
tqLLM + DSpark147.6

Prose: short story

llama.cpp, no drafter82.8
tqLLM, no drafter96.8
llama.cpp + DSpark72.2
tqLLM + DSpark86.5

Code: palindrome + tests

llama.cpp, no drafter82.2
tqLLM, no drafter96.4
llama.cpp + DSpark114.9
tqLLM + DSpark163.3
  • llama.cpp, no drafter
  • tqLLM, no drafter
  • llama.cpp + DSpark
  • tqLLM + DSpark
GB10, MiniCPM-V-4_7-35B-A3B-IQ3_S.gguf, DSpark drafter (dspark-MiniCPM-V-4_7-35B-A3B-F16.gguf), greedy, 512 tokens, thinking off, same session. tqLLM uses chain verify (output identical to its no-drafter run). MiniCPM support ships in 1.0.0.

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

02040608010012032K64K128K256K384K512K768K1M104.9101.987.375.254.649.621.47.7
  • tqLLM + DFlash2 drafter
One RTX 3090 24 GB, Qwen3.8-27B-TQ3_4S-v2.gguf, DFlash2-TQ3 drafter, a prompt filling ~90 % of the context (WikiText with planted facts), 256 output tokens, greedy. Up to 128K the memory fit's default KV; from 256K the trellis-coded KV (--kv tcq3/tcq2); past 256K YaRN (--rope-scaling yarn). Exact recall at every size.

By GPU

GPUBenchmark contextKVDecode 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)16384tq377-95 summaries
GB10 / DGX Spark (128 GB)131072+bf1643-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.gguf

Each line of results.jsonl records the GPU, the model file, the settings and the engine commit the server reports in GET /health.