Skip to content

[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

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

[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
functionstackx wants to merge 4 commits into
mainfrom
feat/minimaxm3-fp8-h100-agentic-mtp

Conversation

@functionstackx

@functionstackx functionstackx commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds minimaxm3-fp8-h100-vllm-agentic-mtp — the EAGLE3 speculative-decoding (spec-decoding: mtp) variant of the MiniMax-M3 MXFP8 H100 AgentX recipe. One new benchmark script, one master-config entry, one changelog entry; no launcher change is needed (launch_h100-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, gmu 0.90, --cpu-offload-gb 26, 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 four arms (TP8 and TP8/EP8 × GPU-resident and 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. 18 generated jobs.

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

中文说明

新增 minimaxm3-fp8-h100-vllm-agentic-mtp:MiniMax-M3 MXFP8 H100 AgentX(智能体编码)配方的 EAGLE3 投机解码(spec-decoding: mtp)变体。包含一个新的基准测试脚本、一条 master 配置条目和一条 changelog 条目;启动器无需改动(launch_h100-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 解析器、gmu 0.90--cpu-offload-gb 26、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 常驻与 Mooncake),并采用 AgentX MTP 并发网格:GPU 常驻 [1, 4, 8, 12, 16],KV 卸载 [4, 8, 12, 16]。相邻并发间隔至少为 2,且一律止于并发 16 —— 在智能体语料上,逐 1 采样无法区分出超过运行间噪声的差异;而并发超过 16 后,这些 SKU 已进入非 MTP 扫描早已刻画过的显存瓶颈后抖动区间。共生成 18 个作业。

验证bash -n 通过;两个 YAML 均可解析;generate_sweep_configs.py test-config 生成 18 条 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-h100-vllm-agentic-mtp, the spec-decoding=mtp variant of the
MiniMax-M3 MXFP8 H100 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-h100-vllm-agentic-mtp,即 MiniMax-M3 MXFP8 H100 智能体
编码配方的投机解码(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>
@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 关于重新运行失败任务的文档

中文:补充 perf-changelog 中 #2423 的 pr-link。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@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 前完成。

Comment on lines +175 to +176
--tool-call-parser minimax_m3 \
--reasoning-parser minimax_m3 \

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.

🔴 Lines 175-176 pass both --tool-call-parser minimax_m3 and --reasoning-parser minimax_m3, but minimaxm3_fp4_mi355x.sh (merged the day before, PR #2118) intentionally omits the reasoning parser for this exact agentic-coding scenario, with a detailed comment explaining that MiniMax-M3's <mm:think> block must round-trip in message.content every turn or multi-turn quality collapses into repeated commands / empty patches. This is inherited from minimaxm3_fp8_h100.sh and its h200/mi300x/mi325x siblings, but this PR copies the same known-bad flag pair into brand-new code, and it hits hardest on the EVAL_ONLY real-verification path (lines 195-196), which would score near zero from the resulting degeneration. Fix: drop --reasoning-parser minimax_m3 here as was already done in the mi355x recipe.

Extended reasoning...

The bug: minimaxm3_fp8_h100_mtp.sh:175-176 passes both --tool-call-parser minimax_m3 and --reasoning-parser minimax_m3 to the vLLM server. MiniMax-M3 is an interleaved-thinking model that emits an <mm:think>...</mm:think> block as part of its response. When --reasoning-parser minimax_m3 is enabled, vLLM strips that block out of message.content and surfaces it instead as a separate, response-only reasoning_content field on the OpenAI-compatible completion object.

Why that breaks multi-turn agentic runs: the agentic-coding harness this script drives (run_agentic_replay_and_write_outputs, mini-swe-agent + litellm's OpenAI client) only round-trips message.content back into the conversation on the next turn — it does not resend reasoning_content. So with the reasoning parser enabled, the model's think block silently disappears from its own conversation history every turn. Without visibility into its prior plan, the model degenerates: it repeats the same command turn after turn until the step limit is hit, producing an empty patch.

Why nothing here prevents it: this exact failure mode and fix are already documented in the repo. benchmarks/single_node/agentic/minimaxm3_fp4_mi355x.sh:119-127 (PR #2118, merged one day before this recipe's non-MTP sibling) keeps --tool-call-parser minimax_m3 but explicitly omits --reasoning-parser minimax_m3, with an inline comment spelling out precisely this mechanism. That fix was never backported to minimaxm3_fp8_h100.sh (nor its h200/mi300x/mi325x siblings), and this new MTP recipe copies the non-MTP h100 sibling's server flags verbatim (including both parsers), propagating the known-bad configuration into new code rather than following the already-established fix.

Impact: the failure is model/harness-level, not hardware- or spec-decode-specific, so it applies identically on this H100 EAGLE3 recipe. The throughput sweep runs use rejection_sample_method: synthetic with a forced golden acceptance length, so the actual generated text there is synthetic/garbage by design and the parser bug doesn't change the throughput numbers. But the EVAL_ONLY path (lines 195-196) drops synthetic acceptance specifically to do real target verification and score genuine agentic quality — this is exactly the path that would collapse into empty-patch degeneration from the stripped think block, defeating the purpose of carving out EVAL_ONLY in the first place.

Step-by-step proof of the mechanism:

  1. Server starts with --reasoning-parser minimax_m3 (line 176), so every completion response has its <mm:think>...</mm:think> content removed from message.content and placed only in message.reasoning_content.
  2. Turn N: the agent (mini-swe-agent via litellm's OpenAI-compatible client) receives a response, appends it to its running message list. It appends message.content (the tool-call/action portion) — reasoning_content is not part of the OpenAI chat schema the client resends, so it's dropped.
  3. Turn N+1: the server serves the next completion using only the truncated history — the model has no record of its own prior <mm:think> reasoning/plan.
  4. Because MiniMax-M3 relies on that block persisting in-context to track multi-step plans (per the mi355x comment), the model re-derives a similar-looking next step, often repeating its previous command verbatim.
  5. This repeats every turn until the step limit, producing no net progress and an empty final patch — which the EVAL_ONLY real-verification path would score at or near zero, even though the server and harness are otherwise functioning correctly.

Fix: drop --reasoning-parser minimax_m3 from the vllm serve invocation (keep --tool-call-parser minimax_m3), matching what minimaxm3_fp4_mi355x.sh already does for this identical scenario.

…to fit the EAGLE3 draft

The first agentic job (TP8/EP8 c9, run 30515793863) died mid-warmup: every one of
the 8 ranks raised torch.OutOfMemoryError 96 MiB short, killing the engine core
(EngineDeadError) and tripping AIPerf's terminal warmup failure.

The recipe inherited --gpu-memory-utilization 0.95 from the non-MTP agentic
sibling, which has no draft head to house. fixed_seq_len/minimaxm3_fp8_h100_mtp.sh
— the proven MTP configuration on this SKU — runs 0.90. Match it.

中文:首个智能体作业(TP8/EP8 c9,run 30515793863)在预热阶段失败:8 个 rank 全部
抛出 torch.OutOfMemoryError(仅差 96 MiB),导致 engine core 崩溃(EngineDeadError)
并触发 AIPerf 的终止性预热失败。该配方沿用了非 MTP 版本的 --gpu-memory-utilization
0.95,而后者并不需要为草稿头预留显存。本 SKU 上已验证的 MTP 配置
fixed_seq_len/minimaxm3_fp8_h100_mtp.sh 使用 0.90,现与之对齐。

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

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