Skip to content

feat(agentx): add Muse Spark Open GB200 SGLang DFlash2 AgentX config - #4140

Merged
functionstackx merged 6 commits into
mainfrom
feat/musespark-gb200-agentx
Oct 16, 2026
Merged

functionstackx merged 6 commits into
mainfrom
feat/musespark-gb200-agentx

Conversation

@cquil11

@cquil11 cquil11 commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Muse Spark Open (meta-models/Muse-Spark-Open-816B-A42B-NVFP4) AgentX on one GB200 node: SGLang lmsysorg/sglang:dev-muse-spark-open (digest-pinned), TP4/EP4, DFlash2 draft RadixArk/Muse-Spark-Open-DFlash2 with 8 verify tokens, HiCache host KV offload (120 GB per rank), concurrency 1 to 32.

  • Serve flags follow the SGLang cookbook's NVFP4 cell. The 133 GB of weights per GPU leave little HBM, so prefill CUDA graphs are off (they took ~16 GB per GPU on B200) and mem-fraction-static is 0.88, which gives a 1.7M-token KV pool.
  • HiCache matters on this corpus: without it, c24/c32 thrash the GPU pool (prefix hit ~14%) and fall to ~9.7k tok/s/GPU (GPU-resident sweep); with it c32 reaches 30.2k tok/s/GPU at a 90% prefix hit.
  • The checkpoint is served from the staged copy on Lustre (models.entries + single-node-models: staged for gb200-nv; no other gb200 single-node model has a staged entry, so their Hub path is unchanged). The AgentX client reads the tokenizer from /model, since the gated Hub repo is not readable with the CI token.
  • Synthetic acceptance uses the committed musespark_dflash curve. The srt connector now derives DFlash's draft length from --speculative-num-draft-tokens minus the verify token (DFlash leaves speculative-num-steps at 1), so 8 verify tokens select AL 4.05; the server reports accept len ~4.05. The connector and single-node dflash allowance are the same hunks as [Klaud Cold] Add Muse Spark Open MXFP4 MI355X SGLang DFlash2 AgentX recipe / [Klaud Cold] 新增 Muse Spark Open MXFP4 MI355X SGLang DFlash2 AgentX 配方 #4127.

Validation

Sweep 38834513220 on 5b0708723: 10/10 AgentX points and the GSM8K eval succeeded (GSM8K strict 0.976). All 10 points are on the throughput/interactivity frontier.

Conc Total tok/s/GPU Interactivity p50 (tok/s/user) TTFT p50 (s)
1 4,328 401.5 0.39
2 5,107 397.4 0.41
4 6,312 329.7 0.40
6 8,231 295.4 0.45
8 10,309 268.8 0.47
10 13,674 249.8 0.71
12 16,913 217.2 0.50
16 21,161 189.6 0.59
24 29,132 132.3 0.90
32 30,212 106.6 5.71

Serve meta-models/Muse-Spark-Open-816B-A42B-NVFP4 on one GB200 node at
TP4/EP4 from the staged Lustre checkpoint with the DFlash2 draft, and let
the srt connector derive DFlash's draft length from its verify width.
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution!

  • Review: If this PR changes files owned by someone other than a repository admin or @SemiAnalysisAI/core, ask one eligible CODEOWNER to complete the latest PR_REVIEW_CHECKLIST.md before contacting a core maintainer on Slack. Follow the template exactly, including As a PR reviewer and CODEOWNER, I have reviewed this and have, so sign-off verification triggers.
  • PR verification: Sweeps run only when the PR appends an inferencex-e2e/perf-changelog.yaml entry and carries exactly one primary label: full-sweep-fail-fast (strongly recommended; canary plus per-matrix fail-fast), full-sweep-enabled (canary; matrix jobs continue after a failure), or non-canary-full-sweep-enabled (no canary or fail-fast). The modifiers all-evals, evals-only, and agentx-fast require a primary label. On fork PRs, a maintainer applies the label. See sweep labels and reuse.
  • After merging: PR authors must ensure all GitHub Actions jobs pass. Transient failures often pass on rerun; see how to rerun failed jobs.
中文

感谢你的贡献!

  • **审阅:**如果 PR 修改的文件归属于仓库管理员及 @SemiAnalysisAI/core 之外的 CODEOWNER,请先联系一位有资格的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,再通过 Slack 联系核心维护者。必须严格遵循模板,并保留 As a PR reviewer and CODEOWNER, I have reviewed this and have,才能触发签核验证。
  • **PR 验证:**只有当 PR 在 inferencex-e2e/perf-changelog.yaml 末尾追加了条目,并且恰好带有一个主标签时,才会运行扫描:full-sweep-fail-fast(强烈推荐;canary 加逐矩阵 fail-fast)、full-sweep-enabled(有 canary;矩阵任务在失败后继续运行)或 non-canary-full-sweep-enabled(无 canary,也无 fail-fast)。修饰标签 all-evals、evals-only 和 agentx-fast 必须与主标签一起使用。fork PR 的标签由维护者添加。参见扫描标签与复用。
  • **合并后:**PR 作者必须确保所有 GitHub Actions 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

@cquil11
cquil11 marked this pull request as ready for review October 15, 2026 23:34
@cquil11
cquil11 requested a review from a team October 15, 2026 23:34
@cquil11 cquil11 added the non-canary-full-sweep-enabled Run the full sweep without the canary gate (full search space, no trim) label Oct 15, 2026
@claude

claude Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @cquil11's task in 1m 3s —— View job


Review: Muse Spark Open GB200 SGLang DFlash2 AgentX

  • Read the diff and context
  • Check the master config, recipe, connector, runner and changelog
  • Post findings

🟡 1 issue (2 inline comments). The changelog commit replaced the pull/XXX placeholders in two older, unrelated entries with pull/4140:

The validator accepts pr-link-only corrections, so CI won't flag this, but those results would be credited to this PR. Revert the two lines or point them at their real PRs.

Everything else checks out:

  • single-node-models: staged on gb200-nv: the only other GB200 single-node config is dsv41flash, which has no staged entry, so it keeps the Hub path.
  • DFlash in the connector: 8 verify tokens resolve to 7 draft tokens. In validate_recipe, matrix draft_model maps to mtp, the same as the recipe's speculation.
  • Changelog entry: appended at the end of the file.
  • Image: public and pinned by digest.
  • MODELS.md: updated for the new model.

Comment thread inferencex-e2e/perf-changelog.yaml Outdated
- "Topology: 1 prefill node (TP8) + 1 decode node (TP8), each 8xB200 exclusive; TileRT decode is bs=1 only so conc-list is a single point [1], ISL 1k/8k OSL 1k"
- "Runner: launch_b200-dgxc.sh tilert early-return branch (zero impact on the dynamo path); tilert_utils/submit.sh issues two srun --ntasks=1, one per role, because prefill and decode need different container images; roles are dispatched by the TILERT_ROLE it exports, and torn down across nodes via a sentinel file on the shared /workspace"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/4140

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 WARNING: This entry's XXX placeholder now points to #4140. The entry is the TileRT glm5.1-fp8-b200-tilert entry from #2533 (commit 077d483), not Muse Spark. It looks like a blanket XXX→4140 replace in commit a107f97 caught it.
Why it matters: The changelog is the historical record, and ingest/recovery tooling uses pr-link to attribute results. These TileRT results would be credited to this PR.
Fix: Revert this line, or correct it to the real PR:

Suggested change
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/4140
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2533

Comment thread inferencex-e2e/perf-changelog.yaml Outdated
- "Apply the point-specific prefill-decode interval, prefill chunking, admission, memory and SWA prefix-tail settings from the single-node recipe; all points use the default fcfs schedule policy."
- "No data-type or precision change to the DSpark draft: the bundled draft of deepseek-ai/DeepSeek-V4.1-Flash runs as shipped with block size 5."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/4140

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 WARNING: Same problem as the TileRT entry. This is the dsv41flash-fp4-gb200-sglang-agentic-dspark refresh from #3927 (commit 2b97216), not this PR.
Why it matters: The DSV4.1-Flash GB200 SGLang results would be attributed to #4140.
Fix:

Suggested change
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/4140
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3927

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked two more things beyond the inline finding, and neither is a problem:

  • Setting single-node-models: staged for gb200-nv changes only this config. The other gb200-nv single-node configs, the two dsv41flash ones, serve DeepSeek-V4.1-Flash, and the gb200-nv models.entries list has no entry for it, so they still load from hf:.
  • The changelog's "AL 4.05" is right: 8 verify tokens minus 1 gives num_speculative_tokens 7, and the committed musespark_dflash.yaml maps 7 to 4.05. The 3.4 value is only in the test fixture.
Extended reasoning...

The change adds a single-node GB200 SGLang DFlash2 agentic config: recipe, master config, a runners.yaml staged entry, a DFlash branch in synthetic_acceptance, a test and a changelog block. In the cluster record, single_node_model_path uses a staged path only when checkpoint() finds an entry whose name matches the model basename, and no other gb200-nv single-node model has one. The real golden curve's key 7 is 4.05, which matches what the PR description says.

Comment thread inferencex-e2e/perf-changelog.yaml Outdated
- "Apply the point-specific prefill-decode interval, prefill chunking, admission, memory and SWA prefix-tail settings from the single-node recipe; all points use the default fcfs schedule policy."
- "No data-type or precision change to the DSpark draft: the bundled draft of deepseek-ai/DeepSeek-V4.1-Flash runs as shipped with block size 5."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/4140

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Changelog validation in CI will fail for this PR, and two older entries would point at #4140 although it did not make those changes. Lines 5598 and 9727 change historical pr-link: .../pull/XXX lines in the same diff that appends the new block. compare_entries rejects that mix with "do not mix historical pr-link corrections with new changelog entries". Fix: restore both historical pr-link lines byte-for-byte so the only change is the appended musespark block. Any XXX placeholder fixes belong in their own correction-only change that uses each entry's real PR number.

Why this was flagged

The diff appends a new entry at the end of inferencex-e2e/perf-changelog.yaml. It also changes two existing entries' pr-link from pull/XXX to pull/4140: the TileRT entry at line 5598 and the dsv41flash-fp4-gb200-sglang-agentic-dspark entry at line 9727. In infx/workflows/validate_perf_changelog.py:compare_entries (lines 184-190), each changed pr-link counts as a correction. When there are both corrections and additions, it raises ChangelogValidationError("do not mix historical pr-link corrections with new changelog entries"). validate_raw_change (lines 205-210) would reject the file too, because head_raw no longer starts with base_raw. That breaks AGENTS.md:140 ("append-only and byte-sensitive ... Preserve all existing bytes"). Even if this got past CI, the TileRT and DSpark entries would now link to PR #4140, which did not make them. #4140 would then show up in three blocks, against the one-block-per-PR rule at AGENTS.md:141. On the base branch those entries keep their XXX placeholders and the validator passes.

Verification: At inferencex-e2e/perf-changelog.yaml lines 5598 and 9727 the diff changes pr-link: .../pull/XXX to .../pull/4140 in existing entries and also appends a new musespark block. In inferencex-e2e/infx/workflows/validate_perf_changelog.py lines 186-190, compare_entries raises "do not mix historical pr-link corrections with new changelog entries" when both are present.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

@functionstackx

Copy link
Copy Markdown
Collaborator

/use 38834513220

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

@functionstackx staged run 38834513220.

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

@functionstackx
functionstackx merged commit c08eb51 into main Oct 16, 2026
25 checks passed
@functionstackx
functionstackx deleted the feat/musespark-gb200-agentx branch October 16, 2026 03:14
@nvpohanh

Copy link
Copy Markdown
Collaborator

[by Claude Code] The SGLang cookbook integration of this PR's AgentX config (musespark-fp4-gb200-sglang-agentic-dflash) will happen in sgl-project/sglang#44654, in the Agentic Long-Context Deployment section of the Muse Spark Open cookbook page.

The commands mirror the launch measured in run 38834513220, pinned by this PR's /use comment.

@nvpohanh

Copy link
Copy Markdown
Collaborator

[by Claude Code] sgl-project/sglang#44654 has been merged. This PR's AgentX config (musespark-fp4-gb200-sglang-agentic-dflash) is now in the Agentic Long-Context Deployment section of the SGLang Muse Spark Open cookbook: https://docs.sglang.io/cookbook/autoregressive/Meta/MuseSparkOpen#agentic-long-context-deployment

The commands mirror the launch measured in run 38834513220, pinned by this PR's /use comment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

non-canary-full-sweep-enabled Run the full sweep without the canary gate (full search space, no trim)

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants