What's New in SGLang 0.5.18?
SGLang 0.5.18 shipped 2026-08-22 — the largest single-line diff in the 0.5 line, 710 PRs from 212 contributors. The release is heavy on day-0 model support (seven new autoregressive and diffusion models), big startup-time wins on the model-loading path, two measurable decode-side latency improvements on Blackwell, and a breaking-change round that consolidates every compiled-kernel cache under SGLANG_CACHE_DIR. For monitoring purposes the three changes that move the production dashboard are the overlapped checkpoint staging at startup, the TP LMHead all-to-all, and the FlashInfer MNNVL pure allreduce — all three land on the same Blackwell-and-decode workloads and the perf numbers are the kind of thing that reshapes the per-percentile latency budget. From the 0.5.18 release notes:
- Overlapped checkpoint staging at startup: Qwen3-32B on H100 starts 8.6-11.7% faster than serial-with-prefetch, 2.38x faster (35.6s vs 84.8s) than the plain default (#32017) — Until 0.5.18, the model-loading path and the CUDA-graph capture path were serialized: pages staged from storage first, then the graphs captured, then the model was ready. 0.5.18 overlaps them. For monitoring, this is the change that finally separates the cold-start time (the user-perceived time-to-first-token after a fresh pod spin) from the time-to-CUDA-graph-ready (the internal schedule-to-serve time), so a pod restart that previously inflated the cold-start tail-latency bucket now lands in the time-to-graph-ready bucket. The LLM latency monitoring 2026 guide shows the dashboard panel that surfaces the difference. Opt in with
--startup-weight-load-mode overlap. - TP LMHead with All-to-All: LMHead time drops 320us to 169us, TPOT improves 36.97ms to 35.67ms on DeepSeek-V4-Pro B200 decode (#32313) — The TP LMHead's allgather + scatter becomes a single all-to-all for pure-DP dp-attention. This is the kind of per-layer latency win that compounds on long-context decode: on a 4K-token decode, an LMHead cut from 320us to 169us is a 151us-per-token saving, and a TPOT improvement from 36.97ms to 35.67ms is the full-decode improvement. For teams that have been watching the per-token-decode histogram trend noisy at the high-percentile side, this is the release where the LMHead cost stops being a leading contributor to the tail. Auto-enabled on the pure-DP dp-attention path; no flag to set.
- FlashInfer MNNVL for pure allreduce: DeepSeek-V4-Flash TP4 decode on Blackwell gains up to +6.9% at small batches (#30700) — Non-fused allreduce sites now reuse the FlashInfer MNNVL workspace instead of falling back to NCCL. The win is on the small-batch tail of the decode-batch distribution, which is exactly the regime where the per-token cost is most sensitive to allreduce overhead. Auto-enabled for DeepSeek-V3 / V3.2 / V4; elsewhere, opt in with
--enable-flashinfer-pure-allreduce. The per-tenant throughput split the multi-LLM routing guide covers is the kind of routing decision the small-batch tail-cost improvement reshapes. - New models day 0: Muse Glimmer (multimodal autoregressive), Intern-S2-Mobius (autoregressive), SANA-Video (diffusion), LingBot-Video-MoE (diffusion), LTX-2.5 (diffusion), Cosmos3 Edge & Distilled (diffusion), LongCat-Image (diffusion) (#34262, #33691, #32921, #32341, #34471, #31590, #23274) — Plus cookbook recipes for Qwen3.8, Ling-3.0, Nemotron 3.5 Lightning, Dots3-Note, and DeepSeek-V4-Pro-0813. The diffusion-side additions are particularly meaningful: SANA-Video and LingBot-Video-MoE land as native day-0 model paths, which means the SGLang-Diffusion side now has the same first-class support for video-generation workloads that the autoregressive side has for chat. The multimodal LLM cost optimization guide shows the per-token-and-per-frame cost model that this expanded model set unlocks.
- Quantization expansion: ModelOpt MXFP8 checkpoints, online MoE weight quantization on ModelOpt FP4, NVFP4 token embedding in ModelOpt mixed-precision, FlashInfer CUTLASS for dense MXFP8 GEMM on SM120 (#32538, #33115, #34222, #33208) — The quantization table stabilizes around NVFP4 + MXFP8 + ModelOpt. The torchao integration is removed in the same release (#34304 —
--torchao-confighad been raising ImportError for every accepted value since the torchao pin moved to 0.17.0). For teams that have been waiting on the MXFP8 dense path to land on SM120, this is the release where the per-token inference cost on the Blackwell-class fleet converges to the published NVFP4 numbers. The custom AI silicon comparison tracks the per-silicon cost numbers that the new quantization table re-prices. - SGLang-Diffusion expansion: data-parallel serving (
--dp-size), cross-node sequence parallelism (Ulysses x Ring), K/V-gather style sequence-parallel attention, Sol-Attn sparse attention for H3 (#33725, #33327, #32667, #33702) — The diffusion side gets the same parallelism primitives the autoregressive side shipped in 0.5.17. Breakable CUDA graphs land for LTX-2 (H200 two-stage e2e 10.75s → 6.90s, 1.56x), SANA (H200 1024px e2e -26%, bit-exact), LTX-2.3, and Z-Image single-GPU. Per-section LoRA adapters on fused linear layers and quant-videogen PRQ KV-cache quantization (a memory-saving path for causal-DiT) round out the diffusion side. The multimodal LLM monitoring guide shows the per-frame-latency panels that the new parallelism primitives require. - Dependency bumps: torch 2.13.0 with triton 3.7.1, flashinfer 0.6.17, CuTeDSL 4.6.2, DeepEP installs from released
sgl-deep-epwheels instead of source (#28836, #33997, #34372, #33932) — The torch 2.13 move is the largest dependency churn. The CuTeDSL bump fixes an FA4 startup regression on Blackwell. DeepEP moving to released wheels closes a build-from-source pain point that the Kubernetes GPU operator stack had been routing around with custom Dockerfiles. - Speculative decoding round: DSpark logprobs support, DFlash logprobs support, MegaMoE for DSpark under dp-attention, ngram draft token relay, multi-layer eagle's last shared-read runner points at the draft runner (#34696, #34478, #33459, #35198, #35057) — Plus a fix for silent KV corruption when speculative draft tokens exceed 4 on DSV4 (#34189) and a DSpark EP1 decode regression fix (#34759). The DSpark logprobs work is the monitoring-visible one: a spec-decoded completion now returns a usable logprobs payload on the response, so the eval framework can score the speculative-decode path the same way it scores the non-spec path. The silent-KV-corruption fix is a correctness release-blocker on DSV4 traffic.
- One compiled-kernel cache directory:
SGLANG_CACHE_DIRconsolidates Triton, FlashInfer, Inductor, DeepGEMM, and CUDA driver caches (#32434) — Every compiled-kernel cache moves under a single env var. The first launch after upgrading recompiles once. For teams that pre-warm or volume-mount cache directories, the migration is: copy or symlink the old directories (~/.tritonto{SGLANG_CACHE_DIR}/triton,~/.cache/flashinferto{SGLANG_CACHE_DIR}/.cache/flashinfer,~/.cache/deep_gemmto{SGLANG_CACHE_DIR}/deep_gemm,/tmp/torchinductor_$USERto{SGLANG_CACHE_DIR}/inductor,~/.nv/ComputeCacheto{SGLANG_CACHE_DIR}/nv); setting any ofTRITON_CACHE_DIR,FLASHINFER_WORKSPACE_BASE,SGLANG_DG_CACHE_DIR,TORCHINDUCTOR_CACHE_DIR, orCUDA_CACHE_PATHkeeps that one where it is. This is the kind of operational cleanup that shows up on the cold-start dashboard as a one-time recompile cost that the next cold start avoids. - Security: remote media downloads bounded to 64 MiB by default, with redirect validation and opt-in exact-hostname allowlisting for image/video/audio URLs; NUL bytes rejected in grammar specs to stop an xgrammar segfault (#34892, #34679) — Two security fixes that close SSRF and segfault classes on multimodal traffic. The 64 MiB cap is the right default for production agent fleets that route user-supplied image URLs through a vision-capable SGLang deployment; teams that need higher caps can override but should pair the override with a domain allowlist.
- AMD and NPU gains: prefill context parallel two-batch overlap for DSV4, DSV4 DSpark on HIP, K3 verified mla kernel for DSpark on Triton backend, V4 MTP target-verify through the decode kernel on AMD; Kimi-K3 day-0 NPU support, DSV4 DSpark on NPU, mxfp4-w4a8 MoE quantization on NPU — The AMD and NPU lines get the same parity treatment the 0.5.17 release gave the NVIDIA path. For teams running the custom AI silicon comparison's AMD and NPU options, 0.5.18 is the release where the SGLang parity claim becomes real rather than aspirational.
Migration from 0.5.17 has three operational gotchas. First, the SGLANG_CACHE_DIR consolidation — if you volume-mount any of the old cache directories, copy or symlink them per the migration table above or accept the one-time recompile. Second, the MoE deferred finalize is on by default on the NVFP4 + flashinfer_trtllm path with an unfused, non-TP1 shared expert (the DeepSeek-V3 family) — set SGLANG_ENABLE_MOE_DEFERRED_FINALIZE=False to fall back to the old behavior if your traffic shape is not the V3/V3.2/V4 family. Third, the unified-cache out-of-window SWA slot freeing is on by default for the unified radix cache — set SGLANG_OPT_UNIFIED_CACHE_FREE_OUT_OF_WINDOW_SLOTS=False to restore the old behavior. The known-issues section calls out three reverted changes (Kimi K3 MLA gate-projection fusion into the QKV-A GEMM, AMD GLM-5.2 fused shared-expert append into aiter grouped-topk, parallel request lifecycle tracking from 0.5.17) and several disabled NPU tests pending fixes. For the broader per-model-side monitoring surface, the LLM monitoring dashboard templates guide shows the panels that this release's parallelism-expansion reshapes. For the cost side of the new quantization table, the LLM API cost calculator turns the per-token plus flat-cost data into a forward-looking forecast against your actual traffic.
What's New in SGLang 0.5.17?
SGLang 0.5.17 shipped August 11 as a wide-cut release across the serving and diffusion stacks. The headline is day-0 support for two new frontier models — Moonshot's Kimi K3 and MiniMax-H3 video-and-audio — alongside a Rust frontend migration, pluggable DCP comm backends, and a new MoE prefill parallelism strategy. This is the largest single-line diff in the 0.5 line since 0.5.4's RadixAttention plumbing changes. From the 0.5.17 release notes:
- Kimi K3 day-0 support (2.8T-parameter LatentMoE, 1M-token context) — Moonshot's Kimi K3 ships as a native MXFP4 checkpoint with 896 experts routed in a 3584-dim latent space, top-16 routing, 1M-token context, 69 KDA linear-attention layers interleaved with 24 MLA layers, and a MoonViT3d vision tower. SGLang serves it from day 0 with DCP, DSpark speculative decoding, chunked-prefill PP with TP decode, KDA-aware prefix caching, HiCache L2 over DCP, LoRA on the quantized weights, and reasoning, tool-call and OpenAI-compatible serving — verified on NVIDIA GB300 and AMD MI35x. For teams running a multi-model platform, this is the model that justifies pairing the custom AI silicon comparison with the LLM inference engine comparison: the MXFP4 + 1M context combination only fits on the LLM serving path that has KDA-aware prefix caching.
- MiniMax-H3 day-0 video-and-audio support on SGLang-Diffusion — MiniMax-H3 produces a video and a synchronized stereo audio track in one request, served natively across all three public task profiles: text-to-video-and-audio (
t2va), first/last-frame conditioning (fl2va), and image/video/audio reference conditioning (ref2va, including video-to-video). Verified on B200 (TP2 + Ulysses4), H100 (TP2 + Ulysses2), AMD MI300X and MI355X (Ulysses1/2/4/8), and 2x RTX 5090 with layerwise offload. For teams that have been building the multimodal LLM cost model around text-only serving, the H3 release is the inflection point where the diffusion path lands on the same serving primitives. - Initial Rust frontend migration — The front half of the server, from network ingress up to the point a tokenized request is handed to the GPU scheduler, migrates from Python to a multi-threaded Rust implementation. For monitoring, this is the change that finally makes the per-request latency histogram believable on the high-percentile side — the Python event-loop jitter that made p99 noise on the LLM latency monitoring dashboard trend noisy is the first thing the Rust frontend removes. Validate on your own traffic; the release publishes no perf numbers.
- DCP communication backends and q-replicate (Helix) — The DeepSeek-MLA decode context-parallel path gains pluggable comm backends.
a2aexchanges packed attention output plus fp32 LSE in a single NCCL collective per layer, with fp8 KV carried as uint8 byte transport;fi_a2adelegates the cross-rank exchange to the FlashInfer MNNVL kernel on GB200.--dcp-replicate-q-projprojects full-head Q locally and skips the per-layer Q head-dim all-gather. Select with--dcp-comm-backend {ag_rs, a2a, fi_a2a}. For teams running the DeepSeek-shaped traffic the vLLM/SGLang/Ollama comparison covers, this is the change that makes the decode-parallel path a deployable option rather than a research branch. - DWDP for MoE prefill (early-development) — A new prefill parallelism strategy that prefetches peer expert weights over NVLink P2P and computes all experts locally, removing EP all-to-all token dispatch. On 4x B200 with gpt-oss-120b, prefill-only, DWDP4 reaches 1.92x over DEP4 at MNT 32K / ISL 32K, and 506K vs 329K tok/s (1.54x) at saturation (CONC=128, ISL=8K). Enable with
--dwdp-size; the authors mark it early-development. For teams running large MoE prefill workloads — the same shape the custom AI silicon comparison calls out — this is the configuration that pulls the per-token prefill cost down on the B200/GB300 fleet. Watch this flag pair with theprefill_fill_inmetric on the SGLang dashboard; the LLM inference engine comparison tracks how it compares to vLLM's DEP. - Other new models: EmbeddingGemma, LFM2.5, nvidia/MiniMax-M3-NVFP4, Laguna-S-2.1, Inkling-Small — Day-0 support for Google's EmbeddingGemma embedding model, LiquidAI's LFM2.5, nvidia/MiniMax-M3-NVFP4, plus cookbook recipes for Poolside's Laguna-S-2.1 family and ThinkingMachines' Inkling-Small. For teams that have been waiting on the NVFP4 SGLang path to support the MiniMax-M3 spec, this is the line where the NVFP4 quantization table stabilizes.
No migration is required to upgrade from 0.5.16. The serving-defaults move remains the same: 0.5.17 defaults to the new Rust frontend and the new DCP comm backends, so teams that want to validate the prior Python frontend path should pin --frontend=python explicitly. The Kimi K3 and MiniMax-H3 paths are additive — they do not change the default model list, you opt in by serving the model. For the per-request latency shift the Rust frontend promises, the LLM latency monitoring 2026 guide shows the per-percentile dashboard that the change will reshape.
Why SGLang Needs Its Own Monitoring Stack
SGLang shares the PagedAttention memory management concept with vLLM — both use virtual memory blocks for the KV cache — but the internal scheduling logic is fundamentally different. SGLang's RadixAttention engine caches key-value tensors at the prefix tree level, which means that for workloads with repeated system prompts or multi-turn chat, you get dramatically better cache utilization than vLLM's flat block manager.
That architectural difference means monitoring metrics you take for granted in vLLM are either missing or behave differently in SGLang:
- KV cache hit rate is measured differently: SGLang tracks prefix hits at the RadixAttention tree level, not at the block level. The metric path and expected values are different.
- Discontinuous KV cache creates scheduling complexity: SGLang's fill-in mechanism (backfilling KV cache for retrieved nodes) introduces a prefill phase that is not present in vanilla vLLM continuous batching.
- Constrained decoding is first-class: SGLang's compiler-level constrained decoding support (regex, JSON schema, grammar) creates additional token filtering overhead that shows up as a unique latency component.
- Prefill/decode overlap is tunable: SGLang exposes
prefill_chunk_sizeas a runtime parameter, which directly affects memory pressure and throughput in ways that vLLM does not expose.
SGLang Architecture: The Monitoring Primitives You Need to Know
RadixAttention: Prefix Tree Cache
SGLang builds a prefix tree at startup. When a new request arrives, the engine traverses the tree to find shared key-value tensors from prior sequences. For a chatbot with a system prompt of 2,000 tokens and a 500-token user message, SGLang retrieves the system prompt KV cache in a single tree lookup instead of reprocessing those tokens for every request.
This is why SGLang's kvcache_prefix_hit_rate metric can hit 0.7-0.9 on multi-turn workloads where vLLM might show 0.2-0.4 with the same traffic shape. Monitor this metric — it is the clearest signal of whether your workload is getting the cache benefits SGLang promises.
Discontinuous KV Cache and Fill-in Mechanism
When a requested prefix is not contiguous in the RadixAttention cache — for example, when retrieving nodes from different tree branches — SGLang uses a fill-in mechanism to reconstruct the full context. This backfill operation adds a scheduling step that is measurable in the prefill phase latency.
On single-turn workloads, this is negligible. On retrieval-augmented generation (RAG) pipelines with long document chunks and interleaved retrieval calls, the fill-in overhead can add 50-200ms to TTFT depending on chunk size. You need sglang:prefill_forward_duration_seconds broken out by tree lookup vs backfill vs compute to understand where latency is coming from.
Constrained Decoding
SGLang's grammar-constrained decoding compiles regex or JSON schema patterns into a finite state machine that runs inside the token selection loop. This is hardware-efficient — it eliminates wasted compute on invalid tokens — but it introduces a CPU-bound overhead in the Python runtime that does not show up in GPU metrics.
Monitor sglang:constrained_decode_time_seconds separately from your GPU latency metrics. If this approaches 10% of your total decode time, the constraint compilation is adding meaningful overhead and you should evaluate whether your grammar is too complex.
The Metrics That Actually Matter
Throughput Metrics
sglang:num_generated_tokens_total: Total tokens generated across all sequences. Rate-change monitoring gives you serving throughput in tokens/second.sglang:num_forward_calls_total: Total forward pass count. Helps you understand batch utilization — high forward call rate with low token count means many small sequences.sglang:num_tokens_per_forward: Average tokens per forward pass. Lower values indicate fragmented batches; higher values mean efficient batching.sglang:prefill_forward_duration_seconds: Prefill phase latency histogram. Break this down by cache hit vs miss vs fill-in to understand where prefill time goes.sglang:decode_forward_duration_seconds: Decode (token generation) phase latency. This is your TPOT component.
Memory Metrics
sglang:kvcache_usage_ratio: KV cache memory used over total allocated. Healthy range 0.75-0.92. Above 0.95 for more than 5 minutes is OOM risk.sglang:kvcache_prefix_hit_rate: Fraction of tokens served from prefix tree cache. Target depends on workload — multi-turn chat should hit 0.6+; single-turn batch inference may be near zero.sglang:available_kvcache_memory: Remaining KV cache capacity in bytes. Critical for capacity planning and autoscaling decisions.sglang:num_active_seq: Current number of active sequences. Correlate withkvcache_usage_ratioto understand memory pressure per sequence.
Latency Metrics
sglang:time_to_first_token_seconds: TTFT histogram. For streaming UX, p95 under 800ms is the practical target for 8B models on H100.sglang:time_per_output_token_seconds: TPOT histogram. p95 under 50ms for decode-heavy workloads.sglang:end_to_end_request_latency_seconds: Total wall-clock from request start to last token. Useful for SLO tracking but misleading as a tuning signal because it mixes queue time with compute.sglang:request_inference_time_seconds: Pure model compute time (excludes queuing). This is the metric to use for capacity planning.
Queue and Scheduling Metrics
sglang:num_waiting_tokens: Number of tokens waiting in the scheduler queue. Spikes here indicate prefill bottleneck.sglang:num_running_speculative_tokens: Active speculative decoding tokens (if enabled). Non-zero values mean speculative decoding is in use and you should monitor acceptance rate.sglang:speculative_acceptance_rate: Fraction of speculative tokens accepted. Below 0.7 means your draft model is not well-calibrated for this workload — drop speculative decoding.
Setting Up Prometheus + Grafana for SGLang
Step 1: Enable SGLang Metrics Endpoint
Start your SGLang server with the metrics port exposed (default 30000 for metrics, 30001 for the API):
python -m sglang.chat_server \
--model-path meta-llama/Llama-3-8B-Instruct \
--port 30001 \
--metrics-port 30000 \
--chunked-prefill-size 4096 \
--max-running-seqs 256 The --metrics-port exposes http://your-host:30000/metrics in Prometheus format. Scrape it every 10-15 seconds — SGLang metrics are relatively lightweight compared to GPU counters.
Step 2: Prometheus Configuration
scrape_configs:
- job_name: sglang
static_configs:
- targets: [localhost:30000]
metrics_path: /metrics
scrape_interval: 15s
scrape_timeout: 10s If you are running multiple SGLang instances behind a load balancer (common in production), use file_sd_configs with a JSON file updated by your orchestration layer, or service discovery via Kubernetes pod annotations.
Step 3: Key Grafana Panels
KV Cache Hit Rate (RadixAttention)
- Query:
avg(sglang_kvcache_prefix_hit_rate) - Type: Time series with threshold lines at 0.4 (red), 0.6 (yellow), 0.8 (green)
- Alert: below 0.3 sustained for 10 minutes — your workload does not benefit from SGLang's cache architecture
Prefill vs Decode Throughput
- Query:
rate(sglang:num_prefill_tokens_total[5m])andrate(sglang:num_generated_tokens_total[5m]) - Overlay both on the same graph with different Y-axes
- Ratio > 1.0 prefill/decode means you are compute-bound on input processing; ratio < 0.3 means decode-bound
TTFT Latency Percentiles (p50/p95/p99)
- Query:
histogram_quantile(0.50, rate(sglang:time_to_first_token_seconds_bucket[5m]))(repeat for p95, p99) - Alert threshold: p99 > 2s for 8B models on H100 indicates prefill congestion
GPU Memory Utilization
- Query:
sglang:kvcache_usage_ratio(SGLang native, not nvidia-smi) - Alert: above 0.95 for > 5 minutes — risk of OOM kill
- Companion panel:
sglang:available_kvcache_memory_bytesfor capacity planning
The SGLang-native KV cache ratio is the right primary signal; the DCGM exporter side (the same path the GPU monitoring for AI inference guide covers) is the right secondary signal because it surfaces the per-GPU power/thermal/XID-error surface that the application-level cache ratio does not.
Scheduler Queue Depth
- Query:
sglang:num_waiting_tokens - If this spikes while throughput stays flat, you have a prefill bottleneck — add more prefill chunking or reduce
max_running_seqs
Speculative Decoding Acceptance Rate (if enabled)
- Query:
sglang:speculative_acceptance_rate - Below 0.7: disable speculative decoding for this workload
- Above 0.85: consider increasing speculative draft length for bigger gains
Common Production Issues and Detection Patterns
Issue 1: OOM Kills from Undersized KV Cache Allocation
Symptom: SGLang container gets OOM-killed. Available KV cache metric shows 0 bytes in the minutes before crash.
Detection:
# Alert when available memory drops below 500MB for 3 minutes
(sglang_available_kvcache_memory_bytes < 500_000_000)
and (delta(sglang_available_kvcache_memory_bytes[3m]) < 0) Fix: Calculate your per-sequence KV cache requirement: (model_length × 2 × bytes_per_param × num_layers) / block_size. Adjust max_running_seqs or reduce max_model_len to fit your GPU memory.
Issue 2: Prefill Bottleneck on Long-Context Workloads
Symptom: TTFT spikes to 3-5s on requests with context > 16K tokens while decode remains fast.
Detection: Compare sglang:prefill_forward_duration_seconds p95 against sglang:decode_forward_duration_seconds p95. If prefill is 5x decode, you are prefill-bound.
Fix: Increase --chunked-prefill-size (default 4096, try 8192 or 16384) to better pipeline prefill and decode. Also evaluate --prefill_chunk_size at the server level to reduce scheduling overhead for long prompts.
Issue 3: Low Prefix Cache Hit Rate
Symptom: sglang:kvcache_prefix_hit_rate below 0.3 even on multi-turn workloads.
Detection: If your chat workload has variable system prompts (different instructions per user or per session), the RadixAttention tree will be fragmented and hit rates will be low by design.
Fix: Standardize system prompts where possible. If you have per-user system prompts, consider baking them into the base model via fine-tuning rather than using runtime context. Alternatively, use vLLM for workloads with no prefix reuse.
Issue 4: Constrained Decoding Causing Decode Stalls
Symptom: TPOT is normal but overall request latency is high. sglang:constrained_decode_time_seconds shows elevated values.
Detection: Compare sglang:end_to_end_request_latency_seconds against sglang:request_inference_time_seconds. Large gap indicates queue or constraint overhead.
Fix: Simplify your grammar constraints. Deeply nested JSON schemas with many required fields create large state machines. Test constraint overhead in staging before deploying to production.
SGLang vs vLLM vs Ollama: The Practitioner Comparison
| Dimension | SGLang | vLLM | Ollama |
|---|---|---|---|
| KV Cache Architecture | RadixAttention prefix tree, discontinuous cache, fill-in mechanism | Flat PagedAttention blocks, contiguous cache | Simple paging, no prefix tree |
| Best Workload | Multi-turn chat, RAG with repeated prefixes, constrained decoding | High-throughput single-turn batch, speculative decoding, fp8 quantization | Dev/test, small models, single-node simple serving |
| Constrained Decoding | Compiler-level FSM, grammar/regex, JSON schema support | Basic regex only, no grammar | None |
| Speculative Decoding | Supported, tunable acceptance thresholds | First-class support, well-benchmarked on H100 | Not supported |
| Quantization Support | AWQ, GPTQ, FP8 | AWQ, GPTQ, FP8, INT8, INT4, FP8 | Quantized GGUF formats (Q4, Q5, Q8) |
| Multi-Model Serving | Yes, via runtime sharding | Yes, multi-model pipeline batching | Single model per instance |
| Setup Complexity | Medium — requires Python environment, CUDA-aware build | Medium — similar requirements | Low — single binary, no CUDA build |
| Monitoring Maturity | Growing — Prometheus endpoint, but fewer community dashboards | Mature — well-documented metrics, multiple Grafana dashboards available | Basic — Ollama exposes limited metrics, monitoring is thin |
My recommendation after running all three in production: use SGLang when you have multi-turn workloads with repeated system prompts or need grammar-constrained JSON output. Use vLLM when you are optimizing for raw throughput on batch inference or need the more mature speculative decoding support. Use Ollama for local development and one-off experiments where setup time matters more than performance.
The Monitoring Stack at a Glance
The architecture that works for SGLang:
- SGLang Server: exposes
:30000/metricswith native Prometheus format — cache hit rates, prefill/decode phase timing, KV cache utilization, constrained decode overhead - Prometheus: scrape every 15s, alert on KV cache > 0.95, TTFT p99 > 2s, prefix hit rate < 0.3
- Grafana: six key panels — KV cache utilization, prefix hit rate, prefill vs decode throughput, TTFT percentiles, TPOT percentiles, queue depth
If you are migrating from vLLM, the hardest adjustment is learning to interpret kvcache_prefix_hit_rate as your primary efficiency signal instead of the flat gpu_cache_usage metric. Once that clicks, SGLang's performance advantages on the right workload become immediately visible in your dashboards.
Next Steps
To get started with SGLang monitoring:
- Enable the metrics endpoint (
--metrics-port 30000) and point Prometheus at it - Import the six-panel Grafana dashboard template above and let it run for 24 hours to establish baselines
- Correlate
kvcache_prefix_hit_ratewith your workload characteristics — if it is below 0.4 on multi-turn, audit your system prompt patterns - If you are running RAG, instrument
prefill_forward_duration_secondswith backfill vs compute breakdown to identify where retrieval-augmented latency is coming from
CoreWeave offers NVIDIA H100 and B200 GPU instances with SGLang pre-installed and optimized for production inference. Bare metal Kubernetes with RDMA networking for minimal latency. Deploy SGLang in minutes with their GPU-optimized cloud.
Lambda Labs GPU instances for SGLang inference: H100s, A100s, and L40S in multiple regions. SSH access, Jupyter pre-configured, SGLang examples in their model library. Use code STACKPULSAR for 10% off your first month.
Fireworks AI runs SGLang as a first-class hosted inference endpoint — no server management, pay per token. 40+ open-source models available with JSON schema constrained decoding built in. Fastest time-to-production for SGLang if you do not want to operate infrastructure.