experiments: DSV4-Flash EAGLE 3/1/4 + symm-mem two-shot patch (inline dockerfile) - #133
Evrard-Nil wants to merge 1 commit into
Conversation
| <<: *nvidia | ||
| init: true | ||
| volumes: | ||
| - hugginface_cache:/root/.cache/huggingface |
There was a problem hiding this comment.
Spelling error in YAML key: hugginface_cache should be huggingface_cache (missing the second 'g'). Several other compose files in this project (e.g., cleanup-hf-model.yaml, experiments/GLM-5.1-AWQ-4bit.yaml, prod/Qwen3.5-122B.yaml, etc.) use the correctly-spelled huggingface_cache. The cleanup-hf-model.yaml explicitly states the volume name "MUST match the inference compose files" so it resolves to the same <project>_huggingface_cache Docker volume. Because Docker Compose prefixes volume names with the project name, this misspelling creates a separate volume (<project>_hugginface_cache) that the cleanup utility and other services cannot share, leading to cache duplication, wasted disk from orphaned volumes, and ineffective cleanup.
Suggestion:
| - hugginface_cache:/root/.cache/huggingface | |
| - huggingface_cache:/root/.cache/huggingface |
|
|
||
| volumes: | ||
| otelcol_app_storage: | ||
| hugginface_cache: |
There was a problem hiding this comment.
Spelling error in YAML key: the volume declaration hugginface_cache should be huggingface_cache to match the correct spelling used in other compose files (e.g., cleanup-hf-model.yaml, experiments/GLM-5.1-AWQ-4bit.yaml). This declaration and the volume reference on line 21 must both be renamed together for Docker Compose to pick up the correct volume. See the comment on line 21 for full impact analysis.
Suggestion:
| hugginface_cache: | |
| huggingface_cache: |
PierreLeGuen
left a comment
There was a problem hiding this comment.
Additive-only change: one new experiment compose file (739 additions, 0 deletions) touching no existing prod/staging config. docker compose config renders cleanly, the inline dockerfile's Python patch is self-guarding (three assert s.count(anchor) == 1 checks plus a final ast.parse, so any drift in the pinned sglang source fails the build loudly), and model-name/model-path/base-url/SNI references are all internally consistent. Good to merge.
Optional follow-up (non-blocking):
experiments/deepseek-v4-flash-eagle-test.yaml:665— the registrar probes the proxy/v1/modelswithout anAuthorizationheader while the proxy runs withTOKEN=${PROXY_TOKEN}; if the proxy enforces that token, readiness will exhaust its retries before registering. Worth confirming the probe matches the prod registrar pattern (PROXY_TOKENenv +-H "Authorization: Bearer $$INFERENCE_TOKEN").
Checks: docker compose config passes with dummy env; registrar script and full YAML diff cleanly against the on-main sibling deepseek-v4-flash-int4-autoround-test.yaml (only expected model/host/domain/engine substitutions); validate_otel_labels.rb, validate_proxy_dependencies.rb, validate_proxy_environment.rb, validate_registrar_auth.rb all pass. Image build / end-to-end serving not run (requires pinned sglang base + GPU CVM).
|
Exact with/without-patch numbers (requested A/B, run 2026-07-08 on the recovered dev CVM): sequential same-GPU-pair A→B→A′ protocol on GPUs 0,1, identical prod-digest image + EAGLE 3/1/4 config, arm B = this PR's inline patch +
Verdict:
This upgrades the patch from "enablement-only" to a measurable concurrency win on DSV4 TP2, and strengthens the TP4/TP8 expectation (more ranks, more AR share). Raw results: 🤖 Generated with Claude Code |
What
New experiment conf
experiments/deepseek-v4-flash-eagle-test.yaml: DeepSeek-V4-Flash served with EAGLE 3/1/4 MTP spec-decode plus the torch symm-mem two-shot allreduce fallback patch, applied as an inline dockerfile on top of the exact v0.5.14 digest prod pins (sha256:5027e95b…). Modeled onexperiments/deepseek-v4-flash-int4-autoround-test.yaml(full stack: nginx / vllm-proxy / registrar / dcgm / otel), registering asdeepseek-ai/DeepSeek-V4-Flash-EAGLEon SNIdsv4-flash-eagle.completions.near.ai. TP2 on GPUs 0,1.Why (validated on gpu02 dev CVM, 2026-07-06/07 — full detail in Notion "dsv4 work doc")
EAGLE 3/1/4, deliberately WITHOUT
--speculative-adaptive:--speculative-adaptiveis condemned on 0.5.14: 2/2 CUDA illegal-memory-access crashes under c1↔c8 burst soaks (two different GPU pairs); upstream #25715 does not backport (fixes a main-only refactor). Cost of no-adaptive: c4 −26%/req during rare bursts — prod DSV4 averages ~1.08 running requests.Inline patch = sgl-project/sglang#30364 (submitted upstream from this work): sglang's
TorchSymmMemCommunicatorhard-disables itself whenever NVLS/multicast is unavailable — which is always on our fleet (the driver zeroesMULTICAST_SUPPORTEDunder CC modes) — even though its two-shot kernel only needs P2P. The patch gates multicast on the multimem path only and falls back to two-shot;--enable-torch-symm-memthen engages (kernel=two_shot). Anchored-replace with loud assert failures +ast.parsecheck, GLM-#28305 inline-patch style; drop the patch when the upstream PR ships in a release.Note on expectations: on DSV4 TP2 the symm-mem path measured perf-neutral (AR is only ~2.2 ms / 12.5% of the decode step; two-shot 6.3 µs vs NCCL-in-graph 25.1 µs drowns in wrapper staging + noise) — the experiment's decode win comes from EAGLE. The patch is included to soak the two-shot path on a CVM as groundwork for TP4/TP8 models, where the AR bucket is larger. Fusion-on-IPC (flashinfer) is explicitly out of scope — op-level validated only, its sglang integration isn't.
Validation
docker compose configpasses (gpu02 host) with the inline dockerfile + heredoc surviving interpolation.ast.parsepasses, result is semantically identical to the upstream PR diff.TorchSymmMemCommunicator: enabled (kernel=two_shot, max_size=67108864)at init, correct outputs, stable generation.Deploy notes
Decode batch … accept len:in sglang logs to confirm spec engagement, and thekernel=two_shotinit line for the patch.MIN_TAG_AGE_HOURS(backdated tag) when deploying via compose-manager.🤖 Generated with Claude Code