Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/test-matrix-logic.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on:
pull_request:
paths:
- 'utils/matrix_logic/**'
- 'runners/launch_mi300x-amds*.sh'
- 'runners/mi300x_native_node_preflight.sh'
- 'benchmarks/multi_node/agentic/kimik3_fp4_mi300x_vllm.sh'

permissions:
contents: read
Expand Down Expand Up @@ -39,3 +42,8 @@ jobs:
run: |
cd utils/matrix_logic
pytest test_validation.py -v

- name: test_kimik3_mi300x_native tests
run: |
cd utils/matrix_logic
pytest test_kimik3_mi300x_native.py -v
114 changes: 114 additions & 0 deletions benchmarks/multi_node/agentic/kimik3_fp4_mi300x_vllm.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#!/usr/bin/env bash
set -euo pipefail
set -x

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../../benchmark_lib.sh"

check_env_vars \
MODEL \
MODEL_PATH \
PORT \
CONC_LIST \
PREFILL_NUM_WORKERS \
PREFILL_TP \
PREFILL_PP_SIZE \
PREFILL_EP \
PREFILL_DP_ATTN \
DECODE_NUM_WORKERS \
MULTINODE_NODE_COUNT \
MULTINODE_GPUS_PER_NODE \
MULTINODE_NODE_RANK \
MULTINODE_MASTER_ADDR

require_agentic_kv_offload_none

fail() {
echo "ERROR: $*" >&2
exit 1
}

if [[ "$MULTINODE_NODE_COUNT" != "2" ]]; then
fail "this entrypoint serves exactly 2 nodes, got MULTINODE_NODE_COUNT=$MULTINODE_NODE_COUNT"
fi
if [[ "$MULTINODE_GPUS_PER_NODE" != "8" ]]; then
fail "this entrypoint requires 8 GPUs per node, got MULTINODE_GPUS_PER_NODE=$MULTINODE_GPUS_PER_NODE"
fi
if [[ "$MULTINODE_NODE_RANK" != "0" && "$MULTINODE_NODE_RANK" != "1" ]]; then
fail "MULTINODE_NODE_RANK must be 0 or 1, got '$MULTINODE_NODE_RANK'"
fi
if [[ "$PREFILL_TP" != "8" || "$PREFILL_PP_SIZE" != "2" ]]; then
fail "this entrypoint serves only TP8 x PP2, got TP$PREFILL_TP x PP$PREFILL_PP_SIZE"
fi
if [[ "$PREFILL_EP" != "1" ]]; then
fail "this entrypoint serves only EP1, got PREFILL_EP=$PREFILL_EP"
fi
if [[ "$PREFILL_DP_ATTN" != "false" ]]; then
fail "this entrypoint does not enable DP attention, got PREFILL_DP_ATTN=$PREFILL_DP_ATTN"
fi
if [[ "$PREFILL_NUM_WORKERS" != "1" || "$DECODE_NUM_WORKERS" != "0" ]]; then
fail "this entrypoint is aggregated: it needs 1 prefill worker and 0 decode workers, got ${PREFILL_NUM_WORKERS}P/${DECODE_NUM_WORKERS}D"
fi

read -r -a CONCURRENCIES <<< "$CONC_LIST"
if [[ "${#CONCURRENCIES[@]}" -ne 1 ]]; then
fail "one concurrency per allocation is required, got CONC_LIST='$CONC_LIST'"
fi
case "${CONCURRENCIES[0]}" in
1|2|4|8) ;;
*) fail "concurrency must be 1, 2, 4, or 8, got '${CONCURRENCIES[0]}'" ;;
esac

if [[ -n "${AITER_SITUV2_A8W4+set}" ]]; then
if [[ "$AITER_SITUV2_A8W4" != "0" && "$AITER_SITUV2_A8W4" != "1" ]]; then
fail "AITER_SITUV2_A8W4 must be 0 or 1 when set, got '$AITER_SITUV2_A8W4'"
fi
fi

export VLLM_ROCM_USE_AITER=1
export SAFETENSORS_FAST_GPU=1
export AITER_BF16_FP8_MOE_BOUND=0
export VLLM_USE_BREAKABLE_CUDAGRAPH=0
export VLLM_USE_V2_MODEL_RUNNER=0
export VLLM_ENGINE_READY_TIMEOUT_S="${VLLM_ENGINE_READY_TIMEOUT_S:-7200}"
export PYTHONNOUSERSITE=1

{ set +x; } 2>/dev/null
VLLM_CMD=(
vllm serve "$MODEL_PATH"
--served-model-name "$MODEL"
--host 0.0.0.0
--port "$PORT"
--tensor-parallel-size 8
--pipeline-parallel-size 2
--nnodes 2
--node-rank "$MULTINODE_NODE_RANK"
--master-addr "$MULTINODE_MASTER_ADDR"
--trust-remote-code
--load-format auto
--moe-backend auto
--gpu-memory-utilization "${VLLM_GPU_MEMORY_UTILIZATION:-0.95}"
--max-model-len 1048576
--max-num-seqs "$CONC_LIST"
--max-num-batched-tokens "${VLLM_MAX_NUM_BATCHED_TOKENS:-4096}"
--mm-encoder-tp-mode data
--enable-auto-tool-choice
--tool-call-parser kimi_k3
--reasoning-parser kimi_k3
--language-model-only
)
if [[ "$MULTINODE_NODE_RANK" == "1" ]]; then
VLLM_CMD+=(--headless)
fi

echo "AITER_SITUV2_A8W4=${AITER_SITUV2_A8W4-unset}"
printf 'vLLM command:'
printf ' %q' "${VLLM_CMD[@]}"
printf '\n'

if [[ "${KIMIK3_VLLM_DRY_RUN:-0}" == "1" ]]; then
echo "KIMIK3_VLLM_DRY_RUN=1 set; not starting the server"
exit 0
fi

exec "${VLLM_CMD[@]}"
4 changes: 2 additions & 2 deletions benchmarks/multi_node/agentic_srt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
set -euo pipefail
set -x

# Client-only agentic trace replay for srt-slurm multinode jobs.
# srt-slurm owns server startup; this script runs as benchmark.type=custom
# Client-only agentic trace replay for externally managed multi-node jobs.
# The caller owns server startup; this script runs as benchmark.type=custom
# against the already-ready frontend on the head node.

INFMAX_CONTAINER_WORKSPACE="${INFMAX_CONTAINER_WORKSPACE:-/infmax-workspace}"
Expand Down
30 changes: 30 additions & 0 deletions configs/amd-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2244,6 +2244,36 @@ minimaxm3-fp4-mi355x-vllm-agentic:
search-space:
- { tp: 4, kv-offloading: dram, kv-offload-backend: { name: vllm-simple }, conc-list: [1, 4, 8, 16] }

kimik3-fp4-mi300x-vllm-agentic:
image: vllm/vllm-openai-rocm:kimi-k3
model: moonshotai/Kimi-K3
model-prefix: kimik3
runner: cluster:mi300x-amds
precision: fp4
framework: vllm
multinode: true
disagg: false
scenarios:
agentic-coding:
- search-space:
- spec-decoding: none
kv-offloading: none
conc-list: [1, 2, 4, 8]
prefill:
num-worker: 1
tp: 8
pp: 2
ep: 1
dp-attn: false
additional-settings:
- "NATIVE_MULTINODE=1"
decode:
num-worker: 0
tp: 8
pp: 2
ep: 1
dp-attn: false

dsv4-fp4-mi355x-sglang-disagg-agentic-hicache:
image: lmsysorg/sglang-rocm:v0.5.14-rocm720-mi35x-20260710
model: deepseek-ai/DeepSeek-V4-Pro
Expand Down
10 changes: 10 additions & 0 deletions perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5339,3 +5339,13 @@
- "Pass --use-chat-template to the benchmark, as required for EAGLE-style speculative decoding"
- "Validated on the node through the real launcher, every request successful: TEP4 concurrency 64 640/640 at 6895 tok/s (11% above the non-MTP arm's 6198 tok/s, mean TTFT 27.2s to 9.6s), and TEP4 concurrency 1 10/10 at 1233 tok/s (83% above the non-MTP arm's 672 tok/s, mean TPOT 12.6ms to 6.5ms)"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2312

- config-keys:
- kimik3-fp4-mi300x-vllm-agentic
description:
- "Add an opt-in native Slurm path for aggregated Kimi K3 AgentX on two 8xMI300X nodes with TP8 x PP2, EP1, and concurrency 1/2/4/8"
- "Image: vllm/vllm-openai-rocm:kimi-k3; model moonshotai/Kimi-K3"
- "Fail closed on the exact aggregate topology, complete and revision-matched node-local model snapshots, eight gfx942 GPUs per node, and independently validated node-local Enroot squash images"
- "Keep AITER_SITUV2_A8W4 caller-configurable pending exact-shape gfx942 validation, and never download the approximately 1.5 TB target checkpoint inside a benchmark job"
- "Preserve the existing single-node MI300X launcher unless NATIVE_MULTINODE=1, with bounded host-owned artifact handoff and signal/failure cleanup"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2401
Loading