Skip to content

Sync upstream/main (2026-10-14) / 同步上游 main(2026-10-14) - #37

Merged
aistackdev merged 646 commits into
mainfrom
sync/upstream-20261014
Oct 14, 2026
Merged

aistackdev merged 646 commits into
mainfrom
sync/upstream-20261014

Conversation

@thangquang09

Copy link
Copy Markdown
Collaborator

Summary

  • Merges upstream/main (through 69f12085e, 645 commits) into the fork's main, preserving the fork's BYO-endpoint (cluster:remote-bench) feature.
  • Resolves conflicts in .github/workflows/benchmark-tmpl.yml (keeps fork's swebench-gen-mode + remote-bench inputs/env alongside upstream's new require-power default), and keeps fork-modified benchmarks/benchmark_lib.sh + configs/runners.yaml at their legacy paths (upstream deleted them when it moved the e2e tree into inferencex-e2e/).
  • Restores the utils/aiperf submodule entry (pin faf3f8b3) that upstream removed; upstream now installs the PyPI agentx-harness==1.0.7 per-job venv instead.

Known follow-up

The new upstream workflow runs from inferencex-e2e/ and reads inferencex-e2e/configs/runners.yaml, which has no cluster:remote-bench runner. The fork's remote-bench recipes under benchmarks/single_node/agentic/*-remote-bench.sh are kept but are not dispatched by the new launcher until ported to the inferencex-e2e/ layout.

中文

摘要

  • 将 upstream/main(至 69f12085e,共 645 个提交)合并到 fork 的 main,保留 fork 的 BYO endpoint(cluster:remote-bench)功能。
  • 解决 .github/workflows/benchmark-tmpl.yml 的冲突(保留 fork 的 swebench-gen-mode 与 remote-bench 输入/环境变量,同时合入 upstream 新的 require-power 默认值);上游把端到端目录迁入 inferencex-e2e/ 时删除了 benchmarks/benchmark_lib.sh 和 configs/runners.yaml,本 PR 在原路径保留 fork 修改后的版本。
  • 恢复被上游移除的 utils/aiperf 子模块条目(pin faf3f8b3);上游现在改为按任务安装 PyPI 包 agentx-harness==1.0.7。

已知后续工作

上游新工作流在 inferencex-e2e/ 下运行并读取 inferencex-e2e/configs/runners.yaml,其中没有 cluster:remote-bench runner。fork 位于 benchmarks/single_node/agentic/*-remote-bench.sh 的 remote-bench 脚本已保留,但在迁移到 inferencex-e2e/ 布局之前,新 launcher 不会调度它们。

cquil11 and others added 30 commits September 25, 2026 00:29
Update six Claude Code workflow invocations to claude-opus-5-5.
…SemiAnalysisAI#2542)

* refactor: standardize srt-slurm cluster setup hooks

Per-allocation host checks live in runners/srt-slurm/hooks/<cluster>/setup.sh
and run through the cluster profile's default_host_setup. Shared host-check
functions move to hooks/common.sh. MI355X gets its RDMA/QoS preflight, GPU
drain gate, and hugepage reclaim.

* feat(amd): add disaggregated SGLang and vLLM to synthetic acceptance

* feat(amd): run MI355X multi-node recipes through srt-slurm

Multi-node jobs with a CONFIG_FILE use the shared native path: srt-slurm
owns allocation, serving, and post-eval; results and eval artifacts are
collected with the shared helpers. The MI355X profile adds the multi-node
fabric, model, and cache settings.

* feat(amd): run MI355X multi-node fixed-sequence configs on srt-slurm

Move the Qwen3.5 FP8/MXFP4 and DeepSeek-R1 FP8/MXFP4 disaggregated configs to
srt-slurm recipes. Recipes write results in the shared sa-bench layout, and
eval runs drop fake expert dispatch. The legacy multi-node path now only
serves AgentX.

* refactor(amd): remove legacy multi-node fixed-sequence orchestration

Delete the retired MI355X disaggregated launch scripts, the amd_utils vLLM and
ATOM engine paths, the fixed-sequence bench client, and the per-model
fixed-sequence server settings. AgentX keeps its SGLang and TileRT paths.

* fix(amd): serve Qwen3.5 FP8 disagg from the full MI355X checkpoint

The cached Hub snapshot's config is text-only (qwen3_5_moe_text, no
vision_config), so SGLang's Qwen-VL processor crashed at startup. The legacy
path loaded /it-share/data/Qwen3.5-397B-A17B-FP8; register that as a model
alias and use it in the recipe.
…pes (SemiAnalysisAI#3413)

* refactor(amd): share one fixed-sequence client across multi-node recipes

The four MI355X multi-node recipes each inlined the same benchmark loop.
Move it to benchmarks/multi_node/srt_fixed_sequence.sh, like the single-node
client; recipes set only the model, tokenizer, client backend and chat
template in benchmark.env.

* feat(srt): standard fixed-sequence client defaults and power windows

Default the multi-node client to the repo standard: range ratio 0.8, chat
template on, --trust-remote-code, 10x prompts and 2x warmup at request rate
inf. Keep the client backend configurable. When srt-slurm exports
SRT_MEASUREMENT_WINDOW_DIR, write each concurrency's measured boundary as a
custom-benchmark window so power lanes validate without sa-bench.

* refactor(power): move the fixed-sequence window writer into infx

Replace the inline Python in srt_fixed_sequence.sh with
infx.results.power.window, which writes srt-slurm's custom-benchmark
measurement window from the client's result.

* refactor(power): model the measurement window as a dataclass

* test: drop the tautological power window test

* fix(srt): request the model name the frontend serves

Recipes hardcoded MODEL, but the served name depends on the cluster's
model path and can differ from both the recipe and the workflow's HF id
(Dynamo TRT-LLM served DeepSeek-R1-0528 while the recipe said dsr1, so
every request got 404). Read it from /v1/models instead.

* style: wrap window writer call for ruff
…nceX client (SemiAnalysisAI#3415)

* refactor(nvidia): run multi-node fixed-sequence recipes on the InferenceX client

Move the 228 recipe files behind the 27 active NVIDIA multi-node
fixed-sequence configs from srt-slurm's sa-bench to
benchmarks/multi_node/srt_fixed_sequence.sh. Each recipe keeps its ISL/OSL
and sends the same served model name and /model tokenizer sa-bench used;
concurrencies come from the matrix. Telemetry recipes keep
benchmark.concurrencies, which srt-slurm needs for their expected power
windows. Deprecated recipes are unchanged.

* fix(power): expect windows for the matrix concurrencies on fixed-sequence power lanes

The client runs CONC_LIST, but GB200, GB300 and B200 injected it into
benchmark.concurrencies only for AgentX, so a narrowed fixed-sequence
power run expected windows it never measured. Inject on every DCGM power
lane, as H200 already does.

* fix(nvidia): omit --publish-metrics on Dynamo TRT-LLM recipes

The pinned srt-slurm passes --publish-metrics to Dynamo TRT-LLM workers by
default, which Dynamo builds before ai-dynamo/dynamo#12162 reject, so
workers exited at startup. Set engine.publish_metrics: false on the 156
active TRT-LLM recipes.

* fix(nvidia): give H100 etcd and NATS time to start

The first container step on an H100 node takes about eight minutes to
set up the job image, and etcd is that step, so it missed srt-slurm's
300s readiness default. Allow 1200s in the 12 active H100 recipes.

* refactor(nvidia): let the client read the served model name

Drop the hardcoded MODEL from the converted recipes; the client now asks
the frontend, which serves the name the workers registered.

* fix(nvidia): give H100 workers an hour to become healthy

Node container setup plus loading DeepSeek-R1 FP8 weights over NFS took
longer than srt-slurm's 30-minute health default. Use 360 attempts, as
the GB200 recipes do.

* fix(nvidia): run H100 etcd and NATS in the nginx image

Each service ran in its own ~40 GB instance of the job image on the head
node, beside prefill rank 0, which was then killed while loading
weights. etcd and NATS are static binaries from /configs, so use the
small nginx image the profile already provides.

* fix(nvidia): let TRT-LLM pick the UCX interface on B300

TRTLLM_UCX_INTERFACE named RDMA devices (mlx5_*), not a network
interface, so TRT-LLM could not find a local IP ("Can't get local ip
from NIC Interface") and KV cache never reached decode. No other
cluster sets it; drop it from the 26 active B300 TRT-LLM recipes.

* fix(nvidia): prewarm H100 weights so SGLang TP ranks load in step

SGLang aborts when a TP rank finishes loading 480 s before the slowest
one. On H100 the weights come over NFS, and a node reused from an
earlier run loads from page cache, so the head node's ranks finished
first and the run failed on every job that reused it. Read the weights
into each worker node's page cache in host_setup before workers start.

* Revert "fix(nvidia): let TRT-LLM pick the UCX interface on B300"

B300 TRT-LLM disagg is broken on the DSXE cluster regardless; leave
these recipes unchanged here.
…isAI#3370)

* CollectiveX: NCCL EP - enable zero-copy in HT mode

Align with other backends that take advantage of zero-copy.

Signed-off-by: Ludwig Schneider <lschneider@nvidia.com>

* CollectiveX: NCCL EP - switch to rank-major layout for LL mode

Take advantage of NCCL EP features for low-latency mode:
* use rank-major layout
* leverage zero-copy when supported

Signed-off-by: Ludwig Schneider <lschneider@nvidia.com>

* CollectiveX: introduce CUDA graph support for relevant backends

Many inference deployments rely on CUDA graphs
* Enable this path for all backends that support it.
* Set it by default.

Signed-off-by: Ludwig Schneider <lschneider@nvidia.com>

* CollectiveX: remove redundant NCCL EP completion

Signed-off-by: Ludwig Schneider <lschneider@nvidia.com>

---------

Signed-off-by: Ludwig Schneider <lschneider@nvidia.com>
Co-authored-by: Ludwig Schneider <lschneider@nvidia.com>
Restore the previous model selections in the five Claude Code workflows to diagnose the sign-off failure.
…TP on MI355X / 在 MI355X 上添加 DeepSeek-V4-Pro FP4 ATOM PD 分离式 AgentX hicache MTP recipe (SemiAnalysisAI#3158)

* feat: add DeepSeek-V4-Pro FP4 ATOM PD-disagg AgentX hicache MTP on MI355X / 在 MI355X 上添加 DeepSeek-V4-Pro FP4 ATOM PD 分离式 AgentX hicache MTP recipe

Add the ATOM PD-disaggregated agentic arm for DeepSeek-V4-Pro FP4 on MI355X
(dsv4-fp4-mi355x-atom-disagg-agentic-hicache-mtp), the ATOM counterpart to the
existing sglang-disagg agentic arm, modeled on ATOM's DeepSeek-V4-Agentic-PD-Max
recipe (TP / DP-attention / DP+CPU-offload tiers).

- configs/amd-master.yaml: new config key (1P1D TP8, atomesh router, mooncake
  KV transfer); TP EP1 conc 1/2/8/16, DP EP8 conc 64/128 (no offload), DP EP8
  conc 256 with lmcache_offload DRAM tier.
- benchmarks/multi_node/agentic/dsv4_fp4_mi355x_atom-disagg.sh: agentic launcher.
- amd_utils/models_atom.yaml: DeepSeek-V4-Pro-AgentX entry (prefix-cache env,
  prefill-only TBO, DP session-affinity env, block-256, agentic server knobs).
- amd_utils/server_atom.sh: IS_AGENTIC branch (prefix caching, max-num-seqs=2x
  conc, lmcache_offload multi-connector, dp-sticky/idx2idx router, synthetic AL,
  trace_replay.sh client).
- perf-changelog.yaml: changelog entry.

在 MI355X 上新增 DeepSeek-V4-Pro FP4 的 ATOM PD 分离式 agentic 分支
(dsv4-fp4-mi355x-atom-disagg-agentic-hicache-mtp),作为现有 sglang-disagg
agentic 分支的 ATOM 对照,参考 ATOM 的 DeepSeek-V4-Agentic-PD-Max recipe
(TP / DP-attention / DP+CPU 卸载三档)。搜索空间:TP EP1 并发 1/2/8/16,
DP EP8 并发 64/128(无卸载),DP EP8 并发 256(lmcache_offload DRAM 卸载档)。
server_atom.sh 新增 IS_AGENTIC 分支:开启前缀缓存、max-num-seqs=2x 并发、
lmcache_offload multi 连接器、dp-sticky/idx2idx 路由、合成接受长度、trace_replay
客户端。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: set perf-changelog pr-link to SemiAnalysisAI#3158 / 将 perf-changelog 的 pr-link 设为 SemiAnalysisAI#3158

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: resolve DeepSeek-V4-Pro-AgentX recipe in server_atom.sh on agentic runs / 修复 server_atom.sh 在 agentic 运行时解析 DeepSeek-V4-Pro-AgentX recipe

server_atom.sh looked up models_atom.yaml by the bare MODEL_NAME, so agentic
runs silently loaded the throughput DeepSeek-V4-Pro entry instead of the new
DeepSeek-V4-Pro-AgentX entry (block-256, mem_frac 0.9, batched-tokens, the
attn/state/level/AL knobs, DP env, prefill-only TBO were all ignored). Mirror
server_sglang.sh: derive the '<model>-AgentX' key when IS_AGENTIC, falling back
to the base entry so the non-agentic atom-disagg arm is unchanged.

server_atom.sh 之前按裸 MODEL_NAME 查 models_atom.yaml,导致 agentic 运行
静默加载吞吐版 DeepSeek-V4-Pro 条目,而非新的 DeepSeek-V4-Pro-AgentX
(block-256、mem_frac 0.9、batched-tokens、attn/state/level/AL 等旋钮、DP
环境变量、仅 prefill 的 TBO 全部被忽略)。改为与 server_sglang.sh 一致:
IS_AGENTIC 时解析 '<model>-AgentX',缺失时回退到基础条目,保证非 agentic
的 atom-disagg 分支不变。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove dsv4-fp8-mi325x-vllm and -mtp configs / 移除 dsv4-fp8-mi325x-vllm 及其 mtp 配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: align atom PD agentic recipe with DeepSeek-V4-Agentic-PD-Max reference / 使 atom PD agentic recipe 与 DeepSeek-V4-Agentic-PD-Max 参考对齐

Three deviations from the ATOM reference recipe:
- DP tiers (conc 64/128/256) used ep=8, adding --enable-expert-parallel that the
  recipe omits. Switch to ep=1 so the TP+DPA path emits exactly
  --enable-dp-attention (--enable-tbo on prefill only), no expert-parallel.
- OFFLOAD_COPY_WORKERS=1 / OFFLOAD_MIN_LOAD_TOKENS=8192 were exported by the
  launcher outside the SLURM/Docker boundary and never reached the server. Export
  them in server_atom.sh's in-container offload branch instead.
- ATOM_HOST_IP was never set; the recipe exports it per node. Default it to the
  node's resolved host_ip (matches the mooncake proxy_ip).

与 ATOM 参考 recipe 的三处偏差:
- DP 档(并发 64/128/256)使用 ep=8,引入了 recipe 未使用的
  --enable-expert-parallel。改为 ep=1,使 TP+DPA 路径仅输出
  --enable-dp-attention(--enable-tbo 仅 prefill),不含 expert-parallel。
- OFFLOAD_COPY_WORKERS=1 / OFFLOAD_MIN_LOAD_TOKENS=8192 之前由启动脚本在
  SLURM/Docker 边界外导出,未传入服务器进程。改在 server_atom.sh 容器内的
  卸载分支导出。
- ATOM_HOST_IP 从未设置;recipe 每个节点都会导出它。默认设为本节点解析出的
  host_ip(与 mooncake proxy_ip 一致)。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: reduce atom PD agentic sweep to one concurrency per tier / 将 atom PD agentic 扫描精简为每档一个并发点

Trim dsv4-fp4-mi355x-atom-disagg-agentic-hicache-mtp to a single representative
concurrency per tier (1 TP, 64 DP, 256 DP+offload) for bring-up; the full
conc lists are retained as comments.

将 dsv4-fp4-mi355x-atom-disagg-agentic-hicache-mtp 精简为每档一个代表性并发点
(1 TP、64 DP、256 DP+卸载)用于 bring-up;完整并发列表以注释保留。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: set INFMAX_CONTAINER_WORKSPACE for in-container ATOM agentic replay / 为容器内 ATOM agentic 回放设置 INFMAX_CONTAINER_WORKSPACE

The in-container trace_replay.sh path aborted immediately because
INFMAX_CONTAINER_WORKSPACE was unset (benchmark_lib.sh uses it to locate
utils/aiperf + utils/agentic-benchmark). The SGLang client-image path sets it in
its env-file; the ATOM path never did. Derive it from ATOM_WS_PATH (-> the
container repo root /workspace) in server_atom.sh's agentic branch.

Also narrow the sweep to the conc-1 TP tier (c64/c256 commented out) to validate
this fix cheaply before committing GPU time to the DP/offload tiers.

容器内 trace_replay.sh 因 INFMAX_CONTAINER_WORKSPACE 未设置而立即中止
(benchmark_lib.sh 用它定位 utils/aiperf 与 utils/agentic-benchmark)。SGLang
客户端镜像路径在其 env-file 中设置了它;ATOM 路径没有。改为在 server_atom.sh
的 agentic 分支中由 ATOM_WS_PATH 推导(即容器仓库根 /workspace)。

同时将扫描收敛到 conc-1 TP 档(注释掉 c64/c256),以低成本验证此修复,
再对 DP/卸载档投入 GPU 时间。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: forward AIPERF_EXPERIMENTAL_FAST into ATOM agentic container / 将 AIPERF_EXPERIMENTAL_FAST 传入 ATOM agentic 容器

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: forward REQUIRE_POWER into ATOM agentic container / 将 REQUIRE_POWER 传入 ATOM agentic 容器

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: expand atom PD agentic sweep to full concurrency grid / 将 atom PD agentic 扫描扩展为完整并发网格

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(atom): set MC_ENABLE_DEST_DEVICE_AFFINITY=1 for dsv4 agentic PD across all concurrencies

Add MC_ENABLE_DEST_DEVICE_AFFINITY=1 to the DeepSeek-V4-Pro-AgentX base env so
it applies to every concurrency tier on both prefill and decode nodes, matching
ATOM recipes/DeepSeek-V4-Agentic-PD-Max.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update runtime_settings.sh

* test(atom): align dsv4 agentic PD with DeepSeek-V4-Agentic-PD-Max, c1/c16

Apply the updated ATOM recipe to the dsv4 agentic PD-disagg arm and test the
TP tier on rocm/atom-dev:nightly_202609210314:

- drop MC_ENABLE_DEST_DEVICE_AFFINITY, add ATOM_MOONCAKE_MATCHED_RAILS=auto
- add --index-cache-dtype fp4
- atomesh: cache_aware policies + balance thresholds on the DP tiers,
  round_robin on the TP tier, --atom-pd-rank-mapping-policy none on both
- dense cudagraph capture ladder 1..min(64, 2*conc) and --cudagraph-mode FULL
- ATOM_ENABLE_PREFILL_DELAYER=0 on the DP-attention tiers
- spec decode --method dspark with synthetic acceptance 3.01

Throwaway test branch: the sweep is trimmed to conc 1 and 16 for an A/B
against run 35566949648, which ran the pre-recipe config on the same image.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(atom): DSpark needs the -0813 checkpoint draft head

Run 35576547691 died in drafter.arm_aux_capture on both cells:
  ValueError: DSpark requires dspark_target_layer_ids on the draft config.

--method dspark reads dspark_block_size / dspark_markov_rank /
dspark_target_layer_ids out of the served checkpoint's config.json. Only
DeepSeek-V4-Pro-0813 bundles that draft head; the base Pro checkpoint does
not, so the drafter had nothing to arm and every ModelRunner aborted after
weight load. models.yaml already records this on the SGLang side.

Point the arm at DeepSeek-V4-Pro-0813 -- the recipe's stated model, and the
same checkpoint the sglang-disagg DSpark arm serves -- and alias
DeepSeek-V4-Pro-0813-AgentX to the existing entry so server_atom.sh resolves
the recipe under the new name.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(atom): align dsv4 agentic PD with all recipe concurrency tiers

Bring the ATOM PD-disagg agentic arm into full agreement with
recipes/DeepSeek-V4-Agentic-PD-Max.md beyond the c1/c16 TP tier:

- amd-master.yaml: restore the DP-attention tier (conc 64,128, dp-attn
  true, prefill TBO) and the DP+CPU-offload tier (conc 256, lmcache).
- server_atom.sh: make decode dense CUDA-graph capture tier-aware -- TP
  decode keeps 1..min(64,2*conc); DP-attention decode uses the recipe's
  per-rank 1..(conc/4).
- models_atom.yaml: drop ATOM_DP_SESSION_AFFINITY / ATOM_DP_LB_REQ_EQUIV
  from the DP env; the cache-aware --dp-aware router sends rank hints that
  override them, so they are not needed on this path (recipe).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(atom): scope GPU_MAX_HW_QUEUES to the DP-attention prefill node

The recipe sets GPU_MAX_HW_QUEUES=5 only on the DP-attention prefill
node; decode leaves it unset. The shared DP env was exported on every
node, so it leaked onto decode. Move it into a prefill-only prefill_dp_env
field and apply it in server_atom.sh only on prefill nodes when DP is on.
ATOM_ENABLE_PREFILL_DELAYER=0 stays shared (recipe sets it on both roles).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore(config): rename DSV4-Pro MI355X ATOM disagg agentic key to lmcache-dspark

Rename the config key dsv4-fp4-mi355x-atom-disagg-agentic-hicache-mtp to
dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark to reflect the LMCache KV
offload backend and DSpark speculative decoding used by this recipe.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore(config): bump DSV4-Pro atom-disagg image and lower dram-utilization to 0.50

Update dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark: bump the ATOM image
from nightly_202609210314 to nightly_202609221542 and reduce the agentic-coding
dram-utilization from 0.80 to 0.50 (smaller LMCache host-offload budget).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test(config): isolate DSV4-Pro atom-disagg lmcache tier to conc-256 only

Comment out the conc [1,16] and [64,128] tiers of
dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark so the sweep exercises only
the conc-256 DP-attention CPU-offload (LMCache) tier.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test(config): run DSV4-Pro atom-disagg conc-256 with kv-offloading none

Switch the active conc-256 tier of dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark
from dram/LMCache offload to kv-offloading none (the dram/LMCache variant is kept
commented out) to A/B the conc-256 point without the CPU-offload tier.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(atom-disagg): align DSV4-Pro PD launcher env with recipe

Enable the conc-256 CPU-offload tier (dram + lmcache, dspark) in
amd-master.yaml, and make server_atom.sh/models_atom.yaml reproduce the
DeepSeek-V4-Agentic-PD-Max recipe exactly: NUMA binding and the ATOM_DP_*
ports are now unconditional (the recipe sets them in the TP tier too, where
DP attention is off), and PYTHONHASHSEED=0 is exported on the prefill
offload node for consistent LMCache prefix hashes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(atom-disagg): use dp_sticky router policy for conc-256

At concurrency 256 the DP-attention router now pins each session to a
fixed DP rank (dp_sticky prefill/decode policy) and exports
AIPERF_HTTP_X_SESSION_ID_FROM_CORRELATION_ID=1 so aiperf derives the
session id from the request correlation id. Conc 64/128 keep cache_aware
and the TP tier keeps round_robin.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test(atom-disagg): restore conc 1/16/64/128/256 on nightly_202609221542

Restore the full concurrency sweep for the DSV4-Pro ATOM PD-disagg AgentX
arm. conc 1/16/64 keep the run-35643358891 shape with only the image
bumped; conc 128 matches run 35810485934 (MTP, DP attention, GPU-resident
KV) and conc 256 matches run 35825955863 (DSpark draft model, lmcache
DRAM tier, dram-utilization 0.50), so the two measured cells reproduce
exactly. The MTP tiers keep dram-utilization 0.80 in their own scenario
block.

Carry the server_atom.sh PORT export so the lm-eval cells can run:
without it run_lm_eval's check_env_vars guard aborts the eval and hangs
the allocation (run 35643358891).

Record the measured conc-128 / conc-256 throughput and the conc-128
gsm8k accuracy in perf-changelog.yaml, and fix the entry's config key,
which still named the pre-rename hicache-mtp key.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(perf-changelog): note online_quant unused for DSV4-Pro MI355X ATOM PD-disagg AgentX

Add the ATOM PD-disaggregated agentic arm for DeepSeek-V4-Pro-0813 MXFP4 on
MI355X -- dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark -- the ATOM
counterpart to dsv4-fp4-mi355x-sglang-disagg-agentic-hicache-mtp, so the two
engines are directly comparable on the AgentX trace workload. 1P1D TP8,
mooncake RDMA KV transfer, atomesh PD router, cluster:mi355x-amds. Modeled on
ATOM recipes/DeepSeek-V4-Agentic-PD-Max.md.

Docker image: rocm/atom-dev:nightly_202609221542

Recipe / search space:
- TP8 (EP1): conc 1, 16 -- MTP, GPU-resident KV, dram-utilization 0.80.
- DP-attention: conc 64, 128 -- MTP, GPU-resident KV, dram-utilization 0.80.
- DP-attention + CPU offload: conc 256 -- DSpark draft model + lmcache host KV
  tier (multi connector, max_pending_saves=8, slot_sidecar_staging_slots=4, LRU,
  256-token chunks), dram-utilization 0.50, dp-sticky idx2idx routing.
- conc 1/16/64 keep the shape run 35643358891 used and change only the image.
Per ATOM DeepSeek-V4-Agentic-PD-Max recipe: prefix caching on, FP8 KV and index
cache, block-size 256, TBO on prefill only, max-num-seqs = 2x concurrency.

online_quant: this config does not use online_quant. server_atom.sh only emits
--online_quant_config (ONLINE_QUANT_ARG) when the model entry sets
online_quant_config / online_quant_dpa_config in models_atom.yaml (read at
server_atom.sh:65-66, assembled at :156-172, injected into the prefill/decode
server commands at :317/561/652). The DeepSeek-V4-Pro-AgentX entry and its
-0813-AgentX alias define neither field, so ONLINE_QUANT_ARG stays empty and
--online_quant_config is never passed. Online (runtime) quantization is
unnecessary here because the served DeepSeek-V4-Pro-0813 checkpoint is already
offline MXFP4-quantized; online_quant (e.g. the ptpc_fp8 configs in
deprecated/models_atom.yaml) is for BF16 / unquantized checkpoints.

DSpark accuracy is not touched by online_quant. Because online_quant is off, no
target layer is re-quantized at runtime, so it cannot perturb draft/target
agreement (acceptance length) or gsm8k. The DSpark draft head is read from the
-0813 config.json and verifies against the unchanged MXFP4 target; the gsm8k
numbers reflect the offline MXFP4 checkpoint + DSpark only.

Measured results:
- conc-128 (run 35810485934, 3627 s, 13917/15339 profiled, 0 errors): 464105
  total tok/s (29007 tok/s/GPU over 16 GPUs), 3934 output tok/s, TTFT mean 9.75 s
  / p90 15.89, TPOT mean 12.98 ms / p90 14.43, interactivity mean 77.0 / p90
  69.3, e2e mean 23.01 s, 3.84 QPS, 96.6% theoretical prefix-cache hit.
- conc-256 (run 35825955863, 3630 s, 21317/24162 profiled, 0 errors): 776348
  total tok/s (48522 tok/s/GPU), 5794 output tok/s, TTFT mean 18.10 s / p90
  32.78, TPOT mean 15.95 ms / p90 17.57, interactivity mean 62.7 / p90 56.9, e2e
  mean 33.89 s, 5.88 QPS, 96.8% theoretical prefix-cache hit. Not a clean scaling
  comparison vs conc-128 -- this tier also swaps MTP for the DSpark draft model
  and adds the lmcache host KV tier.

Accuracy: conc-128 DP-attention cell (run 35851118405, lm-eval gsm8k 5-shot,
eval concurrency 128, n=1319): em_strict 0.9719 +/- 0.0045, em_flexible 0.9712
+/- 0.0046. conc 1, 16, 64 are unmeasured on this image.

Note: server_atom.sh exports PORT before sourcing benchmark_lib.sh on the eval
path: run_lm_eval's check_env_vars guard runs before it parses --port, and
job.slurm's docker -e allowlist forwards ROUTER_PORT but never PORT, so every
multi-node lm-eval cell aborted ~8 s in and hung the decode node in "Waiting
until router closes..." until cancelled (run 35643358891).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(perf-changelog): note online_quant unused for DSV4-Pro MI355X ATOM PD-disagg AgentX

Add the ATOM PD-disaggregated agentic arm for DeepSeek-V4-Pro-0813 MXFP4 on
MI355X -- dsv4-fp4-mi355x-atom-disagg-agentic-lmcache-dspark -- the ATOM
counterpart to dsv4-fp4-mi355x-sglang-disagg-agentic-hicache-mtp, so the two
engines are directly comparable on the AgentX trace workload. 1P1D TP8,
mooncake RDMA KV transfer, atomesh PD router, cluster:mi355x-amds. Modeled on
ATOM recipes/DeepSeek-V4-Agentic-PD-Max.md.

Docker image: rocm/atom-dev:nightly_202609221542

Recipe / search space:
- TP8 (EP1): conc 1, 16 -- MTP, GPU-resident KV, dram-utilization 0.80.
- DP-attention: conc 64, 128 -- MTP, GPU-resident KV, dram-utilization 0.80.
- DP-attention + CPU offload: conc 256 -- DSpark draft model + lmcache host KV
  tier (multi connector, max_pending_saves=8, slot_sidecar_staging_slots=4, LRU,
  256-token chunks), dram-utilization 0.50, dp-sticky idx2idx routing.
- conc 1/16/64 keep the shape run 35643358891 used and change only the image.
Per ATOM DeepSeek-V4-Agentic-PD-Max recipe: prefix caching on, FP8 KV and index
cache, block-size 256, TBO on prefill only, max-num-seqs = 2x concurrency.

online_quant: this config does not use online_quant. server_atom.sh only emits
--online_quant_config (ONLINE_QUANT_ARG) when the model entry sets
online_quant_config / online_quant_dpa_config in models_atom.yaml (read at
server_atom.sh:65-66, assembled at :156-172, injected into the prefill/decode
server commands at :317/561/652). The DeepSeek-V4-Pro-AgentX entry and its
-0813-AgentX alias define neither field, so ONLINE_QUANT_ARG stays empty and
--online_quant_config is never passed. Online (runtime) quantization is
unnecessary here because the served DeepSeek-V4-Pro-0813 checkpoint is already
offline MXFP4-quantized; online_quant (e.g. the ptpc_fp8 configs in
deprecated/models_atom.yaml) is for BF16 / unquantized checkpoints.

DSpark accuracy is not touched by online_quant. Because online_quant is off, no
target layer is re-quantized at runtime, so it cannot perturb draft/target
agreement (acceptance length) or gsm8k. The DSpark draft head is read from the
-0813 config.json and verifies against the unchanged MXFP4 target; the gsm8k
numbers reflect the offline MXFP4 checkpoint + DSpark only.

Measured results:
- conc-128 (run 35810485934, 3627 s, 13917/15339 profiled, 0 errors): 464105
  total tok/s (29007 tok/s/GPU over 16 GPUs), 3934 output tok/s, TTFT mean 9.75 s
  / p90 15.89, TPOT mean 12.98 ms / p90 14.43, interactivity mean 77.0 / p90
  69.3, e2e mean 23.01 s, 3.84 QPS, 96.6% theoretical prefix-cache hit.
- conc-256 (run 35825955863, 3630 s, 21317/24162 profiled, 0 errors): 776348
  total tok/s (48522 tok/s/GPU), 5794 output tok/s, TTFT mean 18.10 s / p90
  32.78, TPOT mean 15.95 ms / p90 17.57, interactivity mean 62.7 / p90 56.9, e2e
  mean 33.89 s, 5.88 QPS, 96.8% theoretical prefix-cache hit. Not a clean scaling
  comparison vs conc-128 -- this tier also swaps MTP for the DSpark draft model
  and adds the lmcache host KV tier.

Accuracy: conc-128 DP-attention cell (run 35851118405, lm-eval gsm8k 5-shot,
eval concurrency 128, n=1319): em_strict 0.9719 +/- 0.0045, em_flexible 0.9712
+/- 0.0046. conc 1, 16, 64 are unmeasured on this image.

Note: server_atom.sh exports PORT before sourcing benchmark_lib.sh on the eval
path: run_lm_eval's check_env_vars guard runs before it parses --port, and
job.slurm's docker -e allowlist forwards ROUTER_PORT but never PORT, so every
multi-node lm-eval cell aborted ~8 s in and hung the decode node in "Waiting
until router closes..." until cancelled (run 35643358891).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: hyukjlee <hyukjlee@amd.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>
* ci: run Claude Opus 5.5 with a supported CLI

Pin Claude Code 2.1.282 and update the Claude action in each workflow before selecting Opus 5.5.

* ci: document pinned Claude CLI installation

The Claude CLI package has no regular dependencies, and all native optional packages are version pinned to 2.1.282. Record the narrow Zizmor exception for this explicit compatibility pin.
…e to v0.5.20-rocm720-mi35x-20260924 (SemiAnalysisAI#3423)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rrying vllm#58510 / 在首个包含 vllm#58510 的 ROCm 10.0 nightly 上重新扫描 MI355X (SemiAnalysisAI#3420)
…-Flash ATOM TP2/TP4 (SemiAnalysisAI#3387)

* feat(atom): add DeepSeek-V4.1-Flash MI355X AgentX recipe

新增 DeepSeek-V4.1-Flash 在 MI355X 上的 ATOM TP2/TP4 AgentX 配方,使用指定 nightly 镜像、5-token DSpark 和 golden AL 3.51;同步中英文文档及性能变更记录。

* docs: link ATOM Flash recipe changelog to PR 3386

回填 DeepSeek-V4.1-Flash ATOM 配方的实际 PR 链接。

* docs: point ATOM Flash changelog to upstream PR 3387

将性能变更记录指向 upstream 分支提交的 PR 3387。

* chore(atom): bump DeepSeek-V4.1-Flash image to nightly_202609241513

将 DeepSeek-V4.1-Flash ATOM 配方镜像更新为 rocm/atom-dev:nightly_202609241513(digest sha256:d04ec105),同步中英文文档及性能变更记录。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore(atom): bump DeepSeek-V4.1-Flash image to nightly_202609250902

将 DeepSeek-V4.1-Flash ATOM 配方镜像更新为 rocm/atom-dev:nightly_202609250902(digest sha256:9aaeed59),同步中英文文档及性能变更记录。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(atom): document DSpark layer-37-39 dtype preservation for DSV4.1-Flash

PR SemiAnalysisAI#3387 adds the DeepSeek-V4.1-Flash FP4 ATOM AgentX recipe on MI355X
(TP2/TP4, five-token DSpark, BF16 KV, FP8 index cache, no EP/KV offload).

This commit adds a changelog note recording the data-type-preserved audit:
DSpark draft layers 37-39 keep their checkpoint precision. The recipe
passes no --online_quant_config, so make_v4_quant_config builds the same
per-layer quant spec for the drafter as the target; the mtp.0/1/2 weights
load inline from the same checkpoint (spec_decode=True) and
config.get_layer_quant_config has no mtp.* special case, so ATOM neither
re-quantizes nor up/down-casts them. --kv_cache_dtype/--index-cache-dtype
affect cache storage only, not draft/MTP weights.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(atom): add DeepSeek-V4.1-Flash FP4 ATOM AgentX on MI355X (TP2/TP4 DSpark)

Add the DeepSeek-V4.1-Flash FP4 ATOM AgentX recipe on MI355X following the
upstream TP2/TP4 recipe: TP2 conc [1,2,8,16,32,64], TP4 conc [2,8,16,32,64],
no expert parallelism or KV offload. Uses rocm/atom-dev:nightly_202609250902,
BF16 KV, FP8 index cache, max-num-seqs 128, 16K batching/prefill chunks,
prefix caching with block size 16, 8K state checkpoints, level 3 + FULL graphs.
Five-token DSpark with thinking_on golden AL 3.51 for throughput, real
acceptance for eval, dsml_v41 tool parsing.

Data-type preserved: DSpark draft layers 37-39 keep their checkpoint precision.
The recipe passes no --online_quant_config, so make_v4_quant_config builds the
same per-layer quant spec for the drafter as the target; the mtp.0/1/2 weights
load inline from the same checkpoint (spec_decode=True) and
config.get_layer_quant_config has no mtp.* special case, so ATOM neither
re-quantizes nor up/down-casts them. --kv_cache_dtype/--index-cache-dtype
affect cache storage only, not draft/MTP weights.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: honglie <275632494+yhl-amd@users.noreply.github.com>
Co-authored-by: Honglie Yi <hyi@crsuse2-m2m-v2-020.us-east2-a.compute.internal>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: seungrokj <144636725+seungrokj@users.noreply.github.com>
Co-authored-by: seungrokj <seungrok.jung@amd.com>
…image to v0.5.20-rocm720-mi30x / 将 glm5.2-fp8-mi325x-sglang-agentic-mtp 的 SGLang ROCm 镜像更新至 v0.5.20-rocm720-mi30x (SemiAnalysisAI#3362)

* feat(glm5.2-mi325x): update SGLang ROCm image to v0.5.20-rocm720-mi30x

Update glm5.2-fp8-mi325x-sglang-agentic-mtp from lmsysorg/sglang:v0.5.19-rocm720-mi30x
to lmsysorg/sglang:v0.5.20-rocm720-mi30x and rename the retired --cuda-graph-max-bs
alias to --cuda-graph-max-bs-decode in the recipe (sgl-project/sglang#38375).

将 glm5.2-fp8-mi325x-sglang-agentic-mtp 的 SGLang ROCm 镜像从 v0.5.19-rocm720-mi30x
更新至 v0.5.20-rocm720-mi30x,并将配方中已被上游移除的 --cuda-graph-max-bs 别名
改为 --cuda-graph-max-bs-decode(sgl-project/sglang#38375)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* chore(changelog): record glm5.2-fp8-mi325x-sglang-agentic-mtp v0.5.20 image refresh

Append the perf-changelog entry for the SGLang ROCm image update to
v0.5.20-rocm720-mi30x and the --cuda-graph-max-bs-decode rename.

为 SGLang ROCm 镜像更新至 v0.5.20-rocm720-mi30x 及 --cuda-graph-max-bs-decode
重命名追加 perf-changelog 条目。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>
…mage to v0.30.0 / 将 minimaxm3-fp8-mi300x-vllm-agentic-mtp 的 vLLM ROCm 镜像更新至 v0.30.0 (SemiAnalysisAI#3361)

* chore(amd): update minimaxm3-fp8-mi300x-vllm-agentic-mtp vLLM ROCm image to v0.30.0

Move the master image for minimaxm3-fp8-mi300x-vllm-agentic-mtp from
vllm/vllm-openai-rocm:v0.29.0 to the vllm/vllm-openai-rocm:v0.30.0 release
image (digest sha256:2e7da1ad1c66836802072588adea75f9f4991da5f9545b4318e91d422c22ce6a).
The recipe script, search space and evals are unchanged.

将 minimaxm3-fp8-mi300x-vllm-agentic-mtp 的主镜像从 vllm/vllm-openai-rocm:v0.29.0
更新为 vllm/vllm-openai-rocm:v0.30.0 发布镜像(digest
sha256:2e7da1ad1c66836802072588adea75f9f4991da5f9545b4318e91d422c22ce6a)。
配方脚本、搜索空间与评测均未改动。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* chore(changelog): record the minimaxm3-fp8-mi300x-vllm-agentic-mtp v0.30.0 image update

Append the perf-changelog entry for the vLLM ROCm image update from v0.29.0 to
v0.30.0 on minimaxm3-fp8-mi300x-vllm-agentic-mtp after the smoke run
(35729587789) passed its c2 and c16 LMCache throughput points and both
minimax_m3_full evals.

为 minimaxm3-fp8-mi300x-vllm-agentic-mtp 的 vLLM ROCm 镜像从 v0.29.0 更新至 v0.30.0
追加 perf-changelog 条目;smoke 运行(35729587789)的 c2 与 c16 LMCache 吞吐点及两项
minimax_m3_full 评测均已通过。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Klaud Cold <klaud-cold@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>
…mage to v0.5.20-cu130 / 将 dsv4-fp4-b200-sglang-agentic-hicache-mtp 的 SGLang 镜像更新至 v0.5.20-cu130 (SemiAnalysisAI#3334)

* feat(dsv4): update B200 SGLang AgentX HiCache MTP image to v0.5.20-cu130

Update dsv4-fp4-b200-sglang-agentic-hicache-mtp from lmsysorg/sglang:v0.5.19-cu130
to lmsysorg/sglang:v0.5.20-cu130 (sglang v0.5.20, build commit 94602c9c). SGLang
v0.5.20 removed the deprecated --cuda-graph-max-bs alias (sgl-project/sglang#38375),
so the recipe passes the same value through --cuda-graph-max-bs-decode. Model,
topology, DSpark settings, HiCache settings and all points are unchanged.

将 dsv4-fp4-b200-sglang-agentic-hicache-mtp 的镜像从 lmsysorg/sglang:v0.5.19-cu130
更新为 lmsysorg/sglang:v0.5.20-cu130(sglang v0.5.20,构建提交 94602c9c)。SGLang
v0.5.20 移除了已弃用的 --cuda-graph-max-bs 别名(sgl-project/sglang#38375),因此配方改用
--cuda-graph-max-bs-decode 传入同一数值。模型、拓扑、DSpark 设置、HiCache 设置及所有测试点保持不变。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* chore(changelog): record the B200 DeepSeek-V4-Pro SGLang AgentX image update

Append the perf-changelog entry for dsv4-fp4-b200-sglang-agentic-hicache-mtp
moving to lmsysorg/sglang:v0.5.20-cu130 (PR #3334).

为 dsv4-fp4-b200-sglang-agentic-hicache-mtp 更新至 lmsysorg/sglang:v0.5.20-cu130
追加 perf-changelog 条目(PR #3334)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(ci): verify only newly submitted signoffs (#3340)

仅对新提交的签核自动运行验证,编辑清单后需手动重试,并修正文档及验证器提示。

* perf(amd): enable ATOM DSpark K6 with RCCL DEP / ATOM 全并发启用 DSpark K6 与 RCCL DEP (#2912)

* perf(amd): switch DSV4 AgentX to native RCCL DEP

将 DeepSeek-V4-Pro MI355X ATOM AgentX 的 c48 及以上测试切换到本地验证过的原生 RCCL DEP 配置,并保持低并发 TP 测试不变。

同步固定的 post-merge ATOM 镜像、EP8 元数据、关闭 TBO/EPLB、真实 MTP 接受率以及本地验证过的路由和 AIPerf 参数。

* docs(perf): link DSV4 RCCL DEP pull request

将 DeepSeek-V4-Pro RCCL DEP 性能变更记录中的占位链接替换为实际的 InferenceX PR 链接。

* fix(amd): trim DSV4 AgentX DEP overrides

精简 DeepSeek-V4-Pro AgentX RCCL DEP 配置,移除与 CLI 或公共默认值重复的环境变量,并补齐本地验证使用的 3600 秒 warmup grace。

* fix(amd): restore DSV4 AgentX scheduling controls

Restore the request-equivalent weight, prefill delayer, and decode interval requested for the AgentX run. Remove the newly introduced terminal MTP overrides while keeping the rest of the cleanup unchanged.

* fix(amd): remove redundant AgentX timeout overrides

Keep the 3600-second agentic warmup allowance, but rely on the server keep-alive setting and AIPerf default benchmark grace period.

* fix(amd): keep DSV4 state checkpoints at 8K

Remove the DEP-only 32K override so both TP and DEP retain the original 8192-token state checkpoint interval.

* perf(amd): capture dense DSV4 DEP decode graphs

为 DSV4-Pro 的 DPA/DEP 路径补齐小 batch CUDA graph,避免非二次幂 decode batch 向上填充造成的 attention、MoE 和 RCCL 无效计算。保留 TP 路径默认行为,并为高并发配置保留大 batch graph。

* perf(amd): include upstream DSV4 DEP fixes in AgentX

Pin the September 12 ATOM nightly containing the RCCL EP sentinel fix and AITER stage2 tuning fix. Record the server's installed sources and bundled tuning rows in the AgentX artifacts while retaining dense decode graphs, FP8 KV, and the current scheduler settings.

固定到包含 RCCL EP sentinel 与 AITER stage2 调优修复的 9 月 12 日 ATOM nightly;保存服务端实际源码版本及镜像内 tuning 行,保留 dense decode graph、FP8 KV 和现行调度设置。镜像包含 AITER#4159,但本配方不启用其 BF16 FlyDSL paged SWA 分支。

* fix(ci): provide exact PR context to priority classifier

Supply immutable base/head revisions and the permitted diff command, document read-only tool use, and allow 16 turns for structured classification.

为优先级分类器提供确切的 Base/Head 版本及允许执行的 Diff 命令,明确只读工具用法,并将结构化分类的轮数上限调整为 16。

* perf(amd): enable DSpark K6 across the ATOM AgentX sweep

将 PR #2912 的十个 ATOM AgentX 性能点切换为固定版本 0813 checkpoint、
DSpark K6/q7 和 golden AL 3.77;C256 全量 GSM8K 保留真实验证。
修复 draft_model 路由与共享缓存挂载,统一服务与客户端 tokenizer,
增加 DSpark head、66 个分片及 tokenizer 检查并记录运行身份。
保留既有镜像优化、原生 RCCL DEP 和 dense FULL graph 配置。

* fix(amd): preserve inference mode in DSpark TP MoE callbacks

修复 DSpark q7 触发 AITER TP 通信融合 MoE 补齐路径时的 inference tensor 原地写入错误。仅对固定源码应用 InferenceMode callback 补丁,保留通信融合与 graph,保存补丁哈希,并覆盖原始失败、补齐、对齐和重复应用场景。

* fix(amd): use upstream ATOM inference-mode fix

将 MI355X ATOM AgentX 配方切换到包含 ROCm/ATOM#2233 的 pr2233-4f3a808 镜像,并移除运行时 AITER 源码补丁、对应测试和补丁清单记录。

* perf(amd): use BF16 KV through concurrency 16

将 MI355X ATOM AgentX 的 C1、C2、C4、C8 和 C16 任务切换为 BF16 KV cache;C48 及以上 DEP 任务继续使用 FP8 KV cache。

* perf(amd): pin DSv4 ATOM AgentX to official nightly_202609161445

Restore run-sweep.yml to the PR base and replace the temporary
rocm/atom-dev:pr2233-4f3a808 image with official nightly_202609161445,
which includes the merged ROCm/ATOM#2233 inference-mode fix.

将 run-sweep.yml 还原到 PR base,并把临时镜像 pr2233-4f3a808 换成
包含已合入 ATOM#2233 修复的官方 nightly_202609161445。

* fix: restore missing config-keys in perf-changelog merge

The main merge left the first PR #2912 changelog entry without its
- config-keys: header, so process_changelog could not parse the added YAML.

修复合并后第一条 2912 changelog 条目缺少 - config-keys: 导致的 YAML 解析失败。

* docs: drop unrelated CI procedure changes

将两份 CI 流程文档恢复为 main 版本,使其不再出现在本 PR 的变更中。

* docs: align CI procedures with PR base

将中英文 CI 流程文档恢复为 PR 当前基础版本,确保它们不再出现在本 PR 的变更中。

* docs(perf): correct DSv4-Pro ATOM AgentX changelog image to nightly_202609161445

Align the perf-changelog entry with the recipe's actual image
(rocm/atom-dev:nightly_202609161445 in configs/amd-master.yaml),
replacing the stale nightly_202609071454 reference and its now-mismatched
digest and build-commit details.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(perf): align dsv4-fp4-mi355x-atom-agentic-mtp changelog with PR 2912

Rewrite the dsv4-fp4-mi355x-atom-agentic-mtp entry to match the final
recipe: EAGLE MTP -> DSpark (draft_model) on the DeepSeek-V4-Pro-0813
checkpoint, NUM_SPEC_TOKENS 3 -> 6 (K6), SPEC_DECODE_AL 2.49 -> 3.77,
and the RCCL DEP band on TP8/DPA8/EP8. Correct the state checkpoint
interval to STATE_CHECKPOINT_INTERVAL_TOKENS=8192 (was mis-stated as
32768) and note eval verifies real DSpark drafts, not MTP.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(perf): align dsv4-fp4-mi355x-atom-agentic-mtp changelog with PR 2912

Rewrite the dsv4-fp4-mi355x-atom-agentic-mtp entry to match the final
recipe: EAGLE MTP -> DSpark (draft_model) on the DeepSeek-V4-Pro-0813
checkpoint, NUM_SPEC_TOKENS 3 -> 6 (K6), SPEC_DECODE_AL 2.49 -> 3.77,
and the RCCL DEP band on TP8/DPA8/EP8. Correct the state checkpoint
interval to STATE_CHECKPOINT_INTERVAL_TOKENS=8192 (was mis-stated as
32768) and note eval verifies real DSpark drafts, not MTP.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: seungrokj <144636725+seungrokj@users.noreply.github.com>
Co-authored-by: Chun Fang <chun.fang@amd.com>
Co-authored-by: seungrokj <seungrok.jung@amd.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* docs: define draft precision as serve-the-draft-as-it-ships (#3348)

Rewrite the Draft-model precision rule in CONTRIBUTING.md, its Chinese
mirror, the checklist item, and verifier Check 13 so the baseline is the
draft that ships with the served checkpoint, at its stored precision,
through the pinned upstream image's default handling. Forbid only
submission-side changes that lower draft precision below that default.
Add the Qwen FP8 embedded MTP head and the SGLang DSpark wo_a FP8-to-BF16
load conversion as worked examples of what is compliant.

将 CONTRIBUTING.md 中的 Draft 模型精度规则、其中文镜像、审阅清单条目以及
验证器检查 13 重写为:基线是随所服务 checkpoint 一同发布的 draft,保持其
存储精度,并采用锁定上游镜像的默认加载处理。仅禁止提交方将 draft 精度降到
该默认值以下的改动。新增 Qwen FP8 内嵌 MTP head 与 SGLang DSpark wo_a
FP8 转 BF16 加载转换两个合规示例。

* Fix MI300X AMD partition and match its eight-node runner pool (#3350)

Submit to compute-0 and retire mi300x-amd_08 from both inventory groups. Benchmark commands and resource settings are unchanged.

* Consolidate deprecated configs and remove retired runtime support (#3349)

* chore: consolidate deprecated configs by vendor

* style: separate deprecated configs with blank lines

* chore: remove retired model routing and stale agent guidance

* chore: archive retired server registry entries and fix deprecation guidance

* chore: archive remaining retired disaggregated registry variants

* chore: remove retired DSV4 fixed-sequence helper branches

* docs: correct remaining GLM AgentX policy comment

* Add B300 Qwen3.5 397B FP8 disaggregated AgentX recipes (#3268)

* feat: add B300 Qwen3.5 FP8 disaggregated AgentX starter

* chore: link B300 starter performance changelog

* perf: colocate B300 Qwen3.5 prefill and decode workers

* fix: match B300 Mamba cache flag to pinned SGLang

* perf: use latest SGLang nightly for B300 Qwen3.5 FP8

* fix: use Dynamo compatibility with latest SGLang

* fix: use intra-node NVLink for colocated B300 PD

* perf: select measured B300 FP8 HiCache PD candidate

* fix: propagate failed B300 Slurm runs after collecting artifacts

* Prepare expanded measured B300 FP8 qualification curve

* perf(b300): qualify measured concurrency 48 PD point

* perf(b300): preserve existing aggregate publication scopes

* style(b300): normalize final config newline

* fix: require validated B300 Qwen3.5 AgentX power telemetry

* fix: bind B300 power windows to matrix concurrency

* perf: qualify B300 FP8 write-through PD at concurrency 96

* style: format B300 power contract fixture

* fix: declare the B300 AgentX formal power window contract

* docs: consolidate the B300 FP8 performance changelog

* Avoid unverified host-memory pressure for B300 H298 recipes

* fix: allow complete B300 AgentX runs on eligible nodes

* perf: retain B300 FP8 candidates supported by canonical qualification

* feat(models): acquire verified original BF16 MTP shards atomically

* test(models): reject corrupted provenance and unexpected asset files

* feat(b300): stage original BF16 MTP assets for Qwen FP8 recipes

* feat(b300): prepare C48 disaggregation with 64 decode slots

* perf(b300): add screened TP2 EP2 write-through candidate

* perf(b300): select measured C24 decode capacity

* perf: expand B300 FP8 disaggregated AgentX frontier

* fix: allow full B300 TP2 sweep startup and drain time

* perf: select B300 1P2D throughput frontier point

* perf: select B300 1P2D C32 frontier point

* perf: add B300 1P2D C64 frontier point

* perf: refine B300 FP8 disaggregation frontier candidates

* Refine B300 FP8 frontier with decode cache and DP attention

* perf: refine B300 FP8 disaggregated frontier

* perf(b300): qualify six FP8 disaggregated frontier candidates

* perf(b300): qualify C4 latency endpoint and drop regressed C40

* perf(b300): select basic DCGM counters for Qwen AgentX

* perf(b300): add higher-capacity C48 FP8 disaggregation candidate

* perf: expand B300 FP8 sweep with screened C12 and C44 points

* perf: add screened B300 FP8 C56 ReplaySSM capacity point

* test: remove B300 SRT status test

* test: remove MTP acquisition test

* fix(b300): use the official FP8 embedded MTP head

* fix(b300): disable inherited AgentX power collection

* fix(b300): narrow node exclusion and simplify recipe metadata

* [Klaud Cold] Update qwen3.5-fp8-h200-sglang-agentic-hicache-mtp SGLang image to nightly-dev-cu13-20260916-c9a8fba9 / 将 qwen3.5-fp8-h200-sglang-agentic-hicache-mtp 的 SGLang 镜像更新至 nightly-dev-cu13-20260916-c9a8fba9 (#3200)

* perf: update qwen3.5-fp8-h200-sglang-agentic-hicache-mtp SGLang image to nightly-dev-cu13-20260916-c9a8fba9

Move the H200 Qwen3.5 FP8 AgentX HiCache MTP recipe from
lmsysorg/sglang:nightly-dev-cu13-20260914-4358a161 to
lmsysorg/sglang:nightly-dev-cu13-20260916-c9a8fba9 (sgl-project/sglang@c9a8fba9,
index digest sha256:509c2742b9441fe9182ae3dd7dac8840ba48e03d2d44b7b24e80d428f117fd85).
The 09-16 nightly is the first cu13 build carrying sgl-project/sglang#39516, the
HiCache startup fallback for the pinned sglang-kernel 0.4.7 wheel that broke every
registered host pool on the 09-15 build. Recipe script, MTP settings, HiCache arms
and the concurrency grid are unchanged.

将 H200 Qwen3.5 FP8 AgentX HiCache MTP 配方的 SGLang 镜像从
lmsysorg/sglang:nightly-dev-cu13-20260914-4358a161 更新为
lmsysorg/sglang:nightly-dev-cu13-20260916-c9a8fba9(sgl-project/sglang@c9a8fba9)。
09-16 nightly 是首个包含 sgl-project/sglang#39516 的 cu13 构建,该修复为固定的
sglang-kernel 0.4.7 wheel 提供 HiCache 启动回退,09-15 构建中所有已注册主机池因此无法启动。
配方脚本、MTP 设置、HiCache 分支及并发网格保持不变。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* perf: add changelog entry for the qwen3.5-fp8-h200-sglang-agentic-hicache-mtp image bump

Append the perf-changelog entry for moving qwen3.5-fp8-h200-sglang-agentic-hicache-mtp
to lmsysorg/sglang:nightly-dev-cu13-20260916-c9a8fba9 after the targeted smoke run
(35135979333) passed the c2 throughput point and the c24 gsm8k eval.

为 qwen3.5-fp8-h200-sglang-agentic-hicache-mtp 更新至
lmsysorg/sglang:nightly-dev-cu13-20260916-c9a8fba9 追加 perf-changelog 条目;
定向冒烟运行(35135979333)已通过 c2 吞吐点与 c24 gsm8k 评测。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>

* [Klaud Cold] Update minimaxm3-fp8-mi300x-vllm-agentic-mtp vLLM ROCm image to v0.29.0 / 将 minimaxm3-fp8-mi300x-vllm-agentic-mtp 的 vLLM ROCm 镜像更新至 v0.29.0 (#3063)

* feat: update minimaxm3-fp8-mi300x-vllm-agentic-mtp vLLM ROCm image to v0.29.0

Move the MI300X MiniMax-M3 MXFP8 AgentX EAGLE3 recipe from the unstable
commit nightly vllm/vllm-openai-rocm:nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
to the v0.29.0 release image vllm/vllm-openai-rocm:v0.29.0
(digest sha256:e5e47f6aaab675c252c381f0dac237b31b10d87bb74d092b07fb4065efd7f5a1).
Recipe, search space and evals are unchanged.

将 MI300X MiniMax-M3 MXFP8 AgentX EAGLE3 配方的镜像从不稳定的提交 nightly
vllm/vllm-openai-rocm:nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
更新为 v0.29.0 发布镜像 vllm/vllm-openai-rocm:v0.29.0
(digest sha256:e5e47f6aaab675c252c381f0dac237b31b10d87bb74d092b07fb4065efd7f5a1)。
配方、搜索空间与评测保持不变。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs: add perf-changelog entry for the minimaxm3-fp8-mi300x-vllm-agentic-mtp v0.29.0 image bump

Record the vLLM ROCm image move from nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
to the v0.29.0 release image for PR #3063 after the smoke run passed.

为 PR #3063 记录 vLLM ROCm 镜像从 nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
更新至 v0.29.0 发布镜像的 perf-changelog 条目(冒烟运行已通过)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs: shorten PR 3063 performance changelog

缩短 PR 3063 的性能变更日志条目。

* docs: keep PR 3063 changelog concise

保持 PR 3063 性能变更日志简洁。

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>

* [Klaud Cold] Update minimaxm3-fp8-mi300x-vllm-agentic-mtp vLLM ROCm image to v0.29.0 / 将 minimaxm3-fp8-mi300x-vllm-agentic-mtp 的 vLLM ROCm 镜像更新至 v0.29.0 (#3063)

* feat: update minimaxm3-fp8-mi300x-vllm-agentic-mtp vLLM ROCm image to v0.29.0

Move the MI300X MiniMax-M3 MXFP8 AgentX EAGLE3 recipe from the unstable
commit nightly vllm/vllm-openai-rocm:nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
to the v0.29.0 release image vllm/vllm-openai-rocm:v0.29.0
(digest sha256:e5e47f6aaab675c252c381f0dac237b31b10d87bb74d092b07fb4065efd7f5a1).
Recipe, search space and evals are unchanged.

将 MI300X MiniMax-M3 MXFP8 AgentX EAGLE3 配方的镜像从不稳定的提交 nightly
vllm/vllm-openai-rocm:nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
更新为 v0.29.0 发布镜像 vllm/vllm-openai-rocm:v0.29.0
(digest sha256:e5e47f6aaab675c252c381f0dac237b31b10d87bb74d092b07fb4065efd7f5a1)。
配方、搜索空间与评测保持不变。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs: add perf-changelog entry for the minimaxm3-fp8-mi300x-vllm-agentic-mtp v0.29.0 image bump

Record the vLLM ROCm image move from nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
to the v0.29.0 release image for PR #3063 after the smoke run passed.

为 PR #3063 记录 vLLM ROCm 镜像从 nightly-d9105ea8001e0a6d77a96327d17515bb5791fb36
更新至 v0.29.0 发布镜像的 perf-changelog 条目(冒烟运行已通过)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs: shorten PR 3063 performance changelog

缩短 PR 3063 的性能变更日志条目。

* docs: keep PR 3063 changelog concise

保持 PR 3063 性能变更日志简洁。

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>

* [Klaud Cold] Update glm5.2-fp8-mi325x-sglang-agentic-mtp SGLang ROCm image to v0.5.19-rocm720-mi30x / 将 glm5.2-fp8-mi325x-sglang-agentic-mtp 的 SGLang ROCm 镜像更新至 v0.5.19-rocm720-mi30x (#2980)

* chore: bump glm5.2-fp8-mi325x-sglang-agentic-mtp SGLang image to v0.5.19-rocm720-mi30x

Update the GLM-5.2 FP8 MI325X SGLang AgentX MTP family from
lmsysorg/sglang:v0.5.16-rocm720-mi30x to the v0.5.19 release image
lmsysorg/sglang:v0.5.19-rocm720-mi30x (Docker Hub digest
sha256:a0ffcdd013af6d79c9b7c4348c42b14a79a48f6c43dd3ca0235ec3802da45f75).
Model, precision, topology, speculative settings, workloads and recipe
script are unchanged.

将 GLM-5.2 FP8 MI325X SGLang AgentX MTP 配方的镜像从
lmsysorg/sglang:v0.5.16-rocm720-mi30x 更新为 v0.5.19 发布镜像
lmsysorg/sglang:v0.5.19-rocm720-mi30x。模型、精度、拓扑、投机解码参数、
工作负载与配方脚本保持不变。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* chore: add perf-changelog entry for glm5.2-fp8-mi325x-sglang-agentic-mtp image bump

Append the changelog entry for updating the GLM-5.2 FP8 MI325X SGLang
AgentX MTP image to lmsysorg/sglang:v0.5.19-rocm720-mi30x (PR #2980).

为 glm5.2-fp8-mi325x-sglang-agentic-mtp 镜像更新至
lmsysorg/sglang:v0.5.19-rocm720-mi30x 追加性能变更日志条目(PR #2980)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs: shorten PR 2980 performance changelog

缩短 PR 2980 的性能变更日志条目。

---------

Co-authored-by: Klaud-Cold <klaud-cold@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>

* [Klaud Cold] Add MI325X TP4 and TP2 DeepSeek-V4.1-Flash vLLM AgentX arms with Engram host offload / 新增 Engram 主机卸载的 MI325X TP4 与 TP2 DeepSeek-V4.1-Flash vLLM AgentX 臂 (#3337)

* [Klaud Cold] Add MI325X TP4 and TP2 DeepSeek-V4.1-Flash vLLM AgentX arms with Engram host offload / 新增 Engram 主机卸载的 MI325X TP4 与 TP2 DeepSeek-V4.1-Flash vLLM AgentX 臂

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Repin dsv41flash-mi325x-tp2-tp4-engram-offload to the ROCm 10.0 nightly channel / 将镜像重新固定到 ROCm 10.0 nightly 渠道

Match SemiAnalysisAI/InferenceX#3326, which moved MI355X to nightly-rocm100-3df4ae15 on
the ROCm 10.0 channel. Same vLLM commit, different ROCm runtime.

与 SemiAnalysisAI/InferenceX#3326 保持一致:相同的 vLLM commit,ROCm 10.0 运行时。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* chore: refresh PR #3337 for sweep reuse [skip-sweep]

Sync with origin/main after the green sweep run 35637516947; the reuse gate
authorizes that run on this head.

在绿色 sweep 运行 35637516947 之后与 origin/main 同步;reuse gate 在此 head 上授权该运行。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* chore(ci): run the priority classifier on Opus 5 at low effort [skip-sweep] (#3360)

* chore: bump srt-slurm to v2.18.0 and stream benchmark output (#3367)

Move the utils/srt-slurm submodule from 984180e (#448) to v2.18.0
(2ac4eb1), 28 commits ahead, which adds benchmark.stream_output
(NVIDIA/srt-slurm#483). Enable it for every srt-slurm recipe through
setup_srt_slurm so benchmark.out is mirrored into the Actions job log
while the client runs. The TileRT fork pin predates the option and is
left unchanged.

* Add DSV4 B200 Dynamo+SGLang AgentX configs / 添加 DSV4 B200 Dynamo+SGLang AgentX 配置 (#3257)

* feat(dsv4): add B200 Dynamo SGLang AgentX configs

* docs(perf): link DSV4 B200 AgentX PR

* fix(dsv4): expand c256 decode KV headroom

---------

Co-authored-by: hshrivastava-droid <hshrivastava@nvidia.com>
Co-authored-by: Rohit Nagraj <rohitnagraj.99@gmail.com>

* [Klaud Cold] Add MI300X TP4 DeepSeek-V4.1-Flash vLLM AgentX arm with Engram host offload / 新增 Engram 主机卸载的 MI300X TP4 DeepSeek-V4.1-Flash vLLM AgentX 臂 (#3336)

* [Klaud Cold] Add MI300X TP4 and TP2 DeepSeek-V4.1-Flash vLLM AgentX arms with Engram host offload / 新增 Engram 主机卸载的 MI300X TP4 与 TP2 DeepSeek-V4.1-Flash vLLM AgentX 臂

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Repin dsv41flash-mi300x-tp2-tp4-engram-offload to the ROCm 10.0 nightly channel / 将镜像重新固定到 ROCm 10.0 nightly 渠道

Match SemiAnalysisAI/InferenceX#3326, which moved MI355X to nightly-rocm100-3df4ae15 on
the ROCm 10.0 channel. Same vLLM commit, different ROCm runtime.

与 SemiAnalysisAI/InferenceX#3326 保持一致:相同的 vLLM commit,ROCm 10.0 运行时。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Drop the MI300X TP2 arm: measured infeasible on a 192 GB card / 移除 MI300X TP2 臂:在 192 GB 卡上实测不可行

Run 35671005506 reported "Available KV cache memory: -13.51 GiB" at TP2
concurrency 1 and the engine refused to start, even with the indexer
buffer already halved to 4096 batched tokens. TP8 and TP4 are unaffected;
TP4 passed at concurrency 1 and 32 in the same run.

运行 35671005506 在 TP2 并发 1 下报告 "Available KV cache memory: -13.51 GiB"
并拒绝启动,此时 indexer 缓冲区已减半至 4096。TP8 与 TP4 不受影响。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* chore: refresh PR #3336 for sweep reuse [skip-sweep]

Sync with origin/main after the green sweep run 35678619120; the reuse gate
authorizes that run on this head.

在绿色 sweep 运行 35678619120 之后与 origin/main 同步;reuse gate 在此 head 上授权该运行。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: warn when sign-off lacks a reuse command (#3368)

中文:签署审核缺少授权复用命令时改为警告,同步裁定发布逻辑、双语文档和回归测试。

* [PowerX] retain healthy window measurements in audit sidecars / 在审计文件中保留健康窗口测量 (#3357)

* fix: retain healthy power windows in audit sidecars

保留健康窗口的独立测量和逐点失败证据,保持包完整性检查、required-power 及发布判定不变。

* docs: clarify retained power diagnostics

精简中英文窗口保留说明,明确审计顶层逐 GPU 诊断字段不构成发布许可。

* [B200][SGLang][AgentX] Improve DeepSeek V4.1 Flash performance (#3346)

* perf(b200): tune DeepSeek V4.1 host Engram layout on latest SGLang

* chore(b200): link performance candidate to PR 3346

* perf(b200): add STP and retain native DSpark FP8 projections

* fix(b200): import pinned images and handle strided draft inputs

* perf(b200): compare GPU-resident Engram tables for STP

* fix(b200): use shipped default DSpark implementation

* perf(b200): service STP decodes between long prefills

* perf(b200): probe TP2 DSpark with bounded prefill memory

* perf(b200): schedule DSpark decode between long prefills

* perf(b200): compare GPU-resident Engram for TP4 DSpark

* fix(b200): release completed MXFP4 loader temporaries

* fix(b200): mark loader patch utility executable

* perf(b200): test more DSpark SWA prefix tails

* fix(b200): avoid TP2 loader allocation fragmentation

* perf(b200): compare DSpark prefill service at interval four

* perf(b200): compare host DSpark with larger SWA retention

* perf(b200): qualify TP2 DSpark across concurrency

* perf(b200): test more TP2 SWA prefix retention

* docs(b200): document TP2 loader memory patch waiver

* perf(b200): select DSpark curve with concurrency-scaled SWA capacity

* perf(b200): qualify stock TP2 loader with expandable allocator

* Test stock B200 loader on latest SGLang nightly

AI-assisted by gpt-6-astra with high reasoning.

* Document latest-nightly stock B200 loader qualification

* refactor: remove redundant B200 recipe startup checks

* [B300][SGLang][AgentX] Improve DeepSeek V4.1 Flash performance (#3342)

* feat(b300): add DeepSeek V4.1 SGLang nightly AgentX recipe

* fix(b300): record recipe pull request provenance

* feat(b300): add non-speculative SGLang AgentX arm

* docs: consolidate performance changelog into one PR entry

* fix(b300): preserve native DSpark FP8 draft projections

* fix(b300): normalize strided native FP8 projection inputs

* fix: restore default SGLang DSpark precision

* perf(b300): expand DSpark parallelism and interleave decode

* Launch B300 SGLang AgentX through an owned Slurm batch job

* Match B300 batch PMI environment to non-MPI container step

* Use supported PMIx container steps for B300 AgentX batch jobs

* perf(b300): scope final AgentX sweep to DSpark candidates

* Test B300 low-concurrency prefix retention and checkpoint prefetch

* Scale B300 TP4 prefix retention within measured KV budget

* Pin B300 to the September 22 SGLang nightly

* Test larger B300 TP2 KV budget for high concurrency

* Increase high-concurrency TP2 cache memory on B300

* Screen higher prefill duty for B300 TP2 DSpark

* perf(amd): tune MiniMax-M3 ATOM AgentX memory, graphs, indexer CP, and offload / 调优 MiniMax-M3 ATOM AgentX 显存、图捕获、Indexer CP 与卸载 (#3189)

* perf(minimaxm3-atom): raise util, capture the real batch sizes, add indexer CP and a TP2 offload curve

Six changes to the MiniMax-M3 MXFP4 ATOM agentic recipe, all measured on
8xMI355X against the same cc-traces replay:

- gpu-memory-utilization 0.90 -> 0.95.
- Declare cudagraph capture sizes. The stock list pads a running batch of 9 to
  16 and 17 to 32; this workload keeps only 22-41% of the offered concurrency
  in decode at any instant, so those are the batches that actually replay.
- Enable ATOM_M3_INDEXER_CP on TP4 past CONC=24. Each rank scores all four
  index heads over 1/TP of the blocks instead of one head over all of them.
- Restore EAGLE3 on the CONC=40/48 bands. The forward step is 37-41 ms with or
  without it, so dropping it handed back the whole acceptance-length multiplier.
- Route CONC=20/25/30 to the chunk-256 + ATOM_SLRU offload tier and derive
  LMCACHE_LOOKUP_SERVER_WORKER_IDS from TP instead of hardcoding four ranks.
- Spread TP2 offload ranks across NUMA nodes; pinning 256 GB/rank takes 45 min
  with both ranks on node 0 and 21 s with one per node.

Matrix: drop TP2 c5, add the TP2 c20/25/30 offload curve.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(minimaxm3-atom): drop the dead per-band knobs

The per-CONC case set MAX_NUM_SEQS, MAX_NUM_BATCHED_TOKENS and GPU_MEM_UTIL in
all seven bands and two lines later overwrote all three unconditionally: 21 of
its 49 assignments could never be read. What actually survived it was
NUM_SPEC_TOKENS, SPEC_DECODE_AL and STATE_OFFLOAD_CPU_GIB, and after restoring
EAGLE3 on 40/48 only CONC=56 differs on the first two. Collapsed to defaults
plus three overrides; STATE_OFFLOAD_CPU_GIB keeps its exact per-band values.

ATOM_ENABLE_REPLAYSSM is removed rather than collapsed: it is only read by
gdn_attn, which gates the gated-delta-net path, and MiniMax-M3 is pure
attention with no SSM layers, so the value never reached anything.

Verified by replaying every point in the amd-master matrix (19 combinations of
TP, CONC and offload) through a stubbed benchmark_lib and diffing the resulting
server argv plus every exported env var: byte-identical apart from the removed
variable.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(minimaxm3-atom): one table per concurrency, and drop the tier M3 cannot use

The hybrid offload tier is unreachable for this model. ATOM's M3 connector is
PAGE-only -- the docstring says MiniMax-M3 has no recurrent state and no SLOT
sidecar, and it raises if slot_regions is non-empty -- so OFFLOAD_STATE and the
staging knobs behind STATE_OFFLOAD_CPU_GIB never applied. Its LMCACHE_CHUNK_SIZE
is justified by "block-size(128) x dcp(8)", but this model's search space sets
no dcp-size at all. Removed, along with the comment claiming M3 carries a
per-request recurrent state. An unlisted concurrency now fails instead of
silently taking a tier that does not fit.

CONC=56 is removed for the same reason: nothing in the matrix runs it here (the
56 in this file's neighbourhood belongs to Kimi K3, which has its own script),
and it was the only band that disabled the draft model. With it gone
NUM_SPEC_TOKENS is constant, so the guard around SPEC_ARGS goes too.

The remaining per-concurrency facts now live in one table. Previously the CP
gate was a numeric comparison and the offload tier an enumeration, so adding a
concurrency above 24 would silently enable indexer CP on a point nobody
measured, while forgetting the tier failed loudly. Both are declared per band
now: the loud failure is kept, the silent one becomes a missing speedup.

Verified the same way as the previous cleanup: all 19 matrix points replayed
through a stubbed benchmark_lib, server argv and every exported env var
byte-identical.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* perf(minimaxm3-atom): spread TP4 offload ranks across NUMA nodes, move to the rocm7 nightly

Pinning 256 GB/rank with all four TP4 ranks on NUMA node 0 takes 27m08s
(12:13:10 "NUMA mapping" -> 12:40:18 "Created backend: LocalCPUBackend"); the
same pinning with TP2 split one rank per node takes 21 s. TP4 now selects
0,1,4,5 for the same reason TP2 selects 0,4. Only applied when the caller has
not already pinned a device set, and only on the offload path -- a run without
the CPU tier pins no host memory.

The image moves to the rocm7 line of ATOM's nightly release (232f62e3), which
carries the M3 dense-split work. Checked against the measured baseline rather
than assumed: triton 3.7.0 and torch 2.10.0+rocm7.2.4.git3d3aa833 are identical
to the image every number in this PR was measured on, which matters because the
rocm10.0 line of the same build carries triton 3.8.0 and that version regresses
this model's Gluon kernels. LMCache in the new image is 0.5.5rc3, not the 0.4.5
the matrix declared, so the two MiniMax-M3 offload rows are corrected; the other
models keep their own versions.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(perf): record MiniMax-M3 AgentX tuning sweep

记录 MiniMax-M3 ATOM AgentX 调优、矩阵变化、测试结果与已知 CPU DRAM 元数据限制,以便上游 PR 启动完整 AgentX sweep。

* docs(perf): link MiniMax-M3 tuning pull request

将 MiniMax-M3 ATOM AgentX 性能 changelog 的占位链接替换为上游 PR #3189。

* fix(ci): provide exact PR context to priority classifier

Supply immutable base/head revisions and the permitted diff command, document read-only tool use, and allow 16 turns for structured classification.

为优先级分类器提供确切的 Base/Head 版本及允许执行的 Diff 命令,明确只读工具用法,并将结构化分类的轮数上限调整为 16。

* ci(agentx): run MiniMax-M3 throughput only

禁用本次 changelog 的自动 vendor eval,只保留 19 个 AgentX 吞吐任务,避免为每个并发额外展开评测。

* perf(minimaxm3-atom): extend indexer CP down to CONC=15 on TP4

The gate was CONC > 24, chosen from a kernel microbenchmark over uniform
contexts. Three same-commit A/B pairs (1800 s per arm, TP4 + EAGLE3) put the
real crossover below 15:

  CONC 15   interactivity p90 +3.7%    ISL-normalised throughput +0.67%
  CONC 24                    +12.3%                              +0.24%
  CONC 28                    +16.7%                              +2.7%

Monotone and never negative. Throughput is neutral everywhere (only CONC=28
clears the 0.6% noise floor) while interactivity rises with the running batch,
which is what CP actually shortens. Prefix hit rates are identical within each
pair (96.7/96.7, 97.5/97.5, 97.2/97.3), so the gain is not a caching artifact.

CONC=20 is interpolated between the two measured points, not run on its own.
Nothing below 15 is measured and the microbenchmark is negative at batch ~2,
so the band stops there.

CONC=20 appears in both search-space rows, so it is split out of the offload
enumeration: TP4 gets CP without a tier, and the tp_size == 4 gate keeps CP off
the TP2 offload curve. 25 and 30 are TP2-only and stay without a CP
declaration, which would never take effect but would misreport the point.

Verified with the 19-point argv+env replay: the only difference against the
previous revision is ATOM_M3_INDEXER_CP="1" on tp4_c15, tp4_c20 and tp4_c24.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(perf): record expanded MiniMax-M3 indexer CP band

记录 TP4 C15/C20/C24 新增 indexer-only CP 的 A/B 证据,并说明 TP2 C20 仍由 TP-size gate 保持关闭。

* ci: restore default PR priority classifier

Revert the 16-turn exact-diff prompt so this recipe PR does not change shared sweep CI.

还原默认的优先级分类器配置,避免本配方 PR 修改共享 sweep workflow。

Co-authored-by: Cursor <cursoragent@cursor.com>

* perf(minimaxm3-atom): switch to official nightly_202609170640_minimax_m3 image

Replace the developer-named ATOM nightly so this submission uses an official tag.

将 ATOM 镜像替换为不含开发者用户名的官方 tag nightly_202609170640_minimax_m3。

Co-authored-by: Cursor <cursoragent@cursor.com>

* switch to 0917 nightly atom image

* perf(minimaxm3): enable agentic eval by removing no-evals opt-out

Drop `no-evals: true` from the minimaxm3-fp4-mi355x-atom-agentic-mtp
changelog entry so plan generation no longer skips eval rows; the
model's automatic minimax-vendor (minimax_m3_full) agentic eval then runs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(perf): correct MiniMax-M3 ATOM AgentX changelog image to nightly_202609171455

Align the perf-changelog entry with the recipe's actual image
(rocm/atom-dev:nightly_202609171455 in configs/amd-master.yaml),
replacing the stale nightly_202609170640_minimax_m3 reference in both
the English and Chinese descriptions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(minimaxm3): size LMCache CPU pool per-rank from TOTAL_CPU_DRAM_GB/TP

The cpu256 offload tier hardcoded LMCACHE_MAX_LOCAL_CPU_SIZE=256 per rank,
independent of the matrix generator's TOTAL_CPU_DRAM_GB budget. Derive it
as TOTAL_CPU_DRAM_GB / TP so the per-rank pool respects the declared budget
and is TP-independent (node_DRAM * dram-utilization / 8). Bump the atom
arm's dram-utilization 0.20 -> 0.687 so the offload arms land ~256 GB/rank.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update perf-changelog.yaml

* docs(minimaxm3): expand ATOM AgentX changelog and record EAGLE3-GQA draft online-quant finding

Update the minimaxm3-fp4-mi355x-atom-agentic-mtp changelog entry to reflect
every change in SemiAnalysisAI/InferenceX#3189 and to record the EAGLE3-GQA
draft online-quant verification:

- Raise ATOM GPU memory utilization 0.90 -> 0.95 and declare a fine-grained CUDA
  graph ladder (capture sizes 1-64) sized for the 22-41%-of-CONC running batch,
  trimmed by ModelRunner to min(2*CONC, 8192). TP4 C24 A/B: throughput +9.2%,
  interactivity +50.7%, unchanged estimated graph memory.
- Enable ATOM_M3_INDEXER_CP for TP4 C15/C20/C24/C28/C32/C40/C48; the TP-size gate
  (tp_size == sparse_num_index_heads == 4) keeps it off the TP2 C20 offload point.
  Restore EAGLE3 K3 (golden AL 2.78) at C40/C48.
- Collapse per-band knobs into one case; add the TP2 LMCache DRAM-offload curve at
  C20/C25/C30 on the chunk-256 ATOM_SLRU tier; size LMCACHE_MAX_LOCAL_CPU_SIZE as
  TOTAL_CPU_DRAM_GB/TP; cover every rank in LMCACHE_LOOKUP_SERVER_WORKER_IDS.
  Remove TP2 C5 and the unreachable hybrid/state-offload and C56 branches.
- NUMA-spread offload GPUs (0,4 for TP2; 0,1,4,5 for TP4), cutting TP2 host-memory
  pinning from 45 min to 21 s. Move to rocm/atom-dev:nightly_202609171455 and
  LMCache 0.5.5rc3+rocm7.2.4 on both offload arms.
- Set dram-utilization to 0.687 so the recorded budget matches the real ~256 GB
  per-rank pinning (512 GB total TP2, 1,024 GB TP4), independent of TP, replacing
  the earlier 0.20 metadata that under-described the allocation.
- Verified against ATOM commit b6e2a39433d73b586c366ca90e661f098eb463e3 that
  --online_quant_config ptpc_fp8 does not change the Inferact/MiniMax-M3-EAGLE3-GQA
  draft precision: eagle3_llama.py builds every draft linear (qkv_proj, o_proj,
  gate_up_proj, down_proj, fc) with no quant_config, so should_stream_online_quant
  short-circuits to False and OnlineQuantStreamer.maybe_create finds no candidates.
  The draft runs at native bf16; only the target MiniMax-M3 weights are online-
  quantized to ptpc_fp8, and exclude_layer applies to the target alone.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Wang Yiting <yitiwang@amd.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: billishyahao <bill.he@amd.com>
Co-authored-by: seungrokj <144636725+seungrokj@users.noreply.github.com>
Co-authored-by: seungrokj <seungrok.jung@amd.com>

* feat(agentx): retune GLM5.2 FP4 MI355X ATOM recipe on _0921 docker (#3359)

* feat(agentx): retune GLM5.2 FP4 MI355X ATOM recipe on _0921 docker

Signed-off-by: zhuyuhua-v <yuhzhu@amd.com>

* docs(glm5.2): note MTP block stays BF16 under --online_quant_config (PR #3359)

Changelog for the GLM-5.2 FP4 MI355X ATOM AgentX recipe retune:

- Track the updated GLM-5.2 standalone recipe (ROCm/ATOM PR 2345) on the MI355X
  ATOM AgentX config.
- Bump the image from rocm/atom-dev:nightly_202609151450 to
  rocm/atom-dev:nightly_202609211553, which carries ROCm/ATOM PR 2345.
- Drop the LMCache DRAM offload from the small-concurrency TP4 arm: conc
  [2, 4, 8, 10] moves from kv-offloading dram with the lmcache 0.4.5 backend to
  kv-offloading none, so those points serve off the native GPU prefix cache alone
  and no longer start an LMCache CPU tier. The TP4+DCP4 arm at conc
  [16, 24, 32, 40, 48] keeps LMCache at 256 GiB per rank (dram-utilization 0.171
  unchanged), and the TP8 arm stays GPU-resident as before.
- Add --index_cache_dtype fp4 and --block-size 64 to the ATOM server launch on
  every point. Neither flag was set before, so both took the ATOM default.
- Drop ATOM_USE_FLYDSL_GATHER_KV_B_PROJ=0, which pinned gather_kv_b_proj to the
  Triton path on the DCP prefill-context and MTP verify paths; the updated recipe
  no longer sets it.
- The MTP block data precision is not touched by --online_quant_config: the
  exclude_layer list adds "model.layers.78.*" so layer 78 (the GLM-5.2 MTP head)
  is skipped by online quantization and stays in native BF16, as it ships
  unquantized in amd/GLM-5.2-MXFP4. The expert excludes only reach layers 0-77,
  so without this exclude the whole MTP block would be online-quantized to
  ptpc_fp8 while the target's experts stay MXFP4.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Signed-off-by: zhuyuhua-v <yuhzhu@amd.com>
Co-authored-by: seungrokj <144636725+seungrokj@users.noreply.github.com>
Co-authored-by: seungrokj <seungrok.jung@amd.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* config(dsv41flash): sweep MI355X at TP=2 and TP=4 through concurrency 128 / MI355X DSv4.1-Flash 在 TP=2 与 TP=4 下扫描至并发 128 (#3326)

* config(dsv41flash): sweep MI355X at TP=2 and TP=4 through concurrency 128

Add a TP=2 search space next to TP=4 for the MI355X DSv4.1-Flash AgentX
entry, and extend both rows to concurrency 128. TP=2 became feasible once
the Engram tables moved to host memory: at 47.2 GiB of device memory per
rank they previously forced four GPUs per server, and two GPUs per server
doubles the servers per node.

The image moves to the ROCm 10 nightly and carries a placeholder tag until
that build is published. The digest is pinned before the sweep runs, which
is why the PR opens as a draft.

中文:为 MI355X DSv4.1-Flash AgentX 配置在 TP=4 之外新增 TP=2 搜索空间,并将两者
的并发扩展到 128。Engram 表已驻留主机内存,不再占用每 rank 47.2 GiB 设备内存
(此前这迫使每个服务器使用四张 GPU),因此 TP=2 可行,且每节点可容纳的服务器数
量翻倍。镜像切换到 ROCm 10 nightly,在该构建发布前暂用占位 tag;digest 固定后再
运行 sweep,因此本 PR 以 draft 形式提交。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(dsv41flash): record the sweep PR link in the changelog

中文:在 changelog 中记录本次 sweep 的 PR 链接。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(dsv41flash): let vLLM pick max_num_seqs for the MI355X AgentX recipe

A fixed max_num_seqs of 128 caps in-flight sequences at the outer
concurrency once the sweep reaches c128, leaving no headroom for AgentX
subagent fan-out. Use the MI355X API-server default of 1024 instead, and
derive the CUDA graph ceiling from max(2 * CONC, 128): 1024 through c64,
2048 at c128.

Supersedes PR #3111, which carried this recipe change and was closed in
favour of this sweep.

中文:扫描到 c128 时,固定的 max_num_seqs 128 会把在途序列数限制在外层并发上,
使 AgentX 子代理扇出没有余量。改用 MI355X API server 默认值 1024,并由
max(2 * CONC, 128) 推导 CUDA graph 上限:c64 及以下为 1024,c128 为 2048。
本次提交取代已关闭的 PR #3111(该 PR 原本包含此 recipe 改动)。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(dsv41flash): keep the placeholder on the existing ROCm nightly channel

Per #3215, the MI355X DSv4.1-Flash entry stays on the existing upstream
ROCm nightly channel rather than moving to nightly-rocm100. Drop the
rocm10 marker from the placeholder tag; the pin is filled in with the
nightly this sweep actually runs on before dispatch.

中文:依据 #3215,MI355X DSv4.1-Flash 条目继续使用现有的上游 ROCm nightly 渠道,
不切换到 nightly-rocm100。占位 tag 去掉 rocm10 标记;派发前再填入本次 sweep
实际运行的 nightly。

Co-authored-by: Cursor <cursoragent@cursor.com>

* Revert "config(dsv41flash): keep the placeholder on the existing ROCm nightly channel"

This reverts commit 039194e50d92a80c847d770729e106237e2b36c4.

The MI355X DSv4.1-Flash AgentX sweep runs on the ROCm 10 nightly after
all, so restore the nightly-rocm100 placeholder. The pin is filled in
with the published nightly before dispatch.

中文:还原提交 039194e50d92a80c847d770729e106237e2b36c4。

MI355X DSv4.1-Flash AgentX sweep 最终仍在 ROCm 10 nightly 上运行,因此恢复
nightly-rocm100 占位 tag。派发前再填入已发布的 nightly。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(dsv41flash): pin the MI355X AgentX sweep to the ROCm 10 nightly

Replace the placeholder with
vllm/vllm-openai-rocm:nightly-rocm100-3df4ae153eb385e27b52f26c81f8edb9e20b9984,
published 2026-09-21T05:50:03Z with digest
sha256:eccb72b74b8c04ce7406d9212e200b129f58e24be642795a857f755a94fdb3a1.
The tag is active and linux/amd64, and its manifest resolves from
registry-1.docker.io at that digest.

This sweep qualifies the new image; the previous green run on
nightly-eed1f3d0 is not evidence for it.

将占位 tag 替换为
vllm/vllm-openai-rocm:nightly-rocm100-3df4ae153eb385e27b52f26c81f8edb9e20b9984,
该镜像于 2026-09-21T05:50:03Z 发布,digest 为
sha256:eccb72b74b8c04ce7406d9212e200b129f58e24be642795a857f755a94fdb3a1。
该 tag 状态为 active、架构为 linux/amd64,其 manifest 可从
registry-1.docker.io 按该 digest 解析。

本次 sweep 用于验证新镜像;此前在 nightly-eed1f3d0 上的绿色运行不能作为其证据。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(dsv41flash): offload Engram to host memory at TP=2 on MI355X

vllm-project/vllm#57491 widened the two ROCm is_cuda() gates to
is_cuda_alike(), so the pinned nightly resolves an Engram config on
gfx950 and offloads the tables to pinned host memory by default. Set
cpu_offload explicitly per TP instead of taking that default.

TP=2 needs the offload: the tables cost 47.2 GiB per rank at TP=4, so
94.4 GiB at TP=2, which does not fit beside half of the 511 GB
checkpoint on a 288 GiB card. TP=4 keeps them resident so it stays
comparable with the validated concurrency 1-32 run.

vllm-project/vllm#57491 将 ROCm 上的两处 is_cuda() 判断放宽为
is_cuda_alike(),因此所固定的 nightly 在 gfx950 上会解析 Engram 配置,
并默认将表下放到锁页主机内存。这里按 TP 显式设置 cpu_offload,而不是
沿用该默认值。

TP=2 需要该下放:表在 TP=4 时每 rank 占用 47.2 GiB,TP=2 时为 94.4 GiB,
无法与 511 GB 检查点的一半同时放入 288 GiB 的单卡。TP=4 保持表常驻 GPU,
以便与已验证的并发 1-32 运行保持可比。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(dsv41flash): disable SWA bounded replay on MI355X

Every TP=2 and TP=4 point of run 35567570539 died with
HSA_STATUS_ERROR_MEMORY_FAULT, taking the worker and then the engine core
down and aborting AgentX warmup. The fault follows the first launch of
_pad_replayed_slots_kernel in all 16 server logs, which is the first
prefix hit carrying a replay start.

vllm-project/vllm#56227 added SWA bounded replay, default on, after the
eed1f3d0 pin and before nightly-rocm100-3df4ae153. It pads the replayed
tokens' slots in the prefix-cacheable groups, but the window clamp it
relies on landed in the FlashInfer and FlashMLA kernels; the ROCm sparse
SWA path only gained the replay_start kwarg, and consumes it on the
decode path while the fault is in prefill. Pass --no-swa-bounded-replay
until ROCm clamps too. Prefix caching itself stays on.

运行 35567570539 的所有 TP=2 与 TP=4 数据点都以
HSA_STATUS_ERROR_MEMORY_FAULT 崩溃,先后带崩 worker 与 engine core,
并中止 AgentX warmup。16 份 server 日志中,该故障均紧随
_pad_replayed_slots_kernel 的首次启动,即首个带 replay start 的前缀命中。

vllm-project/vllm#56227 在 eed1f3d0 与 nightly-rocm100-3df4ae153 之间
引入了默认开启的 SWA bounded replay。它会填充被重放 token 在可前缀缓存
分组中的 slot,但其依赖的窗口钳制只落在 FlashInfer 与 FlashMLA 内核中;
ROCm 稀疏 SWA 路径仅新增了 replay_start 参数,且只在 decode 路径消费它,
而故障发生在 prefill。在 ROCm 同样实现钳制之前传入
--no-swa-bounded-replay。前缀缓存本身保持开启。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(dsv41flash): fix the MI355X KV split at high concurrency

Concurrency 64 collapsed on both arms of run 35574132719 because the KV
pool was too small to hold the AgentX working set. TP=2 fell to a 17.6%
prefix cache hit rate, 187 s TTFT and 150 tok/s, against 94.8%, 1.3 s and
957 tok/s at c32.

Two settings were spending device memory that the KV pool needed.

The Engram tables stayed resident at TP=4. vllm-project/vllm#57491
widened the two ROCm is_cuda() gates to is_cuda_alike(), so gfx950 can
now offload them to pinned host memory as every NVIDIA arm has since
 #2963. Measured here at TP=4 with 16384 batched tokens, resident tables
leave 37.96 GiB of KV cache and 14.15x maximum concurrency at 1M
context, against 84.54 GiB and 31.52x offloaded.

The sparse-attention indexer and its companion per-rank buffers scale at
roughly 4.4 MiB per batched token, so the upstream 16384 was the larger
cost. Size it per TP instead, 4096 at TP=2 and 8192 at TP=4, and cap
max_num_seqs at the shape graph capture already covers rather than the
MI355X API-server default of 1024. TP=2 then keeps 79.34 GiB (39.44x)
and TP=4 keeps 121.03 GiB (54.15x), against the B300 arm's 132.48 GiB
(60.17x). B300 runs 8192 at TP=4 and the Blackwell TP=2 arms run 4096
(#3320, #3321).

Sweep concurrency 64 and 128 to confirm the high end first. Concurrency
1-32 is backfilled once those land, since every point now runs the new
memory split.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Signed-off-by: Fangzhou Ai <fangzhou.ai@amd.com>

* config(dsv41flash): change the MI355X memory split only where KV ran short

The previous commit applied one memory split per TP across every
concurrency. Concurrency 1-32 never ran short of KV, so it paid for
changes it did not need: offloaded Engram lookups go to pinned host
memory over UVA, and a smaller prefill chunk costs TTFT. Scope each
change to the points that were actually starved, which also leaves
concurrency 1-32 and TP=4 c64 byte-identical to the settings run
35574132719 already measured on this image and flag set, so those
points are combined with this sweep rather than re-run.

Dividing measured KV tokens by concurrency gives the per-request budget
and separates the failures cleanly. Every point that held had 232K or
more; TP=2 c64 collapsed at 122K.

  TP=4 c1-c64   resident, 16384   14.83M tokens   232K and up
  TP=4 c128     offload,   8192   49.63M           388K
  TP=2 c1-c32   offload,  16384    7.84M           245K and up
  TP=2 c64      offload,   8192   24.68M           386K
  TP=2 c128     offload,   4096   33.34M           260K

Probing the configurations directly also turned up two things. TP=2 c128
at 4096 with the API-server default of 1024 sequences faults during
profiling with HSA_STATUS_ERROR_EXCEPTION at M=1024, N=129280, K=256,
reproduced on two GPU pairs: DSpark verifies 1+5 tokens per sequence, so
a decode batch of max_num_seqs needs six times that many token slots and
4096 leaves four. Cap max_num_seqs at the graph-capture shape wherever
the chunk falls below that bound, which is TP=2 c128 alone. And the
reason c128 never completed before is that at 16384 with capture at
2048, TP=2 c128 held 7.72 GiB, 3.02M tokens, 23.6K per request.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Signed-off-by: Fangzhou Ai <fangzhou.ai@amd.com>

* config(dsv41flash): measure the full MI355X concurrency range on the new pin

* docs(dsv41flash): retire the MI355X draft status and repoint GPU validation

The MI355X section still described a draft recipe at TP4 concurrency
1-32 and cited run 34710937012 on nightly-eed1f3d0 as the pinned image.
Both predate this branch: the arm now sweeps TP4 and TP2 at concurrency
1-128 on nightly-rocm100-3df4ae15. Lead with the current pin, keep the
earlier run only as the superseded-pin note explaining why its points do
not carry onto this image, and add the merged upstream recipe #1006
beside #968.
MODELS.md and MODELS_zh.md carried a second DeepSeek-V4.1-Flash row
holding the MI355X arm as pending GPU validation. Drop it; the active
row already covers the model.

---------

Signed-off-by: Fangzhou Ai <fangzhou.ai@amd.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: functionstackx <47992694+functionstackx@users.noreply.github.com>
Co-authored-by: Chun Fang <chun.fang@amd.com>

* [AMD] Update GLM-5.2 MI355X image, HiCache capacity, and sweep / 更新 GLM-5.2 MI355X 镜像、HiCache 容量与 sweep (#3329)

* perf: update GLM-5.2 ROCm image and HiCache path

将 GLM-5.2 ROCm 镜像更新到 20260920,切换 HiCache kernel/page_first,并调整并发矩阵。

* perf: split GLM-5.2 low and high concurrency points

TP8/EP1 仅保留并发 1、2、4;TP4/EP4 HiCache 仅运行并发 12、14、16,并补充实际 PR 链接。

* Keep existing GLM-5.2 HiCache settings

* Use default GLM-5.2 HiCache backend and layout

* Add missing GLM-5.2 concurrency points

* perf: increase GLM-5.2 HiCache capacity

将 GLM-5.2 TP4/EP4 HiCache 调整为每 rank 180 GB,并将 SA DRAM 利用率提高到 0.85。

* fix changelog

---------

Co-authored-by: Chun Fang <chun.fang@amd.com>

* fix(review): bind verifier verdicts to signoffs (#3371)

让清单编辑触发验证,并按签署资源隔离验证评论。

* [TileRT] GLM-5.3 MI355X AgentX parallel KV inject experiments, reverted pending tile-ai/TileRT#66 / GLM-5.3 MI355X AgentX 并行 KV 注入实验(已回退,待 tile-ai/TileRT#66) (#3376)

* [GB300][SGLang][AgentX] Improve DeepSeek V4.1 Flash performance (#3344)

* perf(gb300): add nightly SGLang V4.1 Flash DSpark candidates

* chore(gb300): link performance changelog to PR 3344

* perf(gb300): add non-speculative SGLang AgentX candidates

* chore(gb300): consolidate performance changelog entry

* perf(gb300): resolve local SGLang checkpoint for Engram cache advice

* perf(gb300): retain native FP8 DSpark draft projections

* fix(gb300): make native draft FP8 inputs contiguous

* perf(gb300): test GPU-resident Engram tables on TP4

* Use shipped nightly DSpark precision on GB300

* Interleave GB300 STP decode with long prefills

* perf(gb300): prioritize DSpark across the AgentX curve

* perf(gb300): test larger SWA prefix cache for DSpark

* Test larger SWA cache on GB300 TP2 DSpark

* Select DSpark and scale SWA retention for the GB300 sweep

* perf(gb300): select qualified prefill capacity on latest nightly

* chore(gb300): remove documentation changes from performance PR

* [H200][SGLang][AgentX] Improve DeepSeek V4.1 Flash performance (#3341)

* perf(h200): qualify DeepSeek V4.1 Flash on latest SGLang nightly

* chore(h200): link performance qualification PR

* perf(h200): enable huge pages for Engram host shards

* perf(h200): add native non-speculative SGLang throughput arm

* chore(h200): consolidate performance changelog entry

* fix(sglang): retain native FP8 DSpark attention projections

* style(sglang): sort native projection patch imports

* chore(sglang): store context-free native projection patch

* fix(h200): make native draft FP8 inputs contiguous

* perf(h200): test GPU-resident Engram for non-speculative serving

* perf(h200): interleave STP decode with long prefix prefill

* fix: restore default SGLang DSpark precision

* perf(h200): add TP4 host Engram throughput comparison

* perf(h200): prioritize TP4 DSpark and prevent prefill starvation

* perf(h200): tune block32 kernels and extend DSpark concurrency

* perf(h200): compare native Marlin MoE with stock DSpark

* perf(h200): retain DSpark after non-speculative comparisons

* perf(h200): retain more SWA prefixes within the KV budget

* perf(h200): select measured DSpark MoE backends by TP

* perf: consolidate H200 DSpark topology and launch tuning

* perf: qualify H200 DSpark with exact EP1 baseline topologies

* perf: select complete H200 EP1 qualification grid

* fix(h200): allow full high-concurrency AgentX warmup

* [CI] select Python 3.12 for result processing / 固定结果处理 Python 3.12 (#3397)

* fix: select Python 3.12 for result processing

中文:在分配 GPU 前准备独立的结果处理 Python,并在固定序列和 AgentX 路径中显式使用;配置缺失时仍保留失败产物。

* fix: use managed Python for H200 AgentX power results

在 H200 AgentX DCGM 结果处理路径中校验并使用受管 Python 解释器,保留失败产物;补充回归测试和中英文恢复说明。

* docs(review): explicitly ban FP8 NextN MoE flag (#3403)

明确禁止启用 SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE,并同步中英文贡献指南及审阅清单。

* [TileRT] Bump GLM-5.3 FP8 MI355X AgentX to tilert 0.1.6.post2 / GLM-5.3 FP8 MI355X AgentX 升级至 tilert 0.1.6.post2 (#3389)

* [TileRT] Bump GLM-5.3 FP8 MI355X AgentX to tilert 0.1.6.post2

* Set changelog pr-link

* [MI355X][SGLang][AgentX] Improve DeepSeek V4.1 Flash performance

Add the native SGLang DeepSeek V4.1 Flash DSpark recipe for MI355X, with radix caching enabled and supported long-context memory limits.

Validated by official sweep 35943469224: six canonical performance cells and six full GSM8K evaluations. Reuse this sweep for production publication.

* [GB200][SGLang][AgentX] Improve DeepSeek V4.1 Flash performance

Qualify the native SGLang DeepSeek V4.1 Flash DSpark recipe on GB200 with radix caching and full context.

Official sweep 35876607563 passed sixteen canonical performance cells and sixteen full GSM8K evaluations across TP2/EP1 and TP4/EP1 at C1 through C128. Reuse the qualified sweep for production publication.

* [H200][SGLang][AgentX] Qualify DSpark decoder SWA bounded replay (#3392)

Enable decoder SWA bounded replay and pin the qualified SGLang nightly for H200 DSpark. Reuse full sweep 35893977246: 16 canonical performance cells and 16 complete GSM8K evaluations passed; final staging verified.

* [H100][SGLang][AgentX] Improve DeepSeek V4.1 Flash performance (#3345)

Restore the first fully qualified H100 SGLang recipe and pinned September 22 image, including TP8/EP8 and DP8 coverage. Reuse successful full sweep 35690159495. Preserve native context, prefix caching and shipped DSpark precision.

* refactor: migrate fixed-sequence recipes to SRT-Slurm / 将定长配方迁移至 SRT-Slurm (#3352)

* refactor: start native single-node SRT-Slurm migration

开始原生单节点 SRT-Slurm 迁移,添加 H200 SGLang 8k1k 并行候选配方并复用现有基准客户端;生产路由保持不变。

* docs: link single-node migration changelog to draft PR

为单节点迁移的 changelog 条目补充草稿 PR 链接。

* feat: wire native H200 SRT pilot into end-to-end workflow

将原生 H200 SRT 试点接入端到端工作流,显式校验配方、保留结果和功耗产物,并保持生产路由不变。

* test: cover native single-node job failures and artifacts

覆盖原生单节点作业的提交失败、Slurm 失败、产物保留及定向取消行为。

* fix: drop unused AIPerf inputs from SRT setup

删除 SRT 准备阶段未使用的 AIPerf 排空参数要求,使固定序列工作流能进入实际提交;新增缺省参数回归覆盖。

* fix: let native SRT stage the pilot container image

将配方指定镜像直接交给原生 SRT/Pyxis,移除试点对旧 squash 缓存就绪状态的依赖,保留模型预检查。

* fix: bootstrap native SRT binaries before pilot submission

在试点提交前执行原生 SRT 二进制准备,并覆盖准备失败时不提交作业的行为。

* feat: port H200 MTP and Qwen recipes to native SRT

将 H200 DeepSeek-R1 MTP 与 Qwen3.5 EP8 配方迁移到并行原生 SRT 试点,保留聊天模板及随并发变化的图捕获,并使用 4/16/64 逐点验证回归。

* docs: remove migration guide

移除独立迁移指南及入口链接,迁移范围与验证证据保留在 PR 中。

* feat: migrate fixed-sequence SGLang recipes to native SRT

将 H100、H200、B200 和 B300 的 21 个活跃 SGLang 定长配方及全部 181 个配置点切换到原生 SRT-Slurm。共享提交、eval 和产物处理,并保留逐点拓扑与推测解码设置。

* feat: migrate fixed-sequence TRT recipes to native SRT

将八个定长 TRT 配方迁移至原生 SRT,保留 63 个测试点的引擎参数、客户端和 eval token 预算。

* feat: convert remaining fixed-sequence recipes to native SRT

将剩余 AMD SGLang/ATOM 与 RTX 定长配方切换到原生 SRT 配置,保留测试点及服务参数;固定直接 ATOM 服务草稿依赖并扩展行为验证。

* fix: forward native Docker eval model identity

为 RTX 原生 Docker 路径显式传递 eval 模型名称,并验证实际启动器的命令、失败传播及容器清理。

* fix: apply AMD container options as native leaf overrides

按原生 SRT 语义逐项传递容器选项,增加映射行为回归测试并输出提交失败原因。

* refactor: reuse native job workspace for AMD scratch files

复用作业检出目录存放 AMD 原生运行时临时文件,由现有 runner 清理流程回收,移除额外 scratch-root 配置。

* fix: complete AMD native launch and terminal status handling

修复 AMD 原生启动命令的尾部换行,在 accounting 不可用时通过 Slurm 控制器验证终态,并等待启动失败的日志进程退出。

* refactor: require native recipes for the Slurm fixed-sequence cutover

移除 Docker 迁移支持和 50 个已被原生配方替代的定长 Bash 实现。Slurm 定长作业必须提供 SRT 配方,保留 AgentX、多节点和显式采集器的独立执行路径。

* refactor: make single-node fixed-sequence coverage SRT-only

归档仅支持 Docker 的 RTX 定长配置及脚本,移除无调用方的 runner 路由;保留历史 changelog 条目,但不为已归档的精确配置键生成作业。

* fix: allow client dependencies in container virtual environments

修复容器虚拟环境中的客户端依赖安装,移除不兼容的用户目录安装参数。

* fix: limit native single-node steps to serving GPUs

保留节点独占预留,同时将原生单节点服务和客户端步骤限制为配方指定的 GPU 数量,避免采集空闲设备功耗。

* fix: restore repository workdir for native container steps

原生容器步骤从已有仓库挂载目录启动,避免 Python 动态模块在根目录下导入失败,并保留调用方运行时覆盖。

* fix: stream AMD power samples without input buffering

逐行写出 AMD 功耗 CSV,避免 awk 输入缓冲在采样器关闭时丢失末尾数据;新增真实流式读取回归测试。

* fix: match registered H200 runner labels

将 H200 DGXC runner 清单对齐到实际注册的两位数字标签,恢复精确 smoke 选择和 sweep 调度。

* chore: pin srt-slurm submodule to main [skip ci]

* refactor(srt): return single-node migration to NVIDIA upstream

将单节点迁移切回 NVIDIA 上游 srt-slurm。ATOM 使用原生 AToMesh 及单独固定的官方路由器镜像;TRT-LLM 使用原生模型名称转发。保留 worker 镜像、服务参数、并发范围与拓扑,不增加 Bash 分支。

* chore: bump srt-slurm submodule to v2.23.2

Move the shared SRT submodule from v2.22.1 (3cbc5dd) to upstream release
v2.23.2 (8dace5f). Upstream delta is three additive changes: vllm-router
multi-node hybrid-DP rank offsets, SGLang leader IP honoring the cluster
network interface, and nsys/DSight coverage for SGLang and Dynamo. No
recipe or connector changes required; utils/ and runners/ tests pass.

* refactor(srt): check MI300X firmware in a setup hook

Replace the MI300X container preamble with a host setup hook that fails on MEC
firmware older than 177 instead of exporting HSA_NO_SCRATCH_RECLAIM in every
container.

* fix(srt): apply pending upstream srt-slurm patches at setup

Post-eval steps dropped the recipe's srun_options, so ATOM evals on
MI355X ran in a read-on…
…ud 基线预检并报告失败原因 (SemiAnalysisAI#3443)

* fix: preserve Klaud baseline preflight and classify failures

在候选任务中复用规划阶段的基线预检,并记录脱敏失败原因。

* test: recognize Git options in SRT clone fixture

让 SRT 测试夹具识别 git -c 参数后的 clone 子命令。
* feat(srt): run single-node AgentX on native srt-slurm

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.

* fix(amd): drop a duplicate DSV4 prefill key and restore the MI355X Qwen3.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.

* feat(srt): accept vLLM points in the single-node adapter

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.

* feat(agentx): port the DSV4.1 Flash B300 SGLang AgentX config to srt-slurm

* feat(agentx): let srt-slurm AgentX recipes apply the chat template client-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.

* feat(agentx): run GB200/GB300 single-node AgentX natively and port DSV4.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.

* feat(agentx): let srt-slurm AgentX recipes apply the chat template client-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.

* feat(agentx): let srt-slurm AgentX recipes apply the chat template client-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.

* feat(agentx): let srt-slurm AgentX recipes set the AIPerf benchmark grace period

The GLM-5.2 MI325X legacy script bounded the post-window drain with
--benchmark-grace-period 1800. AIPERF_BENCHMARK_GRACE_PERIOD in a
recipe's benchmark env passes it through the shared client.

* feat(agentx): port the DSV4.1 Flash B200 vLLM AgentX config to srt-slurm

* feat(srt): force ATOM AgentX golden acceptance with its server flag

ATOM pins acceptance with --spec-decode-acceptance-length rather than an
environment variable. The adapter now sets it from the golden curve for
AgentX throughput and removes it for evals, reading the draft model for the
MiniMax GQA curve and the probabilistic sampler for Kimi DSpark.

* feat(srt): accept draft_model speculation in the single-node adapter

DeepSeek-V4 configs mark their bundled DSpark draft as draft_model; the
recipe still speculates natively, so the point binds as speculative.

* fix(mi355x): mount the shared HF cache for native AgentX checkpoints

The legacy MI355X AgentX path read DeepSeek-V4-Pro (vLLM/ATOM), DeepSeek-V4.1
Flash, MiniMax-M3 and GLM-5.2-FP8 from /it-share rather than node-local NVMe.
The native srt-slurm path keeps that mount for those AgentX checkpoints.

* feat(agentx): port the Qwen3.5 MI300X SGLang AgentX config to srt-slurm

* feat(agentx): port the Qwen3.5 MI325X SGLang AgentX config to srt-slurm

* feat(agentx): port the GLM-5.2 MI325X SGLang AgentX config to srt-slurm

* feat(agentx): port the DSV4.1 Flash H100 SGLang AgentX configs to srt-slurm

* feat(agentx): port the Qwen3.5 H100 SGLang AgentX configs to srt-slurm

* feat(agentx): port the Qwen3.5 H200 SGLang HiCache EP1 AgentX config to srt-slurm

* feat(srt): accept the draft_model label for single-node DSpark points

* feat(agentx): port the DSV4.1 Flash MI300X vLLM AgentX config to srt-slurm

* feat(agentx): port the DSV4.1 Flash MI325X vLLM AgentX config to srt-slurm

* fix(srt): bind single-node draft_model and EAGLE3 AgentX points

The DSV4 B300 DSpark config labels its points spec-decoding: draft_model and
the MiniMax-M3 TRT-LLM config drafts with EAGLE3; accept both as speculative
recipes. Golden acceptance already resolves both curves.

* feat(srt): accept vLLM EAGLE3 speculation in the single-node adapter

* feat(srt): accept EAGLE3 speculation in the single-node adapter

MiniMax-M3 vLLM AgentX recipes speculate with the EAGLE3 GQA draft,
which the golden acceptance lookup already maps to minimaxm3_eagle3_gqa.

* feat(srt): accept EAGLE3 speculation in the single-node adapter

MiniMax-M3 vLLM AgentX recipes speculate with the EAGLE3 GQA draft,
which the golden acceptance lookup already maps to minimaxm3_eagle3_gqa.

* feat(agentx): port the MiniMax-M3 MI325X vLLM AgentX config to srt-slurm

* feat(agentx): port the Qwen3.5 FP4 B300 SGLang AgentX config to srt-slurm

* feat(agentx): port the Qwen3.5 FP8 B300 SGLang AgentX config to srt-slurm

* feat(agentx): port the GLM-5.2 FP4 B300 SGLang AgentX config to srt-slurm

* feat(agentx): port the GLM-5.2 FP8 B300 SGLang AgentX config to srt-slurm

* feat(agentx): port the DSV4 Pro B300 SGLang AgentX config to srt-slurm

* feat(agentx): port the MiniMax-M3 B300 TRT-LLM AgentX config to srt-slurm

* fix(b300): serve Qwen3.8-Flash-Next NVFP4 natively from the writable model root

The checkpoint is not staged on node-local NVMe; the legacy AgentX path
downloads it to the shared writable model directory.

* feat(agentx): port the Qwen3.8-Flash-Next FP4 B300 SGLang AgentX config to srt-slurm

* feat(srt): accept draft_model speculation in the single-node adapter

DeepSeek-V4 configs mark their bundled DSpark draft as draft_model; the
recipe still speculates natively, so the point binds as speculative.

* feat(srt): force ATOM AgentX golden acceptance with its server flag

ATOM pins acceptance with --spec-decode-acceptance-length rather than an
environment variable. The adapter now sets it from the golden curve for
AgentX throughput and removes it for evals, reading the draft model for the
MiniMax GQA curve and the probabilistic sampler for Kimi DSpark.

* fix(mi355x): mount the shared HF cache for native AgentX checkpoints

The legacy MI355X AgentX path read DeepSeek-V4-Pro (vLLM/ATOM), DeepSeek-V4.1
Flash, MiniMax-M3 and GLM-5.2-FP8 from /it-share rather than node-local NVMe.
The native srt-slurm path keeps that mount for those AgentX checkpoints.

* feat(srt): accept draft-model labeled speculation in the single-node adapter

The DSV4 B200 vLLM AgentX matrix labels its native DSpark drafter
draft_model rather than mtp.

* feat(agentx): port the DSV4.1 Flash H100 and H200 vLLM AgentX configs to srt-slurm

* feat(agentx): port the MiniMax-M3 H100 and H200 vLLM AgentX configs to srt-slurm

* feat(agentx): port the Qwen3.5 MI355X SGLang AgentX config to srt-slurm

* feat(agentx): port the DSV4.1 Flash MI355X SGLang AgentX config to srt-slurm

* feat(agentx): port the GLM-5.2 FP4 MI355X SGLang AgentX config to srt-slurm

* feat(agentx): port the GLM-5.2 FP8 MI355X SGLang AgentX config to srt-slurm

* feat(agentx): port the DSV4 MI355X SGLang AgentX config to srt-slurm

* feat(agentx): port the DSV4 MI355X ATOM AgentX config to srt-slurm

* feat(agentx): port the GLM-5.2 MI355X ATOM AgentX config to srt-slurm

The DCP4 LMCache entry stays on the legacy script: srtctl reserves ATOM's
kv-transfer-config for disaggregated workers.

* feat(agentx): port the Kimi-K3 MI355X ATOM AgentX config to srt-slurm

The DCP8 LMCache entries stay on the legacy script: srtctl reserves ATOM's
kv-transfer-config for disaggregated workers.

* feat(agentx): port the MiniMax-M3 MI355X ATOM AgentX config to srt-slurm

The LMCache entries stay on the legacy script: srtctl reserves ATOM's
kv-transfer-config for disaggregated workers.

* feat(srt): accept EAGLE3 speculation in the single-node adapter

* feat(agentx): port the DSV4.1 Flash B300 vLLM AgentX config to srt-slurm

* feat(agentx): port the MiniMax-M3 B200 and B300 vLLM AgentX configs to srt-slurm

* feat(agentx): port the DSV4 B200 and B300 vLLM AgentX configs to srt-slurm

* feat(agentx): port the Qwen3.5 FP4 B200 SGLang AgentX config to srt-slurm

* feat(agentx): port the Qwen3.5 FP8 B200 SGLang AgentX config to srt-slurm

* feat(agentx): port the Qwen3.8 Next FP4 B200 SGLang AgentX config to srt-slurm

* fix(h100): point native single-node uv caches at shared NFS

* feat(agentx): port the GLM-5.2 FP4 B200 SGLang AgentX config to srt-slurm

* feat(agentx): port the GLM-5.2 FP8 B200 SGLang AgentX config to srt-slurm

* feat(agentx): port the DSV4 FP4 B200 SGLang AgentX config to srt-slurm

* feat(agentx): port the MiniMax-M3 FP4 B200 TRT-LLM AgentX config to srt-slurm

* feat(agentx): let srt-slurm AgentX recipes set the AIPerf benchmark grace period

The GLM-5.2 MI325X legacy script bounded the post-window drain with
--benchmark-grace-period 1800. AIPERF_BENCHMARK_GRACE_PERIOD in a
recipe's benchmark env passes it through the shared client.

* feat(agentx): port the DSV4.1 Flash GB200 and GB300 vLLM AgentX configs to srt-slurm

* feat(agentx): port the MiniMax-M3 MI300X vLLM AgentX config to srt-slurm

The LMCache DRAM point starts one MP server per TP rank from a setup
script inside the worker container, as the legacy script did.

* feat(agentx): port the DSV4.1 Flash MI355X vLLM AgentX config to srt-slurm

* feat(agentx): port the MiniMax-M3 MI355X vLLM AgentX config to srt-slurm

* feat(srt): accept vLLM decode context parallelism and non-drafting points in the single-node adapter

Kimi-K3 B300 serves TP8 with decode-context-parallel-size 8, and stops
drafting above conc 16 while its matrix labels every point mtp; such a
variant declares SPEC_DECODING in its benchmark env.

* feat(agentx): port the Kimi-K3 B300 vLLM AgentX config to srt-slurm

* feat(agentx): port the Kimi-K3 MI355X vLLM AgentX DCP1 points to srt-slurm

The DCP8 no-draft points keep the legacy script: the single-node
adapter requires DCP_SIZE=1 and speculation matching the matrix label.

* fix(matrix): read node counts from named srt-slurm override variants

recipe_node_count returned None for any CONFIG_FILE carrying a selector,
so rows pointing at `file.yaml:override_<name>` fell back to the master
topology estimate. Resolve `base` and `override_<name>` the way srtctl
does (deep merge, null deletes, top-level schema carried into the
variant) so the recipe allocation stays authoritative. Zip groups and
non-schema-2 variant files keep the estimate.

* refactor(agentx): consolidate DSV4 multi-node AgentX recipes into override variants

Each per-configuration recipe becomes an `override_<name>` block over a
shared `base` in one `*-variants.yaml` per master-config entry, and the
master entries select it with `CONFIG_FILE=...:override_<name>`. Every
selected variant resolves, through the pinned srtctl, to exactly the
recipe it replaces, including its original `name`. Power recipes with
top-level telemetry stay standalone because launchers detect them as text.

* refactor(agentx): consolidate GLM-5.2 multi-node AgentX recipes into override variants

Each per-configuration recipe becomes an `override_<name>` block over a
shared `base` in one `*-variants.yaml` per master-config entry, and the
master entries select it with `CONFIG_FILE=...:override_<name>`. Every
selected variant resolves, through the pinned srtctl, to exactly the
recipe it replaces, including its original `name`. Power recipes with
top-level telemetry stay standalone because launchers detect them as text.

* refactor(agentx): consolidate Kimi-K3 GB200 AgentX recipes into override variants

Each per-configuration recipe becomes an `override_<name>` block over a
shared `base` in one `*-variants.yaml` per master-config entry, and the
master entries select it with `CONFIG_FILE=...:override_<name>`. Every
selected variant resolves, through the pinned srtctl, to exactly the
recipe it replaces, including its original `name`. Power recipes with
top-level telemetry stay standalone because launchers detect them as text.

* refactor(agentx): consolidate MiniMax-M3 multi-node AgentX recipes into override variants

Each per-configuration recipe becomes an `override_<name>` block over a
shared `base` in one `*-variants.yaml` per master-config entry, and the
master entries select it with `CONFIG_FILE=...:override_<name>`. Every
selected variant resolves, through the pinned srtctl, to exactly the
recipe it replaces, including its original `name`. Power recipes with
top-level telemetry stay standalone because launchers detect them as text.

* refactor(agentx): consolidate Qwen3.5 multi-node AgentX recipes into override variants

Each per-configuration recipe becomes an `override_<name>` block over a
shared `base` in one `*-variants.yaml` per master-config entry, and the
master entries select it with `CONFIG_FILE=...:override_<name>`. Every
selected variant resolves, through the pinned srtctl, to exactly the
recipe it replaces, including its original `name`. Power recipes with
top-level telemetry stay standalone because launchers detect them as text.

* docs(recipes): describe AgentX override-variant bundles

* feat(agentx): port the DSV4 MI355X vLLM AgentX config to srt-slurm

The DEP8 points run behind srt-slurm's vLLM Router frontend with
consistent-hash session routing, as the legacy script's router did.

* fix(agentx): give the MiniMax-M3 Hopper Mooncake master time to install

* fix(agentx): give the AMD SGLang AgentX recipes an hour to become healthy

The MI300X Qwen3.5 server needed ~27 minutes to load and finish
first-request kernel tuning, past srt-slurm's 1800 s default.

* fix(agentx): extend the DSV4.1 Flash H100 SGLang health window for cold NFS loads

* fix(agentx): extend the MiniMax-M3 H100 vLLM load window for cold NFS loads

* fix(h100): keep one uv cache per runner for native single-node jobs

* fix(b300): give srt-slurm jobs the workflow time limit instead of srtctl's one hour

The B300 profile set no default_time_limit, so srtctl submitted native
single-node AgentX jobs with --time=01:00:00 and a c32 point timed out.

* fix(agentx): report RDMA port states when the Kimi-K3 B300 Mooncake rail probe fails

* fix(mi355x): let native single-node points use a squash staged on /it-share

Node-local /var/lib/squash is not visible from the runner host, so native
points always pulled the image, which fails once a nightly tag is pruned.

* fix(agentx): probe DSXE rdmap RDMA rails for the Kimi-K3 B300 Mooncake store

* fix(srt): let single-node AgentX evals run without a fixed-sequence context

* fix(srt): evaluate single-node AgentX points with the workflow's framework at native context

The single-node post-eval required MAX_MODEL_LEN and forced lm-eval, but
benchmark_lib clears MAX_MODEL_LEN for AgentX, so every AgentX eval-only
point failed. AgentX now runs run_eval as the multi-node post-eval does.

* fix(b300): download Qwen3.8-Flash-Next NVFP4 into the shared HF cache

The checkpoint is staged neither on node-local NVMe nor in the writable
model root, so native jobs resolve it by HF id like the other launchers.

* fix(srt): stage single-node AgentX eval artifacts once

* fix(srt): stage single-node AgentX eval artifacts once

* fix(b300): read models without node-local staging from the shared model root

DeepSeek-V4.1-Flash is not in STAGED_MODELS and exists on /scratch only on
some nodes, so native points failed wherever it was missing.

* fix(agentx): give GB200/GB300 DSV4.1 Flash servers a two-hour health budget

Cold weight loading from the shared HF cache plus graph capture took just
under 30 minutes on GB200 TP2, past srt-slurm's 1800 s default.

* chore(agentx): keep the pruned-image MI355X vLLM configs on their legacy scripts

Their nightly images are gone from Docker Hub; the legacy path still runs
from node-local squashes. The recipes stay in place for when a squash is
staged on /it-share.

* fix(agentx): give the DSV4.1 Flash GB200 and GB300 vLLM recipes a two-hour readiness window

* fix(agentx): let Mooncake pick the GID on DSXE InfiniBand rails for Kimi-K3 B300

* fix(agentx): give the MiniMax-M3 B300 TRT-LLM server a two-hour health budget

* style(agentx): write srt-slurm recipe overrides as block YAML

Content is unchanged; flow mappings in override variants become block
mappings. vLLM compilation/kv-transfer/speculative configs stay quoted JSON
strings, which srtctl passes to vLLM verbatim.

* fix(agentx): give the Qwen3.8-Flash-Next B300 SGLang server a two-hour health budget

* fix(srt): keep GLM-5.2's 150-step SWE-bench budget for single-node AgentX evals

The legacy GLM-5.2 scripts raised SWEBENCH_AGENT_STEP_LIMIT to 150 for
eval-only runs. srt-slurm's post-eval only sees the runner's environment,
so the recipe cannot set it; srt_eval.sh does.

* fix(agentx): give the MiniMax-M3 B200 TRT-LLM server a two-hour health budget

* fix(b200): default the Qwen3.8-Flash-Next NVFP4 path when no pool setting names it

* chore(minimaxm3): drop the vLLM SimpleCPUOffload patch

The MiniMax-M3 B200/B300 DRAM points no longer patch vLLM's SimpleCPUOffload
worker. The pinned nightly is pruned, so these points cannot run until the
image moves to a build that no longer needs the patch (see SemiAnalysisAI#3131, SemiAnalysisAI#3132, SemiAnalysisAI#3435).

* style(srt): format single-node adapter

按 Ruff 格式化单节点适配器。

---------

Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>
… nightly / 将 Kimi-K3 MI355X vLLM 镜像刷新至 2026-09-24 的 ROCm 10.0 nightly (SemiAnalysisAI#3419)

* config(kimik3): refresh MI355X vLLM image to the 2026-09-24 ROCm 10.0 nightly

Repin kimik3-fp4-mi355x-vllm-agentic-mtp from nightly-rocm100-af1c0149
to nightly-rocm100-7f1a5398 and re-measure all 9 points. Only the image
changes; the search space and kimik3_fp4_mi355x_mtp.sh are untouched.

The old pin is from 2026-09-16 and the new one is 441 commits ahead,
carrying Kimi-K3 fixes vllm-project/vllm#51483, #57098 and #57430 plus
ROCm CPU KV-offload work this arm exercises above concurrency 4.

将 kimik3-fp4-mi355x-vllm-agentic-mtp 的镜像由 nightly-rocm100-af1c0149
更新为 nightly-rocm100-7f1a5398,并重新测量全部 9 个数据点。本次仅更换镜像,
搜索空间与 kimik3_fp4_mi355x_mtp.sh 均未改动。

旧镜像切出于 2026-09-16,新镜像领先 441 个提交,包含 Kimi-K3 修复
vllm-project/vllm#51483、#57098 与 #57430,以及本臂在并发大于 4 时会使用的
ROCm CPU KV 卸载改动。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(kimik3): point the changelog entry at PR 3419

Replace the XXX placeholder now that the PR exists.

在 PR 建立后,将 changelog 条目中的 XXX 占位符替换为实际链接。

Co-authored-by: Cursor <cursoragent@cursor.com>

* config(kimik3): refresh MI355X vLLM image to the 2026-09-24 ROCm 10.0 nightly

Refresh the image on kimik3-fp4-mi355x-vllm-agentic-mtp and re-sweep it.
The image: line is the only change; the search space and
benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh are untouched
(nine points, same curve shape: TP8 conc 1/4 GPU-resident KV, conc
8/10/12/14 on vllm-simple DRAM offload, conc 44/48/70 on TP8/DCP8
vllm-simple).

Old pin nightly-rocm100-af1c0149 (vLLM main 2026-09-16), new pin
nightly-rocm100-7f1a5398 (vLLM main 2026-09-24), 441 commits apart.
The jump carries three Kimi-K3 correctness fixes (vllm#51483, #57098,
#57430) plus ROCm CPU KV-offload work (vllm#57160) exercised by the seven
SimpleCPUOffloadConnector points above conc 4. This sweep is the
qualification for the new image.

Data type preserved: this image bump does not change the DSpark draft
model data type. The script is unchanged; the draft loads unmodified from
the published Inferact/Kimi-K3-DSpark checkpoint via --speculative-config
(model=Inferact/Kimi-K3-DSpark, method=dspark). The only dtype in that
speculative-config is kv_cache_dtype=fp8, which sets the draft KV-cache
storage precision, not the draft weights. No flag overrides or
re-quantizes the draft-model weights, so the draft dtype is preserved
from its checkpoint across this re-sweep.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: seungrokj <144636725+seungrokj@users.noreply.github.com>
Co-authored-by: seungrokj <seungrok.jung@amd.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…benchmarks/single_node/agentic (SemiAnalysisAI#3460)

SemiAnalysisAI#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>
Single-node AgentX runs as native srt-slurm recipes since SemiAnalysisAI#3428, and SemiAnalysisAI#3460
removed the unused scripts. Delete the rest of the legacy folder.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…sAI#3464)

Every active single-node fixed-sequence config runs as an srt-slurm recipe
since the SRT-only cutover (2026-09-22); only deprecated/ scripts remained,
and nothing executes or sources them.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… delete configs/deprecated and amd_utils/deprecated (SemiAnalysisAI#3463)

* [Klaud Cold] Remove everything that pointed at the deleted benchmarks/single_node/agentic

reached it:
- Drop the 17 search-space entries without srt-recipe: six configs that were
  entirely bash-based (both B300 Qwen3.5 power A/B keys, qwen3.8next H100,
  Kimi-K3 and MiniMax-M3 MI355X vLLM, DSv4.1 Flash MI355X ATOM) and the ATOM
  LMCache DRAM-offload arms of Kimi-K3, MiniMax-M3 and GLM-5.2 on MI355X.
- Remove the dead dsv41flash bash branches in the GB200/GB300 launchers and
  the MiniMax-M3 ATOM script special case in the MI355X launcher.
- Restore the DSv4.1 Flash H100/H200 block32 installers and kernel configs
  under benchmarks/multi_node/srt-slurm-recipes/configs/dsv41flash-block32/
  and repoint the setup scripts, which the live single-node H100/H200 SGLang
  AgentX recipes run and SemiAnalysisAI#3461 broke.
- Point docs and comments at the srt-slurm recipes and srt_agentic.sh.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Drop the DSv4.1 Flash H100/H200 block32 kernel tilings instead of restoring them

Per review: do not re-add the block32 installers and kernel configs.
Remove the restored dsv41flash-block32 assets, the two block32 setup scripts,
the recipes' setup_script entries and the H200 DSV41_BLOCK32_TP env vars; the
H100/H200 SGLang AgentX recipes now run with SGLang's default tilings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Drop the KLAUD_DEBUG script pointer (fixed_seq_len is deleted in SemiAnalysisAI#3464)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Delete configs/deprecated and drop remaining fixed_seq_len pointers

- Delete configs/deprecated/{amd,nvidia}-master.yaml; nothing reads them.
  AGENTS.md, docs/configuration-procedures and the Claude review prompt now
  say retired entries are deleted, with git history and perf-changelog.yaml
  as the record.
- Rewrite the add-model-hardware playbook and configuration procedures for
  srt-slurm recipes instead of bash scripts under fixed_seq_len/.
- Point MODELS links, the KLAUD_DEBUG example and a deprecated multi-node
  comment away from the deleted folders.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Delete benchmarks/multi_node/amd_utils/deprecated

Nothing loads these archived AMD server-registry files or glm5_setup.sh;
the live registries are the models*.yaml and node_excludes.yaml beside
them. configuration-procedures now says retired AMD registry entries are
deleted rather than moved into deprecated/.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Revert the docs/waiver/2508.md edit

Leave the historical waiver record unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…3467)

Nothing resolves or sources these 12 retired multi-node scripts. Drop the
configuration-procedures link to the llmd-vllm wrapper (it pointed at a path
that no longer existed) and reword the ATOM agentic comment that named its
retired SGLang sibling.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
)

Remove 20 unused recipe files without changing active or deprecated config references. Generated matrices are unchanged.\n\n删除 20 个未引用的 srt-slurm 配方文件,不修改活动或已弃用配置的引用,生成矩阵保持不变。

Co-authored-by: functionstackx <47992694+functionstackx@users.noreply.github.com>
…#3469)

* [Klaud Cold] Remove the inferencemax-repos MCP server

Delete the vLLM/SGLang source MCP server added in SemiAnalysisAI#494 (.claude/mcp,
.mcp.json, .github/mcp-ci.json) and everything wired to it: the
--mcp-config/allowedTools entries and INFERENCEMAX_ROOT env in the Claude and
CODEOWNER sign-off workflows, the prompt sections that told reviewers to use
it, the CI compatibility step and path triggers, the mcp dependency group
(uv.lock regenerated with uv 0.12.16; deletions only), and the docs. The
fetch MCP server used by those workflows is unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Drop the empty env block left in the Claude review step

INFERENCEMAX_ROOT was its only entry; an empty env: is null and fails the
workflow schema (Zizmor: jobs.review.steps.3.env null).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…emiAnalysisAI#3471)

* [Klaud Cold] Remove Kimi-K2.5, Kimi-K2.6 and Kimi-K2-Thinking

Delete every Kimi K2-family asset and reference outside MODELS.md and the
append-only perf-changelog:
- multi-node srt-slurm recipes: kimik2.5/vllm (GB200/GB300) and kimik2.6/vllm (B200)
- the retained Kimi-K2.5 SPEED-Bench collector, its EAGLE3 golden AL file and
  README rows, its CI priority score, the kimik2.5 eagle3 special case in
  synthetic_acceptance, the gsm8k threshold, the run-sweep criteria enum value,
  and the Kimi-K2.6-NVFP4 B300 staging entry and SRT model alias
- the Kimi-K2-Thinking suite at the top of experimental/token_position_decode_slo
- 516 kimik2.5 entries from the OperatorX testlists
- stale comments and README/KLAUD_DEBUG mentions

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Keep Kimi K2.5/K2.6/K2-Thinking material under experimental/

Restore the Kimi-K2-Thinking token_position_decode_slo suite, the OperatorX
kimik2.5 testlist entries and the testlist generator comments.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Keep the Kimi K2.5 news line in README

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…miAnalysisAI#3472)

Remove the runner-registration screenshot and its embed in RUNNER_SETUP.md;
the step's text and link to the registration page remain.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… GLM-5/GLM-5.1 recipes (SemiAnalysisAI#3473)

Delete the multi-node srt-slurm 8k1k recipes for DSv4 (SGLang/TRT-LLM/vLLM)
and MiniMax-M3 (vLLM), and all glm5/ and glm5.1/ recipes. DSR1 and Qwen3.5
8k1k recipes stay. Remove glm5.1-fp8-b200-tilert-agentic, whose only recipe
was glm5.1/tilert/b200-fp8.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
)

删除 infx 迁移后已无调用方的 utils 包装文件,并同步更新中英文文档。保留工作流、恢复命令和兼容性测试仍在使用的入口。
…anary 选择 (SemiAnalysisAI#3462)

* fix(ci): run AgentX canary before sweep fan-out

将单节点 AgentX 吞吐量任务纳入 Canary 选择,沿用场景和运行时长,并从后续矩阵移除已选任务。

* fix(ci): gate multi-node AgentX sweeps with a canary

为多节点 AgentX 扫描添加 Canary 门禁。
functionstackx and others added 28 commits October 13, 2026 00:35
…I#3952)

为 NVIDIA 模型与框架组合增加官方配方概览缺失警告,排除非 NVIDIA 硬件,并更新发布器与测试。
…e points / DSv4.1-Flash ATOM AgentX 更新至 1012 nightly 并去掉五个点 (SemiAnalysisAI#3928)

* perf(amd): bump DSv4.1-Flash ATOM AgentX to 1012 nightly and drop four points

Move dsv41flash-fp4-mi355x-atom-agentic-dspark to
rocm/atom-dev:nightly_202610121516 (ATOM a0527c9db) and drop TP2 c5/c128
and TP4 c4/c6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore: set perf-changelog pr-link to SemiAnalysisAI#3928

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(amd): drop DSv4.1-Flash ATOM TP4 concurrency 5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(amd): align DSv4.1-Flash ATOM AgentX 1012 nightly changelog with the diff

- Update the image from rocm/atom-dev:nightly_202610100929 to nightly_202610121516 (digest sha256:a60811a8467b43e3e50e9e9eb8cec34f68b7bca03f8c6dbd6a0ff813dde49d4c; ATOM 0.1.8.dev29+ga0527c9db, ROCm 7.2.4) and update model.container and the AToMesh frontend image to match.
- Drop TP2 concurrency 5 and 128 and TP4 concurrency 4, 5 and 6. TP2 runs concurrency 1, 2, 4, 6, 8, 16, 32 and 64 and TP4 runs 1, 8 and 32: 11 points instead of 16.
- Server settings are unchanged. Upstream recipes/DeepSeek-V4.1-Flash-Agentic.md is identical between 73defd9b8 and a0527c9db.
- ROCm/ATOM#2545 reworks decoder SWA bounded replay to follow the V4.1 report: the forward that finishes a prompt runs the encoder (layers 0-19) and layer 20's compression on every row, layers 20-38 on the last 128 rows with their windows truncated there, and layer 39 on the last row only.
- ROCm/ATOM#2545 also turns on encoder SWA bounded replay by default: a prefix hit rebuilds the encoder's sliding-window state by recomputing one KV page below the hit instead of reading a state checkpoint, and no state checkpoints are kept. The DeepSeek-V4.1 KV page, which is also the prefix-cache hash block, drops from 256 to 128 tokens.
- ATOM's mono decode path (on by default) now takes any decode step of up to 48 rows, i.e. concurrency 1-8 with five DSpark drafts, not only DSpark verify steps. Steps of 12 or more rows that are a multiple of TP run its sublayers token-parallel, with reduce-scatters instead of all-reduces. The draft runner never runs token-parallel.
- No data-type or precision change to the DSpark draft. The checkpoint's bundled mtp.0-2 stages are stored like the target's layers: FP8 E4M3 weights with 32x32 UE8M0 block scales for the attention projections, shared experts and main_proj; MXFP4 routed experts; BF16 norms, router gate, Markov head and confidence head; F32 attention sinks and hc mixers. ATOM builds the draft with the target's native_quant_config() and make_v4_quant_config(), with no online quantization in this recipe, so it runs as shipped: FP8 activations on the FP8 GEMMs and the target's BF16 KV cache. Between 73defd9b8 and a0527c9db only the rows the draft reads under bounded replay change.

- 镜像从 rocm/atom-dev:nightly_202610100929 更新为 nightly_202610121516(digest sha256:a60811a8467b43e3e50e9e9eb8cec34f68b7bca03f8c6dbd6a0ff813dde49d4c;ATOM 0.1.8.dev29+ga0527c9db,ROCm 7.2.4),model.container 和 AToMesh frontend 镜像同步更新。
- 去掉 TP2 的并发 5 和 128,以及 TP4 的并发 4、5 和 6。TP2 跑并发 1、2、4、6、8、16、32 和 64,TP4 跑 1、8 和 32:共 11 个点,原来是 16 个。
- server 参数不变。上游 recipes/DeepSeek-V4.1-Flash-Agentic.md 在 73defd9b8 和 a0527c9db 之间没有改动。
- ROCm/ATOM#2545 按 V4.1 报告重写了 decoder SWA bounded replay:完成 prompt 的那次 forward 对所有行运行 encoder(第 0-19 层)和第 20 层的压缩,第 20-38 层只算最后 128 行并在此截断窗口,第 39 层只算最后一行。
- ROCm/ATOM#2545 还默认开启 encoder SWA bounded replay:前缀命中时,从命中点下方重算一个 KV page 来重建 encoder 的滑动窗口状态,不再读取 state checkpoint,也不再保留 state checkpoint。DeepSeek-V4.1 的 KV page(也是前缀缓存的 hash block)从 256 降为 128 个 token。
- ATOM 的 mono decode 路径(默认开启)现在接管任何不超过 48 行的 decode step(五个 DSpark draft 时对应并发 1-8),不再只限于 DSpark verify step。行数不少于 12 且为 TP 倍数的 step 以 token 并行运行子层,用 reduce-scatter 代替 all-reduce。draft runner 从不使用 token 并行。
- DSpark draft 的数据类型和精度不变。checkpoint 自带的 mtp.0-2 与 target 层的存储方式相同:attention 投影、shared experts 和 main_proj 为 FP8 E4M3 权重加 32x32 UE8M0 block scale;routed experts 为 MXFP4;norm、router gate、Markov head 和 confidence head 为 BF16;attention sink 和 hc mixer 为 F32。ATOM 用与 target 相同的 native_quant_config() 和 make_v4_quant_config() 构建 draft,本 recipe 没有 online quantization,因此 draft 按原样运行:FP8 GEMM 使用 FP8 激活,KV cache 与 target 相同为 BF16。在 73defd9b8 和 a0527c9db 之间,只有 bounded replay 下 draft 读取的行发生变化。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: seungrokj <144636725+seungrokj@users.noreply.github.com>
Co-authored-by: seungrokj <seungrok.jung@amd.com>
… --monokernel on the latest ROCm 10.0 nightly / [AMD][MI355X] DSv4.1 Flash vLLM:在最新 ROCm 10.0 nightly 上启用 SWA bounded replay 与 --monokernel 并重测 (SemiAnalysisAI#3959)

* perf(amd): re-sweep DSv4.1-Flash MI355X vLLM AgentX with SWA bounded replay and --monokernel / DSv4.1-Flash MI355X vLLM AgentX 启用 SWA bounded replay 与 --monokernel 并重测

Bump the image to nightly-rocm100-5555a2d8f7116b2b4877f66516f4128176cf722a, which contains vllm-project/vllm#59039 and #61082. Drop --no-swa-bounded-replay and replace VLLM_ROCM_MONO_DECODE=1 with --monokernel.

镜像更新至 nightly-rocm100-5555a2d8f7116b2b4877f66516f4128176cf722a,包含 vllm-project/vllm#59039 与 #61082。移除 --no-swa-bounded-replay,并用 --monokernel 取代 VLLM_ROCM_MONO_DECODE=1。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(changelog): point the perf-changelog entry at PR 3959 / 将 perf-changelog 条目指向 PR 3959

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* docs(changelog): describe the DSv4.1-Flash MI355X vLLM re-sweep from the diff

- Update the image from nightly-rocm100-7d0b4e57aac4c4323225b0eee9ae960ce75ffffe to nightly-rocm100-5555a2d8f7116b2b4877f66516f4128176cf722a, the 2026-10-13 ROCm 10.0 nightly, which contains vllm-project/vllm#59039 and #61082. Update model.container to match.
- No point changes: concurrency 1, 2, 4, 8, 16, 32 and 64 on TP2 and TP4 (14 points), all re-measured on the new image.
- Remove --no-swa-bounded-replay, which turns on decoder SWA bounded replay from vllm-project/vllm#59039: in eager prefill steps, layer 20 (the last KV source layer) writes its KV for every token, and the rest of layer 20 and layers 21-39 run on each request's last 128 tokens only. Prefix-cache SWA replay stays off, since vLLM still forces it off on ROCm (the window clamp it needs lives only in the FlashInfer and FlashMLA prefill kernels).
- Replace VLLM_ROCM_MONO_DECODE=1 with --monokernel. vllm-project/vllm#61082 moves the switch to KernelConfig.monokernel and removes the environment variable, so the old setting would leave the mono decode kernels off.
- vllm-project/vllm#61082 also runs all 40 backbone layers whole as two persistent launches. Before, 30 ran whole and the other 10 (layers 0 and 1 and the compressor / indexer layers 2, 8, 14, 20, 24, 28, 32 and 36) kept vLLM's attention plus the FFN launch. The step limit is unchanged at 48 rows, i.e. concurrency 1-8 with five DSpark drafts; larger steps take the regular path.
- No data-type or precision change to the DSpark draft. The checkpoint's bundled mtp.0-2 stages are stored like the target's layers: FP8 E4M3 weights with 32x32 UE8M0 block scales for the attention projections, shared experts and main_proj; MXFP4 routed experts; BF16 norms, router gate, Markov head and confidence head; F32 attention sinks and hc mixers. vLLM builds the draft with the checkpoint's own quantization config (get_draft_quant_config) and, with no kv_cache_dtype in speculative-config, the target's fp8_ds_mla KV cache, so it runs as shipped. The mono decode kernels skip the draft layers, and the draft load path is the same in 7d0b4e57 and 5555a2d8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: seungrokj <seungrok.jung@amd.com>
…emiAnalysisAI#3973)

中文:power_model 的改动须附带 InferenceX-app 移植版的配套 PR,并互相链接。
…200 Dynamo-SGLang MTP 配置 (SemiAnalysisAI#2594)

* feat(config): add Qwen3.5 FP4 GB200 Dynamo-SGLang MTP

新增 Qwen3.5 FP4 GB200 Dynamo-SGLang MTP 配置。

* chore(changelog): link PR SemiAnalysisAI#2594

在性能变更日志中补充 PR SemiAnalysisAI#2594 链接。

* fix(changelog): link PR SemiAnalysisAI#2594 to Qwen3.5 entry

将 PR SemiAnalysisAI#2594 链接补充到对应的 Qwen3.5 变更日志条目。

* Migrate Qwen3.5 GB200 recipes to srt-slurm schema 2

Applied srtctl migrate from the srt-slurm commit pinned by main; resolved prefill/decode nodes, workers, env, engine args, frontend, model and benchmark settings are unchanged.

---------

Co-authored-by: hshrivastava-droid <hshrivastava@nvidia.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Ankur-singh <ankusingh@nvidia.com>
…ith DEP2 and TP4 EP1 / [AgentX] GB300 DSV4.1 Flash SGLang:升级 20261012 nightly,精简为 7 个点(DEP2、TP4 EP1) (SemiAnalysisAI#3859)

* perf(agentx): fold DSpark sampling and retune c64/c128 for GB300 DSV4.1 Flash SGLang

Bump the image to nightly-dev-cu13-20260929-79cafec0 and set
SGLANG_DSPARK_FOLDED_SAMPLING=2 on every point: the AUTO default keeps
DSpark draft sampling eager for DeepSeek-V4.1 TP shards, which left
low-concurrency decode launch-bound. Run TP4 c64 with 8K chunks and a
16-step prefill-decode interval, and let TP2 c128 admit all 128 sessions
with a 4-step interval and mem-fraction-static 0.85.

中文:将镜像升级到 nightly-dev-cu13-20260929-79cafec0,并在所有点上设置
SGLANG_DSPARK_FOLDED_SAMPLING=2:AUTO 默认值对 DeepSeek-V4.1 的 TP 分片
保持 DSpark draft 采样为 eager 执行,导致低并发 decode 受 kernel 发射限制。
TP4 c64 改为 8K prefill chunk 与 16 步 prefill-decode interval;TP2 c128
接纳全部 128 个会话,使用 4 步 interval 与 mem-fraction-static 0.85。

* chore(changelog): link the GB300 DSV4.1 Flash SGLang entry to SemiAnalysisAI#3782

中文:将 GB300 DSV4.1 Flash SGLang 的 changelog 条目链接到 SemiAnalysisAI#3782。

* perf(agentx): bump GB300 DSV4.1 Flash SGLang to the 20261008 nightly, 16K chunks at TP4 c1

Root cause: on the 20260929 nightly the Python radix-tree insert walk slices
the remaining key at every node, which delays the last prefill chunk on
200K-400K-token AgentX prompts. At TP4 c1, 4K chunks with a 16-step
prefill-decode interval split long cache-miss prefills into many steps and
made subagent requests wait behind them.

Fix: pin lmsysorg/sglang:nightly-dev-cu13-20261008-7760d526 by digest in the
recipe and the master config. The image makes the Rust radix-tree core the
default. TP4 c1 now runs 16K chunks with no prefill-decode interval.

Validation: local GB300 TP4 c1 30-minute AgentX runs, synthetic acceptance 3.51.
Image bump: 5,570 -> 5,577 tok/s/GPU, P90 interactivity 521.5 -> 562.5.
Chunking (new image, fastokens backend in both arms): 5,826 -> 5,957 tok/s/GPU,
P90 TTFT 1.38 -> 0.46 s. Other points were not rerun on the new image.

* chore(changelog): link the GB300 DSV4.1 Flash SGLang 20261008 entry to SemiAnalysisAI#3859

* perf(agentx): GB300 DSV4.1 Flash SGLang 20261012 nightly, tuned TP2 c8-c32, DEP2 c64/c128

Bump to nightly-dev-cu13-20261012-e6072935, which carries DP attention with
MegaMoE. TP2 c8/c16/c32 run 16K chunks with decoder SWA bounded replay and a
longer prefill-decode interval; c64 and c128 move to DEP2 behind sglang-router
with shortest-prefill-first scheduling.

* perf(agentx): GB300 DSV4.1 Flash SGLang: trim to 7 Pareto points, TP4 EP1 at c4/c16

Keep TP4 c1/c4/c16, TP2 c16/c32 and DEP2 c64/c128; the other points are
dominated. TP4 c4 and c16 run EP1, and c16 adds a 192-step prefill-decode
interval, 4 tokenizer workers and soft NUMA binding.

* chore: credit the GB300 DSV4.1 Flash config-only tuning campaign

Co-authored-by: nbommi19 <227267412+nbommi19@users.noreply.github.com>

---------

Co-authored-by: weireweire <20922698+weireweire@users.noreply.github.com>
Co-authored-by: nbommi19 <227267412+nbommi19@users.noreply.github.com>
Co-authored-by: Ankur-singh <ankusingh@nvidia.com>
…d] 将 DSR1 FP8 MI355X ATOM 镜像更新至 v0.1.7 (SemiAnalysisAI#3911)

* chore(amd): bump dsr1-fp8-mi355x-atom to ATOM v0.1.7 image

Pin rocm/atom-dev:nightly_202610080328 by digest; it is built from the
ATOM v0.1.7 release commit a526f0d.

将 dsr1-fp8-mi355x-atom 更新为 ATOM v0.1.7 镜像:按摘要固定
rocm/atom-dev:nightly_202610080328,该镜像构建自 ATOM v0.1.7 发布提交 a526f0d。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(changelog): add dsr1-fp8-mi355x-atom ATOM v0.1.7 entry

为 dsr1-fp8-mi355x-atom 的 ATOM v0.1.7 镜像更新追加 perf-changelog 条目。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore: refresh PR SemiAnalysisAI#3911 for sweep reuse [skip-sweep]

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: functionstackx <47992694+functionstackx@users.noreply.github.com>
… / fix(review): 让签核验证器发现并修正结论格式问题 (SemiAnalysisAI#3958)

* fix(review): stop discarding sign-off verdicts over row formatting slips

The sign-off verifier sometimes marks an N/A row with the PASS emoji
(✅ instead of ➖), most often Check 12 when it is the only N/A row.
signoff_publish then discards the whole verdict and posts "did not
produce a valid verdict". All 3 rejections among the 36 verdict
artifacts from 2026-10-06 to 2026-10-13 had this cause.

N/A already counts as a pass, so the publisher now rewrites ✅ to ➖ on
N/A rows before validation. Every other emoji/status mismatch is still
rejected.

The verifier prompt now states that the status word alone selects the
emoji, and that each row stays on one line with its reason after " — ".
A later run ended the Check 13 row at "PASS" and moved the reason into
sub-bullets, which the publisher also rejects.

签核验证器有时会把 N/A 行标成通过的表情符号(✅ 而不是 ➖),最常见于
Check 12 是唯一 N/A 行的情况。signoff_publish 随后会丢弃整个结论,并
发布 “did not produce a valid verdict”。2026-10-06 至 2026-10-13 的
36 个结论产物中,3 次拒绝全部由此引起。

N/A 本来就视为通过,因此发布器现在会在校验前把 N/A 行的 ✅ 改为 ➖;
其他表情符号与状态不一致的情况仍会被拒绝。

验证器提示词现在明确说明:表情符号只由状态词决定,且每一行都须写在同
一行内,原因放在 " — " 之后。后来的一次运行把 Check 13 行停在 "PASS",
把原因移到了子列表中,发布器同样会拒绝这种行。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(review): let the sign-off verifier check its verdict before publishing

Three different formatting slips discarded the same PR's verdicts: an N/A
row marked ✅, a Check 13 row whose reason moved into sub-bullets, and a
verdict that left out Check 4. Prompt wording alone cannot rule these out.

signoff_publish now collects every reason a verdict is rejected
(parse_verdict/verdict_errors) instead of stopping at the first one;
publication outcomes are unchanged. The new read-only command
`python -m infx.workflows.signoff_validate <verdict.md>` prints those
reasons, or "Verdict format is valid.", without publishing. The verify
job allows that one command, and the prompt requires the verifier to run
it and fix any format problem before finishing, without changing a
check's conclusion.

同一个 PR 的签核结论曾因三种不同的格式问题被丢弃:N/A 行标成 ✅、
Check 13 行的原因被移到子列表中,以及漏写 Check 4。仅靠提示词措辞无法
完全避免这些问题。

signoff_publish 现在会收集结论被拒绝的所有原因
(parse_verdict/verdict_errors),而不是在遇到第一个问题时就停止;发布
结果保持不变。新增的只读命令
`python -m infx.workflows.signoff_validate <verdict.md>` 会列出这些原因,
或输出 "Verdict format is valid.",但不会发布。验证任务只额外允许这一条
命令,提示词要求验证器在结束前运行它并修正格式问题,且不得因此改变任何
检查的结论。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(review): drop added sign-off verdict tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Cameron Quilici <60715037+cquil11@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Cameron Quilici <60715037+cquil11@users.noreply.github.com>
…grid to c28 / [NVIDIA][AgentX] 调优 GLM-5.2 FP8 B300 SGLang MTP 配方并将并发扩展至 c28 (SemiAnalysisAI#3836)

Tune MTP depth, admission caps and HiCache scheduling with one recipe per
concurrency (c1 K6/cap2, c4 K4/cap3, c8 unchanged, c12 K5/cap5, c16 K4/cap7
with prefill-decode-interval 8 and write_through), pin the upstream SGLang
image by digest, and add c20, c24 and c28 with uncapped admission (2x CONC).

按并发调优 MTP 深度、准入上限和 HiCache 调度,每个并发一个配方;按摘要固定
上游 SGLang 镜像;新增 c20、c24、c28(不限制准入,2x CONC)。

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: Po-Han Huang <pohanh@nvidia.com>
…axm3 B300 FP4 vllm 升级每日构建 (SemiAnalysisAI#4000)

* [AgentX nightly] minimaxm3 B300 FP4 vllm mtp

[AgentX nightly] minimaxm3 B300 FP4 vllm 升级每日构建

* Record canonical PR link for SemiAnalysisAI#4000

记录 SemiAnalysisAI#4000 的正式 PR 链接。
…#3802)

* chore(recipes): delete unreferenced srt-slurm recipes

Remove recipe files and override blocks that no master config, launcher
table, test, or doc references:

- 35 multi-node recipes under seven retired 1k1k directories
- 6 minimaxm3 gb200-fp4 agentx per-point recipes superseded by bundles
- qwen3.5 gb200-fp4 agentx agg-tp4-mtp-hicache (superseded by
  agg-variants.yaml:override_tp4)
- single-node minimaxm3 vllm mi355x-fp4-mtp agentic recipe
- the four MTP overrides in dsr1 b200-fp4 8k1k disagg-stp-mtp-variants.yaml,
  whose master entries only select the STP variants

The generated sweep matrix is byte-identical before and after.

* chore(recipes): keep retired 1k1k recipes for reference

Restore the 35 multi-node recipes under the retired 1k1k directories. They are not referenced by any master config but are kept as a historical record.

* chore(recipes): drop the hard-coded variant count from a usage comment
…t-recipe (SemiAnalysisAI#3805)

* refactor(matrix): select srt-slurm recipes with srt-recipe-dir and srt-recipe

Master configs name each row's recipe with srt-recipe (and eval-srt-recipe)
relative to a per-entry srt-recipe-dir instead of CONFIG_FILE and
EVAL_CONFIG_FILE additional-settings. Validation requires them on every
srt-slurm row, checks the file and selected variant exist at load time,
and rejects the old settings; llmd-vllm entries keep CONFIG_FILE. The
generator emits project-relative paths, counts nodes from the row's
recipe, and the launcher reads SRT_RECIPE/EVAL_SRT_RECIPE, staging the
same recipes/<path>:<selector> argument for srtctl. Also drops the unread
SYNTHETIC_ACCEPTANCE* and SLURM_PARTITION settings.

* chore(recipes): drop stale CONFIG_FILE header comments

Master rows now select bundle variants with srt-recipe, so the recipe
headers no longer describe how to pick one.

* fix(matrix): resolve srt recipes under the loaded config's project

Recipe existence, selector checks and recipe node counts read files from
the project that holds the loaded configs/ (or the root a caller passes)
instead of the tooling checkout's repository_root(). The generator CLI and
planner pass config_root(config files), Klaud live families pass the
checkout root, and Klaud's canonical matrix fetches the candidate's recipes
from the candidate head.

* test(operatorx): give the generator fixture a project-layout srt recipe

Master configs now name an srt-recipe resolved under the project that holds
configs/, so the fixture places its master in configs/ beside a recipe.

* fix(configs): select the DSv4.1-Flash ATOM AgentX recipe with srt-recipe-dir

srt-recipe paths, which validation rejects now that every srt-slurm entry needs
srt-recipe-dir. The entry sets srt-recipe-dir and its rows select agentic.yaml;
the generated rows are unchanged.

* chore(recipes): drop stale CONFIG_FILE headers from the DSv4.1-Flash GB300 AgentX recipes

SemiAnalysisAI#3598 added the GB300 Dynamo+SGLang recipes with headers that say to select a
variant with CONFIG_FILE. Master rows select them with srt-recipe now, so the
headers stop at the variant layout like the other AgentX bundles.

* refactor(matrix): deslop srt-recipe selection

Set an AgentX row's srt-recipe fields once after the topology branch, and fetch each recipe file a Klaud family references once rather than once per row.

* test: deslop srt-recipe selection tests

The installed-package test no longer checks recipe node counts, which take an explicit root since srt-recipe and so no longer exercise caller-repository resolution. Drop unused monkeypatch fixtures and a history comment.

* docs: deslop srt-recipe selection guidance

Show srt-recipe in the CONFIGS.md search-space example, shorten its selection note, name srt-slurm recipes in the revision snapshot description, and shorten the debug-runs recipe path.

* fix(configs): select each GB200 DSR1 FP8 low-latency variant explicitly

The low-latency row named disagg-tp8-stp-variants.yaml without a selector, so one job submitted all three zip variants under a 4-node, 1-decode-worker label. Each variant now runs only the concurrencies it is tuned for, with its selector and its 7 TP8 decode workers on 16 nodes: zip_override_lowlat[0] (c8) at 4 and 8, zip_override_lowlat[1] (c16-32) at 16. zip_override_lowlat[2] is tuned for concurrency 64, which the entry never ran, so it has no row.

* fix(configs): select the Qwen3.8 and Qwen3.5 GB300 AgentX recipes with srt-recipe-dir

SemiAnalysisAI#3816 and SemiAnalysisAI#3840 added qwen3.8next-fp4-gb300-sglang-agentic-mtp and the
Qwen3.5 FP8 GB300 midcurve entries with a project-relative srt-recipe path
and CONFIG_FILE settings, which validation rejects now that every srt-slurm
entry needs srt-recipe-dir. The entries set srt-recipe-dir and their rows
select the same recipes and DEP16 overrides; the generated rows are
unchanged.

* fix(matrix): report a malformed srt-recipe as a validation error

A recipe that fails to parse raised a raw yaml.YAMLError out of
validate_master_config, so Klaud's canonical_matrix crashed on a malformed
candidate recipe instead of rejecting it like other bad srt-recipe
references. It now raises the same ValueError, naming the recipe file.

* fix(configs): select the Qwen3.5 GB200 FP4 V2 MTP recipes with srt-recipe-dir

SemiAnalysisAI#2594 added qwen3.5-fp4-gb200-dynamo-sglang-mtp with CONFIG_FILE
settings, which validation rejects now that every srt-slurm entry needs
srt-recipe-dir. The entry sets srt-recipe-dir and each row selects the
same recipe; the generated rows are unchanged.
… the matrix point (SemiAnalysisAI#3809)

* refactor(srt): compose fixed-sequence recipes from fragments and bind the point

Active fixed-sequence srt-slurm recipes keep only recipe-specific settings.
At launch the lane's shared block (configs/srt-recipes/) is merged under the
fragment, the row's variant is selected, and the binder writes the matrix
point: model path, image, precision, ISL/OSL, single-node client values
(MODEL, CONC, RANDOM_RANGE_RATIO, USE_CHAT_TEMPLATE) and telemetry
concurrencies. A fragment that sets a bound key fails before submission.

The hf:<MODEL> model path maps to the cluster's staged checkpoint and the
master image to its staged container, so recipes stop naming aliases. The
mi355x-amds DeepSeek-R1 MXFP4 checkpoint moves into models.entries. Six
b300-fp8 trtllm recipes declared fp4 precision; it is now bound to fp8.

* feat(srt): add infx generate for bound fixed-sequence recipes

`infx generate --config-key <key|glob> --output-dir <dir>` writes the bound
recipe of every fixed-sequence point and variant, validated by the pinned
srtctl, with a manifest mapping files to matrix points. srtctl's import
dependencies sit behind the new `recipes` extra. RECIPES.md documents
fragments, composition and the command.

* refactor(srt): set the multi-node fixed-sequence TOKENIZER in the shared block

Every active multi-node fixed-sequence fragment repeated
benchmark.env.TOKENIZER: /model. The shared block
configs/srt-recipes/fixed-sequence-multi.yaml now sets it and the fragments
drop it, along with the benchmark blocks it was the only entry of.

The three mi355x fragments that lacked it (DeepSeek-R1 FP8 disagg variants,
Qwen3.5 FP4 and FP8 1p1d) now tokenize with the mounted checkpoint too
instead of the served model id. Every other bound recipe is unchanged.

* fix(srt): bind exactly one multi-node variant in infx generate

infx generate bound every variant a multi-node selector matched, while the launcher's binder refuses anything but one, so it wrote recipes for points that launch rejects, such as dsr1-fp8-gb200-dynamo-sglang. Both now share bind_multinode, and generate fails such a point as launch does.

* refactor(srt): deslop the fixed-sequence binder

The binder parses CONC_LIST with the launcher's parse_concurrencies, now in workload.py, so telemetry concurrencies get its canonical and unique checks. Define the bound recipe file name once, drop generate's MODEL_PREFIX and RUN_EVAL inputs that nothing on its path reads, name what _validated does, and drop a model guard the binder makes redundant. Fragment checks drop two cases that repeat a covered branch.

* test(srt): drop assertions on where the bound recipe lives

The content checks that follow already prove srtctl ran the bound variant.

* docs: deslop fixed-sequence fragment guidance

Drop restatements of the shared blocks and alias history from RECIPES.md, and correct which keys add-model-hardware says fragments omit.

* build: drop test pins the recipes extra already declares

CI and the testing guide install every extra with the test group.

* fix(srt): fail fast when a fixed-sequence point's cluster stages no checkpoint

Fragments no longer name model.path aliases, so the alias guard never fired
for fixed-sequence recipes: an unstaged MODEL left model_paths empty and
srtctl resolved the bound hf:<MODEL> from the Hub on the compute nodes.
model_paths now raises before submission instead, unless an Override row
sets hub to load the Hub snapshot. The mi355x-amds DeepSeek-R1 FP8 and
Qwen3.5 FP4 SGLang disagg lanes, whose fragments named hf: paths before
they were bound, set it and keep loading the Hub snapshot.

* refactor(srt): compose the Qwen3.5 GB200 FP4 V2 MTP recipes from fragments

SemiAnalysisAI#2594 added nine standalone recipes for qwen3.5-fp4-gb200-dynamo-sglang-mtp
that name a model alias, the image and the precision, and run srt-slurm's
sa-bench. They become fragments: the binder writes the master model, image
and precision, and the shared fixed-sequence-multi.yaml block runs the
InferenceX client, as every other multi-node fixed-sequence recipe has since
SemiAnalysisAI#3415. The client keeps sa-bench's settings: the point's lengths, the
workflow's 0.8 range ratio, ten prompts and two warmups per concurrency, an
unthrottled request rate, the chat template, ignore-EOS and the /model
tokenizer. The c12288 point's sa-bench reuse_http_connections has no
counterpart; the client opens a connection per request, as it does for every
other point.
…r row (SemiAnalysisAI#3818)

* refactor(srt): compose AgentX recipes from fragments and set power on 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.

* feat(srt): generate the bound recipes of AgentX points too

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.

* refactor(srt): compose the DSv4.1-Flash ATOM AgentX recipe from a fragment

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.

* refactor(srt): deslop AgentX composition

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.

* refactor(srt): drop checks and env placeholders the binder makes dead

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.

* refactor(srt): share the multi-node binder inputs with infx generate

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.

* test(srt): drop binder tests that echo their inputs or repeat launcher 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.

* docs(srt): condense infx generate guidance

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.

* docs: drop recipe image and telemetry rules the binder now owns

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.

* refactor(srt): compose main's new GB300 and B300 AgentX recipes from fragments

SemiAnalysisAI#3816, SemiAnalysisAI#3840 and SemiAnalysisAI#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.

* refactor(srt): share one agentic.yaml block between the AgentX lanes

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.

* test(srt): reject a single-node variant sized for another DRAM budget

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.

* fix(srt): bind the AgentX client's IS_MULTINODE and power switch

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.

* refactor(srt): stop pinning workflow env in recipe fragments

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.
…affected config keys (SemiAnalysisAI#3812)

* feat(matrix): fingerprint the concrete recipe each benchmark row runs

recipe-fingerprint hashed only the generated matrix row, so editing a
fragment, a shared block or an AgentX variant left it unchanged. It now
hashes the row's fields (all but conc, exp-name and the fingerprint) with
the one variant the launcher submits for the row: the fragment composed
with its shared block (and the telemetry block for a power row), the
selected variant and the bound image, model, precision and, for fixed
sequences, lengths. Concurrency values and the job name stay out, and the
cluster facts the launcher adds (staged paths, mounts, client cache paths,
exporter port, fabric) never enter it, so one recipe keeps one fingerprint
across concurrencies and clusters. An eval-srt-recipe contributes only its
path. Rows without an srt-slurm recipe keep the row hash.

The planner runs without srtctl, so srt_slurm/variants.py reproduces
srtctl's override-bundle expansion and the planner reuses the launcher's
variant selection and binding. A row that no variant serves now fails
planning instead of its launch.

Klaud matches published fingerprints when it freezes a baseline. Producer
revisions now recompute theirs with their own infx.matrix.fingerprint, or
the row hash when they predate it, and the canonical family fetches the
head's shared blocks with its recipes.

* feat(matrix): list the config keys a change affects

`python -m infx.matrix.changed --base <ref>` generates the base matrix with
the base revision's own generator, fingerprints both sides under their own
recipes and prints every config key whose points (recipe fingerprint and
concurrency) were added or removed, with point counts. --json prints the
same report for tools. Authors use it to decide which keys a perf-changelog
entry should rerun.

* test(matrix): drop assertions other tests already make

test_expansion_matches_srtctl already compares the zip, override and unselected expansions in full against srtctl, and the change report's added and removed concurrencies already prove the edited fragment's fingerprints changed.

* refactor(matrix): deslop recipe fingerprints

variants.py owns without_nulls and the zip selector pattern that synthetic_acceptance duplicated. bound_variant no longer gates power_port on the row's power, which only the fingerprint needed; the fingerprint passes its stand-in port for power rows itself. Drop the CONC_LIST exclusion that no bound recipe can carry, the listed flag in producer regeneration, and defensive exp-name lookups, and trim narrating docstrings.

* docs: condense recipe fingerprint guidance

* test(fingerprint): edit the shared agentic.yaml block in the AgentX case
… refs (SemiAnalysisAI#3820)

* refactor(srt): take cluster fabric facts from runners.yaml

Recipes stop hardcoding the cluster's network hardware. Each srt-slurm
cluster profile gains a typed fabric record: ucx-net-devices, nccl-ib-hca,
ib-devices, socket-ifname and mooncake-devices are lists, and
mooncake-gid-index, mori-rdma-tc and mori-io-tc are numbers. A recipe value
'@fabric.<name>' takes the job cluster's field after binding, lists
comma-joined and numbers as decimal strings. The launcher hands both
binders the cluster's rendered fabric; an unknown name, a reference inside
a longer string, or a field the cluster does not set fails before
submission. Nothing resolves references at plan time.

Literals equal to their cluster's fact become references in 72 active
recipes on gb200-nv, gb300-nv, b200-nscale, b300-dsxe, h200-dgxc and
mi355x-amds. Deliberate per-recipe values stay literal: the MI355X UMBP
recipe's permuted rail order, B200 Mooncake's four of eight HCAs, and empty
Mooncake device lists that leave discovery to Mooncake.

infx generate resolves references for a point whose runner label names one
cluster and records that cluster in the manifest; otherwise references
stay and the manifest's cluster is null.

* feat(srt): check recipe fabric references at matrix generation

Matrix generation now fails a row whose selected recipe variant (srt-recipe
or eval-srt-recipe) has an '@fabric.<name>' value naming no Fabric field, or
a field that a cluster the row's runner label reaches does not set. The
launcher still resolves references at bind time and fingerprints hash them
as written.

Cluster env and srt-slurm.host-setup.env values may reference the cluster's
own fabric the same way and resolve when the record loads; env keeps
rejecting commas after resolution. mi355x-amds takes MORI_RDMA_TC and
IBDEVICES from its fabric instead of repeating them.

* chore: reconcile srt-fabric-refs with lower branch after linearizing

* fix(srt): keep the fabric reference constant importable on Python 3.10

The binder runs in srtctl's Python 3.10 venv, where importing infx.clusters fails on typing.Self.

* refactor(srt): merge RDMA NIC fabric fields into rdma-devices

nccl-ib-hca, mooncake-devices and ib-devices held the same RDMA HCA list on
every cluster that set them. One Fabric field, rdma-devices, now carries that
list for NCCL_IB_HCA, the Mooncake device_name, SGLang
disaggregation-ib-device and IBDEVICES, and each cluster lists its HCAs once.

Bound recipes are unchanged. Rows whose recipes reference the field get new
fingerprints, since references are hashed as written.

* refactor(srt): take the GB300 DSv4 Mooncake RDMA devices from the fabric

prefill role. Like the other recipes' NIC lists, both read '@fabric.rdma-devices',
which renders the same mlx5_0..mlx5_3 list on gb300-nv.

* test(srt): drop fabric assertions other tests already make

The workload tests already prove the multi-node binder resolves --fabric, the single-node driver case proves the launcher passes the job cluster's rendering, and the matrix tests already cover an unknown fabric name.

* refactor(srt): fail fabric lookups for clusters without a record

infx generate now raises the binder inputs' missing srt-slurm settings error instead of binding an empty fabric, and the matrix check reads the record a cluster label names instead of treating a missing one as an empty fabric.

* docs: condense fabric reference guidance

* refactor(srt): take the GB200 DSv4 Mooncake RDMA devices from the fabric

the decode stores and the prefill role. Like the GB300 recipes, both read
'@fabric.rdma-devices', which renders the same mlx5_0..mlx5_3 list on
gb200-nv.

* refactor(srt): resolve every fabric reference with resolve_fabric

Cluster env and host-setup.env values and the matrix plan-time check now
call the binder's resolve_fabric instead of Fabric.field_name,
Fabric.resolve and a second string walk. An unset field reads "this
cluster sets no srt-slurm.fabric.<name>" everywhere, and the matrix error
names the recipe and the first cluster that fails. A runner that no
cluster label lists, such as gb300-nv, still has its reference names
checked. A cluster env: null is now rejected instead of read as an empty
mapping.

The embedded-reference generation case is dropped: it ran the same
resolve_fabric branch as the binder's IBDEVICES case.

* refactor(srt): name fabric fields after cluster RDMA facts

Fabric fields now name what the cluster has rather than the software
that reads it: ucx-net-devices becomes rdma-device-ports,
mooncake-gid-index becomes rdma-gid-index, and mori-rdma-tc and
mori-io-tc, both 104 on mi355x-amds, become one rdma-tc. Recipes and the
mi355x-amds cluster env keep their engine variable names (UCX_NET_DEVICES,
MC_GID_INDEX, MORI_RDMA_TC, MORI_IO_TC) and point them at the new
references, so every bound recipe renders the same values.
…er config (SemiAnalysisAI#3821)

* refactor(srt): bind script-installed component versions from the master config

Repo setup scripts that install a component now read its version from the
recipe instead of pinning it, and the binder writes the point's master
version after variant selection, so the submitted recipe shows what gets
installed:

- vllm-router.sh (was vllm-router-0.1.14.sh) reads ROUTER_VERSION.
- vllm-mooncake.sh (was vllm-mooncake-0.3.11.sh) reads
  KV_OFFLOAD_BACKEND_VERSION; kimik3-b300-mooncake.sh and the
  mooncake-master preambles of the Kimi-K3 B300 and MiniMax-M3 H100
  recipes run it instead of pinning their own pip install.
- lmcache-mp-rocm.sh reads KV_OFFLOAD_BACKEND_VERSION.
- glm5.3-tilert-rocm.sh reads ROUTER_VERSION, the tilert-pd-router
  release; the GLM-5.3 recipe drops TILERT_VERSION.

The binder writes the version into the top-level environment when
setup_script is one of these installers (workers and static routers) and
into the env of each service whose preamble runs one, since services do
not inherit environment. A point that does not declare the version fails
before submission, a vllm-router pin in SETUP_PIP_PACKAGES must match the
master router, and a fragment may not set the version variables.
The launcher and infx generate also fail a bound recipe whose setup_script
is in neither configs/ nor the srt-slurm checkout's, where srtctl itself
only warns.

* test(srt): drop duplicate component version tests

The router half of the binding test reruns the setup_script branch the Mooncake half covers, the pinned-router acceptance only echoed its input, and the setup-script check is called directly instead of through a copy of the multi-node CLI harness.

* refactor(srt): deslop component version binding

_fragment_versions yields its findings, the one-entry PIP_COMPONENTS registry becomes the vllm-router check it was, and lmcache-mp-rocm.sh reads KV_OFFLOAD_BACKEND_VERSION without an alias.

* docs: condense component version guidance

* refactor(srt): drop the binder's fragment path from component version errors

bind_workload took a required source only to prefix two component version
errors with the fragment path. No other binder error names the fragment,
and the planner's recipe fingerprint already prefixes the srt-recipe, so
those errors printed the path twice. check_setup_script keeps its source.
… config key (SemiAnalysisAI#3824)

* fix(launch): apply lane job edits to the bound recipe

prepare_recipe edited the staged fragment before the binder ran. Its text
edits only find a flat recipe's top-level name and six-space
watchdog-timeout, so bundle variants kept their recipe names as srtctl's
run name and never got the cluster's dist-timeout. The edits now apply to
the recipe the binder writes, which is flat for every variant. Slurm job
names were unaffected: srtctl names the job from RUNNER_NAME.

* refactor(recipes): fold per-point recipe families into one bundle per entry

Master-config entries whose rows each named their own standalone recipe now
select overrides of one <agg|disagg>[-axis]-variants.yaml: base holds what
the points share and each override_<topology>_c<conc> holds only its point's
deltas, including the job name. Ten AgentX entries (50 recipes) and
seventeen fixed-sequence entries (184 recipes) move into 27 bundles. Every
moved row's selected variant equals its old recipe after composition, with
and without the power telemetry block, and the full-sweep matrices differ
only in those rows' srt-recipe strings.

Entries whose points mix recipe designs, such as a TP low-latency recipe
beside wide-EP ones, keep their standalone files. Section-header comments,
commented-out settings and per-point labels that restate the topology are
not carried into the bundles. RECIPES.md describes the convention.

* refactor(recipes): fold the GLM-5.2 GB300 SGLang AgentX point recipes into bundles

the other AgentX families, the three aggregate points select overrides of
agg-variants.yaml and the three low-latency 1PxD points overrides of
disagg-variants.yaml; each override selects exactly its old recipe. The
DEP8/DEP16 2P1D point is a different design and keeps its own file.

* test(launch): drop recipe edit assertions other tests already make

The health-check floor and model path of a bound bundle variant are already covered by test_srt_config and the multi-node lane test, and the bundle-shaped health budget test exercises inputs that only reach raise_health_attempts as the binder's flat output.

* refactor(launch): inline recipe_relpath into recipe_mirror_path

Its other caller went away when the lane edits moved to the bound recipe.

* docs: drop the per-override name rule and tidy bundle comments

Every launch renames the bound recipe and fingerprints exclude name, so bundles need not set one per override. Drop a misindented commented-out flag and move the NATS comment above request_plane.

* refactor(recipes): select the Qwen3.5 GB300 FP8 AgentX midcurve points from the pareto bundles

of the pareto entries by naming those points' standalone recipes, which the
bundles replace. Their rows select the matching pareto overrides, so each
still runs exactly the pareto point's recipe rather than a copy that could
drift; the DEP16 points keep disagg-dep16-mtp6-variants.yaml. RECIPES.md
notes that an entry rerunning another entry's points selects its overrides.

* refactor(launch): edit the bound recipe as data

prepare_recipe now edits the binder's safe_dump output through one
safe_load/safe_dump round trip instead of regex and line edits that
depended on PyYAML's indentation: it sets the top-level name, raises
health_check.max_attempts to the floor, and adds dist-timeout to each
role whose args set watchdog-timeout. For all 589 bound multi-node
points of every master key and every multi-node recipe variant, with and
without a dist timeout, the written recipe parses identically to the old
edits. The helper tests fold into one prepare_recipe test.

* refactor(recipes): drop the per-override names from the folded bundles

The 29 bundles folded from per-point recipes carried each old file's
top-level name into its override, and some no longer matched the
topology. Nothing reads them: every launch renames the bound recipe to
the runner's job name, srtctl names the Slurm job from RUNNER_NAME, and
fingerprints exclude name. Variants now take srtctl's
<base name>_<override key> fallback, which only changes infx generate
output.
…idence (SemiAnalysisAI#4036)

明确参数化命令和适用官方文档可满足配方覆盖要求;将缺少草稿精度证据改为警告,保留已证实违规的失败判定,并同步清单说明和发布器回归测试。

Signed-off-by: Xin Li <xinli@nvidia.com>
…-K3 PD 配置 (SemiAnalysisAI#3582)

* feat(launch): support read-only Kimi-K3 assets

为 Kimi-K3 PD 声明模型资源与只读 draft/provider 挂载;保留现有可写缓存目录的创建行为,不改共享镜像准备和任务生命周期。

* feat(config): add native Kimi-K3 PD recipes

Add topology-named native variants with a digest-pinned official worker image, role-owned serving settings and default evaluation selection. Preserve upstream request-ID randomization and keep benchmark and cluster configuration separate.

新增按拓扑命名的原生配置变体,使用 digest 固定的官方 worker 镜像、按角色管理的 serving 参数及默认精度评测;遵循上游 request-ID 随机化,将 benchmark 和集群配置分层。

* fix(srt-slurm): backport discovery connector template binding

Carry NVIDIA/srt-slurm SemiAnalysisAI#508 through the existing patches directory at the shared submodule API. Exercise real job-local patch application and conflict handling, then run the upstream P/D command-rendering regressions in an isolated checkout. Remove the patch once the shared dependency includes it.

沿用既有 patches 目录回补 NVIDIA/srt-slurm SemiAnalysisAI#508,与共享 submodule API 保持一致。验证任务私有 checkout 的补丁应用和冲突退出,再在隔离进程中执行上游 P/D 命令渲染回归;共享依赖包含该修复后删除补丁。

* refactor: use native asset mounts for Kimi-K3 recipes

Declare draft checkpoint and Ionic provider mounts through existing recipe and cluster configuration. Keep shared launch code unchanged, carry only the SemiAnalysisAI#508 runtime backend fix, and record recipe details in YAML and the changelog.

中文:通过现有 recipe 和集群配置声明 draft checkpoint 与 Ionic provider 挂载。共享 launch 代码保持不变,仅携带 SemiAnalysisAI#508 的运行时 backend 修复,将 recipe 信息统一记录在 YAML 和 changelog。

* perf(config): tune and simplify Kimi-K3 PD recipe settings

Enable INT4 QuickReduce with a 256 MiB limit and FlyDSL stage-2 FP8 on both roles. Use default nonblocking waits and breakable-graph settings. Scope draft and Ionic mount paths to the recipe. Configure 1P1D c48/c56, 1P2D c24/c48 and 1P3D c12/c24 with prefill-only CPU offload and point-specific decode graph coverage. Update the existing performance changelog entry.

中文:在 P/D 两侧启用 INT4 QuickReduce、256 MiB 大小上限和 FlyDSL stage-2 FP8,使用默认非阻塞等待与 breakable graph 设置。将 draft 和 Ionic 挂载路径收束到 recipe。配置 1P1D c48/c56、1P2D c24/c48 和 1P3D c12/c24,使用仅 prefill 侧 CPU offload 与各点对应的 decode graph 覆盖,并更新当前 PR 的性能变更记录。

* fix(config): use default AgentX failure threshold for Kimi-K3 PD

Remove the recipe's live failure threshold override so all Kimi-K3 PD variants use the pinned AgentX scenario's 10% default. Keep the final result threshold, both roles' stream interval, and optional server-metrics validation unchanged.

移除 Kimi-K3 PD 配方的运行中错误率覆盖,所有变体沿用固定版本 AgentX 场景的默认 10% 门槛。最终结果校验门槛、P/D 流式输出间隔及可选 server-metrics 校验保持不变。

* fix(srt): clarify discovery patch scope

说明 SemiAnalysisAI#508 仅修复 srt-slurm 启动器的 discovery 配置渲染,不修改推理引擎、kernel、模型计算或镜像。补丁应用后的代码保持不变。

* fix(kimik3): migrate PD recipe to srt-recipe selection and AgentX fragments

Main now selects srt-slurm variants with srt-recipe-dir/srt-recipe and binds
model, image, precision, client env and concurrencies from the master row, so
the recipe drops those keys and the shared agentic.yaml supplies the client
command.

---------

Co-authored-by: Cam Quilici <cjquilici@gmail.com>
Co-authored-by: billishyahao <bill.he@amd.com>
* chore: remove comments from srt-slurm recipe YAML

删除单节点和多节点 srt-slurm 配方 YAML 中的注释,保持配置内容不变。

* chore: keep explanatory recipe comments

Restore inline comments that explain non-obvious settings (workarounds,
timeouts, memory sizing, bug references). Header blocks, section labels,
topology/provenance descriptions, perf result notes and commented-out
config stay removed.

---------

Co-authored-by: cquil11 <60715037+cquil11@users.noreply.github.com>
…/ 清理 infx 注释并保留指定目录 (SemiAnalysisAI#4039)

* chore: remove infx comments outside bench_serving

删除 infx 中 bench_serving 目录之外的说明性注释,保留功能性指令和代码行为。

* chore: preserve golden_al_distribution comments

按要求保留 golden_al_distribution 的全部注释和原始内容。
Ban header comments and historical comments; comments must give succinct
technical explanation of a specific line or block.

禁止文件头注释和描述代码历史演变的注释;注释只能简洁地从技术角度解释具体代码或配置。
…Agent 指南 (SemiAnalysisAI#4042)

* docs: remove redundant pipeline guides

删除三份重复说明文档并修复引用,保留 Claude 命令、技能、已知限制及其操作文档。

* docs: consolidate result and ingest recovery instructions

将结果检查和恢复流程合并到 Claude 恢复命令,删除重复指南并保留验证与权限边界。

* docs: remove requested guides and repair agent references

删除指定的说明文档,保留四项核心文档与全部 Claude 命令,将必要操作规则移入现有入口并修复引用。
从 AMD 主配置的 CODEOWNERS 条目中移除无效所有者 @yctseng0211,保留其余所有者。
…SemiAnalysisAI#3781)

* feat(power): bind native GPU telemetry into composed recipes

* fix(power): include native telemetry in revision recipe loading

* chore: remove PR 3781 perf changelog entry

* docs: trim AMD exporter notes in CONFIGS.md

* test(power): remove producer replay test and dependency

* refactor(power): bind single-node required power from REQUIRE_POWER

The launcher no longer re-reads the bound recipe, patches its request, or
writes $GITHUB_ENV. REQUIRE_POWER alone sets telemetry.required, so a
single-node fragment may not set it, and result processing takes the
producer SHA from the launcher stamp as the multi-node workflow does.

* refactor(power): gate single-node telemetry only when composing

select_recipe already omits the native telemetry block for eval-only points,
so the binder no longer rewrites telemetry.enabled.

* refactor(power): share the AgentX power adapter invocation

Single-node and multi-node AgentX run the adapter through one helper, and the
single-node adapter writes its sidecar into the workspace instead of the
launcher copying it there.

* refactor(power): derive single-node AgentX GPU count from the aggregate

The aggregate already records num_gpus from the same environment as
GPU_COUNT, so the adapter drops --expected-num-gpus.

* chore(runners): share the AMD exporter settings through YAML anchors

* ci(power): drop power-audit upload paths no job writes

---------

Co-authored-by: Cam Quilici <cjquilici@gmail.com>
…wer_model] 支持跨系统的实测 CPU socket 功耗输入 (SemiAnalysisAI#4031)

* feat: add measured x86 CPU socket input to power_model

中文:为 power_model 新增实测 x86 CPU socket 功耗输入,仅替代建模的 x86 CPU 功耗

* refactor: make x86 CPU socket validation explicit

中文:明确检查 x86 CPU socket,并删除重复的测试注释。

* feat: apply both measured socket inputs across system families

中文:让两种实测 socket 功耗输入适用于 HGX 和机架系统。
# Conflicts:
#	.github/workflows/benchmark-tmpl.yml
#	benchmarks/benchmark_lib.sh
#	configs/runners.yaml
@github-actions

Copy link
Copy Markdown

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 run only when the PR appends an inferencex-e2e/perf-changelog.yaml entry and carries exactly one primary label: full-sweep-fail-fast (strongly recommended; canary plus per-matrix fail-fast), full-sweep-enabled (canary; matrix jobs continue after a failure), or non-canary-full-sweep-enabled (no canary or fail-fast). The modifiers all-evals, evals-only, and agentx-fast require a primary label. On fork PRs, a maintainer applies the label. See sweep labels and reuse.
  • 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 在 inferencex-e2e/perf-changelog.yaml 末尾追加了条目,并且恰好带有一个主标签时,才会运行扫描:full-sweep-fail-fast(强烈推荐;canary 加逐矩阵 fail-fast)、full-sweep-enabled(有 canary;矩阵任务在失败后继续运行)或 non-canary-full-sweep-enabled(无 canary,也无 fail-fast)。修饰标签 all-evals、evals-only 和 agentx-fast 必须与主标签一起使用。fork PR 的标签由维护者添加。参见扫描标签与复用。
  • **合并后:**PR 作者必须确保所有 GitHub Actions 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

@aistackdev
aistackdev merged commit ba8b258 into main Oct 14, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.