Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
# DeepSeek-V4-Pro-0813 AgentX on MI355X: 1P1D ATOM disaggregation over Mooncake
# RDMA behind AToMesh, with DSpark (three draft tokens). Ported from the legacy
# amd_utils path (#3158; ATOM recipes/DeepSeek-V4-Agentic-PD-Max.md). Three tiers:
# TP8 at concurrency 1-16, DP attention at 64-128, and DP attention plus ATOM's
# in-process LMCache CPU offload on prefill at 256. srtctl generates the Mooncake
# P/D connector; the offload tier adds lmcache_offload next to it
# (runners/srt-slurm/patches/507-lmcache-server-atom-sglang.patch).
base:
schema: 2
name: mi355x-dsv4-pro-0813-atom-agentx-lmcache
model:
path: DeepSeek-V4-Pro-0813
container: rocm/atom-dev:nightly_202609221542
precision: fp4
slurm:
time_limit: "08:00:00"
resources:
gpu_type: mi355x
gpus_per_node: 8
frontend:
type: atomesh
enable_multiple_frontends: false
args:
log-level: info
disable-health-check: true
disable-circuit-breaker: true
prometheus-port: 29100
engine: atom
roles:
prefill:
nodes: 1
workers: 1
gpus: 8
env: &environment
PYTHONUNBUFFERED: "1"
PYTHONDONTWRITEBYTECODE: "1"
SAFETENSORS_FAST_GPU: "1"
VLLM_LOG_LEVEL: WARNING
ATOM_LOG_LEVEL: WARNING
AITER_LOG_LEVEL: WARNING
LOG_LEVEL: WARNING
LOGLEVEL: WARNING
ATOM_MOE_GU_ITLV: "1"
AITER_BF16_FP8_MOE_BOUND: "0"
# Rail-isolated RDMA: matched rails replace dest-device affinity.
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"
args: &server
served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813
trust-remote-code: true
method: dspark
num-speculative-tokens: 3
kv_cache_dtype: fp8
index-cache-dtype: fp4
# ATOM forces block size 256 for V4.
block-size: 256
gpu-memory-utilization: 0.9
max-model-len: 1000000
max-num-batched-tokens: 16384
attn-prefill-chunk-size: 16384
state-checkpoint-interval-tokens: 8192
level: 3
cudagraph-mode: FULL
enable-prefix-caching: true
decode:
nodes: 1
workers: 1
gpus: 8
env:
<<: *environment
args:
<<: *server
sbatch_directives:
cpus-per-task: "128"
mem: "0"
srun_options:
mem: "0"
container-writable: ""
container-remap-root: ""
health_check:
max_attempts: 720
interval_seconds: 5
benchmark:
type: custom
command: bash /infmax-workspace/benchmarks/srt_agentic.sh
env:
MODEL: deepseek-ai/DeepSeek-V4-Pro-0813
# The MI355X launcher collects results from the job workspace.
RESULT_DIR: /infmax-workspace/LOGS/agentic
AGENTIC_OUTPUT_DIR: /infmax-workspace
AIPERF_REQUIRED_SERVER_METRIC_PREFIX: "atom:"
AIPERF_DATASET_MMAP_CACHE_DIR: /aiperf_mmap_cache
HF_HUB_CACHE: /hf_hub_cache/hub
TOKENIZERS_PARALLELISM: "false"
TRANSFORMERS_VERBOSITY: error

# One variant per point; each point runs in its own allocation. Admission is
# 2x CONC on both roles. Decode captures every batch up to min(64, 2x CONC) on
# TP, or CONC/4 per rank under DP attention. DP attention adds TBO on prefill.

override_tp8_c1:
frontend:
args:
prefill-policy: round_robin
decode-policy: round_robin
atom-pd-rank-mapping-policy: none
roles:
prefill:
args:
max-num-seqs: 2
decode:
args:
max-num-seqs: 2
cudagraph-capture-sizes: '[1,2]'
benchmark:
env:
CONC: '1'

override_tp8_c16:
frontend:
args:
prefill-policy: round_robin
decode-policy: round_robin
atom-pd-rank-mapping-policy: none
roles:
prefill:
args:
max-num-seqs: 32
decode:
args:
max-num-seqs: 32
cudagraph-capture-sizes: '[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]'
benchmark:
env:
CONC: '16'

override_dpa8_c64:
frontend:
args:
dp-aware: true
prefill-policy: cache_aware
decode-policy: cache_aware
cache-threshold: 0.8
balance-abs-threshold: 20
balance-rel-threshold: 2.0
eviction-interval: 300
atom-pd-rank-mapping-policy: none
roles:
prefill:
env:
ATOM_ENABLE_PREFILL_DELAYER: '0'
GPU_MAX_HW_QUEUES: '5'
args:
max-num-seqs: 128
enable-dp-attention: true
enable-tbo: true
decode:
env:
ATOM_ENABLE_PREFILL_DELAYER: '0'
args:
max-num-seqs: 128
cudagraph-capture-sizes: '[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]'
enable-dp-attention: true
benchmark:
env:
CONC: '64'

override_dpa8_c128:
frontend:
args:
dp-aware: true
prefill-policy: cache_aware
decode-policy: cache_aware
cache-threshold: 0.8
balance-abs-threshold: 20
balance-rel-threshold: 2.0
eviction-interval: 300
atom-pd-rank-mapping-policy: none
roles:
prefill:
env:
ATOM_ENABLE_PREFILL_DELAYER: '0'
GPU_MAX_HW_QUEUES: '5'
args:
max-num-seqs: 256
enable-dp-attention: true
enable-tbo: true
decode:
env:
ATOM_ENABLE_PREFILL_DELAYER: '0'
args:
max-num-seqs: 256
cudagraph-capture-sizes: '[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]'
enable-dp-attention: true
benchmark:
env:
CONC: '128'

override_dpa8_c256_lmcache:
frontend:
args:
dp-aware: true
prefill-policy: dp_sticky
decode-policy: dp_sticky
atom-pd-rank-mapping-policy: none
roles:
prefill:
env:
ATOM_ENABLE_PREFILL_DELAYER: '0'
GPU_MAX_HW_QUEUES: '5'
PYTHONHASHSEED: '0'
OFFLOAD_COPY_WORKERS: '1'
OFFLOAD_MIN_LOAD_TOKENS: '8192'
OFFLOAD_SLOT_STAGING_SLOTS: '4'
args:
max-num-seqs: 512
enable-dp-attention: true
enable-tbo: true
extra-kv-connectors:
- kv_connector: lmcache_offload
kv_role: offload
offload_layout: hybrid
max_pending_saves: 8
slot_sidecar_staging_slots: 4
lmcache.local_cpu: true
# total-cpu-dram-gb 1499 (dram-utilization 0.5) over the eight prefill ranks.
lmcache.max_local_cpu_size: 187
lmcache.local_disk: null
lmcache.max_local_disk_size: 0
lmcache.remote_url: null
lmcache.chunk_size: 256
lmcache.cache_policy: LRU
lmcache.lookup_server_worker_ids: []
lmcache.store_location: LocalCPUBackend
lmcache.retrieve_locations: [LocalCPUBackend]
decode:
env:
ATOM_ENABLE_PREFILL_DELAYER: '0'
args:
max-num-seqs: 512
cudagraph-capture-sizes: '[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64]'
enable-dp-attention: true
benchmark:
env:
CONC: '256'
# dp_sticky keys sessions on the correlation id.
AIPERF_HTTP_X_SESSION_ID_FROM_CORRELATION_ID: '1'
59 changes: 39 additions & 20 deletions inferencex-e2e/configs/amd-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1215,52 +1215,74 @@ dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark:
disagg: true
scenarios:
agentic-coding:
# MTP tiers with GPU-resident KV, unchanged from run 35643358891 apart from
# the image bump. Concurrency 1/16 run plain TP8; 64/128 add DP attention
# (c128 measured in run 35810485934, gsm8k eval in run 35851118405).
# srt-slurm recipe benchmarks/multi_node/srt-slurm-recipes/dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml
# (ATOM recipes/DeepSeek-V4-Agentic-PD-Max.md). Concurrency 1/16 run plain
# TP8; 64/128 add DP attention with prefill TBO and the cache-aware router.
- dram-utilization: 0.80
search-space:
- spec-decoding: "draft_model"
conc-list: [ 1, 16 ]
conc-list: [ 1 ]
kv-offloading: none
prefill:
num-worker: 1
tp: 8
ep: 1
dp-attn: false
additional-settings:
- "PREFILL_NODES=1"
- "CONFIG_FILE=recipes/dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml:override_tp8_c1"
decode:
num-worker: 1
tp: 8
ep: 1
dp-attn: false
- spec-decoding: "draft_model"
conc-list: [ 16 ]
kv-offloading: none
prefill:
num-worker: 1
tp: 8
ep: 1
dp-attn: false
additional-settings:
- "DECODE_NODES=1"
- "DECODE_MTP_SIZE=3"
# DP-attention tier (recipe: concurrency 64-128). TP8 + DP attention,
# prefill TBO only, cache-aware router, no CPU offload.
- "CONFIG_FILE=recipes/dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml:override_tp8_c16"
decode:
num-worker: 1
tp: 8
ep: 1
dp-attn: false
- spec-decoding: "draft_model"
conc-list: [ 64, 128 ]
conc-list: [ 64 ]
kv-offloading: none
prefill:
num-worker: 1
tp: 8
ep: 1
dp-attn: true
additional-settings:
- "PREFILL_NODES=1"
- "CONFIG_FILE=recipes/dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml:override_dpa8_c64"
decode:
num-worker: 1
tp: 8
ep: 1
dp-attn: true
- spec-decoding: "draft_model"
conc-list: [ 128 ]
kv-offloading: none
prefill:
num-worker: 1
tp: 8
ep: 1
dp-attn: true
additional-settings:
- "DECODE_NODES=1"
- "DECODE_MTP_SIZE=3"
# DP-attention + CPU offload tier (recipe: concurrency 256). Prefill adds
# the lmcache host KV offload tier; decode is plain Mooncake. DSpark draft
# model and dram-utilization 0.50 as measured in run 35825955863.
- "CONFIG_FILE=recipes/dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml:override_dpa8_c128"
decode:
num-worker: 1
tp: 8
ep: 1
dp-attn: true
# DP attention plus ATOM's in-process LMCache CPU offload on prefill
# (lmcache_offload); decode is plain Mooncake. dram-utilization 0.50 as
# measured in run 35825955863.
- dram-utilization: 0.50
search-space:
- spec-decoding: "draft_model"
Expand All @@ -1273,15 +1295,12 @@ dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark:
ep: 1
dp-attn: true
additional-settings:
- "PREFILL_NODES=1"
- "CONFIG_FILE=recipes/dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml:override_dpa8_c256_lmcache"
decode:
num-worker: 1
tp: 8
ep: 1
dp-attn: true
additional-settings:
- "DECODE_NODES=1"
- "DECODE_MTP_SIZE=3"

# GLM-5.2 FP4 agentic-coding benchmark on MI355X via SGLang with MTP speculative
# decoding. Two arms:
Expand Down
1 change: 1 addition & 0 deletions inferencex-e2e/infx/srt_slurm/synthetic_acceptance.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"trt": "trtllm",
"dynamo-trt": "trtllm",
"atom": "atom",
"atom-disagg": "atom",
}
SGLANG_VARIABLES = (
"SGLANG_SIMULATE_ACC_LEN",
Expand Down
9 changes: 9 additions & 0 deletions inferencex-e2e/perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8995,3 +8995,12 @@
- "Validate MiniMax-M3 AgentX on H200 with vLLM FP8 after moving the end-to-end project into inferencex-e2e/. Preserve the existing image, recipe, and benchmark settings."
- "将端到端项目迁入 inferencex-e2e/ 后,验证 H200 上的 vLLM FP8 MiniMax-M3 AgentX 运行路径,沿用现有镜像、配方和基准测试设置。"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3525

- config-keys:
- dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark
scenario-type:
- agentic-coding
description:
- "Port the DeepSeek-V4-Pro-0813 MI355X ATOM 1P1D AgentX config from the legacy amd_utils path to a native srt-slurm recipe (benchmarks/multi_node/srt-slurm-recipes/dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml), one override variant per point. Server flags, env, AToMesh routing policies and decode CUDA-graph capture sizes match the legacy server_atom.sh for every tier: TP8 at concurrency 1 and 16, DP attention with prefill TBO at 64 and 128, and DP attention with ATOM's in-process LMCache CPU offload (lmcache_offload, 187 GB per prefill rank) at 256. Golden acceptance 3.01 for DSpark with three draft tokens is now injected by the srt-slurm path, the same value the legacy models_atom.yaml hardcoded."
- "srt-slurm had no way to add LMCache next to its generated Mooncake connector, so runners/srt-slurm/patches/507-lmcache-server-atom-sglang.patch applies SemiAnalysisAI/srt-slurm#32 (which includes NVIDIA/srt-slurm#507) to the pinned submodule until it lands upstream."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXXX
Loading
Loading