Skip to content

[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
mainfrom
dev_kimik3_pp_e2e
Draft

[AMD][AgentX] Kimi-K3 FP4 MI355X agentic TP8xPP2 DSpark / [AMD][AgentX] MI355X 上 Kimi-K3 FP4 agentic TP8×PP2 DSpark#2678
charxwu wants to merge 65 commits into
mainfrom
dev_kimik3_pp_e2e

Conversation

@charxwu

@charxwu charxwu commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Add kimik3-fp4-mi355x-vllm-agentic-tp8pp2 to amd-master.yaml: Kimi-K3 MXFP4 on MI355X, aggregated TP8×PP2 (2 nodes / 16 GPUs, decode.num-worker: 0 so 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).
  • Wire the CI path: runners/launch_mi355x-amds.shbenchmarks/multi_node/agentic/kimik3_fp4_mi355x_vllm.shkimik3_agg_pp_job.slurmkimik3_fp4_mi355x_vllm_tp8pp2.sh (rank-0 OpenAI frontend + agentic replay; rank-1 --headless PP worker).
  • Fix CI bring-up bugs found during e2e:
    • Override the vllm-openai-rocm image ENTRYPOINT=vllm with --entrypoint bash (otherwise the serve script path was parsed as a vLLM CLI arg).
    • Resolve model weights across known host roots and verify on all allocated nodes before launch (/model is :ro; missing weights previously mounted an empty dir and failed on hf download with Read-only file system).
  • Enable DSpark on this recipe (previously checked in as spec-decoding: none / STP-only) after fixing the CONC=20 stability issue below.
  • Add runtime patches under experimental/kimik3-v4/aiter/:
    • patch_kv_offload_block_cap.py — clamp SimpleCPUOffloadConnector CPU block pool to the smallest PP-stage capacity (KV_OFFLOAD_MAX_CPU_BLOCKS); fixes CONC=20 SIGSEGV in hipMemcpyBatchAsync.
    • patch_kv_offload_batch_chunk.py — block-ID range diagnostics (off by default: KV_OFFLOAD_BATCH_CHUNK_PATCH=0).
    • aiter sitecustomize / GEMM merge / n6288 + ca_flush_sync patch stack used by the smoke-validated serve path.
  • Raise MAX_NUM_BATCHED_TOKENS 2048 → 8192 for this prefill-heavy agentic workload (mean ISL ~135K, p95 ~455K); dominant throughput lever.
  • Append perf-changelog.yaml entries for the e2e wiring and the DSpark flip.

Image: vllm/vllm-openai-rocm:nightly-cb8104839c141609d99f1254459ef3a4f1bd4263
Model: moonshotai/Kimi-K3
KV 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)

SimpleCPUOffloadScheduler sizes 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, hipMemcpyBatchAsync wrote OOB → SIGSEGV on 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)

Conc Throughput/GPU TTFT p50 E2E p50 GPU KV occupancy
16 2,049 tok/s
20 2,078 tok/s 1,682 ms 8,963 ms 90.4%

Test plan

  • Label full-sweep-fail-fast; green full sweep (incl. evals) on a commit in this PR
  • Confirm c4/c8/c10/c12/c16/c20 green with DSpark + artifact upload
  • /reuse-sweep-run after full green sweep with evals

Related


中文说明

  • 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: mtpnum-spec-tokens: 2,合成接受长度 2.51)。
  • 接入 CI 路径:runners/launch_mi355x-amds.shbenchmarks/multi_node/agentic/kimik3_fp4_mi355x_vllm.shkimik3_agg_pp_job.slurmkimik3_fp4_mi355x_vllm_tp8pp2.sh(rank-0 OpenAI 前端 + agentic 回放;rank-1 --headless PP worker)。
  • 修复 e2e bring-up 中发现的问题:
    • --entrypoint bash 覆盖 vllm-openai-rocm 镜像的 ENTRYPOINT=vllm(否则服务脚本路径会被当成 vLLM CLI 参数)。
    • 在已知 host 根目录上解析权重,并在所有分配节点上校验后再启动(/model 为只读挂载;权重缺失时会挂上空目录,随后 hf download 因只读文件系统失败)。
  • 将该 recipe 从先前的 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=20hipMemcpyBatchAsyncSIGSEGV
    • patch_kv_offload_batch_chunk.py — block-ID 范围诊断埋点(默认关闭:KV_OFFLOAD_BATCH_CHUNK_PATCH=0)。
    • 以及 smoke 验证路径使用的 aiter sitecustomize / GEMM 合并 / n6288 + ca_flush_sync 补丁栈。
  • MAX_NUM_BATCHED_TOKENS 从 2048 提升到 8192,适配该预填充占主导的 agentic 负载(平均输入长度约 135K,p95 约 455K token);这是主要吞吐杠杆。
  • perf-changelog.yaml 末尾追加 e2e 接入与 DSpark 切换条目。

镜像: vllm/vllm-openai-rocm:nightly-cb8104839c141609d99f1254459ef3a4f1bd4263
模型: moonshotai/Kimi-K3
KV 卸载: SimpleCPUOffloadConnectorkv-offloading: dramkv-offload-backend: vllm-simpledram-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 个 worker SIGSEGV。本仓库用 block-cap 补丁钳制到最小 stage 容量;上游修复:vllm-project/vllm#52921(草稿)。

Smoke 验证(g06+g17,30 分钟 profile,零 GPU 故障)

并发 单卡吞吐 TTFT p50 E2E p50 GPU KV 占用率
16 2,049 tok/s
20 2,078 tok/s 1,682 ms 8,963 ms 90.4%

测试计划

  • 打上 full-sweep-fail-fast;在本 PR 的某个 commit 上跑出含 evals 的全绿 full sweep
  • 确认启用 DSpark 后 c4/c8/c10/c12/c16/c20 均通过并成功上传产物
  • 全绿且 evals 通过后评论 /reuse-sweep-run

相关

seungrokj and others added 30 commits August 4, 2026 19:46
…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>
seungrokj and others added 29 commits August 10, 2026 11:53
…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 末尾追加对应条目。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants