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
- AMD Ryzen 9 7900X (12C)
- 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), 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 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 context10.7K762 ms TTFT
16K context10.1K1,605 ms TTFT
32K context9,0183,580 ms TTFT
64K context7,4928,598 ms TTFT
128K context5,55923,148 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 | 117.222 ms TTFT | 225.842 ms TTFT | 433.451 ms TTFT | 792.391 ms TTFT | 1,388.0142 ms TTFT | 2,152.1217 ms TTFT | Over capacity | Over capacity |
| 16K | 109.078 ms TTFT | 201.3110 ms TTFT | 375.3177 ms TTFT | 636.1306 ms TTFT | 957.9610 ms TTFT | Over capacity | Over capacity | Over capacity |
| 32K | 102.476 ms TTFT | 180.898 ms TTFT | 328.0143 ms TTFT | 518.6236 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 64K | 91.3111 ms TTFT | 150.7154 ms TTFT | 259.8241 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 128K | 75.0354 ms TTFT | 113.2434 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 248K | 56.2712 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 | 10.7K | — | 762 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 10.1K | — | 1,605 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 9,018.0 | — | 3,580 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 7,492.0 | — | 8,598 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 5,559.0 | — | 23,148 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 117.2 | 117.5 | 22 ms | 8.5 ms | 1.0 | 0 | 3,517 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 225.8 | 113.3 | 42 ms | 8.8 ms | 2.0 | 0 | 6,774 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 433.4 | 109.0 | 51 ms | 9.2 ms | 4.0 | 0 | 13,001 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 792.3 | 99.9 | 91 ms | 10.0 ms | 8.0 | 0 | 23,768 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 1,388.0 | 88.0 | 142 ms | 11.4 ms | 16.0 | 0 | 41,632 | 30.0 s |
| Sustained decode | 0 | 32 | Valid | 2,152.1 | 68.3 | 217 ms | 14.6 ms | 32.0 | 0 | 64,544 | 30.0 s |
| Sustained decode | 0 | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 109.0 | 109.1 | 78 ms | 9.2 ms | 1.0 | 0 | 3,269 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 201.3 | 100.7 | 110 ms | 9.9 ms | 2.0 | 0 | 6,038 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 375.3 | 93.9 | 177 ms | 10.6 ms | 4.0 | 0 | 11,260 | 30.0 s |
| Sustained decode | 16K | 8 | Valid | 636.1 | 79.3 | 306 ms | 12.6 ms | 8.0 | 0 | 19,080 | 30.0 s |
| Sustained decode | 16K | 16 | Valid | 957.9 | 59.3 | 610 ms | 16.9 ms | 16.0 | 0 | 28,736 | 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 | 102.4 | 102.5 | 76 ms | 9.8 ms | 1.0 | 0 | 3,072 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 180.8 | 90.5 | 98 ms | 11.0 ms | 2.0 | 0 | 5,424 | 30.0 s |
| Sustained decode | 32K | 4 | Valid | 328.0 | 82.1 | 143 ms | 12.2 ms | 4.0 | 0 | 9,836 | 30.0 s |
| Sustained decode | 32K | 8 | Valid | 518.6 | 64.8 | 236 ms | 15.4 ms | 8.0 | 0 | 15,552 | 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 | 91.3 | 91.4 | 111 ms | 10.9 ms | 1.0 | 0 | 2,739 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 150.7 | 75.4 | 154 ms | 13.3 ms | 2.0 | 0 | 4,522 | 30.0 s |
| Sustained decode | 64K | 4 | Valid | 259.8 | 65.1 | 241 ms | 15.4 ms | 4.0 | 0 | 7,792 | 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 | 75.0 | 75.1 | 354 ms | 13.3 ms | 1.0 | 0 | 2,250 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 113.2 | 56.5 | 434 ms | 17.7 ms | 2.0 | 0 | 3,394 | 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.2 | 56.3 | 712 ms | 17.8 ms | 1.0 | 0 | 1,685 | 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.
