Speed test matrix
Qwen3.5-9B-FP8-dynamic on RTX 3090 24GB
vllm · 0.32.0 · FP8 dynamic6 contexts (0–248K) × 8 concurrency levels (1–128) · prefill at 8K, 16K, 32K, 64K, 128K
Hardware
- Type
- Discrete GPU
- GPU
- RTX 3090
- VRAM
- 24 GB
- CPU
- Intel Core i7-9700K (8C)
- RAM
- 32 GB
- OS
- Ubuntu 24.04.5
Engine
- Engine
- vllm
- Version
- 0.32.0
- Quantization
- FP8 dynamic
- Backend
- cuda
- Repository
- github.com/vllm-project/vllm
- Build
- vllm/vllm-openai:v0.32.0-x86_64
Run
- Served model
- bench
- Revision
- main
- Benchmark tool
- llm-inference-bench v0.8.0
- Decode test
- Fixed duration
- Prefill mode
- Measured during decode warm-up
- Time per measurement
- 30 s
- Max output
- 8,192 tokens
Launch command
# Untuned out-of-the-box baseline. Spec decode: MTP, 2 tokens lookahead. KV cache: fp8
# 1x RTX 3090 24GB (Zagitta/gpu-unlock), 420 W limit, PCIe Gen3 x16 | Intel Core i7-9700K 8C | 32 GB DDR4 | Ubuntu 24.04.5, NVIDIA driver 580.178.04
vllm serve RedHatAI/Qwen3.5-9B-FP8-dynamic --max-model-len 262144 --gpu-memory-utilization 0.94 --max-num-seqs 128 --enable-prefix-caching --trust-remote-code --language-model-only --speculative-config {"method":"mtp","num_speculative_tokens":2} --kv-cache-dtype fp8Prefill
prompt tok/s by context length8K context6,4181,276 ms TTFT
16K context5,9252,738 ms TTFT
32K context5,3636,021 ms TTFT
64K context4,53114,217 ms TTFT
128K context3,44137,397 ms TTFT
Sustained decode
total tok/s · rows are context length, columns are simultaneous requests| Context | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
|---|---|---|---|---|---|---|---|---|
| 0 | 96.165 ms TTFT | 191.671 ms TTFT | 365.9125 ms TTFT | 675.1180 ms TTFT | 1,185.6294 ms TTFT | 1,848.4444 ms TTFT | Over capacity | Over capacity |
| 16K | 100.3270 ms TTFT | 197.3481 ms TTFT | 375.3805 ms TTFT | 668.61,254 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 32K | 95.2359 ms TTFT | 194.2628 ms TTFT | 360.9981 ms TTFT | 612.41,531 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 64K | 94.3505 ms TTFT | 185.9829 ms TTFT | 341.81,336 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 128K | 85.2847 ms TTFT | 172.51,288 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 248K | 75.91,629 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
Over capacity: not run because this many requests at this context would exceed the server's KV cache.
TTFT is measured after the benchmark warms the server's prompt cache, so it mostly excludes prefill.
All measurements
Latencies are medians. Total tok/s is output across all simultaneous requests.| Phase | Context | Requests at once | Status | Total tok/s | Per request tok/s | TTFT | Time between tokens | Average active requests | Completed requests | Output tokens | Measured for |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Prefill | 8K | 1 | Valid | 6,418.0 | — | 1,276 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 5,925.0 | — | 2,738 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 5,363.0 | — | 6,021 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 4,531.0 | — | 14,217 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 3,441.0 | — | 37,397 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 96.1 | 97.6 | 65 ms | 10.2 ms | 1.0 | 0 | 2,882 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 191.6 | 96.9 | 71 ms | 10.3 ms | 2.0 | 0 | 5,746 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 365.9 | 92.5 | 125 ms | 10.8 ms | 4.0 | 0 | 10,977 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 675.1 | 86.0 | 180 ms | 11.6 ms | 8.0 | 0 | 20,246 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 1,185.6 | 75.4 | 294 ms | 13.3 ms | 16.0 | 0 | 35,550 | 30.0 s |
| Sustained decode | 0 | 32 | Valid | 1,848.4 | 58.5 | 444 ms | 17.1 ms | 32.0 | 0 | 55,276 | 29.9 s |
| Sustained decode | 0 | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 100.3 | 100.8 | 270 ms | 9.9 ms | 1.0 | 0 | 3,007 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 197.3 | 99.8 | 481 ms | 10.0 ms | 2.0 | 0 | 5,919 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 375.3 | 94.7 | 805 ms | 10.6 ms | 4.0 | 0 | 11,258 | 30.0 s |
| Sustained decode | 16K | 8 | Valid | 668.6 | 82.3 | 1,254 ms | 12.2 ms | 8.0 | 0 | 20,054 | 30.0 s |
| Sustained decode | 16K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 1 | Valid | 95.2 | 96.5 | 359 ms | 10.4 ms | 1.0 | 0 | 2,855 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 194.2 | 98.6 | 628 ms | 10.1 ms | 2.0 | 0 | 5,825 | 30.0 s |
| Sustained decode | 32K | 4 | Valid | 360.9 | 91.0 | 981 ms | 11.0 ms | 4.0 | 0 | 10,820 | 30.0 s |
| Sustained decode | 32K | 8 | Valid | 612.4 | 76.1 | 1,531 ms | 13.1 ms | 8.0 | 0 | 18,367 | 30.0 s |
| Sustained decode | 32K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 1 | Valid | 94.3 | 95.1 | 505 ms | 10.5 ms | 1.0 | 0 | 2,826 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 185.9 | 94.7 | 829 ms | 10.6 ms | 2.0 | 0 | 5,576 | 30.0 s |
| Sustained decode | 64K | 4 | Valid | 341.8 | 86.5 | 1,336 ms | 11.6 ms | 4.0 | 0 | 10,252 | 30.0 s |
| Sustained decode | 64K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 128K | 1 | Valid | 85.2 | 85.4 | 847 ms | 11.7 ms | 1.0 | 0 | 2,553 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 172.5 | 87.6 | 1,288 ms | 11.4 ms | 2.0 | 0 | 5,171 | 30.0 s |
| Sustained decode | 128K | 4 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 128K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 128K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 128K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 128K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 128K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 248K | 1 | Valid | 75.9 | 77.0 | 1,629 ms | 13.0 ms | 1.0 | 0 | 2,275 | 30.0 s |
| Sustained decode | 248K | 2 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 248K | 4 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 248K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 248K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 248K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 248K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 248K | 128 | Over capacity | — | — | — | — | — | — | — | — |
Over capacity: not run because this many requests at this context would exceed the server's KV cache.
