Skip to content

perf(agentx): restore LMCache retrieves on Kimi-K3 MI355X DCP8 - #2831

Open
sammshen wants to merge 2 commits into
mainfrom
amd/k3-mi355x-lmcache-dcp-retrieve-fix
Open

perf(agentx): restore LMCache retrieves on Kimi-K3 MI355X DCP8#2831
sammshen wants to merge 2 commits into
mainfrom
amd/k3-mi355x-lmcache-dcp-retrieve-fix

Conversation

@sammshen

@sammshen sammshen commented Sep 4, 2026

Copy link
Copy Markdown
Collaborator

The LMCache DRAM tier on the DCP8 arm is currently write-only. Under DCP the connector's scheduler and worker roles derived different LMCache model names, so every lookup missed:

Worker_TP0_DCP0  cache_model_name=moonshotai/Kimi-K3##lmcache-dcp-layout-v1-d8-interleave1536
EngineCore       cache_model_name=moonshotai/Kimi-K3
LMCache ERROR: No GPU context found for model moonshotai/Kimi-K3 with world size 8 during lookup!

Measured on run 33773561410, per GPU:

conc DCP store retrieve external hit
14 1 2,542 ops / 451 GB 1,096 ops / 1,150 GB 85.4%
52 8 2,144 ops / 120 GB 0 ops / 0 GB 0.0%

So the c44/48/52 points on main measure DCP and concurrency, not the offload tier, and they pay the store bandwidth without ever reading it back.

Changes

  • Pin lmcache 0.5.5rc5+rocm7.2 from the versioned v0.5.5rc5-rocm release. rc5 is status=identical to the merge commit of LMCache#4936, which fixes the above.
  • Move off nightly-rocm. That tag keeps only its newest wheel, so the previous 0.5.5.dev89+rocm7.2 pin no longer resolves at all — --find-links now offers only dev94. Versioned -rocm releases are immutable (v0.5.5rc4-rocm still carries its wheel), so an exact pin keeps working.
  • Derive the MP server ports from $PORT instead of the fixed 6555/8090, which two cells on one runner would contend for.
  • Raise --l1-read-ttl-seconds to 3600. The L1 read lock is held from prefetch through retrieve; at these concurrencies a queued request exceeds the 300s default and the retrieve fails. Latent until now only because no retrieve ever ran.

Sweep scope

Not append-only — the recipe fingerprint changes, so all 9 points of the config key re-run. That is intended: c44/48/52 need re-measuring with the tier actually serving, and the dcp1 points share the recipe.

Verified: matrix generates the expected 9 points on rc5, perf-changelog.yaml adds no deletions against main, pytest utils/matrix_logic utils/test_process_changelog.py 280 passed.


Note

Medium Risk
Touches agentic benchmark dependency pins and LMCache server wiring; incorrect versions or ports would skew or break MI355X Kimi-K3 offload measurements, but scope is limited to that perf recipe.

Overview
Fixes the Kimi-K3 MI355X agentic LMCache path so DRAM offload can read KV again under DCP8, and keeps installs reproducible on ROCm.

LMCache pin: Moves from 0.5.5.dev89+rocm7.2 on the rolling nightly-rocm index to 0.5.5rc5+rocm7.2 from the immutable v0.5.5rc5-rocm release (rc5 includes the DCP cache-identity fix so scheduler and workers agree on model names). The matrix in configs/amd-master.yaml is updated to match.

Server recipe (kimik3_fp4_mi355x_mtp.sh): LMCache MP ports are derived from $PORT (+13000 / +14000) instead of fixed 6555/8090 to avoid collisions when two cells share a host. --l1-read-ttl-seconds is raised to 3600 so queued retrieves at these concurrencies do not fail on the 300s default lock TTL.

Changelog: Documents the pin, DCP retrieve fix, port derivation, and TTL change for kimik3-fp4-mi355x-vllm-agentic-mtp (full 9-point recipe re-run expected).

Reviewed by Cursor Bugbot for commit 6d4b648. Bugbot is set up for automated code reviews on this repo. Configure here.

Pin lmcache 0.5.5rc5+rocm7.2 from the versioned v0.5.5rc5-rocm release.
rc5 is the merge commit of LMCache #4936, which fixes the DCP cache
identity: the scheduler and the workers derived different model names,
so every lookup missed and the DRAM tier was write-only at concurrency
44-52.

The previous pin also no longer resolves. nightly-rocm keeps only its
newest wheel, so 0.5.5.dev89+rocm7.2 disappeared when that tag rebuilt.

Also derive the MP server ports from $PORT rather than the fixed
6555/8090, and raise the L1 read-lock TTL to 3600s.
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

2 similar comments
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

@sammshen sammshen added AMD agentx AgentX benchmarks, recipes, and infrastructure full-sweep-enabled labels Sep 4, 2026

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good — straightforward dependency re-pin plus port/TTL fixes for the Kimi-K3 MI355X LMCache benchmark. Reviewed: version-string parity between the script and configs/amd-master.yaml, the $PORT-derived LMCache port arithmetic against how $PORT is already made unique per concurrent runner cell (runners/launch_mi355x-amds.sh), and the perf-changelog.yaml entry — it's a pure tail append using the exact pull/XXX placeholder convention documented in CONTRIBUTING.md/utils/validate_perf_changelog.py.

Extended reasoning...

Overview

The diff touches three files for a single logical change: re-pinning the LMCache KV-offload dependency used by the Kimi-K3 FP4 MI355X agentic-MTP benchmark from a nightly dev build to an immutable versioned pre-release (0.5.5rc5+rocm7.2), moving the LMCache MP-server ports to be derived from $PORT, raising --l1-read-ttl-seconds to 3600, and appending a matching perf-changelog.yaml entry. No source/runtime logic outside this one benchmark path is touched.

Security risks

None identified. This is a version pin and shell arithmetic change in a benchmark script plus a YAML config/changelog update — no auth, crypto, or permission-sensitive code paths are involved. The LMCache index URL is switched from a nightly to a versioned immutable release tag, which if anything reduces supply-chain risk (immutable artifact vs. a rolling "latest wheel" tag).

Level of scrutiny

Low-to-medium is appropriate: config/version-pin changes with matching recipe updates are the well-established, mechanical pattern this repo uses per AGENTS.md/CONTRIBUTING.md, and the change is self-contained to one benchmark cell. I did verify the two substantive risk points myself: (1) the version string is identical across the benchmark script and configs/amd-master.yaml (both updated together as required), and (2) the $PORT-derived port arithmetic (PORT+13000, PORT+14000) is safe because $PORT is already guaranteed unique per concurrently-running cell on a shared runner (runners/launch_mi355x-amds.sh derives it from RUNNER_NAME), which is the same invariant the main vLLM server's --port "$PORT" already relies on — so the new LMCache ports inherit that uniqueness without introducing a new collision class.

Other factors

The perf-changelog.yaml diff is a clean tail-append (git diff shows only additions after the prior last entry, no altered bytes), and the pull/XXX placeholder exactly matches PR_LINK_PLACEHOLDERS in utils/validate_perf_changelog.py and the example in CONTRIBUTING.md, so it is not something requiring hand-editing. I also confirmed the --use-chat-template convention mentioned in the task's "conventions noted" does not apply to this file — this script calls run_eval, not run_benchmark_serving (the same pattern as every other *_mtp.sh file under benchmarks/single_node/agentic/), so that note was a false lead for this particular script. Given the mechanical nature of the change, consistency with existing patterns, and no unresolved objections in the PR timeline, this is a reasonable approve candidate; I'm choosing not to add a "what was reviewed" style defer/approve verdict beyond a light one since nothing here appears to need deeper human scrutiny.

This review covers commit 565db2a, which is no longer the latest commit on this pull request; later commits are not covered by it.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

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

Labels

agentx AgentX benchmarks, recipes, and infrastructure AMD full-sweep-enabled

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant