Skip to content

[NV][AgentX] Add Kimi-K3 B300 vLLM DSpark sweep / [NV][AgentX] 新增 Kimi-K3 B300 vLLM DSpark 并发扫描 - #2616

Open
xinli-sw wants to merge 13 commits into
mainfrom
kimik3-b300-dcp8-mooncake
Open

[NV][AgentX] Add Kimi-K3 B300 vLLM DSpark sweep / [NV][AgentX] 新增 Kimi-K3 B300 vLLM DSpark 并发扫描#2616
xinli-sw wants to merge 13 commits into
mainfrom
kimik3-b300-dcp8-mooncake

Conversation

@xinli-sw

@xinli-sw xinli-sw commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator

Description

Move the B300 Kimi-K3 NVFP4 AgentX DSpark recipe to a TP8 × DCP8 layout with
Mooncake as the external KV tier, and extend the concurrency sweep to eleven
points.

  • Parallelism. TP8 with --decode-context-parallel-size 8 and
    --dcp-comm-backend a2a; TP8 remains the only single-node layout because the
    ~1.5 TB MXFP4 checkpoint does not fit below 8 GPUs.
  • KV tier. Replace SimpleCPUOffloadConnector with MooncakeStoreConnector
    (mooncake-transfer-engine-cuda13==0.3.11.post1), sized from
    dram-utilization: 0.75 divided across the 8 TP ranks. The RDMA rail is
    chosen at runtime from the first ACTIVE device, since mlx5_0 is down on some
    nodes and a hardcoded rail has no fallback.
  • Attention. TOKENSPEED_MLA for decode with TRTLLM_RAGGED MLA prefill and
    prefill query quantisation, under fp8 KV cache.
  • Drafting is selected by concurrency, with the pinned acceptance length
    tracking the draft length in each arm:
    • concurrency ≤ 8 — DSpark level 7, synthetic acceptance 3.84
    • concurrency 16 — DSpark level 3, synthetic acceptance 3.00
    • concurrency > 16 — no drafting
  • Sweep. Concurrency 1, 2, 4, 8, 16, 24, 32, 40, 48, 56, 70 in a single
    search-space entry. The arms are kept disjoint in concurrency because the
    exp-name carries concurrency and spec but not the arm.
  • Image. vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-5894fdf, which carries
    the Kimi-K3 DCP, DSpark-under-DCP and Mooncake-hybrid changes
    (vllm-project/vllm agentx-k3 @ 5894fdf).

Both acceptance lengths come from the committed golden curve
golden_al_distribution/kimik3_dspark_probabilistic_sample_method_block_rejection_sample_method.yaml
(thinking_on: 7 → 3.84, 3 → 3.00), which is the curve measured with
draft_sample_method=probabilistic and rejection_sample_method=block — the
draft configuration this recipe runs. Throughput jobs pin synthetic acceptance;
EVAL_ONLY=true switches to real block verification, since synthetic acceptance
commits drafted tokens regardless of the target's logits and would zero the eval
score.

Benchmark evidence. Run 31893747354
executed all eleven agentic / points plus the agentic eval / job green at
commit 630dc8c73. The branch head then advanced to 8f8185de by merging main
(which brought in the MiniMax-M3 GB200 work from #2609); no kimik3 file
differs between the two commits, and reuse of that run is authorised on this PR.

中文说明

将 B300 Kimi-K3 NVFP4 AgentX DSpark 配方迁移到 TP8 × DCP8 布局,采用 Mooncake 作为
外部 KV 层,并将并发扫描扩展为十一个测试点。

  • 并行方式:TP8 搭配 --decode-context-parallel-size 8
    --dcp-comm-backend a2a;由于 ~1.5 TB 的 MXFP4 权重无法在少于 8 卡的情况下装下,
    TP8 仍是唯一的单节点布局。
  • KV 层:以 MooncakeStoreConnector 取代 SimpleCPUOffloadConnector
    mooncake-transfer-engine-cuda13==0.3.11.post1),容量由 dram-utilization: 0.75
    在 8 个 TP rank 间均分。RDMA 通道在运行时从第一个 ACTIVE 设备中选取,因为部分节点的
    mlx5_0 处于关闭状态,硬编码通道没有回退路径。
  • 注意力:解码使用 TOKENSPEED_MLA,预填充使用 TRTLLM_RAGGED 并启用查询量化,
    KV 缓存为 fp8。
  • 按并发选择草稿长度,各分支固定的接受长度与其草稿长度一致:
    • 并发 ≤ 8 —— DSpark level 7,合成接受长度 3.84
    • 并发 16 —— DSpark level 3,合成接受长度 3.00
    • 并发 > 16 —— 不启用草稿
  • 扫描范围:并发 1、2、4、8、16、24、32、40、48、56、70,合并为单个 search-space
    条目。由于 exp-name 只携带并发与 spec 而不含分支信息,各分支的并发保持互不重叠。
  • 镜像vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-5894fdf,其中包含 Kimi-K3 的
    DCP、DCP 下的 DSpark 以及 Mooncake 混合改动(vllm-project/vllm agentx-k3 @ 5894fdf)。

两个接受长度均取自已提交的黄金曲线
golden_al_distribution/kimik3_dspark_probabilistic_sample_method_block_rejection_sample_method.yaml
thinking_on:7 → 3.84,3 → 3.00),该曲线正是在
draft_sample_method=probabilisticrejection_sample_method=block 下测得,
与本配方的草稿配置一致。吞吐作业固定合成接受率;EVAL_ONLY=true 时切换为真实的 block
校验,因为合成接受会不顾目标模型 logits 直接采纳草稿 token,会使评测分数归零。

基准测试证据Run 31893747354
在提交 630dc8c73 上完整执行了全部十一个 agentic / 测试点以及 agentic eval / 作业,
且全部通过。随后分支头因合并 main(引入了 #2609 的 MiniMax-M3 GB200 改动)推进到
8f8185de;两个提交之间没有任何 kimik3 文件发生变化,且本 PR 已授权复用该次运行。

Related Issue

N/A

Type of Change

  • Benchmark configuration / recipe update
  • Inference engine image bump

Checklist

  • Full sweep: run 31893747354 — 11 agentic points + 1 agentic eval, all green at 630dc8c73
  • perf-changelog.yaml entry added for kimik3-fp4-b300-vllm-agentic-dspark
  • Acceptance lengths match the committed golden AL curve (probabilistic/block curve: level 7 → 3.84, level 3 → 3.00)
  • EVAL_ONLY runs use real block verification rather than synthetic acceptance
  • Sweep re-executed at the current head 8f8185de — the current-head run reuse-gated, so its benchmark and eval leaves are skipped; the evidence above is from 630dc8c73, which is byte-identical for every kimik3 path

…ooncake

Move the recipe to TP8 x DCP8 with Mooncake as the external KV tier, on an image
that carries the Kimi-K3 DCP, DSpark-under-DCP and Mooncake hybrid-attention
changes. Sweep concurrency 1-70, drafting with DSpark level 7 at 8 and below.

将该配方迁移到 TP8 x DCP8,并以 Mooncake 作为外部 KV 层,所用镜像已包含 Kimi-K3 DCP、
DCP 下的 DSpark 以及 Mooncake 混合注意力相关改动。并发扫描 1-70,其中并发 8 及以下使用
DSpark level 7。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@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 关于重新运行失败任务的文档

@xinli-sw
xinli-sw marked this pull request as draft August 15, 2026 05:28
@xinli-sw
xinli-sw marked this pull request as ready for review August 15, 2026 05:39
@claude

claude Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Claude finished @xinli-sw's task in 5m 53s —— View job


PR Review

  • Gather context and read the diff vs origin/main
  • Review benchmarks/single_node/agentic/kimik3_fp4_b300_vllm_mtp.sh
  • Review configs/nvidia-master.yaml (image accessibility, model prefixes, changelog pairing)
  • Review perf-changelog.yaml (entry appended at end, format)
  • Post review feedback

Summary

No blocking issues found. One 🟡 warning posted inline: the refresh drops --reasoning-parser kimi_k3 / --tool-call-parser kimi_k3 / --enable-auto-tool-choice, which every sibling vLLM agentic recipe retains and which the EVAL_ONLY SWE-bench path (live completions via mini-swe-agent) may depend on — please confirm this is intentional on the agentx-k3 fork image.

Checks that passed:

  • Master config change is paired with a perf-changelog.yaml entry, appended at the end of the file, with the correct PR link; changelog details (concurrency list, DSpark levels, 187 GB/rank Mooncake segment at dram-utilization: 0.5) match the config and script.
  • The dcp-size: 8 and kv-offload-backend: { name: mooncake, version: "0.3.11.post1" } search-space keys are supported by the matrix logic and already exercised by existing entries; DCP_SIZE/KV_OFFLOAD_BACKEND reach the script via benchmark-tmpl.yml and the launcher's --export=ALL.
  • The Mooncake bring-up (embedded mode, master startup + liveness check, cleanup trap) mirrors the proven dsv4_fp4_b200_vllm_mtp.sh pattern; the single-rail mlx5_0 device and eviction tuning are documented as deliberate.
  • The concurrency-selected DSpark arms (K=7 ≤8, K=3 at 16, none >16) are disjoint across the conc-list, so exp-names can't collide, and the golden ALs (3.84 / 3.00) match the committed probabilistic curve values.
  • Cudagraph capture-size generation is correct for all swept concurrencies (dense multiples of 1+K cover every decode batch up to max-num-seqs; the power-of-two tail covers the no-spec high-conc arms).
  • MTP --use-chat-template does not apply: agentic recipes drive AIPerf against /v1/chat/completions rather than run_benchmark_serving.

One note: the image moved from a digest-pinned nightly to the tag vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-5894fdf (fork build, agentx-k3 @ 5894fdf). I couldn't verify the tag's existence on Docker Hub from this environment — the labeled full sweep will confirm it pulls.

--speculative-config "$SPEC_CONFIG"
--stream-interval 10
--attention-backend TOKENSPEED_MLA
--attention-config '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}'

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.

🟡 WARNING: This refresh drops --reasoning-parser kimi_k3, --tool-call-parser kimi_k3, and --enable-auto-tool-choice, which the previous version of this script had and which every other vLLM agentic MTP recipe retains (dsv4_fp4_b300_vllm_mtp.sh:317-319, minimaxm3_fp8_h200_mtp.sh:192-194 — the latter also uses --language-model-only, so that flag doesn't preclude the parsers).

Why it matters: The throughput replay discards live responses, so it's unaffected — but the EVAL_ONLY SWE-bench path consumes live completions via mini-swe-agent. Without a reasoning parser, Kimi-K3's thinking tokens stay inline in content, where they can confuse the agent's action-block parsing and depress or zero the eval score (the same failure mode the synthetic-acceptance split exists to avoid).

Fix: If the agentx-k3 fork image genuinely can't register these parsers, note that in the header comment; otherwise restore them:

Suggested change
--attention-config '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}'
--attention-config '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}'
--reasoning-parser kimi_k3
--tool-call-parser kimi_k3
--enable-auto-tool-choice

Comment on lines 207 to +224
MAX_NUM_SEQS=$((2 * CONC))

# With spec decoding, cudagraph capture sizes are in TOKENS. vLLM rounds
# configured sizes up to multiples of (1 + num_speculative_tokens) and dedups
# them (adjust_cudagraph_sizes_for_spec_decode), so a plain 1..MAX_NUM_SEQS list
# would collapse to covering only MAX_NUM_SEQS/(1+N) sequences and drop the
# largest decode batches to eager. Enumerate the multiples explicitly so there
# is one graph per decode batch of 1..MAX_NUM_SEQS sequences. The graph mode is
# left at the recipe default that the non-MTP K3 arm already validated.
CUDA_GRAPH_CAPTURE_SIZES=""
for ((num_seqs = 1; num_seqs <= MAX_NUM_SEQS; num_seqs++)); do
if [ -n "$CUDA_GRAPH_CAPTURE_SIZES" ]; then
CUDA_GRAPH_CAPTURE_SIZES+=","
# Capture sizes: step * 1..min(max-num-seqs, 128), then the fixed powers of two
# above that. Sizes are tokens when drafting, sequences when not; the 128 caps
# the number of dense entries, not their value.
CAPTURE_STEP=$((1 + NUM_SPEC_TOKENS))
DENSE_COUNT=$MAX_NUM_SEQS
if [ "$DENSE_COUNT" -gt 128 ]; then
DENSE_COUNT=128
fi
CAPTURE_SIZES=""
for ((n = 1; n <= DENSE_COUNT; n++)); do
CAPTURE_SIZES+="${CAPTURE_SIZES:+,}$((n * CAPTURE_STEP))"
done
DENSE_MAX=$((DENSE_COUNT * CAPTURE_STEP))
for t in 64 128 256 512 1024 2048 4096 8192; do
if [ "$t" -gt "$DENSE_MAX" ]; then
CAPTURE_SIZES+=",$t"

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.

🟡 For the no-drafting arm (CONC>16), the CUDA-graph capture list is dense only up to 128 entries then jumps to fixed powers of two (256, 512, ...); at the newly-added CONC=70, MAX_NUM_SEQS=140 falls in the uncaptured 129-255 gap, so the largest decode batches at this arm silently pad to the 256-wide graph (~1.8x wasted compute). A simple fix is to append MAX_NUM_SEQS to the capture-size list explicitly.

Extended reasoning...

The bug

kimik3_fp4_b300_vllm_mtp.sh:207-224 builds the CUDA-graph capture-size list as 1..min(MAX_NUM_SEQS, 128) densely, then appends only the fixed powers of two (64, 128, 256, ...) that exceed DENSE_MAX. For the no-drafting arm (CONC > 16, so CAPTURE_STEP = 1), MAX_NUM_SEQS = 2*CONC. The new sweep entry CONC=70 (added in configs/nvidia-master.yaml) gives MAX_NUM_SEQS=140, but the dense list stops at 128 and the next fixed size is 256 — so nothing in [129, 255] is ever captured. CONC=70 is the only value in the new conc-list [1,2,4,8,16,24,32,40,48,56,70] where 2*CONC exceeds 128; every other value (1..56) stays fully dense.

Why this is reachable, not just headroom

The verifier refutation argues this gap is harmless because MAX_NUM_SEQS = 2*CONC is unused "scheduler headroom" that a CONC=70 agentic workload never actually reaches — i.e., the real running-sequence count stays near CONC (~70), safely inside the dense range. That reasoning is contradicted by this repos own established convention for this exact line. The sibling recipes dsv4_fp4_b300_vllm_mtp.sh:258, dsv4_fp4_b200_vllm_mtp.sh:234-236, and dsv4_fp4_mi355x_vllm_mtp.sh:374-376 all set MAX_NUM_SEQS = 2 * CONC with the explicit comment: "AgentX concurrency counts live session trees, not individual requests. Subagent fan-out can push instantaneous request concurrency above CONC, so leave 2x headroom rather than clipping those bursts at the scheduler." That is, 2*CONC is not a decorative bound — it is sized specifically because real bursts of concurrently-running sequences are expected to approach it. If the 129-140 region were truly unreachable, the recipe would not need 2*CONC scheduler capacity there in the first place.

Why the existing code doesnt prevent it

Prior to this PR, this same script enumerated cudagraph capture sizes as a plain 1..MAX_NUM_SEQS loop with no cap (visible in the diffs removed lines, and still how dsv4_fp4_b300_vllm_mtp.sh:279-282 does it today) — every decode batch size got an exact graph. This PR introduces the DENSE_COUNT cap at 128 for the first time, for legitimate reasons (a 93-layer 2.8T model makes capturing the full ladder slow), but the cap only tracks a count, not MAX_NUM_SEQS itself, so it silently drops coverage whenever 2*CONC > 128. Nothing in the loop checks whether MAX_NUM_SEQS itself ended up outside the capture set.

Proof by walkthrough

  1. CONC=70, no-drafting arm -> NUM_SPEC_TOKENS=0 -> CAPTURE_STEP = 1 + 0 = 1.
  2. MAX_NUM_SEQS = 2*70 = 140.
  3. DENSE_COUNT = min(140, 128) = 128 -> dense sizes are 1,2,...,128 (step 1) -> DENSE_MAX = 128.
  4. The fixed-size loop appends only t > 128 from {64,128,256,512,...}, i.e. it appends 256 next.
  5. Resulting capture set: {1,...,128} ∪ {256,512,1024,2048,4096,8192} — nothing in [129,255].
  6. At runtime, --max-num-seqs 140 lets the scheduler admit decode batches up to 140 sequences; a batch of, say, 135 sequences has no matching entry and vLLM pads it to the next captured size, 256 (~1.9x the tokens actually needed), or falls back to piecewise/eager for that step.
  7. This only happens for CONC=70; every other new sweep point (1,2,4,8,16,24,32,40,48,56) has 2*CONC <= 112 <= 128, staying fully dense.

Impact and fix

This does not crash the run or corrupt output (256 exists, so it pads rather than erroring), and it only affects the top of the batch-size range at a single concurrency point in the sweep, so nit rather than blocking severity is appropriate. But it does mean the measured throughput at CONC=70 — the top and newest point in this sweep, where accuracy matters most for capacity planning — is measured with some fraction of decode steps running on an oversized, less efficient graph. The fix is small: explicitly append MAX_NUM_SEQS to CAPTURE_SIZES if it is not already in the dense range (or raise DENSE_COUNTs cap to track MAX_NUM_SEQS when it modestly exceeds 128).

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

1 similar comment
@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

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

@xinli-sw

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run

@xinli-sw

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run 31893747354

@xinli-sw xinli-sw changed the title [wip][nv] k3 refresh [nv] k3 refresh Aug 15, 2026
@xinli-sw xinli-sw changed the title [nv] k3 refresh [NV][AgentX] Add Kimi-K3 B300 vLLM DSpark sweep Aug 15, 2026
@Ankur-singh Ankur-singh changed the title [NV][AgentX] Add Kimi-K3 B300 vLLM DSpark sweep [NV][AgentX] Add Kimi-K3 B300 vLLM DSpark sweep / [NV][AgentX] 新增 Kimi-K3 B300 vLLM DSpark 并发扫描 Aug 15, 2026
@Ankur-singh

Copy link
Copy Markdown
Collaborator

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. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/31893747354
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/31893747354
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • 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 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; FLOPs at lower precisions is fine, given that the config passes private evals. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • 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
  • 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 single-node vLLM/SGLang recipe in this PR is documented in the official vLLM recipes and/or the SGLang cookbook:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang 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.

Additional detail section:

Scope. This PR moves kimik3-fp4-b300-vllm-agentic-dspark to a TP8 x DCP8 layout with Mooncake as the external KV tier, extends the sweep to eleven concurrencies, and bumps the pinned vLLM image. It changes benchmarks/single_node/agentic/kimik3_fp4_b300_vllm_mtp.sh, configs/nvidia-master.yaml and perf-changelog.yaml. Of those, only configs/nvidia-master.yaml is specifically owned in .github/CODEOWNERS (@ankur-singh); the script and changelog fall to the * catch-all.

Validation and eval evidence, and the head it came from — read this before relying on the links above. The linked run 31893747354 executed at commit 630dc8c73, not at the current head 8f8185de. It settled success with all eleven agentic / points (c1, c2, c4, c8, c16, c24, c32, c40, c48, c56, c70 — exactly the eleven this config declares) and the agentic eval / job green, setup and canary-select both executed. The current-head run 31907754752 reuse-gated: reuse-sweep-gate and check-changelog passed and every benchmark, agentic and eval leaf skipped, so head 8f8185de carries no executed benchmark check-run of its own. I am recording that explicitly rather than presenting the linked run as current-head evidence.

Two facts make the reuse substantive rather than nominal, and both are independently checkable. First, git compare 630dc8c73...8f8185de lists no file whose path contains kimik3 — the recipe script, the master entry and the changelog entry are byte-identical across the two commits; the head advanced only because main was merged in, bringing the MiniMax-M3 GB200 work from #2609. Second, the one shared file that did change, benchmarks/benchmark_lib.sh, adds exactly three lines appending --extra-inputs to the replay command when AIPERF_EXTRA_INPUTS is non-empty; this recipe never sets that variable, so its replay command is unchanged. Reuse of this specific run is authorised on the PR by xinli-sw (COLLABORATOR) as /reuse-sweep-run 31893747354.

Eval scope. The single agentic eval / job ran at concurrency 70. Under this recipe that is the no-drafting arm, so the eval validates the TP8 x DCP8 + Mooncake serving path with real generation, and does not exercise either DSpark-drafted arm. Recording that rather than implying eval coverage of the speculative configurations.

Speculative decoding — acceptance lengths match the golden curve. Draft length is selected by concurrency, and the pinned acceptance tracks it in both drafted arms: concurrency <= 8 runs DSpark level 7 with synthetic_acceptance_length 3.84, and concurrency 16 runs level 3 with 3.00. Both are exact values from golden_al_distribution/kimik3_dspark_probabilistic_sample_method_block_rejection_sample_method.yaml kimi-k3.thinking_on (7 -> 3.84, 3 -> 3.00), which is the curve measured with draft_sample_method=probabilistic and rejection_sample_method=block — matching this recipe's draft configuration. The greedy/standard curve is not used. No acceptance target is substituted; per golden_al_distribution/README.md the draft length is the submission's choice and the acceptance target is not.

Spec-decode eval guard — satisfied in-script. kimik3_fp4_b300_vllm_mtp.sh branches on EVAL_ONLY: the eval SPEC_CONFIG sets rejection_sample_method: "block" (real target verification) and omits synthetic_acceptance_length entirely, while throughput runs use rejection_sample_method: "synthetic" with the golden value. The creator preflight reaches the same conclusion for this file, reporting kimik3_fp4_b300_vllm_mtp.sh:221 synthetic_acceptance_length is set only when EVAL_ONLY is not true; its SPECDEC_EVAL_GUARD REVIEW_REQUIRED rows name other, pre-existing configs (dsv4-fp4-gb300-dynamo-sglang-agentic-agg, kimik3-fp4-h200-vllm-agentic, kimik3-fp4-b200-dynamo-vllm-agentic-dspark, kimik3-fp4-gb200-dynamo-vllm-agentic), none of which this PR touches.

Recorded exception — six of the eleven published points run without drafting while the master entry declares spec-decoding: mtp for all of them. The recipe drafts at DSpark level 7 up to concurrency 8 and level 3 at 16, and sets NUM_SPEC_TOKENS=0 above that, so concurrencies 24, 32, 40, 48, 56 and 70 launch with no --speculative-config at all. The master entry nonetheless carries spec-decoding: mtp across the whole conc-list, and the executed job names reflect that (... vllm TP8/DCP8 mtp dram KV offload mooncake c24). MODELS.md records Kimi-K3 as "Agentic coding (DSpark only)" with the non-DSpark arm "deprecated from day 0", and states that the non-spec-decode arm "is neither run nor published". The reviewing maintainer's judgment, recorded here rather than treated as satisfied, is that this is one DSpark submission whose optimal operating point above concurrency 16 is no drafting — a system-level choice within a single config key — and not a resubmission of the retired standalone non-DSpark A/B arm that deprecation targeted. The behaviour is documented in the master-config comment, the recipe header and the changelog entry. The residual concern is labelling: published artifacts for those six points will read as mtp, and a reader of the dashboard cannot tell drafted from undrafted points without consulting the recipe.

Recorded exception — the tool-call and reasoning parsers were removed. This PR deletes --reasoning-parser kimi_k3, --tool-call-parser kimi_k3 and --enable-auto-tool-choice from the server command line, with no explanation in the diff. This recipe's own non-MTP sibling benchmarks/single_node/agentic/kimik3_fp4_b300_vllm.sh retains all three, as do every dsv4_* agentic vLLM recipe and the glm5.2_* agentic recipes. On an agentic tool-calling workload those flags govern how the server parses model output, so the removal is a behavioural change to the measured path rather than a cosmetic one. It is accepted here at the reviewing maintainer's direction and recorded rather than treated as satisfied; the author should confirm it was deliberate and say what replaces them under the new image.

Recorded exception — the image lost its digest pin. The previous image was digest-pinned (nightly-b22afe45...@sha256:144356af...); the new one, vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-5894fdf, is tag-only and therefore mutable. It is in the upstream vLLM Docker Hub organisation, which is what the checklist requires, but it is a development build of the agentx-k3 branch at 5894fdf rather than a release, as the config comment states. Its current digest is sha256:969a492a96dd590b41a384dc610175814d7dbda3362d8b2553659cf11e523a7c; re-pinning to that would restore reproducibility without changing what runs.

Single-node recipe publication. This config is single-node vLLM, so the publication requirement applies and is met by the already-published upstream recipe models/moonshotai/Kimi-K3.yaml, which records b300: verified, covers the 2.8T MXFP4 checkpoint, and documents a DSpark mode with draft_sample_method: probabilistic and rejection_sample_method: block — the same draft method this submission runs. Two deliberate differences: the recipe's example pins the RedHatAI/Kimi-K3-speculator.dspark head at 8 speculative tokens, whereas this submission uses Inferact/Kimi-K3-DSpark, which is the draft head MODELS.md itself prescribes for kimik3, at levels 7 and 3 — and draft length is expressly the submission's choice under the AL policy. The DCP a2a layout, the Mooncake KV tier and TOKENSPEED_MLA are InferenceX-specific serving and offload configuration rather than recipe-level model arguments. No new upstream PR is required.

Model and scenario scope, architecture, and patching. MODELS.md lists Kimi-K3 as active for agentic coding with the native/upstream vLLM engine and the Inferact/Kimi-K3-DSpark draft head, which is exactly what this PR exercises; the submission is agentic-coding only. No --hf-overrides, layer skipping, or other FLOPs-reducing override appears in the diff — --language-model-only skips the unused vision tower on a text-only agentic workload, matching existing agentic recipes. The pinned image runs as shipped: there is no .patch, git apply, site-packages edit, monkey-patch or rebuilt engine wheel. The recipe does agentic_pip_install the mooncake-transfer-engine-cuda13==0.3.11.post1 client at runtime, which is the external KV-store library rather than the inference engine, and its version matches the kv-offload-backend version recorded in the master entry. Framework ordering is satisfied trivially: the framework is vLLM itself.

Append-only item — not applicable. The new perf-changelog.yaml entry does not set append-only: true; it declares only config-keys, scenario-type, description and pr-link, and this change re-runs the whole curve rather than appending points to it.

Recorded exception — creator-preflight findings that are pre-existing. MASTER_RECIPE_PARITY reports BLOCK and SETUP_SCRIPT_REACHABILITY reports UNVERIFIED on this head. The parity row names dsr1-* and qwen3.5-* config keys and their SGLang recipe paths; kimik3-fp4-b300-vllm-agentic-dspark does not appear in it. The reachability row names kimik3-dspark-config-compat.sh, rebuild-deepep.sh and vllm-container-deps.sh, and is unchanged from the same row on #2610, #2611 and #2608 — pre-existing repo-wide drift this PR neither introduces nor can remedy. BILINGUAL_METADATA was a genuine finding against this PR and was cleared by completing the title and description before this sign-off.

Mergeability. The PR is MERGEABLE against main with no conflict; mergeStateStatus is BLOCKED pending required approvals, which is expected at this point.

Signed: Ankur-singh

@Klaud-Cold

Copy link
Copy Markdown
Collaborator

❌❌❌ REJECTED ❌❌❌

@Ankur-singh — two blockers: (1) six of the eleven published points (conc 24–70) launch with no --speculative-config, i.e. the kimik3 agentic-coding non-DSpark arm that MODELS.md deprecates from day 0 and bars from being run or published — and they would publish labeled mtp; (2) the deployment-defining args (TP8×DCP8, --attention-backend TOKENSPEED_MLA, mla_prefill_backend TRTLLM_RAGGED) are missing from or contradict the published upstream recipe and exist only on an unmerged vLLM feature branch, so the benchmark is not reproducible from merged upstream documentation.

✅ Check 0 (CODEOWNER): PASS — configs/nvidia-master.yaml is owned by @ankur-singh (CODEOWNERS line 7); the other two changed files fall to the catch-all, which a recognized CODEOWNER covers.
✅ Check 1 (passing sweep on in-PR commit): PASS — commit 630dc8c73 is currently in the PR and carries all 11 executed agentic / points plus agentic eval / with conclusion success in run 31893747354; the skipped single-node */ / eval / legs correspond to scenario types this agentic-only config does not select.
✅ Check 2 (evals pass): PASS — GSM8K em_strict 0.9727 (n_eff 1319) from that run's eval_results_all artifact, executed on the same image as this PR's config (vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-5894fdf); note the eval point (c70) is the no-draft arm.
❌ Check 3 (recipe linked, merged, complete): FAIL — major deployment-defining args are missing from or contradict the published recipe models/moonshotai/Kimi-K3.yaml: DCP parallelism (--decode-context-parallel-size 8, --dcp-comm-backend a2a) appears nowhere in the recipe; --attention-backend TOKENSPEED_MLA appears nowhere; mla_prefill_backend: TRTLLM_RAGGED contradicts the recipe's FP8-KV requirement of mla_prefill_backend: flashinfer. These features ship only in a dev image built from the unmerged agentx-k3 branch (@ 5894fdf), so the community cannot reproduce this deployment from merged/published upstream documentation. (Link present and page published, so (a)/(b) pass; the Inferact/Kimi-K3-DSpark draft head at K=7/3 vs the recipe's RedHatAI head at K=8 is acceptable — MODELS.md prescribes that head and draft length is the submission's choice; Mooncake offload and sweep knobs are InferenceX-specific, informational only.)
✅ Check 4 (reuse command): PASS — /reuse-sweep-run 31893747354 posted by xinli-sw (COLLABORATOR).
✅ Check 5 (latest checklist template): PASS — every current-template item is present and checked, with additional reasoning provided.
✅ Check 6 (upstream image, engine-first): PASS — vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-5894fdf is in the upstream vLLM Docker Hub org (tag-only, no digest pin — mutable, but not a checklist failure); framework is vLLM itself, so ordering is trivially satisfied.
❌ Check 7 (deprecated models/scenarios): FAIL — the PR runs and publishes the deprecated kimik3 non-DSpark agentic arm: at conc 24, 32, 40, 48, 56 and 70 the recipe sets NUM_SPEC_TOKENS=0 and launches with no --speculative-config, while MODELS.md lists Kimi-K3's "Agentic coding non-DSpark arm (deprecated from day 0)" as deprecated and states "the non-spec-decode arm is neither run nor published". The sign-off records this as a maintainer judgment call, but MODELS.md is the source of truth and these six points are additionally mislabeled spec-decoding: mtp in the published artifacts. Fix: restrict the published sweep to the drafted arms, or amend MODELS.md first.
✅ Check 8 (architecture hacks): PASS — no --hf-overrides or FLOPs-reducing override; --language-model-only is the recipe-documented text-only feature on a text-only workload.
✅ Check 9 (spec-decode chat templates): PASS — the agentic replay drives /v1/chat/completions, so spec decoding sees chat-formatted traffic.
✅ Check 10 (engine patches): PASS — no patch/heredoc/site-packages edit; the runtime pip install of mooncake-transfer-engine-cuda13==0.3.11.post1 is an unmodified published external KV-store client, not an engine wheel.
✅ Check 11 (golden AL): PASS — drafted arms pin rejection_sample_method: synthetic with 3.84 (K=7) and 3.00 (K=3), exactly matching golden_al_distribution/kimik3_dspark_probabilistic_sample_method_block_rejection_sample_method.yaml (thinking_on 7→3.84, 3→3.00), and EVAL_ONLY switches to real block verification.
➖ Check 12 (append-only): N/A — the new perf-changelog.yaml entry does not set append-only: true.

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

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

4 participants