Skip to content

feat(agentx): add Kimi-K3 MI355X ATOM PD disaggregation points / feat(agentx): 新增 Kimi-K3 MI355X ATOM PD 分离式测试点 - #4311

Open
Jasen2201 wants to merge 18 commits into
mainfrom
jasen/kimik3-mi355x-atom-disagg-agentx
Open

Jasen2201 wants to merge 18 commits into
mainfrom
jasen/kimik3-mi355x-atom-disagg-agentx

Conversation

@Jasen2201

@Jasen2201 Jasen2201 commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Adds kimik3-fp4-mi355x-atom-disagg-agentic: six Kimi-K3 MXFP4 AgentX points on MI355X with ATOM prefill/decode disaggregation behind AToMesh and Mooncake RDMA from prefill to decode. The existing ATOM entry, kimik3-fp4-mi355x-atom-agentic-mtp, serves prefill and decode on one node; these points split them.

Point Nodes Prefill Decode DSpark draft (golden AL) Prefill CPU tier per rank
1P1D C1 2 TP8 TP8 7 (3.84) none
1P2D C16 3 TP8 + DCP8 2 x TP8 + DCP8 7 (3.84) LMCache 128 GB
1P1D C48 2 TP8 + DCP8 TP8 + DCP8 4 (3.36) LMCache 224 GB, state images capped at 128 GB
1P2D C48 3 TP8 + DCP8 2 x TP8 + DCP8 4 (3.36) LMCache 224 GB, state images capped at 128 GB
1P1D C72 2 TP8 + DCP8 TP8 + DCP8 4 (3.36) LMCache 224 GB, state images capped at 128 GB
1P1D C88 2 TP8 + DCP8 TP8 + DCP8 4 (3.36) LMCache 224 GB, state images capped at 128 GB
  • Prefill CPU tier. On the DCP8 points the prefill adds lmcache_offload beside Mooncake, so the paged KV and the KDA state images share one LMCache CPU pool. On the DSpark4 points, OFFLOAD_STATE_CPU_SIZE=128 caps the state images within the 224 GB pool and ATOM_STATE_CHECKPOINT_DEMAND=1 adds checkpoints at observed shared prefixes; the fixed-interval grid stays off. dram-utilization 0.598 and 0.343 budget 1794 GB and 1029 GB for the eight prefill ranks. Decode runs no CPU tier. ReplaySSM is on in both roles at the DCP8 points, and AITER_REUSE_IDENTICAL_COMM_GROUPS=1 at C72 and C88.
  • Hugepage-backed LMCache pools. The prefill LMCache pools use 2 MiB HugeTLB pages (LMCACHE_LOCAL_CPU_USE_HUGEPAGES). The recipe's host_setup reserves them on the prefill node through hugepage_sanity.sh (4 ranks x the pool size per NUMA node, with 400 GiB left free for model loading), and teardown releases them. A 4 KiB pool registered with hipHostRegister stays movable, and each page the kernel migrates stalls the rank's GPU queues; that is what left LMCache prefills stuck in their startup barrier on mi355x-amds.
  • Draft precision. Inferact/Kimi-K3-DSpark is served as it ships, in BF16: the target checkpoint's compressed-tensors ignore list (self_attn, mlp.*_proj) and the online_quant_config exclusions cover every draft linear (layers.* and context_proj), as in the single-node ATOM recipe. Like that recipe, the draft caches in the target's FP8 MLA KV pool. Details with source links are in the draft data-type comment. The draft is read from /it-share/data/Inferact-Kimi-K3-DSpark, the copy the vLLM P/D recipe mounts. The srt driver supplies the golden AL.
  • Decode graphs. Decode captures every query-token count up to 2 x CONC x (1 + draft tokens): 16, 256, 480, 720 and 880. Admission is 2 x CONC (32 at C1 and C16).
  • Router. AToMesh with policy: random, so a 1P2D request picks a decode at random.
  • Image. rocm/atom-dev:nightly_202610310756, pinned by digest (ROCm/ATOM e281d58ac). It adds fix(kimi-k3): hold tool_choice="required" to the tools channel on the GPU ROCm/ATOM#2849, which forces Kimi-K3's tools channel on the GPU for tool_choice="required", the mode the Kimi tool-call eval sends. The previous image, nightly_202610190554 (ROCm/ATOM daa4f1bb8), predates it and scored 0.9338 on the c1 tool-call eval.
  • Latent MoE projections. routed_expert_down_proj and routed_expert_up_proj are stored in BF16 and run in BF16 on this image; daa4f1bb8 quantized them to MXFP4 at load.

Validation. Full sweep 41183113911 on head 1a26087 (image nightly_202610310756) is running. The earlier sweep 40782441830 ran on nightly_202610190554; it passed all six points, the canary and the evals, with c1 scoring 0.9338 on the tool-call eval. /reuse-sweep-run 40782441830 predates the image change, so merging needs /use 41183113911 once the new sweep is green.

Risks.

Reference: ATOM CI. The same topologies, server flags and golden ALs on ROCm/ATOM's MI355X CI (a different cluster), with one difference: the CI quantizes the DSpark draft to FP8, which this recipe does not. Expect these points to land somewhat lower. Total tok/s per GPU (input incl. cached, plus output), p90 TPOT:

Point tok/s/GPU p90 TPOT TTFT p50 / p90 Run
1P1D C1 799 6.27 ms 1.33 / 2.19 s 39129317184
1P2D C16 3,724 8.39 ms 0.78 / 2.10 s 38885664369
1P1D C48 13,063 16.35 ms 1.43 / 5.61 s 39129187179
1P2D C48 10,420 11.57 ms 1.55 / 6.41 s 39129295866
1P1D C72 15,704 24.96 ms 5.11 / 16.9 s 39126771292
1P1D C88 16,206 26.29 ms 13.3 / 31.2 s 39126761639
AI model disclosure
  • Model/version: claude-opus-5-5 (Claude Opus 5.5), running in Claude Code.
  • Role: ran and analysed the ATOM CI sweep above; traced the InferenceX launcher, the master-config validation and srt-slurm's ATOM backend; wrote the recipe, the master config entry and the perf-changelog entry; bound each variant with infx.srt_slurm.workload, loaded it with srtctl and checked the rendered ATOM command lines and golden AL against the CI runs; checked draft-layer coverage against the CI's online-quantization records.
  • Model/version: claude-opus-5-5 (Claude Opus 5.5), running in Claude Code (changelog sync, 2026-10-29).
  • Role: rewrote the perf-changelog block from the diff, traced the DSpark draft's data types through ATOM daa4f1bb8 and the checkpoint safetensors headers, and updated this description (hugepage pools, validation run, draft KV, budget numbers).
  • Model/version: claude-opus-5-5 (Claude Opus 5.5), running in Claude Code (image update, 2026-10-31).
  • Role: triggered the ROCm/ATOM main nightly that carries fix(kimi-k3): hold tool_choice="required" to the tools channel on the GPU ROCm/ATOM#2849, pinned nightly_202610310756 by digest, merged main, recorded the BF16 latent MoE projections in the changelog and this description, ran the new sweep and re-ran its failed jobs.
PR checklist and change type

Type of Change

  • Bug fix
  • New feature
  • Configuration change
  • Documentation update
  • Other (please describe)

Checklist

  • I have completed the AI model disclosure and kept it current
  • I have tested my changes locally
  • I have updated documentation if necessary
  • If python -m infx.matrix.changed --base origin/main lists affected config keys, I have appended one new entry covering them to the physical end of inferencex-e2e/perf-changelog.yaml; if it lists none, I have added none. I have not edited historical entries
  • If this PR appends an inferencex-e2e/perf-changelog.yaml entry, it carries exactly one primary sweep label (a maintainer applies it on fork PRs): full-sweep-fail-fast (recommended), full-sweep-enabled, or non-canary-full-sweep-enabled. Optional modifiers all-evals, evals-only, and agentx-fast require a primary label; the last two block reuse while applied.
  • Before merging via reuse, an authorized maintainer (OWNER/MEMBER/COLLABORATOR) has commented /use <run_id> (or the legacy /reuse-sweep-run) on this PR. Do this only once there is a final full sweep that is all green with evals passing, since after this comment the primary sweep label will no longer automatically kick off new sweeps. Remove and re-add the primary sweep label to force a new sweep.
中文

概要

新增 kimik3-fp4-mi355x-atom-disagg-agentic:MI355X 上 6 个 Kimi-K3 MXFP4 AgentX 测试点,采用 ATOM 预填充/解码分离,经 AToMesh 路由,Mooncake RDMA 负责预填充到解码的传输。现有的 ATOM 条目 kimik3-fp4-mi355x-atom-agentic-mtp 在单节点上同时做预填充和解码;这些测试点把两者拆开。

测试点 节点数 预填充 解码 DSpark 草稿(golden AL) 每个预填充 rank 的 CPU 层
1P1D C1 2 TP8 TP8 7(3.84) 无
1P2D C16 3 TP8 + DCP8 2 x TP8 + DCP8 7(3.84) LMCache 128 GB
1P1D C48 2 TP8 + DCP8 TP8 + DCP8 4(3.36) LMCache 224 GB,状态镜像上限 128 GB
1P2D C48 3 TP8 + DCP8 2 x TP8 + DCP8 4(3.36) LMCache 224 GB,状态镜像上限 128 GB
1P1D C72 2 TP8 + DCP8 TP8 + DCP8 4(3.36) LMCache 224 GB,状态镜像上限 128 GB
1P1D C88 2 TP8 + DCP8 TP8 + DCP8 4(3.36) LMCache 224 GB,状态镜像上限 128 GB
  • 预填充 CPU 层。 在 DCP8 测试点上,预填充在 Mooncake 之外再加 lmcache_offload,分页 KV 和 KDA 状态镜像共用一个 LMCache CPU 池。DSpark4 测试点用 OFFLOAD_STATE_CPU_SIZE=128 把状态镜像限制在 224 GB 池内的 128 GB,并用 ATOM_STATE_CHECKPOINT_DEMAND=1 在观察到的共享前缀处补充 checkpoint;固定间隔网格保持关闭。dram-utilization 取 0.598 和 0.343,为 8 个预填充 rank 分别预算 1794 GB 和 1029 GB。解码不使用 CPU 层。DCP8 测试点在两个角色上都开启 ReplaySSM,C72 和 C88 设置 AITER_REUSE_IDENTICAL_COMM_GROUPS=1。
  • 大页支撑的 LMCache 池。 预填充的 LMCache 池使用 2 MiB HugeTLB 页(LMCACHE_LOCAL_CPU_USE_HUGEPAGES)。配方的 host_setup 通过 hugepage_sanity.sh 在预填充节点上预留这些页(每个 NUMA 节点 4 个 rank x 池大小,并为模型加载保留 400 GiB 空闲内存),teardown 负责释放。用 hipHostRegister 注册的 4 KiB 池仍可被迁移,内核每迁移一页都会让该 rank 的 GPU 队列停顿;这正是 mi355x-amds 上 LMCache 预填充卡在启动 barrier 的原因。
  • 草稿精度。 Inferact/Kimi-K3-DSpark 按发布时的 BF16 精度提供服务:目标 checkpoint 的 compressed-tensors ignore 列表(self_attn、mlp.*_proj)和 online_quant_config 的排除列表覆盖全部草稿线性层(layers.* 和 context_proj),与单节点 ATOM 配方一致。与该配方相同,草稿的 KV 写入目标的 FP8 MLA KV 池。带源码链接的细节见草稿数据类型评论。草稿从 /it-share/data/Inferact-Kimi-K3-DSpark 读取,即 vLLM P/D 配方挂载的同一份拷贝。golden AL 由 srt 驱动提供。
  • 解码图。 解码捕获最多 2 x CONC x (1 + 草稿 token 数) 的每个 query token 数:16、256、480、720 和 880。准入上限为 2 x CONC(C1 和 C16 为 32)。
  • 路由。 AToMesh 使用 policy: random,因此 1P2D 的请求随机选择一个解码节点。
  • 镜像。 rocm/atom-dev:nightly_202610310756,按 digest 固定(ROCm/ATOM e281d58ac)。它包含 fix(kimi-k3): hold tool_choice="required" to the tools channel on the GPU ROCm/ATOM#2849:对 tool_choice="required" 的请求,在 GPU 上强制进入 Kimi-K3 的 tools 通道,Kimi 工具调用评测发送的正是这种请求。上一版镜像 nightly_202610190554(ROCm/ATOM daa4f1bb8)早于该修复,其 c1 工具调用评测得分为 0.9338。
  • 潜空间 MoE 投影。 routed_expert_down_proj 和 routed_expert_up_proj 在 checkpoint 中以 BF16 存储,在本镜像上按 BF16 运行;daa4f1bb8 会在加载时把它们量化为 MXFP4。

验证。 完整扫描 41183113911(head 为 1a26087,镜像 nightly_202610310756)正在运行。之前的扫描 40782441830 使用 nightly_202610190554,6 个测试点、canary 和评测均通过,其中 c1 工具调用评测为 0.9338。/reuse-sweep-run 40782441830 早于镜像变更,因此新扫描全部通过后,合入需要 /use 41183113911。

风险。

参考:ATOM CI。 在 ROCm/ATOM 的 MI355X CI(另一套集群)上运行相同拓扑、服务参数和 golden AL,唯一区别是 CI 把 DSpark 草稿量化为 FP8,而本配方不量化。因此这些测试点的结果预计会略低。吞吐为每 GPU 总 token/s(输入含命中缓存的部分,加输出),延迟为 p90 TPOT;数据和运行链接见上表。

AI 模型使用说明

  • 模型/版本:claude-opus-5-5(Claude Opus 5.5),运行于 Claude Code。
  • 工作内容:运行并分析上述 ATOM CI 扫描;梳理 InferenceX 启动器、master 配置校验和 srt-slurm 的 ATOM 后端;编写配方、master 配置条目和 perf-changelog 条目;用 infx.srt_slurm.workload 绑定每个变体并用 srtctl 加载,核对生成的 ATOM 命令行和 golden AL 与 CI 运行一致;依据 CI 的在线量化记录核对草稿层的排除覆盖。
  • 模型/版本:claude-opus-5-5(Claude Opus 5.5),运行于 Claude Code(changelog 同步,2026-10-29)。
  • 工作内容:依据 diff 重写 perf-changelog 条目,结合 ATOM daa4f1bb8 源码和 checkpoint 的 safetensors 头核对 DSpark 草稿的数据类型,并更新本描述(大页池、验证运行、草稿 KV、预算数值)。
  • 模型/版本:claude-opus-5-5(Claude Opus 5.5),运行于 Claude Code(镜像更新,2026-10-31)。
  • 工作内容:触发包含 fix(kimi-k3): hold tool_choice="required" to the tools channel on the GPU ROCm/ATOM#2849 的 ROCm/ATOM main nightly 构建,按 digest 固定 nightly_202610310756,合并 main,在 changelog 和本描述中记录 BF16 潜空间 MoE 投影,运行新的扫描并重跑失败的任务。

Add kimik3-fp4-mi355x-atom-disagg-agentic: six Kimi-K3 MXFP4 AgentX
points on MI355X with ATOM prefill/decode behind AToMesh and Mooncake
P->D transfer. 1P1D TP8 DSpark7 c1, 1P2D TP8+DCP8 DSpark7 c16, 1P1D
TP8+DCP8 DSpark4 c48/c72/c88 and 1P2D TP8+DCP8 DSpark4 c48. The DCP8
prefill keeps paged KV and KDA state images in an LMCache CPU tier;
the DSpark draft stays BF16.

新增 kimik3-fp4-mi355x-atom-disagg-agentic:MI355X 上 6 个 Kimi-K3 MXFP4
AgentX 测试点,ATOM 预填充/解码分离,经 AToMesh 路由,Mooncake 负责
P->D 传输。包括 1P1D TP8 DSpark7 c1、1P2D TP8+DCP8 DSpark7 c16、1P1D
TP8+DCP8 DSpark4 c48/c72/c88 和 1P2D TP8+DCP8 DSpark4 c48。DCP8 预填充
把分页 KV 和 KDA 状态镜像放在 LMCache CPU 层;DSpark 草稿模型保持 BF16。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution!

  • Review: If this PR changes files owned by someone other than a repository admin or @SemiAnalysisAI/core, ask one eligible CODEOWNER to complete the latest PR_REVIEW_CHECKLIST.md before contacting a core maintainer on Slack. Follow the template exactly, including As a PR reviewer and CODEOWNER, I have reviewed this and have, so sign-off verification triggers.
  • PR verification: Sweeps 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 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

为 Kimi-K3 ATOM P/D 条目填入 #4311 链接。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment on lines +62 to +63
MC_GID_INDEX: '@fabric.rdma-gid-index'
NCCL_IB_DISABLE: '1'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔴 All six points may see Mooncake prefill-to-decode KV transfers fail or stall if mi355x-amds rails are isolated. The ATOM disagg recipe already on this runner relies on ATOM_MOONCAKE_MATCHED_RAILS: auto. The shared &env block sets MC_GID_INDEX and NCCL_IB_DISABLE but leaves matched rails out. Without it, Mooncake falls back to dest-device affinity, which the sibling says rail isolation breaks. Fix: add ATOM_MOONCAKE_MATCHED_RAILS: auto to the &env anchor so prefill and decode both get it, or note why Kimi-K3 does not need it.

Why this was flagged

The condition is that mi355x-amds is rail-isolated, as the sibling recipe on the same runner states. Its comment at dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml:33-35 reads "Rail-isolated RDMA: matched rails replace dest-device affinity." and it sets ATOM_MOONCAKE_MATCHED_RAILS: auto. Both recipes use runner cluster:mi355x-amds, framework: atom-disagg and kv-p2p-transfer: mooncake. The new &env anchor (disagg-variants.yaml:40-63) copies that recipe's MC_GID_INDEX: '@ fabric.rdma-gid-index' and NCCL_IB_DISABLE: '1' lines but drops the matched-rails line. Both roles use this anchor, since decode takes env: *env. No override adds the setting back. The runners.yaml fabric entry for mi355x-amds (lines 810-814) has no rail flag that would supply it. So a prefill rank may post RDMA writes from a NIC that cannot reach the decode NIC. KV handoffs on every point would then error or hang, and the sweep would fail. The PR description does not mention this setting.

Verification: The new shared env: &env anchor (kimik3/atom/mi355x-fp4/agentx/disagg-variants.yaml lines 40-63) has no ATOM_MOONCAKE_MATCHED_RAILS. Decode uses env: *env (line 88), so both roles lack the setting. The sibling recipe is dsv4/atom/mi355x-fp4/agentx/disagg-lmcache-dspark.yaml. The new recipe kept lines 34 and 36 of its lines 33-36 and dropped line 35, ATOM_MOONCAKE_MATCHED_RAILS: auto.

@Jasen2201 Jasen2201 added the full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) label Oct 19, 2026
Keep the Kimi-K3 ATOM P/D changelog entry at the physical end after main's new entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Jasen2201 Jasen2201 added full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures and removed full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) labels Oct 19, 2026
@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Jasen2201 and others added 2 commits October 19, 2026 13:32
Keep the Kimi-K3 ATOM P/D changelog entry at the physical end after #4295.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ugepages

On mi355x-amds a 4 KiB LMCache pool registered with hipHostRegister stays
movable. Each page the kernel migrates (compaction, reclaim) stalls the rank's
GPU queues until the driver re-validates the pool, and GLM-5.2 ATOM prefills
with ~1 TiB pools hung in the post-pool barrier on 3 of 14 timed starts there.
The K3 DCP8 prefill pins 8 x 224 GiB (8 x 128 GiB at c16).

Set LMCACHE_LOCAL_CPU_USE_HUGEPAGES on the prefill so LMCache maps each pool
with MAP_HUGETLB 2 MiB pages bound to its NUMA node. host_setup reserves the
pages on the head node (the prefill's) through the cluster's
hugepage_sanity.sh, checks each NUMA node's share and that 400 GiB of other
memory stays free for weight loading, and teardown releases them. The c1
point has no LMCache and is unchanged.

把 Kimi-K3 ATOM prefill 的 LMCache 池改用 2 MiB 大页,host_setup 在 prefill
节点预留、teardown 释放,避免 4 KiB 池页面迁移导致启动 barrier 卡死。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Jasen2201 Jasen2201 added non-canary-full-sweep-enabled Run the full sweep without the canary gate (full search space, no trim) and removed full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures labels Oct 19, 2026

@functionstackx functionstackx left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

before sweeping, u need to fix the mooncake kvcache counters for atomesh. chun and seungrok are working on a code change to fix it iirc. tho the MVP code change needs some serious changes to make it high quality

@functionstackx functionstackx removed the non-canary-full-sweep-enabled Run the full sweep without the canary gate (full search space, no trim) label Oct 19, 2026
@functionstackx

Copy link
Copy Markdown
Collaborator

oh nvm, this is Mooncake for RDMA & LMCache for kvcache,

chun & @seungrokj does lmcache atomesh with mooncake rdma have this issue or is it mooncake store that has this issue?

…tom-disagg-agentx

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
@Jasen2201 Jasen2201 added the full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) label Oct 28, 2026
@Jasen2201
Jasen2201 requested a review from zijiecode as a code owner October 28, 2026 13:32
@Jasen2201 Jasen2201 added full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures and removed full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) labels Oct 28, 2026
@chunfangamd

Copy link
Copy Markdown
Collaborator

/reuse-sweep-run 40782441830

Jasen2201 and others added 4 commits October 30, 2026 01:49
Resolve the perf-changelog conflict with main's new entries (#4647,
#4627, #4596, #4526, #4664) using prepare_perf_changelog_merge
resolve-conflict: main's bytes are kept and this PR's entry is
re-appended unchanged. The recipe, the master entry and the changelog
entry are byte-identical to the swept commit dd7a1f1 (run 40782441830,
pinned by /reuse-sweep-run).

用 prepare_perf_changelog_merge resolve-conflict 解决与 main 新条目
(#4647、#4627、#4596、#4526、#4664)的 perf-changelog 冲突:保留 main
的原始字节,本 PR 的条目原样追加在末尾。recipe、master 条目和 changelog
条目与 sweep 所用提交 dd7a1f1(run 40782441830,已由 /reuse-sweep-run
固定)逐字节一致。

[skip-sweep]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…/ 依据 diff 重写 Kimi-K3 MI355X ATOM P/D 条目

- New config on rocm/atom-dev:nightly_202610190554 (ROCm/ATOM daa4f1bb8), pinned by digest; the AToMesh router is pinned to the same ATOM commit.
- Add six P/D points with Mooncake P->D transfer: 1P1D TP8 DSpark7 c1, 1P2D TP8+DCP8 DSpark7 c16, 1P1D TP8+DCP8 DSpark4 c48/c72/c88 and 1P2D TP8+DCP8 DSpark4 c48.
- Both roles: FP8 KV, block 128, ptpc_fp8 online quantization with the MXFP4 routed experts excluded, FlyDSL FP8 prefill attention, prompt-end state checkpoint only; admission 2x conc (32 at c1); decode FULL graphs up to 16/256/480/720/880.
- Prefill LMCache CPU tier: 128 GB per rank at c16, 224 GB per rank with state images capped at 128 GB and on-demand checkpoints at the DSpark4 points; c1 GPU-resident, no decode CPU tier; ReplaySSM at DCP8; AITER_REUSE_IDENTICAL_COMM_GROUPS=1 at c72/c88.
- Prefill LMCache pools backed by 2 MiB HugeTLB pages reserved by host_setup and released by teardown.
- AToMesh routes with policy random.
- ATOM daa4f1bb8 includes ROCm/ATOM#2449 (evicted KDA state images are no longer advertised).
- Draft: Inferact/Kimi-K3-DSpark runs as shipped in BF16 and caches in the target's FP8 MLA KV pool.

- 新配置使用 rocm/atom-dev:nightly_202610190554(ROCm/ATOM daa4f1bb8),按 digest 固定;AToMesh 路由固定在同一 ATOM 提交。
- 新增 6 个使用 Mooncake P->D 传输的 P/D 测试点:1P1D TP8 DSpark7 c1、1P2D TP8+DCP8 DSpark7 c16、1P1D TP8+DCP8 DSpark4 c48/c72/c88 和 1P2D TP8+DCP8 DSpark4 c48。
- 两个角色:FP8 KV、block 128、ptpc_fp8 在线量化(排除 MXFP4 路由专家)、FlyDSL FP8 预填充注意力,仅保留 prompt 末尾状态 checkpoint;准入为 2 倍并发(c1 为 32);解码 FULL 图捕获至 16/256/480/720/880。
- 预填充 LMCache CPU 层:c16 每 rank 128 GB,DSpark4 测试点每 rank 224 GB,状态镜像上限 128 GB 并按需补充 checkpoint;c1 完全驻留 GPU,解码无 CPU 层;DCP8 测试点开启 ReplaySSM;c72/c88 设置 AITER_REUSE_IDENTICAL_COMM_GROUPS=1。
- 预填充 LMCache 池使用 2 MiB HugeTLB 页,由 host_setup 预留、teardown 释放。
- AToMesh 使用 random 策略路由。
- ATOM daa4f1bb8 包含 ROCm/ATOM#2449(不再公布已驱逐的 KDA 状态镜像)。
- 草稿:Inferact/Kimi-K3-DSpark 按发布时的 BF16 运行,KV 写入目标的 FP8 MLA KV 池。

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

Copy link
Copy Markdown
Collaborator

Draft data types: no change. The DSpark draft (Inferact/Kimi-K3-DSpark, a standalone K3DSparkModel checkpoint with no quantization_config) is stored entirely in BF16 (read from the safetensors header):

Part Data type
Attention projections (q_a_proj, kv_a_proj_with_mqa, q_b_proj, kv_b_proj, o_proj), 5 layers BF16
MLP (gate_proj, up_proj, down_proj), 5 layers BF16
context_proj, Markov head (markov_w1/w2), norms BF16
embed_tokens, confidence_head BF16, not loaded (the target's embedding and LM head are shared)

At ATOM daa4f1bb8404be08caa9b61e6930414de9de84a3 (the image's revision), the draft is built from a shallow copy of the target's config (dspark_proposer.py#L387-L392), so it carries the target's quant config: the static compressed-tensors MXFP4 scheme plus the recipe's ptpc_fp8 online quantization. Neither reaches a draft weight:

  • The draft linears are named layers.{i}.self_attn.{fused_qkv_a_proj,q_b_proj,kv_b_proj,o_proj} and layers.{i}.mlp.{gate_up_proj,down_proj} (kimi_k3_dspark.py#L250, #L279, #L491-L498, #L655). The target checkpoint's ignore list (re:.*self_attn.*, re:.*mlp\.(gate|up|gate_up|down)_proj.*) excludes them from MXFP4, and the recipe's online_quant_config lists each of them (layers.*.self_attn.fused_qkv_a_proj, ..., layers.*.mlp.down_proj). Exclusion returns an unquantized spec (config.py#L462, glob/regex matching at #L556-L560), and online_quantize_weight skips the layer (linear.py#L988-L1003).
  • context_proj is built with no quant config (kimi_k3_dspark.py#L642) and is also excluded by name; the Markov head is a pair of plain nn.Embedding tables.
  • KV cache: the draft binds into the engine's own MLA pool and caches in its dtype (kimi_k3_dspark.py#L342-L348), FP8 here because both roles set kv_cache_dtype: fp8. The single-node ATOM recipe kimik3-fp4-mi355x-atom-agentic-mtp sets the same, so the draft KV matches existing Kimi-K3 ATOM practice.

So the draft runs as shipped: BF16 weights and activations for every draft layer, with the FP8 MLA KV cache shared with the target. This is a new config key, so there is no earlier state of this config to compare against. The ATOM CI runs cited in the PR body quantize the draft to FP8; this recipe does not.

中文

草稿数据类型:无变化。 DSpark 草稿(Inferact/Kimi-K3-DSpark,独立的 K3DSparkModel checkpoint,无 quantization_config)全部以 BF16 存储(读自 safetensors 头):

部分 数据类型
注意力投影(q_a_proj、kv_a_proj_with_mqa、q_b_proj、kv_b_proj、o_proj),5 层 BF16
MLP(gate_proj、up_proj、down_proj),5 层 BF16
context_proj、Markov 头(markov_w1/w2)、各 norm BF16
embed_tokens、confidence_head BF16,不加载(共享目标模型的 embedding 和 LM head)

在 ATOM daa4f1bb8404be08caa9b61e6930414de9de84a3(镜像对应的版本)中,草稿由目标配置的浅拷贝构建(dspark_proposer.py#L387-L392),因此带有目标的量化配置:静态的 compressed-tensors MXFP4 方案,加上配方的 ptpc_fp8 在线量化。两者都不会作用到草稿权重:

  • 草稿线性层名为 layers.{i}.self_attn.{fused_qkv_a_proj,q_b_proj,kv_b_proj,o_proj} 和 layers.{i}.mlp.{gate_up_proj,down_proj}(kimi_k3_dspark.py#L250、#L279、#L491-L498、#L655)。目标 checkpoint 的 ignore 列表(re:.*self_attn.*、re:.*mlp\.(gate|up|gate_up|down)_proj.*)把它们排除在 MXFP4 之外,配方的 online_quant_config 也逐一列出了它们(layers.*.self_attn.fused_qkv_a_proj …… layers.*.mlp.down_proj)。被排除的层返回不量化的配置(config.py#L462,glob/正则匹配见 #L556-L560),online_quantize_weight 会跳过该层(linear.py#L988-L1003)。
  • context_proj 构建时不带量化配置(kimi_k3_dspark.py#L642),并且也按名字被排除;Markov 头是两张普通的 nn.Embedding 表。
  • KV cache:草稿绑定到引擎自己的 MLA 池并按其数据类型缓存(kimi_k3_dspark.py#L342-L348),这里是 FP8,因为两个角色都设置了 kv_cache_dtype: fp8。单节点 ATOM 配方 kimik3-fp4-mi355x-atom-agentic-mtp 的设置相同,因此草稿 KV 与现有 Kimi-K3 ATOM 做法一致。

因此草稿按发布状态运行:所有草稿层的权重和激活均为 BF16,KV cache 与目标共用 FP8 MLA 池。这是新的配置键,没有可对比的旧状态。PR 描述中引用的 ATOM CI 运行把草稿量化为 FP8,本配方不这样做。

@seungrokj seungrokj left a comment •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this.
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this.
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • Verified that every draft model and draft head is served as it ships: the draft that ships with the served checkpoint, at its stored precision, through the pinned upstream image's default handling, with the shipped and effective draft precision recorded in the additional detail section. No submission-side quantization, dtype override, checkpoint substitution, or patch may lower draft precision below that default, regardless of eval results or AL. Explicitly verified that SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE is not enabled in the effective recipe, including inherited settings; enabling it is prohibited going forward, and historical runs do not grant an exception. See Draft-model precision for what counts as the default and the MLPerf comparison.
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in infx/golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified against the current MODELS.md that this PR does not submit a deprecated model, scenario, or model-scenario combination.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; target/verifier FLOPs at lower precisions is fine, given that the config passes private evals, but this does not permit lowering draft-model or draft-head precision below what ships. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • Verified that new models disable integer all-reduce, with SGLang ROCm explicitly setting ROCM_QUICK_REDUCE_QUANTIZATION=NONE. Existing models are grandfathered per MODELS.md.
  • For affected Dynamo TRT-LLM benchmarks, verified that iteration/KV-cache metrics are collected and published under the pinned Dynamo implementation and effective engine settings. Resolve the installed Dynamo version separately from the container tag; use supported metrics controls without requiring KV events. Record the version and configuration evidence in the additional detail section. See verifier Check 17. N/A for unaffected serving paths or frameworks without these Dynamo settings.
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • For official InferenceX (non-preview), verified that established models use upstream engine images built from master (or the equivalent default development branch), with new models transitioning within a reasonable time after release. See MODELS.md.
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every affected vLLM/SGLang production serving configuration in this PR, including Dynamo deployments, is documented in the official vLLM recipes and/or the SGLang cookbook, for both single-node and multi-node aggregated and disaggregated serving. The documentation covers production-useful flags, environment variables, and launch commands (including prefill, decode, and router/frontend commands for disaggregation); InferenceX-only benchmark/harness settings are excluded with reasoning in the additional detail section:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang cookbook source repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If this PR uses append-only: true, verified that it only adds generated points or recipe variants inside a selected existing config/scenario and existing same-image visual curve: every previously generated point remains present with the same recipe, no prior point is removed or rerun, and every benchmark-affecting change in the complete diff can affect only the corresponding newly appended points (never an existing point), regardless of which file contains it.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.
  • Reported measured throughput/E2EL Pareto counts and evidence per affected curve (≥5 points strongly recommended). Below 5 or unverifiable: tag a core maintainer for review; recorded admin bypass required before merge. N/A if no curves are affected. Details.

Additional detail section:

Signed: seungrokj

@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

❌❌❌ REJECTED ❌❌❌

⚠️ Pareto coverage needs additional review. At least 5 points per affected throughput-versus-E2EL frontier are highly recommended. Below 5, or when coverage cannot be verified, merge only with an explicit, recorded admin bypass for the assessed commit; this advisory comment does not grant or enforce a bypass.

@seungrokj Blocking: the c1 Kimi-K3 tool-call eval is materially weaker than its sibling topology in the same run, and the sign-off has no rerun or explanation for it. The new perf-changelog entry also omits the INT4 quick-reduce all-reduce quantization that both roles enable.

❌ Check 2 (Evals pass): FAIL — Materially weaker eval with no rerun-backed explanation. In run 40782441830 (in-PR commit dd7a1f1, per agg_eval_all.json), kimi_tool_call_schema_full on 1P1D TP8 c1 scores em_strict 0.9338. The sibling 1P2D DCP8 c16 scores 0.9657. The gap is 0.0319 and the 2σ threshold is 0.0305 (binomial SE, n=408). Against the closest ingested cohort (GB300 dynamo-vllm, run 40239967341, 0.978), c1, c88 and 1P2D c48 (both 0.9485) are also flagged. gsm8k is within threshold on all six points, and the evals ran on the pinned rocm/atom-dev:nightly_202610190554@sha256:9765777e… image. The additional detail section does not address this. Fix: rerun the c1 tool-call eval, or explain the gap in the sign-off with rerun evidence.

❌ Check 18 (Recipe/image/sweep consistency): FAIL — (f2) The new perf-changelog.yaml entry covers the ptpc_fp8, MXFP4 and FP8-KV quantization but omits AITER_QUICK_REDUCE_QUANTIZATION: INT4. That setting enables integer-quantized all-reduce on prefill and decode through the shared &env in disagg-variants.yaml. Add it to the entry. Everything else holds: (a)/(b) all six selectors generate and agree with master on nodes, workers, TP/DCP and admission; (c) the digest-pinned image is already referenced on main; (d) AToMesh is pinned to daa4f1bb8; (e) there is no cross-repo dispatch; (f1) the graph-size formula 2x conc x (1 + draft) matches 16/256/480/720/880; (g) no points were removed.

⚠️ Check 14 (Pareto coverage): WARN — The curve kimik3 / agentic-coding / mi355x atom-disagg / fp4 / P90 E2EL has 4/5 frontier points, computed from the six bmk_agentic_* artifacts in run 40782441830 (tput_per_gpu vs p90 E2EL). The frontier is 1P2D c16 (18.9 s, 3,736), 1P2D c48 (26.6 s, 10,451), 1P1D c48 (37.4 s, 13,399) and c72 (52.0 s, 16,113). c1 (31.2 s, 799) and c88 (66.8 s, 15,871) are dominated. The admin bypass is not verified: the sign-off says only "bypass", with no rationale and no admin comment, and seungrokj has repository permission write and role write.

Passed and not applicable checks

✅ Check 0 (CODEOWNER): PASS — seungrokj is a named owner of inferencex-e2e/configs/amd-master.yaml and of the **/mi355x-*/ srt-slurm recipe path. perf-changelog.yaml falls only under the catch-all.

✅ Check 1 (In-PR sweep + evals): PASS — In-PR commit dd7a1f1 has green multi-node agentic /, multi-node canary / and multi-node agentic eval / checks for all six points (run 40782441830). Later commits are four main merges plus two changelog-only commits (7f5ac2a, bea0989), and the recipe and master entry are unchanged. The merged-in srt-slurm v2.65.2 bump (#4601) only changes Dynamo, KV-event and sidecar renders, and the runtime_settings.sh edit is limited to sglang-disagg. None of this reaches the ATOM/AToMesh path.

➖ Check 3 (Upstream recipe): N/A — Only framework: atom-disagg (ATOM + AToMesh + Mooncake) is affected, so no vLLM/SGLang production serving configuration is in scope. The linked ROCm/ATOM recipe is informational.

✅ Check 4 (Reuse command): PASS — COLLABORATOR chunfangamd posted /reuse-sweep-run 40782441830 on its own line (2026-10-29).

✅ Check 5 (Latest checklist): PASS — All 20 items in the current PR_REVIEW_CHECKLIST.md template are present and checked.

✅ Check 6 (Upstream images / ordering / provenance): PASS — (a) N/A: there are no vLLM/SGLang entries. (b) Kimi-K3 on cluster:mi355x-amds already has open-source engine entries (kimik3-fp4-mi355x-vllm-agentic-mtp, kimik3-fp4-mi355x-vllm-disagg-agentic). (c) The image's ATOM commit daa4f1bb8 is an ancestor of ROCm/ATOM main (main is 79 ahead, 0 behind).

✅ Check 7 (Deprecated models): PASS — Kimi-K3 (kimik3) agentic coding is active in MODELS.md as of 2026-10-30.

✅ Check 8 (No architecture hacks): PASS — (a) There are no hf-overrides or model-file edits. (b) Evals cover ptpc_fp8 online quantization and INT4 quick-reduce on all six points; accuracy is assessed under Check 2. (c) Kimi-K3 is in the baseline matrix at 2a45791, so it is grandfathered for integer all-reduce.

✅ Check 9 (Chat template for spec decode): PASS — The benchmark env sets AIPERF_APPLY_CHAT_TEMPLATE: 'true'.

✅ Check 10 (No engine patches): PASS — There is no reachable patching. host_setup and teardown run only the mi355x-amds setup.sh and hugepage_sanity.sh host scripts (no pip, source edits or overlays), and the recipe has no setup script.

✅ Check 11 (Golden AL): PASS — For atom-disagg, the trusted synthetic_acceptance.py sets spec-decode-acceptance-length on both roles from kimik3_dspark_probabilistic_sample_method_block_rejection_sample_method.yaml (thinking_on): DSpark7 gives 3.84 (c1/c16) and DSpark4 gives 3.36 (c48/c72/c88). No non-agentic config carries simulation knobs.

➖ Check 12 (Append-only): N/A — The new changelog entry does not set append-only: true.

✅ Check 13 (Draft precision): PASS — Inferact/Kimi-K3-DSpark is stored in BF16 with no quantization_config (evidence). At ATOM daa4f1bb8 the draft linears are prefixed layers.{i}.…, and context_proj is a bare top-level prefix. Both match the recipe's online-quant exclusions under the glob/prefix rules in config.py, and the target's MXFP4 re: ignore list also covers them. The draft KV inherits the target's FP8 pool. SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE is not set on this ATOM path.

✅ Check 15 (PR description): PASS — The body's claims match the pinned code and run evidence: the six topologies, 2x conc admission, capture sizes, LMCache 128/224 GB with a 128 GB state cap, the digest pin, validation run 40782441830 at dd7a1f1, and the reuse comment.

➖ Check 16 (NVIDIA overview): N/A — Only MI355X (AMD) configurations are affected.

➖ Check 17 (Metrics publication): N/A — This is ATOM P/D behind AToMesh, with no Dynamo TRT-LLM path.

Assessed commit: bea0989e8dbb0eb9dd2e42aef14b1106eddc404d.

…(1 + draft) / 将 Kimi-K3 ATOM P/D 图捕获上限表述为 2 倍并发 x (1 + 草稿 token)

- Decode captures every size up to 2x conc x (1 + draft tokens): 16 at c1, 256 at c16, 480 at c48, 720 at c72 and 880 at c88. Admission (max-num-seqs) is 2x conc except 32 at c1, so "admission x (1 + draft tokens)" overstated the c1 bound (256 instead of 16).

- 解码捕获最多 2 倍并发 x (1 + 草稿 token 数) 的每个尺寸:c1 为 16、c16 为 256、c48 为 480、c72 为 720、c88 为 880。准入上限(max-num-seqs)为 2 倍并发,c1 例外为 32,因此"准入 x (1 + 草稿 token 数)"高估了 c1 的上限(256 而非 16)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seungrokj
seungrokj self-requested a review October 30, 2026 03:41

@seungrokj seungrokj left a comment •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this.
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this.
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • Verified that every draft model and draft head is served as it ships: the draft that ships with the served checkpoint, at its stored precision, through the pinned upstream image's default handling, with the shipped and effective draft precision recorded in the additional detail section. No submission-side quantization, dtype override, checkpoint substitution, or patch may lower draft precision below that default, regardless of eval results or AL. Explicitly verified that SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE is not enabled in the effective recipe, including inherited settings; enabling it is prohibited going forward, and historical runs do not grant an exception. See Draft-model precision for what counts as the default and the MLPerf comparison.
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in infx/golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified against the current MODELS.md that this PR does not submit a deprecated model, scenario, or model-scenario combination.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; target/verifier FLOPs at lower precisions is fine, given that the config passes private evals, but this does not permit lowering draft-model or draft-head precision below what ships. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • Verified that new models disable integer all-reduce, with SGLang ROCm explicitly setting ROCM_QUICK_REDUCE_QUANTIZATION=NONE. Existing models are grandfathered per MODELS.md.
  • For affected Dynamo TRT-LLM benchmarks, verified that iteration/KV-cache metrics are collected and published under the pinned Dynamo implementation and effective engine settings. Resolve the installed Dynamo version separately from the container tag; use supported metrics controls without requiring KV events. Record the version and configuration evidence in the additional detail section. See verifier Check 17. N/A for unaffected serving paths or frameworks without these Dynamo settings.
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • For official InferenceX (non-preview), verified that established models use upstream engine images built from master (or the equivalent default development branch), with new models transitioning within a reasonable time after release. See MODELS.md.
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every affected vLLM/SGLang production serving configuration in this PR, including Dynamo deployments, is documented in the official vLLM recipes and/or the SGLang cookbook, for both single-node and multi-node aggregated and disaggregated serving. The documentation covers production-useful flags, environment variables, and launch commands (including prefill, decode, and router/frontend commands for disaggregation); InferenceX-only benchmark/harness settings are excluded with reasoning in the additional detail section:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang cookbook source repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If this PR uses append-only: true, verified that it only adds generated points or recipe variants inside a selected existing config/scenario and existing same-image visual curve: every previously generated point remains present with the same recipe, no prior point is removed or rerun, and every benchmark-affecting change in the complete diff can affect only the corresponding newly appended points (never an existing point), regardless of which file contains it.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.
  • Reported measured throughput/E2EL Pareto counts and evidence per affected curve (≥5 points strongly recommended). Below 5 or unverifiable: tag a core maintainer for review; recorded admin bypass required before merge. N/A if no curves are affected. Details.

Additional detail section:

Signed: seungrokj

@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

❌❌❌ REJECTED ❌❌❌

⚠️ Pareto coverage needs additional review. At least 5 points per affected throughput-versus-E2EL frontier are highly recommended. Below 5, or when coverage cannot be verified, merge only with an explicit, recorded admin bypass for the assessed commit; this advisory comment does not grant or enforce a bypass.

@seungrokj Blocking: in the validation run, the c1 Kimi-K3 tool-call eval is materially weaker than its sibling topology, and the sign-off does not explain the gap with a rerun. The Check 18 changelog omission from the previous verdict is fixed at abe13e4.

❌ Check 2 (Evals pass): FAIL — A materially weaker eval has no explanation backed by a rerun. In run 40782441830 (in-PR commit dd7a1f1, attempt 4, agg_eval_all.json), kimi_tool_call_schema_full on 1P1D TP8 c1 scores em_strict 0.9338 (381/408). Its sibling, 1P2D TP8+DCP8 c16, scores 0.9657. The gap is 0.0319, above the 2σ threshold of 0.0305 (binomial SE, n_eff 408). The facts cohort (GB300 dynamo-vllm run 40239967341, 0.978) also flags c1, plus 1P1D c88 and 1P2D c48 (both 0.9485; gap 0.0294 > 0.0263). Same-hardware vLLM (run 40132624130) scores 0.975–0.993. Against the closest single-node ATOM MI355X peer (run 38676890603, 0.931–0.968, c1 0.941), all six rows are within threshold, but that does not clear the in-run sibling gap. gsm8k is within threshold on all six points, and every eval ran on the pinned rocm/atom-dev:nightly_202610190554@sha256:9765777e… image. The additional detail section links only the ATOM mesh recipe and the draft-dtype comment. Fix: rerun the c1 tool-call eval, or explain the gap in the sign-off with rerun evidence.

⚠️ Check 14 (Pareto coverage): WARN — The kimik3 / agentic-coding / mi355x atom-disagg / fp4 / P90 E2EL curve has 4/5 frontier points. Source: results_bmk/agg_bmk.json from run 40782441830 (source dd7a1f1, total tput_per_gpu vs p90 E2EL, upper_right). The frontier is 1P2D c16 (18.9 s, 3,736), 1P2D c48 (26.6 s, 10,451), 1P1D c48 (37.4 s, 13,399) and 1P1D c72 (52.0 s, 16,113); c1 (31.2 s, 799) and c88 (66.8 s, 15,871) are dominated. The count was computed by hand with the helper's semantics, because this sandbox blocked feeding the input file to pareto_coverage. P75 also gives 4. Admin bypass not verified: there is no admin bypass comment for abe13e4.

Passed and not applicable checks

✅ Check 0 (CODEOWNER): PASS — seungrokj is a named owner of inferencex-e2e/configs/amd-master.yaml and of /inferencex-e2e/benchmarks/*_node/srt-slurm-recipes/**/mi355x-*/. perf-changelog.yaml falls only under the catch-all.

✅ Check 1 (Sweep on in-PR commit): PASS — In-PR commit dd7a1f1 has green multi-node agentic, canary and agentic eval check-runs for all six points (run 40782441830). Later commits are four main merges and four changelog-only edits. The recipe blob (b145622) and the master entry are byte-identical at abe13e4. The merged launcher changes (DSV4/MiniMax-M3 retirement) and the srt-slurm bump ae3d687→59920ea (opt-in container reuse, gpu_indices and node release, plus a partial-node topology fix) do not reach this full-node ATOM path.

➖ Check 3 (Upstream recipe): N/A — Only an atom-disagg configuration is affected (ATOM engine with the AToMesh router). No vLLM/SGLang production serving configuration changes.

✅ Check 4 (Reuse command): PASS — chunfangamd (COLLABORATOR) commented /reuse-sweep-run 40782441830 on its own line. That run is the passing in-PR run.

✅ Check 5 (Latest template): PASS — Every item of the current PR_REVIEW_CHECKLIST.md is present and checked.

✅ Check 6 (Upstream images/ordering/provenance): PASS — (a) The PR adds an ATOM entry only, with no vLLM/SGLang entry. (b) Open-source engine entries already exist for kimik3 on cluster:mi355x-amds (kimik3-fp4-mi355x-vllm-agentic-mtp, kimik3-fp4-mi355x-vllm-disagg-agentic). (c) The image's ATOM commit daa4f1bb8 is an ancestor of ROCm/ATOM main.

✅ Check 7 (Deprecated models): PASS — Kimi-K3 agentic coding is active in MODELS.md as of 2026-10-30.

✅ Check 8 (No arch hacks): PASS — (a) There are no architecture overrides. (b) ptpc_fp8 online quantization and AITER_QUICK_REDUCE_QUANTIZATION=INT4 apply on all six points, and evals cover all six; the accuracy gap is handled under Check 2. (c) Kimi-K3 is in the baseline matrix at 2a45791, so it is grandfathered.

✅ Check 9 (Chat template): PASS — The AgentX benchmark sets AIPERF_APPLY_CHAT_TEMPLATE: 'true' and replays chat traces.

✅ Check 10 (No engine patches): PASS — There are no patches, setup scripts or wheel installs. host_setup only runs the host-level cluster setup.sh and hugepage_sanity.sh to reserve and release HugeTLB pages.

✅ Check 11 (Golden AL): PASS — synthetic_acceptance.py sets spec-decode-acceptance-length on both roles from kimik3_dspark_probabilistic_sample_method_block_rejection_sample_method.yaml: 3.84 for DSpark7 and 3.36 for DSpark4, matching signoff_facts golden-al. The run's job_events record 3.84 (c1, c16) and 3.36 (c48, c72, c88) on every throughput job.

➖ Check 12 (Append-only): N/A — No new changelog entry sets append-only: true.

✅ Check 13 (Draft precision): PASS — Inferact/Kimi-K3-DSpark is stored in BF16. At ATOM daa4f1bb8, its linears are layers.{i}.self_attn.*, layers.{i}.mlp.* and context_proj. The recipe's online_quant_config excludes each one, and an excluded layer gets the torch dtype (config.py fnmatch). The checkpoint's ignore list keeps them out of MXFP4. The draft's block pass uses the MLA decode path, so the FP8 prefill-attention flag does not reach it, and its FP8 KV is inherited from the target. SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE is not set (ATOM path).

✅ Check 15 (PR description): PASS — The body's claims match abe13e4 and run 40782441830: topology, golden ALs, admission (2x conc, 32 at c1/c16), graph sizes (16/256/480/720/880), DRAM budgets (1794/1029 GB), image digest, validation run and reuse command. The ATOM CI table is labeled as an external reference.

➖ Check 16 (NVIDIA overview): N/A — The only affected hardware is AMD MI355X.

➖ Check 17 (Metrics publication): N/A — The ATOM framework does not use the Dynamo TRT-LLM metrics settings.

✅ Check 18 (Recipe/image/sweep consistency): PASS — (a) All six selectors generate. (b) Nodes, workers, TP/DCP, admission and DRAM budgets agree with master. (c) The digest-pinned image resolves (docker manifest inspect). (d) AToMesh and srt-slurm are pinned to commits. (e) There is no cross-repo dispatch. (f) The entry now records FP8 KV, ptpc_fp8, INT4 quick-reduce, A4W4, FP8 stage-2, fp16 KDA state (ATOM default fp32) and BF16 draft. (g) No points were removed. (h) No points were re-tuned.

Assessed commit: abe13e489f5d7ceef89f4eb42dda18676725c66a.

seungrokj and others added 4 commits October 29, 2026 20:53
…P/D / 记录 Kimi-K3 ATOM P/D 使用 INT4 AITER quick all-reduce

- Both roles run INT4-quantized AITER quick all-reduce (AITER_QUICK_REDUCE_QUANTIZATION=INT4) for the tensor-parallel all-reduces at every point; the shared recipe env sets it.

- 两个角色在所有测试点上的张量并行 all-reduce 均使用 INT4 量化的 AITER quick all-reduce(AITER_QUICK_REDUCE_QUANTIZATION=INT4),由共享的 recipe 环境变量设置。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ions / 记录 Kimi-K3 ATOM P/D 的 MoE 与 KDA 状态精度

- Both roles feed FP4 activations into the MXFP4 routed experts (AITER_SITUV2_A4W4=1; BF16 by default).
- The MoE stage-2 reduce output is written as FP8 value/scale rows (AITER_FLYDSL_STAGE2_FP8=1).
- The KDA recurrent state pool is stored in fp16 (ATOM_GDN_SSM_DTYPE=fp16; ATOM's default is fp32, and the recurrence still accumulates in fp32).

- 两个角色向 MXFP4 路由专家输入 FP4 激活(AITER_SITUV2_A4W4=1;默认为 BF16)。
- MoE 第二阶段 reduce 的输出以 FP8 数值/缩放行写出(AITER_FLYDSL_STAGE2_FP8=1)。
- KDA 循环状态池以 fp16 存储(ATOM_GDN_SSM_DTYPE=fp16;ATOM 默认为 fp32,递推计算仍以 fp32 累加)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tom-disagg-agentx

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
…0756 / 将 Kimi-K3 ATOM P/D 切换到 rocm/atom-dev:nightly_202610310756

- The image is rocm/atom-dev:nightly_202610310756 (ROCm/ATOM e281d58ac), pinned by digest; the AToMesh router pin follows it.
- It carries ROCm/ATOM#2849, which forces Kimi-K3's tools channel on the GPU for tool_choice="required", the mode the Kimi tool-call eval sends. That eval scored 0.9338 at c1 on nightly_202610190554.
- On this image the latent MoE projections (routed_expert_down_proj/up_proj) run in BF16, as the checkpoint stores them; daa4f1bb8 quantized them to MXFP4 at load. The changelog entry records it.

- 镜像改为 rocm/atom-dev:nightly_202610310756(ROCm/ATOM e281d58ac),按 digest 固定;AToMesh 路由的固定版本随之更新。
- 该镜像包含 ROCm/ATOM#2849:对 tool_choice="required" 的请求,在 GPU 上强制进入 Kimi-K3 的 tools 通道,Kimi 工具调用评测发送的正是这种请求。在 nightly_202610190554 上,该评测的 c1 得分为 0.9338。
- 在该镜像上,潜空间 MoE 投影(routed_expert_down_proj/up_proj)按 checkpoint 存储的 BF16 运行;daa4f1bb8 会在加载时把它们量化为 MXFP4。changelog 条目已记录这一点。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Jasen2201 Jasen2201 added full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures and removed full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures labels Oct 31, 2026
@functionstackx functionstackx removed the full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures label Oct 31, 2026
state-checkpoint-interval-tokens: -1
# Global ptpc_fp8 online quantization; the trailing entries keep the BF16
# draft (unprefixed layers.* and context_proj) unquantized.
online_quant_config: '{"global_quant_config":"ptpc_fp8","exclude_layer":["lm_head","model.embed_tokens","*self_attn.[qkv]_conv1d*","*block_sparse_moe.experts*","*block_sparse_moe.routed_expert_*","*vision_tower*","*mm_projector*","layers.*.self_attn.fused_qkv_a_proj","layers.*.self_attn.q_b_proj","layers.*.self_attn.kv_b_proj","layers.*.self_attn.o_proj","layers.*.mlp.gate_up_proj","layers.*.mlp.down_proj","context_proj"]}'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

PYTHONHASHSEED: '0'
AITER_LOG_LEVEL: WARNING
AITER_SITUV2_A4W4: '1'
AITER_QUICK_REDUCE_QUANTIZATION: INT4

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

does this pass the entire suite of KVV (OCRBench, MMMU Pro Vision BEAM (1M), DeepSWE)? if so, plz send logs and manual reprod scripts

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

We ran the full Kimi Vendor Verifier (KVV @ 66092cf) against this exact serving config on one MI355X node (TP8). We used the image this PR pins (rocm/atom-dev:nightly_202610310756@sha256:1c20b688…) with the same Quark online quantization (online_quant_config, global ptpc_fp8, same exclusions), INT4 quick all-reduce, FP8 KV, the same AITER/ATOM flags, and the DSpark draft. Client settings follow the KVV README for K3 in open-source mode: thinking on, thinking_effort: max, temperature 1.0, top_p 0.95.

Benchmark This config KVV vendor table Moonshot
OCRBench 0.864 ± 0.011 0.878 – 0.897 0.89
MMMU Pro Vision 0.817 ± 0.009 0.804 – 0.820 0.82
BEAM (1M) 0.258 0.291 – 0.322 0.31
DeepSWE 0.646 (73 / 113) 0.658 – 0.695 0.675

Quantization: the same techniques as the merged vLLM Kimi-K3 MI355X recipes

  • INT4 all-reduce. Both vLLM recipes set INT4 quick all-reduce: VLLM_ROCM_QUICK_REDUCE_QUANTIZATION: INT4 in the single-node recipe and in the P/D recipe. This PR selects the same AITER quick-reduce mode with AITER_QUICK_REDUCE_QUANTIZATION: INT4. The sign-off check also lists Kimi-K3 as grandfathered for integer all-reduce.
  • Online FP8 quantization of BF16 weights.
    • The vLLM single-node recipe quantizes online to FP8 per channel: quantization-config: {"targets":{"*in_proj_qkvgfab":"fp8_per_channel"}} (L128).
    • This PR uses ATOM's Quark online quantization (ptpc_fp8: FP8 per-channel weights, per-token activations) on the BF16 linears.
    • The exclusions keep the MXFP4 experts, the latent expert projections, the vision tower and the DSpark draft out of it.
  • FP8 MoE stage-2 output and FP8 KV are set in both vLLM recipes as well: AITER_FLYDSL_STAGE2_FP8: '1' (single-node L56, P/D L83).

They do not move accuracy. We used the same image and client and changed only the server switches:

Server settings OCRBench
This PR (Quark ptpc_fp8 online quantization + INT4 all-reduce) 0.864 ± 0.011
Without ptpc_fp8 0.868 ± 0.011
Every precision switch off (no online quantization, BF16 all-reduce, BF16 expert activations, BF16 KV, fp32 KDA state, BF16 prefill attention) 0.849 ± 0.011

The three runs are within noise of each other.

  • MMMU Pro Vision is within the vendor range.
  • DeepSWE:
    • 73 of 113 tasks were solved. One task is worth 0.009 and a single run's standard error is about 0.045, so this is within run-to-run noise of the vendor rows.
    • Harness: Pier 0.3.1 with kimi-code 0.23.6, the version KVV names. There were no infrastructure failures.
    • Our hosts firewall ports 80/443, so we let Pier's egress proxy reach the model server on its port. That is the only harness change, and the patch is included.
  • BEAM:
    • With KVV's default budget, 16 of the 35 conversations render past the 1,048,576-token window. K3's chat framing adds 25–40k tokens beyond the script's 5k allowance.
    • We ran those 16 with KVV's own --max-context-tokens 1000000, which drops the oldest 4–5% of their messages. The 19 conversations that fit at the defaults score 0.277.
    • KVV does not name the judge model behind its table. We used openai/gpt-oss-120b (reasoning effort high), so absolute scores may not compare directly.

Logs and manual repro scripts: https://github.com/Jasen2201/InferenceX/releases/tag/kimik3-atom-kvv-20261101

  • the server launch script, with the exact flags and the A/B switches;
  • the KVV client runner, one command per benchmark;
  • the Pier kimi-code adapter and its patch;
  • per-sample OCRBench and MMMU results;
  • all 700 BEAM answers with judge scores;
  • DeepSWE per-task results with full agent transcripts.

On the tool-call eval that blocked this PR: the fix is upstream in ROCm/ATOM#2849, and this PR now pins the nightly that includes it. The partial sweep 41183113911 shows kimi_tool_call_schema_full at 0.978–0.988 on all four 1P1D points, up from 0.934 at c1. Could you re-apply the sweep label so the remaining 1P2D points can finish?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@Jasen2201 hmm what is the reason BEAM is so low compared to sglang/vllm official?

0.258 vs vLLM official 0.3188 vs SGLang official 0.3107

Is the eval setup the same? can yall chat with moonshot and/or inferact (official AMD partner) on what their official setup is verus ur setup?

image

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

we would appreipcate it if u can provide this comparsion for BEAM & deepswe too plz?

image

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Both vLLM recipes set INT4 quick all-reduce

Yes @Jasen2201 , ever since we started the workstream (based on feedback from upstream community & from folks that deploy inference in production) to set an quality bar that Kimi (KVV) set out and the quality bar that AMD customers set, we have been asking the same questions on AMD vLLM & NVIDIA vLLM Kimi K3 PRs also

#4638 (review)

#4391 (comment)

…tom-disagg-agentx

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
@Jasen2201 Jasen2201 added the full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures label Nov 2, 2026
@Jasen2201

Copy link
Copy Markdown
Collaborator Author

we will also run comparative experiments between Atom and Vllm&SGLang. These experiments are GPU-intensive and time-consuming; we will share the results later. Our goal is to ensure ATOM achieves precision parity with vLLM or SGLang. @functionstackx

@functionstackx

functionstackx commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

we will also run comparative experiments between Atom and Vllm&SGLang. These experiments are GPU-intensive and time-consuming; we will share the results later. Our goal is to ensure ATOM achieves precision parity with vLLM or SGLang. @functionstackx

Thanks @Jasen2201 for running the KVV, appreipcate that you are supportive of the recent workstream to improve InferenceX quality bar. I am glad you took the first step in running the entire KVV eval suite.

The goal should be to match the quality bar set out by the official KVV suite.

Based on your comments, we chatted with a couple of inference experts in the community that have passed the entire KVV eval suite and they say that your reported ATOM's 0.258 on BEAM (1M) is significant below the quality bar for Kimi K3 BEAM KVV and suggest providing an break down of running it without any of these non-original quantization. We are happy to forward any reasonable questions to the inference experts in the community that have passed the entire KVV eval suite if you have anything else. Looking forward to seeing it improve in quality

i sent a couple additional thoughts in slack that you may find useful (reach out to @chunfangamd )

@functionstackx functionstackx removed the full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures label Nov 2, 2026
@functionstackx

functionstackx commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

These experiments are GPU-intensive and time-consuming

@Jasen2201 Agree , developing & maintaining an engine that matches the quality bar (Moonshot's KVV) of production customers is GPU-intensive and time-consuming

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

4 participants