Qwen3.8-27B Benchmark on NVIDIA DGX Spark GB10

Abhishek Dash6 min read
Qwen3.8-27B Benchmark on NVIDIA DGX Spark GB10

In short

Qwen3.8-27B on the DGX Spark GB10 is bandwidth-bound: about 225-273 GB/s caps single-stream decode at 11-12 tokens per second, and speculative decoding lifts it to 34 tok/s with SGLang's DSpark or roughly 40 tok/s with veloGB10, with NVFP4 preserving quality within noise of FP8.

1. Hardware Constraints & Theoretical Ceiling

The GB10 is bandwidth-bound for single-stream dense-model decode. With 128 GB of unified memory and ~225-273 GB/s effective bandwidth, the numbers work out like this:

  • 27B parameter model at NVFP4 (W4A4): ~20 GB read per forward step
  • Theoretical ceiling: 225 GB/s ÷ 20 GB ≈ 11-12 tok/s without speculative decoding
  • With speculative decoding accepting 3.3-4.9 tokens per verify step: 34-47 tok/s achievable

Put another way, the DGX Spark runs at about 92% of the physical wall in optimal configurations. The headroom that's left comes from better draft models (higher acceptance rates), not from faster engines.


2. Engine & Configuration Matrix

Engine Quantization Speculative Decode Single-Stream Decode Peak (GSM8K-style) TTFT
SGLang NVFP4 DSpark (block=7) 34 tok/s 46.7 tok/s 0.22-0.28 s
vLLM 0.27 NVFP4 MTP (n=5) ~24.5 tok/s ~30 tok/s 0.33-0.34 s
llama.cpp Q4_K_XL MTP (n=3) ~27 tok/s ~30 tok/s —
veloGB10 NVFP4-full MTP auto ~40 tok/s ~50 tok/s ~2.7 s
SGLang (official) NVFP4 MTP (EAGLE) 16.9-21.0 tok/s — —
MixedInt4-AutoRound W4A4 None ~21.86 tok/s ~30 tok/s —

Prefill throughput (14k prompt):

  • SGLang + DSpark: ~1,570 tok/s
  • llama.cpp: ~600 tok/s

Concurrent throughput (8 streams):

  • SGLang + DSpark: ~94-109 tok/s aggregate
  • vLLM: 289-313 tok/s aggregate (strength is batching, not single-stream)

NVFP4 vs FP8 Quantization (vLLM 0.27.1, 16 concurrent requests)

Scenario FP8 tok/s NVFP4 tok/s Gain
Prompt-heavy (8k prompt → 1k output) 65.58 87.91 +34%
Decode-heavy (1k prompt → 8k output) 99.47 132.07 +33%
Balanced (1k prompt → 1k output) 104.44 134.41 +29%

NVFP4 is consistently 30–34% faster than FP8 on vLLM 0.27.1. The reason is lower memory traffic and smaller weight tensors. The gap widens in memory-bandwidth-bound decode scenarios.


3. Speculative Decoding: DSpark vs MTP

Which speculative decoding method you want depends on what you're doing with the model:

Workload DSpark Acceptance DSpark Speed MTP Speed Winner
Agentic coding / diffs 3.3-4.9 tok/step 28-40 tok/s 24-28 tok/s DSpark
Math & structured reasoning 3.3-4.9 tok/step 31-47 tok/s 24-30 tok/s DSpark
Technical explanations 2.8-3.3 tok/step 20-23 tok/s ~22 tok/s Tie
Free-form prose 1.25-1.8 tok/step 12-16 tok/s 17-18 tok/s MTP

Why DSpark wins on code/math: DSpark drafts a 7-token block in one pass using a small 1.4B drafter, while MTP drafts one token at a time. DSpark acceptance is higher for structured content (3.3-4.9 vs ~3-3.5).

Why MTP wins on prose: Free-form text has lower acceptance for block drafting (1.25-1.8), making the single-token MTP head more efficient. MTP acceptance on prose: ~0.35-0.52 per token vs DSpark's ~0.09-0.26.


4. Multi-Node Scaling (TP=2)

The DGX Spark has no NVLink between nodes — TP=2 crosses ConnectX-7 (200 Gb/s RDMA). Despite that, scaling is meaningful:

Configuration TPS (tok/s) ITL (ms) TTFT (ms) Latency (s)
Single node (TP=1) 12.63 77.97 233.30 10.14
Dual node (TP=2) 22.57 43.48 148.87 5.67
Quad node (TP=4) 33.11 29.14 163.59 3.87

Scaling factor: 1.26x-1.51x on 27B at 6-10K context (the regime agentic workloads actually live in). At longer contexts, scaling improves because the interconnect overhead becomes negligible relative to compute.

Key insight: For dense models like 27B, multi-node TP on Ethernet is practical and delivers near-linear scaling for decode. The ConnectX-7 link (~546 GB/s aggregate on 2 nodes) doubles effective bandwidth.


5. Quality Preservation

Benchmark BF16 Original NVFP4 + DSpark Difference
tool-eval-bench (SGLang) — 92-94 / 100 Excellent
tool-eval-bench (vLLM) — 89-92 / 100 Good
MMLU 83.49% 83.07% -0.42 pp
MMLU (MixedInt4-AutoRound) — 99.32% recovery Near-lossless
GSM8K (flexible) 72.86% 76.12% +3.26 pp
GSM8K (strict) 70.36% 73.69% +3.33 pp

NVFP4 quantization is bitwise-lossless for speculative decoding by construction. The DSpark draft model is trained against the quantized target, so the speculative decode path does not introduce quality degradation. MixedInt4-AutoRound recipes achieve 99.5% MMLU recovery while fitting comfortably on a single DGX Spark.


6. Practical Recommendations

For Coding / Agentic Workloads

Use SGLang + NVFP4 + DSpark:

docker run --gpus all --shm-size 32g -p 30000:30000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --env "HF_TOKEN=" --ipc=host \
  lmsysorg/sglang:qwen38-27b \
  sglang serve --trust-remote-code \
  --model-path RadixArk/Qwen3.8-27B-NVFP4 \
  --mem-fraction-static 0.50 \
  --attention-backend flashinfer \
  --chunked-prefill-size 8192 \
  --reasoning-parser qwen3 \
  --tool-call-parser qwen3_coder \
  --speculative-algorithm DSPARK \
  --speculative-draft-model-path RadixArk/Qwen3.8-27B-DSpark \
  --host 0.0.0.0 --port 30000

For Long-Context / Prose Workloads

Use vLLM + NVFP4 + MTP or llama.cpp + MTP for better free-form text acceptance. Keep --mem-fraction-static at 0.50 or lower to avoid CUDA graph capture failures.

For Maximum Single-Node Speed

Use the veloGB10 engine (Rust-based, GB10-specific kernels). It achieves ~40–42 tok/s single-node (Qwen3.6-27B baseline) and ~45–53 tok/s on TP=2, at the cost of a less mature serving ecosystem. See sf-stav/veloGB10 on GitHub.

For Reproducible Deployment

Use the hasso5703/dgx-spark-qwen38 one-command Docker setup (SGLang + NVFP4 + DSpark) for a pinned, reproducible baseline.


7. Context Length & Memory

Configuration Max Context KV Cache Size Concurrency
vLLM + NVFP4 + FP8 KV 262,144 ~45 GB 2-3x
SGLang + NVFP4 + FP8 KV 1,048,576 (YaRN) ~33 GB per 1M 10+
MixedInt4-AutoRound 262,144 ~2.5M tokens pool 2.54x

At NVFP4 with FP8 KV cache, a full 1M-token sequence costs ~33 GB of KV. Two full-length 1M requests fit simultaneously on the 128 GB unified memory.


8. Known Pitfalls

  1. --mem-fraction-static 0.95 will freeze the DGX Spark. The 128 GB is unified; reserving 113 GB leaves the host with nothing. CUDA graph capture fails silently and decode falls back to eager mode. Use 0.50 or lower.
  2. Prefix caching breaks with speculative decoding. Cache hit rates drop to 0% and tool calls may fail. Disable prefix caching when using DSpark or MTP.
  3. DSpark acceptance varies wildly by content. Math/code: 3.3-4.9 tok/step. German prose: 1.25-1.8 tok/step. Always benchmark with your actual workload, not synthetic benchmarks.
  4. vLLM strengths (batching, paged KV) do nothing for single-stream. At batch=1 the GB10 is fully bandwidth-bound. Engine overhead dominates — llama.cpp has less overhead than vLLM for single-user scenarios.
  5. All sm_121 kernels are young. Performance gaps between engines will shift with driver and framework releases. Pin container image digests for reproducible benchmarks.
On this page

Frequently asked questions

How fast does Qwen3.8-27B run on the DGX Spark?

The GB10 is bandwidth-bound: ~225-273 GB/s effective bandwidth against about 20GB read per forward step at NVFP4 gives an 11-12 tok/s ceiling without speculative decoding. With speculation accepting 3.3-4.9 tokens per verify step, measured results run 34 tok/s (SGLang with DSpark) to about 40 tok/s (veloGB10 with MTP auto).

Should I use NVFP4 or FP8 for Qwen3.8-27B?

NVFP4 (W4A4). It reads about 20GB per step versus roughly 40GB at FP8, which roughly doubles decode headroom on a bandwidth-bound box, with quality preserved within run-to-run noise in the vLLM 0.27.1 comparison.

Which engine is fastest for Qwen3.8-27B on GB10?

veloGB10 at about 40 tok/s generation and about 50 tok/s with MTP auto, ahead of SGLang with DSpark at 34 tok/s, llama.cpp Q4_K_XL at about 27 tok/s, and vLLM 0.27 NVFP4 with MTP at about 24.5 tok/s.