Speed test matrix
Qwen3.5-9B-AWQ-4bit on RTX 3090 24GB
vllm · 0.32.0 · W4A16 g326 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
- AMD Ryzen 9 7900X (12C)
- RAM
- 32 GB
- OS
- Ubuntu 24.04.5
Engine
- Engine
- vllm
- Version
- 0.32.0
- Quantization
- W4A16 g32
- 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), 350 W limit (VBIOS max), PCIe Gen4 x16 | AMD Ryzen 9 7900X 12C | 32 GB DDR5 | Ubuntu 24.04.5, NVIDIA driver 595.99.02 vllm serve cyankiwi/Qwen3.5-9B-AWQ-4bit --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 context6,2661,307 ms TTFT
16K context6,0672,674 ms TTFT
32K context5,6505,715 ms TTFT
64K context4,98712,917 ms TTFT
128K context4,04231,838 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 | 114.630 ms TTFT | 212.551 ms TTFT | 408.573 ms TTFT | 786.5133 ms TTFT | 1,335.5219 ms TTFT | 2,087.6355 ms TTFT | Over capacity | Over capacity |
| 16K | 106.8102 ms TTFT | 190.3147 ms TTFT | 355.8237 ms TTFT | 628.7418 ms TTFT | 921.1832 ms TTFT | Over capacity | Over capacity | Over capacity |
| 32K | 100.585 ms TTFT | 172.0105 ms TTFT | 312.5163 ms TTFT | 512.6276 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 64K | 89.8138 ms TTFT | 144.5166 ms TTFT | 249.5267 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 128K | 74.1385 ms TTFT | 109.6474 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 248K | 55.6711 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,266.0 | — | 1,307 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 6,067.0 | — | 2,674 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 5,650.0 | — | 5,715 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 4,987.0 | — | 12,917 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 4,042.0 | — | 31,838 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 114.6 | 114.9 | 30 ms | 8.7 ms | 1.0 | 0 | 3,439 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 212.5 | 106.6 | 51 ms | 9.4 ms | 2.0 | 0 | 6,372 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 408.5 | 102.6 | 73 ms | 9.7 ms | 4.0 | 0 | 12,252 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 786.5 | 99.1 | 133 ms | 10.1 ms | 8.0 | 0 | 23,592 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 1,335.5 | 84.5 | 219 ms | 11.8 ms | 16.0 | 0 | 40,064 | 30.0 s |
| Sustained decode | 0 | 32 | Valid | 2,087.6 | 66.1 | 355 ms | 15.1 ms | 32.0 | 0 | 62,624 | 30.0 s |
| Sustained decode | 0 | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 106.8 | 107.0 | 102 ms | 9.3 ms | 1.0 | 0 | 3,205 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 190.3 | 95.2 | 147 ms | 10.5 ms | 2.0 | 0 | 5,710 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 355.8 | 88.9 | 237 ms | 11.2 ms | 4.0 | 0 | 10,672 | 30.0 s |
| Sustained decode | 16K | 8 | Valid | 628.7 | 78.2 | 418 ms | 12.8 ms | 8.0 | 0 | 18,856 | 30.0 s |
| Sustained decode | 16K | 16 | Valid | 921.1 | 56.7 | 832 ms | 17.6 ms | 16.0 | 0 | 27,632 | 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 | 100.5 | 100.6 | 85 ms | 9.9 ms | 1.0 | 0 | 3,015 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 172.0 | 86.0 | 105 ms | 11.6 ms | 2.0 | 0 | 5,158 | 30.0 s |
| Sustained decode | 32K | 4 | Valid | 312.5 | 78.2 | 163 ms | 12.8 ms | 4.0 | 0 | 9,372 | 30.0 s |
| Sustained decode | 32K | 8 | Valid | 512.6 | 64.0 | 276 ms | 15.6 ms | 8.0 | 0 | 15,376 | 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 | 89.8 | 89.9 | 138 ms | 11.1 ms | 1.0 | 0 | 2,695 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 144.5 | 72.3 | 166 ms | 13.8 ms | 2.0 | 0 | 4,334 | 30.0 s |
| Sustained decode | 64K | 4 | Valid | 249.5 | 62.4 | 267 ms | 16.0 ms | 4.0 | 0 | 7,480 | 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 | 74.1 | 74.1 | 385 ms | 13.5 ms | 1.0 | 0 | 2,221 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 109.6 | 54.7 | 474 ms | 18.3 ms | 2.0 | 0 | 3,286 | 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 | 55.6 | 55.7 | 711 ms | 17.9 ms | 1.0 | 0 | 1,669 | 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.
