Skip to content

[Klaud Cold][agentic experiment][Variant B] Kimi-K3 B200 agg TP8xPP2 agentic — vLLM tool-call-parser flags / Kimi-K3 B200 聚合式 TP8xPP2 智能体实验——vLLM tool-call-parser 参数 - #2357

Closed
functionstackx wants to merge 9 commits into
mainfrom
klaud/kimik3-b200-agentic-parser-vllm-flags
Closed

[Klaud Cold][agentic experiment][Variant B] Kimi-K3 B200 agg TP8xPP2 agentic — vLLM tool-call-parser flags / Kimi-K3 B200 聚合式 TP8xPP2 智能体实验——vLLM tool-call-parser 参数#2357
functionstackx wants to merge 9 commits into
mainfrom
klaud/kimik3-b200-agentic-parser-vllm-flags

Conversation

@functionstackx

@functionstackx functionstackx commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Summary

Parser-flag experiment (variant B) for the Kimi-K3 MXFP4 B200 aggregated TP8×PP2 agentic bring-up — plain vLLM parser spellings.

Identical to the base bring-up PR in every way (srt-slurm v1.0.36, dynamo hash-pinned to the day-zero Kimi-K3 commit ba83080e / tag v1.4.0-kimi-k3-dev.1, vllm/vllm-openai:kimi-k3, conc-8 smoke test) except the worker parser flags:

--tool-call-parser kimi_k3
--reasoning-parser kimi_k3

Related experiments

Three sibling PRs race the same recipe with different worker parser flags; whichever goes green first merges and the others close:

中文说明

Kimi-K3 MXFP4 B200 聚合式 TP8×PP2 智能体 bring-up 的解析器参数实验(变体 B)——vLLM 原生写法。

除 worker 解析器参数外与基础 PR 完全一致(srt-slurm v1.0.36、dynamo 固定到 day-zero Kimi-K3 提交 ba83080e / 标签 v1.4.0-kimi-k3-dev.1vllm/vllm-openai:kimi-k3 镜像、并发 8 冒烟测试):worker 使用 --tool-call-parser kimi_k3 --reasoning-parser kimi_k3

相关实验

三个兄弟 PR 以不同的 worker 解析器参数并行竞跑同一配方,先通过者合并、其余关闭:变体 A(基础 PR,dynamo --dyn-* 命名空间参数)#2355变体 B(本 PR,vLLM 原生写法);变体 C(不带解析器参数)#2358

🤖 Generated with Claude Code

functionstackx and others added 8 commits July 27, 2026 14:34
…ecipe

Aggregated TP8 x PP2 across 2 B200 nodes (16 GPUs), plain TP (no expert
parallelism) for the agentic-coding trace replay. Dedicated bring-up image
vllm/vllm-openai:kimi-k3 with VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION=1,
fastsafetensors load format, kimi_k3 tool-call/reasoning parsers. Model
pre-staged at /lustre/fsw/models/Kimi-K3; launch_b200-dgxc.sh gains the
kimik3/fp4 model-path mapping, the agentic recipe overlay, and the agentic
cache default_mounts used by the GB200/GB300 agentic paths.

中文:新增 Kimi-K3 MXFP4 B200 聚合式 TP8xPP2 Dynamo-vLLM 智能体编码基准测试配方
(2 节点 / 16 GPU,纯 TP,不启用专家并行(EP))。使用专用 bring-up 镜像
vllm/vllm-openai:kimi-k3(VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION=1、
fastsafetensors 加载格式、kimi_k3 工具调用/推理解析器)。模型已预置于
/lustre/fsw/models/Kimi-K3;启动器 launch_b200-dgxc.sh 增加 kimik3/fp4
模型路径映射、智能体配方覆盖及智能体缓存挂载。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
中文:在更新日志条目与 MODELS 表格行中补充 PR #2355 链接。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…oke test

The cquil11/srt-slurm-nv cam/sa-submission-q2-2026 fork rejected the recipe
(benchmark.aiperf_server_metrics: Unknown field). Switch the b200-dgxc
agentic clone to upstream NVIDIA/srt-slurm v1.0.36 (validated in #2302/#2341),
drop the aiperf_server_metrics field, pin dynamo wheel/router to 1.2.1 (the
combination validated with v1.0.36), and reduce the bring-up to a single
conc-8 smoke test.

中文:cquil11/srt-slurm-nv 分支的 srtctl 校验拒绝了配方字段
benchmark.aiperf_server_metrics(Unknown field)。将 b200-dgxc 智能体路径改用
上游 NVIDIA/srt-slurm v1.0.36(已在 #2302/#2341 验证),移除该字段,dynamo
wheel/router 固定为 1.2.1,并将 bring-up 缩减为单并发(conc 8)冒烟测试。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The dynamo-vllm worker entrypoint rejected --enable-auto-tool-choice
--tool-call-parser kimi_k3 (unrecognized arguments; different arg parser
than vllm serve). Chat parsing happens at the dynamo frontend — same
convention as the DSv4 GB300 agentic recipes. Keep --reasoning-parser
kimi_k3 (accepted by the worker). Also drop the explicit max-model-len and
let vLLM derive the native 1M window from the model config, mirroring the
agentic recipe convention.

中文:dynamo-vllm worker 入口不接受 --enable-auto-tool-choice 与
--tool-call-parser kimi_k3(unrecognized arguments,与 vllm serve 的参数解析器
不同),聊天解析由 dynamo 前端处理,与 DSv4 GB300 智能体配方约定一致;保留
worker 可接受的 --reasoning-parser kimi_k3。同时移除显式 max-model-len,
由 vLLM 从模型配置推导原生 1M 上下文窗口。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Third sweep attempt: the engine loaded and served (TP8xPP2 healthy in ~14
min), but dynamo 1.2.1's rust frontend tokenizer rejects Kimi-K3's tiktoken
model_type 'kimi_k3' (supported: kimi, kimi_k2, kimi_k25, deepseek_v3), so
the model never registered and all chat completions returned 404, aborting
the AgentX warmup. Switch to the 1.2.0.dev20260426 wheel used by the DSv4
GB300/B200 Dynamo-vLLM recipes. Upstream published v1.4.0-kimi-k3-dev.1
(2026-07-27) as the day-zero K3 build if this wheel also lacks support.

中文:第三次扫描中引擎已成功加载并提供服务(TP8xPP2 约 14 分钟就绪),但
dynamo 1.2.1 的 rust 前端分词器不支持 Kimi-K3 的 tiktoken model_type
'kimi_k3',模型未能注册,所有请求返回 404,AgentX 预热中止。改用 DSv4
GB300/B200 Dynamo-vLLM 配方所用的 1.2.0.dev20260426 wheel;如仍不支持,
上游已于 2026-07-27 发布 day-zero 构建 v1.4.0-kimi-k3-dev.1。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pin dynamo to ba83080ecd31c1ce918559e576d3c5bc9e092ff1 ("feat: Added
support for Kimi-K3", tag v1.4.0-kimi-k3-dev.1) via srt-slurm's
hash-cached source install: it adds the kimi_k3 tiktoken tokenizer to the
rust frontend (dynamo <=1.2.1 404s every request because the model never
registers) and accepts the kimi_k3 tool-call/reasoning parser worker args,
so restore --enable-auto-tool-choice --tool-call-parser kimi_k3
--reasoning-parser kimi_k3.

中文:将 dynamo 固定到 day-zero Kimi-K3 提交 ba83080("feat: Added support
for Kimi-K3",标签 v1.4.0-kimi-k3-dev.1),通过 srt-slurm 的哈希缓存源码
安装:该提交为 rust 前端新增 kimi_k3 tiktoken 分词器(dynamo <=1.2.1 因模型
无法注册而全部返回 404),worker 亦支持 kimi_k3 解析器参数,故恢复
--enable-auto-tool-choice --tool-call-parser kimi_k3 --reasoning-parser kimi_k3。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the vLLM OpenAI-frontend spellings (--enable-auto-tool-choice /
--tool-call-parser) with dynamo's namespaced worker args:
--dyn-tool-call-parser kimi_k3 --reasoning-parser kimi_k3
--dyn-reasoning-parser kimi_k3.

中文:将 vLLM OpenAI 前端风格参数(--enable-auto-tool-choice /
--tool-call-parser)替换为 dynamo 命名空间的 worker 参数:
--dyn-tool-call-parser kimi_k3 --reasoning-parser kimi_k3
--dyn-reasoning-parser kimi_k3。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Variant of the Kimi-K3 B200 agg TP8xPP2 agentic bring-up (#2355) using
--tool-call-parser kimi_k3 --reasoning-parser kimi_k3 on the worker.
Sibling experiments try dynamo's --dyn-* namespaced args and no parser
flags; whichever goes green first merges.

中文:Kimi-K3 B200 聚合式 TP8xPP2 智能体 bring-up(#2355)的解析器参数实验
变体 B:worker 使用 --tool-call-parser kimi_k3 --reasoning-parser kimi_k3。
兄弟实验分别尝试 dynamo --dyn-* 命名空间参数与不带解析器参数;先通过者合并。

Co-Authored-By: Claude Fable 5 <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 关于重新运行失败任务的文档

中文:将更新日志条目与 MODELS 表格行链接指向实验 PR #2357。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@functionstackx functionstackx changed the title [Klaud Cold][agentic experiment] Kimi-K3 B200 agg TP8xPP2 agentic — vLLM tool-call-parser flags / Kimi-K3 B200 聚合式 TP8xPP2 智能体实验——vLLM tool-call-parser 参数 [Klaud Cold][agentic experiment][Variant B] Kimi-K3 B200 agg TP8xPP2 agentic — vLLM tool-call-parser flags / Kimi-K3 B200 聚合式 TP8xPP2 智能体实验——vLLM tool-call-parser 参数 Jul 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Comment on lines +37 to +39
health_check:
interval_seconds: 10
max_attempts: 1440

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.

🟡 The recipe deliberately sets health_check.max_attempts: 1440 (4hr window) for the ~1.4TB MXFP4 checkpoint load off shared Lustre, but runners/launch_b200-dgxc.sh's pre-existing multinode-path sed (s/^ max_attempts: [0-9]*/ max_attempts: 720/) unconditionally matches the recipe's 2-space-indented line and silently clamps it back to 720 (2hr). This is the first multinode+agentic recipe on cluster:b200-dgxc to carry max_attempts > 720, so this PR is the first to collide with that override — the author's explicit 4hr intent is currently a dead value; worth scoping the sed (e.g. only bump if the value is below 720) or dropping/correcting the recipe's comment so it doesn't mislead future readers.

Extended reasoning...

The bug: benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-b200-tp8pp2-agentic.yaml sets:

health_check:
  interval_seconds: 10
  max_attempts: 1440

with an explicit design rationale nearby ("~1.4TB of MXFP4 weights off shared Lustre: keep the engine-ready window generous"), i.e. a deliberate 4-hour health-check window (1440 × 10s).

However, runners/launch_b200-dgxc.sh (unmodified by this PR, but exercised for the first time by this recipe on this runner) contains, in the IS_MULTINODE branch:

sed -i 's/^  max_attempts: [0-9]*/  max_attempts: 720/' "${CONFIG_FILE%%:*}"

This runs unconditionally on every multinode job, after the recipe file has been copied into the srt-slurm checkout and referenced via CONFIG_FILE. The pattern ^ max_attempts: [0-9]* (anchored, exactly two leading spaces) matches the recipe's max_attempts: 1440 line exactly, so the sed rewrites it in place to max_attempts: 720 before srtctl apply ever reads the file. The recipe's intended 4-hour window is silently reduced to 2 hours — the 1440 value the author wrote (and commented on) never actually reaches the health-check logic.

Why nothing else in the pipeline prevents this: the sed has no guard for "only bump if lower" — it's a blind overwrite regardless of the file's existing value, so it clamps down just as readily as it bumps up. Nothing in the recipe YAML or configs/nvidia-master.yaml routing opts out of this launcher step, and there's no comment in the recipe warning that max_attempts is moot on this runner — so a reader of the recipe today would reasonably (and incorrectly) believe the 4-hour window is honored.

Why this specific PR is the one that surfaces it: all other recipes with max_attempts: 1440 in the repo are wired to the gb200/gb300 launchers (launch_gb200-nv.sh / launch_gb300-nv.sh), which don't contain this sed. This Kimi-K3 config is the first multinode+agentic recipe on cluster:b200-dgxc (launch_b200-dgxc.sh) to specify a health-check window above 720, so it's the first config to actually collide with the override — it isn't a hypothetical, it directly affects this PR's own recipe.

Step-by-step proof:

  1. configs/nvidia-master.yaml routes kimik3-fp4-b200-dynamo-vllm-agentic to runner: cluster:b200-dgxc, i.e. launch_b200-dgxc.sh, with additional-settings: CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-b200-tp8pp2-agentic.yaml.
  2. IS_AGENTIC=1 triggers the overlay step, copying benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/ into the srt-slurm clone's recipes/vllm/kimi-k3/agentic/ — this is the actual file CONFIG_FILE points at.
  3. Because IS_MULTINODE == "true" for this recipe, the script reaches the line sed -i 's/^ max_attempts: [0-9]*/ max_attempts: 720/' "${CONFIG_FILE%%:*}".
  4. The copied file contains max_attempts: 1440 at 2-space indent — matches the anchor exactly — sed rewrites it to max_attempts: 720.
  5. srtctl apply -f "$CONFIG_FILE" ... runs immediately after, reading the now-mutated file: the health check will poll for 720 × 10s = 7200s = 2hr, not the author's intended 14400s = 4hr.

Impact and why it's a nit, not a blocker: the mechanism is real and the author's stated intent is genuinely defeated, but a concrete failure at merge is unlikely for two independent reasons already present in this same PR: (1) the recipe sets VLLM_ENGINE_READY_TIMEOUT_S: "3600" (1hr) in aggregated_environment, so vLLM's own engine-init timeout fires at 1hr regardless of the health-check window — the clamped 2hr window is never actually the binding constraint versus the intended 4hr, since both exceed the 1hr engine timeout; and (2) the PR's own perf-changelog.yaml entry records the observed engine-ready time as "~14 min via fastsafetensors," roughly 8x under even the clamped 720-attempt/2hr window. So the failure mode the recipe's comment is defending against (Lustre contention pushing load past 2hr) is not observed in practice here.

Suggested fix: either scope the launcher's sed to only raise max_attempts when it's below the floor (e.g. compare before overwriting), or update the recipe's max_attempts/comment to reflect that 720 is the effective ceiling on cluster:b200-dgxc until the launcher is changed — as-is, the 1440 value and its accompanying comment are misleading to future readers of this recipe.

@functionstackx

Copy link
Copy Markdown
Collaborator Author

Variant B is definitively dead: even on the day-zero Kimi-K3 dynamo build (ba83080e / v1.4.0-kimi-k3-dev.1), the dynamo-vllm worker entrypoint rejects the plain vLLM spelling — __main__.py: error: unrecognized arguments: --tool-call-parser kimi_k3 (sweep job 90089820192). The surviving experiments are Variant A (#2355, dynamo --dyn-* namespaced args, which the worker accepts) and Variant C (#2358, no parser flags). Closing.

中文:变体 B 已确定失败:即使在 day-zero Kimi-K3 dynamo 构建(ba83080e / v1.4.0-kimi-k3-dev.1)上,dynamo-vllm worker 入口仍拒绝 vLLM 原生写法(unrecognized arguments: --tool-call-parser kimi_k3)。存活的实验为变体 A(#2355,dynamo --dyn-* 命名空间参数,worker 可接受)与变体 C(#2358,不带解析器参数)。现关闭本 PR。

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.

1 participant