cd ~/sagarpandita.com

experimental / september 2026

Qwen3.8-Flash-Next on DGX Spark: three runtimes, one box

Qwen3.8-Flash-Next is a 125B-parameter MoE with 6B active parameters, a 51B n-gram embedding table, and a 4B MTP module. I ran it on one NVIDIA DGX Spark under vLLM and SGLang using the same NVFP4 checkpoint, then added Unsloth's UD-Q4_K_XL GGUF under llama.cpp.

Every accepted request used a fresh prompt: prefix caching was disabled across all three stacks. The sweep covers ten context targets through 262K, four concurrency levels, five correctness canaries per engine, and five-second thermal, clock, power, memory, swap, and page-fault telemetry.

sglang decode @ 256k
42.0 tok/s
vllm throughput @ c8
162.7 tok/s
gguf memory floor
25.0 GiB free
max prompt completed
235,926 tokens
timed throttling
none

the punchline

The two CUDA-native servers are close on fresh-prompt prefill. SGLang leads single-stream decode, while vLLM scales best at the top of this concurrency ladder. The GGUF build fits with far more headroom, but llama.cpp without MTP is much slower at long context.

engine256K TTFT256K prefill256K decodec8 aggregatememory floor
vLLM · NVFP4110.68 s2,132 tok/s35.36 tok/s162.7 tok/s5.86 GiB
SGLang · NVFP4108.97 s2,165 tok/s42.04 tok/s151.5 tok/s6.83 GiB
llama.cpp · UD-Q4_K_XL778.30 s303 tok/s5.37 tok/s54.1 tok/s24.99 GiB

The llama.cpp row is a deployment comparison, not an engine-only comparison: its quantization, format, kernels, and speculative-decoding configuration differ.

throughput vs context

One fresh-prompt request per target, 256 generated tokens, greedy decoding, EOS ignored. The x-axis uses log₂ spacing. Hover a point for exact prompt count, time, and throughput.

prefill · tok/s

decode · tok/s

time to first token · seconds log scale

end-to-end generation · tok/s

context results

targetactualengineTTFTprefilldecodeE2E

throughput vs concurrency

Each point is the median of three fresh-prompt runs. Every stream used 918 prompt tokens and returned exactly 256 output tokens.

aggregate output · tok/s

concurrency medians

streamsengineaggregateper streamTTFT p50TTFT p95

thermals & clocks

Select an engine to inspect its accepted timing phases. Temperature, clocks, and board power share a synchronized crosshair. Shaded regions distinguish context from concurrency measurements; gaps mark cooldown or a server restart.

temperature · °c GPUCPU zone maxNVMe max

clock frequency · mhz CPU meanGPU SM

gpu power · w board draw

timed-measurement summary

engineGPU peakCPU peakNVMe peakpower meanpower peakGPU util meantimed throttle
vLLM77.0°C82.0°C59.9°C54.8 W70.9 W93.7%0
SGLang77.0°C82.7°C61.9°C54.6 W67.7 W95.6%0
llama.cpp81.0°C90.0°C64.9°C62.1 W76.9 W92.5%0

test shape

vLLMSGLangllama.cpp
version0.1.dev20073 · 8e685d1984ccff141d0.4.0-dev · 9dcf84e5a
checkpointRadixArk NVFP4same NVFP4Unsloth UD-Q4_K_XL
context setting262,144262,144262,144
speculationMTP · 2 tokensNEXTN/EAGLE · 3 stepsdisabled
prompt cachedisabledradix disableddisabled per request
PLE / weightsfile-backed mmapfile-backed · 8 GiB RSS capmmap GGUF

The NVFP4 checkpoint occupied 126 GiB and all 208 LFS objects passed SHA-256 verification. The four-shard GGUF occupied 104 GiB and every shard hash was recorded. llama.cpp MTP stayed off because its open parallel-request correctness bug can contaminate outputs between slots. The observed cold boot times are not ranked: page-cache state differed materially after the 104 GiB GGUF download.

findings

  • SGLang wins decode. It remained roughly 18–22% faster than vLLM across the context sweep, while fresh-prompt prefill was within a few percent at the four largest sizes.
  • vLLM scales farther at concurrency eight. SGLang led aggregate throughput at one, two, and four streams; vLLM won the eight-stream row 162.7 to 151.5 tok/s.
  • The GGUF buys headroom, not speed. It completed 235,926 prompt tokens with 24.99 GiB still available, but 256K TTFT was 7.0× vLLM's and decode was 84.8% slower.
  • Near-full context works in all three stacks. Each completed 235,926 prompt tokens plus 256 generated tokens. I did not send an exactly 262,144-token prompt, so this does not prove the absolute boundary.

caveats & sources

One Spark, one observation at each context size, and pinned development images. This is not a BF16, FP8, or model-quality comparison. Client-observed TTFT includes HTTP, scheduling, and first-token work. The GGUF row changes more than the serving engine. Greedy raw completions were chosen for repeatability.

Sources: Qwen model card · Unsloth GGUF card · SGLang single-Spark recipe · vLLM recipe · llama.cpp parallel MTP issue · llama.cpp exact-262K issue.