Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
11e3b30
agentx: kimik2.7 fp4 mi355x agentic smoke (none + lmcache)
hyukjlee Jul 9, 2026
a568d0d
agentx: keep prefix caching ON in kimik2.7 none cell
hyukjlee Jul 9, 2026
7c2000a
agentx: add conc64 to kimik2.7 agentic search-space (none + lmcache)
hyukjlee Jul 9, 2026
06a2496
agentx: kimik2.7 full-sweep search-space + perf-changelog
hyukjlee Jul 9, 2026
98468f7
agentx: restore perf-changelog with kimik2.7 entry
hyukjlee Jul 9, 2026
617fdc9
agentx: adjust kimik2.7 agentic sweep top conc 48 -> 42
hyukjlee Jul 9, 2026
702cc6e
agentx: reshape kimik2.7 sweep to Pareto frontier + address review
hyukjlee Jul 9, 2026
4083021
agentx: trim redundant comments in kimik2.7 recipe
hyukjlee Jul 9, 2026
3c3bb1f
fix(config): structure LMCache backend metadata
cquil11 Jul 14, 2026
76d6ba9
[AMD][AgentX] Move Kimi-K2.7 agentic sweep to TP8 conc[16,32,48] 900s…
hyukjlee Jul 14, 2026
14b9326
[AMD][AgentX] Add Mooncake KV-offload backend to kimik2.7 agentic sweep
hyukjlee Jul 14, 2026
fb0d673
[AMD][AgentX] kimik2.7 TP8 3600s: none c[4,8], lmcache+mooncake c[16,…
hyukjlee Jul 14, 2026
36f12a0
fix(agentic): install Mooncake master binary
cquil11 Jul 14, 2026
01a7887
[AMD][AgentX] kimik2.7: explicit AITER-MLA=0 + EP1-vs-EP8 900s tune s…
hyukjlee Jul 15, 2026
234c8fd
[AMD][AgentX] kimik2.7: add DEP (DP-attention + EP) path + 900s tune …
hyukjlee Jul 15, 2026
60797bd
[AMD][AgentX] kimik2.7: drop --block-size=1 (incompatible with TRITON…
hyukjlee Jul 15, 2026
577ffeb
[AMD][AgentX] kimik2.7: split Mooncake into its own tune key (fail-fa…
hyukjlee Jul 15, 2026
ff1673c
[AMD][AgentX] kimik2.7: best-config sweep — AITER-MLA + none[4,8]/lmc…
hyukjlee Jul 16, 2026
54b3dc4
[AMD][AgentX] kimik2.7: add EAGLE3 MTP + SWE-bench accuracy path
hyukjlee Jul 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
421 changes: 421 additions & 0 deletions benchmarks/single_node/agentic/kimik2.7_fp4_mi355x.sh

Large diffs are not rendered by default.

444 changes: 444 additions & 0 deletions benchmarks/single_node/agentic/kimik2.7_fp4_mi355x_mtp.sh

Large diffs are not rendered by default.

70 changes: 70 additions & 0 deletions configs/amd-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,76 @@ kimik2.5-fp4-mi355x-vllm-agentic:
- { tp: 4, kv-offloading: none, conc-list: [16, 24, 32, 40] }
- { tp: 4, kv-offloading: dram, kv-offload-backend: { name: vllm-native }, conc-list: [16, 24, 32, 40] }

kimik2.7-fp4-mi355x-vllm-agentic:
image: vllm/vllm-openai-rocm:v0.24.0
model: amd/Kimi-K2.7-Code-MXFP4
model-prefix: kimik2.7
runner: cluster:mi355x-amds
precision: fp4
framework: vllm
multinode: false
scenarios:
agentic-coding:
# TP8, 3600s. Best-config sweep on the agentic trace, one KV tier per regime:
# GPU-only (none) is only viable at low conc [4,8] (peaks ~26.7 tok/s/GPU at
# c8, then collapses at the KV-capacity wall); LMCache DRAM offload carries the
# high-conc side and holds throughput where none thrashes, so it is swept at
# c16 (the crossover where it overtakes none). Mooncake and c32/48 dropped:
# they added no throughput headroom over this best-config envelope.
- dram-utilization: 0.80
duration: 3600
search-space:
- { tp: 8, kv-offloading: none, conc-list: [4, 8] }
- { tp: 8, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "aaf7c0d3" }, conc-list: [16] }

# EAGLE3 speculative-decoding ("MTP") variant of kimik2.7-fp4-mi355x-vllm-agentic.
# spec-decoding: mtp routes to kimik2.7_fp4_mi355x_mtp.sh, which adds the
# K2.7-Code-matched EAGLE3.1 draft (lightseekorg/kimi-k2.7-coder-eagle3.1-mla,
# num_speculative_tokens 3). Mirrors the base best-config envelope (none [4,8] +
# LMCache [16]) so the MTP throughput delta is apples-to-apples; spec decoding
# lifts decode most at low conc, where the draft's acceptance is not
# capacity-starved. Accuracy (SWE-bench agentic) runs via the shared EVAL_ONLY
# path in the recipe.
kimik2.7-fp4-mi355x-vllm-agentic-mtp:
image: vllm/vllm-openai-rocm:v0.24.0
model: amd/Kimi-K2.7-Code-MXFP4
model-prefix: kimik2.7
runner: cluster:mi355x-amds
precision: fp4
framework: vllm
multinode: false
scenarios:
agentic-coding:
- dram-utilization: 0.80
duration: 3600
search-space:
- { tp: 8, kv-offloading: none, conc-list: [4, 8], spec-decoding: mtp }
- { tp: 8, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "aaf7c0d3" }, conc-list: [16], spec-decoding: mtp }

# Smoke-test key for the MTP recipe: TP4 + TP8 x {none c4, LMCache c16}, 900s.
# Same model-prefix (kimik2.7) + spec-decoding: mtp -> routes to
# kimik2.7_fp4_mi355x_mtp.sh. Validates the EAGLE3 draft + flydsl/compile +
# LMCache-alignment changes launch and produce aiperf numbers at both TP
# widths. Temporary; drop once the recipe is verified.
kimik2.7-fp4-mi355x-vllm-agentic-mtp-smoke:
image: vllm/vllm-openai-rocm:v0.24.0
model: amd/Kimi-K2.7-Code-MXFP4
model-prefix: kimik2.7
runner: cluster:mi355x-amds
precision: fp4
framework: vllm
multinode: false
scenarios:
agentic-coding:
- dram-utilization: 0.80
duration: 900
search-space:
- { tp: 4, kv-offloading: none, conc-list: [4], spec-decoding: mtp }
- { tp: 4, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "aaf7c0d3" }, conc-list: [16], spec-decoding: mtp }
- { tp: 8, kv-offloading: none, conc-list: [4], spec-decoding: mtp }
- { tp: 8, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "aaf7c0d3" }, conc-list: [16], spec-decoding: mtp }


kimik2.5-fp4-mi355x-atom:
image: rocm/atom:rocm7.2.4_ubuntu24.04_py3.12_pytorch_release_2.10.0_atom0.1.4_202607091539
model: amd/Kimi-K2.5-MXFP4
Expand Down
28 changes: 28 additions & 0 deletions perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4974,3 +4974,31 @@
- "Run 29651235293 showed the 1M-context corpus working set outgrowing the HBM KV pool past conc 8 (TP8) / conc 64 (DP8): gpu_kv_cache_usage pinned at 1.0 and the radix hit rate collapsed from a ~0.97 theoretical ceiling to 0.04-0.06, so every post-knee turn re-prefilled its full history and throughput fell together with interactivity"
- "HiCache spills evicted prefixes to host DRAM and restores them at C2C bandwidth instead of recomputing; sizing follows the qwen3.5-fp8-b300-sglang-agentic-hicache recipe (GLM-5.2 is plain GQA: one host pool per rank, GB-based --hicache-size)"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2280

- config-keys:
- kimik2.7-fp4-mi355x-vllm-agentic
description:
- "Add Kimi-K2.7-Code-MXFP4 agentic-coding config on MI355X (runner: cluster:mi355x-amds) via vLLM v0.24.0, TP4"
- "Sweep KV-offloading none (conc [1,4,8]) vs dram/LMCache (conc [16,32]); LMCache MP server + LMCacheMPConnector, dram-utilization 0.80"
- "Recipe benchmarks/single_node/agentic/kimik2.7_fp4_mi355x.sh clones LMCache to container-local /opt/lmcache-src (pinned) so CI checkout never trips over root-owned build artifacts"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2126

- config-keys:
- kimik2.7-fp4-mi355x-vllm-agentic
description:
- "Move the agentic-coding sweep from TP4 to TP8 and compare three KV tiers on the agentic trace: GPU-only (none) at conc [4,8], and dram/LMCache + dram/Mooncake at conc [16,32,48] (3600s trace replay)"
- "TP4 was GPU-KV-capacity bound: the ~121 GiB pool held only ~12 resident ~90k-token contexts, so throughput plateaued (~160 tok/s) and requests preempted/thrashed from conc16 up. GPU-only still collapses under load at TP8, so it is swept only at low conc; the dram offload backends carry the high-conc range"
- "Add a Mooncake KV-offload backend to the recipe (embedded MooncakeStoreConnector store). Built from source for ROCm via Mooncake's build_wheel.sh and pip-installed so the mooncake package lands in site-packages and is importable from the vLLM worker subprocesses (a bare make install left workers unable to import it)"
- "Adds optional per-scenario 'duration' override to the agentic-coding config schema (defaults to 3600s when unset)"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2126

- config-keys:
- kimik2.7-fp4-mi355x-vllm-agentic-mtp
- kimik2.7-fp4-mi355x-vllm-agentic
description:
- "Add EAGLE3 speculative-decoding ('MTP') variant kimik2.7-fp4-mi355x-vllm-agentic-mtp: spec-decoding: mtp routes to benchmarks/single_node/agentic/kimik2.7_fp4_mi355x_mtp.sh, which serves the K2.7-Code-matched draft lightseekorg/kimi-k2.7-coder-eagle3.1-mla (EAGLE3.1 MLA, num_speculative_tokens 3, env-overridable via DRAFT_MODEL/NUM_SPEC_TOKENS/VLLM_SPEC_CONFIG). Kimi-K2 has no native MTP, so the draft is external; it is pre-staged with hf download before serving so a cold pull cannot blow READY_TIMEOUT at engine init"
- "Mirrors the base best-config envelope (GPU-only none [4,8] + LMCache dram [16], TP8, 3600s) so the MTP throughput delta is apples-to-apples"
- "Add the SWE-bench agentic accuracy path (EVAL_ONLY -> run_eval) to both the base and MTP recipes, plus the Kimi eval parser flags on the vLLM server (--tool-call-parser kimi_k2 --enable-auto-tool-choice --reasoning-parser kimi_k2) so message.tool_calls parse for the agent harness; harmless for the throughput replay path"
- "Align both recipes' server flags with the official recipes.vllm.ai/moonshotai/Kimi-K2.7-Code MI355X recipe: add --moe-backend flydsl (FlyDSL W4A16 MoE kernel for gfx950) and --compilation-config {pass_config:{fuse_allreduce_rms:false}} (required on MI350X/MI355X). Retains the sweep-tuned --block-size=1 + VLLM_ROCM_USE_AITER_MLA=1 (~3x TRITON_MLA on the agentic trace), which the recipe page does not specify"
- "Harden the LMCache MP server config (all flags verified present at the pinned aaf7c0d3 build): split the worker pools --max-gpu-workers 1 / --max-cpu-workers 8 (was --max-workers TP*2, which set both pools equal) to avoid concurrent-GPU-transfer stalls under async-load (the conc64 stall class), and add --chunk-size 1024, --l1-align-bytes 16384, --eviction-trigger-watermark 0.85, --eviction-ratio 0.10, --supported-transfer-mode lmcache_driven. Keeps the dynamic SHM-aware --l1-size-gb sizing rather than a hardcoded value"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2126
4 changes: 2 additions & 2 deletions utils/matrix_logic/generate_sweep_configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -700,7 +700,7 @@ def generate_full_sweep(args, all_config_data, runner_data):

for agentic_config in agentic_configs:
bmk_space = agentic_config[Fields.SEARCH_SPACE.value]
duration = DEFAULT_AGENTIC_DURATION_SECONDS
duration = agentic_config.get(Fields.DURATION.value) or DEFAULT_AGENTIC_DURATION_SECONDS

for bmk in bmk_space:
if is_multinode:
Expand Down Expand Up @@ -1003,7 +1003,7 @@ def generate_test_config_sweep(args, all_config_data, runner_data=None):
# ---- Agentic-coding scenarios ----
agentic_configs = val[Fields.SCENARIOS.value].get(Fields.AGENTIC_CODING.value, []) if (scenario_filter is None or 'agentic-coding' in scenario_filter) else []
for agentic_config in agentic_configs:
duration = DEFAULT_AGENTIC_DURATION_SECONDS
duration = agentic_config.get(Fields.DURATION.value) or DEFAULT_AGENTIC_DURATION_SECONDS
bmk_space = agentic_config[Fields.SEARCH_SPACE.value]

for bmk in bmk_space:
Expand Down
27 changes: 25 additions & 2 deletions utils/matrix_logic/test_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -575,10 +575,33 @@ def test_available_cpu_dram_is_not_a_master_config_field(self):
}],
})

def test_duration_is_not_a_master_config_field(self):
def test_duration_is_an_optional_master_config_field(self):
# Per-scenario duration override (falls back to the default 3600s in the
# sweep generator when unset). Used for shorter agentic smoke sweeps.
cfg = AgenticCodingConfig(**{
"duration": 1800,
"search-space": [{
"tp": 8,
"kv-offloading": "none",
"conc-list": [16],
}],
})
assert cfg.duration == 1800

def test_duration_defaults_to_none_when_unset(self):
cfg = AgenticCodingConfig(**{
"search-space": [{
"tp": 8,
"kv-offloading": "none",
"conc-list": [16],
}],
})
assert cfg.duration is None

def test_duration_must_be_positive(self):
with pytest.raises(Exception, match="duration"):
AgenticCodingConfig(**{
"duration": 1800,
"duration": 0,
"search-space": [{
"tp": 8,
"kv-offloading": "none",
Expand Down
5 changes: 5 additions & 0 deletions utils/matrix_logic/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,11 @@ class AgenticCodingConfig(BaseModel):
dram_utilization: Optional[float] = Field(
default=None, alias=Fields.DRAM_UTILIZATION.value, gt=0, le=1
)
# Per-scenario trace-replay duration override (seconds). Falls back to
# DEFAULT_AGENTIC_DURATION_SECONDS in the sweep generator when unset.
duration: Optional[int] = Field(
default=None, alias=Fields.DURATION.value, gt=0
)

@model_validator(mode='after')
def validate_dram_offload_capacity(self):
Expand Down
Loading