From 2b68f986791c82cd978f25c8dda14da53f4a0b9d Mon Sep 17 00:00:00 2001 From: hyukjlee Date: Wed, 2 Sep 2026 18:24:07 +0900 Subject: [PATCH 1/6] perf(agentx): refresh K3 MI355X LMCache curve Use the merged Kimi-K3 recipe with vLLM nightly 7c5dc571 and LMCache 0.5.5rc3 for C1, C8, C14, and TP8/DCP8 C40. Keep the validated C40 profile with GPU memory utilization reduced to 0.88. Assisted-by: OpenAI Codex --- .../single_node/agentic/kimik3_fp4_mi355x.sh | 5 ++ .../agentic/kimik3_fp4_mi355x_mtp.sh | 84 ++++++++++++------- configs/amd-master.yaml | 6 +- perf-changelog.yaml | 10 +++ 4 files changed, 71 insertions(+), 34 deletions(-) create mode 100755 benchmarks/single_node/agentic/kimik3_fp4_mi355x.sh diff --git a/benchmarks/single_node/agentic/kimik3_fp4_mi355x.sh b/benchmarks/single_node/agentic/kimik3_fp4_mi355x.sh new file mode 100755 index 0000000000..eff8ce9408 --- /dev/null +++ b/benchmarks/single_node/agentic/kimik3_fp4_mi355x.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +export SPEC_DECODING=none +exec bash "$(dirname "$0")/kimik3_fp4_mi355x_mtp.sh" diff --git a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh index a8f2c42c1c..8e954240c7 100644 --- a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh +++ b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh @@ -149,25 +149,18 @@ case "${KV_OFFLOAD_BACKEND:-}" in lmcache) require_agentic_kv_offload_backend "$KV_OFFLOAD_BACKEND" - # Keep the image's tested torch/ROCm stack and install only LMCache's - # missing runtime dependencies, same as the MiniMax-M3 lmcache arm. - LMCACHE_VERSION="0.5.5.dev60+rocm7.2" - LMCACHE_ROCM_INDEX="https://github.com/LMCache/LMCache/releases/expanded_assets/nightly-rocm" + # Keep the stock image's torch/ROCm stack and install the LMCache runtime + # dependencies used by the validated reference run. + LMCACHE_VERSION="0.5.5rc3+rocm7.2" + export KV_OFFLOAD_BACKEND_METADATA="{\"name\":\"lmcache\",\"version\":\"${LMCACHE_VERSION}\"}" + LMCACHE_RELEASE="v0.5.5rc3" + LMCACHE_ROCM_INDEX="https://github.com/LMCache/LMCache/releases/expanded_assets/${LMCACHE_RELEASE}-rocm" agentic_pip_install --quiet --no-cache-dir --no-deps \ "sortedcontainers==2.4.0" \ "opentelemetry-exporter-prometheus==0.61b0" \ "cupy-rocm-7-0==14.1.1" \ "lmcache==${LMCACHE_VERSION}" --find-links "$LMCACHE_ROCM_INDEX" - # LMCache 0.5.5's transfer-channel layer eagerly imports the Mooncake - # backend (mooncake_te_impl.py -> `from mooncake.engine import - # TransferEngine`), whose native .so resolves all of its DT_NEEDED libs at - # import. The vLLM ROCm image ships none of them, so the import sanity - # check below (and the LMCache server) would otherwise fail with - # "ImportError: lib*.so: cannot open shared object file" (first libglog, - # then libjsoncpp, ...). Provision Mooncake's full runtime lib set from the - # distro before importing. apt-get install is idempotent, so run it - # whenever any of the libs is still missing rather than gating on one. LMCACHE_NATIVE_LIBS=(libglog.so.0 libjsoncpp.so.25 libibverbs.so.1 librdmacm.so.1 libnuma.so.1) for lib in "${LMCACHE_NATIVE_LIBS[@]}"; do if ! ldconfig -p | grep -q "$lib"; then @@ -178,17 +171,16 @@ case "${KV_OFFLOAD_BACKEND:-}" in fi done python3 -c \ - "import cupy; import lmcache.integration.vllm.lmcache_mp_connector; import opentelemetry.exporter.prometheus" \ - >/dev/null + "import cupy; import opentelemetry.exporter.prometheus; from lmcache.v1.multiprocess.http_server import run_http_server" # One MP server for the node, per the Kimi-K3 recipe # (docs.lmcache.ai/recipes/kimi_k3.html), with --chunk-size sized for # THIS stack rather than the recipe's CUDA-path 768: the connector # requires the chunk to be a multiple of every engine KV group's - # tokens_per_block, and the hybrid KDA/MLA layout here registers - # attention groups at 1536 ("Setting attention block size to 1536", - # run 31644990546) plus a KDA state group at 3072 (run 31645828378), - # so 3072 is the minimum valid chunk. The multi-group layout also + # tokens_per_block. The hybrid KDA/MLA layout registers attention groups + # at 1536 tokens and a KDA state group at 3072. Use 12288 for every point + # so it is divisible by both group sizes and matches the tested LMCache + # scheduler geometry. The multi-group layout also # requires one object group per sliding-window size: # --separate-object-groups. LMCACHE_PORT=6555 @@ -205,7 +197,7 @@ case "${KV_OFFLOAD_BACKEND:-}" in --http-port "$LMCACHE_HTTP_PORT" --l1-size-gb "$LMCACHE_L1_SIZE_GB" --l1-init-size-gb 10 - --chunk-size 3072 + --chunk-size 12288 --separate-object-groups --enable-extra-logging --extra-logging-interval 30 @@ -248,20 +240,24 @@ if [ "$EP_SIZE" -gt 1 ]; then fi # ---- Speculative / Util------------------------------------------------------ -case "$CONC" in - # No KV offload; the working set fits in HBM. - 1) +case "${SPEC_DECODING:-mtp}:$CONC" in + mtp:1) SYNTHETIC_ACCEPT_LEN=3.75 SPEC_NUM_TOKENS=6 GPU_MEM_UTIL=0.9 MAX_NUM_BATCHED_TOKENS=16384 ;; - 2|4|8|10|12|14) + mtp:2|mtp:4|mtp:8|mtp:10|mtp:12|mtp:14) SYNTHETIC_ACCEPT_LEN=3.00 SPEC_NUM_TOKENS=3 GPU_MEM_UTIL=0.9 MAX_NUM_BATCHED_TOKENS=8192 ;; + none:40) + SPEC_NUM_TOKENS=0 + GPU_MEM_UTIL=0.88 + MAX_NUM_BATCHED_TOKENS=16384 + ;; *) SPEC_NUM_TOKENS=0 GPU_MEM_UTIL=0.85 @@ -285,10 +281,24 @@ else fi # ---- HIP graph ------------------------------------------------------------ -MAX_NUM_SEQS=$((2 * CONC)) -MAX_CUDAGRAPH_CAPTURE_SIZE=$((MAX_NUM_SEQS * (1 + SPEC_NUM_TOKENS))) -CUDAGRAPH_CAPTURE_SIZES="$(seq -s, 2 "$MAX_CUDAGRAPH_CAPTURE_SIZE")" -COMPILATION_CONFIG_ARGS=(--compilation-config "{\"mode\":3,\"cudagraph_mode\":\"FULL_AND_PIECEWISE\",\"max_cudagraph_capture_size\":$MAX_CUDAGRAPH_CAPTURE_SIZE,\"custom_ops\":[\"+fused_rms_norm_gated\"],\"cudagraph_capture_sizes\":[$CUDAGRAPH_CAPTURE_SIZES]}") +SERVER_STREAM_ARGS=() +PREFIX_MATCH_ARGS=() +ATTENTION_CONFIG='{"mla_prefill_backend":"ROCM_AITER_FA"}' +COMPILATION_CUSTOM_OPS='["+fused_rms_norm_gated"]' +if [ "${SPEC_DECODING:-mtp}:$CONC" = "none:40" ]; then + MAX_NUM_SEQS=80 + MAX_CUDAGRAPH_CAPTURE_SIZE=4096 + CUDAGRAPH_CAPTURE_SIZES="$(seq -s, 1 "$MAX_NUM_SEQS"),128,256,512,1024,2048,4096" + SERVER_STREAM_ARGS=(--stream-interval 10) + PREFIX_MATCH_ARGS=(--prefix-match-unit 128) + ATTENTION_CONFIG='{"mla_prefill_backend":"ROCM_AITER_FA","use_prefill_query_quantization":true}' + COMPILATION_CUSTOM_OPS='["+fused_rms_norm_gated","+quant_fp8","+grouped_topk","+sparse_attn_indexer","none"]' +else + MAX_NUM_SEQS=$((2 * CONC)) + MAX_CUDAGRAPH_CAPTURE_SIZE=$((MAX_NUM_SEQS * (1 + SPEC_NUM_TOKENS))) + CUDAGRAPH_CAPTURE_SIZES="$(seq -s, 2 "$MAX_CUDAGRAPH_CAPTURE_SIZE")" +fi +COMPILATION_CONFIG_ARGS=(--compilation-config "{\"mode\":3,\"cudagraph_mode\":\"FULL_AND_PIECEWISE\",\"max_cudagraph_capture_size\":$MAX_CUDAGRAPH_CAPTURE_SIZE,\"custom_ops\":$COMPILATION_CUSTOM_OPS,\"cudagraph_capture_sizes\":[$CUDAGRAPH_CAPTURE_SIZES]}") echo "Starting vllm server..." export PYTHONNOUSERSITE=1 @@ -305,8 +315,18 @@ fi CP_ARGS=() ATTN_BE_ARGS=() if [ "$DCP_SIZE" -gt 1 ]; then - CP_ARGS+=(--decode-context-parallel-size "$DCP_SIZE" --dcp-comm-backend a2a) - ATTN_BE_ARGS+=(--attention-backend TRITON_MLA) + CP_KV_CACHE_INTERLEAVE_SIZE=1 + if [ "${KV_OFFLOAD_BACKEND:-}" = "lmcache" ]; then + CP_KV_CACHE_INTERLEAVE_SIZE=1536 + fi + CP_ARGS+=( + --decode-context-parallel-size "$DCP_SIZE" + --dcp-comm-backend a2a + --cp-kv-cache-interleave-size "$CP_KV_CACHE_INTERLEAVE_SIZE" + ) + ATTN_BE_ARGS+=(--attention-backend ROCM_AITER_MLA) + export VLLM_ALLOW_DCP_FULL_CUDAGRAPH=1 + export PREFIX_CACHING_HASH_ALGO=sha256 fi export VLLM_USE_DIRECT_DCP_A2A=0 export VLLM_USE_DIRECT_DCP_Q_GATHER=0 @@ -329,10 +349,12 @@ VLLM_CMD=( --tool-call-parser kimi_k3 --reasoning-parser kimi_k3 --max-model-len 1048576 + "${SERVER_STREAM_ARGS[@]}" --enable-prefix-caching + "${PREFIX_MATCH_ARGS[@]}" --kv-cache-dtype "fp8" --max-num-batched-tokens "$MAX_NUM_BATCHED_TOKENS" - --attention-config '{"mla_prefill_backend":"ROCM_AITER_FA"}' + --attention-config "$ATTENTION_CONFIG" "${ATTN_BE_ARGS[@]}" "${COMPILATION_CONFIG_ARGS[@]}" "${SPEC_ARGS[@]}" diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index 0d380154a0..db1324eb95 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -625,7 +625,7 @@ dsr1-fp8-mi355x-sglang-disagg-mtp: - "DECODE_MTP_SIZE=2" kimik3-fp4-mi355x-vllm-agentic-mtp: - image: vllm/vllm-openai-rocm:nightly-1dc464d42681d22f38caf1fdc1eb632dc4421c45 + image: vllm/vllm-openai-rocm:nightly-7c5dc571cbd1064ecc8a9b1045637ff647aa22cb model: moonshotai/Kimi-K3 model-prefix: kimik3 runner: cluster:mi355x-amds @@ -636,8 +636,8 @@ kimik3-fp4-mi355x-vllm-agentic-mtp: agentic-coding: - dram-utilization: 0.60 search-space: - - { tp: 8, kv-offloading: none, conc-list: [1] , spec-decoding: mtp} - - { tp: 8, ep: 1, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.5.dev60+rocm7.2" }, conc-list: [4, 8, 10, 12, 14], spec-decoding: mtp } + - { tp: 8, ep: 1, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.5rc3+rocm7.2" }, conc-list: [1, 8, 14], spec-decoding: mtp } + - { tp: 8, dcp-size: 8, ep: 1, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.5rc3+rocm7.2" }, conc-list: [40], spec-decoding: none } # Kimi-K3 MXFP4 agentic-coding benchmark on MI355X via ATOM with DSpark # speculative decoding. Acceptance is pinned to the committed golden curve in diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 4eb0a2caa6..5dc48fa252 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -6821,3 +6821,13 @@ description: - "Refresh to collect TensorRT-LLM server metrics." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2774 + +- config-keys: + - kimik3-fp4-mi355x-vllm-agentic-mtp + scenario-type: + - agentic-coding + description: + - "Refresh the Kimi-K3 MI355X AgentX recipe from the merged PR #2787 baseline to vLLM ROCm nightly 7c5dc571 and LMCache 0.5.5rc3+rocm7.2." + - "Run C1, C8, and C14 with TP8 DSpark and LMCache DRAM KV offload; run C40 with TP8/DCP8 and no speculative decoding." + - "Use a 12288-token LMCache chunk and a 1536-token DCP KV-cache interleave; set C40 gpu-memory-utilization to 0.88 while retaining its 16K batched-token, max-num-seqs 80, and full CUDA-graph profile." + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX From ef281f09d429a16dfb18258b2d3dd63836de5fb7 Mon Sep 17 00:00:00 2001 From: hyukjlee Date: Wed, 2 Sep 2026 18:26:38 +0900 Subject: [PATCH 2/6] docs(changelog): link K3 LMCache refresh PR Assisted-by: OpenAI Codex --- perf-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 5dc48fa252..9504a4dc6d 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5595,7 +5595,7 @@ - "Image ghcr.io/tile-ai/tilert:0.1.5 (tilert 0.1.5.post2 installed at container start); commands aligned to TileRT README Topology A -- NIXL KV transfer, --kv-cache-dtype fp8_ds_mla (prefill) <-> fp8 (decode), max-seq-len 202752; MTP speculative-config wired via spec-decoding=mtp" - "Topology: 1 prefill node (TP8) + 1 decode node (TP8), each 8xB200 exclusive; TileRT decode is bs=1 only so conc-list is a single point [1], ISL 1k/8k OSL 1k" - "Runner: launch_b200-dgxc.sh tilert early-return branch (zero impact on the dynamo path); tilert_utils/submit.sh issues two srun --ntasks=1, one per role, because prefill and decode need different container images; roles are dispatched by the TILERT_ROLE it exports, and torn down across nodes via a sentinel file on the shared /workspace" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2804 - config-keys: - qwen3.5-fp8-b200-sglang-agentic-mtp From d72e884db8d3cb1609156e95c9c551daac061d6e Mon Sep 17 00:00:00 2001 From: hyukjlee Date: Wed, 2 Sep 2026 18:27:37 +0900 Subject: [PATCH 3/6] fix(changelog): link the appended K3 entry Assisted-by: OpenAI Codex --- perf-changelog.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 9504a4dc6d..abb33dd1ed 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5595,7 +5595,7 @@ - "Image ghcr.io/tile-ai/tilert:0.1.5 (tilert 0.1.5.post2 installed at container start); commands aligned to TileRT README Topology A -- NIXL KV transfer, --kv-cache-dtype fp8_ds_mla (prefill) <-> fp8 (decode), max-seq-len 202752; MTP speculative-config wired via spec-decoding=mtp" - "Topology: 1 prefill node (TP8) + 1 decode node (TP8), each 8xB200 exclusive; TileRT decode is bs=1 only so conc-list is a single point [1], ISL 1k/8k OSL 1k" - "Runner: launch_b200-dgxc.sh tilert early-return branch (zero impact on the dynamo path); tilert_utils/submit.sh issues two srun --ntasks=1, one per role, because prefill and decode need different container images; roles are dispatched by the TILERT_ROLE it exports, and torn down across nodes via a sentinel file on the shared /workspace" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2804 + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX - config-keys: - qwen3.5-fp8-b200-sglang-agentic-mtp @@ -6830,4 +6830,4 @@ - "Refresh the Kimi-K3 MI355X AgentX recipe from the merged PR #2787 baseline to vLLM ROCm nightly 7c5dc571 and LMCache 0.5.5rc3+rocm7.2." - "Run C1, C8, and C14 with TP8 DSpark and LMCache DRAM KV offload; run C40 with TP8/DCP8 and no speculative decoding." - "Use a 12288-token LMCache chunk and a 1536-token DCP KV-cache interleave; set C40 gpu-memory-utilization to 0.88 while retaining its 16K batched-token, max-num-seqs 80, and full CUDA-graph profile." - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2804 From 6793742ac2460376532d6c81b724bfdb68a8d982 Mon Sep 17 00:00:00 2001 From: hyukjlee Date: Wed, 2 Sep 2026 19:17:09 +0900 Subject: [PATCH 4/6] perf(agentx): add K3 C44 and C48 LMCache points MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 Kimi-K3 MI355X LMCache 曲线添加 C44 和 C48,并沿用 C40 的 TP8/DCP8、无推测解码和 GMU 0.88 配置。 Assisted-by: OpenAI Codex --- .../single_node/agentic/kimik3_fp4_mi355x_mtp.sh | 11 +++++++---- configs/amd-master.yaml | 2 +- perf-changelog.yaml | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh index 8e954240c7..a442ba469e 100644 --- a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh +++ b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh @@ -253,7 +253,7 @@ case "${SPEC_DECODING:-mtp}:$CONC" in GPU_MEM_UTIL=0.9 MAX_NUM_BATCHED_TOKENS=8192 ;; - none:40) + none:40|none:44|none:48) SPEC_NUM_TOKENS=0 GPU_MEM_UTIL=0.88 MAX_NUM_BATCHED_TOKENS=16384 @@ -285,7 +285,8 @@ SERVER_STREAM_ARGS=() PREFIX_MATCH_ARGS=() ATTENTION_CONFIG='{"mla_prefill_backend":"ROCM_AITER_FA"}' COMPILATION_CUSTOM_OPS='["+fused_rms_norm_gated"]' -if [ "${SPEC_DECODING:-mtp}:$CONC" = "none:40" ]; then +case "${SPEC_DECODING:-mtp}:$CONC" in + none:40|none:44|none:48) MAX_NUM_SEQS=80 MAX_CUDAGRAPH_CAPTURE_SIZE=4096 CUDAGRAPH_CAPTURE_SIZES="$(seq -s, 1 "$MAX_NUM_SEQS"),128,256,512,1024,2048,4096" @@ -293,11 +294,13 @@ if [ "${SPEC_DECODING:-mtp}:$CONC" = "none:40" ]; then PREFIX_MATCH_ARGS=(--prefix-match-unit 128) ATTENTION_CONFIG='{"mla_prefill_backend":"ROCM_AITER_FA","use_prefill_query_quantization":true}' COMPILATION_CUSTOM_OPS='["+fused_rms_norm_gated","+quant_fp8","+grouped_topk","+sparse_attn_indexer","none"]' -else + ;; + *) MAX_NUM_SEQS=$((2 * CONC)) MAX_CUDAGRAPH_CAPTURE_SIZE=$((MAX_NUM_SEQS * (1 + SPEC_NUM_TOKENS))) CUDAGRAPH_CAPTURE_SIZES="$(seq -s, 2 "$MAX_CUDAGRAPH_CAPTURE_SIZE")" -fi + ;; +esac COMPILATION_CONFIG_ARGS=(--compilation-config "{\"mode\":3,\"cudagraph_mode\":\"FULL_AND_PIECEWISE\",\"max_cudagraph_capture_size\":$MAX_CUDAGRAPH_CAPTURE_SIZE,\"custom_ops\":$COMPILATION_CUSTOM_OPS,\"cudagraph_capture_sizes\":[$CUDAGRAPH_CAPTURE_SIZES]}") echo "Starting vllm server..." diff --git a/configs/amd-master.yaml b/configs/amd-master.yaml index db1324eb95..502572a78d 100644 --- a/configs/amd-master.yaml +++ b/configs/amd-master.yaml @@ -637,7 +637,7 @@ kimik3-fp4-mi355x-vllm-agentic-mtp: - dram-utilization: 0.60 search-space: - { tp: 8, ep: 1, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.5rc3+rocm7.2" }, conc-list: [1, 8, 14], spec-decoding: mtp } - - { tp: 8, dcp-size: 8, ep: 1, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.5rc3+rocm7.2" }, conc-list: [40], spec-decoding: none } + - { tp: 8, dcp-size: 8, ep: 1, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.5rc3+rocm7.2" }, conc-list: [40, 44, 48], spec-decoding: none } # Kimi-K3 MXFP4 agentic-coding benchmark on MI355X via ATOM with DSpark # speculative decoding. Acceptance is pinned to the committed golden curve in diff --git a/perf-changelog.yaml b/perf-changelog.yaml index abb33dd1ed..dad68b8648 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -6828,6 +6828,6 @@ - agentic-coding description: - "Refresh the Kimi-K3 MI355X AgentX recipe from the merged PR #2787 baseline to vLLM ROCm nightly 7c5dc571 and LMCache 0.5.5rc3+rocm7.2." - - "Run C1, C8, and C14 with TP8 DSpark and LMCache DRAM KV offload; run C40 with TP8/DCP8 and no speculative decoding." - - "Use a 12288-token LMCache chunk and a 1536-token DCP KV-cache interleave; set C40 gpu-memory-utilization to 0.88 while retaining its 16K batched-token, max-num-seqs 80, and full CUDA-graph profile." + - "Run C1, C8, and C14 with TP8 DSpark and LMCache DRAM KV offload; run C40, C44, and C48 with TP8/DCP8 and no speculative decoding." + - "Use a 12288-token LMCache chunk and a 1536-token DCP KV-cache interleave; set C40/C44/C48 gpu-memory-utilization to 0.88 while retaining the 16K batched-token, max-num-seqs 80, and full CUDA-graph profile." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2804 From c7b685c4a08fddb0f60a49a0c2ee55abc41c590c Mon Sep 17 00:00:00 2001 From: hyukjlee Date: Wed, 2 Sep 2026 21:31:31 +0900 Subject: [PATCH 5/6] fix(agentx): tolerate K3 LMCache transfer stalls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 LMCache MP 心跳超时提高到 90 秒,并将 worker 回收超时提高到 300 秒,避免 C14 大批量传输期间的短暂阻塞触发错误恢复路径。 Assisted-by: OpenAI Codex --- benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh | 5 ++++- perf-changelog.yaml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh index a442ba469e..abbfc79558 100644 --- a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh +++ b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh @@ -186,6 +186,8 @@ case "${KV_OFFLOAD_BACKEND:-}" in LMCACHE_PORT=6555 LMCACHE_HTTP_PORT=8090 LMCACHE_LOG="$RESULT_DIR/lmcache_server.log" + LMCACHE_HEARTBEAT_INTERVAL=90.0 + LMCACHE_WORKER_REAP_TIMEOUT=300 LMCACHE_L1_SIZE_GB="$TOTAL_CPU_DRAM_GB" @@ -205,6 +207,7 @@ case "${KV_OFFLOAD_BACKEND:-}" in --max-gpu-workers 1 --eviction-policy LRU --supported-transfer-mode lmcache_driven + --worker-reap-timeout-seconds "$LMCACHE_WORKER_REAP_TIMEOUT" --shm-name "" ) append_command "$RESULT_DIR/lmcache_command.txt" "${LMCACHE_CMD[@]}" @@ -221,7 +224,7 @@ case "${KV_OFFLOAD_BACKEND:-}" in # same MQ timeout headroom as the MiniMax-M3 arm. OFFLOAD_ARGS=( --kv-transfer-config - "{\"kv_connector\":\"LMCacheMPConnector\",\"kv_connector_module_path\":\"lmcache.integration.vllm.lmcache_mp_connector\",\"kv_role\":\"kv_both\",\"kv_connector_extra_config\":{\"lmcache.mp.port\":$LMCACHE_PORT,\"lmcache.mp.mq_timeout\":6000.0}}" + "{\"kv_connector\":\"LMCacheMPConnector\",\"kv_connector_module_path\":\"lmcache.integration.vllm.lmcache_mp_connector\",\"kv_role\":\"kv_both\",\"kv_connector_extra_config\":{\"lmcache.mp.port\":$LMCACHE_PORT,\"lmcache.mp.mq_timeout\":6000.0,\"lmcache.mp.heartbeat_interval\":$LMCACHE_HEARTBEAT_INTERVAL}}" ) ;; *) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index dad68b8648..f87a57a934 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -6830,4 +6830,5 @@ - "Refresh the Kimi-K3 MI355X AgentX recipe from the merged PR #2787 baseline to vLLM ROCm nightly 7c5dc571 and LMCache 0.5.5rc3+rocm7.2." - "Run C1, C8, and C14 with TP8 DSpark and LMCache DRAM KV offload; run C40, C44, and C48 with TP8/DCP8 and no speculative decoding." - "Use a 12288-token LMCache chunk and a 1536-token DCP KV-cache interleave; set C40/C44/C48 gpu-memory-utilization to 0.88 while retaining the 16K batched-token, max-num-seqs 80, and full CUDA-graph profile." + - "Allow 90 seconds for LMCache MP heartbeats and 300 seconds before reaping workers so transient C14 transfer stalls do not trigger invalid-block recovery." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2804 From a720a04fc480a4d8fd2640870c366c2971a41d4e Mon Sep 17 00:00:00 2001 From: hyukjlee Date: Wed, 2 Sep 2026 21:39:46 +0900 Subject: [PATCH 6/6] perf(agentx): set K3 sweep GMU to 0.88 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 C1、C8 和 C14 的 gpu-memory-utilization 从 0.90 降至 0.88,使全部六个测试点使用相同的 GMU。移除上一轮未证实的 heartbeat workaround,以便单独验证显存利用率变化。 Assisted-by: OpenAI Codex --- benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh | 9 +++------ perf-changelog.yaml | 3 +-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh index abbfc79558..81b3b29915 100644 --- a/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh +++ b/benchmarks/single_node/agentic/kimik3_fp4_mi355x_mtp.sh @@ -186,8 +186,6 @@ case "${KV_OFFLOAD_BACKEND:-}" in LMCACHE_PORT=6555 LMCACHE_HTTP_PORT=8090 LMCACHE_LOG="$RESULT_DIR/lmcache_server.log" - LMCACHE_HEARTBEAT_INTERVAL=90.0 - LMCACHE_WORKER_REAP_TIMEOUT=300 LMCACHE_L1_SIZE_GB="$TOTAL_CPU_DRAM_GB" @@ -207,7 +205,6 @@ case "${KV_OFFLOAD_BACKEND:-}" in --max-gpu-workers 1 --eviction-policy LRU --supported-transfer-mode lmcache_driven - --worker-reap-timeout-seconds "$LMCACHE_WORKER_REAP_TIMEOUT" --shm-name "" ) append_command "$RESULT_DIR/lmcache_command.txt" "${LMCACHE_CMD[@]}" @@ -224,7 +221,7 @@ case "${KV_OFFLOAD_BACKEND:-}" in # same MQ timeout headroom as the MiniMax-M3 arm. OFFLOAD_ARGS=( --kv-transfer-config - "{\"kv_connector\":\"LMCacheMPConnector\",\"kv_connector_module_path\":\"lmcache.integration.vllm.lmcache_mp_connector\",\"kv_role\":\"kv_both\",\"kv_connector_extra_config\":{\"lmcache.mp.port\":$LMCACHE_PORT,\"lmcache.mp.mq_timeout\":6000.0,\"lmcache.mp.heartbeat_interval\":$LMCACHE_HEARTBEAT_INTERVAL}}" + "{\"kv_connector\":\"LMCacheMPConnector\",\"kv_connector_module_path\":\"lmcache.integration.vllm.lmcache_mp_connector\",\"kv_role\":\"kv_both\",\"kv_connector_extra_config\":{\"lmcache.mp.port\":$LMCACHE_PORT,\"lmcache.mp.mq_timeout\":6000.0}}" ) ;; *) @@ -247,13 +244,13 @@ case "${SPEC_DECODING:-mtp}:$CONC" in mtp:1) SYNTHETIC_ACCEPT_LEN=3.75 SPEC_NUM_TOKENS=6 - GPU_MEM_UTIL=0.9 + GPU_MEM_UTIL=0.88 MAX_NUM_BATCHED_TOKENS=16384 ;; mtp:2|mtp:4|mtp:8|mtp:10|mtp:12|mtp:14) SYNTHETIC_ACCEPT_LEN=3.00 SPEC_NUM_TOKENS=3 - GPU_MEM_UTIL=0.9 + GPU_MEM_UTIL=0.88 MAX_NUM_BATCHED_TOKENS=8192 ;; none:40|none:44|none:48) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index f87a57a934..a369acd371 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -6829,6 +6829,5 @@ description: - "Refresh the Kimi-K3 MI355X AgentX recipe from the merged PR #2787 baseline to vLLM ROCm nightly 7c5dc571 and LMCache 0.5.5rc3+rocm7.2." - "Run C1, C8, and C14 with TP8 DSpark and LMCache DRAM KV offload; run C40, C44, and C48 with TP8/DCP8 and no speculative decoding." - - "Use a 12288-token LMCache chunk and a 1536-token DCP KV-cache interleave; set C40/C44/C48 gpu-memory-utilization to 0.88 while retaining the 16K batched-token, max-num-seqs 80, and full CUDA-graph profile." - - "Allow 90 seconds for LMCache MP heartbeats and 300 seconds before reaping workers so transient C14 transfer stalls do not trigger invalid-block recovery." + - "Use gpu-memory-utilization 0.88 for all six points, a 12288-token LMCache chunk, and a 1536-token DCP KV-cache interleave; C40/C44/C48 retain the 16K batched-token, max-num-seqs 80, and full CUDA-graph profile." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2804