← All benchmarks

Gemma 4 31B

Paddock vs vLLM vs SGLang vs llama.cppRTX PRO 60002026-08-03

Google's strongest Gemma 4 model - a dense multimodal transformer with 5:1 sliding-window/global attention and a separate MTP drafter for speculative decoding.

By GoogleOpen model card ↗

Result

Throughput across the 13 fixed test scenarios. Paddock, vLLM and SGLang all serve the byte-identical official FP8 checkpoint. llama.cpp has no FP8 weight type to serve it with, so an FP8 checkpoint has to be dequantised when it is converted (llama.cpp's own converter has a --fp8-as-q8 flag for exactly that). It is measured here against the Paddock row reading the same Q8_0 file it reads. Speculative decoding is on.

vs vLLM

11 of 13

scenarios faster, up to +76.0% - behind on 2 · FP8 weights

vs SGLang

13 of 13

scenarios faster, 1.66x-2.91x · FP8 weights

vs llama.cpp

13 of 13

scenarios faster, 1.12x-7.2x · Q8_0 weights

Throughput as the Load Climbs

What the server delivers, from one client up to a full batch. Higher is better. The shaded region is what Paddock delivers above the strongest of the others at each step, and the figure above the line is its multiple there.

Balanced load

1,024 tokens in · 1,024 tokens out

PaddockvLLMSGLangllama.cppQ8_0

Server throughput (tokens/s)

BESTWORST

The 64-client step is left off: past a max batch of 32 every engine is queueing rather than serving. It is in the table.

Table view
ClientsPaddock (FP8)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)
1100.8 tok/s78.1 tok/s45.0 tok/s82.0 tok/s
2194.0 tok/s152.8 tok/s90.8 tok/s129.2 tok/s
4349.5 tok/s300.2 tok/s178.8 tok/s158.6 tok/s
8625.7 tok/s566.8 tok/s299.0 tok/s239.5 tok/s
161,011.2 tok/s1,025.1 tok/s498.4 tok/s278.6 tok/s
321,604.9 tok/s1,615.1 tok/s688.7 tok/s343.9 tok/s
641,607.0 tok/s1,623.5 tok/s688.4 tok/s336.0 tok/s

Agentic sessions

Shared-prefix sessions × 6 turns

PaddockvLLMSGLangllama.cppQ8_0

Server throughput (tokens/s)

BESTWORST

Sessions share a prefix, so this ladder also measures whether an engine’s prefix cache engages.

Table view
SessionsPaddock (FP8)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)
199.2 tok/s81.6 tok/s46.2 tok/s58.9 tok/s
2187.6 tok/s160.5 tok/s92.4 tok/s79.5 tok/s
4338.9 tok/s310.1 tok/s179.6 tok/s96.5 tok/s
8617.4 tok/s585.2 tok/s297.6 tok/s95.6 tok/s
16978.8 tok/s1,012.7 tok/s454.9 tok/s104.2 tok/s
321,559.9 tok/s1,610.7 tok/s617.5 tok/s99.3 tok/s

Total Throughput Against Per-User Speed

The trade every serving engine makes: pack in more clients and the server produces more tokens in total, but each client’s answer streams out slower. This is the curve the independent inference benchmarks publish - per-user speed across the bottom, total throughput up the side. Both axes are better when higher, so up and to the right wins. An engine is only genuinely better if it serves more tokens overall and streams faster to each client.

Balanced load

1,024 tokens in · 1,024 tokens out · each point is a client count

PaddockvLLMSGLangllama.cppQ8_0

Server throughput (tokens/s)

BESTWORST

Numbers on the Paddock line are client counts. llama.cpp is dashed because it serves Q8_0 rather than FP8.

Table view
ClientsPaddock (FP8)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)
1100.8 tok/s · 105.3/client78.1 tok/s · 77.8/client45.0 tok/s · 44.7/client82.0 tok/s · 88.4/client
2194.0 tok/s · 99.2/client152.8 tok/s · 78.8/client90.8 tok/s · 46.5/client129.2 tok/s · 73.5/client
4349.5 tok/s · 89.9/client300.2 tok/s · 77.4/client178.8 tok/s · 46.0/client158.6 tok/s · 50.8/client
8625.7 tok/s · 80.9/client566.8 tok/s · 74.0/client299.0 tok/s · 39.5/client239.5 tok/s · 34.3/client
161,011.2 tok/s · 66.4/client1,025.1 tok/s · 67.0/client498.4 tok/s · 32.4/client278.6 tok/s · 19.1/client
321,604.9 tok/s · 53.1/client1,615.1 tok/s · 53.5/client688.7 tok/s · 22.4/client343.9 tok/s · 12.0/client
641,607.0 tok/s · 51.7/client1,623.5 tok/s · 52.2/client688.4 tok/s · 21.9/client336.0 tok/s · 11.1/client

Waiting for the First Token

How long a client waits before anything appears, as the load climbs. The line is the median wait; the 90th percentile is in the table beneath it. Lower is better, and the axis is logarithmic - each gridline is ten times the one below it, because no straight scale holds a tenth of a second and ten seconds in one frame.

Balanced load

1,024 tokens in · 1,024 tokens out

PaddockvLLMSGLangllama.cppQ8_0

Time to first token, log scale

BESTWORST
Table view
ClientsPaddock (FP8)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)
1104 ms · p90 104 ms109 ms · p90 132 ms176 ms · p90 176 ms878 ms · p90 900 ms
2142 ms · p90 206 ms162 ms · p90 210 ms174 ms · p90 249 ms1.0 s · p90 1.6 s
4165 ms · p90 362 ms163 ms · p90 354 ms174 ms · p90 446 ms1.3 s · p90 3.2 s
8171 ms · p90 472 ms167 ms · p90 673 ms182 ms · p90 893 ms1.9 s · p90 7.2 s
16217 ms · p90 957 ms240 ms · p90 945 ms195 ms · p90 1.7 s3.2 s · p90 13 s
32257 ms · p90 2.0 s271 ms · p90 1.8 s413 ms · p90 3.1 s4.8 s · p90 22 s
6420 s · p90 21 s20 s · p90 21 s47 s · p90 49 s100 s · p90 104 s

Agentic sessions

Shared-prefix sessions × 6 turns

PaddockvLLMSGLangllama.cppQ8_0

Time to first token, log scale

BESTWORST
Table view
SessionsPaddock (FP8)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)
145 ms · p90 226 ms79 ms · p90 96 ms130 ms · p90 159 ms1.6 s · p90 1.6 s
273 ms · p90 226 ms125 ms · p90 128 ms129 ms · p90 158 ms2.1 s · p90 3.1 s
4117 ms · p90 278 ms129 ms · p90 192 ms128 ms · p90 170 ms1.9 s · p90 5.2 s
885 ms · p90 370 ms140 ms · p90 198 ms167 ms · p90 215 ms4.8 s · p90 9.6 s
16163 ms · p90 535 ms203 ms · p90 283 ms232 ms · p90 326 ms5.7 s · p90 12 s
32177 ms · p90 800 ms307 ms · p90 378 ms355 ms · p90 508 ms10.0 s · p90 67 s

Agentic sessions share a prefix on purpose - reuse is the thing being measured. Paddock reports a cache hit rate of 0.82-0.99 and llama.cpp 0.90-0.99. vLLM’s prefix cache reports 0.0 here, though on this architecture it costs little - its wait stays level with ours. SGLang does not report cache statistics by default, so its 0.0 is unreported rather than disproven.

Every Shape on the Board

The four prompt/answer shapes NVIDIA, vLLM and SGLang publish, at 1, 8 and 32 concurrent clients, plus a vision probe. Longer bars are better, and each panel is scaled to itself. The badge on an engine is how many times faster Paddock is on that scenario - a grey badge below 1.0x means that engine won it. Each is rated against the Paddock row in its own weight class: llama.cpp against the row reading the identical Q8_0 file, vLLM and SGLang against the FP8 row.

Paddock (FP8)Paddock (Q8_0)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)

Short chat

128 tokens in · 128 tokens outShort turns, where per-request overhead shows up.

Summarization

2,048 tokens in · 128 tokens outPrefill-bound: most of the work is reading the prompt.

Long generation

128 tokens in · 2,048 tokens outDecode-bound: most of the work is writing the answer.

Balanced

1,024 tokens in · 1,024 tokens outThe even mix, halfway between reading the prompt and writing the answer.

Vision document Q&A

One page image + questionA controlled probe of the vision path, not an industry dataset.

Where Paddock Wins and Where It Loses

The same scenarios as a margin against Paddock. The centre line is Paddock; a bar to the right means Paddock is ahead, a bar to the left means it is behind. Losses are labelled - they are the reason to read this chart.

Against vLLM and SGLang

Throughput per scenario, relative to Paddock on the byte-identical FP8 checkpoint

vLLMSGLang
WORSTBEST

The scale snaps to a fixed ladder rather than fitting the data - ±200% here - so a small margin looks small. Every cell Paddock drops is at 32 clients at once, against vLLM.

Against llama.cpp

Same Q8_0 GGUF file, both engines - how many times faster Paddock is

Requests That Actually Met the Target

Throughput counts tokens whether or not anyone is still waiting for them. Goodput counts only the requests that met both halves of a declared target - first token within 2.0 s and 50 ms per token after that. It is the number that decides how many clients a server can really take. Higher is better.

Goodput under load

1,024 tokens in · 1,024 tokens out, target 2.0 s / 50 ms

PaddockvLLMSGLangllama.cppQ8_0

Requests meeting the SLO

BESTWORST
Table view
ClientsPaddock (FP8)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)
1100.0%100.0%100.0%100.0%
2100.0%100.0%100.0%100.0%
4100.0%100.0%100.0%75.0%
8100.0%100.0%100.0%56.2%
16100.0%100.0%100.0%1.6%
3289.6%91.4%80.5%0.0%
647.2%8.2%2.3%0.0%

One scenario costs us this target: summarization · 32 clients, where the admission wave blows the 2.0 s budget (Paddock 15.6%, vLLM 37.8%, SGLang 3.1%, llama.cpp 0.0%). Under the goodput lens the ranking can flip against raw throughput. We publish it because it points at a real thing to fix.

The Whole Board

Every scenario, every engine, one table - throughput with median time to first token beneath it.

ScenarioPaddock (FP8)Paddock (Q8_0)vLLM (FP8)SGLang (FP8)llama.cpp (Q8_0)
Short chat · 1 client113.2 · 35 ms112.7 · 36 ms82.9 · 62 ms51.0 · 97 ms87.4 · 200 ms
Short chat · 8 clients702.0 · 85 ms693.6 · 88 ms598.9 · 104 ms353.2 · 99 ms186.1 · 1.1 s
Short chat · 32 clients1,959.8 · 132 ms1,890.7 · 143 ms1,857.9 · 149 ms960.0 · 199 ms282.0 · 2.3 s
Summarization · 1 client103.2 · 184 ms96.2 · 204 ms68.2 · 190 ms41.2 · 288 ms46.9 · 1.5 s
Summarization · 8 clients344.8 · 247 ms344.7 · 239 ms332.8 · 401 ms198.0 · 368 ms49.3 · 6.8 s
Summarization · 32 clients518.0 · 437 ms487.4 · 707 ms527.7 · 1.1 s311.6 · 1.2 s67.7 · 10 s
Long generation · 1 client97.6 · 35 ms93.4 · 36 ms79.6 · 65 ms47.0 · 109 ms83.7 · 204 ms
Long generation · 8 clients664.1 · 73 ms638.0 · 75 ms601.6 · 106 ms321.1 · 110 ms342.2 · 489 ms
Long generation · 32 clients1,856.5 · 106 ms1,813.5 · 110 ms1,888.1 · 147 ms787.3 · 260 ms478.5 · 1.4 s
Balanced · 1 client102.6 · 103 ms95.4 · 114 ms77.6 · 132 ms46.1 · 176 ms81.5 · 825 ms
Balanced · 8 clients624.2 · 169 ms616.7 · 150 ms571.6 · 166 ms305.5 · 182 ms91.6 · 2.2 s
Vision document Q&A · 1 client158.9 · 51 ms144.6 · 52 ms90.3 · 123 ms54.6 · 112 ms81.4 · 448 ms
Vision document Q&A · 8 clients657.1 · 119 ms649.5 · 258 ms493.8 · 325 ms357.4 · 201 ms90.6 · 2.9 s

How It Was Run

Machine and class

GPU
RTX PRO 6000 (sm_120, 96 GB, 600 W)
Date
2026-08-03
Class
8-bit weight class + speculative decoding on every engine; fp8-e4m3 KV on paddock/vLLM/SGLang, f16 KV on llama.cpp (its MTP path requires it); equal-length generations, closed-loop, one engine at a time, 40s warmup, same client, 2 measured rounds per scenario, best taken; every other engine upgraded to its newest release the same day
Target
First token ≤ 2.0 s, 50 ms per token after

One engine on the GPU at a time, verified idle in between, ~40 s warmup before the first measurement, same client driving all 5. Speculative decoding is on for every engine at the same draft depth, so no engine is measured without the thing Paddock is using.

Memory reserved

Paddock (FP8)
88.6 GB peak
Paddock (Q8_0)
88.5 GB peak
vLLM (FP8)
83.7 GB peak
SGLang (FP8)
82.7 GB peak
llama.cpp (Q8_0)
90.6 GB peak

Reserved, not consumed: each engine takes the share of the card its own memory setting tells it to.

Configuration

Paddock (FP8)
a43c04d2026-08-03FP8 (official bf16 checkpoint via PADDOCK_FP8_NATIVE) + prefix cache + speculative decoding + fp8 KV, --max-batch 32
Paddock (Q8_0)
a43c04d2026-08-03Q8_0 GGUF default stack (same GGUF file llama.cpp serves) + speculative decoding + fp8 KV, --max-batch 32
vLLM (FP8)
v0.26.0release tag, source build, measured 2026-07-31fp8 online quant + gemma4_mtp k3 spec + fp8 KV, --max-num-seqs 32
SGLang (FP8)
v0.5.16release tag, source build, measured 2026-07-31fp8 + FROZEN_KV_MTP k3 spec + fp8_e4m3 KV, --max-running-requests 32
llama.cpp (Q8_0)
b10206release build, measured 2026-07-31Q8_0 GGUF + MTP (--spec-type draft-mtp n-max 3) + f16 KV + vision + --cache-ram 0, -np 32

Check our numbers

Paddock is a plain OpenAI endpoint, so you can put these numbers to NVIDIA's aiperf on your own hardware, with a tool that is nobody's home advantage.