Skip to content

Kimi K3 B200 Day 0 AgentX Pipeline Parallelism (non-DSpark as it doesn't work with Pipeline yet, offloading & TP16 and DEP8PP2 to be done in followup PR) - #2391

Merged
functionstackx merged 26 commits into
mainfrom
klaud/kimik3-b200-agentic-direct-vllm-retention0-nodeps
Jul 29, 2026
Merged

Kimi K3 B200 Day 0 AgentX Pipeline Parallelism (non-DSpark as it doesn't work with Pipeline yet, offloading & TP16 and DEP8PP2 to be done in followup PR)#2391
functionstackx merged 26 commits into
mainfrom
klaud/kimik3-b200-agentic-direct-vllm-retention0-nodeps

Conversation

@functionstackx

@functionstackx functionstackx commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Summary

Agentic experiment (Variant K) — a probe: Variant G (#2374) without the in-container patch script.

Removes benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-container-deps.sh entirely (the recipe's setup_script reference, the script file, and the launcher copy step). Everything else is identical to the fully-green Variant G (direct multinode vllm serve, retention 0, conc 1/2/4/8/16/32).

srt-slurm clone source: the launcher now clones functionstackx/srt-slurm-nv klaud/direct-vllm-multinode, which carries srt-slurm PR NVIDIA/srt-slurm#278 (frontend.type: vllm) plus the multi-node extension as commits — replacing the previous clone of kylliang/direct-aggregate-vllm + git apply patches/srt-slurm-pr278-direct-vllm-multinode.patch (patch file deleted).

Purpose: verify empirically whether the mamba_hybrid index_fill_ dtype patch is still required by the current vllm/vllm-openai:kimi-k3 image. When the patch was introduced, the unpatched image crashed on the first decode step with IndexError: index_fill_(): Expected dtype int64 for index (KDA hybrid-state postprocess). If the image has since been fixed, this run goes green and the patch can be retired; if not, the failure will be documented in a comment below with the error logs.

Not intended to merge as-is — this PR exists to produce a definitive answer; the outcome will be commented here.

中文说明

智能体实验变体 K——探针:去除容器内补丁脚本的变体 G(#2374)。

完整移除 kimi-k3-container-deps.sh(配方的 setup_script 引用、脚本文件与启动器复制步骤),其余与全绿的变体 G 完全一致(直接多节点 vllm serve、留存 0、并发 1/2/4/8/16/32)。

srt-slurm 克隆来源:启动器现直接克隆 functionstackx/srt-slurm-nv klaud/direct-vllm-multinode 分支(已包含 srt-slurm PR NVIDIA/srt-slurm#278 及多节点扩展提交),取代此前"克隆 kylliang/direct-aggregate-vllmgit apply 补丁"的方式(补丁文件已删除)。

目的:实证验证当前 vllm/vllm-openai:kimi-k3 镜像是否仍需 mamba_hybrid index_fill_ 类型补丁。引入该补丁时,未打补丁的镜像会在首个解码步崩溃(IndexError: index_fill_(): Expected dtype int64 for index)。若镜像已修复,本次运行将通过、补丁可退役;若仍需要,失败详情与错误日志将评论在下方。

本 PR 不以合并为目的——仅为得出确定性结论,结果将在评论中给出。

🤖 Generated with Claude Code

functionstackx and others added 22 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>
Fifth sweep attempt: the day-zero dynamo registered the kimi_k3 tiktoken
tokenizer and the engine served, but all warmup requests got 400 — aiperf's
conv-aware routing emits nvext.session_control, a removed POC field this
dynamo build rejects (schema moved to router/routing_constraints/
agent_hints). Opt out via AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING=0, matching
the GB300 aggregate AgentX recipes; a single aggregate worker has no P/D
routing to bind anyway.

中文:第五次扫描中 day-zero dynamo 已成功注册 kimi_k3 tiktoken 分词器并正常
服务,但全部预热请求返回 400——aiperf 的会话感知路由会发送
nvext.session_control(已被移除的 POC 字段,schema 已迁移至
router/routing_constraints/agent_hints)。通过
AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING=0 关闭,与 GB300 聚合式 AgentX 配方
一致;单聚合 worker 本无需 P/D 路由绑定。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sixth sweep attempt (both A and C variants): warmup requests 500 then the
model 503s — the image's first decode step crashes in the KDA hybrid-state
postprocess (mamba_hybrid.py postprocess_state, IndexError: index_fill_():
Expected dtype int64 for index; torch requires an int64 index but the
runner passes the int32 idx_mapping). Ship an in-container patch through
srt-slurm's setup_script hook (same pattern as configs/patches/
vllm_numa_bind_hash_fix.py): coerce the index with .long(), idempotent,
refuses to run if the image layout changed.

中文:第六次扫描(A、C 两个变体一致):预热请求先 500、随后模型 503——镜像
首个解码步在 KDA 混合状态后处理中崩溃(mamba_hybrid.py postprocess_state,
IndexError: index_fill_() 需要 int64 索引,但 runner 传入 int32 idx_mapping)。
通过 srt-slurm 的 setup_script 钩子在容器内打补丁:将索引用 .long() 转换,
幂等,且镜像布局变化时拒绝执行。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Serve Kimi-K3 directly with vllm serve (srt-slurm PR #278 frontend.type:
vllm, branch kylliang/direct-aggregate-vllm): no dynamo frontend/worker/
router, which removes the dynamo tokenizer/schema gaps entirely, and the
OpenAI-frontend flags --enable-auto-tool-choice --tool-call-parser kimi_k3
--reasoning-parser kimi_k3 become legitimate. PR #278 validates single-node
only, so ship patches/srt-slurm-pr278-direct-vllm-multinode.patch extending
it to vLLM-native multi-node serve (--master-addr/--nnodes/--node-rank,
headless non-leader ranks) for the 2-node TP8xPP2 topology. Keeps the
mamba_hybrid index-dtype container patch (engine bug is frontend-agnostic).

中文:智能体实验变体 D——通过 srt-slurm PR #278(frontend.type: vllm)直接以
vllm serve 提供服务:去除 dynamo 前端/worker/router,从根本上规避 dynamo 的
分词器与 schema 兼容问题,OpenAI 前端参数 --enable-auto-tool-choice
--tool-call-parser kimi_k3 --reasoning-parser kimi_k3 因此可用。PR #278 仅
支持单节点,故新增补丁将其扩展为 vLLM 原生多节点 serve(--master-addr/
--nnodes/--node-rank,非主节点 headless),以运行 2 节点 TP8xPP2 拓扑。保留
mamba_hybrid 索引类型容器补丁(引擎缺陷与前端无关)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
中文:将更新日志条目与 MODELS 表格行链接指向实验 PR #2359。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same engine-level OOM as the dynamo-frontend variants: the flashinfer
trtllm MXFP4 MoE kernel allocates a ~1.6 GiB runtime workspace outside
vLLM's memory pool on the first forward; at 0.95 a 178 GiB B200 has only
~1.35 GiB free.

中文:与 dynamo 前端变体相同的引擎级 OOM:flashinfer trtllm MXFP4 MoE 内核在
首个前向时于 vLLM 显存池外分配约 1.6 GiB 工作区,0.95 下仅剩约 1.35 GiB。
改为 0.90。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Inherited from the closed dynamo-frontend variants (#2355/#2358): at
gpu-mem-util 0.90 the first long-context MLA prefill OOM'd on a 2.92 GiB
transient while 3.39 GiB sat reserved-but-unallocated (fragmentation). Set
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True and drop
NCCL_CUMEM_ENABLE.

中文:继承自已关闭的 dynamo 前端变体(#2355/#2358):0.90 显存利用率下首个
长上下文 MLA 预填充因 2.92 GiB 瞬时分配 OOM,而 3.39 GiB 处于已保留未分配
状态(碎片化)。设置 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True 并
移除 NCCL_CUMEM_ENABLE。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…refill OOM)"

This reverts commit 4370988. The superseded direct-vllm run served the
agentic benchmark for 24 minutes on the original env (NCCL_CUMEM_ENABLE=1,
no expandable_segments) without any OOM — the allocator change was
precautionary carryover from the closed dynamo-frontend variants and was
never justified by evidence from this serving path. Restore the env that
was demonstrably running.

中文:回滚 4370988。被中断的 direct-vllm 运行在原始环境
(NCCL_CUMEM_ENABLE=1、未设 expandable_segments)下已稳定运行智能体基准测试
24 分钟且无 OOM——该分配器改动只是从已关闭的 dynamo 前端变体沿袭的预防性
措施,并无本服务路径上的证据支持。恢复已被验证可运行的环境。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Keep prefix-cache blocks alive across agentic turn gaps, matching the
GB200/GB300 AgentX recipes.

中文:新增 VLLM_PREFIX_CACHE_RETENTION_INTERVAL=32768,使前缀缓存块在智能体
回合间隔内保持留存,与 GB200/GB300 AgentX 配方一致。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
中文:将智能体并发列表从单点 8 扩展为 1/8/16/32。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Engine init hard-fails on Kimi-K3 with the GB200/GB300 AgentX value:
"VLLM_PREFIX_CACHE_RETENTION_INTERVAL (32768) must be non-negative and a
multiple of scheduler_block_size (3145728)" — the KDA hybrid architecture
gives K3 a 3.1M-token scheduler block. Default retention served fine in
the earlier runs, so drop the override.

中文:移除 VLLM_PREFIX_CACHE_RETENTION_INTERVAL——Kimi-K3 的 KDA 混合架构使
scheduler_block_size 达 3145728,GB200/GB300 AgentX 的 32768 取值导致引擎
初始化直接失败(必须为其整数倍)。此前运行证明默认留存策略可正常服务,
故不再覆盖。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Identical GPU-resident direct-vllm config to variant D (#2359) plus
VLLM_PREFIX_CACHE_RETENTION_INTERVAL=0. Any positive value must be a
multiple of Kimi-K3's KDA-hybrid scheduler_block_size (3145728), so 0 is
the only setting below one 3.1M-token scheduler block.

中文:智能体实验变体 G——与变体 D(#2359)完全相同的 GPU 常驻直接 vllm
serve 配置,另加 VLLM_PREFIX_CACHE_RETENTION_INTERVAL=0(任何正值都必须是
Kimi-K3 KDA 混合架构 scheduler_block_size 3145728 的整数倍,0 是唯一低于
一个 3.1M token 调度块的取值)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
中文:将更新日志条目与 MODELS 表格行链接指向实验 PR #2374。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ntic-direct-vllm-retention0

# Conflicts:
#	perf-changelog.yaml
中文:变体 G 并发曲线扩展为 1/2/4/8/16/32(新增 2 与 4)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Variant G (#2374, fully green) minus the kimi-k3-container-deps.sh
in-container patch (setup_script reference, script file, and launcher
copy), to verify whether the mamba_hybrid index_fill_ dtype patch is
still required by the current vllm/vllm-openai:kimi-k3 image. Expected
to fail at the first decode step if it is; results will be commented on
the PR.

中文:探针变体 K——在全绿的变体 G(#2374)基础上移除 kimi-k3 容器内补丁
脚本(setup_script 引用、脚本文件与启动器复制),验证当前
vllm/vllm-openai:kimi-k3 镜像是否仍需 mamba_hybrid index_fill_ 类型补丁。
如仍需要,预计在首个解码步失败;结果将评论在 PR 中。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
functionstackx and others added 2 commits July 28, 2026 13:53
中文:将更新日志条目与 MODELS 表格行链接指向实验 PR #2391。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ntic-direct-vllm-retention0-nodeps

# Conflicts:
#	perf-changelog.yaml

@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):

  • 🟡 perf-changelog.yaml:5139 — The changelog bullet for kimik3-fp4-b200-dynamo-vllm-agentic (perf-changelog.yaml:5139) still says "conc 1/8/16/32", but the config it documents (configs/nvidia-master.yaml, same PR) actually sweeps conc-list: [1, 2, 4, 8, 16, 32]. Variant G added concurrency levels 2 and 4 to the config but the changelog prose was never updated to match, leaving a stale description of what was actually benchmarked.

    Extended reasoning...

    The bug: The newly-added changelog entry for kimik3-fp4-b200-dynamo-vllm-agentic in perf-changelog.yaml (line 5139, under the bullet describing max-num-batched-tokens 8192 / prefix-caching / max-model-len behavior) ends with the phrase conc 1/8/16/32. This is meant to summarize the concurrency sweep performed for this config. However, the actual shipped config for this exact config-key — configs/nvidia-master.yaml's kimik3-fp4-b200-dynamo-vllm-agentic.scenarios.agentic-coding.search-space[0].conc-list — is [1, 2, 4, 8, 16, 32], added in this same PR family.

    Root cause / how it got stale: This changelog entry has accreted bullets across several "agentic experiment variant" probes for the same config-key (Variant D → Variant G → Variant K, per the bullet history visible in the diff). Variant G (commit f14afdc, per the PR description: "conc 1/2/4/8/16/32") added concurrency levels 2 and 4 to nvidia-master.yaml's conc-list, and the PR description for this very probe (Variant K) explicitly states the sweep uses "conc 1/2/4/8/16/32". But the specific changelog bullet that recites the sweep parameters ("... max-num-batched-tokens 8192 ...; conc 1/8/16/32") was carried over verbatim from the earlier Variant D text and never updated when Variant G's config change landed.

    Why nothing catches this: The changelog is free-text YAML documentation with no schema or CI check tying its prose back to the actual conc-list values in configs/nvidia-master.yaml. Nothing enforces that the two stay in sync, so a partial edit (updating the config but not the accompanying changelog bullet) silently ships.

    Step-by-step proof:

    1. Open configs/nvidia-master.yaml in this PR's diff — the new kimik3-fp4-b200-dynamo-vllm-agentic entry has search-space[0].conc-list: [1, 2, 4, 8, 16, 32].
    2. Open perf-changelog.yaml in this PR's diff — the bullet ending "...max-num-batched-tokens 8192 so a single long prefill cannot OOM a pipeline stage; conc 1/8/16/32" (line 5139) omits 2 and 4.
    3. Cross-check against the PR's own title/description, which states the sweep is "conc 1/2/4/8/16/32" — confirming the config value is the intended/correct one and the changelog text is what's stale.
    4. A reader relying solely on the changelog (without cross-referencing the YAML config) would incorrectly conclude that concurrency levels 2 and 4 were never benchmarked for this config.

    Impact: Purely a documentation/prose inaccuracy — the changelog is descriptive text and has no effect on what the sweep actually runs (the real conc-list in nvidia-master.yaml drives execution). It does, however, misinform anyone reading the changelog about what was actually swept.

    Fix: Update the bullet at perf-changelog.yaml:5139 to read "conc 1/2/4/8/16/32" to match the shipped conc-list and the PR's own stated sweep range.

Comment on lines +32 to +35
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 sets health_check.max_attempts: 1440 to give the ~1.4TB MXFP4 checkpoint load extra headroom, but the pre-existing sed at runners/launch_b200-dgxc.sh:296 unconditionally rewrites any max_attempts: N line to 720, silently halving the recipe's intentional margin back to 7200s. This is a pre-existing launcher behavior (not introduced by this PR) that applies to every recipe, and since this config is otherwise identical to the fully-green Variant G (#2374) which ran under the same 720 override, the 1440 value appears to be dead/misleading rather than functionally necessary — worth reconciling but not blocking.

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

at 2-space indentation, intended to give the ~1.4TB MXFP4 Kimi-K3 checkpoint load (off shared Lustre) double the usual health-check window (14400s vs the launcher's usual 7200s).

The code path: runners/launch_b200-dgxc.sh (line ~296, inside the IS_MULTINODE branch that this recipe hits since multinode: true) runs, right before srtctl apply:

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

The regex anchors on exactly two leading spaces before max_attempts:, which is precisely how the recipe indents it under health_check:. This is an unconditional overwrite, not a floor/max clamp — the accompanying comment ('Bump recipe health-check timeout from 360x10s=3600s to 720x10s=7200s ... so large-model loads finish in time') describes it as always raising from a smaller default, and doesn't anticipate a recipe deliberately setting a larger value. So the sed always forces the file to 720 regardless of what was there, silently overwriting the recipe's 1440 down to 720 before srtctl apply ever reads the config.

Why nothing in the codebase prevents this: there's no validation or diffing between the recipe's declared value and what the launcher writes, and the sed runs on every CONFIG_FILE unconditionally for every recipe launched through this script — this recipe has no special-casing to opt out.

Step-by-step proof:

  1. Recipe file on disk contains max_attempts: 1440 (2-space indent, matches PR diff lines 32-35).
  2. Launcher does sed -i 's/^ max_attempts: [0-9]*/ max_attempts: 720/' "${CONFIG_FILE%%:*}" on that same file.
  3. The line max_attempts: 1440 matches ^ max_attempts: [0-9]* (2 leading spaces + literal text + digits), so sed rewrites it in place to max_attempts: 720.
  4. srtctl apply -f "$CONFIG_FILE" is invoked immediately after, reading the now-mutated 720 value.
  5. Result: the effective health-check window for this job is 720 * 10s = 7200s, not the 1440 * 10s = 14400s the recipe author intended.

Impact: if the 1.4TB MXFP4 weight load off shared Lustre ever exceeds 7200s, the health check would exhaust and kill the job before it ever reaches the decode step the probe is meant to test. However, the impact here appears to be nil in practice: (1) this sed is pre-existing launcher behavior, unmodified by this PR, and applies identically to every recipe that goes through this launcher; (2) per the PR description, this config is otherwise identical to the already-merged, fully-green Variant G (#2374), which ran successfully under the exact same 1440-in-recipe/720-effective override — proving the model load completes comfortably within 7200s and the extra 1440 margin was never actually exercised. So the recipe's 1440 is effectively a dead/misleading value the launcher always clobbers, rather than a value that changes observed behavior.

Fix: either make the launcher's sed only raise (not lower) the value, e.g. compare against the existing number and skip the rewrite if it's already >= 720, or drop the recipe's max_attempts override entirely (since it currently has no effect) and rely on the launcher's fixed 720, with a comment noting that. Given this is an explicitly not-to-merge probe PR whose entire purpose is a one-off empirical check, this is not blocking, but the author should reconcile the recipe's declared value with the launcher's clobbering behavior before this pattern is copied into a real (mergeable) recipe.

Comment on lines +65 to +77
VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS: "1800"
# Prefix-cache retention (variant G): 0, on the otherwise-unchanged
# GPU-resident variant D config. Any positive value must be a multiple of
# Kimi-K3's KDA-hybrid scheduler_block_size (3145728; the GB recipes'
# 32768 is hard-rejected at engine init — verified on this PR family), so
# 0 is the only value below one 3.1M-token scheduler block.
VLLM_PREFIX_CACHE_RETENTION_INTERVAL: "0"
# No VLLM_PREFIX_CACHE_RETENTION_INTERVAL: the GB200/GB300 AgentX value
# (32768) hard-fails engine init on Kimi-K3 — the KDA hybrid gives it a
# scheduler_block_size of 3145728 and the interval must be a multiple of
# it ("VLLM_PREFIX_CACHE_RETENTION_INTERVAL (32768) must be non-negative
# and a multiple of scheduler_block_size (3145728)"). Default retention
# served fine in earlier runs.

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 comment block right after VLLM_PREFIX_CACHE_RETENTION_INTERVAL: "0" (lines 72-77) still opens with 'No VLLM_PREFIX_CACHE_RETENTION_INTERVAL: ...', asserting the key is absent — directly contradicting the line right above it that sets it. This is leftover from before Variant G re-added the key set to 0; it's purely a stale comment with no runtime effect, but worth deleting so it doesn't mislead future readers.

Extended reasoning...

In benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-b200-tp8pp2-agentic.yaml, the aggregated_environment block contains two comment blocks about the same environment variable that now contradict each other. Lines 66-70 correctly explain the current behavior: VLLM_PREFIX_CACHE_RETENTION_INTERVAL: "0" is set (Variant G), and the comment explains why 0 was chosen (any positive value must be a multiple of the KDA-hybrid scheduler_block_size of 3145728, so 0 is the only value below one full scheduler block). Line 71 sets the key to "0".

Immediately after that, lines 72-77 open with "No VLLM_PREFIX_CACHE_RETENTION_INTERVAL: the GB200/GB300 AgentX value (32768) hard-fails engine init..." — i.e., a comment asserting the key is absent from the config and that default retention is used instead. That is flatly false for this file: the key is set, right above, to "0".

How this happened: per the PR history (perf-changelog.yaml), this recipe evolved through several variants. In an earlier revision (Variant D era), VLLM_PREFIX_CACHE_RETENTION_INTERVAL was removed entirely, and the "No VLLM_PREFIX_CACHE_RETENTION_INTERVAL: ..." comment was written at that time to explain the omission. Variant G later re-added the key set to "0" along with its own new comment (lines 66-70), but the old "No ..." comment block was never deleted — it's a leftover duplicate that now describes a state that no longer exists in the file.

Step-by-step proof:

  1. Read line 71: VLLM_PREFIX_CACHE_RETENTION_INTERVAL: "0" — the key IS present, with value 0.
  2. Read the very next comment, lines 72-73: # No VLLM_PREFIX_CACHE_RETENTION_INTERVAL: the GB200/GB300 AgentX value (32768) hard-fails engine init... — this states the key is NOT set.
  3. These two statements about the same key, three lines apart, cannot both be true. The comment is stale.
  4. Confirmed against perf-changelog.yaml: the "Variant G" changelog entry explicitly says it "adds VLLM_PREFIX_CACHE_RETENTION_INTERVAL=0" to the prior Variant D config, which is the config that originally didn't set the key (matching the stale comment's framing).

Impact: none on runtime behavior — YAML comments are not parsed, so the engine only sees VLLM_PREFIX_CACHE_RETENTION_INTERVAL=0 regardless of what the comments say. The only cost is to future readers/maintainers of this recipe, who could be confused about whether the key is set or not, or duplicate/re-derive the rationale that's already given correctly in lines 66-70.

Fix: delete the stale block (lines 72-77) since the correct, up-to-date rationale is already captured in lines 66-70. No functional change needed, just documentation cleanup.

This is an explicitly non-merge probe PR (Variant K, meant only to produce an empirical answer about whether an image patch is still needed), so there's no urgency to block on this — flagging as a nit for whenever the recipe is next touched.

@github-actions

Copy link
Copy Markdown
Contributor

@functionstackx

Copy link
Copy Markdown
Collaborator Author

/stage-results 30385435921

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

@functionstackx staged run 30385435921: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-07-28~r30385435921

This shared staging slot remains available until the next /stage-results request. Staging workflow

@functionstackx

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run 30385435921

@functionstackx functionstackx changed the title [Klaud Cold][agentic experiment][Variant K] probe: Kimi-K3 B200 agentic without the in-container patch script / 探针:不带容器内补丁脚本的 Kimi-K3 B200 智能体实验 Kimi K3 B200 Day 0 AgentX Pipeline Parallelism (non-DSpark as it doesn't work with Pipeline yet, offloading & TP16 and DEP8PP2 to be done in followup PR) Jul 28, 2026
The srt-slurm PR #278 multi-node extension now lives as commits on
functionstackx/srt-slurm-nv branch klaud/direct-vllm-multinode
(head df5baa93), so the launcher clones that branch directly instead
of applying srt-slurm-pr278-direct-vllm-multinode.patch onto the
upstream kylliang/direct-aggregate-vllm branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@functionstackx

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run

@functionstackx
functionstackx merged commit 0decc69 into main Jul 29, 2026
26 checks passed
@functionstackx
functionstackx deleted the klaud/kimik3-b200-agentic-direct-vllm-retention0-nodeps branch July 29, 2026 05:58
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