Skip to content

feat(srt): run AgentX on native srt-slurm - #3428

Merged
adibarra merged 131 commits into
mainfrom
agent/srt-agentx-port
Sep 26, 2026
Merged

adibarra merged 131 commits into
mainfrom
agent/srt-agentx-port

Conversation

@cquil11

@cquil11 cquil11 commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

Step 3 of the srt-slurm migration: run all AgentX, single- and multi-node, on native srt-slurm with the design used for fixed-sequence (#3352, #2542, #3413, #3415). TileRT is out of scope.

Draft: 58 of the 62 active single-node AgentX configs now run natively, the multi-node recipes are consolidated, and MI355X DSV4 multi-node (#2555) is ported. Some smoke runs are still in flight; see Testing.

Background

  • Single-node fixed-sequence points already run natively. A search-space entry names an srt-recipe, infx.srt_slurm.single_node selects the one recipe variant that matches the matrix point, and srt-slurm owns the server.
  • Single-node AgentX still runs 62 active configs through 65 bash scripts that start the server and the AIPerf replay themselves. The single-node adapter rejected AgentX points.
  • Multi-node AgentX already runs on srt-slurm, with its own client, benchmarks/multi_node/agentic_srt.sh.

Design

The same principles as fixed-sequence:

  • one shared client for single- and multi-node;
  • concurrencies come from the matrix;
  • recipes carry only engine configuration;
  • one recipe file per config: variations are basic override_* variants (one per point), not separate files or zip variants. Existing multi-node AgentX recipes split into one file per variation (for example qwen3.5/sglang/gb300-fp4/agentx/agg-tp2-c24-...-jid2530012.yaml) get consolidated the same way;
  • engine setup that has to run in the worker container uses the recipe's setup_script, never cluster hooks.

Changes

  • Shared client. benchmarks/srt_agentic.sh (moved from benchmarks/multi_node/agentic_srt.sh) serves both paths:
    • it replays one CONC point, or each point of a multi-node CONC_LIST batch with the existing drain between points;
    • behind a router frontend it reads engine metrics from each worker (SRT_*_ENDPOINTS); Dynamo is unchanged;
    • the workspace, port and multi-node flag default in the client instead of every recipe.
    • All AgentX recipes point at the new path.
  • Routing. The 11 single-node launchers take the native path for any point with an srt-recipe, AgentX included. Configs without one keep the legacy script, so they move over one at a time.
  • Matrix. AgentX search-space entries accept srt-recipe, and the generator passes it through as it does for fixed-sequence.
  • Adapter. infx.srt_slurm.single_node accepts AgentX points and DSpark speculation:
    • it skips the fixed-sequence workload checks and requires the AgentX client;
    • it binds the AgentX runtime inputs and writes results under /logs.
    • Golden acceptance comes from synthetic_acceptance, as for multi-node AgentX.
  • Artifacts. The launcher copies logs/agentic to results/, where the workflow uploads the raw replay artifacts and the power window.
  • Launchers. The H200 native path sets SRT_MODEL_PATH, as the other launchers do. On B200 a model that isn't staged locally resolves as hf:<model>. GB200 and GB300 gain the native single-node path: they import the squash on a compute tray, then call launch_srt_single_node with an aarch64 srt-slurm setup (SRT_SETUP_ARCH).
  • vLLM in the adapter. vLLM points validate topology as tensor-parallel-size x data-parallel-size = TP, DP attention as data-parallel-size > 1, and expert parallelism as enable-expert-parallel. Eval-only runs set max-model-len.
  • Client-side chat template. Recipes set AIPERF_APPLY_CHAT_TEMPLATE: 'true' where the legacy script passed --apply-chat-template to the replay.
  • Recipe fixes found by validating every active multi-node AgentX recipe against the pinned srt-slurm:
    • 6 Kimi-K3 vLLM recipes used the old provider/default_frequency telemetry fields; they now use collect_interval_ms: 1000;
    • one GLM-5.2 H200 recipe pinned collector_join_timeout_seconds: 10, which the validator rejects; srt-slurm now derives it.
  • Ported configs (single-node SGLang). dsv41flash-fp4-h200-sglang-agentic-dspark, qwen3.5-fp8-h200-sglang-agentic-mtp, qwen3.8next-fp8-h200-sglang-agentic-mtp, and DSV4.1 Flash DSpark on B200, B300, GB200 and GB300 (dsv41flash-fp4-{b200,b300,gb200,gb300}-sglang-agentic-dspark). The first is described below; the others follow the same pattern. The adapter also checks KV_OFFLOADING and TOTAL_CPU_DRAM_GB when a variant declares them, which is how the Qwen3.5 GPU-KV and HiCache variants are selected.
  • Pilot. dsv41flash-fp4-h200-sglang-agentic-dspark (TP4 and TP8) moves to dsv41flash/sglang/h200-fp4-mtp/agentic.yaml, translated from dsv41flash_fp4_h200_sglang_mtp.sh.
    • One basic override per (TP, concurrency) point sets admission (2x CONC, capped at the decode graph batch) and the warmup grace period.
    • The measured H200 tilings install through setup_script.

Status of single-node AgentX configs

  • Native (58). Every search-space entry names an srt-recipe and binds through the adapter at every matrix point (perf and eval), except the legacy entries listed next.
  • Entries kept on legacy scripts:
    • ATOM LMCache entries of glm5.2-fp4-mi355x-atom (DCP4), kimik3-fp4-mi355x-atom (DCP8) and minimaxm3-fp4-mi355x-atom: srtctl's ATOM backend reserves kv-transfer-config, so an aggregate worker can't set the LMCache connector without an srt-slurm patch.
    • kimik3-fp4-mi355x-vllm and minimaxm3-fp4-mi355x-vllm: their nightly images were pruned from Docker Hub. The legacy path still runs from node-local squashes. The native path can use a squash staged on /it-share (the launcher already looks there); the recipes are ready.
  • Not ported: qwen3.5-{fp4,fp8}-b300-sglang-agentic-power-ab target cluster:b300-nv, which has no runners.
  • Blocked by infrastructure, wired natively:
    • the 4 MI325X configs: every MI325X job, main included, fails in the workflow's uv python install (File exists at the runner's ~/.cache/uv);
    • minimaxm3-fp4-{b200,b300}-vllm: image pruned, no squash cache, and the legacy path fails the same way.

Testing

All runs use agentx-fast, single concurrency, --no-evals.

Single-node, native (new path)

Config Cluster Points Result Runs (latest last)
DSV4.1 Flash SGLang DSpark H200 TP4 c1, TP8 c1 Pass 36101684028 (schema), 36102087226 (workspace), 36132483244
Qwen3.5 FP8 SGLang MTP H200 TP8 c4, GPU KV and HiCache Pass, 338/346 requests, power_valid: 1 36132486683
Qwen3.8-Next FP8 SGLang MTP H200 TP4 c1 Pass 36132489467
DSV4.1 Flash SGLang DSpark B200 TP4 c1, TP2 c1 Pass 36145317466
DSV4.1 Flash SGLang DSpark B300 TP4/TP2 at c2, c32 Pending 36159475708
DSV4.1 Flash SGLang DSpark GB200 TP4/TP2 at c2, c64 Pending 36160112838
DSV4.1 Flash SGLang DSpark GB300 TP2/TP4 at c2, c64 Pending 36160154502

Multi-node, existing srt-slurm path (shared client)

Cluster Engine Topology Config Result Run
B200 Dynamo SGLang agg glm5.2-fp4-b200-dynamo-sglang-agentic-agg Pass 36102410962
B200 Dynamo vLLM agg kimik3-fp4-b200-dynamo-vllm-agentic-dspark Pass 36102413420
B300 Dynamo SGLang disagg qwen3.5-fp8-b300-dynamo-sglang-agentic-disagg Pass 36102415729
GB200 Dynamo SGLang agg qwen3.5-fp4-gb200-dynamo-sglang-agentic-mtp Pass 36102399841
GB200 Dynamo TRT-LLM agg minimaxm3-fp4-gb200-dynamo-trt-agentic-agg-mtp Pass 36102396732
GB200 Dynamo vLLM agg, c1 and c2 dsv4-fp4-gb200-dynamo-vllm-agentic-mtp-agg Pass 36102393649
GB300 Dynamo SGLang disagg qwen3.5-fp4-gb300-dynamo-sglang-agentic-disagg Pass 36102402661
GB300 Dynamo TRT-LLM disagg glm5.2-fp4-gb300-dynamo-trt-agentic-disagg-mtp Pass 36102405230
GB300 Dynamo vLLM disagg minimaxm3-fp4-gb300-dynamo-vllm-agentic-mtp-disagg Pass 36102408138
H200 vLLM (router) agg kimik3-fp4-h200-vllm-agentic-latency Fail, see below 36102389423
H200 Dynamo SGLang agg dsv4-fp8-h200-dynamo-sglang-agentic-agg Fail, pre-existing 36102387362
H200 Dynamo SGLang disagg glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-1p1d-hicache Fail, pre-existing 36102391349

Single-node, ported batches. Each ported config was smoke-tested on its cluster with agentx-fast at points covering each variant regime, and at least one eval-only point per engine family. Runs are listed in the batch comments on this PR.

  • B200 SGLang/TRT, B300 SGLang/TRT, H100/H200 SGLang and vLLM, B200/B300/GB200/GB300 vLLM, MI300X/MI355X vLLM, MI355X SGLang/ATOM.
  • Fixes found by these runs (all in this PR):
    • B300 jobs got srtctl's default one-hour --time; the profile now takes the workflow limit.
    • Models not staged on every B300 node now load from the shared model root.
    • GB200/GB300 cold loads take about 30 minutes; the recipes get a two-hour health budget.
    • Single-node AgentX eval-only failed on every engine (a MAX_MODEL_LEN requirement, then double artifact staging); it now evaluates at native context with the workflow's framework, and artifacts upload.
    • H100 per-runner uv caches, MI355X shared HF cache mounts, and a squash staged on /it-share for the MI355X native path.
  • Multi-node consolidation: 122 per-variation recipes became 29 files with override_* variants; every selector resolves identically to the file it replaced (0 diffs), and smoke passed on B200, B300, GB200 and GB300.
  • MI355X DSV4 multi-node (UMBP): c4, c16 and c192 passed (36158061438); no power data, as on main.

Known issues

  • H200 DSV4/GLM-5.2 AgentX (pre-existing). These recipes enable DCGM power telemetry and place etcd/NATS on a dedicated node, and the pinned srt-slurm rejects that combination (telemetry requires infra.etcd_nats_dedicated_node: false). RECIPES.md already records this as a power compatibility blocker that should not be fixed by changing topology, so this PR leaves the placement as is.
  • Kimi-K3 H200 vLLM. The replay ran and wrote valid results (0/5 errors), then aiperf failed ProfileMetricCoverageError: at c1 with the 20-minute agentx-fast profile, only 5 to 7 long requests (median E2E 113 s) completed and none ran into the last 60 s. A full-duration rerun is pending to separate that from a server stall.

Remaining work

  • Port the remaining single-node AgentX configs (in progress, batched by cluster and engine: B200, B300, NVIDIA vLLM, H100/H200, MI355X SGLang/ATOM, AMD vLLM).
  • Consolidate multi-node AgentX recipes split into one file per variation into one file per config with basic overrides (in progress).
  • MI355X multi-node DSV4 (Port MI355X DeepSeek V4 AgentX DSPARK to AMD-enabled srt-slurm #2555, UMBP linker) is ported here and under test; then remove the legacy scripts and the amd_utils AgentX path.
  • qwen3.5-{fp4,fp8}-b300-sglang-agentic-power-ab target cluster:b300-nv, which has no runners in configs/runners.yaml; they are left as is.
  • TileRT follows in a separate PR stacked on this one.

@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution!

  • Review: If this PR changes files owned by someone other than a repository admin or @SemiAnalysisAI/core, ask one eligible CODEOWNER to complete the latest PR_REVIEW_CHECKLIST.md before contacting a core maintainer on Slack. Follow the template exactly, including As a PR reviewer and CODEOWNER, I have reviewed this and have, so sign-off verification triggers.
  • PR verification: Sweeps only run on labeled PRs. Add full-sweep-fail-fast (strongly recommended); use full-sweep-enabled only when matrix jobs should continue after a failure.
  • After merging: PR authors must ensure all GitHub Actions jobs pass. Transient failures often pass on rerun; see how to rerun failed jobs.
中文

感谢你的贡献!

  • **审阅:**如果 PR 修改的文件归属于仓库管理员及 @SemiAnalysisAI/core 之外的 CODEOWNER,请先联系一位有资格的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,再通过 Slack 联系核心维护者。必须严格遵循模板,并保留 As a PR reviewer and CODEOWNER, I have reviewed this and have,才能触发签核验证。
  • **PR 验证:**扫描仅在带有标签的 PR 上运行。强烈建议添加 full-sweep-fail-fast;仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled。
  • **合并后:**PR 作者必须确保所有 GitHub Actions 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

@cquil11
cquil11 marked this pull request as ready for review September 25, 2026 06:09
@cquil11
cquil11 requested a review from a team September 25, 2026 06:09
@claude

claude Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Claude encountered an error after 0s —— View job


I'll analyze this and get back to you.

@cquil11
cquil11 force-pushed the agent/srt-agentx-port branch 6 times, most recently from eb81460 to e151d6f Compare September 25, 2026 06:32

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Beyond the inline findings, I also checked the -n "${SRT_RECIPE:-}" pattern added to all 12 launchers against AGENTS.md's "no fallback defaults" rule — it's only used as an existence test in a boolean condition (not a silently-substituted default value), and each branch still calls check_env_vars SRT_RECIPE before use, so it doesn't violate that convention.

Extended reasoning...

The diff wires AgentX single-node jobs through the native srt-slurm connector (matrix schema/generator, infx/srt_slurm/single_node.py branching, 12 launcher routing conditions, a new recipe/config pair, and a new bash replay client) with no auth/crypto/permissions surface, but it does touch the shared connector and recipe pairing logic across many files. Two confirmed findings (a duplicated --server-metrics flag corrupting metrics collection in the new AgentX client, and a missing perf-changelog.yaml entry for the new recipe) are being posted as inline comments, so this is a findings-present run where defer is used only to record one additional item I checked and ruled out.

Findings marked 🟡 are optional suggestions and need no follow-up push.

Additional findings (no inline location):

  • 🟡 perf-changelog.yaml — This PR adds a new recipe (benchmarks/single_node/srt-slurm-recipes/dsv41flash/sglang/h200-fp4-mtp/agentic.yaml) and repoints dsv41flash-fp4-h200-sglang-agentic-dspark in configs/nvidia-master.yaml at it, but perf-changelog.yaml has no new entry. AGENTS.md (via CLAUDE.md) requires "every recipe addition or modification" to get a new append-only perf-changelog.yaml entry, and this PR's changed-file list omits it. Fix: append a perf-changelog.yaml entry (preserving existing bytes, appending only at the tail) documenting the new agentic.yaml recipe and its TP4/TP8 admission and warmup-grace-period tuning before merge.

    Why this was flagged

    AGENTS.md:124 states every recipe addition or modification requires a new perf-changelog.yaml entry, appended at the tail without disturbing existing bytes. This PR (configs/nvidia-master.yaml:8547-8548, benchmarks/single_node/srt-slurm-recipes/dsv41flash/sglang/h200-fp4-mtp/agentic.yaml) adds a brand-new recipe and search-space entry pointing to it. perf-changelog.yaml is not among the 19 changed files, so no entry documents this recipe's admission/warmup tuning choices. On base, every prior recipe change (e.g. PR #3256, #3406) carries a matching changelog entry; maintainers and future tuners lose the documented rationale trail for this recipe's specific settings.

    Verification: nit. The candidate correctly identifies a missing required deliverable. AGENTS.md (delegated from the repo-root CLAUDE.md) states as a non-negotiable benchmark invariant: "Every change that can affect benchmark performance and every recipe addition or modification requires a new perf-changelog.yaml entry. The file is append-only and byte-sensitive." This PR adds a brand-new recipe file…

Comment thread benchmarks/single_node/srt_agentic.sh Outdated
Comment on lines +17 to +26
export AGENTIC_OUTPUT_DIR="$(dirname "$RESULT_DIR")"
# Worker metrics, not the router's, carry the engine series AIPerf must record.
AIPERF_SERVER_METRICS_URLS=$(sed -E 's#([^,]+)#http://\1/metrics#g' <<< "$SRT_AGG_ENDPOINTS")
export AIPERF_SERVER_METRICS_URLS

mkdir -p "$RESULT_DIR"
resolve_trace_source
install_agentic_deps
build_replay_cmd "$RESULT_DIR"
REPLAY_CMD+=" --server-metrics ${AIPERF_SERVER_METRICS_URLS}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Single-node AgentX runs on native srt-slurm get a corrupted --server-metrics list, an outcome fixed-sequence and multi-node AgentX jobs do not hit. srt_agentic.sh exports AIPERF_SERVER_METRICS_URLS before calling build_replay_cmd (line 25), so benchmark_lib.sh:3340-3352 already appends a correctly space-split '--server-metrics url1 url2 ...'. Line 26 then appends a second, redundant '--server-metrics' with the raw comma-joined string as one unsplit argument. Fix: drop the manual append at line 26 and rely on build_replay_cmd's existing AIPERF_SERVER_METRICS_URLS handling, which already splits on commas for every caller.

Why this was flagged

Trigger: any single-node AgentX point routed to native srt-slurm (SRT_RECIPE set) with SRT_AGG_ENDPOINTS containing one or more worker endpoints, reached via runners/*.sh -> slurm_utils.sh apply_srt_recipe -> srt_agentic.sh. build_replay_cmd (benchmark_lib.sh:3340-3352) already appends '--server-metrics' followed by each URL as a separate token when AIPERF_SERVER_METRICS_URLS is non-empty. srt_agentic.sh:26 appends a second '--server-metrics' flag whose value is the whole comma-joined string as one token (no spaces to split on). Depending on how the aiperf CLI parses a repeated flag, the final effective value becomes either a single malformed URL like 'http://a/metrics,http://b/metrics' or a duplicated/garbled list, breaking the worker engine-metrics capture the comment at line 18 says is required. No existing check catches this since REPLAY_CMD is an unquoted string executed via 'run_server_client $REPLAY_CMD' (benchmark_lib.sh:3486).

Verification: normal (for the multi-endpoint case; benign redundancy for a single endpoint). The candidate's core code claim holds. In benchmarks/single_node/srt_agentic.sh, AIPERF_SERVER_METRICS_URLS is exported at line 20 (built from SRT_AGG_ENDPOINTS via the sed at line 19) BEFORE build_replay_cmd is called at line 25. build_replay_cmd (benchmark_lib.sh:3340-3352) sees the non-empty var and appends a…

@cquil11
cquil11 force-pushed the agent/srt-agentx-port branch 3 times, most recently from 090ca53 to 169d12e Compare September 25, 2026 15:45
@cquil11
cquil11 force-pushed the agent/srt-agentx-port branch from 169d12e to 1235ab6 Compare September 25, 2026 15:55
Single-node AgentX points with an srt-recipe now take the native
single-node path fixed-sequence points already use. The adapter
accepts AgentX points and DSpark speculation. Single- and multi-node
AgentX share one client, benchmarks/srt_agentic.sh (moved from
benchmarks/multi_node/agentic_srt.sh), which replays one CONC point or
a CONC_LIST batch against the srt-slurm frontend and reads engine
metrics from the workers behind a router frontend. The H200
DeepSeek-V4.1-Flash SGLang config is the first one ported.
@cquil11
cquil11 force-pushed the agent/srt-agentx-port branch from 1235ab6 to 4fa2a2f Compare September 25, 2026 15:56
…en3.5 fixed-sequence recipe

srt-slurm parses recipes strictly and rejected the repeated
disable-cuda-graph key. Removing the unported MI355X Qwen3.5 AgentX
recipe had also deleted the fixed-sequence recipe beside it.
vLLM points validate their topology as tensor x data parallel GPUs,
with DP attention as data-parallel ranks and expert parallelism as
enable-expert-parallel, and eval-only runs set max-model-len.
…ient-side

Several legacy AMD AgentX scripts appended --apply-chat-template to the
replay command. AIPERF_APPLY_CHAT_TEMPLATE=true in a recipe's benchmark
env keeps that behavior on the shared srt-slurm client.
…V4.1 Flash SGLang there

GB launchers submit recipe points through launch_srt_single_node with an
aarch64 srt-slurm setup; the squash is imported on a compute tray first.
This was referenced Sep 26, 2026
functionstackx added a commit that referenced this pull request Sep 26, 2026
…benchmarks/single_node/agentic (#3460)

#3428 moved single-node AgentX onto native srt-slurm recipes. Delete every
script in benchmarks/single_node/agentic that no master config reaches any
more. Keep the nine scripts still reached by search-space entries without an
srt-recipe, plus the H100/H200 block32 installers and kernel_configs that the
multi-node DeepSeek-V4.1-Flash recipes use. The README now marks the folder
as legacy.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
functionstackx added a commit that referenced this pull request Sep 26, 2026
Single-node AgentX runs as native srt-slurm recipes since #3428, and #3460
removed the unused scripts. Delete the rest of the legacy folder.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants