Speed test matrix
Ornith-1.5-9B-NVFP4 on RTX 3090 24GB
vllm · 0.32.0 · NVFP46 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
- NVFP4
- 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 ornith-ai/Ornith-1.5-9B-NVFP4 --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,7121,221 ms TTFT
16K context6,3362,561 ms TTFT
32K context5,7955,573 ms TTFT
64K context4,91113,119 ms TTFT
128K context3,76234,212 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 | 123.334 ms TTFT | 228.843 ms TTFT | 440.580 ms TTFT | 839.1133 ms TTFT | 1,450.7237 ms TTFT | 2,332.7368 ms TTFT | 2,997.4714 ms TTFT | Over capacity |
| 16K | 118.3114 ms TTFT | 219.4162 ms TTFT | 410.6254 ms TTFT | Looped | 1,126.6813 ms TTFT | 1,541.31,635 ms TTFT | Over capacity | Over capacity |
| 32K | 114.6254 ms TTFT | 211.0308 ms TTFT | 381.8460 ms TTFT | 657.3724 ms TTFT | 893.11,315 ms TTFT | Over capacity | Over capacity | Over capacity |
| 64K | 107.4194 ms TTFT | Looped | 333.2376 ms TTFT | 523.8607 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 128K | 95.1669 ms TTFT | 168.7839 ms TTFT | 264.31,212 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 248K | 78.41,294 ms TTFT | 132.21,720 ms TTFT | 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 | 6,712.0 | — | 1,221 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 6,336.0 | — | 2,561 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 5,795.0 | — | 5,573 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 4,911.0 | — | 13,119 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 3,762.0 | — | 34,212 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 123.3 | 123.5 | 34 ms | 8.1 ms | 1.0 | 0 | 3,699 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 228.8 | 114.6 | 43 ms | 8.7 ms | 2.0 | 0 | 6,864 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 440.5 | 110.5 | 80 ms | 9.1 ms | 4.0 | 0 | 13,212 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 839.1 | 105.5 | 133 ms | 9.5 ms | 8.0 | 0 | 25,168 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 1,450.7 | 91.4 | 237 ms | 10.9 ms | 16.0 | 0 | 43,521 | 30.0 s |
| Sustained decode | 0 | 32 | Valid | 2,332.7 | 73.4 | 368 ms | 13.6 ms | 32.0 | 0 | 69,985 | 30.0 s |
| Sustained decode | 0 | 64 | Valid | 2,997.4 | 47.1 | 714 ms | 21.2 ms | 64.0 | 0 | 89,935 | 30.0 s |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 118.3 | 118.5 | 114 ms | 8.4 ms | 1.0 | 0 | 3,550 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 219.4 | 109.7 | 162 ms | 9.1 ms | 2.0 | 0 | 6,582 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 410.6 | 102.5 | 254 ms | 9.8 ms | 4.0 | 0 | 12,316 | 30.0 s |
| Sustained decode | 16K | 8 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 16K | 16 | Valid | 1,126.6 | 69.5 | 813 ms | 14.4 ms | 16.0 | 0 | 33,792 | 30.0 s |
| Sustained decode | 16K | 32 | Valid | 1,541.3 | 46.8 | 1,635 ms | 21.4 ms | 32.0 | 0 | 46,241 | 30.0 s |
| Sustained decode | 16K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 1 | Valid | 114.6 | 114.7 | 254 ms | 8.7 ms | 1.0 | 0 | 3,439 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 211.0 | 105.4 | 308 ms | 9.5 ms | 2.0 | 0 | 6,328 | 30.0 s |
| Sustained decode | 32K | 4 | Valid | 381.8 | 95.1 | 460 ms | 10.5 ms | 4.0 | 0 | 11,452 | 30.0 s |
| Sustained decode | 32K | 8 | Valid | 657.3 | 81.2 | 724 ms | 12.3 ms | 8.0 | 0 | 19,720 | 30.0 s |
| Sustained decode | 32K | 16 | Valid | 893.1 | 54.3 | 1,315 ms | 18.4 ms | 16.0 | 0 | 26,784 | 30.0 s |
| Sustained decode | 32K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 1 | Valid | 107.4 | 107.5 | 194 ms | 9.3 ms | 1.0 | 0 | 3,222 | 30.0 s |
| Sustained decode | 64K | 2 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 64K | 4 | Valid | 333.2 | 83.4 | 376 ms | 12.0 ms | 4.0 | 0 | 9,996 | 30.0 s |
| Sustained decode | 64K | 8 | Valid | 523.8 | 65.5 | 607 ms | 15.3 ms | 8.0 | 0 | 15,712 | 30.0 s |
| 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 | 95.1 | 95.3 | 669 ms | 10.5 ms | 1.0 | 0 | 2,853 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 168.7 | 84.1 | 839 ms | 11.9 ms | 2.0 | 0 | 5,060 | 30.0 s |
| Sustained decode | 128K | 4 | Valid | 264.3 | 65.2 | 1,212 ms | 15.3 ms | 4.0 | 0 | 7,928 | 30.0 s |
| 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 | 78.4 | 78.6 | 1,294 ms | 12.7 ms | 1.0 | 0 | 2,351 | 30.0 s |
| Sustained decode | 248K | 2 | Valid | 132.2 | 65.7 | 1,720 ms | 15.2 ms | 2.0 | 0 | 3,966 | 30.0 s |
| 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 | — | — | — | — | — | — | — | — |
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.
