Matrix A — MiniCPM5-2B, RTX 4090 — vLLM v0.31.0 / SGLang v0.5.21 / arbi-serve (128-token pages) — turbo-attn 40c62e23, 2026-10-09

tkv advantage over each engine's own bf16 KV

Same engine, same workload, KV cache swapped: bf16 → tkv. Higher is better on every bar.

arbi-servevLLMSGLang
Decode tok/s per stream: tkv vs bf16
0%20%40%60%80%% vs bf16arbi-serve c1: tkv vs bf16 +56.1%+56%vLLM c1: tkv vs bf16 +58.1%+58%SGLang c1: tkv vs bf16 +55.2%+55%c1@126karbi-serve c8: tkv vs bf16 +38.6%+39%vLLM c8: tkv vs bf16 +32.3%+32%SGLang c8: tkv vs bf16 +34.6%+35%c8@14karbi-serve c64: tkv vs bf16 +44.5%+45%vLLM c64: tkv vs bf16 +42.8%+43%SGLang c64: tkv vs bf16 +41.5%+41%c64@1.6karbi-serve c256: tkv vs bf16 +12.7%+13%vLLM c256: tkv vs bf16 +23.1%+23%SGLang c256: tkv vs bf16 +24.4%+24%c256@0.8kconcurrency @ median prompt length
Prefill tok/s: tkv vs bf16
0%20%40%60%80%% vs bf16arbi-serve c1: tkv vs bf16 +67.0%+67%vLLM c1: tkv vs bf16 +67.7%+68%SGLang c1: tkv vs bf16 +70.5%+70%c1@126karbi-serve c8: tkv vs bf16 +22.9%+23%vLLM c8: tkv vs bf16 +20.0%+20%SGLang c8: tkv vs bf16 +32.3%+32%c8@14karbi-serve c64: tkv vs bf16 +5.0%+5%vLLM c64: tkv vs bf16 +4.8%+5%SGLang c64: tkv vs bf16 +10.1%+10%c64@1.6karbi-serve c256: tkv vs bf16 +2.8%+3%vLLM c256: tkv vs bf16 +2.7%+3%SGLang c256: tkv vs bf16 +3.5%+3%c256@0.8kconcurrency @ median prompt length
TTFT reduction: tkv vs bf16
0%10%20%30%40%50%% lower TTFTarbi-serve c1: tkv vs bf16 +40.1%+40%vLLM c1: tkv vs bf16 +40.4%+40%SGLang c1: tkv vs bf16 +41.3%+41%c1@126karbi-serve c8: tkv vs bf16 +11.6%+12%vLLM c8: tkv vs bf16 +16.3%+16%SGLang c8: tkv vs bf16 +24.0%+24%c8@14karbi-serve c64: tkv vs bf16 +4.8%+5%vLLM c64: tkv vs bf16 +6.3%+6%SGLang c64: tkv vs bf16 +9.9%+10%c64@1.6karbi-serve c256: tkv vs bf16 -0.3%-0.3%vLLM c256: tkv vs bf16 +2.6%+3%SGLang c256: tkv vs bf16 +4.1%+4%c256@0.8kconcurrency @ median prompt length

Engine parity

One colour per engine: the engines track each other, with the tkv lines (solid) above the bf16 lines (dashed).

arbi-servevLLMSGLangtkv KVbf16 KV
Decode tok/s per stream
050100150tok/s per streamc1@126kc8@14kc64@1.6kc256@0.8kconcurrency (log scale) @ median prompt lengtharbi-serve bf16 c1: 85.4 tok/s per streamarbi-serve bf16 c8: 68.0 tok/s per streamarbi-serve bf16 c64: 68.3 tok/s per streamarbi-serve bf16 c256: 27.5 tok/s per streamvLLM bf16 c1: 85.3 tok/s per streamvLLM bf16 c8: 70.8 tok/s per streamvLLM bf16 c64: 67.9 tok/s per streamvLLM bf16 c256: 27.2 tok/s per streamSGLang bf16 c1: 84.7 tok/s per streamSGLang bf16 c8: 69.5 tok/s per streamSGLang bf16 c64: 67.4 tok/s per streamSGLang bf16 c256: 23.8 tok/s per streamarbi-serve tkv c1: 133 tok/s per streamarbi-serve tkv c8: 94.3 tok/s per streamarbi-serve tkv c64: 98.7 tok/s per streamarbi-serve tkv c256: 31.0 tok/s per streamvLLM tkv c1: 135 tok/s per streamvLLM tkv c8: 93.6 tok/s per streamvLLM tkv c64: 97.0 tok/s per streamvLLM tkv c256: 33.5 tok/s per streamSGLang tkv c1: 131 tok/s per streamSGLang tkv c8: 93.5 tok/s per streamSGLang tkv c64: 95.3 tok/s per streamSGLang tkv c256: 29.7 tok/s per stream
Prefill tok/s
02.5k5k7.5k10k12.5kprefill tok/sc1@126kc8@14kc64@1.6kc256@0.8kconcurrency (log scale) @ median prompt lengtharbi-serve bf16 c1: 5884 prefill tok/sarbi-serve bf16 c8: 4374 prefill tok/sarbi-serve bf16 c64: 925 prefill tok/sarbi-serve bf16 c256: 219 prefill tok/svLLM bf16 c1: 5851 prefill tok/svLLM bf16 c8: 4256 prefill tok/svLLM bf16 c64: 816 prefill tok/svLLM bf16 c256: 211 prefill tok/sSGLang bf16 c1: 5756 prefill tok/sSGLang bf16 c8: 4544 prefill tok/sSGLang bf16 c64: 894 prefill tok/sSGLang bf16 c256: 243 prefill tok/sarbi-serve tkv c1: 9827 prefill tok/sarbi-serve tkv c8: 5376 prefill tok/sarbi-serve tkv c64: 971 prefill tok/sarbi-serve tkv c256: 225 prefill tok/svLLM tkv c1: 9809 prefill tok/svLLM tkv c8: 5106 prefill tok/svLLM tkv c64: 855 prefill tok/svLLM tkv c256: 217 prefill tok/sSGLang tkv c1: 9811 prefill tok/sSGLang tkv c8: 6014 prefill tok/sSGLang tkv c64: 984 prefill tok/sSGLang tkv c256: 251 prefill tok/s

Scaling with batch

Total decode throughput over all concurrent streams.

arbi-servevLLMSGLangtkv KVbf16 KV
Total decode tok/s (all streams)
02.5k5k7.5k10k12.5ktok/s, all streamsc1@126kc8@14kc64@1.6kc256@0.8kconcurrency (log scale) @ median prompt lengtharbi-serve bf16 c1: 85 tok/s, all streamsarbi-serve bf16 c8: 697 tok/s, all streamsarbi-serve bf16 c64: 4726 tok/s, all streamsarbi-serve bf16 c256: 8228 tok/s, all streamsvLLM bf16 c1: 85 tok/s, all streamsvLLM bf16 c8: 722 tok/s, all streamsvLLM bf16 c64: 4706 tok/s, all streamsvLLM bf16 c256: 8057 tok/s, all streamsSGLang bf16 c1: 85 tok/s, all streamsSGLang bf16 c8: 711 tok/s, all streamsSGLang bf16 c64: 4665 tok/s, all streamsSGLang bf16 c256: 6918 tok/s, all streamsarbi-serve tkv c1: 134 tok/s, all streamsarbi-serve tkv c8: 898 tok/s, all streamsarbi-serve tkv c64: 6531 tok/s, all streamsarbi-serve tkv c256: 9173 tok/s, all streamsvLLM tkv c1: 135 tok/s, all streamsvLLM tkv c8: 896 tok/s, all streamsvLLM tkv c64: 6386 tok/s, all streamsvLLM tkv c256: 9565 tok/s, all streamsSGLang tkv c1: 131 tok/s, all streamsSGLang tkv c8: 890 tok/s, all streamsSGLang tkv c64: 6273 tok/s, all streamsSGLang tkv c256: 8470 tok/s, all streams

Canonical table

Matrix A — MiniCPM5-2B, RTX 4090 — vLLM v0.31.0 / SGLang v0.5.21 / arbi-serve (128-token pages) — turbo-attn 40c62e23, 2026-10-09
       │                                     c1@126k                                      │                                      c8@14k                                      │                                     c64@1.6k                                     │                                    c256@0.8k                                     
engine │ prefill tok/s decode/stream  decode total          TTFT          TPOT agg@900 tok/s │ prefill tok/s decode/stream  decode total          TTFT          TPOT agg@900 tok/s │ prefill tok/s decode/stream  decode total          TTFT          TPOT agg@900 tok/s │ prefill tok/s decode/stream  decode total          TTFT          TPOT agg@900 tok/s 
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
arbi   │     9827/5884      133/85.4        134/85   13130/21927      7.5/11.7         45/28 │     5376/4374     94.3/68.0       898/697     2736/3095     10.6/14.7       521/389 │       971/925     98.7/68.3     6531/4726     2249/2363     10.1/14.6     4934/3700 │       225/219     31.0/27.5     9173/8228     4504/4489     32.2/36.4     6294/5776 
vllm   │     9809/5851      135/85.3        135/85   13154/22053      7.4/11.7         45/28 │     5106/4256     93.6/70.8       896/722     3299/3940     10.7/14.1       510/401 │       855/816     97.0/67.9     6386/4706     2847/3040     10.3/14.7     4660/3563 │       217/211     33.5/27.2     9565/8057     4694/4817     29.9/36.8     6411/5626 
sglang │     9811/5756      131/84.7        131/85   13151/22417      7.6/11.8         45/27 │     6014/4544     93.5/69.5       890/711     2661/3503     10.7/14.4       537/401 │       984/894     95.3/67.4     6273/4665     2126/2360     10.5/14.8     4786/3621 │       251/243     29.7/23.8     8470/6918     3982/4153     33.7/41.9     5543/4745 
cells: tkv/bf16 · TTFT,TPOT=ms median · prefill=prompt tok / TTFT · decode/stream=1000/TPOT · decode total=all streams over their decode spans · agg=all streams @ 900 tok, prefill INCLUDED · best / worst>20% / worst-close / plain mid