From 6abc71fa300f558192b5d02321477c764ba21587 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 14 Jun 2026 03:24:21 -0400 Subject: [PATCH] [AMD] feat: MiniMax M3 day-zero benchmark for MI325X Rebased onto main: MiniMax-M3 MXFP8 MI325X day-zero recipe (script + amd-master entry + perf-changelog + mi325x launcher tuning), plus VLLM_USE_BREAKABLE_CUDAGRAPH=0 so the recipe runs with CUDA graphs. Consolidated the branch's commits onto current main (which now carries the mi300x non-MTP/MTP recipes) to resolve the amd-master/changelog EOF-append conflicts. Co-Authored-By: functionstackx <47992694+functionstackx@users.noreply.github.com> Co-Authored-By: Claude Fable 5 --- .github/configs/amd-master.yaml | 29 +++++++ .../fixed_seq_len/minimaxm3_fp8_mi325x.sh | 86 +++++++++++++++++++ perf-changelog.yaml | 9 ++ runners/launch_mi325x-amds.sh | 6 +- 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100755 benchmarks/single_node/fixed_seq_len/minimaxm3_fp8_mi325x.sh diff --git a/.github/configs/amd-master.yaml b/.github/configs/amd-master.yaml index f18b3f94e..91ed7b6c9 100644 --- a/.github/configs/amd-master.yaml +++ b/.github/configs/amd-master.yaml @@ -2901,3 +2901,32 @@ minimaxm3-fp8-mi300x-vllm-mtp: search-space: - { tp: 8, conc-start: 1, conc-end: 64, spec-decoding: mtp } - { tp: 8, ep: 8, conc-start: 128, conc-end: 256, spec-decoding: mtp } + +# MiniMax-M3 MXFP8 MI325X day-zero recipe. Reuse the dedicated ROCm image +# and serving flags validated on MI355X, with the H200 search space: TP4 and +# TP8 latency, TP4/TP8 expert parallelism, and TP8 data-parallel attention. +minimaxm3-fp8-mi325x-vllm: + image: vllm/vllm-openai-rocm:minimax-m3 + model: MiniMaxAI/MiniMax-M3-MXFP8 + model-prefix: minimaxm3 + runner: mi325x + precision: fp8 + framework: vllm + multinode: false + scenarios: + fixed-seq-len: + - isl: 1024 + osl: 1024 + search-space: + - { tp: 4, conc-start: 4, conc-end: 64 } + - { tp: 4, ep: 4, conc-start: 128, conc-end: 256 } + - { tp: 8, conc-start: 4, conc-end: 128 } + - { tp: 8, ep: 8, conc-start: 256, conc-end: 512 } + - { tp: 8, ep: 8, dp-attn: true, conc-start: 256, conc-end: 1024 } + - isl: 8192 + osl: 1024 + search-space: + - { tp: 4, conc-start: 4, conc-end: 32 } + - { tp: 8, conc-start: 4, conc-end: 128 } + - { tp: 8, ep: 8, conc-start: 256, conc-end: 256 } + - { tp: 8, ep: 8, dp-attn: true, conc-start: 256, conc-end: 512 } diff --git a/benchmarks/single_node/fixed_seq_len/minimaxm3_fp8_mi325x.sh b/benchmarks/single_node/fixed_seq_len/minimaxm3_fp8_mi325x.sh new file mode 100755 index 000000000..6290722fe --- /dev/null +++ b/benchmarks/single_node/fixed_seq_len/minimaxm3_fp8_mi325x.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# MiniMax-M3 MXFP8 MI325X (gfx942) single-node vLLM recipe. +# https://recipes.vllm.ai/MiniMaxAI/MiniMax-M3?hardware=mi325x&variant=mxfp8 +# MXFP8 runs from TP=4 on gfx942; block size 128 is mandatory for MSA. + +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 +export VLLM_USE_BREAKABLE_CUDAGRAPH=0 + +if [ "${EVAL_ONLY}" = "true" ]; then + setup_eval_context +fi + +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" \ + "${PARALLEL_ARGS[@]}" \ + --block-size 128 \ + --language-model-only \ + --max-model-len "$MAX_MODEL_LEN" \ + --attention-backend TRITON_ATTN \ + --no-enable-prefix-caching \ + --tool-call-parser minimax_m3 \ + --reasoning-parser minimax_m3 \ + --enable-auto-tool-choice > "$SERVER_LOG" 2>&1 & + +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 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 36ddee83f..64b2feb30 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -3761,3 +3761,12 @@ description: - "Enable CUDA graphs for MiniMax-M3 MXFP8 on MI300X and set VLLM_USE_BREAKABLE_CUDAGRAPH=0 per AMD guidance" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1750 + +- config-keys: + - minimaxm3-fp8-mi325x-vllm + description: + - "Initial submission: MiniMax-M3 MXFP8 day-zero single-node vLLM benchmark on MI325X / gfx942" + - "Follows the official MI325X MXFP8 recipe with vllm/vllm-openai-rocm:minimax-m3, block size 128, TRITON_ATTN, and MiniMax-M3 tool/reasoning parsers; fixed-sequence text benchmarking adds language-model-only, the default BF16 KV cache, disabled prefix caching, and a scenario-specific max model length" + - "H200-aligned layouts and concurrency ranges: TP4 and TP8 latency, TP4/TP8 expert parallelism, and TP8 data-parallel attention across 1k1k and 8k1k" + - "Route the MI325X Hugging Face cache and runtime compiler caches to node-local storage, and mount ROCm GPU devices explicitly" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1748 diff --git a/runners/launch_mi325x-amds.sh b/runners/launch_mi325x-amds.sh index e12074294..1de274476 100644 --- a/runners/launch_mi325x-amds.sh +++ b/runners/launch_mi325x-amds.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -export HF_HUB_CACHE_MOUNT="/nfsdata/sa/gharunner/gharunners/hf-hub-cache/" +export HF_HUB_CACHE_MOUNT="/local-nvme/hf-hub-cache/" PARTITION="compute" SQUASH_FILE="/nfsdata/sa/gharunner/gharunners/squash/$(echo "$IMAGE" | sed 's/[\/:@#]/_/g').sqsh" @@ -17,6 +17,8 @@ if [ -z "$JOB_ID" ]; then fi export PORT=$(( 40000 + (JOB_ID % 10000) )) +export XDG_CACHE_HOME="/tmp/xdg-cache-$JOB_ID" +export TRITON_CACHE_DIR="/tmp/triton-cache-$JOB_ID" trap 'rc=$?; scancel "$JOB_ID" 2>/dev/null || true; exit "$rc"' EXIT @@ -34,7 +36,7 @@ srun --jobid="$JOB_ID" --job-name="$RUNNER_NAME" bash -c " " srun --jobid="$JOB_ID" \ --container-image="$SQUASH_FILE" \ ---container-mounts="$GITHUB_WORKSPACE:/workspace/,$HF_HUB_CACHE_MOUNT:$HF_HUB_CACHE" \ +--container-mounts="$GITHUB_WORKSPACE:/workspace/,$HF_HUB_CACHE_MOUNT:$HF_HUB_CACHE,/dev/kfd:/dev/kfd,/dev/dri:/dev/dri" \ --container-mount-home \ --container-writable \ --container-remap-root \