[AMD][AgentX] Kimi-K3 FP4 MI355X agentic TP8xPP2 DSpark / [AMD][AgentX] MI355X 上 Kimi-K3 FP4 agentic TP8×PP2 DSpark - #2678
Draft
charxwu wants to merge 65 commits into
Draft
[AMD][AgentX] Kimi-K3 FP4 MI355X agentic TP8xPP2 DSpark / [AMD][AgentX] MI355X 上 Kimi-K3 FP4 agentic TP8×PP2 DSpark#2678charxwu wants to merge 65 commits into
charxwu wants to merge 65 commits into
Conversation
…patches Add kimik3_fp4_mi355x_mtp.sh and apply_k3_container_patches.sh (vLLM PR #50619 K3 fp8 MLA verify, aiter mla_gluon batch relax + PR #4474 int64 KV stride, Triton 3.7.0), wired into the recipe and amd-master.yaml. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…fastsafetensors Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… cudagraph, fused_rms_norm_gated Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… 0.9 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…k + conc 14 Rework apply_k3_container_patches.sh for the PIECEWISE / bf16-KV Gluon MLA DSpark stack (KDA state_indices coercion + aiter PR #4474 int64 KV stride, Triton 3.7.0) and add conc 14 to the agentic-mtp sweep list. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…idempotent container patches - compilation-config: mode 3 (piecewise) with explicit even-step cudagraph_capture_sizes up to 2*CONC*(1+SPEC_NUM_TOKENS) (6*CONC at spec=2), drop cudagraph_mode FULL_DECODE_ONLY; capture range decoupled from --max-num-seqs (now 1*CONC) - spec sampling: synthetic rejection with synthetic_acceptance_length 2.45 - a8w4 MoE toggle: VLLM_ROCM_USE_AITER_MOE_SITUV2_A8W4=1 - apply_k3_container_patches.sh: wrap the raw diff payload into a proper idempotent git-apply script (was a bare diff invoked via bash) - amd-master.yaml: kimik3 mtp conc-list -> [4, 8, 10, 12, 14, 16] Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…I355X recipe Document kimik3-fp4-mi355x-vllm-agentic-mtp (Kimi-K3 MXFP4 TP8 + DSpark MTP, piecewise cudagraph capture, idempotent container patches) referencing PR #2508. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gluon MLA padding, GMU 0.95 - Add cudagraph_mode FULL_AND_PIECEWISE, GMU 0.95, MAX_NUM_SEQS 2*CONC - EVAL_ONLY uses block rejection; throughput uses synthetic AL 2.51 - Export VLLM_ROCM_AITER_MLA_ASM_PADDING=gluon, AITER_DISABLE_FMHA_OPUS=1 - Add --disable-custom-all-reduce; wait_for_amd_gpu_clean before run - Slim apply_k3_container_patches.sh Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…r iteration Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…efill OOM The bf16-KV/GMU0.95 arm exhausted HBM during the KDA causal_conv1d prefill (HSA_STATUS_ERROR_OUT_OF_RESOURCES, torch.empty_like abort in kimi_gdn_linear_attn). fp8 KV halves the pool and GMU 0.9 restores transient-activation headroom; align max-num-seqs to the cudagraph capture size. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…matching max-num-seqs to capture range Setting --max-num-seqs to MAX_CUDAGRAPH_CAPTURE_SIZE (2*CONC*(1+SPEC)=48) let the spec-decode verify batch reach 48*3=144 rows, far beyond the captured cudagraph max of 48, causing an out-of-bounds illegal memory access in the aiter biased_grouped_topk MoE-router kernel during FULL_AND_PIECEWISE warmup. Restore --max-num-seqs to MAX_NUM_SEQS (2*CONC) so verify rows (16*3=48) exactly fill the capture range [4..48]. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…sem fix, switch to FULL_DECODE_ONLY, restore conc sweep Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… to conc=8 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…fy, prefix-caching cg-exclude, FULL_AND_PIECEWISE Route Kimi-K3 qo_len==1 decode to the asm MLA kernel while hard-routing the DSpark qo_len>1 verify to gluon (asm has no gqa<16 multi-token kernel). Keep the query fp8 on both paths. Add the #50619 cg-exclude hunks so the target FULL cudagraph capture no longer memory-faults in spec-verify warmup under --enable-prefix-caching, and switch to FULL_AND_PIECEWISE so the KDA/Mamba align spec-verify path runs piecewise instead of OOB-faulting. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…es, restore conc sweep Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…adixArk/Kimi-K3-DSpark Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tch architectures to Qwen3DSparkModel Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…(step 1, 1..MAX) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…2048 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gate, drop max-num-batched-tokens cap Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rrow conc sweep Switch the MTP draft to the Inferact/Kimi-K3-DSpark hub model (drops the local staging + architecture-rewrite step), narrow the conc sweep to [1,4,8,10,14], and refresh the container patch script. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…to max 44 Narrow the pinned stride-2 cudagraph capture sizes to top out at 44 (matching the [1,4,8,10,14] conc sweep) and set max_cudagraph_capture_size accordingly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…t attention Switch the DSpark speculative-config attention_backend from TRITON_ATTN to TRITON_MLA in both eval and throughput paths. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…s, narrow to conc10 Replace the PR-fetching container patch with a byte-for-byte embedded/offline variant (aiter #4474+#4494, vllm #51171+#50578+#51011+#51040) so the patched source has no GitHub dependency or open-PR drift; validated gsm8k 0.90/0.85 on 2026-08-10. Narrow the conc sweep to [10] to isolate this config. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…..44, add lm_eval to patches Generate the cudagraph capture list as a contiguous 1..MAX via seq (driven off MAX_CUDAGRAPH_CAPTURE_SIZE=44) instead of the hardcoded stride-2 list, and add an optional lm_eval[api]==0.4.12 install to the container patch script (gated by WITH_LM_EVAL) to match the reference container's client eval tooling. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…Y, conc [10] Switch cudagraph_mode from FULL_AND_PIECEWISE to FULL_DECODE_ONLY to probe the spec-verify-path GPU memory fault, and set the conc sweep to [10]. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…SA 0x1016, restore FULL_AND_PIECEWISE Route small-head fp8 DSpark multi-token verify to the Gluon flatten (mla_gluon batch<=256 relax + fp8-query dequant) instead of the asm fp8 q-row-fold path, which faulted with HSA 0x1016 during agentic serving; decode (qlen==1) stays on asm. Adds vllm #50619 (partial) draft-attn cudagraph-exclude + nvidia MLA fallback gate and a KDA state_indices coercion for eager/piecewise warmup. Restore cudagraph_mode FULL_AND_PIECEWISE and widen the conc sweep to [8,10,14]. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…51682), conc [4,8,10] Replace the reshape(-1) state_indices coercion with vllm #51682: give the AMD packed KDA decode kernel a stride_state_indices param and load state_indices with it (matches the NVIDIA copy). With spec decode the KDA slot is block_table[:, 0] -- a strided view (1+num_spec_blocks wide) -- so the unit-stride assumption read out-of-range slots and HSA 0x1016-faulted at the long-context verify step. Narrow the conc sweep to [4,8,10]. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…erify, DSpark PS verify supersedes HYBRID Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ture 46; conc [1,4,8] + dram lmcache-k3 c12 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… vllm-simple case; config vllm-simple dram c10 dram-util 0.60 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…simple dram c10 config row Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nbound var (set -u abort), use TP Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ffload paths, keep vllm-simple only Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…true; mi355x dram-util 0.50 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…2,14,16] Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Verbatim application of andyluo7/agentx-kimi-k3-dspark-kv-offload@c45b69f source/inferencex-c12-kv-offload.patch on its stated base c93b729, with the matrix narrowed to the single c12 vllm-simple cell. That bundle reports 3991.29 tok/s/GPU from a manual AAC1 slurm run (job 16379 on mia1-p01-g43). This run asks whether the number reproduces off that node in our own harness. Their stack differs from ours in both the fix and the runtime settings: authoritative free-queue membership set instead of the negative-count clamp, plus eager offload, GPU_MEM_UTIL 0.84 and cudagraph capture 44 (we ran lazy, 0.90 and 60). 中文:在 CI 中原样复现 AAC1 job 16379 的 c12 KV 卸载配置,用于验证其手工运行 得到的 3991.29 tok/s/GPU 是否可在我们的测试环境中复现。
test-sweep-agentic-evals passes `matrix.config.kv-offload-backend` straight
into benchmark-tmpl.yml, whose input is `type: string`. For any agentic config
whose backend is the structured `{name, version}` form -- every vllm-simple,
lmcache and mooncake cell -- that value is an object, the reusable-workflow
call is invalid, and the job never starts. The run then completes as a failure
with no failing job listed, which is what happens today for
kimik3-fp4-mi355x-vllm-agentic-mtp.
Mirror what the throughput job (test-sweep-agentic) already does: pass
`['kv-offload-backend'].name` and the JSON in kv-offload-backend-metadata. The
eval job was also missing the metadata entirely, so the backend would not have
been configured even if the call had been accepted.
Also stop hardcoding `spec-decoding: 'none'` and pass the cell's value through.
The K3 recipe applies SPEC_ARGS unconditionally so its own server args are
unaffected, but hardcoding none misreports the cell and would silently drop
spec decode for any recipe that does gate on it.
中文:agentic-eval 任务直接把对象形式的 kv-offload-backend 传给只接受字符串的
可复用工作流输入,导致任务无法启动、整个运行以“无失败任务的失败”结束。改为与
吞吐任务一致地传 .name 与 metadata,并透传 spec-decoding。
Same stack as run 31664996880 (vllm-simple DRAM offload, eager, gmu 0.84); only the concurrency changes, to fill in the low end below the existing c12/c16 points. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Add TP8×PP2 MI355X agentic smoke path with aiter GEMM patches (N=6288 chunk, CA flush-sync), tuned CSV merge, and DISABLE_CUSTOM_ALL_REDUCE fallback. CONC=4 smoke passed (API + AgentX warmup/profiling). 中文:提交 Kimi-K3 TP8×PP2 相关改动;CONC=4 smoke 已通过。 Co-authored-by: Cursor <cursoragent@cursor.com>
Add amd-master aggregated PP2 config, AMD launcher/submit path, ASYNC_SCHEDULING toggle, and conc ladder [4,8,10,12,16,20]. 中文:将 Kimi-K3 MI355X 聚合 TP8×PP2 agentic 接入 e2e(master 配置、launcher/submit、ASYNC_SCHEDULING 开关、conc 梯子 [4,8,10,12,16,20])。 Co-authored-by: Cursor <cursoragent@cursor.com>
The vllm-openai-rocm image sets ENTRYPOINT=vllm, so `docker run <image> bash <script>` was parsed as vllm CLI args and failed with "unrecognized arguments". Pass --entrypoint bash and run the serve script via `bash -lc`, matching the verified g06+g17 smoke. Also restore the remaining smoke-parity bits that were missing from the CI path: --add-host, /sys and /tmp mounts, 128G shm, HF cache mount plus HF_HOME, GLOO/NCCL socket interface and IB HCA, aiter sitecustomize PYTHONPATH, the rocm-7.2.0 triton pin, and AIPERF_UNSAFE_OVERRIDE / SCENARIO_SUBDIR / ENFORCE_EAGER. Rank-0 failures no longer abort before log staging. 中文:vllm-openai-rocm 镜像的 ENTRYPOINT 是 vllm,因此 `docker run <镜像> bash <脚本>` 会把脚本路径当成 vllm 的命令行参数,报 "unrecognized arguments"。改为传 --entrypoint bash 并用 `bash -lc` 执行服务脚本,与已验证的 g06+g17 smoke 保持一致。 同时补齐 CI 路径上缺失的 smoke 对齐项:--add-host、/sys 与 /tmp 挂载、128G 共享内存、 HF 缓存挂载及 HF_HOME、GLOO/NCCL 网卡与 IB HCA 配置、aiter sitecustomize 的 PYTHONPATH、rocm-7.2.0 的 triton 版本固定,以及 AIPERF_UNSAFE_OVERRIDE / SCENARIO_SUBDIR / ENFORCE_EAGER。rank-0 失败时不再在日志归档前直接退出。
/model is mounted read-only, so when the weights are missing the serve script's `hf download` fallback dies on "Read-only file system: /model/.cache" after mounting an empty dir. The smoke only ever ran on g06+g17, where /it-share/hf_cache/Kimi-K3 exists; CI landed on g10, where it does not. Resolve the weights across the known roots (HOST_MODEL_PATH, the HF cache root, /it-share/data, /nfsdata) with HF-cache snapshot resolution, verify every allocated node, and fail fast listing the searched paths, mirroring amd_utils/job.slurm. HOST_MODEL_PATH now only pins a specific staging dir. 中文:/model 是只读挂载,权重缺失时 docker 会挂上一个空目录,服务脚本回退到 `hf download` 就会因 "Read-only file system: /model/.cache" 失败。之前的 smoke 只在 g06+g17 上跑过,那里有 /it-share/hf_cache/Kimi-K3;而 CI 调度到了 g10,该路径不存在。 现在改为跨已知根目录(HOST_MODEL_PATH、HF 缓存根、/it-share/data、/nfsdata)解析权重, 支持 HF 缓存的 snapshots 目录结构,并在所有分配到的节点上校验;找不到就快速失败并列出 搜索过的路径,与 amd_utils/job.slurm 的做法一致。HOST_MODEL_PATH 现在只用于指定固定的 权重目录。
Enable DSpark under TP8×PP2 with the vLLM #50514 PP-spec overlay, smoke/CI wiring for SPEC_DECODE / RUN_EVAL / PP_SIZE / KV_OFFLOAD_BACKEND_METADATA, MIN_CUDAGRAPH_CAPTURE_SIZE, and --async-scheduling. Conc8 agentic profiling passes on MI355X (g06+g17) with synthetic AL and async scheduling. 中文:打通 Kimi-K3 MI355X 上 TP8×PP2 + DSpark + async-scheduling 的 conc=8 路径:接入 vLLM #50514 的 PP+投机解码补丁、完善 smoke/CI 环境(SPEC_DECODE、 RUN_EVAL、PP_SIZE、KV metadata、MIN_CUDAGRAPH),并在 g06+g17 上用 synthetic acceptance 与 --async-scheduling 跑通 agentic profiling。 Co-authored-by: Cursor <cursoragent@cursor.com>
… chunked-prefill for TP8xPP2 DSpark Adds a block-cap patch for SimpleCPUOffloadScheduler so PP stages with different unique-KV-tensor counts agree on the CPU block-id range instead of overflowing PP1's smaller pinned buffer (root cause of the CONC=20 SIGSEGV in hipMemcpyBatchAsync). Widens MAX_NUM_BATCHED_TOKENS to 8192 (from 2048), which alone drives a ~4.8x throughput / ~98% TTFT improvement, and adds SKIP_GPU_CLEAN_WAIT to unblock benchmark_lib.sh's GPU-reclaim gate when rocm-smi VRAM% accounting goes stale after a prior crash. Also fixes KV_OFFLOAD_BACKEND validation when KV_OFFLOADING=none, normalizes bool columns in the merged aiter GEMM tuning CSV (mixed 0/False strings broke pandas dtype and silently fell back to torch, causing SIGSEGVs on untuned shapes), and adds a faulthandler keep-alive for libtvm_ffi's SIGSEGV-handler clobbering. 中文:修复 CONC=20 下 KV offload 的 block-id 越界问题,并针对 TP8xPP2 DSpark 调优 chunked-prefill。新增 block-cap 补丁,使 SimpleCPUOffloadScheduler 在 各 PP stage 拥有不同数量 KV tensor 时统一 CPU block-id 范围,避免 PP1 较小的 pinned buffer 越界(这是 CONC=20 在 hipMemcpyBatchAsync 中 SIGSEGV 的根因)。将 MAX_NUM_BATCHED_TOKENS 从 2048 提高到 8192,单这一项 即带来约 4.8 倍吞吐提升和约 98% 的 TTFT 降低;新增 SKIP_GPU_CLEAN_WAIT, 在前一次崩溃导致 rocm-smi 显存占用统计过期时,解除 benchmark_lib.sh 的 GPU 回收门禁。同时修复 KV_OFFLOADING=none 时 KV_OFFLOAD_BACKEND 的校验 问题,规范化合并后 aiter GEMM 调优 CSV 中的布尔列(0/False 混用会导致 pandas 类型退化为 StringDtype,索引全部失配后静默回退到 torch 实现, 在未调优的 shape 上引发 SIGSEGV),并为 libtvm_ffi 覆盖 SIGSEGV 处理器 的问题新增 faulthandler 保活线程。 Co-authored-by: Cursor <cursoragent@cursor.com>
Flip kimik3-fp4-mi355x-vllm-agentic-tp8pp2 from spec-decoding: none to mtp now that CONC=20 SIGSEGV is fixed and chunked-prefill (8192) is validated. Append the matching perf-changelog entry. 中文:将 kimik3-fp4-mi355x-vllm-agentic-tp8pp2 从 spec-decoding: none 切换为 mtp(DSpark),此前已修复 CONC=20 的 SIGSEGV 并验证 chunked-prefill(8192)。 同步在 perf-changelog.yaml 末尾追加对应条目。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
kimik3-fp4-mi355x-vllm-agentic-tp8pp2toamd-master.yaml: Kimi-K3 MXFP4 on MI355X, aggregated TP8×PP2 (2 nodes / 16 GPUs,decode.num-worker: 0so GPUs are counted once), agentic-coding,conc-list[4, 8, 10, 12, 16, 20], DSpark speculative decoding (spec-decoding: mtp,num-spec-tokens: 2, synthetic acceptance length 2.51).runners/launch_mi355x-amds.sh→benchmarks/multi_node/agentic/kimik3_fp4_mi355x_vllm.sh→kimik3_agg_pp_job.slurm→kimik3_fp4_mi355x_vllm_tp8pp2.sh(rank-0 OpenAI frontend + agentic replay; rank-1--headlessPP worker).vllm-openai-rocmimageENTRYPOINT=vllmwith--entrypoint bash(otherwise the serve script path was parsed as a vLLM CLI arg)./modelis:ro; missing weights previously mounted an empty dir and failed onhf downloadwithRead-only file system).spec-decoding: none/ STP-only) after fixing theCONC=20stability issue below.experimental/kimik3-v4/aiter/:patch_kv_offload_block_cap.py— clampSimpleCPUOffloadConnectorCPU block pool to the smallest PP-stage capacity (KV_OFFLOAD_MAX_CPU_BLOCKS); fixesCONC=20SIGSEGVinhipMemcpyBatchAsync.patch_kv_offload_batch_chunk.py— block-ID range diagnostics (off by default:KV_OFFLOAD_BATCH_CHUNK_PATCH=0).MAX_NUM_BATCHED_TOKENS2048 → 8192 for this prefill-heavy agentic workload (mean ISL ~135K, p95 ~455K); dominant throughput lever.perf-changelog.yamlentries for the e2e wiring and the DSpark flip.Image:
vllm/vllm-openai-rocm:nightly-cb8104839c141609d99f1254459ef3a4f1bd4263Model:
moonshotai/Kimi-K3KV offload:
SimpleCPUOffloadConnector(kv-offloading: dram,kv-offload-backend: vllm-simple,dram-utilization: 0.50→ ~1499 GB/node)Topology: aggregated TP8 × PP2,
ASYNC_SCHEDULING=false(toggleable via env)Root cause (CONC=20 SIGSEGV)
SimpleCPUOffloadSchedulersizes the shared CPU block-ID space from the global GPU KV-cache config (~47,095 blocks). Each PP stage's connector worker independently sizes its pinned buffer from its own unique-KV-tensor count (PP0: 3 → larger; PP1: 5 → ~28,257 blocks). Once the scheduler issued IDs past PP1's buffer,hipMemcpyBatchAsyncwrote OOB →SIGSEGVon all 8 PP1 workers. The vendored block-cap patch clamps to the min stage capacity; upstream fix:vllm-project/vllm#52921(draft).Smoke validation (g06+g17, 30-min profile, zero GPU faults)
Test plan
full-sweep-fail-fast; green full sweep (incl. evals) on a commit in this PR/reuse-sweep-runafter full green sweep with evalsRelated
vllm-project/vllm#52921中文说明
amd-master.yaml新增kimik3-fp4-mi355x-vllm-agentic-tp8pp2:MI355X 上 Kimi-K3 MXFP4 的聚合 TP8×PP2(2 节点 / 16 卡,decode.num-worker: 0,避免 GPU 重复计数),agentic-coding 场景,conc-list为 [4, 8, 10, 12, 16, 20],开启 DSpark 投机解码(spec-decoding: mtp,num-spec-tokens: 2,合成接受长度 2.51)。runners/launch_mi355x-amds.sh→benchmarks/multi_node/agentic/kimik3_fp4_mi355x_vllm.sh→kimik3_agg_pp_job.slurm→kimik3_fp4_mi355x_vllm_tp8pp2.sh(rank-0 OpenAI 前端 + agentic 回放;rank-1--headlessPP worker)。--entrypoint bash覆盖vllm-openai-rocm镜像的ENTRYPOINT=vllm(否则服务脚本路径会被当成 vLLM CLI 参数)。/model为只读挂载;权重缺失时会挂上空目录,随后hf download因只读文件系统失败)。spec-decoding: none(仅 STP)切换为 DSpark,此前已定位并修复CONC=20稳定性问题。experimental/kimik3-v4/aiter/下新增运行时补丁:patch_kv_offload_block_cap.py— 将SimpleCPUOffloadConnector的 CPU block 池钳制到最小 PP stage 容量(KV_OFFLOAD_MAX_CPU_BLOCKS),修复CONC=20时hipMemcpyBatchAsync的SIGSEGV。patch_kv_offload_batch_chunk.py— block-ID 范围诊断埋点(默认关闭:KV_OFFLOAD_BATCH_CHUNK_PATCH=0)。MAX_NUM_BATCHED_TOKENS从 2048 提升到 8192,适配该预填充占主导的 agentic 负载(平均输入长度约 135K,p95 约 455K token);这是主要吞吐杠杆。perf-changelog.yaml末尾追加 e2e 接入与 DSpark 切换条目。镜像:
vllm/vllm-openai-rocm:nightly-cb8104839c141609d99f1254459ef3a4f1bd4263模型:
moonshotai/Kimi-K3KV 卸载:
SimpleCPUOffloadConnector(kv-offloading: dram,kv-offload-backend: vllm-simple,dram-utilization: 0.50→ 约 1499 GB/节点)拓扑: 聚合 TP8 × PP2,
ASYNC_SCHEDULING=false(可通过环境变量切换)根因(CONC=20 SIGSEGV)
SimpleCPUOffloadScheduler按全局 GPU KV 缓存配置分配共享 CPU block-ID 空间(约 47,095)。各 PP stage 的 connector worker 则按自身唯一 KV tensor 数量独立推导 pinned buffer(PP0: 3 → 更大;PP1: 5 → 约 28,257)。调度器一旦发出超过 PP1 buffer 的 ID,hipMemcpyBatchAsync越界写 → PP1 全部 8 个 workerSIGSEGV。本仓库用 block-cap 补丁钳制到最小 stage 容量;上游修复:vllm-project/vllm#52921(草稿)。Smoke 验证(g06+g17,30 分钟 profile,零 GPU 故障)
测试计划
full-sweep-fail-fast;在本 PR 的某个 commit 上跑出含 evals 的全绿 full sweep/reuse-sweep-run相关
vllm-project/vllm#52921