Speed test matrix
Llama-3.2-3B-Instruct-FP8-dynamic on RTX 3090 24GB
vllm · 0.32.0 · FP8 dynamic5 contexts (0–120K) × 8 concurrency levels (1–128) · prefill at 8K, 16K, 32K, 64K, 120K
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/Llama-3.2-3B-Instruct-FP8-dynamic --max-model-len 131072 --gpu-memory-utilization 0.94 --max-num-seqs 128 --enable-prefix-caching --trust-remote-code
Prefill
prompt tok/s by context length8K context13.1K628 ms TTFT
16K context10.9K1,492 ms TTFT
32K context8,1513,985 ms TTFT
64K context5,36512,075 ms TTFT
120K context3,32436,493 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 | 168.016 ms TTFT | 311.118 ms TTFT | Looped | 933.623 ms TTFT | 1,494.448 ms TTFT | Over capacity | Over capacity | Over capacity |
| 16K | 125.447 ms TTFT | 199.360 ms TTFT | 325.088 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 32K | 99.781 ms TTFT | 144.5101 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 64K | 70.4153 ms TTFT | 92.8209 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 120K | 46.3291 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
Looped: the model kept repeating the same text, so the benchmark discarded this measurement. 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 | 13.1K | — | 628 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 10.9K | — | 1,492 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 8,151.0 | — | 3,985 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 5,365.0 | — | 12,075 ms | — | — | 1 | — | — |
| Prefill | 120K | 1 | Valid | 3,324.0 | — | 36,493 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 168.0 | 170.5 | 16 ms | 5.9 ms | 1.0 | 0 | 5,038 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 311.1 | 159.2 | 18 ms | 6.3 ms | 2.0 | 0 | 9,332 | 30.0 s |
| Sustained decode | 0 | 4 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 0 | 8 | Valid | 933.6 | 123.7 | 23 ms | 8.1 ms | 8.0 | 0 | 28,008 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 1,494.4 | 101.6 | 48 ms | 9.8 ms | 16.0 | 0 | 44,833 | 30.0 s |
| Sustained decode | 0 | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 125.4 | 125.8 | 47 ms | 7.9 ms | 1.0 | 0 | 3,760 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 199.3 | 100.1 | 60 ms | 10.0 ms | 2.0 | 0 | 5,978 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 325.0 | 81.9 | 88 ms | 12.2 ms | 4.0 | 0 | 9,748 | 30.0 s |
| Sustained decode | 16K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| 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 | 99.7 | 100.1 | 81 ms | 10.0 ms | 1.0 | 0 | 2,992 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 144.5 | 72.4 | 101 ms | 13.8 ms | 2.0 | 0 | 4,334 | 30.0 s |
| Sustained decode | 32K | 4 | Over capacity | — | — | — | — | — | — | — | — |
| 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 | 70.4 | 70.5 | 153 ms | 14.2 ms | 1.0 | 0 | 2,111 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 92.8 | 46.5 | 209 ms | 21.5 ms | 2.0 | 0 | 2,785 | 30.0 s |
| Sustained decode | 64K | 4 | Over capacity | — | — | — | — | — | — | — | — |
| 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 | 120K | 1 | Valid | 46.3 | 46.3 | 291 ms | 21.6 ms | 1.0 | 0 | 1,388 | 30.0 s |
| Sustained decode | 120K | 2 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 120K | 4 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 120K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 120K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 120K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 120K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 120K | 128 | Over capacity | — | — | — | — | — | — | — | — |
Looped: the model kept repeating the same text, so the benchmark discarded this measurement. Over capacity: not run because this many requests at this context would exceed the server's KV cache.
