Repository navigation
refactor(srt): compose AgentX recipes and select power from the master row - #3818
Merged
Merged
Conversation
Contributor
|
Thanks for the contribution!
中文感谢你的贡献!
|
This was referenced Oct 8, 2026
Merged
adibarra
added this pull request to stack #3808
October 8, 2026 14:35
adibarra
force-pushed
the
refactor/srt-agentx-compose
branch
from
October 8, 2026 16:03
367e3fb to
dc4671c
Compare
adibarra
force-pushed
the
refactor/srt-agentx-compose
branch
from
October 8, 2026 16:25
dc4671c to
752cb98
Compare
adibarra
force-pushed
the
refactor/srt-agentx-compose
branch
2 times, most recently
from
October 9, 2026 17:47
5f3fd28 to
d2ce3a3
Compare
adibarra
force-pushed
the
refactor/srt-agentx-compose
branch
2 times, most recently
from
October 9, 2026 23:43
a3c209a to
8c01db9
Compare
adibarra
force-pushed
the
refactor/srt-agentx-compose
branch
from
October 10, 2026 07:51
8c01db9 to
d0a5aac
Compare
adibarra
force-pushed
the
refactor/srt-agentx-compose
branch
from
October 10, 2026 13:38
d0a5aac to
524fa70
Compare
… master rows
AgentX recipes, single- and multi-node, become fragments like the
fixed-sequence ones. configs/srt-recipes/agentic-{single,multi}.yaml supply
the client command; the binder writes the master model, image, precision and
identity, and the launcher hands multi-node clients RESULT_DIR,
AIPERF_DATASET_MMAP_CACHE_DIR and HF_HUB_CACHE from the volumes it mounts
(agentic-volume-mounts replaces lanes._AGENTIC_CACHES). Dead keys and copies
of the workflow environment leave the fragments; a fragment that sets a bound
key fails before submission.
A multinode search-space row with power: true replaces recipe telemetry
blocks: the shared telemetry-dcgm.yaml is merged with the cluster's
power-exporter-port and benchmark.concurrencies is bound after variant
selection, so bundles can measure power. POWER_LANES now judges the row's
field instead of reading recipe text, and inject_concurrencies is gone.
Selected zip variants drop null-valued keys as srtctl apply does, and
h200-dgxc GLM-5.2 FP8 AgentX keeps serving the Hub snapshot.
infx generate now binds every srt-slurm point of the selected keys, AgentX as well as fixed-sequence, single- and multi-node, through the binder the launcher runs. The workflow environment it reproduces gains the AgentX inputs (IS_AGENTIC, KV_OFFLOADING, TOTAL_CPU_DRAM_GB, THINKING_MODE) and the multi-node request fields. A multi-node point takes the binder inputs the launcher derives from the one cluster its runner label schedules on: launch_path, the lane's POWER_LANES decision and the cluster's power-exporter-port give the DCGM telemetry block and bound concurrencies, and config.agentic_client_env, which no longer needs an SrtRun, gives the AgentX client paths. Such a point fails when its label spans several clusters or the lane refuses its power. The manifest records the cluster.
…gment so binding it fails on its model block and benchmark MODEL. Like the other AgentX fragments it drops them, the client command its shared block supplies, and WEKA_LOADER_OVERRIDE, which names the corpus dsv41flash replays by default. Every point binds to main's selected variant without that override.
The multi-node binder reads IS_AGENTIC instead of defaulting a missing value to fixed-sequence, model_paths drops a guard the binder makes redundant, and RECIPES.md points at the bound-key tables instead of copying them.
select_recipe binds each variant before validate_recipe sees it, and the binder writes model.path, model.container, model.precision and benchmark.env.MODEL from the same environment, so those four comparisons can never fail. infx generate set KV_OFFLOADING and TOTAL_CPU_DRAM_GB to empty or zero placeholders for fixed-sequence points that nothing reads; it now sets them only for AgentX points.
The launcher and infx generate each derived the DCGM exporter port and the AgentX client paths from the cluster, lane, request and power decision, and infx generate must match the launcher. Both now call config.binder_inputs. infx generate imports the launcher modules at the top: they import nothing that imports it back.
…r tests The bound AgentX client test asserted values it passed in, and the CLI test's power and client-env tail repeated the srt driver tests that run the same module with those flags. The fragment-rejection test no longer pins the explanatory suffix, and an unused constant goes.
RECIPES.md states the infx generate binder inputs in fewer words and drops a sentence the power-row table already makes. CONFIGS.md puts mounts back beside volume-mounts, which it describes, and the GLM-5.2 GB200 power comment moves onto the power field.
Recipes may no longer set model.container, identity.container.image or telemetry.enabled, yet the Klaud prompt and docs still asked for matching images, nuke.md still ran a script that rewrites model.container (it now fails on every recipe), and the power docs still gated energy collection on recipe telemetry. They now say the binder writes the master image and a power: true master row enables DCGM telemetry.
…fragments #3816, #3840 and #3744 added full recipes: the Qwen3.8 GB300 and Qwen3.5 GB300 DEP16 recipes carry model blocks, the client command, benchmark MODEL and the client paths the launcher hands multi-node points, and both new recipes and the DSv4.1-Flash B300 one set the identity repo and image the binder writes. Like the other AgentX fragments they drop them, and WEKA_LOADER_OVERRIDE, which names both models' default corpus. The Qwen3.8 recipe keeps the TOTAL_CPU_DRAM_GB and KV_OFFLOADING the launcher checks against the point. Each point binds to main's selected variant, with the Qwen3.5 model alias bound as its Hub id like the other GB300 Qwen3.5 AgentX points.
agentic-single.yaml and agentic-multi.yaml were byte-identical. Single- and multi-node AgentX points now compose with configs/srt-recipes/agentic.yaml; the bound recipes are unchanged.
The launcher rejects a variant whose TOTAL_CPU_DRAM_GB differs from the point's, the check that ties a recipe's literal host pools to the row's dram-utilization. No test covered it.
Aggregated multi-node AgentX recipes pinned IS_MULTINODE=false so the client would not measure power, and so published a single-node result shape for jobs that span nodes (the DSv4 GB300 TP8 agg point runs on two). The client's conc_N naming had to accept the workflow's CONC_LIST to keep collecting them. The Qwen3.5 B300 disagg recipe pinned ENABLE_AGENTX_POWER=0 instead. The binder now writes both into every multi-node AgentX recipe from the launcher's own state: IS_MULTINODE from the request, and ENABLE_AGENTX_POWER=1 exactly when the power decision collects AgentX or adapter power. A fragment that sets either fails composition. The pins are deleted, and so are the TP, PP_SIZE, PCP_SIZE and EP_SIZE copies: only single-node points read them, and multi-node results take their topology from the workflow's PREFILL_* and DECODE_* env. The client names results per concurrency on IS_MULTINODE alone. The DSv4 GB300 vLLM 1P4D recipe also pinned RUNNER_TYPE=gb300 and PREFILL_TP=1. Its prefill worker is DEP4 (tensor-parallel-size 1, data-parallel-size 4, expert parallel) on four GPUs, which the master row records as tp 4, ep 4, dp-attn like its DEP4 siblings; the pin published prefill_tp 1 and counted one prefill GPU instead of four. Those pins and the unread OFFLOADING copy are deleted, so the row publishes its runner label and topology like its siblings. The client's power mode, result directory and file name are unchanged for every point, except that the 192 multi-node points without power switch from an invalid power verdict (multinode_power_contract_missing) to none. The 35 formerly pinned points publish is_multinode true with prefill and decode topology.
Fragments still set values the workflow exports from the matrix point or from runtime_settings.sh. The Kimi-K3 GB200 and GB300 fragments pinned REQUIRE_POWER=1, two TensorRT-LLM fragments pinned MAX_MODEL_LEN, MiniMax-M3 GB200 TRT copied KV_OFFLOAD_BACKEND_METADATA, the DSv4 GB300 frontends copied MODEL, MODEL_PREFIX, FRAMEWORK, PRECISION, DURATION, KV_OFFLOADING and CONC, and GLM-5.3 TileRT set MODEL=/model, which it published as the model. The binder now writes REQUIRE_POWER into every multi-node AgentX recipe: 1 when the workflow requires power or the lane's power rule does. The gb200-nv and gb300-nv Kimi-K3 AgentX rules require it, which keeps the pinned points strict and no others. BOUND_ENV rejects every name the workflow exports from the matrix point. MAX_MODEL_LEN goes (the AgentX client never reads it; evals take the job's), and so do the frontend copies, which the Dynamo frontend never reads. GLM-5.3 names its local checkpoint as the client's TOKENIZER, which the replay reads before MODEL, so it publishes zai-org/GLM-5.3 and keeps its tokenizer. Copies that equal the workflow's value go too: VLLM_ENGINE_READY_TIMEOUT_S 3600, PYTHONDONTWRITEBYTECODE, AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS 3600 and the MORI, NCCL and SGLang settings runtime_settings.sh exports for sglang-disagg. Every process keeps its effective value through the job environment. Fragments keep values that override the workflow's on purpose: the Dynamo routing and session settings, longer engine-ready timeouts, MORI_IO_QP_MAX_SEND_WR 32767 and single-node variant labels.
adibarra
force-pushed
the
refactor/srt-agentx-compose
branch
from
October 14, 2026 02:12
08a5fc6 to
8d81415
Compare
nvpohanh
added a commit
that referenced
this pull request
Oct 14, 2026
Conflicts: inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv41flash/sglang/gb300-fp4/agentx/disagg-variants.yaml inferencex-e2e/configs/nvidia-master.yaml inferencex-e2e/perf-changelog.yaml Port this PR's changes to main's recipe layout (#3805, #3818, #3824): - disagg-variants.yaml: keep this PR's overrides; drop their benchmark.env.CONC, which the master row's conc-list now sets. - nvidia-master.yaml: the five new rows select their override with srt-recipe instead of a CONFIG_FILE additional setting. - perf-changelog.yaml: keep main's entries and append this PR's entry after them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
nvpohanh
added a commit
that referenced
this pull request
Oct 14, 2026
…agg-sglang-agentx-refresh Resolve conflicts with the srt-slurm recipe refactors on main (#3805, #3818, #3824): - configs/nvidia-master.yaml: keep this PR's TP4/EP4 and DP4 search space and image; reference the recipe as `srt-recipe: agentic.yaml` under the `srt-recipe-dir` that main added. - gb200-fp4-mtp/agentic.yaml: drop the `base.model` block, which main now composes from the master row (image, model, precision); keep this PR's engine args and per-point overrides unchanged. - perf-changelog.yaml: keep main's entries and append this PR's entry at the end. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
nvpohanh
added a commit
that referenced
this pull request
Oct 14, 2026
…-sglang-agentx-tp4 Resolve the conflicts in configs/nvidia-master.yaml and perf-changelog.yaml. Main now selects srt-slurm recipes with srt-recipe-dir and srt-recipe and composes AgentX recipes from fragments (#3805, #3818), so this entry and its bundle move to that format: - The master entry sets srt-recipe-dir, and each row selects its override with srt-recipe instead of a CONFIG_FILE setting. - The bundle drops the keys the binder and launcher now write: the model block, the identity repo and image, the client command, benchmark.concurrencies, RESULT_DIR, IS_MULTINODE, ENABLE_AGENTX_POWER, AIPERF_DATASET_MMAP_CACHE_DIR and HF_HUB_CACHE. It also drops the unread INFMAX_CONTAINER_WORKSPACE and PORT. No serving setting changes: engine args and env, frontend, Dynamo, services and Slurm options bind exactly as the PR's sweep submitted them. The perf-changelog entry stays appended at the end of the file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 14, 2026
Ankur-singh
added a commit
that referenced
this pull request
Oct 14, 2026
model.path/container/precision, identity.model.repo, identity.container.image and RESULT_DIR/HF_HUB_CACHE/AIPERF_DATASET_MMAP_CACHE_DIR/IS_MULTINODE are set by the launcher or workflow; main's fragment check rejects them (#3818).
Ankur-singh
added a commit
that referenced
this pull request
Oct 14, 2026
…o-SGLang AgentX 配方 (#2978) * feat(config): add Qwen3.5 B300 Dynamo-SGLang AgentX recipes 添加 Qwen3.5 NVFP4 B300 Dynamo-SGLang AgentX 配置和配方,并校验合成接受长度与已提交的黄金曲线一致。 * chore(changelog): link Qwen3.5 B300 PR #2978 在性能变更日志中补充 Qwen3.5 B300 PR #2978 链接。 * fix(config): extend Qwen3.5 AgentX Slurm limits 延长 Qwen3.5 AgentX 配方的 Slurm 时间限制。 * fix: remove temporary cache environment overrides 移除 Qwen3.5 B300 AgentX 配方中指向 /tmp 的缓存环境变量设置。 * feat(agentx): move Qwen3.5 B300 SGLang AgentX to nightly-dev-20261013-7224fce1 - Bump the four recipes and the master entry to lmsysorg/sglang:nightly-dev-20261013-7224fce1 and rename the recipe variants to match. - Drop SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE so the NextN draft layer is served at its shipped precision. - Replace aliases this image removed: cuda-graph-max-bs becomes cuda-graph-max-bs-decode (the old spelling is now an ambiguous prefix), and SGLANG_DISABLE_TP_MEMORY_INBALANCE_CHECK=1 becomes SGLANG_ENABLE_TP_MEMORY_INBALANCE_CHECK=0. - Drop settings with no effect in this image: environment variables it no longer reads (SGLANG_ENABLE_SPEC_V2, SGLANG_ENABLE_FLASHINFER_GEMM, SGLANG_FLASHINFER_FP4_GEMM_BACKEND, SGLANG_CUTEDSL_MOE_NVFP4_DISPATCH), false booleans srt-slurm never passes (including the deprecated enable-dp-attention), and settings whose readers these TP-only aggregate workers never reach (DP-attention scheduler gathers, Mooncake and NVSHMEM variables, load-balance-method, moe-dense-tp-size, and hicache-io-backend: kernel, which page_first_direct rewrites to direct). - Drop the recipe-level cpus-per-task directive, which conflicts with the b300-dsxe cpus-per-gpu default, and run the AgentX client from benchmarks/srt_agentic.sh. 将 Qwen3.5 B300 SGLang AgentX 迁移到 nightly-dev-20261013-7224fce1: - 将四个配方与主配置条目升级到 lmsysorg/sglang:nightly-dev-20261013-7224fce1,并相应重命名配方变体。 - 移除 SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE,使 NextN 草稿层以发布时的精度运行。 - 替换该镜像已移除的别名:cuda-graph-max-bs 改为 cuda-graph-max-bs-decode (旧写法现在是有歧义的前缀),SGLANG_DISABLE_TP_MEMORY_INBALANCE_CHECK=1 改为 SGLANG_ENABLE_TP_MEMORY_INBALANCE_CHECK=0。 - 移除在该镜像中无效的设置:不再被读取的环境变量(SGLANG_ENABLE_SPEC_V2、 SGLANG_ENABLE_FLASHINFER_GEMM、SGLANG_FLASHINFER_FP4_GEMM_BACKEND、 SGLANG_CUTEDSL_MOE_NVFP4_DISPATCH),srt-slurm 从不传递的 false 布尔参数 (包括已弃用的 enable-dp-attention),以及这些仅 TP 的聚合 worker 不会 触达的设置(DP 注意力调度器 gather、Mooncake 与 NVSHMEM 变量、 load-balance-method、moe-dense-tp-size,以及会被 page_first_direct 改写为 direct 的 hicache-io-backend: kernel)。 - 移除与 b300-dsxe 默认 cpus-per-gpu 冲突的配方级 cpus-per-task 指令,并改为 通过 benchmarks/srt_agentic.sh 运行 AgentX 客户端。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(agentx): use the default ReplaySSM cache length for Qwen3.5 B300 TP2/EP2 On lmsysorg/sglang:nightly-dev-20261013-7224fce1 the GDN ReplaySSM spec-verify commit kernel (gdn_replayssm_compact_commit_kernel) contracts over the replay window in tl.dot, which Triton requires to be at least 16. With linear-replayssm-cache-len: 8 the TP2/EP2 worker fails to compile that kernel at its first verify ("Input shapes should have M >= 1, N >= 1 and K >= 16"). Drop the override so the point uses the default length of 16, as the other recipes already do, and note it in the changelog entry. 在 lmsysorg/sglang:nightly-dev-20261013-7224fce1 中,GDN ReplaySSM 投机验证 提交 kernel(gdn_replayssm_compact_commit_kernel)在 tl.dot 中对回放窗口做 归约,而 Triton 要求该维度至少为 16。设置 linear-replayssm-cache-len: 8 时, TP2/EP2 worker 在首次验证时无法编译该 kernel("Input shapes should have M >= 1, N >= 1 and K >= 16")。移除该覆盖项,使该测试点与其他配方一样使用默认 长度 16,并在变更日志条目中加以说明。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * config: migrate qwen3.5 B300 agentic entry to srt-recipe-dir / srt-recipe Main now requires srt-recipe-dir on srt-slurm configs (#3805). Move the CONFIG_FILE additional-settings to row-level srt-recipe selectors; recipe files and selectors are unchanged. * chore: refresh PR #2978 for sweep reuse [skip-sweep] * recipes: drop launcher-bound fields from qwen3.5 B300 agentic fragments model.path/container/precision, identity.model.repo, identity.container.image and RESULT_DIR/HF_HUB_CACHE/AIPERF_DATASET_MMAP_CACHE_DIR/IS_MULTINODE are set by the launcher or workflow; main's fragment check rejects them (#3818). * chore: refresh PR #2978 for sweep reuse [skip-sweep] --------- Co-authored-by: Ankur-singh <ankusingh@nvidia.com> Co-authored-by: Po-Han Huang <pohanh@nvidia.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Ankur-singh
added a commit
that referenced
this pull request
Oct 14, 2026
Resolve conflicts by keeping the PR's DSpark recipes and master-config rows and applying main's recipe-fragment migration (#3805, #3818, #3820): srt-recipe-dir with row-level srt-recipe, launcher-bound fields dropped, @fabric references for RDMA devices. disagg-1p4d-dep4-tp8-c4-mtp.yaml stays deleted per the PR.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
configs/srt-recipes/agentic-{single,multi}.yaml) and bound like fixed-sequence. The binder writes image, model, precision and identity, andidentity.container.imagestays byte-identical. A fragment that sets a bound key to a different value fails before submission.RESULT_DIR,AIPERF_DATASET_MMAP_CACHE_DIRandHF_HUB_CACHEfrom the volumes the launcher mounts, plusIS_MULTINODEandENABLE_AGENTX_POWER. The power switch is1exactly when the launcher collects the point's AgentX power (apower: truerow whose lane rule collects AgentX or adapter power), so power no longer depends on a recipe pinningIS_MULTINODE: false, and the client namesconc_Nresults onIS_MULTINODEalone instead of falling back toCONC_LIST.runners.yamlagentic-volume-mountsreplaceslanes._AGENTIC_CACHES. mi355x keeps its workspace result directory through a lane field.HF_HOMEkeeps its own cache.PORT,INFMAX_CONTAINER_WORKSPACE, retiredSRT_MEASUREMENT_WINDOW_*, defaultWEKA_LOADER_OVERRIDE), copies of workflow env, andbenchmark.concurrencies. Multi-node AgentX fragments also drop theirIS_MULTINODE,ENABLE_AGENTX_POWER,TP,PP_SIZE,PCP_SIZEandEP_SIZEpins (only single-node results read the last four); a fragment that setsIS_MULTINODEorENABLE_AGENTX_POWERnow fails before submission.power: trueon search-space rows:telemetry:blocks in 175 recipes (153 AgentX, 22 fixed-sequence) and is set on 68 rows.telemetry-dcgm.yamlwith the cluster's newsrt-slurm.power-exporter-portand bindsbenchmark.concurrenciesafter variant selection, so bundles can measure power now.recipe_globrules and theinject_concurrenciestext rewrite. The multinode workflow exportsPOWER.REQUIRE_POWERinto multi-node AgentX recipes:1when the workflow requires power or the lane's power rule does (the gb200-nv and gb300-nv Kimi-K3 AgentX rules, which keeps exactly the 24 points whose fragments pinned it strict).BOUND_ENVrejects every name the workflow exports from the matrix point. Fragments drop theREQUIRE_POWERpins,MAX_MODEL_LEN(the AgentX client never reads it), aKV_OFFLOAD_BACKEND_METADATAcopy, the DSv4 GB300 frontend copies of the workflow env, and copies equal toruntime_settings.shvalues (VLLM_ENGINE_READY_TIMEOUT_S3600,PYTHONDONTWRITEBYTECODE, the sglang-disagg MORI/NCCL/SGLang settings). Deliberate overrides stay: Dynamo routing and session settings, longer engine-ready timeouts,MORI_IO_QP_MAX_SEND_WR32767 and single-node variant labels.RECIPES.mdandCONFIGS.mdupdated.Verification
full-sweepand--all-evalsare identical to the base, apart from the newpower: trueon exactly the rows whose recipe had telemetry (140 and 125 rows).python -m infx.launchwith a fake srtctl.srtslurm.yaml.Plan.from_envresult as the base, except the power mode of multi-node points without power (below). Across the 334 multi-node AgentX points, the 98 power points keep their measurement window, the 44 that pinned power off stay off, and the 192 others go frommissingtooff; result directory, file name andrequire_powerare unchanged.Intentional differences
/modelas its model because its fragment setMODEL=/model. It now names that checkpoint as the client'sTOKENIZER(read beforeMODEL), so it publisheszai-org/GLM-5.3with the same tokenizer and served name.srtslurm.yamlmodel_pathskeys change from recipe aliases tohf:<MODEL>, with the same resolved path.benchmark.concurrenciesis dropped on 9 qwen3.5 b300 variants without power. It had no effect there.glm5.2-fp8-mi325x-sglang-agentic-mtp,dsv4-fp4-b200-sglang-agentic-hicache-mtp).--set CONC.infx generatebinds every srt-slurm point, AgentX included (power telemetry and client paths come from the launcher's own code). The manifest records the cluster.TOTAL_CPU_DRAM_GBandKV_OFFLOADING, which the launcher still checks against the matrix point.power: true(192) no longer publishpower_valid: 0withmultinode_power_contract_missing; like the points that pinned power off, they publish no power fields.IS_MULTINODE: false(DSv4 B200, GB200 and GB300 agg, DSv4.1-Flash GB300 agg, Qwen3.5 GB200 and GB300 agg; DSv4 GB300 TP8 agg spans two nodes) now publishis_multinode: truewith the master row's prefill/decode topology. GPU counts are unchanged;epfollows the master row (2 instead of 1 on the TP2/EP2 points).PREFILL_TP=1andRUNNER_TYPE=gb300. Its prefill worker is DEP4 (tensor-parallel-size 1, data-parallel-size 4, expert parallel) on four GPUs, which the master row records astp: 4, ep: 4, dp-attn: truelike its DEP4 siblings. It now publishesprefill_tp4 and 36 GPUs (was 1 and 33) and the matrix runner label ashw, like its siblings.