From dad9566b1b904599851ab58c157adda4ad302db3 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 17:04:44 -0500 Subject: [PATCH 01/18] perf(agentx): add DSv4 MTP frontier on MI325X --- .../agentic/dsv4_fp8_mi325x_mtp.sh | 149 ++++++++++++++++++ configs/amd-master.yaml | 22 +++ 2 files changed, 171 insertions(+) create mode 100755 benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh new file mode 100755 index 000000000..b5188a03c --- /dev/null +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash +set -euo pipefail + +# DeepSeek-V4-Pro FP8 AgentX replay on one 8xMI325X node. The checkpoint is +# dequantized to FP8 because gfx942 has no native MXFP4 support. Both supported +# one-node layouts retain MTP: TP8 for the latency frontier, and DP8+EP8 for the +# high-throughput frontier. + +source "$(dirname "$0")/../../benchmark_lib.sh" + +check_env_vars MODEL IMAGE TP CONC KV_OFFLOADING RESULT_DIR DURATION EP_SIZE DP_ATTENTION + +if [[ "$KV_OFFLOADING" != "none" ]]; then + echo "ERROR: DeepSeek-V4 MTP on MI325X currently supports GPU-resident KV only" >&2 + exit 1 +fi + +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 + +resolve_trace_source +install_agentic_deps +agentic_pip_install --quiet Pillow fastapi uvicorn + +export AIPERF_HTTP_TCP_USER_TIMEOUT=900000 +export AIPERF_SERVER_METRICS_URLS="http://localhost:${PORT}/metrics" +export AIPERF_REQUIRED_SERVER_METRIC_PREFIX="vllm:" +export VLLM_ENGINE_READY_TIMEOUT_S=10800 +export VLLM_ROCM_USE_AITER=1 +export VLLM_ROCM_USE_AITER_MOE=1 +export PYTHONNOUSERSITE=1 + +SERVER_LOG="$RESULT_DIR/server.log" +ROUTER_LOG="$RESULT_DIR/router.log" +mkdir -p "$RESULT_DIR" + +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 + +USE_VLLM_ROUTER=false +VLLM_BACKEND_PORT="$PORT" +ROUTER_PID="" +if [[ "$DP_ATTENTION" == "true" ]]; then + if (( EP_SIZE != TP )); then + echo "ERROR: MI325X DP-attention requires EP_SIZE == TP so FP8 experts remain sharded" >&2 + exit 1 + fi + USE_VLLM_ROUTER=true + VLLM_BACKEND_PORT=$((PORT + 1)) + export AIPERF_HTTP_X_SESSION_ID_FROM_CORRELATION_ID=1 + export AIPERF_SERVER_METRICS_URLS="http://localhost:${VLLM_BACKEND_PORT}/metrics" + agentic_pip_install --quiet 'vllm-router==0.1.14' +fi + +MAX_NUM_SEQS=$((2 * CONC)) +NUM_SPEC_TOKENS=3 +SYNTHETIC_ACCEPT_LEN=2.49 +if [[ "${EVAL_ONLY:-false}" == "true" ]]; then + SPEC_CONFIG="{\"method\":\"mtp\",\"num_speculative_tokens\":${NUM_SPEC_TOKENS}}" +else + SPEC_CONFIG="{\"method\":\"mtp\",\"num_speculative_tokens\":${NUM_SPEC_TOKENS},\"rejection_sample_method\":\"synthetic\",\"synthetic_acceptance_length\":${SYNTHETIC_ACCEPT_LEN}}" +fi + +cleanup() { + local rc=$? + trap - EXIT INT TERM + set +e + stop_background_process_tree "$ROUTER_PID" "vLLM router" + stop_background_process_tree "${SERVER_PID:-}" "vLLM server" 60 + exit "$rc" +} +trap cleanup EXIT +trap 'exit 130' INT +trap 'exit 143' TERM + +VLLM_CMD=( + vllm serve "$MODEL_PATH" --served-model-name "$MODEL" + --host 0.0.0.0 + --port "$VLLM_BACKEND_PORT" + --trust-remote-code + --async-scheduling + --distributed-executor-backend mp + --quantization deepseek_v4_fp8 + --kv-cache-dtype fp8 + "${PARALLEL_ARGS[@]}" + "${EP_ARGS[@]}" + --gpu-memory-utilization 0.9 + --block-size 256 + --max-num-batched-tokens 8192 + --max-num-seqs "$MAX_NUM_SEQS" + --compilation-config '{"mode":3,"cudagraph_mode":"FULL_DECODE_ONLY"}' + --speculative-config "$SPEC_CONFIG" + --tokenizer-mode deepseek_v4 + --tool-call-parser deepseek_v4 + --reasoning-parser deepseek_v4 + --enable-auto-tool-choice + --enable-prefix-caching + --no-disable-hybrid-kv-cache-manager +) + +printf '%q ' "${VLLM_CMD[@]}" > "$RESULT_DIR/vllm_command.txt" +printf '\n' >> "$RESULT_DIR/vllm_command.txt" +"${VLLM_CMD[@]}" > "$SERVER_LOG" 2>&1 & +SERVER_PID=$! + +wait_for_server_ready --port "$VLLM_BACKEND_PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" + +if [[ "$USE_VLLM_ROUTER" == "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:-false}" == "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 c6580af43..971729e8f 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1471,6 +1471,28 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: search-space: - { tp: 8, ep: 1, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 3, 4, 5, 6, 8] } +# DeepSeek-V4-Pro FP8 full-context AgentX frontier on one MI325X node. The +# dequantized checkpoint is roughly 1.05 TB, so TP8 fits comfortably in the +# node's 2 TB of HBM while TP4 does not have enough per-rank model headroom. +# Sample the latency layouts densely around the estimated 20-30 live-tree KV +# knee, then use DP-attention + EP8 to probe aggregate throughput without +# replicating the full FP8 expert set on every GPU. +dsv4-fp8-mi325x-vllm-agentic-mtp: + image: vllm/vllm-openai-rocm:v0.26.0 + model: deepseek-ai/DeepSeek-V4-Pro + model-prefix: dsv4 + runner: cluster:mi325x-amds + precision: fp8 + framework: vllm + multinode: false + scenarios: + agentic-coding: + - dram-utilization: 0.90 + search-space: + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32] } + - { tp: 8, ep: 8, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [4, 8, 12, 16, 20, 24, 28, 32, 36, 40] } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, spec-decoding: mtp, conc-list: [16, 24, 32, 40, 48, 56, 64, 72, 80], router: { name: vllm-router, version: "0.1.14" } } + minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 model: MiniMaxAI/MiniMax-M3-MXFP8 From 4fb408ee4a75bd6293dad10f0e8450dac951bb05 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 17:05:26 -0500 Subject: [PATCH 02/18] docs(perf): register MI325X DSv4 AgentX submission --- perf-changelog.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 471981f60..3e7e3d369 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5709,3 +5709,14 @@ - "Enable SGLang metrics on every aggregate, prefill, and decode engine." - "Use supported header-based Dynamo session routing with the in-repo AIPerf build." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2520 + +- config-keys: + - dsv4-fp8-mi325x-vllm-agentic-mtp + scenario-type: + - agentic-coding + description: + - "Add the first DeepSeek-V4-Pro FP8 vLLM AgentX submission on MI325X, with MTP enabled for every published point and the committed three-token golden synthetic acceptance length of 2.49; eval-only runs retain real target verification." + - "Use one 8xMI325X node: the roughly 1.05 TB FP8-dequantized checkpoint fits in the node's 2 TB HBM at TP8, so multi-node execution would add communication without solving a capacity constraint; TP4 is excluded because its per-rank model footprint is not fit-safe." + - "Cover the full one-node frontier with dense TP8, TP8+EP8 and DP8+EP8 bands through concurrency 80. The DP-attention arm requires EP8 so the FP8 expert set remains sharded instead of being replicated on every 256 GB GPU." + - "Start from the latest stable ROCm vLLM v0.26.0 release, use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture, and require a nonempty vllm: server-metrics export from AIPerf." + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From e4150e6803aeb30cb35a732f9a043186cede0e85 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 17:26:23 -0500 Subject: [PATCH 03/18] bench: report vLLM prompt cache usage on MI325X --- benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 1 + perf-changelog.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index b5188a03c..6b7c9fe40 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -116,6 +116,7 @@ VLLM_CMD=( --reasoning-parser deepseek_v4 --enable-auto-tool-choice --enable-prefix-caching + --enable-prompt-tokens-details --no-disable-hybrid-kv-cache-manager ) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 3e7e3d369..89da01c14 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5718,5 +5718,5 @@ - "Add the first DeepSeek-V4-Pro FP8 vLLM AgentX submission on MI325X, with MTP enabled for every published point and the committed three-token golden synthetic acceptance length of 2.49; eval-only runs retain real target verification." - "Use one 8xMI325X node: the roughly 1.05 TB FP8-dequantized checkpoint fits in the node's 2 TB HBM at TP8, so multi-node execution would add communication without solving a capacity constraint; TP4 is excluded because its per-rank model footprint is not fit-safe." - "Cover the full one-node frontier with dense TP8, TP8+EP8 and DP8+EP8 bands through concurrency 80. The DP-attention arm requires EP8 so the FP8 expert set remains sharded instead of being replicated on every 256 GB GPU." - - "Start from the latest stable ROCm vLLM v0.26.0 release, use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture, and require a nonempty vllm: server-metrics export from AIPerf." + - "Start from the latest stable ROCm vLLM v0.26.0 release, use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From d171f9831a77fd7b029d81c3cf492308ae903b4f Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 20:00:33 -0500 Subject: [PATCH 04/18] perf(mi325x): screen DSV4 MTP2 correctness --- .../single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 8 ++++++-- configs/amd-master.yaml | 13 +++++++------ perf-changelog.yaml | 5 +++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 6b7c9fe40..8136e516a 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -74,8 +74,12 @@ if [[ "$DP_ATTENTION" == "true" ]]; then fi MAX_NUM_SEQS=$((2 * CONC)) -NUM_SPEC_TOKENS=3 -SYNTHETIC_ACCEPT_LEN=2.49 +# The first AgentX-fast pass used K=3 and exposed empty-content responses on +# the exploratory gfx942 deepseek_v4_fp8 path. The existing MI300X/MI325X +# fixed-sequence recipes use K=2; screen that supported shape independently +# before changing the stable vLLM image. +NUM_SPEC_TOKENS=2 +SYNTHETIC_ACCEPT_LEN=2.27 if [[ "${EVAL_ONLY:-false}" == "true" ]]; then SPEC_CONFIG="{\"method\":\"mtp\",\"num_speculative_tokens\":${NUM_SPEC_TOKENS}}" else diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 971729e8f..191c811e8 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1474,9 +1474,10 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: # DeepSeek-V4-Pro FP8 full-context AgentX frontier on one MI325X node. The # dequantized checkpoint is roughly 1.05 TB, so TP8 fits comfortably in the # node's 2 TB of HBM while TP4 does not have enough per-rank model headroom. -# Sample the latency layouts densely around the estimated 20-30 live-tree KV -# knee, then use DP-attention + EP8 to probe aggregate throughput without -# replicating the full FP8 expert set on every GPU. +# The broad K=3 AgentX-fast pass established the topology boundaries but also +# exposed empty-content responses on TEP/DPA. This K=2 diagnostic pass keeps +# representative points from each topology so the speculative-depth effect is +# isolated before a final dense frontier is published. dsv4-fp8-mi325x-vllm-agentic-mtp: image: vllm/vllm-openai-rocm:v0.26.0 model: deepseek-ai/DeepSeek-V4-Pro @@ -1489,9 +1490,9 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 28, 32] } - - { tp: 8, ep: 8, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [4, 8, 12, 16, 20, 24, 28, 32, 36, 40] } - - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, spec-decoding: mtp, conc-list: [16, 24, 32, 40, 48, 56, 64, 72, 80], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [8, 12, 16] } + - { tp: 8, ep: 8, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [20, 32] } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, spec-decoding: mtp, conc-list: [24, 48], router: { name: vllm-router, version: "0.1.14" } } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 89da01c14..b80df95d0 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5715,8 +5715,9 @@ scenario-type: - agentic-coding description: - - "Add the first DeepSeek-V4-Pro FP8 vLLM AgentX submission on MI325X, with MTP enabled for every published point and the committed three-token golden synthetic acceptance length of 2.49; eval-only runs retain real target verification." + - "Add the first DeepSeek-V4-Pro FP8 vLLM AgentX submission on MI325X, with MTP enabled for every published point; the current diagnostic pass uses two draft tokens and the committed K=2 golden synthetic acceptance length of 2.27, while eval-only runs retain real target verification." - "Use one 8xMI325X node: the roughly 1.05 TB FP8-dequantized checkpoint fits in the node's 2 TB HBM at TP8, so multi-node execution would add communication without solving a capacity constraint; TP4 is excluded because its per-rank model footprint is not fit-safe." - - "Cover the full one-node frontier with dense TP8, TP8+EP8 and DP8+EP8 bands through concurrency 80. The DP-attention arm requires EP8 so the FP8 expert set remains sharded instead of being replicated on every 256 GB GPU." + - "The first broad agentx-fast pass covered dense TP8, TP8+EP8 and DP8+EP8 bands through concurrency 80. It found clean-server duration-coverage failures on slow TP points, repeated empty-content semantic responses on TP8+EP8 and DP8+EP8, and a DP c40 warmup request that did not drain within 1800 seconds." + - "Run a second seven-point agentx-fast diagnostic on stable vLLM v0.26.0 at TP8 c8/c12/c16, TP8+EP8 c20/c32, and DP8+EP8 c24/c48. This changes only MTP depth from K=3 to K=2 (and golden AL 2.49 to 2.27) so speculative depth is isolated before considering a nightly image or publishing the final dense frontier." - "Start from the latest stable ROCm vLLM v0.26.0 release, use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 54f86fe5636694c3c05a155a8dade79d3de95626 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 20:42:29 -0500 Subject: [PATCH 05/18] perf(mi325x): test latest ROCm nightly --- configs/amd-master.yaml | 14 +++++++------- perf-changelog.yaml | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 191c811e8..73f97c05f 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1474,12 +1474,12 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: # DeepSeek-V4-Pro FP8 full-context AgentX frontier on one MI325X node. The # dequantized checkpoint is roughly 1.05 TB, so TP8 fits comfortably in the # node's 2 TB of HBM while TP4 does not have enough per-rank model headroom. -# The broad K=3 AgentX-fast pass established the topology boundaries but also -# exposed empty-content responses on TEP/DPA. This K=2 diagnostic pass keeps -# representative points from each topology so the speculative-depth effect is -# isolated before a final dense frontier is published. +# Stable v0.26.0 produced empty-content responses on every expert-parallel +# topology at both K=3 and K=2. This third AgentX-fast pass keeps K=2 and moves +# only the image to the current immutable ROCm nightly, with one TP control and +# the three minimal TEP/DPA reproductions. dsv4-fp8-mi325x-vllm-agentic-mtp: - image: vllm/vllm-openai-rocm:v0.26.0 + image: vllm/vllm-openai-rocm:nightly-f8d03e77416bf90c49acbe50e233275722f02c4b model: deepseek-ai/DeepSeek-V4-Pro model-prefix: dsv4 runner: cluster:mi325x-amds @@ -1490,9 +1490,9 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [8, 12, 16] } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [8] } - { tp: 8, ep: 8, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [20, 32] } - - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, spec-decoding: mtp, conc-list: [24, 48], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, spec-decoding: mtp, conc-list: [24], router: { name: vllm-router, version: "0.1.14" } } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index b80df95d0..d9fb88d5e 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5719,5 +5719,7 @@ - "Use one 8xMI325X node: the roughly 1.05 TB FP8-dequantized checkpoint fits in the node's 2 TB HBM at TP8, so multi-node execution would add communication without solving a capacity constraint; TP4 is excluded because its per-rank model footprint is not fit-safe." - "The first broad agentx-fast pass covered dense TP8, TP8+EP8 and DP8+EP8 bands through concurrency 80. It found clean-server duration-coverage failures on slow TP points, repeated empty-content semantic responses on TP8+EP8 and DP8+EP8, and a DP c40 warmup request that did not drain within 1800 seconds." - "Run a second seven-point agentx-fast diagnostic on stable vLLM v0.26.0 at TP8 c8/c12/c16, TP8+EP8 c20/c32, and DP8+EP8 c24/c48. This changes only MTP depth from K=3 to K=2 (and golden AL 2.49 to 2.27) so speculative depth is isolated before considering a nightly image or publishing the final dense frontier." - - "Start from the latest stable ROCm vLLM v0.26.0 release, use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." + - "The K=2 stable pass reproduced the defect: TEP c20 had 32 empty-content errors in 39 warmup records, TEP c32 had 45 in 57, and DPA c24 aborted after five profiling semantic errors; TP c8 remained semantically clean but produced only 2,993 input and 10.5 output tokens/s. This isolates stable-v0.26 deepseek_v4_fp8 expert parallelism rather than MTP depth." + - "Run a four-point third agentx-fast diagnostic on the current immutable ROCm nightly nightly-f8d03e77416bf90c49acbe50e233275722f02c4b: TP c8 control, TEP c20/c32, and DPA c24. Keep K=2/AL2.27 unchanged so the image is the only serving-stack variable." + - "Use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 05beb909c0ff7c326233a26403f4bce9794d07f3 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 21:32:51 -0500 Subject: [PATCH 06/18] perf(mi325x): narrow DSV4 MTP to valid TP frontier --- .../single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 12 +++++------- configs/amd-master.yaml | 13 ++++++------- perf-changelog.yaml | 3 ++- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 8136e516a..99875d1d7 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -2,9 +2,9 @@ set -euo pipefail # DeepSeek-V4-Pro FP8 AgentX replay on one 8xMI325X node. The checkpoint is -# dequantized to FP8 because gfx942 has no native MXFP4 support. Both supported -# one-node layouts retain MTP: TP8 for the latency frontier, and DP8+EP8 for the -# high-throughput frontier. +# dequantized to FP8 because gfx942 has no native MXFP4 support. The published +# path is pure TP8: current stable and nightly vLLM builds both return invalid +# empty-content responses with expert parallelism on this model/SKU. source "$(dirname "$0")/../../benchmark_lib.sh" @@ -74,10 +74,8 @@ if [[ "$DP_ATTENTION" == "true" ]]; then fi MAX_NUM_SEQS=$((2 * CONC)) -# The first AgentX-fast pass used K=3 and exposed empty-content responses on -# the exploratory gfx942 deepseek_v4_fp8 path. The existing MI300X/MI325X -# fixed-sequence recipes use K=2; screen that supported shape independently -# before changing the stable vLLM image. +# The existing MI300X/MI325X fixed-sequence recipes use K=2. Keep that MTP +# depth and its measured golden acceptance length for every AgentX point. NUM_SPEC_TOKENS=2 SYNTHETIC_ACCEPT_LEN=2.27 if [[ "${EVAL_ONLY:-false}" == "true" ]]; then diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 73f97c05f..1fb8106ee 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1474,10 +1474,11 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: # DeepSeek-V4-Pro FP8 full-context AgentX frontier on one MI325X node. The # dequantized checkpoint is roughly 1.05 TB, so TP8 fits comfortably in the # node's 2 TB of HBM while TP4 does not have enough per-rank model headroom. -# Stable v0.26.0 produced empty-content responses on every expert-parallel -# topology at both K=3 and K=2. This third AgentX-fast pass keeps K=2 and moves -# only the image to the current immutable ROCm nightly, with one TP control and -# the three minimal TEP/DPA reproductions. +# Stable v0.26.0 and the current immutable nightly both produce empty-content +# responses on expert-parallel topologies. Upstream also marks MI325X +# unsupported for this model, while the proposed cross-node TP16 FP8 support is +# still unmerged. Screen the fit-safe, semantically clean TP8 band densely; do +# not publish an EP or patched multi-node workaround. dsv4-fp8-mi325x-vllm-agentic-mtp: image: vllm/vllm-openai-rocm:nightly-f8d03e77416bf90c49acbe50e233275722f02c4b model: deepseek-ai/DeepSeek-V4-Pro @@ -1490,9 +1491,7 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [8] } - - { tp: 8, ep: 8, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [20, 32] } - - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, spec-decoding: mtp, conc-list: [24], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 6, 8] } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index d9fb88d5e..0b41cf4df 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5720,6 +5720,7 @@ - "The first broad agentx-fast pass covered dense TP8, TP8+EP8 and DP8+EP8 bands through concurrency 80. It found clean-server duration-coverage failures on slow TP points, repeated empty-content semantic responses on TP8+EP8 and DP8+EP8, and a DP c40 warmup request that did not drain within 1800 seconds." - "Run a second seven-point agentx-fast diagnostic on stable vLLM v0.26.0 at TP8 c8/c12/c16, TP8+EP8 c20/c32, and DP8+EP8 c24/c48. This changes only MTP depth from K=3 to K=2 (and golden AL 2.49 to 2.27) so speculative depth is isolated before considering a nightly image or publishing the final dense frontier." - "The K=2 stable pass reproduced the defect: TEP c20 had 32 empty-content errors in 39 warmup records, TEP c32 had 45 in 57, and DPA c24 aborted after five profiling semantic errors; TP c8 remained semantically clean but produced only 2,993 input and 10.5 output tokens/s. This isolates stable-v0.26 deepseek_v4_fp8 expert parallelism rather than MTP depth." - - "Run a four-point third agentx-fast diagnostic on the current immutable ROCm nightly nightly-f8d03e77416bf90c49acbe50e233275722f02c4b: TP c8 control, TEP c20/c32, and DPA c24. Keep K=2/AL2.27 unchanged so the image is the only serving-stack variable." + - "The immutable ROCm nightly nightly-f8d03e77416bf90c49acbe50e233275722f02c4b did not make expert parallelism publishable: TEP c20 produced 33 empty-content errors in 41 warmup records and 7 in its first 13 profile records, TEP c32 produced 51 in 63 warmup records, and DPA c24 produced 3 in 49 warmup records plus 1 in its first 11 profile records. Pure TP remained semantically clean." + - "Upstream's DeepSeek-V4-Pro recipe explicitly marks MI325X unsupported, and cross-node TP16 FP8 support remains an open, unmerged vLLM PR. Do not pin an unreleased patch: use the current immutable nightly and densely screen the fit-safe single-node pure-TP8 band at concurrency 1, 2, 4, 6, and 8 before the reusable full-duration sweep." - "Use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 2a115199f60a96f0f5596b9e62b547230779d12f Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 22:11:57 -0500 Subject: [PATCH 07/18] perf(mi325x): refine DSV4 MTP frontier band --- benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 5 +++++ configs/amd-master.yaml | 2 +- perf-changelog.yaml | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 99875d1d7..ba87fcaeb 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -148,5 +148,10 @@ if [[ "${EVAL_ONLY:-false}" == "true" ]]; then run_eval --port "$PORT" else build_replay_cmd "$RESULT_DIR" + # Full-context AgentX responses can remain healthy for several minutes + # after the admission window closes. Let already-admitted requests drain + # so their observed TTFT/ITL enters the strict coverage calculation. This + # does not extend admissions, change the workload, or lower the 98% gate. + REPLAY_CMD+=" --benchmark-grace-period 1800" run_agentic_replay_and_write_outputs "$RESULT_DIR" fi diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 1fb8106ee..585c2a1c2 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1491,7 +1491,7 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 6, 8] } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [3, 4, 5] } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 0b41cf4df..d4821f924 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5722,5 +5722,7 @@ - "The K=2 stable pass reproduced the defect: TEP c20 had 32 empty-content errors in 39 warmup records, TEP c32 had 45 in 57, and DPA c24 aborted after five profiling semantic errors; TP c8 remained semantically clean but produced only 2,993 input and 10.5 output tokens/s. This isolates stable-v0.26 deepseek_v4_fp8 expert parallelism rather than MTP depth." - "The immutable ROCm nightly nightly-f8d03e77416bf90c49acbe50e233275722f02c4b did not make expert parallelism publishable: TEP c20 produced 33 empty-content errors in 41 warmup records and 7 in its first 13 profile records, TEP c32 produced 51 in 63 warmup records, and DPA c24 produced 3 in 49 warmup records plus 1 in its first 11 profile records. Pure TP remained semantically clean." - "Upstream's DeepSeek-V4-Pro recipe explicitly marks MI325X unsupported, and cross-node TP16 FP8 support remains an open, unmerged vLLM PR. Do not pin an unreleased patch: use the current immutable nightly and densely screen the fit-safe single-node pure-TP8 band at concurrency 1, 2, 4, 6, and 8 before the reusable full-duration sweep." + - "The pure-TP fast pass places the useful band at c1-c4: c1/c2 complete green at 13.49k/31.19 and 7.14k/44.53 input/output tok/s; c4 records 12.02k/67.97 with 0.67s p50 TTFT. c6/c8 collapse to 3.25-4.04k input and 9.70-12.60 output tok/s with 57-85s p50 TTFT, so drop that post-cliff region and probe the missing c3/c5 neighbors around c4." + - "Give already-admitted full-context responses up to 1800 seconds to drain after the measurement window, matching the merged MI325X AgentX convention. The c4 server remained healthy at roughly 84 output tok/s through the entire default 30-second grace, but two long responses were cancelled and completed-record TTFT coverage landed at 97.9% versus the unchanged 98% gate. Bounded drain preserves the admission window and strict coverage threshold." - "Use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 7cb3e6e1fceddc1233dccee61e823fa5ab8a1d85 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Sun, 9 Aug 2026 22:51:11 -0500 Subject: [PATCH 08/18] perf(mi325x): publish DSV4 MTP frontier grid --- configs/amd-master.yaml | 6 +++--- perf-changelog.yaml | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 585c2a1c2..46c190866 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1477,8 +1477,8 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: # Stable v0.26.0 and the current immutable nightly both produce empty-content # responses on expert-parallel topologies. Upstream also marks MI325X # unsupported for this model, while the proposed cross-node TP16 FP8 support is -# still unmerged. Screen the fit-safe, semantically clean TP8 band densely; do -# not publish an EP or patched multi-node workaround. +# still unmerged. Publish the measured, fit-safe, semantically clean TP8 band; +# do not publish an EP or patched multi-node workaround. dsv4-fp8-mi325x-vllm-agentic-mtp: image: vllm/vllm-openai-rocm:nightly-f8d03e77416bf90c49acbe50e233275722f02c4b model: deepseek-ai/DeepSeek-V4-Pro @@ -1491,7 +1491,7 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [3, 4, 5] } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 3, 4] } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index d4821f924..2215622dc 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5715,7 +5715,7 @@ scenario-type: - agentic-coding description: - - "Add the first DeepSeek-V4-Pro FP8 vLLM AgentX submission on MI325X, with MTP enabled for every published point; the current diagnostic pass uses two draft tokens and the committed K=2 golden synthetic acceptance length of 2.27, while eval-only runs retain real target verification." + - "Add the first DeepSeek-V4-Pro FP8 vLLM AgentX submission on MI325X, with MTP enabled for every published point; use two draft tokens and the committed K=2 golden synthetic acceptance length of 2.27, while eval-only runs retain real target verification." - "Use one 8xMI325X node: the roughly 1.05 TB FP8-dequantized checkpoint fits in the node's 2 TB HBM at TP8, so multi-node execution would add communication without solving a capacity constraint; TP4 is excluded because its per-rank model footprint is not fit-safe." - "The first broad agentx-fast pass covered dense TP8, TP8+EP8 and DP8+EP8 bands through concurrency 80. It found clean-server duration-coverage failures on slow TP points, repeated empty-content semantic responses on TP8+EP8 and DP8+EP8, and a DP c40 warmup request that did not drain within 1800 seconds." - "Run a second seven-point agentx-fast diagnostic on stable vLLM v0.26.0 at TP8 c8/c12/c16, TP8+EP8 c20/c32, and DP8+EP8 c24/c48. This changes only MTP depth from K=3 to K=2 (and golden AL 2.49 to 2.27) so speculative depth is isolated before considering a nightly image or publishing the final dense frontier." @@ -5724,5 +5724,6 @@ - "Upstream's DeepSeek-V4-Pro recipe explicitly marks MI325X unsupported, and cross-node TP16 FP8 support remains an open, unmerged vLLM PR. Do not pin an unreleased patch: use the current immutable nightly and densely screen the fit-safe single-node pure-TP8 band at concurrency 1, 2, 4, 6, and 8 before the reusable full-duration sweep." - "The pure-TP fast pass places the useful band at c1-c4: c1/c2 complete green at 13.49k/31.19 and 7.14k/44.53 input/output tok/s; c4 records 12.02k/67.97 with 0.67s p50 TTFT. c6/c8 collapse to 3.25-4.04k input and 9.70-12.60 output tok/s with 57-85s p50 TTFT, so drop that post-cliff region and probe the missing c3/c5 neighbors around c4." - "Give already-admitted full-context responses up to 1800 seconds to drain after the measurement window, matching the merged MI325X AgentX convention. The c4 server remained healthy at roughly 84 output tok/s through the entire default 30-second grace, but two long responses were cancelled and completed-record TTFT coverage landed at 97.9% versus the unchanged 98% gate. Bounded drain preserves the admission window and strict coverage threshold." + - "The refined c3/c4/c5 fast pass completed all admitted requests with zero request errors and nonempty vllm: metrics exports. c3 reached 6.43k input / 64.35 output tok/s, c4 reached 11.15k / 69.11 with 0.68s p50 TTFT, and c5 fell to 6.30k / 33.04 with 7.8s p50 TTFT. Publish c1-c4 as the final full-duration frontier-and-guard grid and drop the clearly dominated c5-c8 region." - "Use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 138f6c160ad594f865a5a99e99c55b4be7d215c9 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 00:56:53 -0500 Subject: [PATCH 09/18] perf(mi325x): drop underfilled DSV4 c4 point --- configs/amd-master.yaml | 2 +- perf-changelog.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 46c190866..41a1b89cf 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1491,7 +1491,7 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 3, 4] } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 3] } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 2215622dc..3091e7930 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5724,6 +5724,7 @@ - "Upstream's DeepSeek-V4-Pro recipe explicitly marks MI325X unsupported, and cross-node TP16 FP8 support remains an open, unmerged vLLM PR. Do not pin an unreleased patch: use the current immutable nightly and densely screen the fit-safe single-node pure-TP8 band at concurrency 1, 2, 4, 6, and 8 before the reusable full-duration sweep." - "The pure-TP fast pass places the useful band at c1-c4: c1/c2 complete green at 13.49k/31.19 and 7.14k/44.53 input/output tok/s; c4 records 12.02k/67.97 with 0.67s p50 TTFT. c6/c8 collapse to 3.25-4.04k input and 9.70-12.60 output tok/s with 57-85s p50 TTFT, so drop that post-cliff region and probe the missing c3/c5 neighbors around c4." - "Give already-admitted full-context responses up to 1800 seconds to drain after the measurement window, matching the merged MI325X AgentX convention. The c4 server remained healthy at roughly 84 output tok/s through the entire default 30-second grace, but two long responses were cancelled and completed-record TTFT coverage landed at 97.9% versus the unchanged 98% gate. Bounded drain preserves the admission window and strict coverage threshold." - - "The refined c3/c4/c5 fast pass completed all admitted requests with zero request errors and nonempty vllm: metrics exports. c3 reached 6.43k input / 64.35 output tok/s, c4 reached 11.15k / 69.11 with 0.68s p50 TTFT, and c5 fell to 6.30k / 33.04 with 7.8s p50 TTFT. Publish c1-c4 as the final full-duration frontier-and-guard grid and drop the clearly dominated c5-c8 region." + - "The refined c3/c4/c5 fast pass completed all admitted requests with zero request errors and nonempty vllm: metrics exports. c3 reached 6.43k input / 64.35 output tok/s, c4 reached 11.15k / 69.11 with 0.68s p50 TTFT, and c5 fell to 6.30k / 33.04 with 7.8s p50 TTFT. Select c1-c4 as the reusable full-duration candidate grid and drop the clearly dominated c5-c8 region." + - "The reusable full-duration sweep invalidated c4 as a publishable point despite a healthy server and 295/295 successful requests: the finite five-trajectory corpus had only three distinct root session trees active at the 98% cutoff for configured concurrency four, so TTFT coverage correctly landed at 97.9504% while ITL remained 100%. Keep the strict gate, do not waive or shorten the workload, and publish the fully covered c1-c3 grid instead." - "Use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From acf58ba1c3272af9cf1da9347299e32b90c1c75a Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 03:08:40 -0500 Subject: [PATCH 10/18] perf(mi325x): probe larger DSV4 prefill budget --- benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 2 +- perf-changelog.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index ba87fcaeb..fc7a047d8 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -109,7 +109,7 @@ VLLM_CMD=( "${EP_ARGS[@]}" --gpu-memory-utilization 0.9 --block-size 256 - --max-num-batched-tokens 8192 + --max-num-batched-tokens 16384 --max-num-seqs "$MAX_NUM_SEQS" --compilation-config '{"mode":3,"cudagraph_mode":"FULL_DECODE_ONLY"}' --speculative-config "$SPEC_CONFIG" diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 3091e7930..98e1eb24d 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5726,5 +5726,6 @@ - "Give already-admitted full-context responses up to 1800 seconds to drain after the measurement window, matching the merged MI325X AgentX convention. The c4 server remained healthy at roughly 84 output tok/s through the entire default 30-second grace, but two long responses were cancelled and completed-record TTFT coverage landed at 97.9% versus the unchanged 98% gate. Bounded drain preserves the admission window and strict coverage threshold." - "The refined c3/c4/c5 fast pass completed all admitted requests with zero request errors and nonempty vllm: metrics exports. c3 reached 6.43k input / 64.35 output tok/s, c4 reached 11.15k / 69.11 with 0.68s p50 TTFT, and c5 fell to 6.30k / 33.04 with 7.8s p50 TTFT. Select c1-c4 as the reusable full-duration candidate grid and drop the clearly dominated c5-c8 region." - "The reusable full-duration sweep invalidated c4 as a publishable point despite a healthy server and 295/295 successful requests: the finite five-trajectory corpus had only three distinct root session trees active at the 98% cutoff for configured concurrency four, so TTFT coverage correctly landed at 97.9504% while ITL remained 100%. Keep the strict gate, do not waive or shorten the workload, and publish the fully covered c1-c3 grid instead." - - "Use FP8 KV, 90% GPU-memory utilization, block size 256, an 8192-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." + - "After the c1-c3 exact-head sweep and c3 eval completed fully green, run one isolated agentx-fast scheduler-budget comparison: increase only --max-num-batched-tokens from the official 8192-token ROCm baseline to 16384 while retaining the exact same c1/c2/c3 topology, image, MTP depth, acceptance length, KV dtype, graph mode, and workload. The completed 8192-token run remains the rollback point." + - "Use FP8 KV, 90% GPU-memory utilization, block size 256, the currently tested 16384-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 11f035c500356497494ca3bbf538d5fb1df4cca7 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 05:09:29 -0500 Subject: [PATCH 11/18] perf(mi325x): probe larger DSV4 sequence capacity --- benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 8 ++++++-- configs/amd-master.yaml | 3 ++- perf-changelog.yaml | 4 +++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index fc7a047d8..ba89850a6 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -73,7 +73,11 @@ if [[ "$DP_ATTENTION" == "true" ]]; then agentic_pip_install --quiet 'vllm-router==0.1.14' fi -MAX_NUM_SEQS=$((2 * CONC)) +# The preceding fast run showed the 16K prefill budget is exactly neutral at +# c1. Restore the official 8K budget and isolate scheduler slot capacity at c3, +# where the baseline reached its 2*CONC running-request ceiling with queued +# branch work despite low KV utilization. +MAX_NUM_SEQS=$((4 * CONC)) # The existing MI300X/MI325X fixed-sequence recipes use K=2. Keep that MTP # depth and its measured golden acceptance length for every AgentX point. NUM_SPEC_TOKENS=2 @@ -109,7 +113,7 @@ VLLM_CMD=( "${EP_ARGS[@]}" --gpu-memory-utilization 0.9 --block-size 256 - --max-num-batched-tokens 16384 + --max-num-batched-tokens 8192 --max-num-seqs "$MAX_NUM_SEQS" --compilation-config '{"mode":3,"cudagraph_mode":"FULL_DECODE_ONLY"}' --speculative-config "$SPEC_CONFIG" diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 41a1b89cf..db0354f8e 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1491,7 +1491,8 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 3] } + # Isolated agentx-fast scheduler-slot probe at the retained upper point. + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [3] } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 98e1eb24d..0b78b30e2 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5727,5 +5727,7 @@ - "The refined c3/c4/c5 fast pass completed all admitted requests with zero request errors and nonempty vllm: metrics exports. c3 reached 6.43k input / 64.35 output tok/s, c4 reached 11.15k / 69.11 with 0.68s p50 TTFT, and c5 fell to 6.30k / 33.04 with 7.8s p50 TTFT. Select c1-c4 as the reusable full-duration candidate grid and drop the clearly dominated c5-c8 region." - "The reusable full-duration sweep invalidated c4 as a publishable point despite a healthy server and 295/295 successful requests: the finite five-trajectory corpus had only three distinct root session trees active at the 98% cutoff for configured concurrency four, so TTFT coverage correctly landed at 97.9504% while ITL remained 100%. Keep the strict gate, do not waive or shorten the workload, and publish the fully covered c1-c3 grid instead." - "After the c1-c3 exact-head sweep and c3 eval completed fully green, run one isolated agentx-fast scheduler-budget comparison: increase only --max-num-batched-tokens from the official 8192-token ROCm baseline to 16384 while retaining the exact same c1/c2/c3 topology, image, MTP depth, acceptance length, KV dtype, graph mode, and workload. The completed 8192-token run remains the rollback point." - - "Use FP8 KV, 90% GPU-memory utilization, block size 256, the currently tested 16384-token scheduler budget and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." + - "The isolated 16384-token c1 fast probe completed 48/48 requests with zero errors, TTFT 99.7%, ITL 100%, and 13,488.30 input / 31.19 output tok/s: exactly neutral versus the retained 8192-token result. Its c3 eval also completed 1,319/1,319 HTTP 200 responses. Reject the larger budget and restore 8192." + - "Next isolate only scheduler slot capacity at c3: raise --max-num-seqs from 2*CONC to 4*CONC while keeping the restored 8192-token budget and every topology, model, MTP, KV, graph, memory, and workload setting fixed. Baseline logs reached the 2*CONC running-request ceiling with queued branch work while KV use stayed below 18%, making c3 the informative upper retained point." + - "Use FP8 KV, 90% GPU-memory utilization, block size 256, the official 8192-token scheduler budget, the currently tested 4*CONC sequence cap, and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 74f8b9f9ae0dcb66c6508992c3b55693ea7af0a9 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 07:11:37 -0500 Subject: [PATCH 12/18] perf(mi325x): probe piecewise DSV4 graphs --- benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 10 ++++------ perf-changelog.yaml | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index ba89850a6..1ecdd5511 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -73,11 +73,9 @@ if [[ "$DP_ATTENTION" == "true" ]]; then agentic_pip_install --quiet 'vllm-router==0.1.14' fi -# The preceding fast run showed the 16K prefill budget is exactly neutral at -# c1. Restore the official 8K budget and isolate scheduler slot capacity at c3, -# where the baseline reached its 2*CONC running-request ceiling with queued -# branch work despite low KV utilization. -MAX_NUM_SEQS=$((4 * CONC)) +# The 16K prefill budget and 4*CONC sequence-cap probes were both neutral. +# Restore the official 8K/2*CONC baseline before isolating graph capture mode. +MAX_NUM_SEQS=$((2 * CONC)) # The existing MI300X/MI325X fixed-sequence recipes use K=2. Keep that MTP # depth and its measured golden acceptance length for every AgentX point. NUM_SPEC_TOKENS=2 @@ -115,7 +113,7 @@ VLLM_CMD=( --block-size 256 --max-num-batched-tokens 8192 --max-num-seqs "$MAX_NUM_SEQS" - --compilation-config '{"mode":3,"cudagraph_mode":"FULL_DECODE_ONLY"}' + --compilation-config '{"mode":3,"cudagraph_mode":"FULL_AND_PIECEWISE"}' --speculative-config "$SPEC_CONFIG" --tokenizer-mode deepseek_v4 --tool-call-parser deepseek_v4 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 0b78b30e2..5bd65bd30 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5729,5 +5729,6 @@ - "After the c1-c3 exact-head sweep and c3 eval completed fully green, run one isolated agentx-fast scheduler-budget comparison: increase only --max-num-batched-tokens from the official 8192-token ROCm baseline to 16384 while retaining the exact same c1/c2/c3 topology, image, MTP depth, acceptance length, KV dtype, graph mode, and workload. The completed 8192-token run remains the rollback point." - "The isolated 16384-token c1 fast probe completed 48/48 requests with zero errors, TTFT 99.7%, ITL 100%, and 13,488.30 input / 31.19 output tok/s: exactly neutral versus the retained 8192-token result. Its c3 eval also completed 1,319/1,319 HTTP 200 responses. Reject the larger budget and restore 8192." - "Next isolate only scheduler slot capacity at c3: raise --max-num-seqs from 2*CONC to 4*CONC while keeping the restored 8192-token budget and every topology, model, MTP, KV, graph, memory, and workload setting fixed. Baseline logs reached the 2*CONC running-request ceiling with queued branch work while KV use stayed below 18%, making c3 the informative upper retained point." - - "Use FP8 KV, 90% GPU-memory utilization, block size 256, the official 8192-token scheduler budget, the currently tested 4*CONC sequence cap, and FULL_DECODE_ONLY graph capture. Enable prompt-token details for request-level cache accounting, and require a nonempty vllm: server-metrics export from AIPerf." + - "Reject the 4*CONC sequence cap after its c3 fast run completed fully green at 6,440.50 input / 64.42 output tok/s over 1,392.11 seconds, versus 6,433.20 / 64.35 over 1,393.73 seconds for the matched 2*CONC control: both token rates changed by only 0.11%. Its c3 eval also completed 1,319/1,319 HTTP 200 responses and collect-evals passed. Restore 2*CONC before any further experiment." + - "Next isolate only graph capture mode at c3: switch FULL_DECODE_ONLY to FULL_AND_PIECEWISE while keeping K=2/golden AL 2.27, the official 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, topology, image, and AgentX trace unchanged. Continue requiring nonempty vllm: server metrics from the explicit AIPerf endpoint." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 7d028235bb2316fda6139fba2b62677a4fdac16b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 07:49:56 -0500 Subject: [PATCH 13/18] perf(mi325x): probe INT4 quick reduce --- benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 8 +++++--- configs/amd-master.yaml | 2 +- perf-changelog.yaml | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 1ecdd5511..2dae4c517 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -42,6 +42,7 @@ export AIPERF_REQUIRED_SERVER_METRIC_PREFIX="vllm:" export VLLM_ENGINE_READY_TIMEOUT_S=10800 export VLLM_ROCM_USE_AITER=1 export VLLM_ROCM_USE_AITER_MOE=1 +export VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 export PYTHONNOUSERSITE=1 SERVER_LOG="$RESULT_DIR/server.log" @@ -73,8 +74,9 @@ if [[ "$DP_ATTENTION" == "true" ]]; then agentic_pip_install --quiet 'vllm-router==0.1.14' fi -# The 16K prefill budget and 4*CONC sequence-cap probes were both neutral. -# Restore the official 8K/2*CONC baseline before isolating graph capture mode. +# The 16K prefill budget and 4*CONC sequence-cap probes were neutral, while +# piecewise graphs regressed. Restore the official 8K/2*CONC/FULL_DECODE_ONLY +# baseline before isolating INT4 Quick Reduce. MAX_NUM_SEQS=$((2 * CONC)) # The existing MI300X/MI325X fixed-sequence recipes use K=2. Keep that MTP # depth and its measured golden acceptance length for every AgentX point. @@ -113,7 +115,7 @@ VLLM_CMD=( --block-size 256 --max-num-batched-tokens 8192 --max-num-seqs "$MAX_NUM_SEQS" - --compilation-config '{"mode":3,"cudagraph_mode":"FULL_AND_PIECEWISE"}' + --compilation-config '{"mode":3,"cudagraph_mode":"FULL_DECODE_ONLY"}' --speculative-config "$SPEC_CONFIG" --tokenizer-mode deepseek_v4 --tool-call-parser deepseek_v4 diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index db0354f8e..c1ac1339b 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1491,7 +1491,7 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - # Isolated agentx-fast scheduler-slot probe at the retained upper point. + # Isolated agentx-fast INT4 Quick Reduce probe at the retained upper point. - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [3] } minimaxm3-fp8-mi325x-vllm-agentic: diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 5bd65bd30..18a0497ef 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5731,4 +5731,6 @@ - "Next isolate only scheduler slot capacity at c3: raise --max-num-seqs from 2*CONC to 4*CONC while keeping the restored 8192-token budget and every topology, model, MTP, KV, graph, memory, and workload setting fixed. Baseline logs reached the 2*CONC running-request ceiling with queued branch work while KV use stayed below 18%, making c3 the informative upper retained point." - "Reject the 4*CONC sequence cap after its c3 fast run completed fully green at 6,440.50 input / 64.42 output tok/s over 1,392.11 seconds, versus 6,433.20 / 64.35 over 1,393.73 seconds for the matched 2*CONC control: both token rates changed by only 0.11%. Its c3 eval also completed 1,319/1,319 HTTP 200 responses and collect-evals passed. Restore 2*CONC before any further experiment." - "Next isolate only graph capture mode at c3: switch FULL_DECODE_ONLY to FULL_AND_PIECEWISE while keeping K=2/golden AL 2.27, the official 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, topology, image, and AgentX trace unchanged. Continue requiring nonempty vllm: server metrics from the explicit AIPerf endpoint." + - "Reject FULL_AND_PIECEWISE after the exact c3 fast comparison processed the same 76 requests with zero errors but reached 6,358.88 input / 63.60 output tok/s over 1,410.00 seconds, versus 6,433.20 / 64.35 over 1,393.73 seconds for the duration-matched FULL_DECODE_ONLY control: both rates regressed about 1.16%. TTFT coverage was 99.8%, ITL coverage was 100%, and server metrics exports were nonempty, so the longer completion time is a measured graph-mode regression rather than infrastructure noise." + - "Next isolate only INT4 Quick Reduce at the retained c3 baseline: enable VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 while restoring FULL_DECODE_ONLY and keeping the immutable nightly, TP8, K=2/golden AL 2.27, the 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, and the exact AgentX trace unchanged. The paired eval guards accuracy." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From a2cd2ebe45b907bd32eafdf07c7444263f953702 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 12:50:09 -0500 Subject: [PATCH 14/18] perf(mi325x): expand DSV4 collection grid --- .../agentic/dsv4_fp8_mi325x_mtp.sh | 125 +++++++++++++++++- configs/amd-master.yaml | 15 ++- perf-changelog.yaml | 1 + 3 files changed, 127 insertions(+), 14 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 2dae4c517..91de14369 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -8,12 +8,7 @@ set -euo pipefail source "$(dirname "$0")/../../benchmark_lib.sh" -check_env_vars MODEL IMAGE TP CONC KV_OFFLOADING RESULT_DIR DURATION EP_SIZE DP_ATTENTION - -if [[ "$KV_OFFLOADING" != "none" ]]; then - echo "ERROR: DeepSeek-V4 MTP on MI325X currently supports GPU-resident KV only" >&2 - exit 1 -fi +check_env_vars MODEL IMAGE TP CONC KV_OFFLOADING TOTAL_CPU_DRAM_GB RESULT_DIR DURATION EP_SIZE DP_ATTENTION if [[ -n "${SLURM_JOB_ID:-}" ]]; then echo "JOB $SLURM_JOB_ID running on ${SLURMD_NODENAME:-unknown}" @@ -47,8 +42,123 @@ 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" +SERVER_PID="" +ROUTER_PID="" +MOONCAKE_MASTER_PID="" + +# Mooncake does not publish a ROCm wheel. Reuse the established MI300X/MI325X +# recipe convention: build the pinned release once per immutable ROCm/Python +# combination, cache the staged install on shared storage, and verify that the +# loaded transfer engine is actually linked against HIP. +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 cache_root cache_key cache_archive cache_tmp + local engine_path os_version python_abi 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 agentic_kv_offload_enabled; then + require_agentic_kv_offload_backend mooncake + # TOTAL_CPU_DRAM_GB is the generator-capped aggregate node budget. + # Embedded Mooncake contributes one segment per rank, so divide it here. + 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}}' + ) +else + require_agentic_kv_offload_none +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") @@ -61,7 +171,6 @@ fi USE_VLLM_ROUTER=false VLLM_BACKEND_PORT="$PORT" -ROUTER_PID="" if [[ "$DP_ATTENTION" == "true" ]]; then if (( EP_SIZE != TP )); then echo "ERROR: MI325X DP-attention requires EP_SIZE == TP so FP8 experts remain sharded" >&2 @@ -94,6 +203,7 @@ cleanup() { set +e stop_background_process_tree "$ROUTER_PID" "vLLM router" stop_background_process_tree "${SERVER_PID:-}" "vLLM server" 60 + stop_background_process_tree "$MOONCAKE_MASTER_PID" "Mooncake master" exit "$rc" } trap cleanup EXIT @@ -124,6 +234,7 @@ VLLM_CMD=( --enable-prefix-caching --enable-prompt-tokens-details --no-disable-hybrid-kv-cache-manager + "${OFFLOAD_ARGS[@]}" ) printf '%q ' "${VLLM_CMD[@]}" > "$RESULT_DIR/vllm_command.txt" diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index c1ac1339b..15522c056 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1474,11 +1474,11 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: # DeepSeek-V4-Pro FP8 full-context AgentX frontier on one MI325X node. The # dequantized checkpoint is roughly 1.05 TB, so TP8 fits comfortably in the # node's 2 TB of HBM while TP4 does not have enough per-rank model headroom. -# Stable v0.26.0 and the current immutable nightly both produce empty-content -# responses on expert-parallel topologies. Upstream also marks MI325X -# unsupported for this model, while the proposed cross-node TP16 FP8 support is -# still unmerged. Publish the measured, fit-safe, semantically clean TP8 band; -# do not publish an EP or patched multi-node workaround. +# Stable v0.26.0 and the current immutable nightly both produced empty-content +# responses on earlier expert-parallel probes. Retain c4-c6 TEP8 explicitly in +# this collection sweep so that behavior is represented beside the pure-TP +# points. Mooncake uses the standard generated aggregate host-DRAM cap and the +# pinned ROCm build convention already exercised by MI325X AgentX recipes. dsv4-fp8-mi325x-vllm-agentic-mtp: image: vllm/vllm-openai-rocm:nightly-f8d03e77416bf90c49acbe50e233275722f02c4b model: deepseek-ai/DeepSeek-V4-Pro @@ -1491,8 +1491,9 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.90 search-space: - # Isolated agentx-fast INT4 Quick Reduce probe at the retained upper point. - - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [3] } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 3, 4, 5, 6] } + - { tp: 8, ep: 1, dp-attn: false, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, spec-decoding: mtp, conc-list: [4, 5, 6] } + - { tp: 8, ep: 8, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [4, 5, 6] } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 18a0497ef..52cc12d7c 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5733,4 +5733,5 @@ - "Next isolate only graph capture mode at c3: switch FULL_DECODE_ONLY to FULL_AND_PIECEWISE while keeping K=2/golden AL 2.27, the official 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, topology, image, and AgentX trace unchanged. Continue requiring nonempty vllm: server metrics from the explicit AIPerf endpoint." - "Reject FULL_AND_PIECEWISE after the exact c3 fast comparison processed the same 76 requests with zero errors but reached 6,358.88 input / 63.60 output tok/s over 1,410.00 seconds, versus 6,433.20 / 64.35 over 1,393.73 seconds for the duration-matched FULL_DECODE_ONLY control: both rates regressed about 1.16%. TTFT coverage was 99.8%, ITL coverage was 100%, and server metrics exports were nonempty, so the longer completion time is a measured graph-mode regression rather than infrastructure noise." - "Next isolate only INT4 Quick Reduce at the retained c3 baseline: enable VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 while restoring FULL_DECODE_ONLY and keeping the immutable nightly, TP8, K=2/golden AL 2.27, the 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, and the exact AgentX trace unchanged. The paired eval guards accuracy." + - "Expand the collection grid beyond the measured Pareto candidates: retain pure TP8 c1-c6, add Mooncake DRAM-offload TP8 c4/c5/c6 using the generated aggregate host-memory cap and pinned ROCm Mooncake 0.3.11.post1 build, and add TEP8 c4/c5/c6 even if those points remain dominated or reproduce the earlier empty-content behavior. Functionality is the acceptance criterion for inclusion, not Pareto optimality." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From 2fa98a2231d34424d9ec2bd1fddd613d6c0474aa Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 13:02:28 -0500 Subject: [PATCH 15/18] fix(mi325x): bound Mooncake transfer logging --- benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 91de14369..80ae8be31 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -142,6 +142,9 @@ if agentic_kv_offload_enabled; then "enable_offload": false } EOF + # Mooncake v0.3.11.post1 emits its transfer polling loop at VLOG(1). + # Keep normal INFO diagnostics while suppressing that unbounded hot-loop output. + export GLOG_v=0 export MOONCAKE_CONFIG_PATH PYTHONHASHSEED=0 MC_SLICE_SIZE=1048576 MC_WORKERS_PER_CTX=4 export MC_TCP_ENABLE_CONNECTION_POOL=1 mooncake_master --port "$MOONCAKE_MASTER_PORT" \ From 221772aff5ab1e6c233a50f15135e103c7d71a3d Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 16:17:26 -0500 Subject: [PATCH 16/18] fix MI325X TEP sampling and Mooncake transport --- .../agentic/dsv4_fp8_mi325x_mtp.sh | 26 ++++++++++++++++--- perf-changelog.yaml | 2 ++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 80ae8be31..820bd9bc2 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -145,10 +145,22 @@ EOF # Mooncake v0.3.11.post1 emits its transfer polling loop at VLOG(1). # Keep normal INFO diagnostics while suppressing that unbounded hot-loop output. export GLOG_v=0 - export MOONCAKE_CONFIG_PATH PYTHONHASHSEED=0 MC_SLICE_SIZE=1048576 MC_WORKERS_PER_CTX=4 - export MC_TCP_ENABLE_CONNECTION_POOL=1 + export MOONCAKE_CONFIG_PATH PYTHONHASHSEED=0 MC_SLICE_SIZE=1048576 + # Match the proven MI355X TCP-store convention. Mooncake 0.3.11's pooled + # TCP path retained thousands of simultaneous sockets on this workload and + # timed out 60-second transfers; the unpooled path plus eight workers keeps + # transfer concurrency bounded by the store workers instead. + export MC_ENABLE_DEST_DEVICE_AFFINITY=1 + export MC_WORKERS_PER_CTX=8 + unset MC_TCP_ENABLE_CONNECTION_POOL + MOONCAKE_KV_LEASE_TTL=120s + # A full-context transfer can starve a rank's client heartbeat beyond the + # master's 10-second default even while that rank remains healthy. Keep the + # client registered long enough for the bounded transfer timeout to resolve. + MOONCAKE_CLIENT_TTL=120 mooncake_master --port "$MOONCAKE_MASTER_PORT" \ - --default_kv_lease_ttl=120s \ + --default_kv_lease_ttl="$MOONCAKE_KV_LEASE_TTL" \ + --client_ttl="$MOONCAKE_CLIENT_TTL" \ --eviction_high_watermark_ratio=0.80 \ --eviction_ratio=0.10 > "$MOONCAKE_MASTER_LOG" 2>&1 & MOONCAKE_MASTER_PID=$! @@ -186,6 +198,14 @@ if [[ "$DP_ATTENTION" == "true" ]]; then agentic_pip_install --quiet 'vllm-router==0.1.14' fi +if (( EP_SIZE > 1 )) && [[ "$DP_ATTENTION" != "true" ]]; then + # TEP's correlated low-concurrency trajectories contain a few deterministic + # metadata-only turns. Do not let three early turns abort a one-hour run + # before the sample is representative; the unchanged strict 10% post-run + # validator remains authoritative for the completed result. + AIPERF_LIVE_FAILED_REQUEST_THRESHOLD=0.50 +fi + # The 16K prefill budget and 4*CONC sequence-cap probes were neutral, while # piecewise graphs regressed. Restore the official 8K/2*CONC/FULL_DECODE_ONLY # baseline before isolating INT4 Quick Reduce. diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 52cc12d7c..f49d11e27 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5734,4 +5734,6 @@ - "Reject FULL_AND_PIECEWISE after the exact c3 fast comparison processed the same 76 requests with zero errors but reached 6,358.88 input / 63.60 output tok/s over 1,410.00 seconds, versus 6,433.20 / 64.35 over 1,393.73 seconds for the duration-matched FULL_DECODE_ONLY control: both rates regressed about 1.16%. TTFT coverage was 99.8%, ITL coverage was 100%, and server metrics exports were nonempty, so the longer completion time is a measured graph-mode regression rather than infrastructure noise." - "Next isolate only INT4 Quick Reduce at the retained c3 baseline: enable VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 while restoring FULL_DECODE_ONLY and keeping the immutable nightly, TP8, K=2/golden AL 2.27, the 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, and the exact AgentX trace unchanged. The paired eval guards accuracy." - "Expand the collection grid beyond the measured Pareto candidates: retain pure TP8 c1-c6, add Mooncake DRAM-offload TP8 c4/c5/c6 using the generated aggregate host-memory cap and pinned ROCm Mooncake 0.3.11.post1 build, and add TEP8 c4/c5/c6 even if those points remain dominated or reproduce the earlier empty-content behavior. Functionality is the acceptance criterion for inclusion, not Pareto optimality." + - "Keep TEP c4-c6 running long enough to collect a representative sample when a few early correlated metadata-only turns return no content: raise only the live fail-fast threshold to 50%, while retaining the unchanged strict 10% completed-run request-error validator." + - "Set Mooncake's independent client-heartbeat TTL to 120 seconds for the full-context offload points. The first c4-c6 run kept the 120-second object lease but used Mooncake's 10-second client default; a healthy rank was unmounted after missing that heartbeat window. A full-primer c4 isolation then kept all eight clients registered but exposed a second issue: the 0.3.11 TCP connection pool retained about 7,000 simultaneous sockets and 60-second batch transfers timed out. Match the proven MI355X convention by disabling that pool, enabling destination affinity, and using eight transfer workers." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 From c875b370e5fcf7109c60ee1e917a5281fa09e988 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 23:28:56 -0500 Subject: [PATCH 17/18] refresh MI325X MTP collection on vLLM v0.27.0 --- .../agentic/dsv4_fp8_mi325x_mtp.sh | 37 +++++++++++++------ configs/amd-master.yaml | 12 +++--- perf-changelog.yaml | 1 + 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh index 820bd9bc2..f2e1617b3 100755 --- a/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh +++ b/benchmarks/single_node/agentic/dsv4_fp8_mi325x_mtp.sh @@ -2,9 +2,9 @@ set -euo pipefail # DeepSeek-V4-Pro FP8 AgentX replay on one 8xMI325X node. The checkpoint is -# dequantized to FP8 because gfx942 has no native MXFP4 support. The published -# path is pure TP8: current stable and nightly vLLM builds both return invalid -# empty-content responses with expert parallelism on this model/SKU. +# dequantized to FP8 because gfx942 has no native MXFP4 support. The collection +# includes pure TP8, TP8/EP8, and Mooncake DRAM-offload points explicitly, even +# where the latter two do not improve the Pareto frontier. source "$(dirname "$0")/../../benchmark_lib.sh" @@ -31,6 +31,26 @@ resolve_trace_source install_agentic_deps agentic_pip_install --quiet Pillow fastapi uvicorn +install_vllm_hybrid_kv_recovery() { + # vLLM PR #45497 fixes hybrid-KV connector load failures by recomputing the + # complete request when any KV group is unavailable. Keep v0.27.0's ROCm + # binaries and install only the pinned Python scheduler source revision. + local recovery_commit="cb1917efe34f16423de2ceb7f210fd015d53459a" + local recovery_src="/tmp/vllm-hybrid-kv-recovery" + rm -rf "$recovery_src" + git clone --depth 1 --branch test/v027-hybrid-kv-recovery \ + https://github.com/cquil11/vllm.git "$recovery_src" + if [[ "$(git -C "$recovery_src" rev-parse HEAD)" != "$recovery_commit" ]]; then + echo "Unexpected vLLM hybrid-KV recovery revision" >&2 + exit 1 + fi + VLLM_USE_PRECOMPILED=1 \ + VLLM_ROCM_WHEEL_INDEX=https://wheels.vllm.ai/rocm/0.27.0/rocm723 \ + uv pip install --system --no-deps --no-build-isolation --editable \ + "$recovery_src" + python3 -c 'import vllm; print("vLLM source:", vllm.__file__)' +} + export AIPERF_HTTP_TCP_USER_TIMEOUT=900000 export AIPERF_SERVER_METRICS_URLS="http://localhost:${PORT}/metrics" export AIPERF_REQUIRED_SERVER_METRIC_PREFIX="vllm:" @@ -121,6 +141,7 @@ install_mooncake_rocm() { OFFLOAD_ARGS=() if agentic_kv_offload_enabled; then require_agentic_kv_offload_backend mooncake + install_vllm_hybrid_kv_recovery # TOTAL_CPU_DRAM_GB is the generator-capped aggregate node budget. # Embedded Mooncake contributes one segment per rank, so divide it here. PER_RANK_GB=$((TOTAL_CPU_DRAM_GB / TP)) @@ -168,7 +189,7 @@ EOF kill -0 "$MOONCAKE_MASTER_PID" OFFLOAD_ARGS=( --kv-transfer-config - '{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"load_async":true}}' + '{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_load_failure_policy":"recompute","kv_connector_extra_config":{"load_async":true}}' ) else require_agentic_kv_offload_none @@ -198,14 +219,6 @@ if [[ "$DP_ATTENTION" == "true" ]]; then agentic_pip_install --quiet 'vllm-router==0.1.14' fi -if (( EP_SIZE > 1 )) && [[ "$DP_ATTENTION" != "true" ]]; then - # TEP's correlated low-concurrency trajectories contain a few deterministic - # metadata-only turns. Do not let three early turns abort a one-hour run - # before the sample is representative; the unchanged strict 10% post-run - # validator remains authoritative for the completed result. - AIPERF_LIVE_FAILED_REQUEST_THRESHOLD=0.50 -fi - # The 16K prefill budget and 4*CONC sequence-cap probes were neutral, while # piecewise graphs regressed. Restore the official 8K/2*CONC/FULL_DECODE_ONLY # baseline before isolating INT4 Quick Reduce. diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 4645dbacd..176bede87 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1474,13 +1474,13 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: # DeepSeek-V4-Pro FP8 full-context AgentX frontier on one MI325X node. The # dequantized checkpoint is roughly 1.05 TB, so TP8 fits comfortably in the # node's 2 TB of HBM while TP4 does not have enough per-rank model headroom. -# Stable v0.26.0 and the current immutable nightly both produced empty-content -# responses on earlier expert-parallel probes. Retain c4-c6 TEP8 explicitly in -# this collection sweep so that behavior is represented beside the pure-TP -# points. Mooncake uses the standard generated aggregate host-DRAM cap and the -# pinned ROCm build convention already exercised by MI325X AgentX recipes. +# Stable v0.26.0 and v0.27.0 both produced empty-content responses on earlier +# expert-parallel probes. Retain c4-c6 TEP8 explicitly in this collection sweep +# so that behavior is represented beside the pure-TP points. Mooncake uses the +# generated aggregate host-DRAM cap, the pinned ROCm build convention, and the +# upstream hybrid-KV load-recovery scheduler fix validated against v0.27.0. dsv4-fp8-mi325x-vllm-agentic-mtp: - image: vllm/vllm-openai-rocm:nightly-f8d03e77416bf90c49acbe50e233275722f02c4b + image: vllm/vllm-openai-rocm:v0.27.0 model: deepseek-ai/DeepSeek-V4-Pro model-prefix: dsv4 runner: cluster:mi325x-amds diff --git a/perf-changelog.yaml b/perf-changelog.yaml index ac6aaacda..fc7878059 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5752,6 +5752,7 @@ - "Expand the collection grid beyond the measured Pareto candidates: retain pure TP8 c1-c6, add Mooncake DRAM-offload TP8 c4/c5/c6 using the generated aggregate host-memory cap and pinned ROCm Mooncake 0.3.11.post1 build, and add TEP8 c4/c5/c6 even if those points remain dominated or reproduce the earlier empty-content behavior. Functionality is the acceptance criterion for inclusion, not Pareto optimality." - "Keep TEP c4-c6 running long enough to collect a representative sample when a few early correlated metadata-only turns return no content: raise only the live fail-fast threshold to 50%, while retaining the unchanged strict 10% completed-run request-error validator." - "Set Mooncake's independent client-heartbeat TTL to 120 seconds for the full-context offload points. The first c4-c6 run kept the 120-second object lease but used Mooncake's 10-second client default; a healthy rank was unmounted after missing that heartbeat window. A full-primer c4 isolation then kept all eight clients registered but exposed a second issue: the 0.3.11 TCP connection pool retained about 7,000 simultaneous sockets and 60-second batch transfers timed out. Match the proven MI355X convention by disabling that pool, enabling destination affinity, and using eight transfer workers." + - "Use the stable vLLM v0.27.0 ROCm image. For Mooncake points only, pin the Python-only scheduler recovery from upstream vLLM PR #45497 and set kv_load_failure_policy=recompute; the isolated c6 gate completed 65/65 warmup and 31/31 measured requests with zero errors while safely recomputing 22 partial hybrid-KV misses." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541 - config-keys: From 29af29b5d662e1b870ba1f72ab0fcc005c284261 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 10 Aug 2026 23:57:05 -0500 Subject: [PATCH 18/18] omit invalid MI325X TEP points --- configs/amd-master.yaml | 11 +++++------ perf-changelog.yaml | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 176bede87..28d818e0d 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -1474,11 +1474,11 @@ glm5.2-fp8-mi325x-sglang-agentic-mtp: # DeepSeek-V4-Pro FP8 full-context AgentX frontier on one MI325X node. The # dequantized checkpoint is roughly 1.05 TB, so TP8 fits comfortably in the # node's 2 TB of HBM while TP4 does not have enough per-rank model headroom. -# Stable v0.26.0 and v0.27.0 both produced empty-content responses on earlier -# expert-parallel probes. Retain c4-c6 TEP8 explicitly in this collection sweep -# so that behavior is represented beside the pure-TP points. Mooncake uses the -# generated aggregate host-DRAM cap, the pinned ROCm build convention, and the -# upstream hybrid-KV load-recovery scheduler fix validated against v0.27.0. +# Stable v0.26.0 and v0.27.0 both produced invalid empty-content responses with +# expert parallelism, including strict K=1 and K=2 gates. Publish only the +# functional TP8 and Mooncake points. Mooncake uses the generated aggregate +# host-DRAM cap, the pinned ROCm build convention, and the upstream hybrid-KV +# load-recovery scheduler fix validated against v0.27.0. dsv4-fp8-mi325x-vllm-agentic-mtp: image: vllm/vllm-openai-rocm:v0.27.0 model: deepseek-ai/DeepSeek-V4-Pro @@ -1493,7 +1493,6 @@ dsv4-fp8-mi325x-vllm-agentic-mtp: search-space: - { tp: 8, ep: 1, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 3, 4, 5, 6] } - { tp: 8, ep: 1, dp-attn: false, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, spec-decoding: mtp, conc-list: [4, 5, 6] } - - { tp: 8, ep: 8, dp-attn: false, kv-offloading: none, spec-decoding: mtp, conc-list: [4, 5, 6] } minimaxm3-fp8-mi325x-vllm-agentic: image: vllm/vllm-openai-rocm:nightly-04c2a8deac44fdb1ca3e2b5ec3e6bf16f3f6a914 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index fc7878059..053ba4aba 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5749,8 +5749,8 @@ - "Next isolate only graph capture mode at c3: switch FULL_DECODE_ONLY to FULL_AND_PIECEWISE while keeping K=2/golden AL 2.27, the official 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, topology, image, and AgentX trace unchanged. Continue requiring nonempty vllm: server metrics from the explicit AIPerf endpoint." - "Reject FULL_AND_PIECEWISE after the exact c3 fast comparison processed the same 76 requests with zero errors but reached 6,358.88 input / 63.60 output tok/s over 1,410.00 seconds, versus 6,433.20 / 64.35 over 1,393.73 seconds for the duration-matched FULL_DECODE_ONLY control: both rates regressed about 1.16%. TTFT coverage was 99.8%, ITL coverage was 100%, and server metrics exports were nonempty, so the longer completion time is a measured graph-mode regression rather than infrastructure noise." - "Next isolate only INT4 Quick Reduce at the retained c3 baseline: enable VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 while restoring FULL_DECODE_ONLY and keeping the immutable nightly, TP8, K=2/golden AL 2.27, the 8192-token scheduler budget, max-num-seqs=2*CONC, FP8 KV, 90% GPU-memory utilization, block size 256, and the exact AgentX trace unchanged. The paired eval guards accuracy." - - "Expand the collection grid beyond the measured Pareto candidates: retain pure TP8 c1-c6, add Mooncake DRAM-offload TP8 c4/c5/c6 using the generated aggregate host-memory cap and pinned ROCm Mooncake 0.3.11.post1 build, and add TEP8 c4/c5/c6 even if those points remain dominated or reproduce the earlier empty-content behavior. Functionality is the acceptance criterion for inclusion, not Pareto optimality." - - "Keep TEP c4-c6 running long enough to collect a representative sample when a few early correlated metadata-only turns return no content: raise only the live fail-fast threshold to 50%, while retaining the unchanged strict 10% completed-run request-error validator." + - "Expand the collection grid beyond the measured Pareto candidates: retain pure TP8 c1-c6 and add Mooncake DRAM-offload TP8 c4/c5/c6 using the generated aggregate host-memory cap and pinned ROCm Mooncake 0.3.11.post1 build." + - "Omit TEP8 c4-c6 after strict v0.27.0 gates reproduced invalid empty-content responses with both real MTP K=2 (3/10 profiling requests failed) and K=1 (2/18 failed). Keep the standard 10% request-error gate with no topology-specific exception." - "Set Mooncake's independent client-heartbeat TTL to 120 seconds for the full-context offload points. The first c4-c6 run kept the 120-second object lease but used Mooncake's 10-second client default; a healthy rank was unmounted after missing that heartbeat window. A full-primer c4 isolation then kept all eight clients registered but exposed a second issue: the 0.3.11 TCP connection pool retained about 7,000 simultaneous sockets and 60-second batch transfers timed out. Match the proven MI355X convention by disabling that pool, enabling destination affinity, and using eight transfer workers." - "Use the stable vLLM v0.27.0 ROCm image. For Mooncake points only, pin the Python-only scheduler recovery from upstream vLLM PR #45497 and set kv_load_failure_policy=recompute; the isolated c6 gate completed 65/65 warmup and 31/31 measured requests with zero errors while safely recomputing 22 partial hybrid-KV misses." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2541