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 5 commits into
mainfrom
jasen/kimik3-mi355x-atom-disagg-agentx
Open

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

Conversation

@Jasen2201

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 1793 GB and 1028 GB for the eight prefill ranks. Decode runs no CPU tier. ReplaySSM is on for the DCP8 points.
  • Draft precision. Inferact/Kimi-K3-DSpark is served as it ships, in BF16: the online_quant_config exclusions cover every draft layer (layers.* and context_proj), as in the single-node ATOM recipe. 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.
  • The image is rocm/atom-dev:nightly_202610190554, pinned by digest (ROCm/ATOM daa4f1bb8).

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.
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 分别预算 1793 GB 和 1028 GB。解码不使用 CPU 层。DCP8 测试点开启 ReplaySSM。
  • 草稿精度。 Inferact/Kimi-K3-DSpark 按发布时的 BF16 精度提供服务:online_quant_config 的排除列表覆盖全部草稿层(layers.* 和 context_proj),与单节点 ATOM 配方一致。草稿从 /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_202610190554,按 digest 固定(ROCm/ATOM daa4f1bb8)。

风险。

参考: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 的在线量化记录核对草稿层的排除覆盖。

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?

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.

2 participants