Skip to content

feat: add MiniMax-M3 RTX 6000 Pro vLLM recipe / 新增 MiniMax-M3 RTX 6000 Pro vLLM 基准配置#2306

Open
Oseltamivir wants to merge 12 commits into
mainfrom
agent/minimaxm3-rtx6000pro-vllm
Open

feat: add MiniMax-M3 RTX 6000 Pro vLLM recipe / 新增 MiniMax-M3 RTX 6000 Pro vLLM 基准配置#2306
Oseltamivir wants to merge 12 commits into
mainfrom
agent/minimaxm3-rtx6000pro-vllm

Conversation

@Oseltamivir

Copy link
Copy Markdown
Collaborator

No description provided.

Register the Latitude RTX 6000 Pro runner and add a TP8 NVFP4 vLLM sweep config, Docker launcher, and benchmark recipe.

中文:注册 Latitude RTX 6000 Pro 运行器,并新增 TP8 NVFP4 vLLM 扫描配置、Docker 启动器和基准测试配方。
@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 关于重新运行失败任务的文档

Record the final pull request URL for the RTX 6000 Pro MiniMax-M3 benchmark entry.

中文:为 RTX 6000 Pro MiniMax-M3 基准测试条目记录最终的拉取请求链接。
@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.

LGTM — straightforward new-hardware bring-up recipe (RTX PRO 6000) following the established single-node vLLM recipe pattern.

What was reviewed: the new benchmark script against its B200 NVFP4 counterpart (same vLLM flags, NCCL all-reduce swapped in for the PCIe topology as the comment explains), the new docker-based launch_rtx6000pro-lat.sh against the existing launch_h100-cr.sh docker-run launcher pattern (adds GPU_COUNT validation and a stale-container cleanup trap not present in the older script), and the runners.yaml/nvidia-master.yaml additions for consistency with existing cluster entries. The scenario is scoped to a single TP8/conc=1 canary, consistent with a first bring-up.

Extended reasoning...

This PR adds a new hardware target (8x RTX PRO 6000 Blackwell) for the MiniMax-M3 NVFP4 vLLM recipe: a new benchmark script, a new Docker-based runner launcher, and config/changelog entries wiring it into the sweep matrix.

Security risks

None identified. The new launch_rtx6000pro-lat.sh runs docker run --privileged with a broad --env allowlist, but this mirrors the existing launch_h100-cr.sh and launch_mi325x-tw.sh docker-based launchers already in the repo — same trust model (CI-controlled env vars, no user-controlled input reaching the container). The image is pinned by sha256 digest.

Level of scrutiny

Low-to-moderate. This is infra/config for an internal benchmark harness, not production-serving code, and it closely follows established patterns rather than introducing new mechanisms. I compared the new benchmark script line-by-line against minimaxm3_fp4_b200.sh and the new launcher against launch_h100-cr.sh; both are faithful adaptations with sensible topology-specific changes (NCCL all-reduce instead of FlashInfer/TRT-LLM, since RTX PRO 6000 lacks NVLink).

Other factors

The bug-hunting pass found nothing, and the two candidate issues it ruled out (placeholder-looking PR link, unverified image digest) are both non-issues on inspection — the PR link correctly points to #2306 and the digest pin is the same pattern used elsewhere in nvidia-master.yaml. The new runner launcher adds defensive touches (GPU_COUNT integer validation, stale-container cleanup trap) beyond what older docker launchers have, which is a plus. Scope is limited to a single canary scenario (TP8, concurrency=1), appropriate for initial hardware bring-up.

Avoid the NCCL 2.28.9 bnxt_re initialization segfault by defaulting this single-node runner to non-IB transport.

中文:默认禁用该单节点运行器的 NCCL IB 传输,避免 NCCL 2.28.9 初始化 bnxt_re 时发生段错误。
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

Force the non-FlashInfer Marlin MoE backend, preserve MiniMax-M3 SwiGLU parameters with a documented compatibility patch, and use Triton attention for block size 128.

中文:在 SM120 上强制使用非 FlashInfer 的 Marlin 混合专家后端,通过已记录豁免的兼容补丁保留 MiniMax-M3 的 SwiGLU 参数,并为 128 块大小使用 Triton 注意力后端。
@github-actions

Copy link
Copy Markdown
Contributor

Run the 8k/1k recipe at concurrency 1, 4, 16, and 64 for both execution modes.\n\n为两种执行模式添加 8k/1k 并发 1、4、16 和 64 的扫描。
Note that the Marlin DEP8 arm must keep the standard all-gather/reduce-scatter activation layout.

说明 Marlin DEP8 配置必须保留标准的全收集与归约分散激活布局。
Comment on lines +61 to +69
VLLM_SITE_PACKAGES="$(
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
)"
VLLM_MARLIN_PATCH=/workspace/benchmarks/patches/vllm/minimax_m3_nvfp4_marlin.patch
if ! patch --batch --forward --fuzz=0 -p1 -d "$VLLM_SITE_PACKAGES" \
< "$VLLM_MARLIN_PATCH"; then
echo "Failed to apply the pinned MiniMax-M3 Marlin compatibility patch" >&2
exit 1
fi

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 Marlin compatibility patch step (lines 61-69) hard-aborts if patch --forward returns nonzero, but --forward does not make re-applying an already-applied patch a no-op — GNU patch exits 1 with "Reversed (or previously applied) patch detected!" in that case too. This breaks re-running the script against an already-patched vLLM install (e.g. the repo's own debug-runs fast-iteration workflow of SSHing onto the runner and re-running in the same container), and will also bite if the pinned image ever upstreams just one of the two patch hunks. The sibling minimaxm3_fp8_b200.sh recipe avoids this by explicitly detecting the already-applied state before failing.

Extended reasoning...

The bug: minimaxm3_fp4_rtx6000pro.sh lines 65-69 run:

if ! patch --batch --forward --fuzz=0 -p1 -d "$VLLM_SITE_PACKAGES" < "$VLLM_MARLIN_PATCH"; then
    echo "Failed to apply the pinned MiniMax-M3 Marlin compatibility patch" >&2
    exit 1
fi

The intent of --forward (GNU patch's -N) is presumably to make the script idempotent — i.e., skip hunks that are already applied so re-running the script against a previously-patched vLLM install doesn't fail. That's not what it does. --forward only suppresses applying a patch that would go backwards relative to already-modified source; it does not exit 0 when a hunk is already present. On a second apply of the identical patch, GNU patch prints Reversed (or previously applied) patch detected! Skipping patch., writes a .rej file, and exits 1 — a status this script treats identically to a genuinely broken/mismatched patch.

Reachability: normal CI is unaffected, since runners/launch_rtx6000pro-lat.sh uses docker run --rm, giving a fresh, unpatched container on every invocation. The failure mode is triggered by this repo's own debug-runs skill, which instructs engineers to SSH onto the runner and re-run the benchmark script directly in the same live container (via docker exec/enroot) for fast iteration on things like CONC. The second invocation in that same container hits an already-patched vLLM tree and hard-fails at the patch step before vllm serve even starts, defeating the fast-iteration workflow the skill exists for. It would also resurface once the pinned image upstreams just one of the two patch hunks (per the removal plan in docs/waiver/2306.md) before the patch file is deleted — a partially-applied multi-hunk patch still returns nonzero overall even though the still-needed hunk would apply cleanly.

Step-by-step proof:

  1. First run: container has an unpatched vLLM install. patch --batch --forward --fuzz=0 -p1 -d $VLLM_SITE_PACKAGES < minimax_m3_nvfp4_marlin.patch applies both hunks cleanly, exits 0. vllm serve starts normally.
  2. Engineer SSHes onto the runner mid-debug, re-runs the same script in the same container to tweak CONC.
  3. patch is invoked again against the now-already-patched nvfp4.py and marlin_moe.py. GNU patch detects both hunks are already present, prints "Reversed (or previously applied) patch detected! Skipping patch.", writes .rej, and exits 1.
  4. The script's if ! patch ...; then echo ...; exit 1; fi treats this exit code as failure and aborts before vllm serve is ever invoked — even though the vLLM install is in the exact state the script wants it in.

Why nothing else prevents this: --fuzz=0 and -p1 only control hunk-matching leniency and path stripping; neither affects idempotency. There's no pre-check for an already-patched state, unlike the sibling minimaxm3_fp8_b200.sh recipe (lines ~30-55), which runs a small Python idempotent-patch routine that explicitly prints [minimax-m3-msa-patch] already applied and treats that as success rather than failure — i.e., idempotency is a known, established concern for these runtime-patch recipes that this new recipe doesn't carry over.

Suggested fix: mirror the b200 recipe's approach (an idempotent Python-based patch application, or a pre-check such as patch --dry-run -R to detect 'already applied' and treat it as success rather than failure) so re-running the script against an already-patched install is a no-op instead of a hard failure.

Severity: all three independent verifiers empirically confirmed the behavior with GNU patch and agreed on nit — this is a real, reproducible bug, but normal CI (fresh container per run) is unaffected; it only degrades the manual/debug re-run path and the future partial-upstream scenario, not the sweep this PR is being merged for.

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

--- a/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py
+++ b/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py
@@ -176,2 +176,3 @@
NvFp4MoeBackend.FLASHINFER_TRTLLM,

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.

maybe upstream if sm120 then marlin else flashinfer?

Add the TP4 and TP4/EP4 MTP sweep with the external EAGLE3 draft, SM120-safe Triton attention, concurrency-sized decode graphs, and chat-formatted prompts. Keep the required Marlin compatibility patch and document its expanded scope.

中文:新增使用外部 EAGLE3 草稿模型的 TP4 与 TP4/EP4 MTP 扫描,采用兼容 SM120 的 Triton attention、按并发数调整的解码 CUDA Graph,以及聊天模板格式的提示词。保留必需的 Marlin 兼容补丁并扩展其豁免文档范围。
Warm the Hugging Face cache without capturing the formatted hf CLI output, then pass stable target and draft identifiers to vLLM.

中文:预热 Hugging Face 缓存时不再捕获 hf CLI 的格式化输出,并将稳定的目标模型与草稿模型标识传给 vLLM。
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

中文:将 origin/main 合并到 MiniMax-M3 RTX 分支。
@Oseltamivir
Oseltamivir force-pushed the agent/minimaxm3-rtx6000pro-vllm branch from 8ba9324 to 6ba91f8 Compare July 25, 2026 07:56
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.

2 participants