[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
Conversation
…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>
|
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 For PR verification, add the 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 模板,包括保留英文语句 如需进行 PR 验证,请为此 PR 添加 PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档 |
中文:补充 perf-changelog 中 #2423 的 pr-link。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Draft-head note for reviewers. This recipe uses Worth knowing: #2337 (merged 2026-07-29) moved B200/B300 fp8 to the 中文:本配方使用 需要说明的是:#2337(2026-07-29 合并)已将 B200/B300 fp8 切换到 |
| --tool-call-parser minimax_m3 \ | ||
| --reasoning-parser minimax_m3 \ |
There was a problem hiding this comment.
🔴 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:
- Server starts with
--reasoning-parser minimax_m3(line 176), so every completion response has its<mm:think>...</mm:think>content removed frommessage.contentand placed only inmessage.reasoning_content. - 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_contentis not part of the OpenAI chat schema the client resends, so it's dropped. - 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. - 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.
- This repeats every turn until the step limit, producing no net progress and an empty final patch — which the
EVAL_ONLYreal-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>
|
see unofficial run visualizer at https://inferencex.semianalysis.com/inference?unofficialRun=30515793863 |
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>
|
see unofficial run visualizer at https://inferencex.semianalysis.com/inference?unofficialRun=30517270909 |
|
see unofficial run visualizer at https://inferencex.semianalysis.com/inference?unofficialRun=30517356982 |
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.shalready composesagentic/+_mtp).Speculative config —
method: eagle3onInferact/MiniMax-M3-EAGLE3,num_speculative_tokens: 3, drafter pinned toFLASH_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: syntheticwithsynthetic_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 ingolden_al_distribution/README.md, a submission may choose any supported draft length but may not substitute a different acceptance target. The separateminimaxm3_eagle3_gqa.yamlcurve belongs to theInferact/MiniMax-M3-EAGLE3-GQAdraft (run 29784780049) and is not mixed in.EVAL_ONLYruns 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_m3parsers, gmu 0.90,--cpu-offload-gb 26, vllm-router for DP-attention) so the spec-decode delta is readable at equal concurrency.max-num-seqsstays2*CONCfor AgentX subagent fan-out; cudagraph capture is raised toMAX_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 -nclean; both YAMLs parse;generate_sweep_configs.py test-configemits 18 agentic-coding configs withspec-decoding: mtpand 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-EAGLE3,num_speculative_tokens: 3,drafter 固定FLASH_ATTN(EAGLE3 头是 MHA,而 FlashInfer 仅通过要求 GQA/MQA 的 trtllm-gen kernel 支持强制的 page size 128)。与仓库中所有已合并的 MiniMax-M3 MTP 配方使用相同的草稿头与投机层数。合成强制 AL:吞吐量测试设置
rejection_sample_method: synthetic与synthetic_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_ATTN、minimax_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)
--gpu-memory-utilization0.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 raisedtorch.OutOfMemoryError96 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.中文:(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。