From 834c900b044d2b0238d791ddb8dbd0501153e237 Mon Sep 17 00:00:00 2001 From: functionstackx <47992694+functionstackx@users.noreply.github.com> Date: Thu, 30 Jul 2026 01:11:38 -0400 Subject: [PATCH 1/4] feat(minimaxm3-mi325x-agentic-mtp): add EAGLE3 AgentX recipe with golden-AL synthetic acceptance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add minimaxm3-fp8-mi325x-vllm-agentic-mtp, the spec-decoding=mtp variant of the MiniMax-M3 MXFP8 MI325X agentic-coding recipe: Inferact/MiniMax-M3-EAGLE3 draft head, 3 speculative tokens, no drafter backend pin (server-wide TRITON_ATTN), and synthetic acceptance pinned to the committed golden AL 2.83 (minimaxm3_eagle3.yaml, thinking_on, K=3). EVAL_ONLY keeps real verification. The pinned ROCm nightly postdates vllm-project/vllm#45546, so no in-place SupportsEagle3 patch is needed. 中文:新增 minimaxm3-fp8-mi325x-vllm-agentic-mtp,即 MiniMax-M3 MXFP8 MI325X 智能体 编码配方的投机解码(spec-decoding=mtp)变体:Inferact/MiniMax-M3-EAGLE3 草稿头、 3 个投机 token;服务端整体使用 TRITON_ATTN,drafter 无需固定注意力后端;合成接受 长度固定为黄金 AL 2.83(minimaxm3_eagle3.yaml,thinking_on,K=3)。EVAL_ONLY 保留 真实验证。所选 ROCm nightly 镜像晚于 vllm-project/vllm#45546,无需运行时补丁。 Co-Authored-By: Claude Opus 5 (1M context) --- .../agentic/minimaxm3_fp8_mi325x_mtp.sh | 280 ++++++++++++++++++ configs/amd-master.yaml | 33 +++ perf-changelog.yaml | 11 + 3 files changed, 324 insertions(+) create mode 100755 benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh diff --git a/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh new file mode 100755 index 0000000000..5c2289edb4 --- /dev/null +++ b/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh @@ -0,0 +1,280 @@ +#!/usr/bin/env bash +set -euo pipefail +set -x + +# MiniMax-M3 MXFP8 MI325X (gfx942) AgentX (agentic-coding) recipe with EAGLE3 +# speculative decoding — the spec-decoding=mtp variant of +# agentic/minimaxm3_fp8_mi325x.sh. Everything outside the speculative block +# mirrors the non-MTP agentic sibling (Mooncake host-DRAM KV offload over TCP, +# --block-size 128, --language-model-only, TRITON_ATTN, FP8 KV on the nightly +# images, minimax_m3 parsers, VLLM_USE_BREAKABLE_CUDAGRAPH=0, TP4 gmu bump), so +# the spec-decode delta is readable at equal concurrency. +# +# Speculative config: Inferact/MiniMax-M3-EAGLE3 draft head, 3 speculative +# tokens. Unlike the CUDA recipes the drafter needs no attention_backend +# override — the FlashInfer "page size 128 requires GQA/MQA" limitation that +# forces FLASH_ATTN for the MHA EAGLE3 head is FlashInfer/CUDA-specific, and +# here the whole server runs TRITON_ATTN, which serves the MHA draft fine +# (same reasoning as fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh). +# +# No in-place SupportsEagle3 patch: the pinned ROCm nightly is built from +# upstream 2026-06-23, after vllm-project/vllm#45546 (EAGLE3 support on the AMD +# MiniMax-M3 model) merged on 2026-06-14. The fixed-seq-len MI325X MTP recipe +# still carries that runtime patch because it runs the older +# vllm-openai-rocm:minimax-m3 bring-up image. +# +# Throughput runs pin synthetic acceptance to the committed golden AL; the +# EVAL_ONLY accuracy run keeps real target verification. See SYNTHETIC_ACCEPT_LEN. + +source "$(dirname "$0")/../../benchmark_lib.sh" + +check_env_vars MODEL IMAGE TP CONC KV_OFFLOADING TOTAL_CPU_DRAM_GB RESULT_DIR DURATION EP_SIZE DP_ATTENTION + +DRAFT_MODEL="Inferact/MiniMax-M3-EAGLE3" + +if [[ -n "${SLURM_JOB_ID:-}" ]]; then + echo "JOB $SLURM_JOB_ID running on ${SLURMD_NODENAME:-unknown}" +fi + +if [[ -n "${ROCR_VISIBLE_DEVICES:-}" ]]; then + export HIP_VISIBLE_DEVICES="$ROCR_VISIBLE_DEVICES" +fi + +if [[ -n "${MODEL_PATH:-}" ]]; then + if [[ ! -d "$MODEL_PATH" || -z "$(ls -A "$MODEL_PATH" 2>/dev/null)" ]]; then + hf download "$MODEL" --local-dir "$MODEL_PATH" + fi +else + hf download "$MODEL" + export MODEL_PATH="$MODEL" +fi + +# The EAGLE3 draft is never pre-staged next to the target checkpoint; fetch it +# into the shared HF cache, retrying because that cache is a network FS where +# concurrent downloads hit huggingface_hub's WeakFileLock stale-handle race. +for attempt in 1 2 3 4 5; do + hf download "$DRAFT_MODEL" && break + if [ "$attempt" = 5 ]; then echo "hf download of $DRAFT_MODEL failed after $attempt attempts" >&2; exit 1; fi + echo "hf download attempt $attempt failed; retrying in 60s" >&2 + sleep 60 +done +rocm-smi || true +amd-smi || true + +export WEKA_LOADER_OVERRIDE=semianalysis_cc_traces_weka_062126 +resolve_trace_source +install_agentic_deps + +export VLLM_ENGINE_READY_TIMEOUT_S=3600 +export VLLM_USE_BREAKABLE_CUDAGRAPH=0 +export PYTHONNOUSERSITE=1 + +SERVER_LOG="$RESULT_DIR/server.log" +ROUTER_LOG="$RESULT_DIR/router.log" +MOONCAKE_MASTER_LOG="$RESULT_DIR/mooncake_master.log" +mkdir -p "$RESULT_DIR" + +install_mooncake_rocm() { + local mooncake_tag="v0.3.11.post1" + local mooncake_src="/tmp/Mooncake-$mooncake_tag" + local mooncake_stage="/tmp/mooncake-stage-$mooncake_tag" + local build_jobs + local cache_root + local cache_key + local cache_archive + local cache_tmp + local engine_path + local os_version + local python_abi + local rocm_version + + build_jobs=$(nproc) + if ((build_jobs > 32)); then + build_jobs=32 + fi + + os_version=$(. /etc/os-release && printf '%s-%s' "$ID" "$VERSION_ID") + python_abi=$(python3 -c 'import sys; print(f"cp{sys.version_info.major}{sys.version_info.minor}")') + rocm_version=$(sed -n '1p' /opt/rocm/.info/version 2>/dev/null || true) + if [[ -z "$rocm_version" ]]; then + rocm_version=$(hipconfig --version) + fi + rocm_version=${rocm_version//[^[:alnum:]._-]/_} + cache_root="${HF_HUB_CACHE:?HF_HUB_CACHE must be set}/inferencex/mooncake" + cache_key="${mooncake_tag}-${os_version}-${python_abi}-${rocm_version}-$(uname -m)-hip" + cache_archive="$cache_root/$cache_key.tar.gz" + mkdir -p "$cache_root" + + apt-get update + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + build-essential cmake git libasio-dev libboost-dev libcurl4-openssl-dev \ + libgflags-dev libgoogle-glog-dev libibverbs-dev libjsoncpp-dev \ + libnuma-dev libpython3-dev libssl-dev libunwind-dev liburing-dev \ + libxxhash-dev libyaml-cpp-dev libzstd-dev ninja-build pybind11-dev + + exec 9>"$cache_archive.lock" + flock -w 1800 9 + if [[ -f "$cache_archive" ]] && ! tar -tzf "$cache_archive" >/dev/null 2>&1; then + rm -f "$cache_archive" + fi + if [[ ! -f "$cache_archive" ]]; then + echo "Building HIP Mooncake cache artifact: $cache_archive" + rm -rf "$mooncake_src" "$mooncake_stage" + git clone --depth 1 --branch "$mooncake_tag" --recurse-submodules \ + --shallow-submodules https://github.com/kvcache-ai/Mooncake.git "$mooncake_src" + cmake -S "$mooncake_src/extern/yalantinglibs" \ + -B "$mooncake_src/extern/yalantinglibs/build" \ + -DBUILD_EXAMPLES=OFF -DBUILD_BENCHMARK=OFF -DBUILD_UNIT_TESTS=OFF + cmake --build "$mooncake_src/extern/yalantinglibs/build" -j "$build_jobs" + cmake --install "$mooncake_src/extern/yalantinglibs/build" + cmake -S "$mooncake_src" -B "$mooncake_src/build" -G Ninja \ + -DCMAKE_BUILD_TYPE=Release -DUSE_CUDA=OFF -DUSE_HIP=ON \ + -DWITH_EP=OFF -DWITH_STORE=ON -DWITH_STORE_RUST=OFF \ + -DWITH_RUST_EXAMPLE=OFF -DBUILD_EXAMPLES=OFF -DBUILD_UNIT_TESTS=OFF + cmake --build "$mooncake_src/build" -j "$build_jobs" + mkdir -p "$mooncake_stage" + DESTDIR="$mooncake_stage" cmake --install "$mooncake_src/build" + cache_tmp=$(mktemp "$cache_root/$cache_key.tmp.XXXXXX") + tar -C "$mooncake_stage" -czf "$cache_tmp" . + mv -f "$cache_tmp" "$cache_archive" + else + echo "Using HIP Mooncake cache artifact: $cache_archive" + fi + tar -C / -xzf "$cache_archive" + engine_path=$(python3 -c 'import mooncake.engine; print(mooncake.engine.__file__)') + ldd "$engine_path" | grep -q 'libamdhip64.so' + exec 9>&- +} + +OFFLOAD_ARGS=() +if require_agentic_kv_offload_backend mooncake; then + PER_RANK_GB=$((TOTAL_CPU_DRAM_GB / TP)) + if ! python3 -c "from mooncake.store import MooncakeDistributedStore" >/dev/null 2>&1; then + install_mooncake_rocm + fi + python3 -c "from mooncake.store import MooncakeDistributedStore" >/dev/null + MOONCAKE_MASTER_PORT=$((PORT + 12000)) + MOONCAKE_CONFIG_PATH="$RESULT_DIR/mooncake_config.json" + cat > "$MOONCAKE_CONFIG_PATH" < "$MOONCAKE_MASTER_LOG" 2>&1 & + MOONCAKE_MASTER_PID=$! + sleep 2 + kill -0 "$MOONCAKE_MASTER_PID" + OFFLOAD_ARGS=( + --kv-transfer-config + '{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"load_async":true}}' + ) +fi + +PARALLEL_ARGS=(--tensor-parallel-size "$TP" --data-parallel-size 1) +if [[ "$DP_ATTENTION" == "true" ]]; then + PARALLEL_ARGS=(--tensor-parallel-size 1 --data-parallel-size "$TP") +fi + +EP_ARGS=() +if (( EP_SIZE > 1 )); then + EP_ARGS=(--enable-expert-parallel) +fi + +KV_CACHE_ARGS=() +if [[ "$IMAGE" == vllm/vllm-openai-rocm:nightly-* ]]; then + KV_CACHE_ARGS=(--kv-cache-dtype fp8) +fi + +VLLM_BACKEND_PORT="$PORT" +if [[ "$DP_ATTENTION" == "true" ]]; then + VLLM_BACKEND_PORT=$((PORT + 1)) + export AIPERF_HTTP_X_SESSION_ID_FROM_CORRELATION_ID=1 + agentic_pip_install --quiet 'vllm-router==0.1.14' +fi + +# use 3 speculative tokens for all configs, matching the MiniMax-M3 MTP recipes +NUM_SPEC_TOKENS=3 + +# AgentX pins acceptance to the committed golden AL so submissions are compared +# on system performance at a fixed acceptance target rather than on draft-head +# quality (golden_al_distribution/README.md). 2.83 is the MiniMax-M3 EAGLE3 +# curve at num_speculative_tokens=3, thinking_on +# (golden_al_distribution/minimaxm3_eagle3.yaml). The separate +# minimaxm3_eagle3_gqa.yaml curve belongs to the Inferact/MiniMax-M3-EAGLE3-GQA +# draft and is not mixed in here. +# +# EVAL_ONLY switches back to real verification: synthetic acceptance commits +# drafted tokens regardless of the target logits, so generated text is wrong and +# the eval would score ~0 (same split as dsv4_fp4_b*_vllm_mtp.sh). +SYNTHETIC_ACCEPT_LEN=2.83 +if [ "${EVAL_ONLY:-false}" = "true" ]; then + SPEC_CONFIG="{\"method\": \"eagle3\", \"model\": \"$DRAFT_MODEL\", \"num_speculative_tokens\": $NUM_SPEC_TOKENS}" +else + SPEC_CONFIG="{\"method\": \"eagle3\", \"model\": \"$DRAFT_MODEL\", \"num_speculative_tokens\": $NUM_SPEC_TOKENS, \"rejection_sample_method\": \"synthetic\", \"synthetic_acceptance_length\": $SYNTHETIC_ACCEPT_LEN}" +fi + +# AgentX concurrency counts live session trees, not individual requests, so keep +# the non-MTP recipe's 2x scheduler headroom for subagent fan-out. Cudagraph +# capture is left at the sibling's default: the ROCm MiniMax-M3 MTP recipes run +# with VLLM_USE_BREAKABLE_CUDAGRAPH=0 and no explicit capture ceiling. +MAX_NUM_SEQS=$((2 * CONC)) +GPU_MEMORY_UTILIZATION=0.95 +if (( TP == 4 )); then + GPU_MEMORY_UTILIZATION=0.98 +fi + +vllm serve "$MODEL_PATH" --served-model-name "$MODEL" \ + --host 0.0.0.0 \ + --port "$VLLM_BACKEND_PORT" \ + "${PARALLEL_ARGS[@]}" \ + "${EP_ARGS[@]}" \ + --gpu-memory-utilization "$GPU_MEMORY_UTILIZATION" \ + --block-size 128 \ + --language-model-only \ + --attention-backend TRITON_ATTN \ + --enable-prefix-caching \ + --max-num-seqs "$MAX_NUM_SEQS" \ + --speculative-config "$SPEC_CONFIG" \ + --tool-call-parser minimax_m3 \ + --reasoning-parser minimax_m3 \ + --enable-auto-tool-choice \ + --trust-remote-code \ + "${KV_CACHE_ARGS[@]}" \ + "${OFFLOAD_ARGS[@]}" > "$SERVER_LOG" 2>&1 & +SERVER_PID=$! + +wait_for_server_ready --port "$VLLM_BACKEND_PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" + +if [[ "$DP_ATTENTION" == "true" ]]; then + vllm-router \ + --worker-urls "http://localhost:$VLLM_BACKEND_PORT" \ + --policy consistent_hash \ + --intra-node-data-parallel-size "$TP" \ + --host 0.0.0.0 \ + --port "$PORT" \ + --prometheus-host 127.0.0.1 \ + --prometheus-port "$((PORT + 10000))" \ + --request-timeout-secs 14400 \ + --disable-retries > "$ROUTER_LOG" 2>&1 & + ROUTER_PID=$! + wait_for_server_ready --port "$PORT" --server-log "$ROUTER_LOG" --server-pid "$ROUTER_PID" +fi + +if [ "${EVAL_ONLY}" = "true" ]; then + run_eval --port "$PORT" +else + build_replay_cmd "$RESULT_DIR" + run_agentic_replay_and_write_outputs "$RESULT_DIR" +fi diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index b15ae5bccd..697d103c12 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -2230,6 +2230,39 @@ minimaxm3-fp8-mi325x-vllm-agentic: - { tp: 8, ep: 8, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32] } - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [24, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 96], router: { name: vllm-router, version: "0.1.14" } } +# EAGLE3 speculative-decoding (spec-decoding: mtp) variant of +# minimaxm3-fp8-mi325x-vllm-agentic, pairing MiniMaxAI/MiniMax-M3-MXFP8 with the +# Inferact/MiniMax-M3-EAGLE3 draft head (3 speculative tokens) and pinning +# synthetic acceptance to the golden AL 2.83 +# (golden_al_distribution/minimaxm3_eagle3.yaml, thinking_on, K=3). The drafter +# needs no attention_backend override: the whole server runs TRITON_ATTN, which +# serves the MHA EAGLE3 head. The pinned ROCm nightly is built from upstream +# 2026-06-23, after vllm-project/vllm#45546 landed SupportsEagle3 on the AMD +# MiniMax-M3 model, so this recipe needs no in-place patch (unlike the +# fixed-seq-len MI325X MTP entry, which still runs the older minimax-m3 image). +# Same TP4/TP8/DEP arms as the non-MTP entry, trimmed at the extreme-conc end +# for the draft head's extra KV footprint. +minimaxm3-fp8-mi325x-vllm-agentic-mtp: + image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 + model: MiniMaxAI/MiniMax-M3-MXFP8 + model-prefix: minimaxm3 + runner: cluster:mi325x-amds + precision: fp8 + framework: vllm + multinode: false + scenarios: + agentic-coding: + - dram-utilization: 0.80 + search-space: + - { tp: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 3, 4, 5, 6, 7, 8, 10, 12] } + - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 3, 4, 5, 6, 7, 8, 10, 12] } + - { tp: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 4, 8, 10, 12, 14, 16, 18, 20, 24] } + - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [2, 4, 8, 10, 12, 14, 16, 18, 20, 24] } + - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [16, 24, 28, 32, 36, 40, 44, 48, 56, 64], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [3, 4, 5, 6, 7, 8, 10, 12] } + - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [10, 12, 14, 16, 18, 20, 24] } + - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [24, 32, 36, 40, 44, 48, 56, 64], router: { name: vllm-router, version: "0.1.14" } } + minimaxm3-fp4-mi355x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-dcfebf93f4eccf30f71872283331eee757915daf model: amd/MiniMax-M3-MXFP4 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index c1736ae420..8ad854ad16 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5311,3 +5311,14 @@ - "Search space mirrors the non-MTP entry's KV arms -- TP8 GPU-resident and TP8 host-DRAM offload -- so the spec-decoding delta is readable at equal concurrency, but stops at conc 16 rather than 24. The non-MTP bring-up sweep (run 30326393603) showed the GPU-resident arm already thrashing at conc >= 16 (prefix cache hit rate 2.7%, TTFT p50 86-191s) because GPU KV holds only ~3.1 max-length requests, so conc 24 would spend a full job per arm re-measuring that regime; conc 16 still exercises the DRAM tier meaningfully (62% external prefix cache hit rate). TP8-only for the same memory reason: a ~1.5 TB MXFP4 checkpoint needs ~188 GB/GPU across 8 B300s and does not fit below 8 GPUs." - "Sets VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION=1, which the upstream recipe requires on both its blackwell and nvidia paths and which this repo had never set. It defaults to 0 and is threaded into LatentMoERunner as runner_args={\"enable_k3_latent_moe_tail_fusion\": ...} at vllm/models/kimi_k3/nvidia/model.py:549 -- the same runner whose shared-experts output buffer asserted (fused_moe/runner/shared_experts.py:165, all 8 TP ranks at once) when the wider flag alignment was attempted, so every K3 run here so far has been exercising a MoE tail path upstream does not use. Enabled on its own, ahead of re-attempting gpu-memory-utilization 0.95, max-num-seqs 32, --no-enable-flashinfer-autotune or VLLM_USE_V2_MODEL_RUNNER=1, to isolate its effect." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2418 + +- config-keys: + - minimaxm3-fp8-mi325x-vllm-agentic-mtp + description: + - "Add the EAGLE3 speculative-decoding (spec-decoding: mtp) variant of minimaxm3-fp8-mi325x-vllm-agentic: MiniMax-M3 MXFP8 on MI325X (gfx942) with vLLM, agentic-coding scenario only, routed via spec-decoding=mtp to benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh." + - "Speculative config: method eagle3 on the Inferact/MiniMax-M3-EAGLE3 draft head, num_speculative_tokens 3, with no attention_backend override for the drafter -- the FlashInfer page-size-128-requires-GQA/MQA limitation that forces FLASH_ATTN on CUDA is FlashInfer-specific and this server runs TRITON_ATTN throughout (same reasoning as fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh)." + - "Throughput runs pin rejection_sample_method synthetic with synthetic_acceptance_length 2.83 -- the committed golden AL for MiniMax-M3 EAGLE3 at K=3, thinking_on (golden_al_distribution/minimaxm3_eagle3.yaml), per the AgentX policy in golden_al_distribution/README.md. The minimaxm3_eagle3_gqa.yaml curve belongs to the Inferact/MiniMax-M3-EAGLE3-GQA draft (run 29784780049) and is not mixed in. EVAL_ONLY runs drop synthetic acceptance and keep real target verification." + - "No in-place SupportsEagle3 patch, unlike fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh: this recipe runs the agentic sibling's vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 (upstream 2026-06-23), which postdates vllm-project/vllm#45546 (merged 2026-06-14); the fixed-seq-len entry still needs the runtime patch because it pins the older vllm-openai-rocm:minimax-m3 bring-up image." + - "Serve shape is otherwise identical to the non-MTP agentic sibling (Mooncake host-DRAM KV offload over TCP with the HIP-built transfer engine, --block-size 128, --language-model-only, --attention-backend TRITON_ATTN, FP8 KV on nightly-* images, gpu-memory-utilization 0.95 with the 0.98 TP4 bump, minimax_m3 parsers, VLLM_USE_BREAKABLE_CUDAGRAPH=0, max-num-seqs 2*CONC, vllm-router for DP-attention). Cudagraph capture stays at the sibling default rather than the CUDA recipes' MAX_NUM_SEQS*(1+3) token ceiling, matching the merged ROCm MiniMax-M3 MTP recipes." + - "Search space mirrors the non-MTP entry's eight arms (TP4, TP4/EP4, TP8, TP8/EP8, TP8/DEP8 x GPU-resident and Mooncake) trimmed at the extreme-conc end: TP4 1-12 (vs 1-16), TP8 1-24 (vs 1-32), DEP8 16-64 (vs 16-80), Mooncake DEP8 24-64 (vs 24-96). The measured FP8 capacities behind the non-MTP cliffs (TP4 1.66M, TP8 4.93M, DEP8 12.69M tokens against a 269k-token service-time-weighted request) shrink once the draft head and its KV are resident." + pr-link: TBD From 621bb8ffc0342f0a761931cd033a089ce595c259 Mon Sep 17 00:00:00 2001 From: functionstackx <47992694+functionstackx@users.noreply.github.com> Date: Thu, 30 Jul 2026 01:11:53 -0400 Subject: [PATCH 2/4] chore: fill perf-changelog pr-link for #2426 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:补充 perf-changelog 中 #2426 的 pr-link。 Co-Authored-By: Claude Opus 5 (1M context) --- perf-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 8ad854ad16..f0f1553b2d 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5321,4 +5321,4 @@ - "No in-place SupportsEagle3 patch, unlike fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh: this recipe runs the agentic sibling's vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 (upstream 2026-06-23), which postdates vllm-project/vllm#45546 (merged 2026-06-14); the fixed-seq-len entry still needs the runtime patch because it pins the older vllm-openai-rocm:minimax-m3 bring-up image." - "Serve shape is otherwise identical to the non-MTP agentic sibling (Mooncake host-DRAM KV offload over TCP with the HIP-built transfer engine, --block-size 128, --language-model-only, --attention-backend TRITON_ATTN, FP8 KV on nightly-* images, gpu-memory-utilization 0.95 with the 0.98 TP4 bump, minimax_m3 parsers, VLLM_USE_BREAKABLE_CUDAGRAPH=0, max-num-seqs 2*CONC, vllm-router for DP-attention). Cudagraph capture stays at the sibling default rather than the CUDA recipes' MAX_NUM_SEQS*(1+3) token ceiling, matching the merged ROCm MiniMax-M3 MTP recipes." - "Search space mirrors the non-MTP entry's eight arms (TP4, TP4/EP4, TP8, TP8/EP8, TP8/DEP8 x GPU-resident and Mooncake) trimmed at the extreme-conc end: TP4 1-12 (vs 1-16), TP8 1-24 (vs 1-32), DEP8 16-64 (vs 16-80), Mooncake DEP8 24-64 (vs 24-96). The measured FP8 capacities behind the non-MTP cliffs (TP4 1.66M, TP8 4.93M, DEP8 12.69M tokens against a 269k-token service-time-weighted request) shrink once the draft head and its KV are resident." - pr-link: TBD + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2426 From 58a748a38741990e8a523b68592dc670afdf2e15 Mon Sep 17 00:00:00 2001 From: functionstackx <47992694+functionstackx@users.noreply.github.com> Date: Thu, 30 Jul 2026 01:41:33 -0400 Subject: [PATCH 3/4] fix(minimaxm3-mi325x-agentic-mtp): gmu 0.90 for the EAGLE3 draft; conc grid steps >=2, stops at 16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two corrections: - gpu-memory-utilization 0.90 (was 0.95, and 0.98 at TP4). The H100 twin died mid-warmup with torch.OutOfMemoryError on all 8 ranks (run 30515793863) at the non-MTP sibling's value; fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh passes no gmu flag at all, i.e. vLLM's 0.90 default. - Concurrency grid: GPU-resident [1,4,8,12,16], Mooncake [4,8,12,16], DEP [8,12,16]. Every step is >=2 and every arm stops hard at 16; 74 jobs -> 34. 中文:两处修正:(1) gpu-memory-utilization 改为 0.90(原为 0.95,TP4 为 0.98)—— 本配方的 H100 版本在非 MTP 取值下于预热阶段 8 个 rank 全部 OOM(run 30515793863), 而 fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh 未设置该参数(即 vLLM 默认 0.90)。 (2) 并发网格:GPU 常驻 [1,4,8,12,16]、Mooncake [4,8,12,16]、DEP [8,12,16];相邻 并发间隔至少为 2,且一律止于 16,作业数由 74 降至 34。 Co-Authored-By: Claude Opus 5 (1M context) --- .../agentic/minimaxm3_fp8_mi325x_mtp.sh | 10 +++++---- configs/amd-master.yaml | 21 ++++++++++--------- perf-changelog.yaml | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh index 5c2289edb4..20a1c2107a 100755 --- a/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh @@ -230,10 +230,12 @@ fi # capture is left at the sibling's default: the ROCm MiniMax-M3 MTP recipes run # with VLLM_USE_BREAKABLE_CUDAGRAPH=0 and no explicit capture ceiling. MAX_NUM_SEQS=$((2 * CONC)) -GPU_MEMORY_UTILIZATION=0.95 -if (( TP == 4 )); then - GPU_MEMORY_UTILIZATION=0.98 -fi +# 0.90, not the non-MTP sibling's 0.95/0.98: fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh +# passes no gmu flag at all (vLLM's 0.90 default), which is the proven MTP setting +# here. The H100 twin of this recipe died mid-warmup at 0.95 with +# torch.OutOfMemoryError on every rank once the EAGLE3 head and its KV were +# resident (run 30515793863), so the TP4 0.98 bump is dropped as well. +GPU_MEMORY_UTILIZATION=0.90 vllm serve "$MODEL_PATH" --served-model-name "$MODEL" \ --host 0.0.0.0 \ diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 697d103c12..cdd7be6af6 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -2240,8 +2240,9 @@ minimaxm3-fp8-mi325x-vllm-agentic: # 2026-06-23, after vllm-project/vllm#45546 landed SupportsEagle3 on the AMD # MiniMax-M3 model, so this recipe needs no in-place patch (unlike the # fixed-seq-len MI325X MTP entry, which still runs the older minimax-m3 image). -# Same TP4/TP8/DEP arms as the non-MTP entry, trimmed at the extreme-conc end -# for the draft head's extra KV footprint. +# Same TP4/TP8/DEP arms as the non-MTP entry, but on the AgentX MTP concurrency +# grid: every conc-list steps by at least 2 and stops hard at 16, so no GPU time +# is spent resolving single-step differences or the post-cliff thrashing regime. minimaxm3-fp8-mi325x-vllm-agentic-mtp: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 model: MiniMaxAI/MiniMax-M3-MXFP8 @@ -2254,14 +2255,14 @@ minimaxm3-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.80 search-space: - - { tp: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 3, 4, 5, 6, 7, 8, 10, 12] } - - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 3, 4, 5, 6, 7, 8, 10, 12] } - - { tp: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 4, 8, 10, 12, 14, 16, 18, 20, 24] } - - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [2, 4, 8, 10, 12, 14, 16, 18, 20, 24] } - - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [16, 24, 28, 32, 36, 40, 44, 48, 56, 64], router: { name: vllm-router, version: "0.1.14" } } - - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [3, 4, 5, 6, 7, 8, 10, 12] } - - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [10, 12, 14, 16, 18, 20, 24] } - - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [24, 32, 36, 40, 44, 48, 56, 64], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } + - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } + - { tp: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } + - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } + - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [8, 12, 16], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [4, 8, 12, 16] } + - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [4, 8, 12, 16] } + - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [8, 12, 16], router: { name: vllm-router, version: "0.1.14" } } minimaxm3-fp4-mi355x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-dcfebf93f4eccf30f71872283331eee757915daf diff --git a/perf-changelog.yaml b/perf-changelog.yaml index f0f1553b2d..ef00adb074 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5320,5 +5320,5 @@ - "Throughput runs pin rejection_sample_method synthetic with synthetic_acceptance_length 2.83 -- the committed golden AL for MiniMax-M3 EAGLE3 at K=3, thinking_on (golden_al_distribution/minimaxm3_eagle3.yaml), per the AgentX policy in golden_al_distribution/README.md. The minimaxm3_eagle3_gqa.yaml curve belongs to the Inferact/MiniMax-M3-EAGLE3-GQA draft (run 29784780049) and is not mixed in. EVAL_ONLY runs drop synthetic acceptance and keep real target verification." - "No in-place SupportsEagle3 patch, unlike fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh: this recipe runs the agentic sibling's vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 (upstream 2026-06-23), which postdates vllm-project/vllm#45546 (merged 2026-06-14); the fixed-seq-len entry still needs the runtime patch because it pins the older vllm-openai-rocm:minimax-m3 bring-up image." - "Serve shape is otherwise identical to the non-MTP agentic sibling (Mooncake host-DRAM KV offload over TCP with the HIP-built transfer engine, --block-size 128, --language-model-only, --attention-backend TRITON_ATTN, FP8 KV on nightly-* images, gpu-memory-utilization 0.95 with the 0.98 TP4 bump, minimax_m3 parsers, VLLM_USE_BREAKABLE_CUDAGRAPH=0, max-num-seqs 2*CONC, vllm-router for DP-attention). Cudagraph capture stays at the sibling default rather than the CUDA recipes' MAX_NUM_SEQS*(1+3) token ceiling, matching the merged ROCm MiniMax-M3 MTP recipes." - - "Search space mirrors the non-MTP entry's eight arms (TP4, TP4/EP4, TP8, TP8/EP8, TP8/DEP8 x GPU-resident and Mooncake) trimmed at the extreme-conc end: TP4 1-12 (vs 1-16), TP8 1-24 (vs 1-32), DEP8 16-64 (vs 16-80), Mooncake DEP8 24-64 (vs 24-96). The measured FP8 capacities behind the non-MTP cliffs (TP4 1.66M, TP8 4.93M, DEP8 12.69M tokens against a 269k-token service-time-weighted request) shrink once the draft head and its KV are resident." + - "Search space keeps the non-MTP entry's eight arms (TP4, TP4/EP4, TP8, TP8/EP8, TP8/DEP8 x GPU-resident and Mooncake) but moves them onto the AgentX MTP concurrency grid: GPU-resident rows [1, 4, 8, 12, 16], Mooncake rows [4, 8, 12, 16], DEP rows [8, 12, 16]. Every step is at least 2 apart and every arm stops hard at conc 16 -- single-step sampling cannot separate configurations by more than noise on this workload, and past 16 the measured FP8 capacities (TP4 1.66M, TP8 4.93M, DEP8 12.69M tokens against a 269k-token service-time-weighted request) put the run into the post-cliff thrashing regime, which is not worth a job per point." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2426 From 9a76c33d9fa3a0f85341f024a23cca193a94bd68 Mon Sep 17 00:00:00 2001 From: functionstackx <47992694+functionstackx@users.noreply.github.com> Date: Thu, 30 Jul 2026 02:03:10 -0400 Subject: [PATCH 4/4] =?UTF-8?q?fix(minimaxm3-mi325x-agentic-mtp):=20drop?= =?UTF-8?q?=20Mooncake=20=E2=80=94=20GPU-resident=20only=20on=20AMD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mooncake is not used on AMD. The HIP-built transfer engine runs over TCP on these clusters and the store collapses mid-replay ("ServerSession::readBody failed ... Connection reset by peer" until AIPerf aborts), as the MI300X sibling hit in run 30517360090. Remove all three host-DRAM arms and the in-script Mooncake build/launch plumbing. The recipe is GPU-resident only (TP4, TP4/EP4, TP8, TP8/EP8, TP8/DEP8; 34 jobs -> 23) and hard-fails if a dram row is ever pointed at it. 中文:AMD 上不再使用 Mooncake —— 基于 HIP 构建的传输引擎在这些集群上走 TCP,运行中 store 会崩溃(持续输出 "ServerSession::readBody failed ... Connection reset by peer" 直至 AIPerf 中止),MI300X 版本已在 run 30517360090 中复现。删除全部三条主机 DRAM 分支及脚本内的 Mooncake 构建/启动逻辑,改为仅 GPU 常驻(TP4、TP4/EP4、TP8、TP8/EP8、 TP8/DEP8,作业数由 34 降至 23);若仍传入 dram 配置将直接报错退出。 Co-Authored-By: Claude Opus 5 (1M context) --- .../agentic/minimaxm3_fp8_mi325x_mtp.sh | 120 ++---------------- configs/amd-master.yaml | 14 +- perf-changelog.yaml | 4 +- 3 files changed, 19 insertions(+), 119 deletions(-) diff --git a/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh index 20a1c2107a..d8cbd37e81 100755 --- a/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/minimaxm3_fp8_mi325x_mtp.sh @@ -5,8 +5,7 @@ set -x # MiniMax-M3 MXFP8 MI325X (gfx942) AgentX (agentic-coding) recipe with EAGLE3 # speculative decoding — the spec-decoding=mtp variant of # agentic/minimaxm3_fp8_mi325x.sh. Everything outside the speculative block -# mirrors the non-MTP agentic sibling (Mooncake host-DRAM KV offload over TCP, -# --block-size 128, --language-model-only, TRITON_ATTN, FP8 KV on the nightly +# mirrors the non-MTP agentic sibling (--block-size 128, --language-model-only, TRITON_ATTN, FP8 KV on the nightly # images, minimax_m3 parsers, VLLM_USE_BREAKABLE_CUDAGRAPH=0, TP4 gmu bump), so # the spec-decode delta is readable at equal concurrency. # @@ -71,116 +70,19 @@ export PYTHONNOUSERSITE=1 SERVER_LOG="$RESULT_DIR/server.log" ROUTER_LOG="$RESULT_DIR/router.log" -MOONCAKE_MASTER_LOG="$RESULT_DIR/mooncake_master.log" mkdir -p "$RESULT_DIR" -install_mooncake_rocm() { - local mooncake_tag="v0.3.11.post1" - local mooncake_src="/tmp/Mooncake-$mooncake_tag" - local mooncake_stage="/tmp/mooncake-stage-$mooncake_tag" - local build_jobs - local cache_root - local cache_key - local cache_archive - local cache_tmp - local engine_path - local os_version - local python_abi - local rocm_version - - build_jobs=$(nproc) - if ((build_jobs > 32)); then - build_jobs=32 - fi - - os_version=$(. /etc/os-release && printf '%s-%s' "$ID" "$VERSION_ID") - python_abi=$(python3 -c 'import sys; print(f"cp{sys.version_info.major}{sys.version_info.minor}")') - rocm_version=$(sed -n '1p' /opt/rocm/.info/version 2>/dev/null || true) - if [[ -z "$rocm_version" ]]; then - rocm_version=$(hipconfig --version) - fi - rocm_version=${rocm_version//[^[:alnum:]._-]/_} - cache_root="${HF_HUB_CACHE:?HF_HUB_CACHE must be set}/inferencex/mooncake" - cache_key="${mooncake_tag}-${os_version}-${python_abi}-${rocm_version}-$(uname -m)-hip" - cache_archive="$cache_root/$cache_key.tar.gz" - mkdir -p "$cache_root" - - apt-get update - DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - build-essential cmake git libasio-dev libboost-dev libcurl4-openssl-dev \ - libgflags-dev libgoogle-glog-dev libibverbs-dev libjsoncpp-dev \ - libnuma-dev libpython3-dev libssl-dev libunwind-dev liburing-dev \ - libxxhash-dev libyaml-cpp-dev libzstd-dev ninja-build pybind11-dev - - exec 9>"$cache_archive.lock" - flock -w 1800 9 - if [[ -f "$cache_archive" ]] && ! tar -tzf "$cache_archive" >/dev/null 2>&1; then - rm -f "$cache_archive" - fi - if [[ ! -f "$cache_archive" ]]; then - echo "Building HIP Mooncake cache artifact: $cache_archive" - rm -rf "$mooncake_src" "$mooncake_stage" - git clone --depth 1 --branch "$mooncake_tag" --recurse-submodules \ - --shallow-submodules https://github.com/kvcache-ai/Mooncake.git "$mooncake_src" - cmake -S "$mooncake_src/extern/yalantinglibs" \ - -B "$mooncake_src/extern/yalantinglibs/build" \ - -DBUILD_EXAMPLES=OFF -DBUILD_BENCHMARK=OFF -DBUILD_UNIT_TESTS=OFF - cmake --build "$mooncake_src/extern/yalantinglibs/build" -j "$build_jobs" - cmake --install "$mooncake_src/extern/yalantinglibs/build" - cmake -S "$mooncake_src" -B "$mooncake_src/build" -G Ninja \ - -DCMAKE_BUILD_TYPE=Release -DUSE_CUDA=OFF -DUSE_HIP=ON \ - -DWITH_EP=OFF -DWITH_STORE=ON -DWITH_STORE_RUST=OFF \ - -DWITH_RUST_EXAMPLE=OFF -DBUILD_EXAMPLES=OFF -DBUILD_UNIT_TESTS=OFF - cmake --build "$mooncake_src/build" -j "$build_jobs" - mkdir -p "$mooncake_stage" - DESTDIR="$mooncake_stage" cmake --install "$mooncake_src/build" - cache_tmp=$(mktemp "$cache_root/$cache_key.tmp.XXXXXX") - tar -C "$mooncake_stage" -czf "$cache_tmp" . - mv -f "$cache_tmp" "$cache_archive" - else - echo "Using HIP Mooncake cache artifact: $cache_archive" - fi - tar -C / -xzf "$cache_archive" - engine_path=$(python3 -c 'import mooncake.engine; print(mooncake.engine.__file__)') - ldd "$engine_path" | grep -q 'libamdhip64.so' - exec 9>&- -} - -OFFLOAD_ARGS=() -if require_agentic_kv_offload_backend mooncake; then - PER_RANK_GB=$((TOTAL_CPU_DRAM_GB / TP)) - if ! python3 -c "from mooncake.store import MooncakeDistributedStore" >/dev/null 2>&1; then - install_mooncake_rocm - fi - python3 -c "from mooncake.store import MooncakeDistributedStore" >/dev/null - MOONCAKE_MASTER_PORT=$((PORT + 12000)) - MOONCAKE_CONFIG_PATH="$RESULT_DIR/mooncake_config.json" - cat > "$MOONCAKE_CONFIG_PATH" < "$MOONCAKE_MASTER_LOG" 2>&1 & - MOONCAKE_MASTER_PID=$! - sleep 2 - kill -0 "$MOONCAKE_MASTER_PID" - OFFLOAD_ARGS=( - --kv-transfer-config - '{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"load_async":true}}' - ) +# GPU-resident only: no Mooncake on AMD. The HIP-built Mooncake transfer engine's +# TCP transport collapses mid-run on gfx942 -- the store spews +# "ServerSession::readBody failed ... Connection reset by peer" until the replay +# aborts (run 30517360090, MI300X TP8 mtp dram c8). This recipe therefore carries +# no host-DRAM KV offload arm, and fails loudly rather than silently serving a +# GPU-resident run under a dram label. +if [[ "${KV_OFFLOADING}" != "none" ]]; then + echo "Error: KV_OFFLOADING=$KV_OFFLOADING requested, but this recipe is GPU-resident only (Mooncake is not used on AMD)" >&2 + exit 1 fi +OFFLOAD_ARGS=() PARALLEL_ARGS=(--tensor-parallel-size "$TP" --data-parallel-size 1) if [[ "$DP_ATTENTION" == "true" ]]; then diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index cdd7be6af6..91903cf4ce 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -2240,9 +2240,11 @@ minimaxm3-fp8-mi325x-vllm-agentic: # 2026-06-23, after vllm-project/vllm#45546 landed SupportsEagle3 on the AMD # MiniMax-M3 model, so this recipe needs no in-place patch (unlike the # fixed-seq-len MI325X MTP entry, which still runs the older minimax-m3 image). -# Same TP4/TP8/DEP arms as the non-MTP entry, but on the AgentX MTP concurrency -# grid: every conc-list steps by at least 2 and stops hard at 16, so no GPU time -# is spent resolving single-step differences or the post-cliff thrashing regime. +# GPU-resident only: no Mooncake on AMD. The HIP-built Mooncake transfer engine's +# TCP transport collapses mid-run on gfx942 (run 30517360090), so the non-MTP +# entry's three host-DRAM arms are dropped rather than shipped broken. The +# remaining TP4/TP8/DEP arms run the AgentX MTP concurrency grid: every conc-list +# steps by at least 2 and stops hard at 16. minimaxm3-fp8-mi325x-vllm-agentic-mtp: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 model: MiniMaxAI/MiniMax-M3-MXFP8 @@ -2253,16 +2255,12 @@ minimaxm3-fp8-mi325x-vllm-agentic-mtp: multinode: false scenarios: agentic-coding: - - dram-utilization: 0.80 - search-space: + - search-space: - { tp: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } - { tp: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16] } - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [8, 12, 16], router: { name: vllm-router, version: "0.1.14" } } - - { tp: 4, ep: 4, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [4, 8, 12, 16] } - - { tp: 8, ep: 8, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [4, 8, 12, 16] } - - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [8, 12, 16], router: { name: vllm-router, version: "0.1.14" } } minimaxm3-fp4-mi355x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-dcfebf93f4eccf30f71872283331eee757915daf diff --git a/perf-changelog.yaml b/perf-changelog.yaml index ef00adb074..c72e1c5fc6 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5319,6 +5319,6 @@ - "Speculative config: method eagle3 on the Inferact/MiniMax-M3-EAGLE3 draft head, num_speculative_tokens 3, with no attention_backend override for the drafter -- the FlashInfer page-size-128-requires-GQA/MQA limitation that forces FLASH_ATTN on CUDA is FlashInfer-specific and this server runs TRITON_ATTN throughout (same reasoning as fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh)." - "Throughput runs pin rejection_sample_method synthetic with synthetic_acceptance_length 2.83 -- the committed golden AL for MiniMax-M3 EAGLE3 at K=3, thinking_on (golden_al_distribution/minimaxm3_eagle3.yaml), per the AgentX policy in golden_al_distribution/README.md. The minimaxm3_eagle3_gqa.yaml curve belongs to the Inferact/MiniMax-M3-EAGLE3-GQA draft (run 29784780049) and is not mixed in. EVAL_ONLY runs drop synthetic acceptance and keep real target verification." - "No in-place SupportsEagle3 patch, unlike fixed_seq_len/minimaxm3_fp8_mi325x_mtp.sh: this recipe runs the agentic sibling's vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 (upstream 2026-06-23), which postdates vllm-project/vllm#45546 (merged 2026-06-14); the fixed-seq-len entry still needs the runtime patch because it pins the older vllm-openai-rocm:minimax-m3 bring-up image." - - "Serve shape is otherwise identical to the non-MTP agentic sibling (Mooncake host-DRAM KV offload over TCP with the HIP-built transfer engine, --block-size 128, --language-model-only, --attention-backend TRITON_ATTN, FP8 KV on nightly-* images, gpu-memory-utilization 0.95 with the 0.98 TP4 bump, minimax_m3 parsers, VLLM_USE_BREAKABLE_CUDAGRAPH=0, max-num-seqs 2*CONC, vllm-router for DP-attention). Cudagraph capture stays at the sibling default rather than the CUDA recipes' MAX_NUM_SEQS*(1+3) token ceiling, matching the merged ROCm MiniMax-M3 MTP recipes." - - "Search space keeps the non-MTP entry's eight arms (TP4, TP4/EP4, TP8, TP8/EP8, TP8/DEP8 x GPU-resident and Mooncake) but moves them onto the AgentX MTP concurrency grid: GPU-resident rows [1, 4, 8, 12, 16], Mooncake rows [4, 8, 12, 16], DEP rows [8, 12, 16]. Every step is at least 2 apart and every arm stops hard at conc 16 -- single-step sampling cannot separate configurations by more than noise on this workload, and past 16 the measured FP8 capacities (TP4 1.66M, TP8 4.93M, DEP8 12.69M tokens against a 269k-token service-time-weighted request) put the run into the post-cliff thrashing regime, which is not worth a job per point." + - "Serve shape is otherwise identical to the non-MTP agentic sibling (--block-size 128, --language-model-only, --attention-backend TRITON_ATTN, FP8 KV on nightly-* images, gpu-memory-utilization 0.95 with the 0.98 TP4 bump, minimax_m3 parsers, VLLM_USE_BREAKABLE_CUDAGRAPH=0, max-num-seqs 2*CONC, vllm-router for DP-attention). Cudagraph capture stays at the sibling default rather than the CUDA recipes' MAX_NUM_SEQS*(1+3) token ceiling, matching the merged ROCm MiniMax-M3 MTP recipes." + - "Search space is GPU-resident only -- TP4, TP4/EP4, TP8, TP8/EP8 on the AgentX MTP concurrency grid [1, 4, 8, 12, 16] and TP8/DEP8 dp-attn on [8, 12, 16], steps of at least 2 with a hard stop at conc 16. The non-MTP entry's three Mooncake host-DRAM arms are dropped: Mooncake is not used on AMD. Its HIP-built transfer engine runs over TCP here and the store collapses mid-replay (ServerSession::readBody failed ... Connection reset by peer until AIPerf aborts; observed on the MI300X sibling, run 30517360090), so a dram arm would measure the transport, not the engine." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2426