Speed test matrix
Qwen3.5-4B-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: none # 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-4B-FP8-dynamic --max-model-len 262144 --gpu-memory-utilization 0.94 --max-num-seqs 128 --enable-prefix-caching --trust-remote-code --language-model-only
Prefill
prompt tok/s by context length8K context11.8K694 ms TTFT
16K context11K1,479 ms TTFT
32K context9,9303,252 ms TTFT
64K context8,2647,795 ms TTFT
128K context6,19320,780 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 | 119.535 ms TTFT | 229.745 ms TTFT | 441.265 ms TTFT | 805.498 ms TTFT | 1,406.3170 ms TTFT | 2,186.7247 ms TTFT | Over capacity | Over capacity |
| 16K | 111.389 ms TTFT | 204.6129 ms TTFT | 385.2184 ms TTFT | 663.3330 ms TTFT | 1,013.5601 ms TTFT | Over capacity | Over capacity | Over capacity |
| 32K | 104.5120 ms TTFT | 184.0140 ms TTFT | 340.7205 ms TTFT | 549.9345 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 64K | 92.9205 ms TTFT | 153.1256 ms TTFT | 274.4374 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 128K | 76.2542 ms TTFT | 114.5597 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 248K | 56.8907 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 | 11.8K | — | 694 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 11K | — | 1,479 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 9,930.0 | — | 3,252 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 8,264.0 | — | 7,795 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 6,193.0 | — | 20,780 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 119.5 | 119.7 | 35 ms | 8.4 ms | 1.0 | 0 | 3,584 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 229.7 | 115.2 | 45 ms | 8.7 ms | 2.0 | 0 | 6,891 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 441.2 | 110.9 | 65 ms | 9.0 ms | 4.0 | 0 | 13,232 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 805.4 | 101.6 | 98 ms | 9.8 ms | 8.0 | 0 | 24,160 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 1,406.3 | 89.2 | 170 ms | 11.2 ms | 16.0 | 0 | 42,192 | 30.0 s |
| Sustained decode | 0 | 32 | Valid | 2,186.7 | 69.5 | 247 ms | 14.4 ms | 32.0 | 0 | 65,632 | 30.0 s |
| Sustained decode | 0 | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 111.3 | 111.4 | 89 ms | 9.0 ms | 1.0 | 0 | 3,338 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 204.6 | 102.4 | 129 ms | 9.8 ms | 2.0 | 0 | 6,136 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 385.2 | 96.4 | 184 ms | 10.4 ms | 4.0 | 0 | 11,556 | 30.0 s |
| Sustained decode | 16K | 8 | Valid | 663.3 | 82.7 | 330 ms | 12.1 ms | 8.0 | 0 | 19,896 | 30.0 s |
| Sustained decode | 16K | 16 | Valid | 1,013.5 | 62.8 | 601 ms | 15.9 ms | 16.0 | 0 | 30,400 | 30.0 s |
| Sustained decode | 16K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 1 | Valid | 104.5 | 104.6 | 120 ms | 9.6 ms | 1.0 | 0 | 3,133 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 184.0 | 92.1 | 140 ms | 10.9 ms | 2.0 | 0 | 5,518 | 30.0 s |
| Sustained decode | 32K | 4 | Valid | 340.7 | 85.3 | 205 ms | 11.7 ms | 4.0 | 0 | 10,220 | 30.0 s |
| Sustained decode | 32K | 8 | Valid | 549.9 | 68.7 | 345 ms | 14.6 ms | 8.0 | 0 | 16,496 | 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 | 92.9 | 93.1 | 205 ms | 10.7 ms | 1.0 | 0 | 2,788 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 153.1 | 76.6 | 256 ms | 13.0 ms | 2.0 | 0 | 4,594 | 30.0 s |
| Sustained decode | 64K | 4 | Valid | 274.4 | 68.6 | 374 ms | 14.6 ms | 4.0 | 0 | 8,232 | 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 | 76.2 | 76.4 | 542 ms | 13.1 ms | 1.0 | 0 | 2,285 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 114.5 | 57.3 | 597 ms | 17.5 ms | 2.0 | 0 | 3,434 | 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 | 56.8 | 57.1 | 907 ms | 17.5 ms | 1.0 | 0 | 1,705 | 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.
