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

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 30000For 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
--mem-fraction-static 0.95will 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.- 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.
- 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.
- 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.
- All sm_121 kernels are young. Performance gaps between engines will shift with driver and framework releases. Pin container image digests for reproducible benchmarks.
Frequently asked questions
What is Qwen3.8-27B Benchmark on NVIDIA DGX Spar?
See the full deep dive for verified 2026 data and recommendations.