Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8dd8f0b
[AMD] feat: MiniMax M3 Day 0 support MI355X
cquil11 Jun 12, 2026
e803275
Merge branch 'main' into feat/minimax-m3-mi355x
cquil11 Jun 12, 2026
447bbe5
minimaxm3-fp8-mi355x-vllm: add perf-changelog entry
cquil11 Jun 12, 2026
ad1df2a
fix(amd): disable M3 graph capture on MI355X
cquil11 Jun 12, 2026
7209a3b
fix(amd): keep eager flag in serve command
cquil11 Jun 12, 2026
44741e3
fix(amd): use wave32 mask for M3 fused op
cquil11 Jun 12, 2026
277613f
fix(amd): compile M3 fused op as wave32
cquil11 Jun 12, 2026
40a5008
fix(amd): refresh M3 worker op loader
cquil11 Jun 12, 2026
137b4d3
refactor(amd): use upstream MiniMax M3 recipe
cquil11 Jun 12, 2026
bf697c8
fix(amd): use available MiniMax parsers
cquil11 Jun 12, 2026
e453206
chore(amd): test M3 ROCm release candidate image
cquil11 Jun 12, 2026
8f73bda
fix(amd): use M3 parsers with ROCm RC image
cquil11 Jun 12, 2026
a2f466e
fix(amd): bypass M3 decode graph capture
cquil11 Jun 12, 2026
e4cc6a6
fix(amd): use M3 recipe attention backend
cquil11 Jun 12, 2026
8de1cd6
fix(amd): match published M3 MXFP8 recipe
cquil11 Jun 12, 2026
a9ce153
fix(amd): run M3 text sweeps without graph capture
cquil11 Jun 12, 2026
18fb62e
fix(amd): force M3 Triton attention backend
cquil11 Jun 12, 2026
567f264
feat(amd): expand M3 MI355X sweep matrix
cquil11 Jun 12, 2026
eb48c54
Merge remote-tracking branch 'origin/main' into feat/minimax-m3-mi355x
cquil11 Jun 13, 2026
4a583eb
fix(amd): use dedicated M3 ROCm image
cquil11 Jun 13, 2026
2d15f24
Merge remote-tracking branch 'origin/main' into feat/minimax-m3-mi355x
cquil11 Jun 13, 2026
3b7e102
fix(amd): align M3 with official ROCm recipe
cquil11 Jun 13, 2026
e94de69
Merge branch 'main' into feat/minimax-m3-mi355x
functionstackx Jun 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/configs/amd-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2780,3 +2780,33 @@ dsv4-fp4-mi355x-atom-disagg:
dp-attn: false
additional-settings:
- "DECODE_NODES=1"

# MiniMax-M3 MXFP8 MI355X recipe:
# https://github.com/vllm-project/recipes/commit/2a3728ed9892debfd767a72a58ebc90b33f186e5
# MXFP8 runs from TP=4 on gfx950; block size 128 is mandatory for MSA.
minimaxm3-fp8-mi355x-vllm:
image: vllm/vllm-openai-rocm:minimax-m3
model: MiniMaxAI/MiniMax-M3-MXFP8
model-prefix: minimaxm3
runner: mi355x
precision: fp8
framework: vllm
multinode: false
scenarios:
fixed-seq-len:
- isl: 1024
osl: 1024
search-space:
- { tp: 8, conc-start: 1, conc-end: 64 }
- { tp: 8, ep: 8, conc-start: 1, conc-end: 512 }
- { tp: 4, conc-start: 1, conc-end: 64 }
- { tp: 4, ep: 4, conc-start: 64, conc-end: 512 }
- { tp: 2, ep: 2, conc-start: 16, conc-end: 128 }
- { tp: 8, ep: 8, dp-attn: true, conc-start: 256, conc-end: 1024 }
- isl: 8192
osl: 1024
search-space:
- { tp: 8, conc-start: 1, conc-end: 64 }
- { tp: 8, ep: 8, conc-start: 1, conc-end: 512 }
- { tp: 4, conc-start: 1, conc-end: 128 }
- { tp: 8, ep: 8, dp-attn: true, conc-start: 128, conc-end: 512 }
86 changes: 86 additions & 0 deletions benchmarks/single_node/fixed_seq_len/minimaxm3_fp8_mi355x.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#!/usr/bin/env bash

# MiniMax-M3 MXFP8 MI355X (gfx950) single-node vLLM recipe.
# https://github.com/vllm-project/recipes/commit/2a3728ed9892debfd767a72a58ebc90b33f186e5
# The recipe recommends MXFP8 from TP=4 on gfx950 and requires block size 128.

source "$(dirname "$0")/../../benchmark_lib.sh"

check_env_vars \
MODEL \
TP \
EP_SIZE \
DP_ATTENTION \
CONC \
ISL \
OSL \
MAX_MODEL_LEN \
RANDOM_RANGE_RATIO \
RESULT_FILENAME

if [[ -n "$SLURM_JOB_ID" ]]; then
echo "JOB $SLURM_JOB_ID running on $SLURMD_NODENAME"
fi

if [[ "$MODEL" != /* ]]; then hf download "$MODEL"; fi

if [ -n "$ROCR_VISIBLE_DEVICES" ]; then
export HIP_VISIBLE_DEVICES="$ROCR_VISIBLE_DEVICES"
fi

SERVER_LOG=/workspace/server.log
export VLLM_ENGINE_READY_TIMEOUT_S=3600

if [ "${EVAL_ONLY}" = "true" ]; then
setup_eval_context
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Eval-only max length not applied

Medium Severity

In EVAL_ONLY mode the script calls setup_eval_context but never assigns MAX_MODEL_LEN from EVAL_MAX_MODEL_LEN before vllm serve. The server keeps the sweep’s benchmark MAX_MODEL_LEN while eval uses the capped context, which can break eval-only runs or over-allocate KV versus the model limit.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 2d15f24. Configure here.


PARALLEL_ARGS=(--tensor-parallel-size "$TP")
if [ "${DP_ATTENTION}" = "true" ]; then
PARALLEL_ARGS=(
--tensor-parallel-size 1
--data-parallel-size "$TP"
--enable-expert-parallel
)
elif [ "$EP_SIZE" -gt 1 ]; then
PARALLEL_ARGS+=(--enable-expert-parallel)
fi

start_gpu_monitor

set -x
vllm serve "$MODEL" --port "$PORT" \
Comment thread
cursor[bot] marked this conversation as resolved.
"${PARALLEL_ARGS[@]}" \
--block-size 128 \
--language-model-only \
--max-model-len "$MAX_MODEL_LEN" \
--kv-cache-dtype fp8 \
--attention-backend TRITON_ATTN \
--enforce-eager \
--tool-call-parser minimax_m3 \
--reasoning-parser minimax_m3 \
--enable-auto-tool-choice > "$SERVER_LOG" 2>&1 &
Comment on lines +52 to +62

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.

🔴 BLOCKING: Missing --trust-remote-code on vllm serve

Why it matters: Every other MiniMax benchmark script (M2.5 MI355X, M2.5 MI300X/MI325X/H200/B300, and M3 B300) passes --trust-remote-code to vllm serve. MiniMax models use custom modeling code that vLLM needs to download and execute. Without this flag, the server will fail to load the model. The flag on run_benchmark_serving (line 77) only applies to the benchmark client, not the server.

Fix:

Suggested change
vllm serve "$MODEL" --port "$PORT" \
"${PARALLEL_ARGS[@]}" \
--block-size 128 \
--language-model-only \
--max-model-len "$MAX_MODEL_LEN" \
--attention-backend TRITON_ATTN \
--enforce-eager \
--tool-call-parser minimax_m3 \
--reasoning-parser minimax_m3 \
--enable-auto-tool-choice > "$SERVER_LOG" 2>&1 &
vllm serve "$MODEL" --port "$PORT" \
"${PARALLEL_ARGS[@]}" \
--block-size 128 \
--language-model-only \
--max-model-len "$MAX_MODEL_LEN" \
--attention-backend TRITON_ATTN \
--enforce-eager \
--tool-call-parser minimax_m3 \
--reasoning-parser minimax_m3 \
--enable-auto-tool-choice \
--trust-remote-code > "$SERVER_LOG" 2>&1 &

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Missing trust-remote-code on serve

Medium Severity

The new MI355X MiniMax-M3 script starts vllm serve without --trust-remote-code, while the sibling minimaxm3_fp8_b200.sh and dsv4_fp4_mi355x_vllm.sh pass it on the server command. MiniMax checkpoints often need custom model code at load time, so this mismatch can cause serve startup failures or divergent behavior on ROCm even when the benchmark client still passes --trust-remote-code.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 3b7e102. Configure here.


SERVER_PID=$!
wait_for_server_ready --port "$PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID"

run_benchmark_serving \
--model "$MODEL" \
--port "$PORT" \
--backend vllm \
--input-len "$ISL" \
--output-len "$OSL" \
--random-range-ratio "$RANDOM_RANGE_RATIO" \
--num-prompts "$((CONC * 10))" \
--max-concurrency "$CONC" \
--result-filename "$RESULT_FILENAME" \
--result-dir /workspace/ \
--trust-remote-code

if [ "${RUN_EVAL}" = "true" ]; then
run_eval --framework lm-eval --port "$PORT"
append_lm_eval_summary
fi

stop_gpu_monitor
set +x
11 changes: 11 additions & 0 deletions perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3706,3 +3706,14 @@
- "Drafter pinned to FLASH_ATTN via speculative-config attention_backend: the EAGLE3 head is MHA and FlashInfer only supports the mandatory page size 128 through its GQA-only trtllm-gen kernel"
- "Layouts: TP8 / TP4 (latency), TP8+EP8 / TP4+EP4 (TEP), TP8+EP8 dp-attn (DEP) across 1k1k and 8k1k — non-MTP search space trimmed at the extreme-concurrency end, mirroring the minimaxm3-fp8-b300-vllm-mtp search space"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1741

- config-keys:
- minimaxm3-fp8-mi355x-vllm
description:
- "Initial submission: MiniMax-M3 MXFP8 day-zero single-node vLLM benchmark on MI355X / gfx950 (model: MiniMaxAI/MiniMax-M3-MXFP8, 427B total / 26B active MoE with MSA sparse attention)"
- "Image: vllm/vllm-openai-rocm:minimax-m3"
- "Matches vllm-project/recipes@2a3728ed MI355X guidance with --block-size 128, --attention-backend TRITON_ATTN, --kv-cache-dtype fp8, MiniMax-M3 tool/reasoning parsers, and automatic tool choice"
- "MI355X deviations required for fixed-sequence text benchmarking: --language-model-only, scenario-specific --max-model-len, and --enforce-eager to bypass the M3 decode CUDA-graph assertion"
- "B300-parity layouts and concurrency ranges: TP8, TP8+EP8, TP4, TP4+EP4, TP2+EP2, and TP8+EP8 dp-attn (DEP) across 1k1k and 8k1k"
- "launch_mi355x-amds.sh routes M3 weights to NFS /it-share/hf-hub-cache instead of node-local /var/lib NVMe"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1725
6 changes: 6 additions & 0 deletions runners/launch_mi355x-amds.sh
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,12 @@ else
export HF_HUB_CACHE_MOUNT="/it-share/hf-hub-cache/"
fi

# MiniMax-M3 weights are not staged on the node-local /var/lib NVMe cache;
# they are pre-downloaded once to the NFS share instead.
if [[ "$MODEL" == MiniMaxAI/MiniMax-M3* ]]; then
export HF_HUB_CACHE_MOUNT="/it-share/hf-hub-cache/"
fi

SCRIPT_BASE="${EXP_NAME%%_*}_${PRECISION}_mi355x"
SCRIPT_FW="benchmarks/single_node/${SCENARIO_SUBDIR:-fixed_seq_len/}${SCRIPT_BASE}_${FRAMEWORK}${SPEC_SUFFIX}.sh"
SCRIPT_FALLBACK="benchmarks/single_node/${SCENARIO_SUBDIR:-fixed_seq_len/}${SCRIPT_BASE}${FRAMEWORK_SUFFIX}${SPEC_SUFFIX}.sh"
Expand Down
Loading