-
Notifications
You must be signed in to change notification settings - Fork 292
Add mooncake store for dsv4 and qwen35 #2089
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
Closed
+444
−0
Closed
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
f10eac8
Add Mooncake Store for DeepSeek V4 and Qwen 3.5
alogfans 57969b1
fix: configure mooncake store mnnvl env
Primary33 764124d
fix: tune mooncake store segment size
Primary33 5f94ade
Add notes to mooncake configs
alogfans c1253f4
Merge remote-tracking branch 'origin/main' into add-mooncake-store-fo…
alogfans 28d3bf2
Update PR index
alogfans 95804d9
Merge branch 'main' into add-mooncake-store-for-dsv4-qwen35
alogfans 01267da
Fix malformed perf-changelog entry for mooncake store recipes
Oseltamivir 50ba6fc
Pin dsv4 mooncake recipe to live sglang image (20260520 nightly GC'd)
Oseltamivir c353686
Point qwen3.5 mooncake model path at staged /scratch weights on gb300
Oseltamivir 0e33470
Point qwen3.5 mooncake model path at shared-NFS weights (compute node…
Oseltamivir 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
173 changes: 173 additions & 0 deletions
173
...-slurm-recipes/sglang/deepseek-v4/8k1k/disagg-gb300-1p1d-tp4-tp4-2-c1_mooncake_store.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,173 @@ | ||
| name: "disagg-gb300-1p1d-tp4-tp4-2-c1-mooncake-kvcache" | ||
|
|
||
| # 8k/1k high-throughput topology for the wideep DSV4-Pro setup. | ||
| # | ||
| # Schema/values come from PR #1213 (513cbef) — that PR introduced the | ||
| # `dsv4-pro-gb300-fp4` upstream-style recipe with two `zip_override` | ||
| # variants (wideep [0] / narrow_ep [1]) and `backend.benchmark`. Our | ||
| # pinned srtctl (NVIDIA/srt-slurm @ sa-submission-q2-2026) doesn't | ||
| # support either: `zip_override_*_hightpt` rejects with `Unknown field` | ||
| # and `benchmark` only validates at top level. So this file inlines the | ||
| # wideep [0] override and lifts `benchmark` back out — same operational | ||
| # values, schema the pinned srtctl will accept. | ||
| # | ||
| # Other adjustments back to the InferenceX cluster shape: container & | ||
| # model.path restored to the aliases mapped in launch_gb300.sh's | ||
| # srtslurm.yaml (`lmsysorg/sglang:deepseek-v4-grace-blackwell` and | ||
| # `deepseek-v4-pro`); `dynamo.install: true` added so the container | ||
| # (which has no dynamo baked in) installs from the pinned hash. | ||
| # | ||
| # Cluster-specific items NOT inlined (require InferenceX-side equivalents): | ||
| # - slurm.partition (the source cluster uses `hpc-mid`) | ||
| # - frontend.nginx_container (yangminl's `nginx-1.27.4.sqsh` path) | ||
| # - extra_mount: yangminl/sglang-patched/sglang. Earlier diff analysis | ||
| # showed only `expert_location_dispatch.py` topk_ids int32 cast is an | ||
| # active runtime diff vs container sglang; other patched files are | ||
| # env-gated dead code under the same SGLANG_OPT_* flags this yaml | ||
| # already sets. | ||
| # | ||
| # DG-related env intentionally diverged (DG cache path is host-specific): | ||
| # - SGLANG_DG_CACHE_DIR=/configs/deepgemm_cache (yangminl host) | ||
| # - SGLANG_JIT_DEEPGEMM_PRECOMPILE=0 (yangminl uses prebuilt cache) | ||
| # This yaml uses SGLANG_JIT_DEEPGEMM_FAST_WARMUP=1 instead. | ||
|
|
||
| model: | ||
| path: "deepseek-v4-pro" | ||
| container: "lmsysorg/sglang:nightly-dev-cu13-20260624-b2c8f7a2" | ||
| precision: "fp4" | ||
|
|
||
| # See ../1k1k/disagg-gb200-1p1d-dep8-tep8.yaml for the dynamo pin | ||
| # rationale. Hash bumped from PR #1213 to track the dynamo-sglang dsv4 | ||
| # dev branch. | ||
| dynamo: | ||
| hash: "81d0555ee23519cea80a42b4fe824e30368b7300" | ||
| install: true | ||
|
|
||
| slurm: | ||
| time_limit: "03:00:00" | ||
|
|
||
| # Match yangminl's working all-dynamo.yaml on the source cluster: | ||
| # cpus-per-task=144 — without this slurm hands out 1 CPU/task, which | ||
| # turns the dynamo `hash:` cold source build (~500 rust crates, | ||
| # ravif/exr/zip/pyo3 stack) into a 30+ min serial compile. With 144 | ||
| # cargo finishes in ~5 min. | ||
| # mem=0 — slurm's "give the whole node's memory"; needed | ||
| # for sglang loading 671B FP4 weights + dynamo build at the same | ||
| # time without OOM. | ||
| sbatch_directives: | ||
| cpus-per-task: "144" | ||
| mem: "0" | ||
|
|
||
| # Topology: 7 prefill (TP=4 / DP=4 / EP=4 / 1 node each) + 1 decode | ||
| # (TP=8 / DP=8 / EP=8 / 2 nodes). 9 nodes total. | ||
| resources: | ||
| gpu_type: "gb300" | ||
| gpus_per_node: 4 | ||
| prefill_nodes: 1 | ||
| prefill_workers: 1 | ||
| gpus_per_prefill: 4 | ||
| decode_nodes: 1 | ||
| decode_workers: 1 | ||
| gpus_per_decode: 4 | ||
|
|
||
| frontend: | ||
| type: dynamo | ||
| enable_multiple_frontends: true | ||
| num_additional_frontends: 8 | ||
|
|
||
| backend: | ||
| type: sglang | ||
|
|
||
| # Dedicated mooncake master configuration for kvcache-enabled runs. | ||
| mooncake_kv_store: | ||
| env: | ||
| MOONCAKE_PROTOCOL: "rdma" # remain this even in MNNVL-only | ||
| MOONCAKE_DEVICE: "" | ||
| MOONCAKE_GLOBAL_SEGMENT_SIZE: "800gb" | ||
| MC_FORCE_MNNVL: "1" | ||
|
|
||
| prefill_environment: | ||
| PYTHONUNBUFFERED: "1" | ||
| SGLANG_RADIX_FORCE_MISS: "1" | ||
| SGLANG_JIT_DEEPGEMM_FAST_WARMUP: "1" | ||
| SGLANG_DEFAULT_THINKING: "1" | ||
| SGLANG_DSV4_REASONING_EFFORT: "max" | ||
| SGLANG_OPT_SWA_SPLIT_LEAF_ON_INSERT: "1" | ||
| SGLANG_OPT_SWA_EVICT_DROP_PAGE_MARGIN: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" | ||
| MC_FORCE_MNNVL: "1" | ||
| SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT: "100000" | ||
| SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "100000" | ||
| SGLANG_OPT_SWA_RELEASE_LEAF_LOCK_AFTER_WINDOW: "1" | ||
|
|
||
| decode_environment: | ||
| PYTHONUNBUFFERED: "1" | ||
| SGLANG_RADIX_FORCE_MISS: "1" | ||
| SGLANG_JIT_DEEPGEMM_FAST_WARMUP: "1" | ||
| SGLANG_DEFAULT_THINKING: "1" | ||
| SGLANG_DSV4_REASONING_EFFORT: "max" | ||
| SGLANG_OPT_SWA_SPLIT_LEAF_ON_INSERT: "1" | ||
| SGLANG_OPT_SWA_EVICT_DROP_PAGE_MARGIN: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" | ||
| MC_FORCE_MNNVL: "1" | ||
| SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT: "100000" | ||
| SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "100000" | ||
| SGLANG_OPT_SWA_RELEASE_LEAF_LOCK_AFTER_WINDOW: "1" | ||
| # is single-node only and corrupts results in 2-node decode setups. | ||
|
|
||
| sglang_config: | ||
| prefill: | ||
| served-model-name: "deepseek-ai/DeepSeek-V4-Pro" | ||
| model-path: "/model/" | ||
| trust-remote-code: true | ||
| disable-radix-cache: true | ||
|
|
||
| disaggregation-mode: "prefill" | ||
| disaggregation-transfer-backend: mooncake | ||
|
|
||
| tensor-parallel-size: 4 | ||
| data-parallel-size: 1 | ||
| expert-parallel-size: 1 | ||
|
|
||
| moe-runner-backend: "flashinfer_mxfp4" | ||
| disable-flashinfer-autotune: true | ||
|
|
||
| mem-fraction-static: 0.90 | ||
| max-running-requests: 512 | ||
| cuda-graph-max-bs: 512 | ||
| chunked-prefill-size: 32768 | ||
|
|
||
| decode: | ||
| served-model-name: "deepseek-ai/DeepSeek-V4-Pro" | ||
| model-path: "/model/" | ||
| trust-remote-code: true | ||
| disable-radix-cache: true | ||
|
|
||
| disaggregation-mode: "decode" | ||
| disaggregation-transfer-backend: mooncake | ||
|
|
||
| tensor-parallel-size: 4 | ||
| data-parallel-size: 1 | ||
| expert-parallel-size: 1 | ||
|
|
||
| moe-runner-backend: "flashinfer_mxfp4" | ||
| disable-flashinfer-autotune: true | ||
|
|
||
| mem-fraction-static: 0.9 | ||
| max-running-requests: 1024 | ||
| cuda-graph-max-bs: 512 | ||
| swa-full-tokens-ratio: 0.1 | ||
| context-length: 16384 | ||
|
|
||
| benchmark: | ||
| type: "sa-bench" | ||
| isl: 8192 | ||
| osl: 1024 | ||
| concurrencies: "1" | ||
| req_rate: "inf" | ||
| use_chat_template: false | ||
| custom_tokenizer: "sa_bench_tokenizers.sglang_deepseek_v4.SGLangDeepseekV4Tokenizer" | ||
183 changes: 183 additions & 0 deletions
183
...rm-recipes/sglang/qwen3.5/gb300-fp4/8k1k/disagg/stp/8k1k_stp_maxtpt_1_mooncake_store.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,183 @@ | ||
| # Qwen3.5-397B-A17B-NVFP4 Disaggregated 6P1D wide-EP | ||
| # Prefill: 6 workers @ TP4/DP4/EP4 with DP-attn (per-node, DEP4) | ||
| # Decode: 1 worker @ TP16/DP16/EP16 with DP-attn + TBO (DEP16, 4 nodes) | ||
| # Total: 40 GB300 GPUs (6*4 + 4*4); 8k1k concurrency 5120. | ||
| # | ||
| # Values taken from ni_experiment_config of pareto row | ||
| # qwen3.5-6p_dep4x1d_dep16-fia2a-tbo-cc5120-dynamo-tot-mooncake | ||
| # (sa-qwen-3.5-8k1k-fp4-baseline-mid-pareto study). | ||
|
|
||
| name: "gb300-fp4-qwen3.5_8k1k_maxtpt_1_mooncake_kvcache" | ||
|
|
||
| model: | ||
| path: "qwen3.5-fp4" | ||
| container: "dynamo-sglang" | ||
| precision: "fp4" | ||
|
|
||
| dynamo: | ||
| version: "1.1.0" | ||
|
|
||
| frontend: | ||
| type: dynamo | ||
| enable_multiple_frontends: true | ||
| num_additional_frontends: 2 | ||
| nginx_container: nginx | ||
|
|
||
| resources: | ||
| gpu_type: "gb300" | ||
| gpus_per_node: 4 | ||
| prefill_nodes: 6 | ||
| prefill_workers: 6 | ||
| decode_nodes: 4 | ||
| decode_workers: 1 | ||
|
|
||
| backend: | ||
| type: sglang | ||
|
|
||
| # Dedicated mooncake master configuration for kvcache-enabled runs. | ||
| mooncake_kv_store: | ||
| env: | ||
| MOONCAKE_PROTOCOL: "rdma" # remain this even in MNNVL-only | ||
| MOONCAKE_DEVICE: "" | ||
| MOONCAKE_GLOBAL_SEGMENT_SIZE: "800gb" | ||
| MC_FORCE_MNNVL: "1" | ||
|
|
||
| prefill_environment: | ||
| NO_COLOR: "1" | ||
| TORCH_DISTRIBUTED_DEFAULT_TIMEOUT: "1800" | ||
| SGLANG_ENABLE_SPEC_V2: "1" | ||
| PYTHONUNBUFFERED: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| NCCL_NVLS_ENABLE: "1" | ||
| MC_FORCE_MNNVL: "1" | ||
| SGLANG_ENABLE_JIT_DEEPGEMM: "true" | ||
| SGLANG_ENABLE_FLASHINFER_GEMM: "true" | ||
| SGLANG_FLASHINFER_FP4_GEMM_BACKEND: "cutlass" | ||
| FLASHINFER_DISABLE_VERSION_CHECK: "1" | ||
| SGLANG_DG_CACHE_DIR: "/configs/deepgemm-cache" | ||
| FLASHINFER_WORKSPACE_BASE: "/configs/flashinfer-cache" | ||
| SGLANG_DISAGGREGATION_HEARTBEAT_MAX_FAILURE: "100000" | ||
| SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT: "100000" | ||
| SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "100000" | ||
| SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" | ||
| SGLANG_USE_MESSAGE_QUEUE_BROADCASTER: "0" | ||
| SGLANG_DISABLE_TP_MEMORY_INBALANCE_CHECK: "1" | ||
|
|
||
| decode_environment: | ||
| NO_COLOR: "1" | ||
| TORCH_DISTRIBUTED_DEFAULT_TIMEOUT: "1800" | ||
| SGLANG_ENABLE_SPEC_V2: "1" | ||
| PYTHONUNBUFFERED: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| NCCL_NVLS_ENABLE: "1" | ||
| MC_FORCE_MNNVL: "1" | ||
| MC_TE_METRIC: "true" | ||
| SGLANG_ENABLE_JIT_DEEPGEMM: "true" | ||
| SGLANG_ENABLE_FLASHINFER_GEMM: "true" | ||
| SGLANG_FLASHINFER_FP4_GEMM_BACKEND: "cutlass" | ||
| SGLANG_MOE_NVFP4_DISPATCH: "1" | ||
| SGLANG_CUTEDSL_MOE_NVFP4_DISPATCH: "1" | ||
| SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE: "1" | ||
| SGLANG_NCCL_ALL_GATHER_IN_OVERLAP_SCHEDULER_SYNC_BATCH: "1" | ||
| FLASHINFER_DISABLE_VERSION_CHECK: "1" | ||
| SGLANG_DG_CACHE_DIR: "/configs/deepgemm-cache" | ||
| FLASHINFER_WORKSPACE_BASE: "/configs/flashinfer-cache" | ||
| SGLANG_DISAGGREGATION_HEARTBEAT_MAX_FAILURE: "100000" | ||
| SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT: "100000" | ||
| SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "100000" | ||
| SGLANG_DECODE_BOOTSTRAP_TIMEOUT: "1000" | ||
| SGLANG_HACK_SEQ_BOOTSTRAP_ROOM: "1" | ||
| SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" | ||
| SGLANG_USE_MESSAGE_QUEUE_BROADCASTER: "0" | ||
| SGLANG_DISABLE_TP_MEMORY_INBALANCE_CHECK: "1" | ||
| SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK: "1024" | ||
| SGLANG_HEALTH_CHECK_TIMEOUT: "1800" | ||
| SGLANG_HEALTH_STARTING_OK: "1" | ||
| SGLANG_ENABLE_HEALTH_ENDPOINT_GENERATION: "0" | ||
|
|
||
| sglang_config: | ||
| prefill: | ||
| served-model-name: "nvidia/Qwen3.5-397B-A17B-NVFP4" | ||
| model-path: "/model/" | ||
| trust-remote-code: true | ||
|
|
||
| quantization: "modelopt_fp4" | ||
| kv-cache-dtype: "fp8_e4m3" | ||
|
|
||
| tensor-parallel-size: 4 | ||
| data-parallel-size: 4 | ||
| expert-parallel-size: 4 | ||
| enable-dp-attention: true | ||
| enable-dp-lm-head: true | ||
|
|
||
| mamba-scheduler-strategy: "no_buffer" | ||
| mamba-track-interval: 2048 | ||
| mamba-ssm-dtype: "bfloat16" | ||
|
|
||
| disaggregation-mode: "prefill" | ||
| disable-radix-cache: true | ||
| disaggregation-bootstrap-port: 31000 | ||
| disaggregation-transfer-backend: "mooncake" | ||
|
|
||
| mem-fraction-static: 0.8 | ||
| max-total-tokens: 128000 | ||
| chunked-prefill-size: 65536 | ||
| load-balance-method: "round_robin" | ||
| watchdog-timeout: 1000000 | ||
| log-level: "info" | ||
| page-size: 64 | ||
|
|
||
| attention-backend: "trtllm_mha" | ||
| moe-runner-backend: "flashinfer_trtllm" | ||
| linear-attn-decode-backend: "flashinfer" | ||
|
|
||
| decode: | ||
| served-model-name: "nvidia/Qwen3.5-397B-A17B-NVFP4" | ||
| model-path: "/model/" | ||
| trust-remote-code: true | ||
|
|
||
| quantization: "modelopt_fp4" | ||
| kv-cache-dtype: "fp8_e4m3" | ||
|
|
||
| tensor-parallel-size: 16 | ||
| data-parallel-size: 16 | ||
| expert-parallel-size: 16 | ||
| enable-dp-attention: true | ||
| enable-dp-lm-head: true | ||
| enable-two-batch-overlap: true | ||
|
|
||
| mamba-scheduler-strategy: "no_buffer" | ||
| mamba-track-interval: 128 | ||
| mamba-ssm-dtype: "bfloat16" | ||
|
|
||
| disaggregation-mode: "decode" | ||
| disable-radix-cache: true | ||
| disaggregation-bootstrap-port: 31000 | ||
| disaggregation-transfer-backend: "mooncake" | ||
|
|
||
| chunked-prefill-size: 5120 | ||
| max-mamba-cache-size: 5120 | ||
| max-total-tokens: 3200000 | ||
| max-running-requests: 5120 | ||
| mem-fraction-static: 0.8 | ||
| watchdog-timeout: 1000000 | ||
| page-size: 64 | ||
|
|
||
| attention-backend: "trtllm_mha" | ||
| moe-runner-backend: "flashinfer_cutedsl" | ||
| moe-a2a-backend: "flashinfer" | ||
| disable-shared-experts-fusion: true | ||
| linear-attn-decode-backend: "flashinfer" | ||
|
|
||
| decode-log-interval: 50 | ||
| stream-interval: 50 | ||
|
|
||
| benchmark: | ||
| type: "sa-bench" | ||
| isl: 8192 | ||
| osl: 1024 | ||
| concurrencies: "5120" | ||
| req_rate: "inf" | ||
| random_range_ratio: 0.8 |
Oops, something went wrong.
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.
🟣 The topology comment on lines 61-62 of the new
disagg-gb300-1p1d-tp4-tp4-2-c1_mooncake_store.yamlsays "7 prefill (TP=4 / DP=4 / EP=4 / 1 node each) + 1 decode (TP=8 / DP=8 / EP=8 / 2 nodes). 9 nodes total" but the resources block right below sets a 1P1D TP4/TP4 2-node topology matching the filename. This is a pre-existing stale comment inherited verbatim from the base recipedisagg-gb300-1p1d-tp4-tp4-2-c1.yaml(same line 61); no runtime impact, but worth correcting in-place since this PR is creating a fresh copy of the file.Extended reasoning...
What
Lines 61-62 of the new file
benchmarks/multi_node/srt-slurm-recipes/sglang/deepseek-v4/8k1k/disagg-gb300-1p1d-tp4-tp4-2-c1_mooncake_store.yamlcarry a topology comment that contradicts the recipe it documents:The comment describes a 7P1D 9-node topology; the actual
resources:block declares a 1P1D 2-node topology (matching the filename1p1d-tp4-tp4-2-c1). Thesglang_configfurther down agrees with the block, not the comment: both prefill and decode settensor-parallel-size: 4/data-parallel-size: 1/expert-parallel-size: 1.Origin
The misleading comment is pre-existing — it appears on the same line 61 of the base recipe
disagg-gb300-1p1d-tp4-tp4-2-c1.yaml, from which the mooncake variant was copy-pasted. This PR does not introduce the bug; it only propagates it into a second copy.Impact
None at runtime. srtctl reads
resources:, not the comment. This is purely a documentation/readability issue that can mislead a reviewer or operator glancing at the header to figure out the node budget.Step-by-step proof
resources.prefill_nodes = 1,resources.prefill_workers = 1,resources.gpus_per_prefill = 4→ one 4-GPU (single-node) prefill worker.resources.decode_nodes = 1,resources.decode_workers = 1,resources.gpus_per_decode = 4→ one 4-GPU (single-node) decode worker.1p1d-tp4-tp4-2-c1and the sglang TP=4/DP=1/EP=1 for both roles.Suggested fix
Replace lines 61-62 with something like:
# Topology: 1 prefill (TP=4 / 1 node) + 1 decode (TP=4 / 1 node). 2 nodes total.Worth applying the same fix to the base recipe in a follow-up so the stale comment does not spread further.