Qwen3-32B, three configs.
One vLLM server, three configs, the same 24 prompts. Speculative decoding, FP8 KV cache and 16-way concurrency on a single RTX 5090, with determinism checked rather than assumed.
At a glance
Decode throughput by workload
Qwen3-32B-AWQ · vLLM 0.20.0 · RTX 5090 · sequential decode, median tok/s per workload · runs of 2026-07-21
Results by config
| Workload | baseline (tok/s) | FP8 KV cache (tok/s) | n-gram speculation (tok/s) |
|---|---|---|---|
| Code edit | 75.2 | 76.1 | 349.8 |
| Creative | 75.5 | 76.7 | 71.9 |
| RAG | 75.3 | 76.1 | 181 |
| 16-way concurrent, aggregate | 635.9 | 656 |
Methodology
One server, three configs, same everything else. vLLM 0.20.0 serving
Qwen/Qwen3-32B-AWQ (awq_marlin kernels) on a single RTX 5090, with 16K max context,
prefix caching disabled, seed 0. The configs: baseline; baseline + --kv-cache-dtype fp8;
and baseline + n-gram speculative decoding (5 speculative tokens, prompt-lookup window 2 to 4).
The client sends 24 prompts across three workloads (code editing, creative writing, and RAG-style
answering) at temperature 0, seed 0, streaming, thinking disabled, with two unrecorded warmup requests
per run. TTFT is time to first streamed token; decode tok/s is (generated − 1) / decode time; concurrent
numbers are 16-way with each prompt duplicated ×4 (64 requests). vLLM's /metrics is scraped
before and after every run so speculation acceptance and preemptions can be attributed to that run.
Determinism is checked, not assumed: two identical baseline runs produced byte-identical output on all 24 prompts. Against that control, n-gram speculation matched 18/24 (all divergences in creative writing) and FP8 KV matched only 12/24, which is why FP8 KV stays off on my server despite the throughput win.