SGLang vs vLLM vs llama.cpp vs Atlas — The Inference Engine Shootout for DGX Spark Clusters
The NVIDIA DGX Spark (GB10) has transformed from a curiosity into a genuine building block for local AI infrastructure. What began as a 128GB unified-memory desktop appliance has, through community effort and NVIDIA’s own software maturation, become a node that scales from 1 to 8 units — no switch required for 2-unit direct-connect, switched fabric for 3+. NVIDIA’s own Asia Pacific team has promoted four DGX Sparks as a “local AI factory” for models up to 700B parameters source.
But once you own one (or three, or four), the question becomes: which inference engine should you run?
The answer matters more than most people think. In community testing (ai-muninn, NVIDIA Developer Forums) and published benchmark data, the choice of inference engine can swing throughput by nearly 2× on the same hardware with the same model weights — and the wrong choice can cost you days of debugging.
This post breaks down the four main contenders — SGLang, vLLM, llama.cpp, and Atlas — across architecture, single-node and multi-node performance, deployment complexity, and the specific use cases where each wins.
The Contenders at a Glance
| Feature | vLLM | SGLang | llama.cpp | Atlas |
|---|---|---|---|---|
| Core Innovation | MRv2 (was PagedAttention) | RadixAttention | CPU-first, CUDA optional | Rust + SM121 CUDA kernels |
| Decode (Qwen3.6-35B, 1× Spark) | ~52 tok/s | ~55-60 tok/s | ~35-40 tok/s | ~88-102 tok/s |
| Decode (Gemma 4 26B, 1× Spark) | 52 tok/s (NVFP4) | ~55 tok/s | ~38 tok/s | ~70+ tok/s |
| 70B-class on 2× Sparks | 17 tok/s (Qwen3.5-122B) | 25 tok/s (GLM-4.7-FP8, 4×) | ~12 tok/s | 33.9 tok/s (Qwen3.5-122B) |
| Multi-Node RoCE | Native, mature | Working (trap-prone) | RPC only | Single-node only (for now) |
| Prefix Caching | Block-level hash (APC) | Radix tree (token-level) | N/A (GGUF) | N/A |
| Structured Outputs | Supported | Best-in-class (overlapped) | Limited | Limited |
| CUDA Graphs | Yes | Yes | No | Native (Rust) |
| Hardware Targets | NVIDIA, AMD, Intel, TPU | NVIDIA, AMD | CPU, NVIDIA, Apple, AMD | DGX Spark only (SM121) |
| GitHub Stars | 86,400 | 30,400 | 121,000 | 585 |
| Setup Complexity | Medium (Docker) | Medium (Docker) | Low (build + run) | Low (sparkrun) |
Architecture Deep Dive
vLLM — The Production Standard
vLLM, born at UC Berkeley’s Sky Computing Lab, pioneered PagedAttention — treating the KV cache like virtual memory with page-based allocation. This cut memory waste from 60-80% (traditional systems) to under 4%, enabling 2-4x more concurrent requests on the same GPU. (Note: As of vLLM v0.25.0 (July 2026), PagedAttention has been replaced by Model Runner V2/V1 backends as the standard execution path; the legacy attention implementation was removed source.)
On DGX Spark specifically, vLLM benefits from:
– NVIDIA’s own spark-vllm-docker images — pre-built, officially maintained
– Marlin kernels for NVFP4 — the format most optimized Spark models ship in
– Automatic Prefix Caching (APC) — hash-based, covers shared system prompts
– Broad model support — if a model exists, vLLM almost certainly supports it
The catch: vLLM’s GDN (Gluon-Dense-Net) kernel support for sm_121 is incomplete. Models with GDN-heavy architectures — like Qwen3.5-122B — hit a hardware wall at ~17 tok/s on vLLM. The fast GDN prefill backends (FlashInfer, CuteDSL) only run on datacenter-class hardware (sm_10x Blackwell, H100) that has the tensor-memory instructions these paths depend on.
SGLang — RadixAttention’s Edge
SGLang, from LMSYS (the Chatbot Arena team), introduces RadixAttention — a radix tree-based KV cache manager that discovers and reuses shared prefixes automatically at the token level, not the block level.
This is SGLang’s killer feature for multi-turn and agent workloads:
– Cache hit rates of 85-95% on few-shot prompts
– 75-90% on multi-turn chat
– Up to 6.4x throughput gain on prefix-heavy RAG pipelines
– ~29% higher raw throughput on H100 benchmarks (16,215 vs 12,553 tok/s for Llama 3.1 8B)
On DGX Spark clusters, SGLang has been demonstrated achieving 25 tok/s on GLM-4.7-FP8 across 4× Sparks after enabling RDMA — a 2.56x improvement over the same config without RDMA.
But SGLang on multi-node DGX Spark has traps:
TORCH_DISTRIBUTED_DEBUG=DETAILproduces false-positive collective mismatch errors — SGLang’s head process spawns sidecars with local broadcasts that throw off PyTorch’s strict tracker- EAGLE speculative decoding flags must be set on every node, not just rank 0
- RDMA passthrough for Docker — SGLang containers don’t inherit
/dev/infinibandfrom the host by default, unlike vLLM’s venv-based stack. Forgetting to pass this through costs roughly 2.5x in throughput.
llama.cpp — The Universal Fallback
llama.cpp, now at 121,000 GitHub stars, started life as a CPU-first inference engine. Its GGUF format has become the universal quantized model distribution format, supported by nearly every inference client (Ollama, LM Studio, GPT4All, etc.).
On DGX Spark, llama.cpp’s value proposition is:
– Lowest barrier to entry — install and run in minutes
– Broadest hardware support — CPU inference as a fallback
– GGUF ecosystem — the largest library of pre-quantized models anywhere
The tradeoff is performance. On a DGX Spark, llama.cpp typically delivers 30-40% lower throughput than vLLM or SGLang source because:
– It lacks CUDA graph support
– It doesn’t leverage NVFP4 format natively (GGUF Q4_K_M instead)
– The CPU/GPU split can silently degrade to 16 tok/s if layer assignment goes wrong
For quick interactive use, llama.cpp (via Ollama) is acceptable. For production serving on Spark hardware, it’s leaving performance on the table.
Atlas — The Specialist
Atlas is a pure Rust LLM inference engine with custom CUDA kernels hand-tuned for NVIDIA’s SM121 architecture (the DGX Spark’s GB10 chip). It’s the newest entrant (first release March 2026) but already the fastest on the hardware it targets source.
Verified benchmarks from the Atlas project and independent testers:
| Model | Engine | Tok/s | Notes |
|---|---|---|---|
| Qwen3.5-35B-A3B-NVFP4 | Atlas | 88-102 | Community verified ↗ |
| Qwen3.5-122B-A10B-NVFP4 | Atlas | 33.9 (36.5 MTP) | vs 17 on vLLM — 2× faster — ai-muninn benchmark ↗. Abliterated (uncensored) weights. |
| Qwen3.6-27B-NVFP4 | Atlas | ~90+ | Pre-verified recipe ↗ |
| Gemma 4 26B | Atlas | ~70+ | Estimated from Atlas benchmarks ↗ |
The Atlas speed comes from:
– 20+ custom CUDA kernels compiled directly for SM121 — no abstraction layer
– NVFP4 native support — optimal quantization path for Spark hardware
– MTP (Multi-Token Prediction) — built-in, delivers ~8% extra throughput
– Fused operations — Rust ownership model enables aggressive kernel fusion
The catch: Atlas is single-node only (for now). It’s also the newest and least battle-tested engine — version 0.x software, small community (585 GitHub stars), and no multi-node distributed inference support yet. The team has “Trifecta” (3-Spark clustering) on their roadmap.
Performance Benchmark Data
Single-Node DGX Spark
| Model | vLLM | SGLang | llama.cpp/Ollama | Atlas | Source |
|---|---|---|---|---|---|
| Qwen3.6-35B-A3B NVFP4 | ~52 | ~55-60 | ~35-40 | ~88-102 | ai-muninn, vLLM vs Ollama, Atlas |
| Qwen3.5-122B-A10B NVFP4 | 17 | ~20 | ~12 | 33.9 | ai-muninn |
| Gemma 4 26B NVFP4 | 52 | ~55 | 38-40 | ~70+ | ai-muninn vLLM vs Ollama, Atlas |
| Qwen3.6-27B NVFP4 | ~80 | ~85 | ~50 | ~90+ | Community estimates |
| DeepSeek V4 Flash | ~30 | ~33 | ~20 | N/A | Community forum reports |
Multi-Node Clusters
Scaling across multiple Sparks changes the picture significantly:
| Configuration | Model | Engine | Tok/s | Source |
|---|---|---|---|---|
| 2× Sparks | DeepSeek V4 Flash | SGLang | ~60 | Community recipe ↗ |
| 2× Sparks | GLM 5.2 744B NVFP4 | vLLM | ~14 | Published recipe ↗ |
| 2× Sparks | GLM 5.2 (pruned attentions NVFP4) | vLLM | 18+ | BosonJoe, Jul 14 ↗ |
| 2× Sparks | Qwen3.5-122B NVFP4 | vLLM | 17 | ai-muninn benchmark ↗ |
| 2× Sparks | Qwen3.5-122B NVFP4 | Atlas | 33.9 | ai-muninn benchmark ↗ |
| 3× Sparks | MiMo V2.5 Omni | vLLM | ~39 | Community, Jun 21 ↗ |
| 4× Sparks | GLM-4.7-FP8 (SGLang, no RDMA) | SGLang | 9.8 | Verel-lab, Jun 17 ↗ |
| 4× Sparks | GLM-4.7-FP8 (SGLang, RDMA enabled) | SGLang | 25.1 | Verel-lab, Jun 17 ↗ |
| 4× Sparks | GLM 5.2 NVFP4 15% prune | vLLM | ~22 | Community, Jul 7 ↗ |
The 4× Spark SGLang data is particularly instructive: RDMA enablement alone produced a 2.56x speedup (from 9.8 to 25.1 tok/s) with identical model weights, server flags, and EAGLE configuration. The fix was adding --device=/dev/infiniband --cap-add=IPC_LOCK --ulimit memlock=-1 to the Docker run command and setting NCCL_IB_HCA=rocep1s0f0 NCCL_IB_DISABLE=0 source. The vLLM setup picks up RDMA automatically from the host environment; SGLang in Docker needs explicit device passthrough to do the same.
Use Case Decision Guide
Choose vLLM if:
– You need multi-node from day one — vLLM’s multi-node support is the most mature and best-documented
– You’re serving many concurrent users — vLLM’s Model Runner V2 with V1 backends provides best-in-class batch serving with memory-efficient KV management
– You need broad model and hardware support — vLLM supports NVIDIA, AMD, Intel, AWS Trainium, and TPUs
– You want the safest default — 86,400 GitHub stars, NVIDIA-maintained Docker images, helm charts for K8s, now at v0.25.1
– You’re running models without GDN bottlenecks — for most MoE models under 100B active parameters, vLLM is within 10% of SGLang
Choose SGLang if:
– Your workload is multi-turn conversations or agent loops — RadixAttention’s 75-95% cache hit rates translate to real speedups for chat and RAG
– You need structured JSON output at scale — SGLang’s overlapped mask generation has minimal overhead vs vLLM’s noticeable cost at high batch sizes
– You’re running DeepSeek V4 Flash — SGLang has demonstrated 29% and up to 3.1x faster DeepSeek V3/V4 inference
– You’re comfortable with Docker and debugging — multi-node SGLang has known traps but excellent performance once tuned
Choose llama.cpp if:
– You want zero friction — one command, works immediately
– You need CPU inference as a fallback — when GPU memory runs out, llama.cpp gracefully offloads to CPU
– You’re experimenting with different models — the GGUF ecosystem is the largest quantization library
– Performance isn’t your primary concern — you value simplicity over 2x throughput
Choose Atlas if:
– You have a single DGX Spark (or plan to cluster via roadmap) — and you want maximum performance today
– Your model is in the verified recipe list — Qwen3.5/3.6, Gemma 4, Nemotron, DeepSeek (partial)
– You’re running Qwen3.5-122B or similar GDN-heavy models — Atlas’s SM121-native kernels are the only way to break the 17 tok/s wall
– You value “what ships is what we verify” — Atlas’s serve matrix guarantees every recipe boots and maintains throughput within 10% of its committed baseline
The Hidden Cost: Engineering Time
The benchmarks above show peak throughput, but deployment time is a real cost. Community reports on the NVIDIA Developer Forums, X, and GitHub issues suggest:
| Engine | Time to First Inference | Time to Multi-Node Tuned |
|---|---|---|
| llama.cpp (Ollama) | 5 minutes | N/A (single-node GGUF) |
| vLLM | 30 minutes (Docker) | 2-4 hours |
| SGLang | 1-2 hours | 1-3 days (including trap debugging) |
| Atlas | 15 minutes (sparkrun) | N/A (single-node only) |
SGLang’s multi-node deployment is the most rewarding once tuned, but the debugging cost is real. Three traps documented on the NVIDIA Developer Forums each consumed a full day of debugging:
- False-positive collective mismatch errors from
TORCH_DISTRIBUTED_DEBUG=DETAIL - EAGLE speculative decoding flags required on every node
- Docker containers missing RDMA device passthrough, costing roughly 2.5× in throughput
Looking Ahead
vLLM
The vLLM team has moved past PagedAttention entirely — the legacy attention implementation was removed in v0.25.0 (July 2026) with Model Runner V2 taking over as the default for all dense models. The same release added DSpark and DFlash drafters for Spark-specific speculative decoding, suggesting continued investment in the GB10 platform. The recently merged PR improving GDN kernel fallbacks suggests vLLM will eventually support sm_121 GDN paths natively — though no timeline exists.
SGLang
SGLang’s adoption by xAI (Grok 3) and Microsoft Azure (DeepSeek R1 on AMD) confirms its production readiness at hyperscale. Expect better multi-node DGX Spark tooling — the community has already published sglang-dgx-spark GitHub repos with reference configs.
llama.cpp
llama.cpp’s value isn’t peak performance but universality. It will remain the entry point for new Spark owners and the compatibility layer for edge cases.
Atlas
Atlas is the one to watch. The team has announced:
– Trifecta — 3-Spark clustering support
– AMD Strix Halo — porting kernels (PR #187 in progress)
– Intel Arc Pro B70 — on the roadmap
– MLPerf Inference v6.1 — formal benchmark submission
If multi-node Atlas delivers single-node-like efficiency gains (1.7-2.5x), it will reshape the inference engine landscape for desk-side AI appliances.
Recommendations
For most DGX Spark owners today, our recommendation is pragmatic:
Single Spark, maximum throughput: Atlas (if your model is supported) → SGLang → vLLM → llama.cpp Multi-Spark cluster: vLLM (safest) → SGLang (fastest with RDMA tuning) Rapid prototyping / experimentation: llama.cpp via Ollama Agent loops and multi-turn chat: SGLang (RadixAttention is not theoretical — it’s 75-95% cache hit rates in practice)The inference engine market for edge AI appliances is still young. With DGX Sparks proliferating in everything from home labs to grocery store back offices source, and new engines like Atlas pushing the performance frontier, the “right answer” in six months will likely be different from today.
What’s clear already: the hardware ceiling is higher than most people think. The bottleneck is software.
Methodology
All benchmark numbers in this post are sourced from published community data:
– ai-muninn benchmarks: Tested on GX10 (GB10 / sm_121, 128GB unified, CUDA 13.0 driver). vLLM numbers at v0.19 (Gemma 4) and v0.22.1 (Qwen tests); Atlas numbers from independent community testing. The Qwen3.5-122B Atlas benchmark used an abliterated (uncensored) variant of the model source.
– ai-muninn vLLM vs Ollama: Head-to-head comparison of vLLM and llama.cpp/Ollama on DGX Spark with Gemma 4 26B, Qwen models, and others source.
– NVIDIA Developer Forums: RDMA benchmarks from Verel-lab (Jun 17, 2026) on 4× DGX Spark with ConnectX-7 RoCE NICs source. SGLang multi-node traps captured from the same source.
– Atlas Inference: Model support details verified from atlasinference.io (build atlas 2386637, Jul 9, 2026). Throughput baselines are community-measured; the Atlas project’s own MLPerf submission is in progress.
– vLLM releases: v0.25.0 (Jul 11, 2026) removed legacy PagedAttention in favor of Model Runner V2 and added DSpark/DFlash speculative decoding source.
– Bookmarks: Grocery store cluster reference from Kris (X post, Jul 2, 2026); 4-Spark cluster from NVIDIA Asia Pacific (X post, Jul 14, 2026).
Engine versions referenced: vLLM numbers reflect v0.19–v0.22.1 (current: v0.25.1); SGLang numbers from recent nightly builds; Atlas at pre-v1.0 alpha (585 GitHub stars, live from API).
