Skip to content
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
2b4ab45
feat: add DeepSeek-V4-Pro FP4 ATOM PD-disagg AgentX hicache MTP on MI…
seungrokj Sep 15, 2026
0742e3b
chore: set perf-changelog pr-link to #3158 / 将 perf-changelog 的 pr-li…
seungrokj Sep 15, 2026
c6a714c
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 15, 2026
77442fe
fix: resolve DeepSeek-V4-Pro-AgentX recipe in server_atom.sh on agent…
seungrokj Sep 15, 2026
2da1fbb
chore: remove dsv4-fp8-mi325x-vllm and -mtp configs / 移除 dsv4-fp8-mi3…
seungrokj Sep 15, 2026
4e85a30
fix: align atom PD agentic recipe with DeepSeek-V4-Agentic-PD-Max ref…
seungrokj Sep 15, 2026
93ab2ed
chore: reduce atom PD agentic sweep to one concurrency per tier / 将 a…
seungrokj Sep 15, 2026
ac590d0
fix: set INFMAX_CONTAINER_WORKSPACE for in-container ATOM agentic rep…
seungrokj Sep 16, 2026
9cd2a31
fix: forward AIPERF_EXPERIMENTAL_FAST into ATOM agentic container / 将…
seungrokj Sep 16, 2026
838dc8c
fix: forward REQUIRE_POWER into ATOM agentic container / 将 REQUIRE_PO…
seungrokj Sep 16, 2026
fec04b4
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 16, 2026
44504da
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 17, 2026
cb39017
chore: expand atom PD agentic sweep to full concurrency grid / 将 atom…
seungrokj Sep 17, 2026
ff25b51
fix(atom): set MC_ENABLE_DEST_DEVICE_AFFINITY=1 for dsv4 agentic PD a…
seungrokj Sep 17, 2026
e1ecbdc
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 17, 2026
f4d7eff
Update runtime_settings.sh
seungrokj Sep 17, 2026
1a3818c
test(atom): align dsv4 agentic PD with DeepSeek-V4-Agentic-PD-Max, c1…
hyukjlee Sep 21, 2026
afbeb28
fix(atom): DSpark needs the -0813 checkpoint draft head
hyukjlee Sep 21, 2026
5af0d60
fix(atom): align dsv4 agentic PD with all recipe concurrency tiers
seungrokj Sep 21, 2026
a7fb807
fix(atom): scope GPU_MAX_HW_QUEUES to the DP-attention prefill node
seungrokj Sep 21, 2026
db2ec21
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 21, 2026
36c3a06
chore(config): rename DSV4-Pro MI355X ATOM disagg agentic key to lmca…
seungrokj Sep 23, 2026
f430d4b
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 23, 2026
d221f3b
chore(config): bump DSV4-Pro atom-disagg image and lower dram-utiliza…
seungrokj Sep 23, 2026
18bc116
test(config): isolate DSV4-Pro atom-disagg lmcache tier to conc-256 only
seungrokj Sep 23, 2026
84ae8cb
test(config): run DSV4-Pro atom-disagg conc-256 with kv-offloading none
seungrokj Sep 23, 2026
765a568
fix(atom-disagg): align DSV4-Pro PD launcher env with recipe
seungrokj Sep 23, 2026
7e876b7
feat(atom-disagg): use dp_sticky router policy for conc-256
seungrokj Sep 23, 2026
d380fbd
test(atom-disagg): restore conc 1/16/64/128/256 on nightly_202609221542
hyukjlee Sep 23, 2026
1ed4ab4
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
hyukjlee Sep 23, 2026
062bc94
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 23, 2026
5499d1c
docs(perf-changelog): note online_quant unused for DSV4-Pro MI355X AT…
seungrokj Sep 23, 2026
b9838f4
docs(perf-changelog): note online_quant unused for DSV4-Pro MI355X AT…
seungrokj Sep 24, 2026
b700281
Merge branch 'main' into amd/agentx_dsv4_atom_pd_0915
seungrokj Sep 24, 2026
57c4283
Merge remote-tracking branch 'origin/main' into pr3158-sync
adibarra Sep 25, 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
130 changes: 130 additions & 0 deletions benchmarks/multi_node/agentic/dsv4_fp4_mi355x_atom-disagg.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
#!/usr/bin/env bash

# Agentic trace-replay recipe for a disaggregated ATOM server on MI355X
# (DeepSeek-V4-Pro FP4, 1P1D TP8), mooncake RDMA KV transfer + atomesh router.
#
# CI-style sibling of dsv4_fp4_mi355x_sglang-disagg.sh (same agentic trace
# workload, same submit.sh path), but drives the ATOM engine instead of SGLang.
# Modeled on ATOM recipes/DeepSeek-V4-Agentic-PD-Max.md: three concurrency
# tiers selected by the search space -- TP (conc 1-32), DP-attention
# (conc 64-128, no offload), and DP-attention + CPU KV offload (conc 256,
# lmcache_offload multi connector). Per-tier server behavior lives in
# amd_utils/server_atom.sh (IS_AGENTIC branch) and models_atom.yaml
# (DeepSeek-V4-Pro-AgentX).

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

check_env_vars \
CONC_LIST \
ISL \
OSL \
IMAGE \
SPEC_DECODING \
MODEL_PATH \
PREFILL_NUM_WORKERS \
PREFILL_TP \
PREFILL_EP \
PREFILL_DP_ATTN \
DECODE_NUM_WORKERS \
DECODE_TP \
DECODE_EP \
DECODE_DP_ATTN \
PREFILL_NODES \
DECODE_NODES \
RANDOM_RANGE_RATIO \
DURATION \
KV_OFFLOADING \
IS_AGENTIC \
FRAMEWORK

if [[ -n "$SLURM_JOB_ID" ]]; then
echo "JOB $SLURM_JOB_ID running on $SLURMD_NODENAME"
fi

set -x

# Use upstreamed multi_node scripts (no external clone needed)
cd "$GITHUB_WORKSPACE/benchmarks/multi_node/amd_utils" || exit 1

# Set up ATOM launch script-specific environment variables
export TIME_LIMIT="${TIME_LIMIT:-08:00:00}"
export MODEL_PATH=$MODEL_PATH
export MODEL_NAME=$MODEL_NAME
export CONTAINER_IMAGE=$IMAGE

# ── Identity / result naming ──
export MODEL_PREFIX="${MODEL_PREFIX:-dsv4}"
export PRECISION="${PRECISION:-fp4}"
export RESULT_FILENAME="${RESULT_FILENAME:-${RUNNER_NAME:-dsv4-fp4-agentic}}"

# ── Agentic benchmark params ──
export DURATION="${DURATION:-1800}"
# DSV4-Pro max model len for agentic traces (matches single-node recipe).
export MAX_MODEL_LEN="${MAX_MODEL_LEN:-1000000}"

# ── KV cache offloading (ATOM lmcache_offload CPU tier) ──
# KV_OFFLOADING=none | dram (passed from YAML; none for the TP/DP tiers, dram
# for the conc-256 offload tier). KV_OFFLOAD_BACKEND selects the backend when
# offloading is on; the ATOM PD path only implements the lmcache_offload CPU
# tier, so "lmcache" is the only supported value. The multi-connector JSON and
# per-rank sizing are built in server_atom.sh from TOTAL_CPU_DRAM_GB (aggregate
# budget from the matrix, dram-utilization 0.80).
export KV_OFFLOADING="${KV_OFFLOADING:-none}"
if [[ "$KV_OFFLOADING" != "none" ]]; then
export KV_OFFLOAD_BACKEND="${KV_OFFLOAD_BACKEND:-lmcache}"
# Recipe (DeepSeek-V4-Agentic-PD-Max.md, "The offload settings that matter"):
# both default to values this workload cannot live with. Prefill node only.
export OFFLOAD_SLOT_STAGING_SLOTS="${OFFLOAD_SLOT_STAGING_SLOTS:-4}"
export OFFLOAD_COPY_WORKERS="${OFFLOAD_COPY_WORKERS:-1}"
export OFFLOAD_MIN_LOAD_TOKENS="${OFFLOAD_MIN_LOAD_TOKENS:-8192}"
fi

# ── MTP ──
# EAGLE/MTP synthetic acceptance length on agentic throughput runs (real target
# verification is used only on eval-only runs). 2.49 per the PD-Max recipe.
export DECODE_MTP_SIZE="${DECODE_MTP_SIZE:-0}"
export SPEC_DECODE_AL="${SPEC_DECODE_AL:-2.49}"

# Derive EP/DP enable flags from the topology inputs.
if [[ "${PREFILL_EP:-1}" -eq 1 ]]; then
export PREFILL_ENABLE_EP=false
else
export PREFILL_ENABLE_EP=true
fi

if [[ "$PREFILL_DP_ATTN" == "true" ]]; then
export PREFILL_ENABLE_DP=true
else
export PREFILL_ENABLE_DP=false
fi

if [[ "${DECODE_EP:-1}" -eq 1 ]]; then
export DECODE_ENABLE_EP=false
else
export DECODE_ENABLE_EP=true
fi

if [[ "$DECODE_DP_ATTN" == "true" ]]; then
export DECODE_ENABLE_DP=true
else
export DECODE_ENABLE_DP=false
fi

# Launch the job. CONC_LIST is space-delimited in YAML; submit.sh wants 'x'.
JOB_ID=$(bash ./submit.sh $PREFILL_NODES \
$PREFILL_NUM_WORKERS \
$DECODE_NODES \
$DECODE_NUM_WORKERS \
$ISL $OSL "${CONC_LIST// /x}" inf \
${PREFILL_ENABLE_EP} ${PREFILL_ENABLE_DP} \
${DECODE_ENABLE_EP} ${DECODE_ENABLE_DP} \
${PREFILL_TP} ${DECODE_TP} \
${RANDOM_RANGE_RATIO})

if [[ $? -ne 0 ]]; then
echo "Failed to submit job" >&2
exit 1
fi

echo "$JOB_ID"
57 changes: 55 additions & 2 deletions benchmarks/multi_node/amd_utils/models_atom.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,58 @@
# max_num_seqs: str # --max-num-seqs value (overrides default of 256)
# max_num_batched_tokens: str # --max-num-batched-tokens value (overrides default of unset)
# scheduler_delay_factor: str # --scheduler-delay-factor value (overrides default of unset)
# All registered model/scenario combinations are retired; see deprecated/models_atom.yaml.
{}
# Agentic-only (applied by server_atom.sh only when IS_AGENTIC=1):
# attn_prefill_chunk_size: str # --attn-prefill-chunk-size value (unset = omit)
# state_checkpoint_interval_tokens: str # --state-checkpoint-interval-tokens value (unset = omit)
# level: str # --level value (unset = omit)
# spec_decode_acceptance_length: str # --spec-decode-acceptance-length (synthetic AL on throughput runs; unset = omit)

# Agentic (AgentX trace-replay) variant of DeepSeek-V4-Pro on ATOM PD. Resolved
# by job.slurm/server_atom.sh as '<MODEL_NAME>-AgentX' when IS_AGENTIC=1. Differs
# from the throughput entry above per ATOM recipes/DeepSeek-V4-Agentic-PD-Max.md:
# prefix caching (server_atom.sh IS_AGENTIC branch), FP8 KV/index cache, TBO on
# prefill only, agentic prefill-chunk / state-checkpoint / level knobs, and MTP
# with synthetic acceptance on throughput runs.
DeepSeek-V4-Pro-AgentX: &DeepSeek-V4-Pro-AgentX
# Rail-isolated RDMA: matched rails replace dest-device affinity. Omit
# ATOM_MOONCAKE_MATCHED_RAILS if every default P/D HCA pair is mutually
# reachable on the fabric.
# ATOM_NUMA_BIND and the ATOM_DP_* ports are unconditional here: the recipe
# exports them in every tier, including TP (concurrency 1-32) where DP
# attention is off, so they cannot live in tp_dp_env/ep_dp_env (DP-only).
env: "ATOM_MOE_GU_ITLV=1 AITER_BF16_FP8_MOE_BOUND=0 MC_GID_INDEX=1 ATOM_MOONCAKE_MATCHED_RAILS=auto NCCL_IB_DISABLE=1 ATOM_DISABLE_MMAP=true ATOM_NUMA_BIND=1 ATOM_DP_MASTER_PORT=29510 ATOM_DP_BASE_PORT=29610 ATOM_PREFIX_CACHE_POLICY=lru ATOM_PREFIX_CACHE_PROTECTED_RATIO=0.5"
kv_cache_flags: "--kv_cache_dtype fp8 --index-cache-dtype fp4"
# DP-attention tiers (conc 64+): TBO is prefill-only per the recipe.
tp_dp_flags: "--enable-dp-attention"
prefill_tp_dp_flags: "--enable-dp-attention --enable-tbo"
decode_tp_dp_flags: "--enable-dp-attention"
ep_dp_flags: "--enable-expert-parallel --enable-dp-attention"
prefill_ep_dp_flags: "--enable-expert-parallel --enable-dp-attention --enable-tbo"
decode_ep_dp_flags: "--enable-expert-parallel --enable-dp-attention"
# DP-only env for the agentic DP-attention tiers (prefill and decode). Under
# --dp-aware the cache-aware router sends explicit P/D rank hints that take
# priority over engine-local session affinity and load balancing, so
# ATOM_DP_SESSION_AFFINITY and ATOM_DP_LB_REQ_EQUIV are not needed on this
# routing path (recipe). Cross-DP prefill coalescing (ATOM_ENABLE_PREFILL_DELAYER=0)
# is off on both roles per the recipe. NUMA binding and the DP ports moved to
# the unconditional env above because the recipe sets them in the TP tier too.
tp_dp_env: "ATOM_ENABLE_PREFILL_DELAYER=0"
ep_dp_env: "ATOM_ENABLE_PREFILL_DELAYER=0"
# Prefill-only DP env: the recipe sets GPU_MAX_HW_QUEUES=5 on the DP-attention
# prefill node and leaves decode unset. server_atom.sh applies this on prefill
# nodes only.
prefill_dp_env: "GPU_MAX_HW_QUEUES=5"
mtp_flags: "--method dspark --num-speculative-tokens"
# config.py forces block-size 256 for V4 (lcm(4,128)); 16 is ignored/misleading.
block_size: "256"
mem_frac_static: "0.9"
max_num_batched_tokens: "16384"
# Agentic-only server knobs consumed by server_atom.sh IS_AGENTIC branch.
attn_prefill_chunk_size: "16384"
state_checkpoint_interval_tokens: "8192"
level: "3"
spec_decode_acceptance_length: "3.01"

# The PD-Max recipe runs DSpark, which needs the draft head bundled in the
# -0813 config.json. Same alias split as models.yaml on the SGLang side.
DeepSeek-V4-Pro-0813-AgentX: *DeepSeek-V4-Pro-AgentX
Loading
Loading