Skip to content

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

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

feat(minimaxm3): refresh B300 AgentX Pareto points with EAGLE3-GQA / 使用 EAGLE3-GQA 刷新 MiniMax-M3 B300 AgentX 帕累托点#2610
Oseltamivir merged 5 commits into
mainfrom
feat/minimaxm3-b300-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 B300 AgentX submission to eight 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 point.
  • Trim the TP4 SimpleCPU KV-offload arm to concurrency 30 (was 30-75).
  • Add TP2 concurrency 24 with SimpleCPU KV offload under a new
    dram-utilization: 1.0 block, applying the proportional-policy cap.
  • Drop the former TP2 no-offload C1/C2/C5 rows.
  • Bump the image to vllm/vllm-openai:nightly-ac7509e2b1db40fec2f03dde1ed4e9dfdc2338c9.

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 B300 AgentX 提交刷新为八个 EAGLE3-GQA 帕累托点,并升级所固定的
vLLM nightly 镜像。

  • 新增 TP8 并发 1 的低时延点。
  • TP4 无卸载保留并发 1/5/10/15/20,移除原有的 C2 点。
  • 将 TP4 SimpleCPU KV 卸载分支收敛到并发 30(原为 30-75)。
  • 在新的 dram-utilization: 1.0 区块下新增 TP2 并发 24 的 SimpleCPU KV 卸载点,
    按比例策略上限配置。
  • 移除原有的 TP2 无卸载 C1/C2/C5 行。
  • 镜像升级为 vllm/vllm-openai:nightly-ac7509e2b1db40fec2f03dde1ed4e9dfdc2338c9

接受长度仍固定为已提交的黄金曲线值:取自
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 31833066181 — 8 agentic + 1 agentic eval, attempt 1, no failures
  • perf-changelog.yaml entry added for minimaxm3-fp4-b300-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

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

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_b300_mtp.sh:46 — sweep:TOTAL_CPU_DRAM_GB * 1000 * 1000 * 1000
    The GB-to-bytes conversion is copy-pasted independently across 6 active scripts with no shared helper in benchmark_lib.sh, e.g. this file (line 46) and kimik3_fp4_b300_vllm.sh:106. Extracting a gb_to_bytes() helper into benchmark_lib.sh would make the unit conversion correct-by-construction everywhere and prevent the kind of 1024^3 drift that slipped into minimaxm3_fp4_b200_mtp.sh.

    Extended reasoning...

    This finding is about duplication, not a functional bug in this PR: the corrected TOTAL_CPU_DRAM_GB * 1000 * 1000 * 1000 expression on line 46 is arithmetically right for decimal GB, matching the PR description's stated goal of using 1000^3 instead of 1024^3.

    The problem is that this exact expression is hand-copied into at least six other active benchmark scripts (kimik3_fp4_b300_vllm_mtp.sh:134, kimik3_fp4_mi355x_mtp.sh:136, kimik3_fp4_b300_vllm.sh:106, dsv4_fp4_b300_vllm_mtp.sh:131, dsv4_fp4_b200_vllm_mtp.sh:132), and benchmarks/benchmark_lib.sh only validates that TOTAL_CPU_DRAM_GB is a positive integer -- it never performs the GB-to-bytes conversion itself. Every one of those six sites has to get the 1000 vs 1024 base right independently, by eye, with no compiler or shared code to catch a mistake.

    That is exactly the failure mode that occurred on the sibling script minimaxm3_fp4_b200_mtp.sh:131, which used 1024 * 1024 * 1024 instead of the decimal base and silently miscalculated the CPU KV-offload budget (see the sibling PR comment for that bug). Nothing in the current structure would have caught that divergence: there is no single source of truth for "how many bytes are in TOTAL_CPU_DRAM_GB gigabytes," so a copy-paste typo in the exponent base compiles, runs, and produces a plausible-looking (but wrong) byte count.

    Step-by-step proof of the risk this duplication creates:

    1. A developer adds a 7th script that also needs CPU KV-offload sizing and copies the pattern from one of the six existing sites.
    2. They fat-finger 1024 instead of 1000 (or vice versa), which is a one-character-adjacent typo that is very easy to make and easy to miss in review, since both forms "look like a GB-to-bytes conversion."
    3. set -euo pipefail does not catch this: the arithmetic is well-formed, CPU_OFFLOAD_BYTES is a valid integer, and the script runs to completion.
    4. The resulting cpu_bytes_to_use/cpu_bytes_to_use_per_rank value silently under- or over-states the real CPU DRAM budget by ~7.4% (the ratio between 1024^3 and 1000^3), which can cause the KV offload connector to be configured with the wrong capacity -- exactly what happened in minimaxm3_fp4_b200_mtp.sh:131.
    5. This ships to CI/production runs and is only discovered by manual cross-script auditing (as happened here), not by any automated check.

    If benchmark_lib.sh instead exposed a single gb_to_bytes() helper (e.g. gb_to_bytes() { echo $(( $1 * 1000 * 1000 * 1000 )); }), every call site would read CPU_OFFLOAD_BYTES=$(gb_to_bytes "$TOTAL_CPU_DRAM_GB") and the unit base would live in exactly one place. Note the six sites are not byte-identical downstream -- some divide by TP, others by GPU_COUNT, and they populate different JSON keys (cpu_bytes_to_use vs cpu_bytes_to_use_per_rank) -- so the helper should only own the shared multiplier, with each caller applying its own per-rank division afterward. That is still a meaningful DRY win and is consistent with how these scripts already lean on shared helpers from benchmark_lib.sh (require_agentic_kv_offload_backend, install_agentic_deps, wait_for_server_ready).

    This is a pure code-quality/reuse suggestion -- it does not change behavior in this PR and should not block merging, but fixing it would remove the exact structural gap that allowed the 1024^3 bug to happen undetected in the first place.

  • 🟣 benchmarks/single_node/agentic/minimaxm3_fp4_b300_mtp.sh:46 — Pre-existing: the same decimal-GB fix applied here (* 1000 * 1000 * 1000) is not mirrored in the b200 sibling script, benchmarks/single_node/agentic/minimaxm3_fp4_b200_mtp.sh:131, which still computes CPU_OFFLOAD_BYTES using binary GiB (* 1024 * 1024 * 1024) for the identical dram-utilization:0.683/tp:4/kv-offloading:dram point. That script's own comment now falsely claims b200 and b300 resolve to the same 1,024 GB budget, when b200 actually requests ~1,099.5 GB (a 7.37% overshoot).

    Extended reasoning...

    This PR fixes benchmarks/single_node/agentic/minimaxm3_fp4_b300_mtp.sh:46 to compute CPU_OFFLOAD_BYTES = TOTAL_CPU_DRAM_GB * 1000 * 1000 * 1000 (decimal GB), which correctly round-trips the value that generate_sweep_configs.py derives from dram-utilization. That generator's BYTES_PER_GB constant is 1_000_000_000 (decimal), and TOTAL_CPU_DRAM_GB is computed as int(proportional_bytes / BYTES_PER_GB) — so any script that reconstructs bytes from TOTAL_CPU_DRAM_GB must multiply back by the same decimal 1000^3, not the binary 1024^3, or the resulting cpu_bytes_to_use won't match what the generator intended.

    The b200 sibling script, benchmarks/single_node/agentic/minimaxm3_fp4_b200_mtp.sh:131, has the exact same line shape but was never updated: CPU_OFFLOAD_BYTES=$((TOTAL_CPU_DRAM_GB * 1024 * 1024 * 1024)). This script backs the minimaxm3-fp4-b200-vllm-agentic-mtp config (configs/nvidia-master.yaml ~line 7452-7470), which shares the identical dram-utilization: 0.683 / tp: 4 / kv-offloading: dram search point as the b300 config this PR touches. The comment directly above that config block explicitly asserts "0.683 maps ... to a 1,024 GB engine-level CPU KV budget" for both SKUs — but with the binary multiplier, b200 actually computes 1024 * 1024^3 = 1,099,511,627,776 bytes (~1,099.5 GB) instead of the intended 1,024,000,000,000 bytes, a 7.37% overshoot. This PR just proved that comment false by fixing the root cause in one file and leaving it in the other.

    The reason nothing else in the codebase catches this: every other active offload script (kimik3_fp4_b300_vllm_mtp.sh, kimik3_fp4_mi355x_mtp.sh, kimik3_fp4_b300_vllm.sh, dsv4_fp4_b300_vllm_mtp.sh, dsv4_fp4_b200_vllm_mtp.sh) already uses the correct decimal 1000^3, and now minimaxm3_fp4_b300_mtp.sh joins them after this PR's fix. The b200 minimaxm3 script is the lone active straggler — there's no shared helper computing this byte conversion, so each script duplicates the arithmetic independently and one was simply missed when the family was fixed elsewhere (or predates the fix pattern being adopted).

    Concretely: take the documented 1,024 GB budget point at dram-utilization 0.683/tp:4. The generator computes TOTAL_CPU_DRAM_GB = 1024 (decimal GB, per its own BYTES_PER_GB=1_000_000_000). The b300 script now correctly reconstructs 1024 * 1000^3 = 1,024,000,000,000 bytes and passes that as cpu_bytes_to_use to vLLM's SimpleCPUOffloadConnector. The b200 script instead reconstructs 1024 * 1024^3 = 1,099,511,627,776 bytes — vLLM is told it can use ~75.5 GB more host DRAM for CPU KV offload than the generator's proportional-GPU cap intended, silently eating into headroom the sizing logic assumed was free.

    Impact is bounded (b200-dgxc's ~3246 GB installed DRAM comfortably absorbs the extra ~75.5 GB for a single engine), so this doesn't break anything today and isn't something this PR needs to fix. But it's the identical defect this PR just resolved in the sibling file, and the parity comment sitting right next to the config block now makes an assertion that is code-verifiably false. The fix, when someone gets to it, is the one-line change: CPU_OFFLOAD_BYTES=$((TOTAL_CPU_DRAM_GB * 1000 * 1000 * 1000)) in minimaxm3_fp4_b200_mtp.sh:131, matching what this PR already did for b300.

Comment thread configs/nvidia-master.yaml
@github-actions

Copy link
Copy Markdown
Contributor

@xinli-sw

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run

@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/31833066181
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/31833066181
  • 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 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-b300-vllm-agentic-mtp AgentX search space to eight 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.

Validation and eval evidence. Run 31833066181 ran on the exact PR head 086298ae, attempt 1, and settled success with 16 success / 14 skipped / 0 failures. Eight agentic / benchmark jobs and one agentic eval / job executed and passed; setup and canary-select both succeeded, so the matrix genuinely ran rather than being skipped under a reuse gate.

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 (minimaxm3_eagle3.yaml) reads 2.83 at the same level and is not used. No acceptance target is substituted.

Answering the creator lane's SPECDEC_EVAL_GUARD question directly — with EVAL_ONLY=true, synthetic acceptance is off. benchmarks/single_node/agentic/minimaxm3_fp4_b300_mtp.sh branches on EVAL_ONLY and builds the eval SPEC_CONFIG as {"method":"eagle3","model":...,"num_speculative_tokens":3,"attention_backend":"FLASH_ATTN"} — omitting rejection_sample_method: "synthetic" and synthetic_acceptance_length. Throughput jobs get synthetic acceptance pinned to the golden AL; eval jobs get real verification. The eval score in the linked run is therefore uncorrupted. On the chat-template item: this is the AgentX path replaying real agentic-coding trajectories, and the acceptance length is pinned to a golden curve that was itself measured through the model's chat template (thinking_on chat_template_kwargs: {"thinking_mode": "enabled"}), so the AL distribution is aligned to real-world usage.

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 in the official vLLM recipes repository. It records b300: verified, covers the NVIDIA Blackwell NVFP4 variant, and documents an eagle3_gqa mode pinning Inferact/MiniMax-M3-EAGLE3-GQA with num_speculative_tokens: 3 and attention_backend: FLASH_ATTN — matching this submission's draft head, speculative token count, and attention backend. 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 Single-turn 8k1k recorded as deprecated (removed 2026-08-04, #2493). This submission is agentic-coding only. MODELS.md also records the engine expectation for this model as the native/upstream vLLM engine with Inferact/MiniMax-M3-EAGLE3 and/or Inferact/MiniMax-M3-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 vLLM image runs as shipped.

Recorded exceptions — 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 25 config keys and 54 recipe paths across dsr1-*, dsv4-*, and qwen3.5-*, 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 in either finding, and this PR neither introduces nor can remedy them. They are accepted here as pre-existing repo-wide drift at the reviewing maintainer's direction, and are recorded rather than treated as satisfied. They remain open against the repository and are worth clearing separately.

Signed: Ankur-singh

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

Copy link
Copy Markdown
Collaborator

❌❌❌ REJECTED ❌❌❌

@Ankur-singh — the sign-off uses a stale checklist template: #2613 added an append-only: true verification item to docs/PR_REVIEW_CHECKLIST.md at 2026-08-14T23:33Z, before this sign-off was posted (23:46Z), and the sign-off omits it. Please re-post the sign-off from the current template. Everything else verified clean at head 086298ae.

✅ Check 0 (CODEOWNER): PASS — Ankur-singh owns configs/nvidia-master.yaml; perf-changelog.yaml is catch-all-only, covered.
✅ Check 1 (sweep on in-PR commit): PASS — head 086298ae has 8 green executed agentic / + green agentic eval / check-runs from run 31833066181.
✅ Check 2 (eval accuracy): PASS — gsm8k em_strict 0.9697 ≥ 0.90 bar (utils/evals/thresholds.yaml default), on this PR's image nightly-ac7509e2.
✅ Check 3 (recipe): PASS — published MiniMax-M3.yaml covers nvidia/MiniMax-M3-NVFP4, b300 verified, kv fp8, FLASHINFER+trtllm attention, eagle3_gqa draft with 3 spec tokens / FLASH_ATTN, block-size 128; all major args match. Synthetic-acceptance knobs are InferenceX AgentX-specific (informational).
✅ Check 4 (reuse command): PASS — /reuse-sweep-run posted by xinli-sw (COLLABORATOR) 2026-08-14T22:31Z.
❌ Check 5 (latest template): FAIL — sign-off is missing the current template's append-only: true item, added by #2613 (merged 23:33Z) before the sign-off (23:46Z); re-sign with the current template.
✅ Check 6 (upstream image / ordering): PASS — vllm/vllm-openai:nightly-ac7509e2... is upstream on established B300; framework is vLLM itself, no ordering issue.
✅ Check 7 (deprecated models): PASS — MODELS.md lists MiniMax-M3 active for Agentic coding as of 2026-08-14; the deprecated 1k1k/8k1k scenarios are untouched.
✅ Check 8 (architecture hacks): PASS — diff is two YAML files; no --hf-overrides or FLOPs-reducing overrides.
✅ Check 9 (spec-decode chat template): PASS — AgentX replay drives chat completions with --default-chat-template-kwargs '{"thinking_mode":"enabled"}' and tool/reasoning parsers.
✅ Check 10 (engine patches): PASS — no patching; pinned image runs as shipped.
✅ Check 11 (agentic golden AL): PASS — SYNTHETIC_ACCEPT_LEN=2.78 = golden_al_distribution/minimaxm3_eagle3_gqa.yaml thinking_on[3] for the GQA draft head at NUM_SPEC_TOKENS=3; eval jobs run real verification; no synthetic knobs on non-agentic configs.
➖ Check 12 (append-only): N/A — the new perf-changelog.yaml entry does not set append-only: true.

@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/31833066181
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/31833066181
  • 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-b300-vllm-agentic-mtp AgentX search space to eight 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.

Validation and eval evidence. Run 31833066181 ran on the exact PR head 086298ae, attempt 1, and settled success with 16 success / 14 skipped / 0 failures. Eight agentic / benchmark jobs and one agentic eval / job executed and passed; setup and canary-select both succeeded, so the matrix genuinely ran rather than being skipped under a reuse gate.

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 (minimaxm3_eagle3.yaml) reads 2.83 at the same level and is not used. No acceptance target is substituted.

Answering the creator lane's SPECDEC_EVAL_GUARD question directly — with EVAL_ONLY=true, synthetic acceptance is off. benchmarks/single_node/agentic/minimaxm3_fp4_b300_mtp.sh branches on EVAL_ONLY and builds the eval SPEC_CONFIG as {"method":"eagle3","model":...,"num_speculative_tokens":3,"attention_backend":"FLASH_ATTN"} — omitting rejection_sample_method: "synthetic" and synthetic_acceptance_length. Throughput jobs get synthetic acceptance pinned to the golden AL; eval jobs get real verification. The eval score in the linked run is therefore uncorrupted. On the chat-template item: this is the AgentX path replaying real agentic-coding trajectories, and the acceptance length is pinned to a golden curve that was itself measured through the model's chat template (thinking_on chat_template_kwargs: {"thinking_mode": "enabled"}), so the AL distribution is aligned to real-world usage.

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 in the official vLLM recipes repository. It records b300: verified, covers the NVIDIA Blackwell NVFP4 variant, and documents an eagle3_gqa mode pinning Inferact/MiniMax-M3-EAGLE3-GQA with num_speculative_tokens: 3 and attention_backend: FLASH_ATTN — matching this submission's draft head, speculative token count, and attention backend. 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 Single-turn 8k1k recorded as deprecated (removed 2026-08-04, #2493). This submission is agentic-coding only. MODELS.md also records the engine expectation for this model as the native/upstream vLLM engine with Inferact/MiniMax-M3-EAGLE3 and/or Inferact/MiniMax-M3-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 vLLM image runs as shipped.

Recorded exceptions — 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 25 config keys and 54 recipe paths across dsr1-*, dsv4-*, and qwen3.5-*, 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 in either finding, and this PR neither introduces nor can remedy them. They are accepted here as pre-existing repo-wide drift at the reviewing maintainer's direction, and are recorded rather than treated as satisfied. They remain open against the repository and are worth clearing separately.

Append-only item — not applicable to this PR. This submission does not set append-only: true. The new perf-changelog.yaml entry declares only config-keys, scenario-type, description, and pr-link, and neither that entry nor the minimaxm3-fp4-b300-vllm-agentic-mtp block in configs/nvidia-master.yaml sets the flag. The change is also not additive in substance: it removes previously generated points (the former TP4 C2 and the TP2 no-offload C1/C2/C5 rows) and trims the TP4 SimpleCPU offload arm from C30-75 to C30, so the whole curve is re-run rather than appended to. The item's condition is therefore not triggered, and it is recorded as not applicable rather than as a performed append-only verification.

Why this sign-off was re-posted. This supersedes my earlier sign-off on this PR (comment 5299256551), which codeowner-signoff-verify rejected on one ground only: #2613 added the append-only: true item to docs/PR_REVIEW_CHECKLIST.md at 2026-08-14T23:33Z, 13 minutes before that sign-off was posted at 23:46Z, so it was rendered from a template that had just gone stale. The verifier confirmed every other check clean at head 086298ae (CODEOWNER, in-PR-commit sweep, eval accuracy, recipe, reuse command, upstream image and ordering, deprecated models, architecture hacks, spec-decode chat template, engine patches, agentic golden AL). This re-post is rendered from the current template; no substantive attestation has changed.

Signed: Ankur-singh

@Klaud-Cold

Copy link
Copy Markdown
Collaborator

✅✅✅ Verdict: PASS ✅✅✅

Re-verification of the re-posted sign-off (comment 5299320039); the prior rejection's only ground (stale checklist template) is resolved, and all other checks re-derive clean at head 086298ae.

✅ Check 0 (CODEOWNER): PASS — configs/nvidia-master.yaml is specifically owned by @ankur-singh (last-matching line); perf-changelog.yaml falls to the catch-all, covered by any recognized CODEOWNER.
✅ Check 1 (sweep on in-PR commit): PASS — head 086298ae (in the PR) carries run 31833066181: all 8 per-config agentic / benchmark jobs (TP8 c1; TP4 c1/5/10/15/20; TP4 dram c30; TP2 dram c24) and the agentic eval / job executed with conclusion success — the exact 8-point matrix this PR configures. The skipped single-node *//eval / lanes have no configs in this agentic-only matrix.
✅ Check 2 (eval accuracy): PASS — run 31833066181's agg_eval_all.json: GSM8K em_strict 0.9697 ≥ the 0.90 bar (utils/evals/thresholds.yaml default; no minimaxm3 override), on the same image this PR pins (vllm/vllm-openai:nightly-ac7509e2b...).
✅ Check 3 (recipe): PASS — published upstream recipe models/MiniMaxAI/MiniMax-M3.yaml (b300: verified, NVFP4 variant) matches all major args: nvidia/MiniMax-M3-NVFP4, eagle3_gqa mode (Inferact/MiniMax-M3-EAGLE3-GQA, 3 spec tokens, FLASH_ATTN), --kv-cache-dtype fp8, FLASHINFER + trtllm attention with fp8 indexer KV, --block-size 128, --language-model-only, thinking-enabled chat template, VLLM_FLOAT32_MATMUL_PRECISION=high / VLLM_FLASHINFER_ALLREDUCE_BACKEND=trtllm. Informational only: synthetic-acceptance keys (golden-AL harness), SimpleCPU KV-offload connector, and batching/cudagraph/stream-interval tuning are InferenceX-specific.
✅ Check 4 (reuse command): PASS — /reuse-sweep-run posted by xinli-sw (COLLABORATOR), comment 5298811072.
✅ Check 5 (latest template): PASS — all 14 current docs/PR_REVIEW_CHECKLIST.md items, including the new append-only item from #2613, are present and checked.
✅ Check 6 (upstream image / ordering): PASS — vllm/vllm-openai:nightly-ac7509e2b... is the upstream vLLM Docker Hub org on B300; the framework is vLLM itself, so engine-first ordering is satisfied trivially.
✅ Check 7 (deprecated models): PASS — MODELS.md lists MiniMax-M3 agentic coding as active; the deprecated single-turn scenarios are untouched, and the planned non-EAGLE3 agentic round is both unenacted and inapplicable (this is EAGLE3).
✅ Check 8 (architecture hacks): PASS — the diff is two YAML files; no --hf-overrides or FLOPs-reducing knobs anywhere in the config or the unchanged launch script.
✅ Check 9 (spec-decode chat template): PASS — the AgentX replay drives chat-style traffic with --default-chat-template-kwargs '{"thinking_mode":"enabled"}', tool-call and reasoning parsers; the golden AL was itself measured through the chat template.
✅ Check 10 (engine patches): PASS — no .patch/git apply/heredoc/site-packages edits; the pinned upstream image runs as shipped.
✅ Check 11 (agentic golden AL): PASS — throughput jobs pin rejection_sample_method: synthetic with synthetic_acceptance_length: 2.78 = golden_al_distribution/minimaxm3_eagle3_gqa.yaml minimax-m3.thinking_on[3] (GQA curve matches the GQA draft head, NUM_SPEC_TOKENS=3, thinking on); EVAL_ONLY=true omits synthetic acceptance so evals run real verification; no synthetic knobs on any non-agentic config.
➖ Check 12 (append-only): N/A — no new perf-changelog.yaml entry sets append-only: true; the entry declares only config-keys/scenario-type/description/pr-link, and the change re-runs the whole curve rather than appending.

@github-actions

Copy link
Copy Markdown
Contributor

Usage: /stage-results or /stage-results <run-id>.

@cquil11

cquil11 commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator

/stage-results 31833066181

@github-actions

github-actions Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

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

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

@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 4a5cc44 into main Aug 16, 2026
30 checks passed
@Oseltamivir
Oseltamivir deleted the feat/minimaxm3-b300-agentx-pareto-refresh branch August 16, 2026 10:26
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