Skip to content

feat(minimaxm3): refresh B200 AgentX Pareto points with EAGLE3-GQA / 使用 EAGLE3-GQA 刷新 MiniMax-M3 B200 AgentX 帕累托点 - #2611

Merged
Oseltamivir merged 7 commits into
mainfrom
feat/minimaxm3-b200-agentx-pareto-refresh
Aug 16, 2026
Merged

feat(minimaxm3): refresh B200 AgentX Pareto points with EAGLE3-GQA / 使用 EAGLE3-GQA 刷新 MiniMax-M3 B200 AgentX 帕累托点#2611
Oseltamivir merged 7 commits into
mainfrom
feat/minimaxm3-b200-agentx-pareto-refresh

Conversation

@xinli-sw

@xinli-sw xinli-sw commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Description

Refresh the MiniMax-M3 NVFP4 B200 AgentX submission to fifteen EAGLE3-GQA Pareto
points and bump the pinned vLLM nightly.

  • Add a TP8 concurrency-1 point at the low-latency end of the curve.
  • Keep TP4 no-offload at concurrency 1/5/10/15/20; drop the former C2/C8/C12 points.
  • Move the TP4 SimpleCPU KV-offload arm into a new dram-utilization: 1.0 block and
    sweep concurrency 15/20/25/30/32/34/36/38/40, replacing the former C20/C30/C40 arm
    that ran under dram-utilization: 0.683.
  • Bump the image to vllm/vllm-openai:nightly-ac7509e2b1db40fec2f03dde1ed4e9dfdc2338c9.

The offload arm's move from dram-utilization: 0.683 to 1.0 raises its engine-level
CPU KV budget at TP4 from 1,024 GB to 1,499 GB — the full proportional-policy share of
the 3 TB AgentX ceiling for 4 of 8 GPUs (utils/matrix_logic/generate_sweep_configs.py,
agentic_dram_offload_gb).

Acceptance length stays pinned to the committed golden curve: 2.78 from
golden_al_distribution/minimaxm3_eagle3_gqa.yaml thinking_on[3], matching
NUM_SPEC_TOKENS=3 and the Inferact/MiniMax-M3-EAGLE3-GQA draft head.
Throughput jobs run synthetic acceptance; eval jobs run real verification
(EVAL_ONLY=true omits rejection_sample_method).

Scope note: this PR changes configs/nvidia-master.yaml and perf-changelog.yaml
only. No benchmark script is modified.

中文说明

将 MiniMax-M3 NVFP4 B200 AgentX 提交刷新为十五个 EAGLE3-GQA 帕累托点,并升级所固定的
vLLM nightly 镜像。

  • 新增 TP8 并发 1 的低时延点。
  • TP4 无卸载保留并发 1/5/10/15/20,移除原有的 C2/C8/C12 点。
  • 将 TP4 SimpleCPU KV 卸载分支移入新的 dram-utilization: 1.0 区块,并将并发扫描扩展为
    15/20/25/30/32/34/36/38/40,取代原先在 dram-utilization: 0.683 下的 C20/C30/C40 分支。
  • 镜像升级为 vllm/vllm-openai:nightly-ac7509e2b1db40fec2f03dde1ed4e9dfdc2338c9

卸载分支从 dram-utilization: 0.683 调整为 1.0,使其在 TP4 下的引擎级 CPU KV 预算从
1,024 GB 提高到 1,499 GB,即 3 TB AgentX 上限中 8 卡取 4 卡的完整按比例份额
(见 utils/matrix_logic/generate_sweep_configs.pyagentic_dram_offload_gb)。

接受长度仍固定为已提交的黄金曲线值:取自
golden_al_distribution/minimaxm3_eagle3_gqa.yamlthinking_on[3] = 2.78,
NUM_SPEC_TOKENS=3Inferact/MiniMax-M3-EAGLE3-GQA 草稿头一致。
吞吐作业使用合成接受率,评测作业使用真实验证(EVAL_ONLY=true 时不设置
rejection_sample_method)。

范围说明:本 PR 仅修改 configs/nvidia-master.yamlperf-changelog.yaml
未改动任何基准测试脚本。

Related Issue

N/A

Type of Change

  • Benchmark configuration / recipe update
  • Inference engine image bump

Checklist

  • Full sweep on the current head: run 31833401868 — 15 agentic + 1 agentic eval, attempt 1, no failures
  • perf-changelog.yaml entry added for minimaxm3-fp4-b200-vllm-agentic-mtp
  • Acceptance length matches the committed golden AL curve (minimaxm3_eagle3_gqa.yaml thinking_on[3] = 2.78)
  • Upstream recipe published: models/MiniMaxAI/MiniMax-M3.yaml (b200: verified)

Co-Authored-By: Claude Sonnet 4.6 <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 关于重新运行失败任务的文档

2 similar comments
@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 关于重新运行失败任务的文档

@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 关于重新运行失败任务的文档

xinli-sw and others added 2 commits August 14, 2026 15:21
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
xinli-sw and others added 2 commits August 14, 2026 15:23
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

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

Additional findings (outside current diff — PR may have been updated during review):

  • 🟣 benchmarks/single_node/agentic/minimaxm3_fp4_b200_mtp.sh:129-132 — This PR fixes CPU_OFFLOAD_BYTES in the B200 script to use decimal 1000^3 instead of binary 1024^3 (matching how TOTAL_CPU_DRAM_GB is computed in decimal GB by agentic_dram_offload_gb()), but its B300 sibling at benchmarks/single_node/agentic/minimaxm3_fp4_b300_mtp.sh:46 still uses 1024*1024*1024, over-allocating cpu_bytes_to_use by ~7.4% versus the intended decimal-GB budget. This is a pre-existing issue outside this PR's diff, but worth a follow-up fix since the B200 script explicitly aims to stay directly comparable to its B300 twin.

    Extended reasoning...

    The bug: benchmarks/single_node/agentic/minimaxm3_fp4_b300_mtp.sh:46 computes CPU_OFFLOAD_BYTES=$((TOTAL_CPU_DRAM_GB * 1024 * 1024 * 1024)), using a binary (GiB) multiplier. TOTAL_CPU_DRAM_GB is produced upstream by agentic_dram_offload_gb() in utils/matrix_logic/generate_sweep_configs.py, which returns int(proportional_bytes / BYTES_PER_GB) with BYTES_PER_GB = 1_000_000_000 (line 30) — i.e. a decimal-GB count. Multiplying a decimal-GB integer by 1024^3 instead of 1000^3 silently inflates the resulting byte count by a factor of 1024^3 / 1000^3 ≈ 1.0737, roughly a 7.4% over-allocation.\n\nThis exact PR's fix, applied inconsistently: this PR changes the identical line in the B200 twin script (minimaxm3_fp4_b200_mtp.sh:131) from 1024*1024*1024 to 1000*1000*1000 specifically to correct this unit mismatch. That confirms the authors/maintainers consider 1000^3 the correct multiplier for TOTAL_CPU_DRAM_GB. However, the PR only touches the B200 script; the B300 script that the B200 header explicitly calls out as a twin ("Every engine flag is the B300 script unchanged so the two SKU curves stay directly comparable") retains the old, now-inconsistent binary multiplier.\n\nStep-by-step proof: The B300 master-config comment (configs/nvidia-master.yaml:7407) documents a "1,024 GB engine-level CPU KV budget" intent for this offload arm. With the intended decimal semantics, 1024 GB decimal should become 1024 * 1_000_000_000 = 1,024,000,000,000 bytes (1.024 TB). But because minimaxm3_fp4_b300_mtp.sh:46 multiplies by 1024^3 instead, it actually computes 1024 * 1024^3 = 1,099,511,627,776 bytes (~1.0995 TB) — about 75.5 GB (~7.4%) more host memory requested than the policy intends. The B300 vllm-simple offload arm at dram-utilization: 0.683 runs this exact code path today, so the miscalculation is live, not theoretical.\n\nWhy existing code doesn't catch it: there is no assertion or validation anywhere in the vLLM launch path (OFFLOAD_CONFIG/cpu_bytes_to_use) that cross-checks the requested cpu_bytes_to_use against the intended decimal-GB policy value, so the wrong multiplier passes through silently as a plausible-looking but incorrect byte count.\n\nImpact and fix: at the current 0.683 DRAM utilization this is unlikely to push the host over its physical DRAM ceiling and cause an OOM, so it does not appear to break the B300 sweep today — but it undermines the explicit "directly comparable" contract between the two SKU scripts (the B300 run would now request ~7.4% more CPU KV cache capacity than the B200 run for what should be the same nominal budget), and could contribute to an OOM if dram-utilization is later raised. The fix is a one-line change identical to what this PR already did for B200: replace 1024 * 1024 * 1024 with 1000 * 1000 * 1000 on minimaxm3_fp4_b300_mtp.sh:46. Since this PR does not modify the B300 file at all, this is a pre-existing bug unrelated to this PR's own changes, but flagged here because the PR draws direct attention to the same bug in the sibling script it is explicitly designed to mirror.

  • 🟡 configs/nvidia-master.yaml:7461-7473 — The header comment block at lines 7429-7447 was not updated alongside this PR's search-space rewrite, so it now flatly contradicts the config: it claims TP2 'does not fit on B200' and 'no conc-list would have made the arm run,' but lines 7471-7473 add a working TP2/C24 dram-offload arm. It also still describes TP4 no-offload as 'samples 5-15' (now [1,5,10,15,20], and doesn't mention the new TP8/C1 arm) and TP4+SimpleCPU as running '20...to 40' (now [30] only). Please rewrite the comment to describe the new search-space.

    Extended reasoning...

    The descriptive comment block at configs/nvidia-master.yaml:7429-7447 is untouched by this diff, but the PR rewrites the exact search-space that block documents, leaving several concrete factual contradictions between the prose and the config directly below it.

    Contradiction 1 — TP2 feasibility. Line 7429 states unconditionally "TP4-only. The B300 sibling also runs a TP2 arm, but TP2 does not fit on B200," and lines 7434-7436 elaborate that this is "structural, not a concurrency cliff... so no conc-list would have made the arm run." The PR adds exactly the arm the comment says cannot exist: { tp: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: vllm-simple }, conc-list: [24] } at line 7473, under a new dram-utilization: 1.0 scenario block. The PR's own new inline comment at 7464-7465 even explains how this works ("TP2 uses 1.0 so 2 of 8 GPUs receive the 750 GB policy maximum") — the SimpleCPU KV offload changes the memory math that made TP2 infeasible without offload, but the older block was never reconciled with this.

    Contradiction 2 — TP4 no-offload concurrency description. Line 7440 says "B200 samples 5-15 densely... and retains 20 past it," implying a list like [5, 8, 10, 12, 15, 20] (matching the pre-PR config). The new list at line 7469 is [1, 5, 10, 15, 20] — it drops the dense 8/12 samples and adds a new low point at 1. The comment also never mentions the brand-new { tp: 8, ..., conc-list: [1] } arm at line 7468 at all.

    Contradiction 3 — SimpleCPU offload range. Lines 7442-7444 say the TP4+SimpleCPU arm "picks up at 20 rather than B300's 30... and stops at 40," describing a sweep across the 20-40 range. Line 7470 narrows this arm to conc-list: [30] — a single point, not a range, and one that no longer even reflects the "20 rather than 30" framing the comment uses to contrast with B300.

    Why this isn't caught elsewhere: the diff only touches the config lines starting at 7461 (previously 7455) and adds a short, narrowly-scoped inline comment at 7464-7465 about the dram-utilization values. It does not touch or invalidate the broader block above it, so nothing in the review flow forces a reconciliation. A future reader (or another PR author extending this recipe) skimming the header comment would incorrectly conclude TP2 is structurally impossible on B200 and that the offload arm still sweeps 20-40, when neither is true after this PR.

    Proof walkthrough: (1) Read lines 7429-7436 — claim: "TP2 does not fit on B200... no conc-list would have made the arm run." (2) Read line 7473 — fact: a TP2 arm with conc-list: [24] is now live in the config. (3) These two statements about the same recipe cannot both be true simultaneously; the comment is stale. Same pattern applies to the TP4 conc-list description (comment: "5-15... retains 20" vs. actual [1,5,10,15,20]) and the SimpleCPU range description (comment: "20...to 40" vs. actual [30]).

    Fix: update the comment block (roughly lines 7429-7447) to state that TP2 is now viable when paired with SimpleCPU DRAM offload at dram-utilization: 1.0 (referencing the new inline comment's explanation), and update the described conc-lists for the TP4 no-offload and TP4+offload arms, plus mention the new TP8/C1 arm, so the prose matches the search-space it sits above.

    This is a documentation-only issue — the config itself is internally consistent and functionally correct, so it doesn't block merging, but a maintainer should fix it before the stale comment misleads someone extending this recipe further.

Comment thread configs/nvidia-master.yaml Outdated
Comment on lines +7464 to +7465
# 0.683 maps the B200 TP4 SimpleCPU point to a 1,024 GB engine-level CPU
# KV budget. TP2 uses 1.0 so 2 of 8 GPUs receive the 750 GB policy maximum.

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 new comment (line 7465) and perf-changelog.yaml entry both say the TP2/C24 offload arm gets a "750 GB" policy maximum, but agentic_dram_offload_gb() actually computes 749 GB (int-truncated) for tp=2, dram-utilization=1.0, gpus-per-node=8 with the DRAM cap applied — so TOTAL_CPU_DRAM_GB the benchmark script receives is 749, not 750. This is a 1 GB documentation overstatement with no runtime effect; worth a one-line fix for consistency (the sibling TP4 comment correctly documents its truncated value, 1,024 GB).

Extended reasoning...

agentic_dram_offload_gb() in utils/matrix_logic/generate_sweep_configs.py computes the CPU DRAM offload budget as proportional_bytes = Decimal(available_mib) * BYTES_PER_MIB * utilization * gpu_count / gpus_per_node, then returns int(proportional_bytes / BYTES_PER_GB) with BYTES_PER_GB = 1_000_000_000 — i.e. it truncates to whole GB using decimal (not binary) gigabytes.

For the new TP2/C24 arm added in this PR (dram-utilization: 1.0, tp: 2gpu_count=2, gpus_per_node=8, cluster b200-dgxc), available_mib clamps to MAX_AGENTIC_AVAILABLE_CPU_DRAM_MIB = 2_861_022 (the file's own comment states b200/b300 report more DRAM than this cap). Plugging in:

proportional_bytes = 2_861_022 * 1_048_576 * 1.0 * 2 / 8 = 749_999_751_168
int(749_999_751_168 / 1_000_000_000) = 749

So the TOTAL_CPU_DRAM_GB environment variable that benchmarks/single_node/agentic/minimaxm3_fp4_b200_mtp.sh actually receives for this arm is 749, not 750 — and after this PR's own fix to use decimal bytes (CPU_OFFLOAD_BYTES=$((TOTAL_CPU_DRAM_GB * 1000 * 1000 * 1000))), the script will request exactly 749 * 1000^3 bytes of CPU KV cache, not the 750 GB the comment and changelog claim.

Both new lines describe this arm as hitting the "750 GB policy maximum":

  • configs/nvidia-master.yaml:7465: "TP2 uses 1.0 so 2 of 8 GPUs receive the 750 GB policy maximum."
  • perf-changelog.yaml: "...TP2 C24 with the proportional-policy 750 GB SimpleCPU KV-offload cap."

Neither is derived from the generator's actual output — 3 TB / 4 = 750 GB is the nominal fraction, but the real cap (2_861_022 MiB = 2_999_999_004_672 bytes) is fractionally below 3 TB, so integer truncation lands one GB short, at 749. Notably, this is a self-inconsistency within the same comment block: the sibling TP4 line ("0.683 maps the B200 TP4 SimpleCPU point to a 1,024 GB engine-level CPU KV budget") correctly documents the truncated value — int(1_024_499_660_095 / 1_000_000_000) = 1024 matches exactly — so the author clearly intended to document the generator's true output, and 750 vs. 749 for TP2 is simply an arithmetic slip, not an intentional rounding convention.

Impact is purely cosmetic: the generator still computes and passes the correct 749 GB value to the benchmark script at runtime, so nothing breaks and no config drifts. It's worth a one-line fix (change "750 GB" to "749 GB" in both the yaml comment and the changelog description) for accuracy and to keep the changelog trustworthy as a record of what was actually run, but it does not block merging.

@github-actions

Copy link
Copy Markdown
Contributor

@xinli-sw

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run

@Ankur-singh Ankur-singh changed the title feat(minimaxm3): refresh B200 AgentX Pareto points with EAGLE3-GQA feat(minimaxm3): refresh B200 AgentX Pareto points with EAGLE3-GQA / 使用 EAGLE3-GQA 刷新 MiniMax-M3 B200 AgentX 帕累托点 Aug 15, 2026
@Ankur-singh

Copy link
Copy Markdown
Collaborator

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/31833401868
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/31833401868
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified against the current MODELS.md that this PR does not submit a deprecated model, scenario, or model-scenario combination.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; FLOPs at lower precisions is fine, given that the config passes private evals. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every single-node vLLM/SGLang recipe in this PR is documented in the official vLLM recipes and/or the SGLang cookbook:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If this PR uses append-only: true, verified that it only adds generated points or recipe variants inside a selected existing config/scenario and existing same-image visual curve: every previously generated point remains present with the same recipe, no prior point is removed or rerun, and every benchmark-affecting change in the complete diff can affect only the corresponding newly appended points (never an existing point), regardless of which file contains it.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.

Additional detail section:

Scope. This PR refreshes the minimaxm3-fp4-b200-vllm-agentic-mtp AgentX search space to fifteen EAGLE3-GQA points and bumps the pinned vLLM nightly. It touches only configs/nvidia-master.yaml and perf-changelog.yaml; no benchmark script, recipe file, or launcher changes. The search space becomes TP8 C1 and TP4 C1/C5/C10/C15/C20 with no offload, plus a TP4 SimpleCPU KV-offload arm at C15/C20/C25/C30/C32/C34/C36/C38/C40 moved into a new dram-utilization: 1.0 block.

Validation and eval evidence. Run 31833401868 ran on the exact PR head 5c3e65cf, attempt 1, and settled success with zero failures. Fifteen agentic / benchmark jobs and one agentic eval / job executed and passed — exactly the fifteen points this config declares — and setup and canary-select both succeeded, so the matrix genuinely ran rather than being skipped under a reuse gate. I confirmed the eval score directly from the run's eval_results_all artifact (agg_eval_all.json): GSM8K em_strict 0.9674 (n_eff 1319) on CLUSTER:B200-DGXC, against the 0.90 bar in utils/evals/thresholds.yaml (no minimaxm3 model override), on the same image this PR pins.

Speculative decoding — acceptance length and the eval guard. The submission runs EAGLE3 with the GQA draft head Inferact/MiniMax-M3-EAGLE3-GQA at NUM_SPEC_TOKENS=3. Acceptance is pinned to SYNTHETIC_ACCEPT_LEN=2.78, which is exactly golden_al_distribution/minimaxm3_eagle3_gqa.yaml minimax-m3.thinking_on[3]. The GQA curve is the correct one for this draft head; the non-GQA curve reads 2.83 at the same level and is not used. Answering the creator lane's SPECDEC_EVAL_GUARD question directly — with EVAL_ONLY=true, synthetic acceptance is off. benchmarks/single_node/agentic/minimaxm3_fp4_b200_mtp.sh branches on EVAL_ONLY and builds the eval SPEC_CONFIG without rejection_sample_method or synthetic_acceptance_length, so throughput jobs get synthetic acceptance pinned to the golden AL while eval jobs get real verification. The preflight's SPECDEC_EVAL_GUARD rows name only dsv4 SGLang recipes; no minimaxm3 path is implicated. On the chat-template item: this is the AgentX path replaying real agentic-coding trajectories, and the golden curve was itself measured through the model's chat template (thinking_on chat_template_kwargs: {"thinking_mode": "enabled"}). The committed curve is keyed by model, thinking mode, and draft length rather than by SKU, and is the only committed curve for this model, so it is the correct source for the B200 arm as well.

Single-node recipe publication — satisfied by an already-published recipe. This config is multinode: false, framework: vllm, so the single-node publication requirement applies. The matching recipe is already published upstream at models/MiniMaxAI/MiniMax-M3.yaml. It records b200: verified, covers the NVFP4 variant nvidia/MiniMax-M3-NVFP4 for Blackwell, documents an eagle3_gqa mode pinning Inferact/MiniMax-M3-EAGLE3-GQA with num_speculative_tokens: 3 and attention_backend: FLASH_ATTN, and calls out a tested B200 baseline explicitly. No new upstream PR is required.

Model and scenario scope. MODELS.md lists MiniMax-M3 as active for Agentic coding, with Single-turn 1k1k and 8k1k recorded as deprecated (removed 2026-08-04, #2493). This submission is agentic-coding only. MODELS.md records the engine expectation for this model as the native/upstream vLLM engine with Inferact/MiniMax-M3-EAGLE3 and/or -EAGLE3-GQA draft heads, which is exactly what this PR exercises, on the upstream vllm/vllm-openai:nightly-ac7509e2b1db40fec2f03dde1ed4e9dfdc2338c9 image.

No engine or serving-stack patching. The diff is two YAML files. No .patch, git apply, sed, site-packages edit, monkey-patch, --hf-overrides, or forked/rebuilt engine wheel, and the pinned upstream image runs as shipped.

Append-only item — not applicable. This submission does not set append-only: true; the new perf-changelog.yaml entry declares only config-keys, scenario-type, description, and pr-link. The change is also not additive in substance — it drops the former TP4 no-offload C2/C8/C12 points and replaces the former C20/C30/C40 offload arm — so the curve is re-run rather than appended to. Recorded as not applicable rather than as a performed append-only verification.

Recorded exception — the config comment above this entry is now stale. The commented block immediately above minimaxm3-fp4-b200-vllm-agentic-mtp is unchanged by this PR but is invalidated by it, and I am recording that rather than treating it as satisfied. It states that "B200 samples 5-15 densely" (the arm is now [1, 5, 10, 15, 20]), that "TP4 + SimpleCPU picks up at 20" (it now starts at 15), and — materially — that "dram-utilization 0.683 ... resolves to the same 1,024 GB engine-level CPU KV budget at TP4". The offload arm has moved to dram-utilization: 1.0, so by agentic_dram_offload_gb in utils/matrix_logic/generate_sweep_configs.py its budget is now the full proportional share, 1,499 GB rather than 1,024 GB; the only arms left under 0.683 are GPU-resident and receive a zero budget, so that sentence now describes no configuration at all. The perf-changelog.yaml description ("using the full-capacity DRAM budget") is accurate; the comment contradicts it. This is a documentation-accuracy defect, not a benchmark-correctness one — the run used the values in the config, not in the comment — and it is accepted here at the reviewing maintainer's direction to be corrected before merge.

Recorded exception — creator-preflight findings accepted as out of scope for this PR. The creator preflight reports MASTER_RECIPE_PARITY as BLOCK and SETUP_SCRIPT_REACHABILITY as UNVERIFIED on this head. Both are repo-wide scans rather than findings against this submission: the parity row names dsr1-* and qwen3.5-* config keys and their SGLang recipe paths, and the reachability row names kimik3-dspark-config-compat.sh, rebuild-deepep.sh, and vllm-container-deps.sh. No minimaxm3 config key or recipe path appears anywhere in the preflight output. This PR neither introduces nor can remedy them; they remain open against the repository and are worth clearing separately.

Noted for the author, outside this PR's diff. benchmarks/single_node/agentic/minimaxm3_fp4_b200_mtp.sh computes CPU_OFFLOAD_BYTES=$((TOTAL_CPU_DRAM_GB * 1024 * 1024 * 1024)), but the budget it consumes is produced in decimal GB (BYTES_PER_GB = 1_000_000_000 in utils/matrix_logic/generate_sweep_configs.py). Every DRAM-offload point therefore reserves about 7.4% more host KV than the proportional policy grants — here roughly 1,609 GB against a computed 1,499 GB. This PR changed that expression to 1000 * 1000 * 1000 and then reverted it, so it nets out of the diff and is not part of this submission; I did not attest to offload sizing. Flagging it because the revert leaves the discrepancy live across every offloading AgentX config, not just this one.

Mergeability. The PR is currently CONFLICTING against main. That is a merge-time concern, separate from this sign-off, and is expected to be resolved before merge.

Signed: Ankur-singh

@Klaud-Cold

Copy link
Copy Markdown
Collaborator

✅✅✅ Verdict: PASS ✅✅✅

✅ Check 0 (CODEOWNER): PASS — Ankur-singh is a named owner of configs/nvidia-master.yaml; perf-changelog.yaml matches only the catch-all, covered by any recognized CODEOWNER.
✅ Check 1 (sweep on in-PR commit): PASS — head 5c3e65cf carries run 31833401868: 15 executed agentic / jobs + 1 agentic eval /, all success (the skipped eval / / single-node */ rows are non-agentic scenario lanes this config doesn't populate).
✅ Check 2 (evals pass): PASS — agg_eval_all.json shows GSM8K em_strict 0.9674 (n_eff 1319) ≥ 0.90 bar, on this PR's pinned image vllm/vllm-openai:nightly-ac7509e2….
✅ Check 3 (recipe): PASS — published upstream recipe models/MiniMaxAI/MiniMax-M3.yaml (b200: verified, nvfp4 variant, eagle3_gqa mode) matches all major args: nvidia/MiniMax-M3-NVFP4, EAGLE3-GQA draft with num_speculative_tokens: 3 + FLASH_ATTN, --kv-cache-dtype fp8, FLASHINFER/TRT-LLM attention with fp8 indexer, --block-size 128, --language-model-only, thinking-on. Image tag (nightly vs minimax-m3) is InferenceX-specific, informational only.
✅ Check 4 (reuse command): PASS — /reuse-sweep-run posted by xinli-sw (COLLABORATOR).
✅ Check 5 (latest template): PASS — every current-template item is present and checked.
✅ Check 6 (upstream image / ordering): PASS — vllm/vllm-openai:nightly-… is the upstream vLLM org; framework: vllm, so engine-first ordering is inherently satisfied.
✅ Check 7 (deprecations): PASS — MODELS.md keeps minimaxm3 Agentic coding active as of 2026-08-15; EAGLE3 is the published arm.
✅ Check 8 (architecture hacks): PASS — diff is two YAML files; no --hf-overrides or FLOPs-reducing knobs.
✅ Check 9 (spec-decode chat template): PASS — replay drives /v1/chat/completions (--endpoint-type chat); eval uses local-chat-completions --apply_chat_template.
✅ Check 10 (engine patches): PASS — no engine/serving-stack patching; the pinned image runs as shipped.
✅ Check 11 (golden AL): PASS — throughput jobs pin rejection_sample_method: synthetic + synthetic_acceptance_length: 2.78, exactly minimaxm3_eagle3_gqa.yaml thinking_on[3] for the GQA head at NUM_SPEC_TOKENS=3; eval jobs run real verification; no synthetic knobs on non-agentic configs.
➖ Check 12 (append-only): N/A — no new perf-changelog.yaml entry sets append-only: true; the sign-off correctly records the change as a re-run rather than an append.

@cquil11

cquil11 commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator

/stage-results 31833401868

@github-actions

github-actions Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

@cquil11 staged run 31833401868: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-14~r31833401868

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

Resolve the nvidia-master and append-only performance changelog conflicts while preserving the PR's B200 Pareto sweep changes.\n\n中文:将 main 合并到 MiniMax-M3 B200 刷新分支;解决 nvidia-master 与仅追加性能变更日志的冲突,同时保留本 PR 的 B200 帕累托扫描调整。

@Oseltamivir Oseltamivir left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

lgtm

@Oseltamivir
Oseltamivir merged commit 645d519 into main Aug 16, 2026
30 checks passed
@Oseltamivir
Oseltamivir deleted the feat/minimaxm3-b200-agentx-pareto-refresh branch August 16, 2026 11:25
ChangLiu0709 added a commit that referenced this pull request Aug 17, 2026
Keep all new entries from main (PRs #2567, #2608, #2610, #2571, #2609,

Co-authored-by: Cursor <cursoragent@cursor.com>
#2611, #2616, #2612, #2620) and re-append our #2605 entry at the tail.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Development

Successfully merging this pull request may close these issues.

5 participants