Skip to content

[Klaud Cold] minimaxm3-fp8-h200-vllm-agentic-mtp: MiniMax-M3 H200 AgentX EAGLE3 recipe with golden-AL synthetic acceptance / MiniMax-M3 H200 AgentX EAGLE3 配方(黄金 AL 合成接受) - #2424

Open
functionstackx wants to merge 4 commits into
mainfrom
feat/minimaxm3-fp8-h200-agentic-mtp
Open

[Klaud Cold] minimaxm3-fp8-h200-vllm-agentic-mtp: MiniMax-M3 H200 AgentX EAGLE3 recipe with golden-AL synthetic acceptance / MiniMax-M3 H200 AgentX EAGLE3 配方(黄金 AL 合成接受)#2424
functionstackx wants to merge 4 commits into
mainfrom
feat/minimaxm3-fp8-h200-agentic-mtp

Conversation

@functionstackx

@functionstackx functionstackx commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds minimaxm3-fp8-h200-vllm-agentic-mtp — the EAGLE3 speculative-decoding (spec-decoding: mtp) variant of the MiniMax-M3 MXFP8 H200 AgentX recipe. One new benchmark script, one master-config entry, one changelog entry; no launcher change is needed (launch_h200-dgxc-slurm.sh already composes agentic/ + _mtp).

Speculative configmethod: eagle3 on Inferact/MiniMax-M3-EAGLE3, num_speculative_tokens: 3, drafter pinned to FLASH_ATTN (the EAGLE3 head is MHA; FlashInfer only serves the mandatory page size 128 via its trtllm-gen kernel, which needs GQA/MQA). Same draft and level as every merged MiniMax-M3 MTP recipe.

Synthetic forced AL — throughput runs set rejection_sample_method: synthetic with synthetic_acceptance_length: 2.83, the committed golden AL for MiniMax-M3 EAGLE3 at K=3, thinking_on (golden_al_distribution/minimaxm3_eagle3.yaml). Per the AgentX policy in golden_al_distribution/README.md, a submission may choose any supported draft length but may not substitute a different acceptance target. The separate minimaxm3_eagle3_gqa.yaml curve belongs to the Inferact/MiniMax-M3-EAGLE3-GQA draft (run 29784780049) and is not mixed in. EVAL_ONLY runs drop synthetic acceptance and keep real verification, since synthetic acceptance commits drafted tokens regardless of the target logits and would score the eval at ~0.

Serve shape is otherwise identical to the non-MTP agentic sibling (Mooncake host-DRAM KV offload, --block-size 128, --language-model-only, --kv-cache-dtype fp8, --attention-backend TRITON_ATTN, minimax_m3 parsers, vllm-router for DP-attention) so the spec-decode delta is readable at equal concurrency. max-num-seqs stays 2*CONC for AgentX subagent fan-out; cudagraph capture is raised to MAX_NUM_SEQS*(1+3) tokens because vLLM's FULL_DECODE_ONLY ladder is token-denominated.

Search space covers three arms (TP8 and TP8/EP8 GPU-resident, TP8/EP8 Mooncake) on the AgentX MTP concurrency grid: GPU-resident rows [1, 4, 8, 12, 16], KV-offload rows [4, 8, 12, 16]. Every step is at least 2 concurrency apart and every arm stops hard at conc 16 — single-step sampling cannot separate configurations by more than run-to-run noise on the agentic corpus, and past 16 these SKUs are into the post-HBM-cliff thrashing regime the non-MTP sweeps already characterized. 14 generated jobs.

Validation: bash -n clean; both YAMLs parse; generate_sweep_configs.py test-config emits 14 agentic-coding configs with spec-decoding: mtp and the expected TP/EP/KV arms.

中文说明

新增 minimaxm3-fp8-h200-vllm-agentic-mtp:MiniMax-M3 MXFP8 H200 AgentX(智能体编码)配方的 EAGLE3 投机解码(spec-decoding: mtp)变体。包含一个新的基准测试脚本、一条 master 配置条目和一条 changelog 条目;启动器无需改动(launch_h200-dgxc-slurm.sh 已能拼出 agentic/ + _mtp 路径)。

投机解码配置method: eagle3,草稿头 Inferact/MiniMax-M3-EAGLE3num_speculative_tokens: 3,drafter 固定 FLASH_ATTN(EAGLE3 头是 MHA,而 FlashInfer 仅通过要求 GQA/MQA 的 trtllm-gen kernel 支持强制的 page size 128)。与仓库中所有已合并的 MiniMax-M3 MTP 配方使用相同的草稿头与投机层数。

合成强制 AL:吞吐量测试设置 rejection_sample_method: syntheticsynthetic_acceptance_length: 2.83,即 MiniMax-M3 EAGLE3 在 K=3、thinking_on 下已提交的黄金 AL(golden_al_distribution/minimaxm3_eagle3.yaml)。依据 golden_al_distribution/README.md 的 AgentX 规则,提交方可自选草稿长度,但不得替换接受长度目标。minimaxm3_eagle3_gqa.yaml 对应的是 Inferact/MiniMax-M3-EAGLE3-GQA 草稿头(run 29784780049),两条曲线不混用。EVAL_ONLY 场景关闭合成接受、保留真实验证,否则生成文本错误、评估分数接近 0。

服务参数与非 MTP 版本完全一致(Mooncake 主机 DRAM KV 卸载、--block-size 128--language-model-only--kv-cache-dtype fp8--attention-backend TRITON_ATTNminimax_m3 解析器、DP-attention 下的 vllm-router),便于在相同并发下直接对比投机解码带来的差异。max-num-seqs 保持 2*CONC 以容纳 AgentX 子智能体扇出;cudagraph 捕获上限提高到 MAX_NUM_SEQS*(1+3)token,因为 vLLM 的 FULL_DECODE_ONLY 阶梯是按 token 计的。

搜索空间覆盖三条分支(TP8 与 TP8/EP8 GPU 常驻、TP8/EP8 Mooncake),并采用 AgentX MTP 并发网格:GPU 常驻 [1, 4, 8, 12, 16],KV 卸载 [4, 8, 12, 16]。相邻并发间隔至少为 2,且一律止于并发 16 —— 在智能体语料上,逐 1 采样无法区分出超过运行间噪声的差异;而并发超过 16 后,这些 SKU 已进入非 MTP 扫描早已刻画过的显存瓶颈后抖动区间。共生成 14 个作业。

验证bash -n 通过;两个 YAML 均可解析;generate_sweep_configs.py test-config 生成 14 条 agentic-coding 配置,spec-decoding: mtp 与 TP/EP/KV 分支均符合预期。

🤖 Generated with Claude Code


Revision (post-first-sweep)

  1. --gpu-memory-utilization 0.90. The first agentic job on [Klaud Cold] minimaxm3-fp8-h100-vllm-agentic-mtp: MiniMax-M3 H100 AgentX EAGLE3 recipe with golden-AL synthetic acceptance / MiniMax-M3 H100 AgentX EAGLE3 配方(黄金 AL 合成接受) #2423 (TP8/EP8 c9, run 30515793863) died mid-warmup: all 8 ranks raised torch.OutOfMemoryError 96 MiB short, killing the engine core (EngineDeadError) and tripping AIPerf's terminal warmup failure. The recipe had inherited the non-MTP agentic sibling's gmu, which has no draft head to house; the proven MTP sibling on each of these SKUs runs 0.90 (explicit on H100/H200, vLLM's default on the ROCm ones). Applied to all four MiniMax PRs.
  2. Concurrency grid. Steps of at least 2 and a hard stop at conc 16, replacing the dense integer sampling copied from the STP siblings.

中文:(1) --gpu-memory-utilization 改为 0.90 —— #2423 的首个智能体作业(TP8/EP8 c9,run 30515793863)在预热阶段 8 个 rank 全部 OOM(仅差 96 MiB),导致 engine core 崩溃并触发 AIPerf 终止性预热失败;此前沿用了非 MTP 版本的取值,而该版本无需为草稿头预留显存,各 SKU 上已验证的 MTP 配置均为 0.90。四个 MiniMax PR 均已修正。(2) 并发网格:相邻间隔至少为 2,且一律止于 16。

…n-AL synthetic acceptance

Add minimaxm3-fp8-h200-vllm-agentic-mtp, the spec-decoding=mtp variant of the
MiniMax-M3 MXFP8 H200 agentic-coding recipe: Inferact/MiniMax-M3-EAGLE3 draft
head, 3 speculative tokens, FLASH_ATTN drafter, and synthetic acceptance pinned
to the committed golden AL 2.83 (minimaxm3_eagle3.yaml, thinking_on, K=3).
EVAL_ONLY keeps real target verification. Serve shape, Mooncake offload and
search-space arms mirror the non-MTP sibling, trimmed at the top concurrencies.

中文:新增 minimaxm3-fp8-h200-vllm-agentic-mtp,即 MiniMax-M3 MXFP8 H200 智能体
编码配方的投机解码(spec-decoding=mtp)变体:Inferact/MiniMax-M3-EAGLE3 草稿头、
3 个投机 token、drafter 固定为 FLASH_ATTN,合成接受长度固定为黄金 AL 2.83
(minimaxm3_eagle3.yaml,thinking_on,K=3)。EVAL_ONLY 保留真实目标验证。服务参数、
Mooncake KV 卸载与搜索空间沿用非 MTP 版本,仅在高并发端裁剪。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@functionstackx
functionstackx requested a review from a team July 30, 2026 05:09
中文:补充 perf-changelog 中 #2424 的 pr-link。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

@functionstackx

Copy link
Copy Markdown
Collaborator Author

Draft-head note for reviewers. This recipe uses Inferact/MiniMax-M3-EAGLE3 with golden AL 2.83 (minimaxm3_eagle3.yaml, thinking_on, K=3), matching the fixed-seq-len MTP sibling on this same SKU.

Worth knowing: #2337 (merged 2026-07-29) moved B200/B300 fp8 to the Inferact/MiniMax-M3-EAGLE3-GQA head, with the drafter backend going TRITON_ATTN → FLASH_ATTN and K kept at 3. The Hopper and gfx942 fixed-seq-len MTP recipes were not part of that swap and still run the non-GQA head, so this PR follows them — draft and curve stay matched, which is the part that matters for the AgentX contract. If you want the Hopper/ROCm SKUs to follow Blackwell onto the GQA head, it is a two-line change here: the draft id, and AL 2.83 → 2.78 (minimaxm3_eagle3_gqa.yaml, thinking_on, K=3). Say the word and I will make that swap before the sweep spends much more GPU time.

中文:本配方使用 Inferact/MiniMax-M3-EAGLE3 草稿头,黄金 AL 为 2.83minimaxm3_eagle3.yaml,thinking_on,K=3),与同 SKU 的固定序列长度 MTP 配方保持一致。

需要说明的是:#2337(2026-07-29 合并)已将 B200/B300 fp8 切换到 Inferact/MiniMax-M3-EAGLE3-GQA 草稿头,drafter 注意力后端由 TRITON_ATTN 改为 FLASH_ATTN,K 仍为 3。Hopper 与 gfx942 的固定序列长度 MTP 配方未包含在该次切换中,仍使用非 GQA 草稿头,因此本 PR 与之保持一致 —— 关键在于草稿头与 AL 曲线相互匹配,这正是 AgentX 规则所要求的。若希望 Hopper/ROCm SKU 也跟随 Blackwell 切到 GQA 草稿头,只需改两处:草稿头 ID,以及 AL 2.83 → 2.78(minimaxm3_eagle3_gqa.yaml,thinking_on,K=3)。如需切换请告知,我会在扫描消耗更多 GPU 前完成。

@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.

Beyond the inline pr-link finding, I also checked whether the GPU-resident search-space arms (conc-list ending ...11, 12, 14, 16) silently skip conc=13 as a bug — it's consistent with how these lists are manually curated per arm (the non-MTP sibling's list also omits conc=3), not a generation defect, so I'm not flagging it.

Extended reasoning...

Bugs were already found and reported inline (perf-changelog.yaml pr-link left as TBD), which already signals this PR needs human attention before merge. I independently confirmed that finding against git show HEAD:perf-changelog.yaml, which does show pr-link: TBD as the last line, consistent with the inline report. Beyond that, I reviewed the candidate issue that finder agents raised and verifiers ruled out (GPU-resident search-space arms silently skipping conc=13 in configs/nvidia-master.yaml) and confirmed it is a benign, manually-curated concurrency list rather than a bug, matching the pattern of gaps already present in the non-MTP sibling entry. I'm posting this brief note only to record that this specific candidate was checked, per the exception process for bugs-found reviews.

Comment thread perf-changelog.yaml Outdated
- "Speculative config: method eagle3 on the Inferact/MiniMax-M3-EAGLE3 draft head, num_speculative_tokens 3, drafter pinned to attention_backend FLASH_ATTN -- the same draft, level and pin as the merged MiniMax-M3 CUDA MTP recipes (the EAGLE3 head is MHA and FlashInfer only serves the mandatory page size 128 through its GQA/MQA-only trtllm-gen kernel)."
- "Throughput runs pin rejection_sample_method synthetic with synthetic_acceptance_length 2.83 -- the committed golden AL for MiniMax-M3 EAGLE3 at K=3, thinking_on (golden_al_distribution/minimaxm3_eagle3.yaml), per the AgentX policy in golden_al_distribution/README.md. The minimaxm3_eagle3_gqa.yaml curve was measured against the Inferact/MiniMax-M3-EAGLE3-GQA draft (run 29784780049) and is not mixed in. EVAL_ONLY runs drop synthetic acceptance and keep real target verification."
- "Serve shape is otherwise identical to the non-MTP agentic sibling (Mooncake host-DRAM KV offload, --block-size 128, --language-model-only, --kv-cache-dtype fp8, --attention-backend TRITON_ATTN, gpu-memory-utilization 0.92, minimax_m3 parsers, vllm-router for DP-attention), with max-num-seqs 2*CONC for AgentX subagent fan-out and cudagraph capture raised to MAX_NUM_SEQS*(1+3) TOKENS for vLLM's token-denominated FULL_DECODE_ONLY ladder."
- "Search space mirrors the non-MTP entry's three arms (TP8 and TP8/EP8 GPU-resident, TP8/EP8 Mooncake) trimmed at the extreme-conc end: GPU-resident 1-16 (vs 1-20) and Mooncake 5-18 (vs 5-20). The 269k-token service-time-weighted request already places the H200 GPU-resident cliff near conc 10, and the draft head plus draft KV tighten that budget further."

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.

🔴 The final perf-changelog.yaml entry for this PR has pr-link: TBD instead of https://github.com/SemiAnalysisAI/InferenceX/pull/2424 — verified directly against HEAD's committed content, not just the diff. This isn't only a style deviation: utils/validate_perf_changelog.py's PR_LINK_PLACEHOLDERS only accepts XXX or the exact real URL, so the standard merge path (utils/merge_with_reuse.shprepare_perf_changelog_merge.py canonicalize) will raise ChangelogValidationError and abort under set -e until this is corrected to the real PR URL (or the XXX placeholder, which the tooling auto-backfills).

Extended reasoning...

What the bug is: The changelog entry appended by this PR ends with pr-link: TBD rather than a real PR URL or a recognized placeholder. I verified this directly with git show HEAD:perf-changelog.yaml | tail, which shows the literal committed content of perf-changelog.yaml at the tip of this PR's branch — the last line is pr-link: TBD. Every other one of the ~658 prior entries in this file uses pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/<N>, matching the convention documented in AGENTS.md.

Why the preloaded diff looked fine: The diff shown in this review's preloaded context happens to render the last line as pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2424. This is a discrepancy between the cached/preloaded diff text and the actual committed blob at HEAD. Since git show HEAD:perf-changelog.yaml reads the real git object for the commit under review (5ed3a3d), it is authoritative over a preloaded diff rendering — and it unambiguously contains TBD, not the pull/2424 URL. I re-ran this check independently before filing to rule out a caching artifact on my end, and the result was consistent.

Why nothing upstream of merge catches it: validation.py's ChangelogEntry.pr_link field is a bare str with no URL/format validation, so generate_sweep_configs.py and friends won't flag it at config-generation time. The CI PR-gate script (process_changelog.py) also doesn't check the value of pr-link on new entries. So a normal CI run against this branch would appear to pass.

Where it actually breaks: The repo's standard merge tooling does check it. utils/merge_with_reuse.sh unconditionally invokes prepare_perf_changelog_merge.py canonicalize under set -e. That script's canonicalize_appended_linkscompare_entriesvalidate_added_pr_link path rejects any appended pr-link value that is neither in PR_LINK_PLACEHOLDERS ({\"XXX\", \"https://github.com/SemiAnalysisAI/InferenceX/pull/XXX\"}) nor the exact expected URL for the PR being merged. TBD matches neither, so validate_added_pr_link raises ChangelogValidationError, which aborts the merge script.

Step-by-step proof:

  1. Checkout/fetch this PR's branch at commit 5ed3a3d.
  2. Run git show HEAD:perf-changelog.yaml | tail -1 → prints pr-link: TBD.
  3. Run the repo's normal merge path: utils/merge_with_reuse.sh 2424 (or whatever the real merge invocation is for this PR number).
  4. That script calls prepare_perf_changelog_merge.py canonicalize, which loads the new entry, sees pr-link: TBD, and calls validate_added_pr_link(\"TBD\", 2424).
  5. TBD is not in PR_LINK_PLACEHOLDERS and is not equal to https://github.com/SemiAnalysisAI/InferenceX/pull/2424, so the function raises ChangelogValidationError.
  6. The script is running under set -e, so the merge aborts with a non-zero exit before completing.

The fix is a one-line change: replace pr-link: TBD with either the real URL https://github.com/SemiAnalysisAI/InferenceX/pull/2424, or the XXX placeholder that the canonicalizer will auto-backfill with the correct URL at merge time.

…to fit the EAGLE3 draft

The H100 twin of this recipe died mid-warmup with torch.OutOfMemoryError on all
8 ranks (run 30515793863) because it inherited the non-MTP agentic sibling's
gpu-memory-utilization, which leaves no headroom for the draft head and its KV.
Apply the same correction here pre-emptively: 0.90, matching
fixed_seq_len/minimaxm3_fp8_h200_mtp.sh, the proven MTP setting on this SKU.

中文:本配方的 H100 版本在预热阶段因 8 个 rank 全部 OOM 而失败(run 30515793863),
原因是沿用了非 MTP 版本的 gpu-memory-utilization,未给草稿头及其 KV 预留显存。此处
预先做同样的修正:改为 0.90,与本 SKU 上已验证的 MTP 配置
fixed_seq_len/minimaxm3_fp8_h200_mtp.sh 保持一致。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Replace the dense integer sampling inherited from the non-MTP agentic siblings
with the AgentX MTP grid: GPU-resident [1,4,8,12,16], offload [4,8,12,16].
Single-step sampling cannot separate configs by more than noise on the agentic
corpus, and past conc 16 these SKUs are in the post-cliff thrashing regime.

中文:将沿用自非 MTP 智能体配方的逐 1 递增并发采样,替换为 AgentX MTP 并发网格:
GPU 常驻 [1,4,8,12,16],KV 卸载 [4,8,12,16]。相邻并发间隔至少为 2,且一律止于 16 ——
逐 1 采样在智能体语料上无法区分出超过噪声的差异,并发超过 16 后这些 SKU 已进入
显存瓶颈后的抖动区间。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

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

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant