Speed test matrix
gemma-4-12B-it on RTX PRO 6000 Blackwell Server Edition 96GB
vllm · 0.30.1rc1.dev452+g73a583112 · BF166 contexts (8K–251K) × 8 concurrency levels (1–128) · prefill at 8K, 16K, 32K, 64K, 128K, 251K, 256K
Hardware
- Type
- Discrete GPU
- GPU
- RTX PRO 6000 Blackwell Server Edition
- VRAM
- 96 GB
- OS
- linux
Engine
- Engine
- vllm
- Version
- 0.30.1rc1.dev452+g73a583112
- Quantization
- BF16
- Backend
- cuda
- Repository
- github.com/vllm-project/vllm
- Build
- cuda-13.2
- Commit
73a5831127a9
Run
- Served model
- gemma
- Revision
- main
- Benchmark tool
- llm-inference-bench v0.7.6
- Decode test
- Fixed duration
- Prefill mode
- Measured during decode warm-up
- Time per measurement
- 30 s
- Max output
- 4,096 tokens
Launch command
env MAX_JOBS=2 FLASHINFER_NVCC_THREADS=1 TORCHINDUCTOR_COMPILE_THREADS=1 "$HOME/env_rtxpro6k-redhatai-vllm-73a5831127a9d2b8/bin/vllm" serve RedHatAI/gemma-4-12B-it --served-model-name gemma --trust-remote-code --tensor-parallel-size 1 --reasoning-parser gemma4 --enable-auto-tool-choice --tool-call-parser gemma4 --max-model-len 262144 --gpu-memory-utilization 0.83 --host 0.0.0.0 --port 8000 --api-key <redacted> --async-scheduling
Prefill
prompt tok/s by context length8K context11K748 ms TTFT
16K context9,8471,651 ms TTFT
32K context7,7634,170 ms TTFT
64K context5,41411,925 ms TTFT
128K context3,36738,305 ms TTFT
251K context1,936130,575 ms TTFT
256K context1,904135,422 ms TTFT
Sustained decode
total tok/s · rows are context length, columns are simultaneous requests| Context | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
|---|---|---|---|---|---|---|---|---|
| 8K | 51.058 ms TTFT | Looped | Looped | 386.4136 ms TTFT | Looped | Looped | Looped | Over capacity |
| 16K | 48.674 ms TTFT | Looped | Looped | Looped | Looped | Looped | 1,570.4949 ms TTFT | Over capacity |
| 32K | 45.8118 ms TTFT | 91.4168 ms TTFT | Looped | Looped | Looped | Looped | Over capacity | Over capacity |
| 64K | 42.4212 ms TTFT | 84.7296 ms TTFT | Looped | Looped | Looped | Over capacity | Over capacity | Over capacity |
| 128K | 37.0470 ms TTFT | 74.0640 ms TTFT | 147.5930 ms TTFT | Looped | Over capacity | Over capacity | Over capacity | Over capacity |
| 251K | 29.71,065 ms TTFT | 59.41,439 ms TTFT | Looped | 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 | 11K | — | 748 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 9,847.0 | — | 1,651 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 7,763.0 | — | 4,170 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 5,414.0 | — | 11,925 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 3,367.0 | — | 38,305 ms | — | — | 1 | — | — |
| Prefill | 251K | 1 | Valid | 1,936.0 | — | 130,575 ms | — | — | 1 | — | — |
| Prefill | 256K | 1 | Valid | 1,904.0 | — | 135,422 ms | — | — | 1 | — | — |
| Sustained decode | 8K | 1 | Valid | 51.0 | 51.0 | 58 ms | 19.6 ms | 1.0 | 0 | 1,528 | 30.0 s |
| Sustained decode | 8K | 2 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 8K | 4 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 8K | 8 | Valid | 386.4 | 48.5 | 136 ms | 20.6 ms | 8.0 | 0 | 11,600 | 30.0 s |
| Sustained decode | 8K | 16 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 8K | 32 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 8K | 64 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 8K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 48.6 | 48.6 | 74 ms | 20.6 ms | 1.0 | 0 | 1,458 | 30.0 s |
| Sustained decode | 16K | 2 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 16K | 4 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 16K | 8 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 16K | 16 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 16K | 32 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 16K | 64 | Valid | 1,570.4 | 24.9 | 949 ms | 40.2 ms | 64.0 | 0 | 47,302 | 30.1 s |
| Sustained decode | 16K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 1 | Valid | 45.8 | 45.8 | 118 ms | 21.8 ms | 1.0 | 0 | 1,373 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 91.4 | 45.7 | 168 ms | 21.9 ms | 2.0 | 0 | 2,740 | 30.0 s |
| Sustained decode | 32K | 4 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 32K | 8 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 32K | 16 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 32K | 32 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 32K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 1 | Valid | 42.4 | 42.4 | 212 ms | 23.6 ms | 1.0 | 0 | 1,272 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 84.7 | 42.4 | 296 ms | 23.6 ms | 2.0 | 0 | 2,540 | 30.0 s |
| Sustained decode | 64K | 4 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 64K | 8 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 64K | 16 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 64K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 64K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 128K | 1 | Valid | 37.0 | 37.0 | 470 ms | 27.0 ms | 1.0 | 0 | 1,109 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 74.0 | 37.0 | 640 ms | 27.0 ms | 2.0 | 0 | 2,218 | 30.0 s |
| Sustained decode | 128K | 4 | Valid | 147.5 | 36.8 | 930 ms | 27.1 ms | 4.0 | 0 | 4,426 | 30.0 s |
| Sustained decode | 128K | 8 | Looped | — | — | — | — | — | 0 | 0 | — |
| 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 | 251K | 1 | Valid | 29.7 | 29.8 | 1,065 ms | 33.5 ms | 1.0 | 0 | 891 | 30.0 s |
| Sustained decode | 251K | 2 | Valid | 59.4 | 29.8 | 1,439 ms | 33.6 ms | 2.0 | 0 | 1,782 | 30.0 s |
| Sustained decode | 251K | 4 | Looped | — | — | — | — | — | 0 | 0 | — |
| Sustained decode | 251K | 8 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 251K | 16 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 251K | 32 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 251K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 251K | 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.
