Repository navigation
[NVIDIA][AgentX] Move GB300 DSV4.1-Flash Dynamo + SGLang to the bonus-fixed nightlies with prefill-HiCache disagg points and TP4 c1 megakernel / [NVIDIA][AgentX] GB300 DSV4.1-Flash Dynamo + SGLang 升级到含 bonus 修复的 nightly,分离式改用 prefill HiCache,TP4 c1 启用 megakernel #4595
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
cquil11
merged 16 commits into
main
from
weireweire/dsv41flash-gb300-sgl-disagg-hicache
Oct 30, 2026
+91
−120
Merged
Changes from 1 commit
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
f969650
Add GB300 DSV4.1-Flash SGLang DEP16 disagg c7480 points with prefill …
weireweire 7095a6b
Set perf-changelog pr-link to #4595
weireweire 4b5e7d9
Restore historical perf-changelog entries; set only this entry's pr-link
weireweire c0fec90
Merge remote-tracking branch 'origin/main' into dsv41-sgl-disagg-dep1…
weireweire 51247f6
Merge remote-tracking branch 'origin/main' into dsv41-sgl-disagg-dep1…
weireweire e480515
Move the GB300 DSV4.1-Flash Dynamo + SGLang agg row to the 20261028 n…
weireweire 4b1a7a5
Merge remote-tracking branch 'origin/main' into dsv41-sgl-disagg-dep1…
weireweire c1549c1
Move the GB300 DSV4.1-Flash Dynamo + SGLang HiCache disagg key to the…
weireweire eb4a618
Use 9 prefill workers for the c7480 HiCache point
weireweire bb5e630
Name the KV layout, precision and Engram changes against the retired …
weireweire 0c4309b
Merge remote-tracking branch 'origin/main' into dsv41-sgl-disagg-dep1…
weireweire 1b0252f
Move the GB300 DSV4.1-Flash Dynamo + SGLang agg row to the 20261029 n…
weireweire c63fac3
Merge remote-tracking branch 'origin/main' into dsv41-sgl-disagg-dep1…
weireweire 4145e26
Drop the srt-slurm #629 backport patch now that main pins srt-slurm v…
weireweire dead055
Merge remote-tracking branch 'origin/main' into pr4595
cquil11 c6ef640
chore: refresh PR #4595 for sweep reuse [skip-sweep]
cquil11 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
247 changes: 247 additions & 0 deletions
247
...e/srt-slurm-recipes/dsv41flash/sglang/gb300-fp4/agentx/disagg-dep16-hicache-variants.yaml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,247 @@ | ||
| schema: 2 | ||
|
|
||
| base: | ||
| name: dsv41flash-fp4-gb300-dynamo-sglang-agentx-disagg-dep16-hicache | ||
| identity: | ||
| model: {} | ||
| frameworks: | ||
| dynamo: "1.7.0.dev20261026" | ||
| sglang: "0.0.0.dev1+g5884e4fe" | ||
| dynamo: | ||
| install: false | ||
| request_plane: tcp | ||
| event_plane: zmq | ||
| # gb300-nv serves this model from the Hub; read it from the shared mounted cache. | ||
| environment: | ||
| HF_HUB_CACHE: /hf_hub_cache | ||
| # Tachometer's per-node exporters slow decode steps and add head-node host memory; | ||
| # InferenceX does not read its output. | ||
| observability: | ||
| tachometer: | ||
| enabled: false | ||
| slurm: | ||
| time_limit: "6:00:00" | ||
| health_check: | ||
| max_attempts: 1440 | ||
| interval_seconds: 10 | ||
| resources: | ||
| gpu_type: gb300 | ||
| gpus_per_node: 4 | ||
| services: | ||
| - name: etcd | ||
| type: etcd | ||
| placement: | ||
| node: infra | ||
| # Disables Dynamo's per-request lifecycle span export; InferenceX does not read it. | ||
| - name: otel-collector | ||
| type: otel-collector | ||
| enabled: false | ||
| frontend: | ||
| type: dynamo | ||
| enable_multiple_frontends: false | ||
| numa_bind: true | ||
| # One CPU node hosts the frontend, etcd and the AgentX client. | ||
| placement: | ||
| node: dedicated | ||
| env: | ||
| DYN_ROUTER_TEMPERATURE: "0" | ||
| DYN_ROUTER_QUEUE_THRESHOLD: None | ||
| DYN_ROUTER_ACTIVE_REQUEST_EXPIRY_SECS: "3600" | ||
| DYN_TOKENIZER: "fastokens" | ||
| DYN_TOKENIZER_CACHE: "1" | ||
| DYN_TOKENIZER_CACHE_BYTES: "8000000000" | ||
| DYN_TCP_CHANNEL_BUFFER: "128" | ||
| DYN_TCP_REQUEST_TIMEOUT: "60" | ||
| args: | ||
| router-mode: kv | ||
| router-session-affinity-ttl-secs: "14400" | ||
| active-decode-blocks-threshold: "None" | ||
| active-prefill-tokens-threshold: "None" | ||
| active-prefill-tokens-threshold-frac: "None" | ||
| engine: sglang | ||
| roles: | ||
| prefill: | ||
| nodes: 5 | ||
| gpus: 2 | ||
| env: | ||
| PYTHONUNBUFFERED: "1" | ||
| SGLANG_ENABLE_DSV41_ENGRAM_HOST_TABLE: "1" | ||
| SGLANG_DSV41_ENGRAM_HOST_TABLE_LAYOUT: per_rank | ||
| SGLANG_DSV4_KV_LAYOUT: v41_new | ||
| SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT: "3600" | ||
| SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "3600" | ||
| SGLANG_ENABLE_PREFILL_WAR_READ_DONE: "1" | ||
| SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" | ||
| SGLANG_OPT_DEEPGEMM_MEGA_MOE_NUM_MAX_TOKENS_PER_RANK: "65536" | ||
| SGLANG_OPT_DSV41_BF16_INDEX_LOGITS: "1" | ||
| SGLANG_OPT_DSV41_MEGA_MHC_PREFILL: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| MC_FORCE_MNNVL: "1" | ||
| MOONCAKE_PROTOCOL: rdma | ||
| MOONCAKE_DEVICE: "@fabric.rdma-devices" | ||
| MC_ENABLE_DEST_DEVICE_AFFINITY: "1" | ||
| # Some GB300 nodes list a BMC interface with the same address on every node first. | ||
| MC_TCP_BIND_ADDRESS: "{node}" | ||
| WITH_NVIDIA_PEERMEM: "0" | ||
| # Dynamo 1.7 backend admission rejects turns with 529 once a DP rank is full; | ||
| # the prefill scheduler queues them instead. | ||
| DYN_BACKEND_ADMISSION_ENGINE_REQUEST_LIMIT: "10000" | ||
| DYN_BACKEND_ADMISSION_ENGINE_REQUEST_WAITING_LIMIT: "10000" | ||
| DYN_BACKEND_ADMISSION_REQUEST_QUEUE_LIMIT: "10000" | ||
| args: | ||
| served-model-name: deepseek-ai/DeepSeek-V4.1-Flash | ||
| trust-remote-code: true | ||
| tensor-parallel-size: 2 | ||
| tokenizer-backend: fastokens | ||
| router-mode: kv | ||
| router-session-affinity-ttl-secs: "14400" | ||
| data-parallel-size: 2 | ||
| expert-parallel-size: 2 | ||
| enable-dp-attention: true | ||
| enable-dp-lm-head: true | ||
| enable-dp-attention-local-control-broadcast: true | ||
| moe-a2a-backend: megamoe | ||
| dsv4-attn-backend: flashmla_mega | ||
| disaggregation-transfer-backend: mooncake | ||
| chunked-prefill-size: 65536 | ||
| max-prefill-tokens: 32768 | ||
| # 64 per DP rank, as vLLM's prefill max-num-seqs; absorbs the client's turn burst. | ||
| max-running-requests: 128 | ||
| swa-prefix-tails: 2048 | ||
| enable-decoder-swa-bounded-replay: true | ||
| enable-encoder-swa-bounded-replay: true | ||
| # Local host-DRAM tier: device-evicted prefixes reload from host memory off the | ||
| # forward path; an external L3 lookup blocks each layer of the forward. | ||
| enable-hierarchical-cache: true | ||
| hicache-ratio: 1.8 | ||
| hicache-mem-layout: page_first_direct | ||
| hicache-io-backend: direct | ||
| hicache-write-policy: write_back | ||
| mem-fraction-static: 0.85 | ||
| speculative-algorithm: DSPARK | ||
| speculative-dspark-block-size: 5 | ||
| speculative-num-steps: 5 | ||
| reasoning-parser: auto | ||
| tool-call-parser: auto | ||
| watchdog-timeout: 3600 | ||
| enable-metrics: true | ||
| weight-loader-prefetch-checkpoints: true | ||
| weight-loader-drop-cache-after-load: false | ||
| model-loader-extra-config: '{"enable_multithread_load":true}' | ||
| kv_events: true | ||
| decode: | ||
| nodes: 4 | ||
| workers: 1 | ||
| gpus: 16 | ||
| env: | ||
| PYTHONUNBUFFERED: "1" | ||
| # Decode ranks read Engram rows from peer shards instead of a host table. | ||
| SGLANG_OPT_DSV41_ENGRAM_PEER_SHARDS: "1" | ||
| SGLANG_DSV4_KV_LAYOUT: v41_new | ||
| # One gateway process saturates a CPU core serving 16 DP ranks; with 8, one | ||
| # instance stalls at high concurrency. | ||
| DYN_SGL_GATEWAY_WORKERS: "16" | ||
| SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT: "3600" | ||
| SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "3600" | ||
| SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" | ||
| SGLANG_OPT_DEEPGEMM_MEGA_GATE: "1" | ||
| SGLANG_OPT_DEEPGEMM_MEGA_MOE_NUM_MAX_TOKENS_PER_RANK: "16384" | ||
| SGLANG_OPT_DSV41_BF16_INDEX_LOGITS: "1" | ||
| SGLANG_OPT_DSV41_MEGA_MHC_PREFILL: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| MC_FORCE_MNNVL: "1" | ||
| MOONCAKE_PROTOCOL: rdma | ||
| MOONCAKE_DEVICE: "@fabric.rdma-devices" | ||
| MC_ENABLE_DEST_DEVICE_AFFINITY: "1" | ||
| MC_TCP_BIND_ADDRESS: "{node}" | ||
| WITH_NVIDIA_PEERMEM: "0" | ||
| DYN_BACKEND_ADMISSION_ENGINE_REQUEST_LIMIT: "10000" | ||
| DYN_BACKEND_ADMISSION_ENGINE_REQUEST_WAITING_LIMIT: "10000" | ||
| DYN_BACKEND_ADMISSION_REQUEST_QUEUE_LIMIT: "10000" | ||
| args: | ||
| served-model-name: deepseek-ai/DeepSeek-V4.1-Flash | ||
| trust-remote-code: true | ||
| tensor-parallel-size: 16 | ||
| tokenizer-backend: fastokens | ||
| router-mode: round-robin | ||
| load-balance-method: total_tokens | ||
| data-parallel-size: 16 | ||
| expert-parallel-size: 16 | ||
| enable-dp-attention: true | ||
| enable-dp-lm-head: true | ||
| enable-dp-attention-local-control-broadcast: true | ||
| enable-fp32-lm-head: true | ||
| moe-a2a-backend: megamoe | ||
| dsv4-attn-backend: flashmla_mega | ||
| disaggregation-transfer-backend: mooncake | ||
| disaggregation-decode-extra-slots: 256 | ||
| stream-interval: 32 | ||
| swa-prefix-tails: 2048 | ||
| enable-decoder-swa-bounded-replay: true | ||
| mem-fraction-static: 0.85 | ||
| enable-eplb: true | ||
| ep-num-redundant-experts: 16 | ||
| eplb-rebalance-num-iterations: 15000 | ||
| expert-distribution-recorder-buffer-size: 1000 | ||
| speculative-algorithm: DSPARK | ||
| speculative-dspark-block-size: 5 | ||
| speculative-num-steps: 5 | ||
| reasoning-parser: auto | ||
| tool-call-parser: auto | ||
| watchdog-timeout: 3600 | ||
| enable-metrics: true | ||
| weight-loader-prefetch-checkpoints: true | ||
| weight-loader-drop-cache-after-load: false | ||
| model-loader-extra-config: '{"enable_multithread_load":true}' | ||
| kv_events: false | ||
| sbatch_directives: | ||
| mem: "0" | ||
| exclusive: "" | ||
| srun_options: | ||
| container-remap-root: "" | ||
| # Engram host tables need the node's full memory in every worker step. | ||
| mem: "0" | ||
| benchmark: | ||
| placement: | ||
| node: dedicated | ||
| colocate_with_frontend: true | ||
| env: | ||
| AIPERF_HTTP_X_DYNAMO_SESSION_ID_FROM_CORRELATION_ID: "true" | ||
| AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" | ||
| AIPERF_REQUIRED_SERVER_METRIC_PREFIX: "sglang:" | ||
| # The client splits this value on whitespace, so it has none. | ||
| AIPERF_EXTRA_INPUTS: '{"chat_template_kwargs":{"reasoning_effort":"high","thinking":true},"temperature":1}' | ||
| AIPERF_DATASET_MMAP_CACHE_ENABLED: "true" | ||
|
|
||
| override_9p1d_dep2_dep16_c7480: | ||
| name: dsv41flash-fp4-gb300-dynamo-sglang-agentx-disagg-dep16-hicache-9p1d-dep2-dep16-c7480 | ||
| roles: | ||
| prefill: | ||
| # Nine DEP2 workers leave two GPUs of the fifth node idle. | ||
| workers: 9 | ||
| decode: | ||
| args: | ||
| max-running-requests: 2048 | ||
| cuda-graph-max-bs-decode: 128 | ||
|
|
||
| override_10p1d_dep2_dep16_c7480: | ||
| name: dsv41flash-fp4-gb300-dynamo-sglang-agentx-disagg-dep16-hicache-10p1d-dep2-dep16-c7480 | ||
| roles: | ||
| prefill: | ||
| workers: 10 | ||
| decode: | ||
| args: | ||
| max-running-requests: 2048 | ||
| cuda-graph-max-bs-decode: 128 | ||
|
|
||
| override_10p1d_dep2_dep16_b160_c7480: | ||
| name: dsv41flash-fp4-gb300-dynamo-sglang-agentx-disagg-dep16-hicache-10p1d-dep2-dep16-b160-c7480 | ||
| roles: | ||
| prefill: | ||
| workers: 10 | ||
| decode: | ||
| args: | ||
| max-running-requests: 2560 | ||
| cuda-graph-max-bs-decode: 160 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
inferencex-e2e/runners/srt-slurm/patches/629-dynamo-health-instances.patch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| diff --git a/src/srtctl/frontends/dynamo.py b/src/srtctl/frontends/dynamo.py | ||
| --- a/src/srtctl/frontends/dynamo.py | ||
| +++ b/src/srtctl/frontends/dynamo.py | ||
| @@ -12,6 +12,7 @@ import shlex | ||
| import threading | ||
| from typing import TYPE_CHECKING, Any, ClassVar, Literal, cast | ||
|
|
||
| +import requests | ||
| import yaml | ||
|
|
||
| from srtctl.backends.vllm import VLLMBackend | ||
| @@ -42,6 +43,8 @@ logger = logging.getLogger(__name__) | ||
|
|
||
| ROUTER_POLICY_CONFIG_FILENAME = "router_policy_config.yaml" | ||
| ROUTER_POLICY_CONFIG_CONTAINER_PATH = f"/logs/{ROUTER_POLICY_CONFIG_FILENAME}" | ||
| +# Since ai-dynamo/dynamo#16454 (a789babbe3) /health is status-only unless asked for its instance list. | ||
| +HEALTH_INSTANCES_ENDPOINT = "/health?instances=true" | ||
|
|
||
|
|
||
| def _vllm_mode_config(backend: VLLMBackend, mode: str) -> dict[str, Any]: | ||
| @@ -176,9 +179,26 @@ class DynamoFrontend(DynamicFrontend): | ||
| expected_prefill: int, | ||
| expected_decode: int, | ||
| ) -> WorkerHealthResult: | ||
| - """Parse dynamo /health endpoint response.""" | ||
| + """Count the generate instances in a Dynamo /health instance listing (see ``probe_ready``).""" | ||
| return check_dynamo_health(response_json, expected_prefill, expected_decode) | ||
|
|
||
| + def probe_ready( | ||
| + self, host: str, port: int, expected_prefill: int, expected_decode: int, config: Any | ||
| + ) -> WorkerHealthResult: | ||
| + """Count instances from ``/health``, asking ``/health?instances=true`` when it answers status-only. | ||
| + | ||
| + Frontends before ai-dynamo/dynamo#16454 always list instances in ``/health`` and get the one | ||
| + request they always got; newer ones answer ``{"status": "healthy", "stage": "ready"}`` there. | ||
| + """ | ||
| + for endpoint in (self.health_endpoint, HEALTH_INSTANCES_ENDPOINT): | ||
| + response = requests.get(f"http://{host}:{port}{endpoint}", timeout=5.0) | ||
| + if response.status_code != 200: | ||
| + return WorkerHealthResult(ready=False, message=f"{endpoint} returned HTTP {response.status_code}") | ||
| + body = response.json() | ||
| + if "instances" in body: | ||
| + break | ||
| + return self.parse_health(body, expected_prefill, expected_decode) | ||
| + | ||
| def health_expectations(self, config: Any, processes: list["Process"] | None) -> tuple[int, int, str]: | ||
| """Dynamo's /health counts registered generate instances. | ||
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔴 If either 10-prefill c7480 job of a sweep is rerun, the other 10-prefill job's result is dropped. Klaud's coverage check then fails the sweep. Rows
override_10p1d_dep2_dep16_c7480andoverride_10p1d_dep2_dep16_b160_c7480differ only by recipe. They share every field ofagentic_key(infx/results/artifacts.py:123), sosuperseded_attempt_filestreats one as a retry of the other. Fix: give each row its own result identity, e.g. keysuperseded_attempt_filesonrecipe_fingerprintplus conc, the identitycheck_coveragealready uses.Why this was flagged
The two rows at nvidia-master.yaml:9752-9781 have the same prefill (10 x tp2 ep2 dpa), decode (1 x tp16 ep16 dpa), conc 7480, spec mtp and
kv-offload-backend {name: hicache}.agentic_key(infx/results/artifacts.py:123-168) is built only from those fields, so both point results get the same key.superseded_attempt_files(artifacts.py:197-215) drops any file whose rows all have an olderrun_attemptthan the latest attempt for that key. Klaud recovery POSTsrerun-failed-jobs(infx/klaud/lifecycle.py:705) after a failure or preemption, and only the failed job reruns. Say the b160 job reruns as attempt 2 while the b128 point finished in attempt 1.agentic_point_files(artifacts.py:188-194) then discards the b128 file.check_coverage(infx/klaud/validation.py:307-320) expects (recipe_fingerprint, 7480, image) for both rows and raises "Full-sweep result coverage or consistency failed". RESULT_FILENAME adds the recipe fingerprint, which keeps artifact names distinct, but the superseding logic never reads that fingerprint.Verification: The rows
override_10p1d_dep2_dep16_c7480andoverride_10p1d_dep2_dep16_b160_c7480in configs/nvidia-master.yaml differ only insrt-recipe.agentic_key(infx/results/artifacts.py:123-168) leaves outrecipe_fingerprint. On the base branch these rows do not exist, so the failure is new.