Speed test matrix
TwIL-8B on RTX 3090 24GB
vllm · 0.32.0 · BF165 contexts (0–96K) × 8 concurrency levels (1–128) · prefill at 8K, 16K, 32K, 64K, 96K
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
- BF16
- Backend
- cuda
- Repository
- github.com/vllm-project/vllm
- Build
- vllm/vllm-openai:v0.32.0-x86_64
Run
- Served model
- bench
- Revision
- 58d49f0d9909e62f9c2fb09e99fc5c76f3f2d630
- 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. KV cache: int4_per_token_head # 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 webAI-Official/TwIL-8B --revision 58d49f0d9909e62f9c2fb09e99fc5c76f3f2d630 --max-model-len 106496 --gpu-memory-utilization 0.94 --max-num-seqs 128 --enable-prefix-caching --trust-remote-code --kv-cache-dtype int4_per_token_head --attention-backend TRITON_ATTN
Prefill
prompt tok/s by context length8K context3,2342,535 ms TTFT
16K context2,1987,374 ms TTFT
32K context1,36023,729 ms TTFT
64K context782.082,341 ms TTFT
96K context545.0177,125 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 | 43.836 ms TTFT | 83.849 ms TTFT | 162.555 ms TTFT | 311.159 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 16K | 34.798 ms TTFT | 63.4145 ms TTFT | 101.3232 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 32K | 28.9167 ms TTFT | 50.9245 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 64K | 21.7301 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 96K | 17.3Requests queued449 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
Requests queued: the server could not run all requests at once, so some waited in a queue. 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 | 3,234.0 | — | 2,535 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 2,198.0 | — | 7,374 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 1,360.0 | — | 23,729 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 782.0 | — | 82,341 ms | — | — | 1 | — | — |
| Prefill | 96K | 1 | Valid | 545.0 | — | 177,125 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 43.8 | 43.9 | 36 ms | 22.8 ms | 1.0 | 0 | 1,315 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 83.8 | 42.0 | 49 ms | 23.8 ms | 2.0 | 0 | 2,512 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 162.5 | 40.8 | 55 ms | 24.5 ms | 4.0 | 0 | 4,876 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 311.1 | 39.2 | 59 ms | 25.5 ms | 8.0 | 0 | 9,328 | 30.0 s |
| Sustained decode | 0 | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 34.7 | 34.8 | 98 ms | 28.8 ms | 1.0 | 0 | 1,042 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 63.4 | 31.7 | 145 ms | 31.5 ms | 2.0 | 0 | 1,902 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 101.3 | 25.4 | 232 ms | 39.4 ms | 4.0 | 0 | 3,036 | 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 | 28.9 | 28.9 | 167 ms | 34.6 ms | 1.0 | 0 | 868 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 50.9 | 25.5 | 245 ms | 39.3 ms | 2.0 | 0 | 1,528 | 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 | 21.7 | 21.7 | 301 ms | 46.2 ms | 1.0 | 0 | 649 | 30.0 s |
| Sustained decode | 64K | 2 | Over capacity | — | — | — | — | — | — | — | — |
| 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 | 96K | 1 | Requests queued | 17.3 | 17.3 | 449 ms | 57.9 ms | 1.0 | 0 | 517 | 30.0 s |
| Sustained decode | 96K | 2 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 96K | 4 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 96K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 96K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 96K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 96K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 96K | 128 | Over capacity | — | — | — | — | — | — | — | — |
Requests queued: the server could not run all requests at once, so some waited in a queue. Over capacity: not run because this many requests at this context would exceed the server's KV cache.
