Matrix A - minicpm5_2b - run 38529590584

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.3%+56%vLLM c1: tkv vs bf16 +58.1%+58%SGLang c1: tkv vs bf16 +56.1%+56%c1@126karbi-serve c8: tkv vs bf16 +36.7%+37%vLLM c8: tkv vs bf16 +31.4%+31%SGLang c8: tkv vs bf16 +33.9%+34%c8@14karbi-serve c64: tkv vs bf16 +43.6%+44%vLLM c64: tkv vs bf16 +42.5%+42%SGLang c64: tkv vs bf16 +41.1%+41%c64@1.6karbi-serve c256: tkv vs bf16 +20.1%+20%vLLM c256: tkv vs bf16 +22.2%+22%SGLang c256: tkv vs bf16 +29.4%+29%c256@0.8kconcurrency @ median prompt length
Prefill tok/s: tkv vs bf16
0%20%40%60%80%% vs bf16arbi-serve c1: tkv vs bf16 +66.9%+67%vLLM c1: tkv vs bf16 +64.9%+65%SGLang c1: tkv vs bf16 +65.2%+65%c1@126karbi-serve c8: tkv vs bf16 +11.8%+12%vLLM c8: tkv vs bf16 +18.4%+18%SGLang c8: tkv vs bf16 +29.8%+30%c8@14karbi-serve c64: tkv vs bf16 +2.8%+3%vLLM c64: tkv vs bf16 +3.0%+3%SGLang c64: tkv vs bf16 +9.8%+10%c64@1.6karbi-serve c256: tkv vs bf16 +1.6%+2%vLLM c256: tkv vs bf16 +2.4%+2%SGLang c256: tkv vs bf16 +3.5%+4%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 +39.3%+39%SGLang c1: tkv vs bf16 +39.5%+39%c1@126karbi-serve c8: tkv vs bf16 +10.7%+11%vLLM c8: tkv vs bf16 +15.0%+15%SGLang c8: tkv vs bf16 +22.6%+23%c8@14karbi-serve c64: tkv vs bf16 +1.0%+1%vLLM c64: tkv vs bf16 +2.9%+3%SGLang c64: tkv vs bf16 +9.3%+9%c64@1.6karbi-serve c256: tkv vs bf16 -0.2%-0.2%vLLM c256: tkv vs bf16 +2.1%+2%SGLang c256: tkv vs bf16 +4.0%+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.7 tok/s per streamarbi-serve bf16 c64: 68.7 tok/s per streamarbi-serve bf16 c256: 27.5 tok/s per streamvLLM bf16 c1: 85.1 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.5 tok/s per streamSGLang bf16 c8: 69.3 tok/s per streamSGLang bf16 c64: 67.2 tok/s per streamSGLang bf16 c256: 23.6 tok/s per streamarbi-serve tkv c1: 134 tok/s per streamarbi-serve tkv c8: 94.0 tok/s per streamarbi-serve tkv c64: 98.6 tok/s per streamarbi-serve tkv c256: 33.0 tok/s per streamvLLM tkv c1: 135 tok/s per streamvLLM tkv c8: 93.0 tok/s per streamvLLM tkv c64: 96.7 tok/s per streamvLLM tkv c256: 33.2 tok/s per streamSGLang tkv c1: 132 tok/s per streamSGLang tkv c8: 92.9 tok/s per streamSGLang tkv c64: 94.8 tok/s per streamSGLang tkv c256: 30.5 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: 5787 prefill tok/sarbi-serve bf16 c8: 4553 prefill tok/sarbi-serve bf16 c64: 933 prefill tok/sarbi-serve bf16 c256: 219 prefill tok/svLLM bf16 c1: 5861 prefill tok/svLLM bf16 c8: 4304 prefill tok/svLLM bf16 c64: 820 prefill tok/svLLM bf16 c256: 210 prefill tok/sSGLang bf16 c1: 5744 prefill tok/sSGLang bf16 c8: 4508 prefill tok/sSGLang bf16 c64: 872 prefill tok/sSGLang bf16 c256: 238 prefill tok/sarbi-serve tkv c1: 9660 prefill tok/sarbi-serve tkv c8: 5091 prefill tok/sarbi-serve tkv c64: 958 prefill tok/sarbi-serve tkv c256: 222 prefill tok/svLLM tkv c1: 9664 prefill tok/svLLM tkv c8: 5097 prefill tok/svLLM tkv c64: 844 prefill tok/svLLM tkv c256: 215 prefill tok/sSGLang tkv c1: 9489 prefill tok/sSGLang tkv c8: 5850 prefill tok/sSGLang tkv c64: 957 prefill tok/sSGLang tkv c256: 246 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: 4738 tok/s, all streamsarbi-serve bf16 c256: 8212 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: 8036 tok/s, all streamsSGLang bf16 c1: 85 tok/s, all streamsSGLang bf16 c8: 710 tok/s, all streamsSGLang bf16 c64: 4648 tok/s, all streamsSGLang bf16 c256: 6843 tok/s, all streamsarbi-serve tkv c1: 134 tok/s, all streamsarbi-serve tkv c8: 903 tok/s, all streamsarbi-serve tkv c64: 6529 tok/s, all streamsarbi-serve tkv c256: 9557 tok/s, all streamsvLLM tkv c1: 135 tok/s, all streamsvLLM tkv c8: 892 tok/s, all streamsvLLM tkv c64: 6367 tok/s, all streamsvLLM tkv c256: 9480 tok/s, all streamsSGLang tkv c1: 132 tok/s, all streamsSGLang tkv c8: 886 tok/s, all streamsSGLang tkv c64: 6243 tok/s, all streamsSGLang tkv c256: 8539 tok/s, all streams

Canonical table

Matrix A - minicpm5_2b - run 38529590584
       │                                     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   │     9660/5787      134/85.4        134/85   13357/22294      7.5/11.7         45/27 │     5091/4553     94.0/68.7       903/697     2773/3105     10.6/14.6       515/392 │       958/933     98.6/68.7     6529/4738     2231/2254     10.1/14.6     4910/3704 │       222/219     33.0/27.5     9557/8212     4536/4529     30.3/36.4     6456/5749 
vllm   │     9664/5861      135/85.1        135/85   13351/22013      7.4/11.8         45/28 │     5097/4304     93.0/70.8       892/722     3288/3868     10.8/14.1       508/402 │       844/820     96.7/67.9     6367/4706     2877/2962     10.3/14.7     4640/3576 │       215/210     33.2/27.2     9480/8036     4738/4842     30.1/36.8     6351/5609 
sglang │     9489/5744      132/84.5        132/85   13598/22461      7.6/11.8         44/27 │     5850/4508     92.9/69.3       886/710     2736/3533     10.8/14.4       530/400 │       957/872     94.8/67.2     6243/4648     2189/2414     10.6/14.9     4738/3593 │       246/238     30.5/23.6     8539/6843     4058/4229     32.8/42.4     5645/4683 
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