Speed test matrix
Qwen3.5-122B-A10B-GPTQ-Int4 on CMP 170HX 64GB ×2
vllm · 0.32.0rc1.dev249+g18305948a · GPTQ Int46 contexts (0–248K) × 8 concurrency levels (1–128) · prefill at 8K, 16K, 32K, 64K, 128K
Hardware
- Type
- Discrete GPU
- GPU
- CMP 170HX
- GPU count
- 2
- VRAM
- 64 GB (2 × 32 GB)
- CPU
- 2x Intel Xeon E5-2630 v3
- RAM
- 64 GB
- OS
- Ubuntu 26.04.1
Engine
- Engine
- vllm
- Version
- 0.32.0rc1.dev249+g18305948a
- Quantization
- GPTQ Int4
- Backend
- cuda
- Repository
- github.com/vllm-project/vllm
- Build
- ghcr.io/morrowmake/vllm-cmp170hx@sha256:5b45c4d6feafefe2eba962375b0a9a0b64fd22b9e05abb4d1966f14a32a2db79
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: MTP, 2 tokens lookahead. Layout: PP2 (stock vLLM flag)
# 2x NVIDIA CMP 170HX 64GB (cmpunlocker), 180 W limit, PCIe Gen2 x4 | 2x Intel Xeon E5-2630 v3 | 64 GB DDR4 | Ubuntu 26.04.1, NVIDIA driver 610.57.04 | vLLM: Morrowmake vllm-cmp170hx image
vllm serve Qwen/Qwen3.5-122B-A10B-GPTQ-Int4 --max-model-len 262144 --gpu-memory-utilization 0.94 --max-num-seqs 128 --enable-prefix-caching --trust-remote-code --pipeline-parallel-size 2 --language-model-only --speculative-config {"method":"mtp","num_speculative_tokens":2}Prefill
prompt tok/s by context length8K context5,4761,487 ms TTFT
16K context5,5492,904 ms TTFT
32K context5,1926,180 ms TTFT
64K context4,38714,594 ms TTFT
128K context3,26439,179 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 | 116.7137 ms TTFT | 196.7184 ms TTFT | 307.9249 ms TTFT | 464.2362 ms TTFT | 676.0526 ms TTFT | 971.9773 ms TTFT | 1,006.6Requests queued876 ms TTFT | Over capacity |
| 16K | 80.0964 ms TTFT | 130.51,353 ms TTFT | 197.02,319 ms TTFT | 323.53,646 ms TTFT | 416.16,162 ms TTFT | 510.511,507 ms TTFT | Over capacity | Over capacity |
| 32K | 62.21,122 ms TTFT | 102.71,569 ms TTFT | 183.32,800 ms TTFT | 236.53,885 ms TTFT | 282.66,348 ms TTFT | Over capacity | Over capacity | Over capacity |
| 64K | 40.51,699 ms TTFT | 72.02,285 ms TTFT | 128.44,024 ms TTFT | 128.85,766 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity |
| 128K | 26.23,028 ms TTFT | 47.03,978 ms TTFT | 52.66,521 ms TTFT | Over capacity | Over capacity | Over capacity | Over capacity | Over capacity |
| 248K | 14.94,758 ms TTFT | 26.76,508 ms TTFT | 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 | 5,476.0 | — | 1,487 ms | — | — | 1 | — | — |
| Prefill | 16K | 1 | Valid | 5,549.0 | — | 2,904 ms | — | — | 1 | — | — |
| Prefill | 32K | 1 | Valid | 5,192.0 | — | 6,180 ms | — | — | 1 | — | — |
| Prefill | 64K | 1 | Valid | 4,387.0 | — | 14,594 ms | — | — | 1 | — | — |
| Prefill | 128K | 1 | Valid | 3,264.0 | — | 39,179 ms | — | — | 1 | — | — |
| Sustained decode | 0 | 1 | Valid | 116.7 | 117.7 | 137 ms | 8.5 ms | 1.0 | 0 | 3,502 | 30.0 s |
| Sustained decode | 0 | 2 | Valid | 196.7 | 98.4 | 184 ms | 10.2 ms | 2.0 | 0 | 5,899 | 30.0 s |
| Sustained decode | 0 | 4 | Valid | 307.9 | 77.1 | 249 ms | 13.0 ms | 4.0 | 0 | 9,235 | 30.0 s |
| Sustained decode | 0 | 8 | Valid | 464.2 | 59.1 | 362 ms | 16.9 ms | 8.0 | 0 | 13,927 | 30.0 s |
| Sustained decode | 0 | 16 | Valid | 676.0 | 43.7 | 526 ms | 22.9 ms | 16.0 | 0 | 20,281 | 30.0 s |
| Sustained decode | 0 | 32 | Valid | 971.9 | 31.6 | 773 ms | 31.6 ms | 32.0 | 0 | 29,166 | 30.0 s |
| Sustained decode | 0 | 64 | Requests queued | 1,006.6 | 23.0 | 876 ms | 43.5 ms | 52.5 | 0 | 30,193 | 30.0 s |
| Sustained decode | 0 | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 1 | Valid | 80.0 | 81.0 | 964 ms | 12.4 ms | 1.0 | 0 | 2,399 | 30.0 s |
| Sustained decode | 16K | 2 | Valid | 130.5 | 65.5 | 1,353 ms | 15.3 ms | 2.0 | 0 | 3,914 | 30.0 s |
| Sustained decode | 16K | 4 | Valid | 197.0 | 48.8 | 2,319 ms | 20.5 ms | 4.0 | 0 | 5,909 | 30.0 s |
| Sustained decode | 16K | 8 | Valid | 323.5 | 38.9 | 3,646 ms | 25.7 ms | 8.0 | 0 | 9,702 | 30.0 s |
| Sustained decode | 16K | 16 | Valid | 416.1 | 23.9 | 6,162 ms | 41.9 ms | 16.0 | 0 | 12,478 | 30.0 s |
| Sustained decode | 16K | 32 | Valid | 510.5 | 13.4 | 11,507 ms | 74.5 ms | 32.0 | 0 | 15,281 | 29.9 s |
| Sustained decode | 16K | 64 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 16K | 128 | Over capacity | — | — | — | — | — | — | — | — |
| Sustained decode | 32K | 1 | Valid | 62.2 | 63.2 | 1,122 ms | 15.8 ms | 1.0 | 0 | 1,866 | 30.0 s |
| Sustained decode | 32K | 2 | Valid | 102.7 | 51.5 | 1,569 ms | 19.4 ms | 2.0 | 0 | 3,079 | 30.0 s |
| Sustained decode | 32K | 4 | Valid | 183.3 | 45.7 | 2,800 ms | 21.9 ms | 4.0 | 0 | 5,500 | 30.0 s |
| Sustained decode | 32K | 8 | Valid | 236.5 | 29.0 | 3,885 ms | 34.5 ms | 8.0 | 0 | 7,087 | 30.0 s |
| Sustained decode | 32K | 16 | Valid | 282.6 | 16.2 | 6,348 ms | 61.6 ms | 16.0 | 0 | 8,474 | 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 | 40.5 | 41.4 | 1,699 ms | 24.2 ms | 1.0 | 0 | 1,215 | 30.0 s |
| Sustained decode | 64K | 2 | Valid | 72.0 | 35.8 | 2,285 ms | 28.0 ms | 2.0 | 0 | 2,159 | 30.0 s |
| Sustained decode | 64K | 4 | Valid | 128.4 | 32.0 | 4,024 ms | 31.3 ms | 4.0 | 0 | 3,849 | 30.0 s |
| Sustained decode | 64K | 8 | Valid | 128.8 | 15.5 | 5,766 ms | 64.4 ms | 8.0 | 0 | 3,861 | 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 | 26.2 | 26.6 | 3,028 ms | 37.6 ms | 1.0 | 0 | 785 | 30.0 s |
| Sustained decode | 128K | 2 | Valid | 47.0 | 23.4 | 3,978 ms | 42.8 ms | 2.0 | 0 | 1,411 | 30.0 s |
| Sustained decode | 128K | 4 | Valid | 52.6 | 13.0 | 6,521 ms | 77.0 ms | 4.0 | 0 | 1,574 | 29.9 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 | 14.9 | 15.2 | 4,758 ms | 65.7 ms | 1.0 | 0 | 444 | 29.8 s |
| Sustained decode | 248K | 2 | Valid | 26.7 | 13.2 | 6,508 ms | 75.7 ms | 2.0 | 0 | 801 | 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 | — | — | — | — | — | — | — | — |
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.
