Commit a141bfc
[AMD][AgentX] DeepSeek-V4 MI355X agentic disaggregated benchmarking (#2170)
* [AMD][AgentX] Add DeepSeek V4 MI355X agentic disagg
* run-sweep: fix broken conc-list interpolation for multi-node agentic
matrix.config.conc for multi-node agentic is already a JSON array
(e.g. [16,32,64] from generate_sweep_configs.py). Wrapping it in a
string literal as '[${{ matrix.config.conc }}]' can't correctly
interpolate an array into a string, producing a malformed conc-list
so fromJson(inputs.conc-list) in the reusable template ended up with
an empty/wrong CONC_LIST. Use toJson(matrix.config.conc) instead,
matching the pattern already used for the other two conc-list inputs
in this file.
Co-authored-by: Cursor <cursoragent@cursor.com>
* bump image to rocm/sgl-dev:sglang-0.5.14-rocm720-mi35x-mori-0706
Signed-off-by: Theresa Shan <theresa.shan@amd.com>
* run-sweep: fix sequence-typed conc input for multi-node agentic
matrix.config.conc for multi-node agentic entries is a JSON array
(chunked concurrencies per allocation), but sweep-multi-node-agentic
passed it directly into benchmark-multinode-tmpl.yml's `conc` input,
which is declared `type: string` ("First concurrency for
agentic-coding scenarios; CONC_LIST carries the full batch"). GitHub
Actions' reusable-workflow input validator rejects a sequence value
for a string-typed input at evaluation time, so the whole job failed
to even load:
evaluate reusable workflow inputs: .github/workflows/run-sweep.yml
(Line: 554, Col: 19): A sequence was not expected
Since the job never materializes when this happens, sweep-multi-node-
agentic silently disappeared from run summaries entirely instead of
showing as failed. Slice to the first element (matching the intended
"first concurrency" semantics and the same fix already applied
elsewhere, e.g. PR #2122) to restore a scalar value.
Co-authored-by: Cursor <cursoragent@cursor.com>
* agentic: run one task per concurrency for multi-node sweeps
Multi-node agentic sweeps batched up to 4 concurrencies per SLURM
allocation, running them sequentially against one shared server session.
A slow/hung conc could block the rest of the batch from ever producing
results, which is why run #6719 only reported c16 despite a
16/32/48/64 conc-list. Drop the batch size to 1 so each concurrency
gets its own task/allocation, matching the granularity already used
for single-node agentic sweeps.
Cherry-picked from backup/agentx-v1.0-rebase-pre-upstream-rewrite-20260710
(082a59d), adapted for the current test suite.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Bump image to latest upstream image with 4 PR fixes included.
* update con-list
Signed-off-by: Theresa Shan <theresa.shan@amd.com>
* setup_deps: remove disabled decode_tp_queue_agree patch
patch_decode_tp_queue_agree()'s invocation was already commented out
(dead code with no runtime effect), and the reference-only
patches/decode_tp_queue_agree.patch it mirrored had no other callers.
Drop both plus the README bullet pointing at it.
Co-authored-by: Cursor <cursoragent@cursor.com>
* setup_deps: broaden GLM transformers gate; disable prefill bootstrap-desync patch
install_transformers_glm5() was gated on an exact MODEL_NAME ==
"GLM-5-FP8" match; broaden to any model name containing "GLM" so other
GLM variants pick up the same glm_moe_dsa transformers fix.
Also disable patch_disagg_prefill_bootstrap_desync's invocation
(commented out, matching the already-disabled decode_tp_queue_agree
pattern removed earlier).
Co-authored-by: Cursor <cursoragent@cursor.com>
* agentic: node-0 sibling benchmark-client container for DSv4 sweeps (#2147)
* agentic: add node-0 sibling benchmark-client container for DSv4 sweeps
Port the "same-node sibling container" client mode from ROCm/InferenceY: when
CLIENT_IMAGE is set (and no CLIENT_NODES), node 0 launches the aiperf trace
replay in its own pre-baked container via the host docker socket, instead of
rebuilding the aiperf venv inside the server container and running it
co-located. This keeps the client's CPU-heavy tokenize/aggregate work off the
sglang scheduler + router, which inflates TTFT/E2E and lowers throughput under
agentic concurrency.
- server_sglang.sh: add IS_AGENTIC_RUN and a CLIENT_IMAGE sibling-container
branch that writes client.env and docker-runs the client against the local
router (--network host).
- job.slurm: define CLIENT_CONT_NAME; when CLIENT_IMAGE is set, mount the host
docker socket + CLI into the server container, forward
HOST_REPO_DIR/HOST_MODEL_DIR/HOST_BENCH_LOGS/CLIENT_CONT_NAME, pre-pull the
client image, and clean up the client container on teardown.
- amd-master.yaml: enable the sibling client on
dsv4-fp4-mi355x-sglang-disagg-agentic-hicache via CLIENT_IMAGE.
The separate-client-NODE mode is intentionally not ported.
* agentic: use server image for sibling client so upstream CI can pull it
The pre-baked rocm/pytorch-private aiperf client image is not pullable by
upstream CI runners. Reuse the (public) server image as CLIENT_IMAGE and build
aiperf on the fly from /workspace/utils/aiperf, matching the co-located path.
Gate the pre-baked-venv env (AIPERF_USE_PREBUILT / AIPERF_VENV) behind an
optional CLIENT_AIPERF_VENV so a real pre-baked client image can still opt in.
* enable log info and extend timeout
Signed-off-by: Theresa Shan <theresa.shan@amd.com>
* fix: address PR 2170 review comments
Update the DSv4 MI355X agentic perf-changelog entry to point at PR 2170 with an accurate description, and move hf_dir into the DeepSeek-V4-Pro YAML block so the SGLang model path extractor can read it.
中文:修复 PR 2170 的 review 反馈:将 DSv4 MI355X agentic 的 perf-changelog 条目改为指向 PR 2170 并更新为准确描述,同时把 hf_dir 移入 DeepSeek-V4-Pro YAML 配置块,确保 SGLang 模型路径提取逻辑可以读取。
* setup_deps: remove prefill bootstrap-desync patch entirely
The disaggregation-prefill bootstrap-desync patch was already disabled
(commented out); drop the function, its comment block, and the stale
invocation now that the fix is carried upstream in the pinned image.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix perf changelog
* consolidate sglang agentic envs
Signed-off-by: Theresa Shan <theresa.shan@amd.com>
* select models.yaml recipe by IS_AGENTIC (AgentX/DI variants)
Resolve the models.yaml entry per run type: agentic runs (IS_AGENTIC) use
the '<model>-AgentX' recipe, non-agentic disaggregated runs use '<model>-DI',
falling back to the bare model name when no variant key exists. Apply the same
logic in both server_sglang.sh (lookup) and job.slurm (validation guard) so a
bare MODEL_NAME (e.g. DeepSeek-V4-Pro) correctly maps to the suffixed key.
Add DeepSeek-V4-Pro-DI and rename the agentic recipe to DeepSeek-V4-Pro-AgentX.
Co-authored-by: Cursor <cursoragent@cursor.com>
* DPTP enabling.
Signed-off-by: Theresa Shan <theresa.shan@amd.com>
* tune hicache ratio, router barrier timeout, and agentic conc sweep
- server_sglang.sh: lower default HICACHE_RATIO 24->5 (cut host-pool
pin/registration startup cost) and raise router health barrier
timeout 1800->3000 so a slow server bring-up no longer trips the
cross-node router wait first.
- amd-master.yaml: restore conc 32 on the non-DP-attn (TP8) point and
comment out the DP-attn c64/128 sweep block.
- models.yaml: drop explicit max_total_tokens override for the AgentX
dp variant (let it derive from context_length).
Co-authored-by: Cursor <cursoragent@cursor.com>
* raise hicache ratio to 16
Signed-off-by: Theresa Shan <theresa.shan@amd.com>
* fix: restore qwen3.5 changelog entry removed during rebase
perf-changelog.yaml must only gain entries; re-adding the upstream
qwen3.5-fp8-gb300-dynamo-sglang block fixes process_changelog.py.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: validate agentic hicache master config for changelog gate
Use kv-offload-backend object form and add kv-p2p-transfer: mori for
the disaggregated dsv4-fp4-mi355x-sglang-disagg-agentic-hicache entry.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: wire KV_P2P_TRANSFER env into SGLang launch flags
Override models.yaml --disaggregation-transfer-backend when
kv-p2p-transfer from amd-master.yaml is set via CI, and forward
KV_P2P_TRANSFER to the agentic client env for result metadata.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore: drop max_total_tokens from DSv4 AgentX prefill no_dp recipe
Let SGLang auto-size the prefill KV pool instead of pinning 1M tokens.
Co-authored-by: Cursor <cursoragent@cursor.com>
* tune: raise router barrier timeout to 3000s for worker nodes
Give prefill/decode workers more time to wait for the node-0 proxy
during long agentic server startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
* test: fix sweep config fixtures for kv-p2p-transfer validation
Add kv-p2p-transfer to disagg multinode test configs and use
KVOffloadBackendMetadata dict form for kv-offload-backend fields.
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor: centralize sync barrier timeouts for DSV4 startup
Extract SYNC_BARRIER_TIMEOUT (3000s for DeepSeek-V4, 1800s otherwise) and
apply it to server-up, router readiness, and prefill/decode proxy barriers.
Also lower the default HICACHE_RATIO from 16 to 5.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: forward KV offload backend metadata to agentic client
Pass KV_OFFLOAD_BACKEND_METADATA into server containers via job.slurm and
forward it to sibling client containers in server_sglang client.env so
process_agentic_result can write aggregate JSON. Derive KV_OFFLOAD_BACKEND
from metadata in the DSv4 agentic recipe when unset.
Co-authored-by: Cursor <cursoragent@cursor.com>
* revert: drop metadata-derived KV_OFFLOAD_BACKEND from DSv4 recipe
CI already sets KV_OFFLOAD_BACKEND from the workflow; keep the job.slurm and
server_sglang metadata forwarding fixes without the redundant recipe logic.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: quote KV_OFFLOAD_BACKEND_METADATA in docker run env forwarding
toJson() pretty-prints with embedded newlines, so the unquoted expansion in
job.slurm's DOCKER_ENV_COMMON was word-split across the docker run command,
corrupting its argument list ("docker: invalid reference format", exit 125).
Quote the value so the whole JSON stays one token.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix client.env generation to flatten multi-line env values
docker run --env-file requires strict single-line KEY=VALUE entries.
KV_OFFLOAD_BACKEND_METADATA carries pretty-printed multi-line JSON,
which split into invalid env-file lines (e.g. '"name": "hicache",')
and aborted the sibling client container launch with "docker: invalid
env file ... contains whitespaces". Strip embedded newlines before
writing each value so the JSON stays valid but single-line.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Re-serialize KV_OFFLOAD_BACKEND_METADATA as compact JSON instead of stripping newlines
Naive newline-stripping could silently corrupt a value if a JSON string
ever contained a literal embedded newline (merging tokens across the
line break). Round-tripping through json.loads/json.dumps guarantees a
correct compact single-line representation for client.env, and fails
loudly with a clear error if the value isn't valid JSON.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix regression: skip JSON round-trip for empty KV_OFFLOAD_BACKEND_METADATA
job.slurm always forwards KV_OFFLOAD_BACKEND_METADATA into the server
container, even as "" when KV offloading is disabled (the common
default case). The prior commit unconditionally ran it through
json.loads/json.dumps, which raised JSONDecodeError on that empty
string and hard-failed every agentic client-container launch without
KV offloading. Only attempt the JSON round-trip when the value is
non-empty and not "null", matching how
optional_kv_offload_backend_metadata() already treats those as
"no metadata" rather than invalid JSON.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(changelog): append PR entry after main
* fix(changelog): omit null optional metadata
* fix(agentx): set DeepSeek reasoning effort high
* Remove stale patches/README.md documenting an already-retired mori_conn.py overlay
mori_conn.py and the job.slurm auto-apply block it documented were
already deleted upstream (retire MoRI conn.py PD-disagg overlay,
aca9cee) once the real sglang fix landed in published images. A
later unrelated commit (183a987) accidentally recreated this README
from scratch while only intending to drop a bullet about a different,
already-removed patch (decode_tp_queue_agree.patch), leaving stale
docs pointing at a file and job.slurm block that no longer exist.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(agentx): enforce agentic DRAM offload budget for multinode disagg
Multinode agentic entries hardcoded total-cpu-dram-gb=0, so the DRAM
KV-offload pool was never bounded at runtime (HiCache fell back to a
relative --hicache-ratio). Compute a real per-node budget from the
prefill worker (the only KV offloader today) and wire it through to a
--hicache-size cap.
- generate_sweep_configs: fold multinode into agentic_dram_offload_gb;
budget the prefill worker's per-node GPU footprint via worker_gpus_per_node,
which rejects node-misaligned topologies instead of silently truncating.
- validation: add total-cpu-dram-gb to MultiNodeAgenticMatrixEntry.
- run-sweep: forward total-cpu-dram-gb to the multi-node agentic dispatch.
- server_sglang.sh: size prefill HiCache via absolute --hicache-size
(budget / ranks-per-node / host-pools), falling back to --hicache-ratio
when no budget is provided; drop the dead HICACHE_TOTAL_CPU_DRAM_GB default.
* Fix indentation of dsv4-fp4-b200-vllm-agentic entry in perf-changelog.yaml
The config-keys entry was missing its leading indentation, breaking YAML list alignment with sibling entries.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(agentx): skip --hicache-size for DeepSeek V4 in multinode HiCache
DeepSeek V4's hybrid HiCache pool assembler rejects --hicache-size and
requires --hicache-ratio, so the absolute per-node DRAM budget cannot be
applied to it. Restrict the --hicache-size enforcement to non-V4 models;
V4 falls back to --hicache-ratio. Budget stays recorded in the config.
中文:多节点 HiCache 对 DeepSeek V4 跳过 --hicache-size。DeepSeek V4 的
混合 HiCache 池不支持 --hicache-size、必须用 --hicache-ratio,因此绝对
的每节点 DRAM 预算无法作用于它。将 --hicache-size 限制为非 V4 模型;
V4 回退到 --hicache-ratio。预算仍记录在 config 中。
---------
Signed-off-by: Theresa Shan <theresa.shan@amd.com>
Co-authored-by: Cam Quilici <cjquilici@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: AMD-yanfeiwang <yanfei.wang@amd.com>
Co-authored-by: Duyi-Wang <duyi.wang@amd.com>
Co-authored-by: billishyahao <bill.he@amd.com>1 parent 673a601 commit a141bfc
16 files changed
Lines changed: 1326 additions & 272 deletions
File tree
- .github/workflows
- benchmarks/multi_node
- agentic
- amd_utils
- configs
- runners
- utils
- agentic/aggregation
- backends
- matrix_logic
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
581 | 581 | | |
582 | 582 | | |
583 | 583 | | |
| 584 | + | |
584 | 585 | | |
585 | 586 | | |
586 | 587 | | |
| |||
Lines changed: 172 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 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 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
15 | 32 | | |
16 | 33 | | |
17 | 34 | | |
| |||
50 | 67 | | |
51 | 68 | | |
52 | 69 | | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
58 | 75 | | |
59 | 76 | | |
60 | 77 | | |
| |||
197 | 214 | | |
198 | 215 | | |
199 | 216 | | |
200 | | - | |
201 | | - | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
202 | 221 | | |
203 | 222 | | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
204 | 232 | | |
205 | 233 | | |
206 | 234 | | |
207 | 235 | | |
| 236 | + | |
| 237 | + | |
208 | 238 | | |
209 | 239 | | |
210 | 240 | | |
| |||
242 | 272 | | |
243 | 273 | | |
244 | 274 | | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
245 | 278 | | |
246 | 279 | | |
247 | 280 | | |
248 | 281 | | |
249 | | - | |
250 | | - | |
251 | | - | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
252 | 288 | | |
253 | 289 | | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
254 | 303 | | |
255 | 304 | | |
256 | 305 | | |
| |||
262 | 311 | | |
263 | 312 | | |
264 | 313 | | |
265 | | - | |
266 | | - | |
267 | | - | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
268 | 317 | | |
269 | 318 | | |
270 | 319 | | |
271 | | - | |
272 | | - | |
| 320 | + | |
273 | 321 | | |
274 | 322 | | |
275 | 323 | | |
276 | | - | |
| 324 | + | |
277 | 325 | | |
278 | 326 | | |
279 | 327 | | |
280 | | - | |
281 | | - | |
282 | | - | |
| 328 | + | |
283 | 329 | | |
| 330 | + | |
| 331 | + | |
284 | 332 | | |
285 | | - | |
| 333 | + | |
286 | 334 | | |
287 | 335 | | |
288 | 336 | | |
289 | | - | |
| 337 | + | |
290 | 338 | | |
291 | 339 | | |
292 | 340 | | |
293 | 341 | | |
| 342 | + | |
294 | 343 | | |
295 | 344 | | |
296 | 345 | | |
297 | 346 | | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
298 | 352 | | |
299 | 353 | | |
300 | | - | |
301 | | - | |
302 | | - | |
303 | | - | |
| 354 | + | |
0 commit comments