Out-of-the-box numbers before any tuning: SGLang cookbook “DGX Spark” recipe, NVFP4 weights, no speculative decoding. Measured 2026-10-31 on spark1 (ASUS Ascent GX10, GB10, 128 GB unified memory).
This is the line to beat. Each team gets one Spark and tunes it for speed and concurrency; the scoring rules are below.
Total output tokens/s across all users (bars) and the speed each user sees (line).
Time to first token and time per output token, median and 99th percentile (log scale).
Each point is one concurrency level. Up and to the right is better; tuning should push this curve outward.
GPU clock and power, and the hottest CPU sensor (the GX10 powers off near 93–97 °C).
| Shape | Users | Requests | Duration s | Req/s | Prompt tok/s | Output tok/s | Per-user tok/s | TTFT med ms | TTFT p99 ms | TPOT med ms | TPOT p99 ms | E2E med s |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1k in / 1k out | 1 | 4 | 315 | 0.01 | 13 | 13.0 | 13.1 | 452 | 456 | 76.4 | 77.1 | 78.6 |
| 1k in / 1k out | 2 | 8 | 333 | 0.02 | 25 | 24.6 | 12.4 | 696 | 866 | 80.8 | 80.9 | 83.3 |
| 1k in / 1k out | 4 | 16 | 351 | 0.05 | 47 | 46.7 | 11.8 | 1,215 | 1,980 | 84.5 | 84.9 | 87.8 |
| 1k in / 1k out | 8 | 32 | 381 | 0.08 | 86 | 85.9 | 10.9 | 1,283 | 3,229 | 91.5 | 93.3 | 95.6 |
| 1k in / 1k out | 16 | 64 | 446 | 0.14 | 147 | 147.0 | 9.4 | 2,662 | 6,501 | 105.9 | 110.2 | 112.0 |
| 1k in / 1k out | 32 | 128 | 572 | 0.22 | 229 | 229.3 | 7.4 | 3,513 | 12,803 | 134.3 | 142.6 | 144.4 |
| 1k in / 1k out | 64 | 256 | 1,013 | 0.25 | 259 | 258.9 | 6.4 | 16,042 | 178,560 | 156.0 | 164.7 | 169.6 |
| 8k in / 128 out | 1 | 4 | 50 | 0.08 | 650 | 10.2 | 12.9 | 3,392 | 3,400 | 77.3 | 77.3 | 13.2 |
| 8k in / 128 out | 4 | 16 | 87 | 0.18 | 1,507 | 23.5 | 9.3 | 6,903 | 13,481 | 107.6 | 165.5 | 24.6 |
| 8k in / 128 out | 16 | stopped at 92 °C by the thermal watchdog — no result | ||||||||||
TTFT = time to first token. TPOT = time per output token after the first (per-user tok/s = 1000 / TPOT). Server became ready 242 s after launch. chunked_prefill_size=2048 context_len=262144 max_prefill_tokens=16384 max_running_requests=44 max_total_num_tokens=1162733
Thermal limit hit: the 8k in / 128 out run at 16 users was stopped by the safety watchdog when the hottest CPU sensor reached 92 °C (the GX10 powers itself off around 93–97 °C). After an hour of continuous load, 16 simultaneous 8K-token prompts heated the box from about 81 °C to 92 °C in roughly two and a half minutes, so this point has no stock result. Heavy prompt processing is thermally limited on this hardware; both Sparks need identical placement and airflow.
Speed only counts if quality holds. These are the stock server’s scores (lm-evaluation-harness, thinking off, greedy decoding); a tuned server must reach the gate on every test.
| Test | Measures | Samples | Stock score | Gate (99% of stock) |
|---|---|---|---|---|
| GSM8K | grade-school math, 5-shot, exact answer | 1319 | 90.1% ± 0.8 | ≥ 89.2% |
| IFEval | follows every formatting instruction in the prompt (strict) | 541 | 81.5% ± 1.7 | ≥ 80.7% |
| RULER needle (16K) | finds a fact hidden in a 16K-token document | 100 | 100.0% | ≥ 99.0% |
The eval client was paused 23 time(s) to let the CPU cool; pausing does not affect scores. ± is one standard error. A tuned score below the gate but within two standard errors of stock is re-run before it counts as a fail.
Server, exactly as published in the SGLang cookbook (image pinned to the version it was validated on):
docker run --gpus all --shm-size 32g -p 30000:30000 -v ~/.cache/huggingface:/root/.cache/huggingface --ipc=host \
lmsysorg/sglang \
sglang serve \
--trust-remote-code \
--model-path RadixArk/Qwen3.8-27B-NVFP4 \
--kv-cache-dtype fp8_e4m3 \
--mem-fraction-static 0.80 \
--attention-backend flashinfer \
--chunked-prefill-size 2048 \
--reasoning-parser qwen3 \
--tool-call-parser qwen3_coder \
--mamba-radix-cache-strategy extra_buffer \
--mamba-ssm-dtype float32 \
--host 0.0.0.0 \
--port 30000
Load generator (SGLang’s own bench_serving, same image, same box, real ShareGPT text trimmed to fixed lengths, replies forced to full length):
python3 -m sglang.bench_serving --backend sglang --host 127.0.0.1 --port 30000 --model RadixArk/Qwen3.8-27B-NVFP4 \ --dataset-name random --random-input-len 1024 --random-output-len 1024 --random-range-ratio 1.0 \ --num-prompts $((4*C)) --max-concurrency $C --seed 42 --output-file sweep_1k1k.jsonl # C = 1 2 4 8 16 32 64; long-prompt shape: --random-input-len 8192 --random-output-len 128, C = 1 4 16
kernel: 7.0.0-1024-nvidia driver: 580.178.04 dgx_release: 7.6.0 sglang: 0.5.19 image: lmsysorg/sglang@sha256:d6e7288627be8b02be88e4bba38e73f6d50e2826869f753c13a4c4385ab3eda9 model_revision: 319f741cce68d7914884900c138a1fbb70a42f30
Context: there is no lightweight official standard for this. MLPerf Inference is the industry benchmark but takes weeks to run compliantly; InferenceX (SemiAnalysis) uses the same throughput-vs-interactivity method on fixed 1k/1k and 8k/1k shapes. These rules borrow from both.