Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
14b8df0
[AMD][AgentX] kimik3 vllm-agentic MTP: add DSpark recipe + container …
seungrokj Aug 4, 2026
f92380e
[AMD][AgentX] kimik3 vllm-agentic MTP: moe-backend auto, load-format …
seungrokj Aug 4, 2026
60da246
[AMD][AgentX] kimik3 vllm-agentic MTP: drop --max-num-batched-tokens
seungrokj Aug 4, 2026
da59f22
[AMD][AgentX] kimik3 vllm-agentic MTP: bf16 KV A/B + FULL_DECODE_ONLY…
seungrokj Aug 4, 2026
2e4bdb6
[AMD][AgentX] kimik3 vllm-agentic MTP: bump gpu-memory-utilization to…
seungrokj Aug 4, 2026
4aaa36c
[AMD][AgentX] kimik3 vllm-agentic MTP: gluondspark bf16-KV patch stac…
seungrokj Aug 5, 2026
28939b8
[AMD][AgentX] kimik3 vllm-agentic MTP: piecewise cudagraph capture + …
seungrokj Aug 6, 2026
0b0a596
[AMD][AgentX] kimik3 vllm-agentic MTP: add perf-changelog entry for M…
seungrokj Aug 6, 2026
9c3e5e5
Merge branch 'main' into amd/agentx_k3_vllm_dev_0804
seungrokj Aug 6, 2026
7154c2e
[AMD][AgentX] kimik3 vllm-agentic MTP: FULL_AND_PIECEWISE cudagraph, …
seungrokj Aug 7, 2026
95d6788
[AMD][AgentX] kimik3 vllm-agentic MTP: trim MI355X sweep to conc 8 fo…
seungrokj Aug 7, 2026
f27d5a3
[AMD][AgentX] kimik3 vllm-agentic MTP: fp8 KV + GMU 0.9 to fix KDA pr…
seungrokj Aug 7, 2026
86b5d7d
[AMD][AgentX] kimik3 vllm-agentic MTP: bf16 KV at GMU 0.85 A/B
seungrokj Aug 7, 2026
31e7ccd
[AMD][AgentX] kimik3 vllm-agentic MTP: switch KV back to fp8 at GMU 0.85
seungrokj Aug 7, 2026
2df49f0
[AMD][AgentX] kimik3 vllm-agentic MTP: fix warmup illegal-address by …
seungrokj Aug 7, 2026
0652bf2
[AMD][AgentX] kimik3 vllm-agentic MTP: lower GMU to 0.8
seungrokj Aug 7, 2026
6f901f3
[AMD][AgentX] kimik3 vllm-agentic MTP: add aiter #4494 split-K graph-…
seungrokj Aug 8, 2026
6aed0a4
Merge branch 'main' into amd/agentx_k3_vllm_dev_0804
seungrokj Aug 8, 2026
a2e800a
[AMD][AgentX] remove kimik2.5-fp4-mi355x-vllm-disagg config
seungrokj Aug 8, 2026
2ff0d9d
[AMD][AgentX] kimik3 vllm-agentic MTP: raise GMU to 0.9, narrow sweep…
seungrokj Aug 8, 2026
16ee774
[AMD][AgentX] kimik3 vllm-agentic MTP: hybrid asm-decode + gluon-veri…
seungrokj Aug 8, 2026
4d7a132
Modify search-space configurations in amd-master.yaml
seungrokj Aug 8, 2026
453b02e
Merge branch 'main' into amd/agentx_k3_vllm_dev_0804
seungrokj Aug 8, 2026
96119d7
[AMD][AgentX] kimik3 vllm-agentic MTP: explicit cudagraph_capture_siz…
seungrokj Aug 9, 2026
b572edf
[AMD][AgentX] kimik3 vllm-agentic MTP: narrow sweep to conc=8
seungrokj Aug 9, 2026
7346abb
[AMD][AgentX] kimik3 vllm-agentic MTP: switch DSpark draft model to R…
seungrokj Aug 9, 2026
644631c
[AMD][AgentX] kimik3 vllm-agentic MTP: stage DSpark draft locally, pa…
seungrokj Aug 9, 2026
a1321e7
[AMD][AgentX] kimik3 vllm-agentic MTP: dense cudagraph_capture_sizes …
seungrokj Aug 9, 2026
ad99c16
[AMD][AgentX] kimik3 vllm-agentic MTP: cap max-num-batched-tokens at …
seungrokj Aug 9, 2026
33e1976
[AMD][AgentX] kimik3 vllm-agentic MTP: handle asm-term-absent hybrid …
seungrokj Aug 9, 2026
0e57d34
Merge branch 'main' into amd/agentx_k3_vllm_dev_0804
seungrokj Aug 9, 2026
818b5b8
[AMD][AgentX] kimik3 vllm-agentic MTP: restore full conc sweep [4,8,1…
seungrokj Aug 9, 2026
1f5fa3a
[AMD][AgentX] kimik3 vllm-agentic MTP: narrow conc sweep to [8, 14]
seungrokj Aug 9, 2026
aa043c6
[AMD][AgentX] kimik3 vllm-agentic MTP: widen conc sweep [1,4,8,10,14,…
seungrokj Aug 9, 2026
3098a6f
[AMD][AgentX] kimik3 vllm-agentic MTP: fix cudagraph capture size mis…
seungrokj Aug 9, 2026
f0c5fae
[AMD][AgentX] kimik3 vllm-agentic MTP: pin fixed cudagraph capture sizes
seungrokj Aug 9, 2026
9ee8c0e
[AMD][AgentX] kimik3 vllm-agentic MTP: load Inferact DSpark draft, na…
seungrokj Aug 10, 2026
4ced5b9
[AMD][AgentX] kimik3 vllm-agentic MTP: shrink cudagraph capture list …
seungrokj Aug 10, 2026
7b10e76
[AMD][AgentX] kimik3 vllm-agentic MTP: use TRITON_MLA for DSpark draf…
seungrokj Aug 10, 2026
a834685
[AMD][AgentX] kimik3 vllm-agentic MTP: embed offline container patche…
seungrokj Aug 10, 2026
7a16386
[AMD][AgentX] kimik3 vllm-agentic MTP: contiguous cudagraph capture 1…
seungrokj Aug 10, 2026
9766780
[AMD][AgentX] kimik3 vllm-agentic MTP: switch conc sweep to [8]
seungrokj Aug 10, 2026
b5024e0
[AMD][AgentX] kimik3 vllm-agentic MTP: cudagraph_mode FULL_DECODE_ONL…
seungrokj Aug 10, 2026
3caf461
[AMD][AgentX] kimik3 vllm-agentic MTP: HYBRID verify fix for DSpark H…
seungrokj Aug 10, 2026
36e932b
[AMD][AgentX] kimik3 vllm-agentic MTP: KDA state-index stride (vllm #…
seungrokj Aug 10, 2026
8330f10
[AMD][AgentX] kimik3 vllm-agentic MTP: aiter #4521 fp8 cprr asm MLA v…
seungrokj Aug 11, 2026
986ae4c
[AMD][AgentX] kimik3 vllm-agentic MTP: MAX_NUM_SEQS=20, cudagraph cap…
seungrokj Aug 11, 2026
7dee539
[AMD][AgentX] kimik3 vllm-agentic MTP: narrow search-space to conc [8]
seungrokj Aug 11, 2026
6b0f0e0
[AMD][AgentX] kimik3 vllm-agentic MTP: cudagraph capture 60, simplify…
seungrokj Aug 11, 2026
9febb71
[AMD][AgentX] kimik3 vllm-agentic MTP: add spec-decoding mtp to vllm-…
seungrokj Aug 11, 2026
950732f
[AMD][AgentX] kimik3 vllm-agentic MTP: fix vllm-simple SIMPLE_RANKS u…
seungrokj Aug 11, 2026
e5559e4
[AMD][AgentX] kimik3 vllm-agentic MTP: drop LMCache/native/mooncake o…
seungrokj Aug 11, 2026
e8f6106
[AMD][AgentX] kimik3 vllm-agentic MTP: b300 vllm-simple lazy_offload=…
seungrokj Aug 11, 2026
c93b729
[AMD][AgentX] kimik3 vllm-agentic MTP: vllm-simple dram conc sweep [1…
seungrokj Aug 11, 2026
30207a6
test(agentx): reproduce AAC1 job 16379 c12 KV-offload in CI
hyukjlee Aug 13, 2026
f48a828
fix(ci): make the agentic-eval job accept object KV offload backends
hyukjlee Aug 13, 2026
bbca7f4
test(agentx): c16 AAC1 repro stack (vllm-simple eager, gmu 0.84)
hyukjlee Aug 13, 2026
4a0019b
test(agentx): c1/c4/c8/c10 ladder on the AAC1 vllm-simple stack
hyukjlee Aug 13, 2026
ed8f6d7
feat(kimik3): tp8pp2 conc4 pass
charxwu Aug 15, 2026
802e3c7
feat(kimik3): wire MI355X TP8xPP2 agentic into e2e
charxwu Aug 15, 2026
1961709
fix(kimik3): override vllm entrypoint in agg PP slurm launcher
charxwu Aug 15, 2026
e5d7303
fix(kimik3): resolve agg PP model path on all nodes before launch
charxwu Aug 15, 2026
570e8f2
tp8+pp2+dspark+async-scheduling conc8 pass
Aug 17, 2026
fceb2b5
fix(kimik3-v4): resolve CONC=20 KV-offload block-id overflow and tune…
Aug 19, 2026
d0173b9
feat(kimik3): enable DSpark MTP on MI355X TP8xPP2 agentic recipe
charxwu Aug 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -446,14 +446,15 @@ jobs:
dp-attn: ${{ matrix.config.dp-attn }}
conc: ${{ matrix.config.conc }}
kv-offloading: ${{ matrix.config.kv-offloading }}
kv-offload-backend: ${{ matrix.config.kv-offload-backend }}
kv-offload-backend: ${{ matrix.config['kv-offload-backend'].name }}
kv-offload-backend-metadata: ${{ matrix.config['kv-offload-backend'] && toJson(matrix.config['kv-offload-backend']) || '' }}
total-cpu-dram-gb: ${{ matrix.config.total-cpu-dram-gb }}
duration: ${{ inputs.agentx-fast && '1200' || (inputs.duration-override != '' && inputs.duration-override || matrix.config.duration) }}
agentx-fast: ${{ inputs.agentx-fast }}
isl: '0'
osl: '0'
max-model-len: '0'
spec-decoding: 'none'
spec-decoding: ${{ matrix.config.spec-decoding }}
disagg: ${{ 'false' }}
run-eval: true
eval-only: true
Expand Down Expand Up @@ -510,8 +511,9 @@ jobs:
decode-additional-settings: ${{ toJson(matrix.config.decode.additional-settings) }}
conc: ${{ matrix.config.conc[0] }}
kv-offloading: ${{ matrix.config.kv-offloading }}
kv-offload-backend: ${{ matrix.config['kv-offload-backend'].name }}
kv-offload-backend: ${{ (matrix.config['kv-offload-backend'] && matrix.config['kv-offload-backend'].name) || '' }}
kv-offload-backend-metadata: ${{ matrix.config['kv-offload-backend'] && toJson(matrix.config['kv-offload-backend']) || '' }}
total-cpu-dram-gb: ${{ matrix.config['total-cpu-dram-gb'] || 0 }}
duration: ${{ inputs.agentx-fast && '1200' || (inputs.duration-override != '' && inputs.duration-override || matrix.config.duration) }}
agentx-fast: ${{ inputs.agentx-fast }}
run-eval: false
Expand Down
7 changes: 7 additions & 0 deletions benchmarks/benchmark_lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,13 @@ _write_amd_smi_sidecar() {
# GPU is at <=10% VRAM, otherwise returns 1 so the caller aborts rather than
# starting a benchmark on GPUs still draining the previous run's memory.
wait_for_amd_gpu_clean() {
# Opt-in escape hatch: rocm-smi VRAM% accounting can stay stale for a
# prior job long after HIP reports the memory free and large allocations
# succeed, which otherwise strands a run in this gate until it aborts.
if [ "${SKIP_GPU_CLEAN_WAIT:-0}" = "1" ]; then
echo "SKIP_GPU_CLEAN_WAIT=1: skipping prior-job GPU memory reclaim gate"
return 0
fi
local gpu_clean=false vram_max i
for i in $(seq 1 90); do
vram_max=$(rocm-smi --showmemuse 2>/dev/null \
Expand Down
273 changes: 273 additions & 0 deletions benchmarks/multi_node/agentic/kimik3_agg_pp_job.slurm
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
#!/bin/bash
#SBATCH --job-name=kimik3-agg-pp
#SBATCH -N 2
#SBATCH -n 2
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:8
#SBATCH --time=08:00:00
#
# Aggregated vLLM PP job for MI355X (TP×PP across nodes). Rank 0 runs the
# OpenAI frontend + agentic replay; remaining ranks run headless PP workers.
# Invoked via kimik3_fp4_mi355x_vllm.sh (sbatch) from launch_mi355x-amds.sh.

set -euo pipefail

echo "=== Job Start (agg vLLM PP) ==="
echo "UTC: $(TZ=UTC date '+%Y-%m-%d %H:%M:%S %Z')"
echo "SLURM_JOB_ID=${SLURM_JOB_ID:-} NODES=${SLURM_JOB_NODELIST:-}"
echo "TP=${TP:-?} PP=${PP:-?} IMAGE=${DOCKER_IMAGE_NAME:-${CONTAINER_IMAGE:-}}"
echo "==============================="

: "${DOCKER_IMAGE_NAME:=${CONTAINER_IMAGE:?CONTAINER_IMAGE/DOCKER_IMAGE_NAME required}}"
: "${TP:?TP required}"
: "${PP:?PP required}"
: "${MODEL:?MODEL required}"
: "${MODEL_PREFIX:?MODEL_PREFIX required}"
: "${CONC_LIST:?CONC_LIST required}"
: "${RESULT_FILENAME:?RESULT_FILENAME required}"
: "${GITHUB_WORKSPACE:?GITHUB_WORKSPACE required}"
: "${BENCHMARK_LOGS_DIR:?BENCHMARK_LOGS_DIR required}"

NUM_NODES="${NUM_NODES:-${SLURM_JOB_NUM_NODES:-${SLURM_NNODES:?}}}"
GPUS_PER_NODE="${GPUS_PER_NODE:-8}"
PORT="${PORT:-8000}"
MASTER_PORT="${MASTER_PORT:-29500}"
HOST_HF_CACHE="${HOST_HF_CACHE:-/it-share/hf_cache}"
IBDEVICES="${IBDEVICES:-rdma0,rdma1,rdma2,rdma3,rdma4,rdma5,rdma6,rdma7}"
SERVE_SCRIPT="benchmarks/multi_node/agentic/kimik3_fp4_mi355x_vllm_tp8pp2.sh"
# Parity with the verified g06+g17 smoke: the nightly image needs this triton pin.
TRITON_INDEX_URL="${TRITON_INDEX_URL:-https://pypi.amd.com/triton/release/rocm-7.2.0/simple/}"
TRITON_PIN="${TRITON_PIN:-triton==3.7.0}"
CONT_PREFIX="kimik3_agg_pp_${SLURM_JOB_ID}"

JOB_LOGS_DIR="${BENCHMARK_LOGS_DIR}/logs/slurm_job-${SLURM_JOB_ID}"
mkdir -p "$JOB_LOGS_DIR/agentic"

mapfile -t NODES < <(scontrol show hostnames "$SLURM_JOB_NODELIST")
if [[ "${#NODES[@]}" -lt "$NUM_NODES" ]]; then
echo "Error: allocation has ${#NODES[@]} nodes, need ${NUM_NODES}" >&2
exit 1
fi
NODES=("${NODES[@]:0:$NUM_NODES}")

MASTER_ADDR="$(srun -w "${NODES[0]}" -N1 -n1 hostname -I | awk '{print $1}')"
echo "MASTER_ADDR=${MASTER_ADDR} nodes=${NODES[*]}"

DOCKER_CMD_DETECT='if docker ps &>/dev/null; then DOCKER_CMD=docker; else DOCKER_CMD="sudo docker"; fi'

# ---------------------------------------------------------------------------
# Model path resolution (host side, before any container starts).
#
# /model is mounted read-only, so the in-container `hf download` fallback cannot
# work here: weights must already be staged on every allocated node. Resolve
# across the known roots and fail fast with the per-node verdict, mirroring
# amd_utils/job.slurm rather than burning the job on a doomed download.
# ---------------------------------------------------------------------------
MODEL_DIR_NAME="${MODEL##*/}"
HF_CACHE_DIR_NAME="models--${MODEL//\//--}"

model_dir_ready_on_all_nodes() {
local path="$1"
srun --overlap -N"${NUM_NODES}" -n"${NUM_NODES}" bash -lc "
if [[ -n \"\$(ls -A '${path}' 2>/dev/null)\" ]]; then
echo \"\$(hostname): found ${path}\"
else
echo \"\$(hostname): missing ${path}\"
exit 1
fi
"
}

# An HF-cache-layout dir holds the real weights under snapshots/<rev>.
resolve_snapshot_dir() {
local base="$1"
local snap
snap="$(ls -1d "${base}"/snapshots/*/ 2>/dev/null | head -1)"
if [[ -n "$snap" ]]; then
echo "${snap%/}"
else
echo "$base"
fi
}

MODEL_SEARCH_PATHS=()
[[ -n "${HOST_MODEL_PATH:-}" ]] && MODEL_SEARCH_PATHS+=("$HOST_MODEL_PATH")
MODEL_SEARCH_PATHS+=(
"${HOST_HF_CACHE}/${MODEL_DIR_NAME}"
"${HOST_HF_CACHE}/${HF_CACHE_DIR_NAME}"
"/it-share/data/${MODEL_DIR_NAME}"
"/it-share/data/${HF_CACHE_DIR_NAME}"
"/nfsdata/${MODEL_DIR_NAME}"
"/nfsdata/hf_hub_cache-0/${MODEL_DIR_NAME}"
"/nfsdata/hf_hub_cache-0/${HF_CACHE_DIR_NAME}"
)

RESOLVED_MODEL_PATH=""
for candidate in "${MODEL_SEARCH_PATHS[@]}"; do
echo "Checking model path on all ${NUM_NODES} nodes: ${candidate}"
if model_dir_ready_on_all_nodes "$candidate"; then
RESOLVED_MODEL_PATH="$(resolve_snapshot_dir "$candidate")"
break
fi
done

if [[ -z "$RESOLVED_MODEL_PATH" ]]; then
echo "FATAL: '${MODEL}' weights not staged on all of: ${NODES[*]}" >&2
echo "Searched:" >&2
for candidate in "${MODEL_SEARCH_PATHS[@]}"; do echo " - ${candidate}" >&2; done
echo "Stage the weights on every allocated node, or set HOST_MODEL_PATH." >&2
exit 1
fi
HOST_MODEL_PATH="$RESOLVED_MODEL_PATH"
echo "Resolved HOST_MODEL_PATH=${HOST_MODEL_PATH}"

cleanup_containers() {
set +e
for node in "${NODES[@]}"; do
srun --overlap -w "$node" -N1 -n1 bash -lc "
${DOCKER_CMD_DETECT}
\$DOCKER_CMD ps -a --format '{{.Names}}' | grep -E '^${CONT_PREFIX}_r' | xargs -r \$DOCKER_CMD rm -f
" || true
done
}
trap cleanup_containers EXIT

# Pull once per node (mute progress to avoid SIGPIPE into srun pipes).
for node in "${NODES[@]}"; do
srun --overlap -w "$node" -N1 -n1 bash -lc "
${DOCKER_CMD_DETECT}
\$DOCKER_CMD pull '${DOCKER_IMAGE_NAME}' >/dev/null 2>&1 || true
" || true
done

launch_rank() {
local rank="$1"
local node="$2"
local cont="${CONT_PREFIX}_r${rank}"
local result_host="${JOB_LOGS_DIR}/rank${rank}"
mkdir -p "$result_host"

# Rank 0 stays attached (agentic + exit status); workers are detached.
local run_mode="--rm --init"
if [[ "$rank" -ne 0 ]]; then
run_mode="-d --rm"
fi

# shellcheck disable=SC2086
srun --overlap -w "$node" -N1 -n1 --kill-on-bad-exit=1 bash -lc "
set -euo pipefail
${DOCKER_CMD_DETECT}
# Avoid pipefail+SIGPIPE from awk exiting while ip still writes.
set +o pipefail
HOST_IP=\$(ip route get 1.1.1.1 2>/dev/null | awk '/src/ {print \$7; exit}')
HOST_IP=\"\${HOST_IP:-\$(hostname -I | awk '{print \$1}')}\"
NET_IF=\$(ip route 2>/dev/null | awk '/^default/ {print \$5; exit}')
set -o pipefail
\$DOCKER_CMD rm -f '${cont}' 2>/dev/null || true
\$DOCKER_CMD run ${run_mode} --name '${cont}' \\
--device /dev/dri --device /dev/kfd --device /dev/infiniband \\
--ulimit memlock=-1 --ulimit stack=67108864 \\
--network host --ipc host --group-add video \\
--cap-add SYS_PTRACE --security-opt seccomp=unconfined --privileged \\
--add-host \"\$(hostname):\${HOST_IP}\" \\
-v /sys:/sys --shm-size 128G \\
-v /tmp:/tmp \\
-v '${GITHUB_WORKSPACE}:/workspace' \\
-v '${HOST_HF_CACHE}:/hf_cache' \\
-v '${HOST_MODEL_PATH}:/model:ro' \\
-v '${result_host}:/results' \\
-v '${JOB_LOGS_DIR}/agentic:/logs/agentic' \\
-e GLOO_SOCKET_IFNAME=\"\${NET_IF}\" \\
-e NCCL_SOCKET_IFNAME=\"\${NET_IF}\" \\
-e NCCL_IB_HCA='${IBDEVICES}' \\
-e HF_HOME=/hf_cache \\
-e HUGGINGFACE_HUB_CACHE=/hf_cache \\
-e PYTHONNOUSERSITE=1 \\
-e PYTHONPATH=/workspace/experimental/kimik3-v4/aiter/aiter_site \\
-e AITER_GEMM_MERGE='${AITER_GEMM_MERGE:-auto}' \\
-e AITER_CONFIG_GEMM_BF16=/tmp/aiter_configs/bf16_tuned_gemm.csv \\
-e GITHUB_WORKSPACE=/workspace \\
-e INFMAX_CONTAINER_WORKSPACE=/workspace \\
-e MODEL='${MODEL}' \\
-e MODEL_PREFIX='${MODEL_PREFIX}' \\
-e MODEL_PATH=/model \\
-e NODE_RANK=${rank} \\
-e NNODES=${NUM_NODES} \\
-e MASTER_ADDR='${MASTER_ADDR}' \\
-e MASTER_PORT='${MASTER_PORT}' \\
-e TP='${TP}' \\
-e PP='${PP}' \\
-e PORT='${PORT}' \\
-e CONC='${CONC:-}' \\
-e CONC_LIST='${CONC_LIST}' \\
-e KV_OFFLOADING='${KV_OFFLOADING:-dram}' \\
-e KV_OFFLOAD_BACKEND='${KV_OFFLOAD_BACKEND:-vllm-simple}' \\
-e TOTAL_CPU_DRAM_GB='${TOTAL_CPU_DRAM_GB}' \\
-e DURATION='${DURATION:-3600}' \\
-e RESULT_FILENAME='${RESULT_FILENAME}' \\
-e RESULT_DIR=/results \\
-e AGENTIC_OUTPUT_DIR=/workspace \\
-e IS_AGENTIC=1 \\
-e IS_MULTINODE=true \\
-e DISAGG=false \\
-e SCENARIO_TYPE=agentic-coding \\
-e FRAMEWORK='${FRAMEWORK:-vllm}' \\
-e PRECISION='${PRECISION:-fp4}' \\
-e SPEC_DECODING='${SPEC_DECODING:-none}' \\
-e PREFILL_TP='${TP}' \\
-e PREFILL_PP_SIZE='${PP}' \\
-e PREFILL_NUM_WORKERS='${PREFILL_NUM_WORKERS:-1}' \\
-e DECODE_TP='${DECODE_TP:-$TP}' \\
-e DECODE_PP_SIZE='${DECODE_PP_SIZE:-$PP}' \\
-e DECODE_NUM_WORKERS='${DECODE_NUM_WORKERS:-0}' \\
-e EVAL_ONLY='${EVAL_ONLY:-false}' \\
-e RUN_EVAL='${RUN_EVAL:-false}' \\
-e DISABLE_CUSTOM_ALL_REDUCE='${DISABLE_CUSTOM_ALL_REDUCE:-1}' \\
-e ASYNC_SCHEDULING='${ASYNC_SCHEDULING:-auto}' \\
-e AITER_N6288_CHUNK_PATCH='${AITER_N6288_CHUNK_PATCH:-1}' \\
-e AITER_CA_FLUSH_SYNC_PATCH='${AITER_CA_FLUSH_SYNC_PATCH:-1}' \\
-e AITER_GEMM_EXTRA_CSV='${AITER_GEMM_EXTRA_CSV:-/workspace/experimental/kimik3-v4/aiter/kimik3_bf16_tuned_gemm.combined.csv}' \\
-e IBDEVICES='${IBDEVICES}' \\
-e AIPERF_EXPERIMENTAL_FAST='${AIPERF_EXPERIMENTAL_FAST:-0}' \\
-e AIPERF_UNSAFE_OVERRIDE=true \\
-e SCENARIO_SUBDIR=agentic/ \\
-e ENFORCE_EAGER='${ENFORCE_EAGER:-false}' \\
-w /workspace \\
--entrypoint bash \\
'${DOCKER_IMAGE_NAME}' \\
-lc 'set -euo pipefail
python -m pip install -q --extra-index-url ${TRITON_INDEX_URL} ${TRITON_PIN} tabulate || true
cd /workspace
exec bash ${SERVE_SCRIPT}'
"
}

# Start PP workers first (headless), then rank 0 (blocks until agentic finishes).
for ((rank = NUM_NODES - 1; rank >= 1; rank--)); do
echo "Launching rank-${rank} headless on ${NODES[$rank]}..."
launch_rank "$rank" "${NODES[$rank]}"
sleep 5
done

echo "Launching rank-0 serve + agentic on ${NODES[0]}..."
RC=0
launch_rank 0 "${NODES[0]}" || RC=$?

# Stage agentic aiperf trees for launch_mi355x-amds.sh (expects conc_* under agentic/).
if [[ -d "${JOB_LOGS_DIR}/rank0" ]]; then
for d in "${JOB_LOGS_DIR}/rank0"/conc_*; do
[[ -d "$d" ]] || continue
base="$(basename "$d")"
mkdir -p "${JOB_LOGS_DIR}/agentic/${base}"
cp -a "$d"/. "${JOB_LOGS_DIR}/agentic/${base}/" 2>/dev/null || true
done
# Also accept RESULT_DIR nested conc dirs from the serve script.
if [[ -d "${JOB_LOGS_DIR}/rank0/aiperf_artifacts" ]]; then
conc="${CONC:-${CONC_LIST%% *}}"
mkdir -p "${JOB_LOGS_DIR}/agentic/conc_${conc}"
cp -a "${JOB_LOGS_DIR}/rank0"/. "${JOB_LOGS_DIR}/agentic/conc_${conc}/" 2>/dev/null || true
fi
fi

echo "=== Job End rc=${RC} ==="
exit "$RC"
Loading