dsv4 sglang agentic: enable out-of-window SWA slot release and bump image to nightly-20260707#2112
dsv4 sglang agentic: enable out-of-window SWA slot release and bump image to nightly-20260707#2112cquil11 wants to merge 4 commits into
Conversation
…ge to nightly-20260707 Three changes: 1/2. dsv4_fp4_b200_sglang.sh + dsv4_fp4_b300_sglang.sh: unconditionally export SGLANG_ENABLE_UNIFIED_RADIX_TREE=1 and SGLANG_OPT_UNIFIED_CACHE_FREE_OUT_OF_WINDOW_SLOTS=1 (applies to the hicache jobs; the previously hicache-only unified-tree export is folded in). 3. dsv4-fp4-b200/b300-sglang-agentic-hicache image: v0.5.13-cu130 -> nightly-dev-cu13-20260707-b4155233. Rationale: v0.5.13 predates both sgl-project/sglang#27402 (the slot-release feature, 2026-06-11) and sgl-project/sglang#29860 (fix for SWA eviction tombstoning the last leaf under that flag, 2026-07-02). The 20260707 nightly contains both. Why: with radix cache on, chunked prefill keeps each in-flight request whole- context SWA KV cache-protected, oversubscribing the SWA partition ~5x at conc>=32; allocation then silently evicts idle sessions cached windows and prefix-cache hits fail all-or-nothing. Measured on this repo agentic bench (8xB200, conc32/600s, GPU-only, sglang main 2026-07-04): actual hit 44.5% -> 88.5%, 40.7K -> ~150K tok/s, TTFT 16.8s -> 1.9s, evict storm 3182 -> 0. Correctness: GSM8K 0.970 (200q), long-prefix GSM8K 0.950 (60q, 12K filler), needle-in-haystack exact recall, output-length distributions unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
|
||
| dsv4-fp4-b200-sglang-agentic-hicache: | ||
| image: lmsysorg/sglang:v0.5.13-cu130 | ||
| image: lmsysorg/sglang:nightly-dev-cu13-20260707-b4155233 |
There was a problem hiding this comment.
🔴 This PR bumps the SGLang image tag for dsv4-fp4-b200-sglang-agentic-hicache (line 12683) and dsv4-fp4-b300-sglang-agentic-hicache (line 12705) but does not append a matching entry to perf-changelog.yaml. Per AGENTS.md's "Updating Docker images" section, a changelog entry is required — it's what triggers .github/workflows/run-sweep.yml (which filters on paths: - perf-changelog.yaml). Without it, neither the PR fail-fast sweep nor the post-merge push-to-main sweep will actually run for these two configs, so the ~40K→106K tok/s / TTFT 17s→6s improvements claimed in the PR description will not be reflected in tracked main-branch results.
Extended reasoning...
What the bug is
The PR modifies exactly 3 files: two launcher scripts (benchmarks/single_node/agentic/dsv4_fp4_b{200,300}_sglang.sh) and configs/nvidia-master.yaml. In configs/nvidia-master.yaml it bumps the image for two configs:
dsv4-fp4-b200-sglang-agentic-hicacheat line 12683:lmsysorg/sglang:v0.5.13-cu130→lmsysorg/sglang:nightly-dev-cu13-20260707-b4155233dsv4-fp4-b300-sglang-agentic-hicacheat line 12705: same bump
It also adds two new engine env vars (SGLANG_ENABLE_UNIFIED_RADIX_TREE=1 and SGLANG_OPT_UNIFIED_CACHE_FREE_OUT_OF_WINDOW_SLOTS=1) to both launcher scripts. However, perf-changelog.yaml is not touched at all.
Why this matters — the trigger contract
AGENTS.md (Updating Docker images) is explicit: on an image bump you must "append a perf-changelog.yaml entry (required - triggers benchmarks)". This is not just documentation hygiene — it is the actual trigger:
# .github/workflows/run-sweep.yml
on:
push:
branches: [main]
paths:
- perf-changelog.yaml
pull_request:
paths:
- perf-changelog.yamlBecause the workflow's paths: filter only fires when perf-changelog.yaml is modified, this PR's diff will not cause run-sweep.yml to invoke — despite the full-sweep-fail-fast label being set. The label controls behavior inside the workflow once it runs; it does not cause the workflow to run in the first place.
Concrete step-by-step proof
- Contributor pushes commits touching
configs/nvidia-master.yamland the two.shfiles. - GitHub Actions receives the
pull_requestevent. - Actions consults
run-sweep.yml'son.pull_request.pathsfilter:perf-changelog.yaml— not in the changed file list. - Actions does not schedule the sweep workflow. No matrix job runs; no fail-fast gate exists.
- PR merges (nothing gated it).
pushtomainfires;on.push.pathsfilter again requiresperf-changelog.yaml— again not present. - No post-merge sweep runs against these two configs on the new image. The tracked main-branch performance dashboards keep the old image's numbers.
Precedent — every recent bump followed this convention
Recent image-bump PRs (#2056, #2058, #2060, #2067, #2073, #2074, #2077) all touched both configs/*-master.yaml and appended a perf-changelog.yaml block. That's the workflow this repo relies on.
Fix
Append an entry to perf-changelog.yaml in the same style as the tail of that file — model+precision+SKU, PR number, one-line reason (e.g. "Bump sglang nightly to pick up unified radix-tree out-of-window SWA slot release"), and the two affected config keys (dsv4-fp4-b200-sglang-agentic-hicache and dsv4-fp4-b300-sglang-agentic-hicache). That single addition arms both the PR fail-fast sweep and the post-merge push-to-main sweep.
48cc2e4 to
be39b9f
Compare
… declared fp4 The launcher preferred a node-local /raid NVFP4 checkpoint for dsv4+fp4+sglang while the config declares fp4 (deepseek-ai/DeepSeek-V4-Pro). This silently made sglang benchmark NVFP4 while vLLM benchmarked the declared fp4 (an undeclared, unfair mismatch), and it crashed the flashinfer_mxfp4 low-conc path since the ModelOpt NVFP4 MoE has no fused func registered for it. Remove the swap so sglang runs the declared fp4 checkpoint, matching vLLM and the yaml.
Change
1. Update the SGLang image to a recent nightly
lmsysorg/sglang:v0.5.13-cu130→lmsysorg/sglang:nightly-dev-cu13-20260707-b4155233for the
dsv4-fp4-b200-sglang-agentic-hicacheanddsv4-fp4-b300-sglang-agentic-hicachejobs. The newer build carries recent kernel and runtime updates
2. Enable two engine env vars in the b200/b300 agentic launch scripts
SGLANG_ENABLE_UNIFIED_RADIX_TREE=1— selects the unified radix tree, the cacheimplementation that supports per-component (full-attention / SWA) management for
hybrid-attention models. It was previously exported only inside the hicache branch;
it is now set unconditionally (the duplicate in-branch export is removed).
SGLANG_OPT_UNIFIED_CACHE_FREE_OUT_OF_WINDOW_SLOTS=1— proactively freesout-of-window SWA KV slots during chunked prefill. Without it, in-flight
requests hold SWA KV for their entire context, which keeps the SWA pool under
constant pressure and forces frequent evictions. Most importantly, under LRU
the last-window KV of cached sessions gets flushed as well; since a prefix
match is only valid when that trailing window is present, hits become
bimodal — a session either matches almost fully or not at all — and the
effective prefix-cache hit rate collapses on multi-turn agentic workloads.
Enabling the release removes this pressure at the source.
Perf Comparison
Measured on an 8×B200 single-node reproduction of this agentic benchmark at concurrency 64 DEP =8, No Hicache (600 s trace replay):
Note: reopening this directly rather than from a fork. Original author: @Oasis-Git