Skip to content

[KimiK3][AgentX]: H200 KimiK3 Day 0 support - #2353

Merged
cquil11 merged 92 commits into
mainfrom
agent/kimik3-h200-agentx
Aug 7, 2026
Merged

[KimiK3][AgentX]: H200 KimiK3 Day 0 support#2353
cquil11 merged 92 commits into
mainfrom
agent/kimik3-h200-agentx

Conversation

@cquil11

@cquil11 cquil11 commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Add Kimi K3 MXFP4 AgentX Day-0 performance recipes for H200, based on the official vLLM recipe.
  • Use the official DSpark K7 probabilistic drafting and block rejection configuration.
  • Use direct multi-node vLLM from functionstackx/srt-slurm-nv#1; srt-slurm owns allocation, startup, readiness, and rank-aware logs.
  • Preserve the model-default 1M context length without a --max-model-len override or vLLM source patch.
  • Pin the same AIPerf revision and five-minute reconstructed trace idle-gap cap used by the Qwen3.5 AgentX B200 PR #2420 and B300 PR #2421.
  • Package the complete srt-slurm log directory as the normal multinode_server_logs artifact on success, failure, or cancellation.
Orientation Topology Nodes AgentX concurrency
Latency TP16 / DP2 / EP32 4 1–8, 10, 12
Balanced TP8 / DP4 / EP32 4 1–8, 10, 12, 14, 16
Throughput + SimpleCPU KV offload TP8 / DP4 / EP32 4 8–32, step 2

Validation

  • InferenceX matrix tests: 224 passed.
  • The generated H200 AgentX matrix contains 35 unique performance points.
  • Direct H200 validation showed pure TP32 has 1.52 GiB of KV memory versus 27.04 GiB required for one 1,048,576-token request; pure TEP32 has negative available KV memory. Neither can preserve the native context.
  • TP16 / DP2 / EP32 and TP8 / DP4 / EP32 completed targeted AgentX runs with zero request errors and native 1M context in run 30575281432.
  • The SimpleCPU offload arm completed its 87/87 warmup requests with zero errors in the same run and was manually stopped during profiling at the operator's request; its server logs were uploaded successfully.
  • Full Pareto-frontier validation is in progress.

@github-actions

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 关于重新运行失败任务的文档

@cquil11 cquil11 closed this Jul 27, 2026
@cquil11 cquil11 reopened this Jul 27, 2026
@cquil11 cquil11 changed the title [KimiK3][AgentX]: H200 KimiK3 Day 0 support / [KimiK3][AgentX]:新增 H200 KimiK3 Day 0 支持 [KimiK3][AgentX]: H200 KimiK3 Day 0 support Jul 27, 2026
@cquil11
cquil11 marked this pull request as ready for review July 27, 2026 23:24
@cquil11
cquil11 requested a review from a team July 27, 2026 23:24
@claude

claude Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Claude finished @cquil11's task in 8m 0s —— View job


Review of PR #2353

  • Gather context: read PR diff and changed files
  • Validate master config (image accessibility, model prefix, perf-changelog position)
  • Review connector, launch script, and benchmark script for bugs
  • Post inline comments and summary

Found 1 blocking issue and 1 warning (see inline comments):

  1. 🔴 benchmarks/multi_node/agentic/kimik3_fp4_vllm.sh — the throughput (DEP16) orientation uses --data-parallel-hybrid-lb, where each node's API server only balances across its local DP ranks, but the connector and AgentX client send all traffic to the head node only. Node 1's 8 engines would receive zero requests, so the throughput results would silently measure 8 GPUs while allocating 16. Suggested fix: internal LB mode (--headless + --data-parallel-start-rank on rank > 0, drop --data-parallel-hybrid-lb).
  2. 🟡 runners/connectors/slurm_pyxis.sh — the 240-minute default allocation wall time conflicts with the config's 120-minute startup budget plus a 4-point agentic sweep; Slurm would kill the job mid-benchmark. Suggest setting MULTINODE_TIME_LIMIT_MINUTES in the config.

Checks that passed: perf-changelog.yaml entry is present and appended at the end of the file; vllm/vllm-openai:kimi-k3 is a public Docker Hub reference; the connector includes the enroot import docker:// reproducibility pattern; --enable-expert-parallel is correctly gated on EP > 1; the kimik3 model prefix is already supported on main; server launch args are multi-line; result files land where the multinode workflow collects them (/workspace$GITHUB_WORKSPACE, LOGS/agentic).

Note: I could not verify the day-0 image's support for vllm serve --nnodes/--node-rank/--master-addr (latency/balanced orientations) since the vLLM source MCP server and network access were unavailable in this run; those flags match the stated official recipe, so I did not flag them.

Comment thread benchmarks/multi_node/agentic/kimik3_fp4_vllm.sh Outdated
Comment thread runners/connectors/slurm_pyxis.sh Outdated
@cquil11
cquil11 marked this pull request as draft July 27, 2026 23:33

@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.

Additional findings (outside current diff — PR may have been updated during review):

  • 🔴 benchmarks/multi_node/agentic/kimik3_fp4_vllm.sh:96-113 — The DEP16 throughput branch sets --data-parallel-hybrid-lb (kimik3_fp4_vllm.sh:102-113) without --headless, but this repo's own docs (benchmarks/multi_node/llm-d/README.md) explain hybrid-lb makes each node run an independent api-server that only load-balances its own local DP ranks — cross-node fan-out needs an external per-node router, which the Slurm/Pyxis connector doesn't provide. Since the AgentX client (agentic_srt.sh/benchmark_lib.sh:1760) only ever sends traffic to http://localhost:$PORT on the head node, the second node's 8 DP ranks (start-rank 8-15) never receive real requests, so the headline 'throughput-oriented' DEP16 sweep silently measures an 8-GPU deployment instead of 16.

    Extended reasoning...

    The bug: In the DEP/throughput branch of kimik3_fp4_vllm.sh (lines 96-113), the server is launched with --data-parallel-size 16, --data-parallel-size-local 8, --data-parallel-hybrid-lb, and critically no --headless on either node. This is meant to stand up a single cross-node DP16+EP engine spanning the two allocated H200 nodes, one api-server-facing endpoint that fans requests out to all 16 DP ranks.

    Why this doesn't do what it looks like it does: This repo's own documentation at benchmarks/multi_node/llm-d/README.md ("Why one entry per node" section) explicitly documents the semantics of --data-parallel-hybrid-lb: 'With hybrid-lb, every node runs its own api-server ... and internally load-balances its own local DP ranks', and cross-node fan-out is handled by an external router (llm-d's EPP+Envoy), which is why server.sh's add_role() deliberately emits one endpoint per node rather than one shared endpoint. In other words, hybrid-lb does not create one logical multi-node frontend — it creates N independent frontends (one per node), each of which only sees its own local ranks, and something outside vLLM must route requests across those N frontends.

    The code path that triggers it: The Slurm/Pyxis connector added in this PR (runners/connectors/slurm_pyxis.sh) provides no such external router. The client-side srun step runs with --nodelist="$head_node" only (line ~282), i.e. the AgentX client container is placed exclusively on the head node. The client entrypoint, benchmarks/multi_node/agentic_srt.sh, delegates request construction to benchmark_lib.sh's build_replay_cmd, which hardcodes REPLAY_CMD+=" --url http://localhost:$PORT" (benchmark_lib.sh:1760) — i.e. every request in the sweep is sent to the head node's local api-server. The connector's readiness poll (curl ... "http://$head_node:$PORT/health") similarly only ever checks the head node. There is no second router, no per-node endpoint list, and no code that ever contacts the second node's api-server.

    Concrete walkthrough: With WORLD_SIZE=16, GPUS_PER_NODE=8, node 0 (rank 0) starts an api-server on localhost:$PORT that hybrid-lb load-balances across its local ranks 0-7. Node 1 (rank 1) independently starts its own api-server on the same port on its own host, hybrid-lb-balancing local ranks 8-15 — but nothing ever connects a client to it. The AgentX client, running only on the head node, sends its entire concurrency sweep (16, 32, 64, 128) to http://localhost:$PORT, which is node 0's api-server. Node 0 spreads that load across its 8 local ranks; node 1's 8 ranks sit idle for the duration of the run (aside from any lockstep EP all-to-all participation with dummy/empty batches). The result: a benchmark advertised and labeled as "DEP16" / 16-GPU throughput-oriented actually measures an 8-GPU deployment, with no error, warning, or indication in the output that half the allocated GPUs never processed real traffic.

    Why nothing else catches this: The TP/latency and TEP/balanced branches in the same file correctly avoid this trap — they use a single cross-node engine with --headless set on NODE_RANK > 0, so only one real api-server (on the head node) exists and it legitimately spans both nodes via TP. The DEP branch is the odd one out: it's structurally similar to the llm-d pattern (which requires an external router) but is deployed through a connector that was only ever built for the single-api-server case.

    Suggested fix: Either (a) drop --data-parallel-hybrid-lb and instead set --headless on the non-zero node rank (mirroring the TP/TEP branches), so vLLM's default internal-LB rank-0 api-server fans requests out across all 16 DP ranks through one endpoint, or (b) if hybrid-lb is intentionally required for this topology, extend the connector to run/route through both nodes' endpoints (analogous to llm-d's EPP+Envoy) rather than sending all client traffic to a single localhost URL.

Comment thread perf-changelog.yaml
Comment thread configs/nvidia-master.yaml Outdated
@cquil11
cquil11 marked this pull request as ready for review July 27, 2026 23:55
@claude

claude Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Claude finished @cquil11's task in 6m 59s —— View job


Re-review: PR #2353 (restructured — connector removed, lifecycle folded into the H200 runner)

  • Gather context: diff vs origin/main, read the 4 changed files
  • Verify previous findings against the new structure
  • Run standard config validations (image, model prefix, perf-changelog position, enroot import, EP gating)
  • Post inline comments and summary

Re-review result: 1 new blocking issue, 1 carried-over blocking issue, 1 carried-over warning (see inline comments).

  1. 🔴 NEWrunners/launch_h200-dgxc-slurm.sh:53: PORT is never defined in the multinode workflow env (benchmark-multinode-tmpl.yml sets CONC_LIST/CONC/DURATION but no PORT; the existing srt-slurm client path in this same file hardcodes PORT=8888 at line 486 for exactly this reason). With set -eo and no -u, export PORT="$PORT" exports an empty string, so the server gets vllm serve --port "" and crashes on both ranks — the whole new path fails on first run. Fix: export PORT="${PORT:-8888}". Fix this →
  2. 🔴 Still applicablebenchmarks/multi_node/agentic/kimik3_fp4_vllm.sh:50-56: the DEP16 throughput branch still uses --data-parallel-hybrid-lb, where each node's api-server balances only its local DP ranks, but the health check and AgentX client (benchmark_lib.sh:1760) send all traffic to the head node. Node 1's 8 engines get zero real requests, so DEP16 silently benchmarks 8 GPUs while allocating 16. Drop-in fix (internal LB with --headless on rank > 0, mirroring the TP/TEP branch) is in the inline comment.
  3. 🟡 Still applicablerunners/launch_h200-dgxc-slurm.sh:68: the flat --time=240 allocation conflicts with the 120-min readiness budget plus enroot import (up to 30-min lock wait) plus the 4-point sweep; Slurm would kill the job mid-benchmark.

Still-applicable minor notes from the previous review (not re-posted inline): the between-point drain check in agentic_srt.sh is a silent no-op for this native vLLM server (it only reads the Dynamo-specific dynamo_frontend_active_requests metric, and this config never sets AIPERF_SERVER_METRICS_URLS); and the PR title/body are still English-only, while AGENTS.md requires a bilingual title (/ <中文标题>) and a ## 中文说明 section.

Checks that passed in the new structure: perf-changelog.yaml entry is appended at the end of the file; vllm/vllm-openai:kimi-k3 is a public Docker Hub reference; the kimik3 model prefix already exists on main; the runner includes the enroot import docker:// reproducibility pattern with a flock guard; --enable-expert-parallel is correctly gated on PREFILL_EP > 1; server launch args are multi-line; NATIVE_MULTINODE is unset on existing dynamo paths (script has no set -u), so existing H200 multinode flows are unaffected; agentic results land where the workflow collects them (AGENTIC_OUTPUT_DIR defaults to /workspace$GITHUB_WORKSPACE, raw artifacts under LOGS/agentic); the readiness loop's post-loop attempt > 720 check is correct; and the cleanup trap reliably scancels the allocation on exit.

Comment thread runners/launch_h200-dgxc-slurm.sh Outdated
Comment thread benchmarks/multi_node/agentic/kimik3_fp4_vllm.sh Outdated
Comment thread runners/launch_h200-dgxc-slurm.sh Outdated
Comment thread runners/launch_h200-dgxc-slurm.sh Outdated
Comment thread runners/launch_h200-dgxc-slurm.sh Outdated
Comment thread benchmarks/multi_node/agentic/kimik3_fp4_vllm.sh Outdated
Comment thread runners/launch_h200-dgxc-slurm.sh Outdated
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

Align H200 Kimi-K3 AgentX with the AIPerf revision shared by the B200 and B300 Qwen AgentX recipes.

中文:升级 AIPerf 基准测试框架,使 H200 Kimi-K3 AgentX 与 B200、B300 Qwen AgentX 配方使用同一版本。
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Align H200 Kimi-K3 AgentX with the barrier-aware AIPerf revision validated by the latest B300 Qwen AgentX work.

中文:升级 AIPerf 基准测试框架,使 H200 Kimi-K3 AgentX 与最新 B300 Qwen AgentX 验证的屏障感知版本保持一致。
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@cquil11

cquil11 commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

/stage-results 30758322161

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

cquil11 commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

/stage-results 30758322161

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@cquil11 staged run 30758322161: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-02~r30758322161

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

@cquil11 已将运行 30758322161 发布到预发布环境:https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-02~r30758322161

后续的 /stage-results 请求不会移除此运行;再次发布相同的运行 ID 会更新其预发布数据。预发布工作流

Merge current workflow, matrix, and AIPerf updates from origin/main. Resolve the AIPerf gitlink to 818c3a5a, which contains the H200 timing and barrier-watchdog fixes.

中文:将 origin/main 的最新工作流、矩阵逻辑和 AIPerf 更新合并到 H200 Kimi K3 分支。AIPerf 子模块统一到 818c3a5a,该版本包含 H200 所需的时序修复和屏障看门狗修复。
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Rely on the shared origin/main default and command construction so AgentX replay receives the trace idle-gap cap exactly once.

中文:复用 origin/main 的统一默认值和命令拼装逻辑,确保 AgentX 重放只传入一次轨迹空闲间隔上限参数。
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

2 similar comments
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@cquil11

cquil11 commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator Author

/stage-results 30781313910

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@cquil11 staged run 30781313910: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-03~r30781313910

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

@cquil11 已将运行 30781313910 发布到预发布环境:https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-03~r30781313910

后续的 /stage-results 请求不会移除此运行;再次发布相同的运行 ID 会更新其预发布数据。预发布工作流

@cquil11 cquil11 changed the title [KimiK3][AgentX]: H200 KimiK3 Day 0 support / [KimiK3][AgentX]:H200 KimiK3 Day 0 支持 [KimiK3][AgentX]: H200 KimiK3 Day 0 support Aug 7, 2026
@cquil11

cquil11 commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

/stage-results 30781313910

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

@cquil11 staged run 30781313910: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-03~r30781313910

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

@cquil11 已将运行 30781313910 发布到预发布环境:https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-03~r30781313910

后续的 /stage-results 请求不会移除此运行;再次发布相同的运行 ID 会更新其预发布数据。预发布工作流

@cquil11

cquil11 commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

/stage-results 30781313910

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

@cquil11 staged run 30781313910: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-03~r30781313910

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

@cquil11 已将运行 30781313910 发布到预发布环境:https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-08-03~r30781313910

后续的 /stage-results 请求不会移除此运行;再次发布相同的运行 ID 会更新其预发布数据。预发布工作流

@cquil11

cquil11 commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run 30781313910

Keep current main, reapply the Kimi K3 H200 configuration, and append the PR changelog entry at the latest tail.\n\n中文:保留当前 main,重新应用 Kimi K3 H200 配置,并将本 PR 的性能变更日志条目追加到最新文件末尾。
@cquil11
cquil11 merged commit 5621849 into main Aug 7, 2026
27 checks passed
@cquil11
cquil11 deleted the agent/kimik3-h200-agentx branch August 7, 2026 06:58
max-num-seqs: 5
max-num-batched-tokens: 4096
speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}'
enforce-eager: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Why using enforce eager?

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

Projects

Development

Successfully merging this pull request may close these issues.

3 participants