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: 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-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
Prefill
prompt tok/s by context length8K context7,1241,150 ms TTFT
16K context6,8192,379 ms TTFT
32K context6,3705,069 ms TTFT
64K context5,64811,406 ms TTFT
128K context4,59128,033 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 | 73.051 ms TTFT | 139.766 ms TTFT | 272.983 ms TTFT | 532.5129 ms TTFT | 957.3240 ms TTFT | 1,561.1381 ms TTFT | Over capacity | Over capacity |
| 16K | 69.8111 ms TTFT | 129.8158 ms TTFT | 249.8247 ms TTFT | 462.9445 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 32K | 67.0111 ms TTFT | 121.2158 ms TTFT | 229.8228 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 64K | 62.1202 ms TTFT | 106.9266 ms TTFT | 197.7396 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 128K | 54.1533 ms TTFT | 86.6633 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 248K | 43.6949 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 | 7,124.0 | — | 1,150 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 6,819.0 | — | 2,379 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 6,370.0 | — | 5,069 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 5,648.0 | — | 11,406 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 4,591.0 | — | 28,033 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 73.0 | 73.1 | 51 ms | 13.7 ms | 1.0 | 0 | 2,190 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 139.7 | 70.0 | 66 ms | 14.3 ms | 2.0 | 0 | 4,194 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 272.9 | 68.4 | 83 ms | 14.6 ms | 4.0 | 0 | 8,188 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 532.5 | 66.8 | 129 ms | 15.0 ms | 8.0 | 0 | 15,976 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 957.3 | 60.2 | 240 ms | 16.6 ms | 16.0 | 0 | 28,721 | 30.0 s |
| Sustained decode | 0 | 32 | Valid | 1,561.1 | 49.2 | 381 ms | 20.3 ms | 32.0 | 0 | 46,816 | 30.0 s |
| Sustained decode | 0 | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 69.8 | 69.8 | 111 ms | 14.3 ms | 1.0 | 0 | 2,093 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 129.8 | 64.9 | 158 ms | 15.4 ms | 2.0 | 0 | 3,894 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 249.8 | 62.4 | 247 ms | 16.0 ms | 4.0 | 0 | 7,493 | 30.0 s |
| Sustained decode | 16K | 8 | Valid | 462.9 | 57.5 | 445 ms | 17.4 ms | 8.0 | 0 | 13,887 | 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 | 67.0 | 67.0 | 111 ms | 14.9 ms | 1.0 | 0 | 2,009 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 121.2 | 60.6 | 158 ms | 16.5 ms | 2.0 | 0 | 3,636 | 30.0 s |
| Sustained decode | 32K | 4 | Valid | 229.8 | 57.5 | 228 ms | 17.4 ms | 4.0 | 0 | 6,895 | 30.0 s |
| Sustained decode | 32K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| 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 | 62.1 | 62.1 | 202 ms | 16.1 ms | 1.0 | 0 | 1,862 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 106.9 | 53.5 | 266 ms | 18.7 ms | 2.0 | 0 | 3,206 | 30.0 s |
| Sustained decode | 64K | 4 | Valid | 197.7 | 49.4 | 396 ms | 20.2 ms | 4.0 | 0 | 5,928 | 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 | 54.1 | 54.3 | 533 ms | 18.4 ms | 1.0 | 0 | 1,622 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 86.6 | 43.3 | 633 ms | 23.1 ms | 2.0 | 0 | 2,596 | 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 | 43.6 | 43.7 | 949 ms | 22.9 ms | 1.0 | 0 | 1,307 | 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.
