Skip to content

Commit 6ad573f

Browse files
feat(dsv41flash): extend the MI355X ladder to concurrency 192
Adds override_tp4_c128/c192 and override_tp2_c128/c192 and extends both conc-lists to [1, 2, 4, 8, 16, 32, 64, 128, 192], matching the ceiling of the B300 arm. c128 restores the shapes #3326 probed and the #3571 branch dropped without a recorded reason; c192 is new. Both new concurrencies offload the Engram tables on TP4 as well as TP2, since resident leaves 116K KV tokens per concurrent request at TP4 c128, below the 122K at which TP2 c64 collapsed. Graph capture rises to 2048 at c128 and 2304 at c192, covering the 2x CONC x (1 + 5 drafts) batch. The chunk here buys KV room: 8192 on TP4 (388K per request measured at c128) and 4096 on TP2 with max-num-seqs at 2x CONC (260K measured at c128). c192 is unmeasured; scaling c128 gives roughly 259K at TP4 and 173K at TP2. Concurrency 1 through 64 keeps the upstream 16384 chunk, so this branch remains the no-cap reference for #3735. Extending the ladder moves the automatic GSM8K row from TP4 c64 to TP4 c192, since the generator picks the highest concurrency per group. 将 MI355X 并发阶梯扩展至 192,新增 override_tp4_c128/c192 与 override_tp2_c128/c192,两条 conc-list 均扩为 [1, 2, 4, 8, 16, 32, 64, 128, 192],与 B300 臂的上限一致。c128 恢复了 #3326 探测过、而 #3571 分支未记录原因就移除的配置;c192 为全新点。 两个新并发在 TP4 上也下放 Engram 表:常驻时 TP4 c128 每并发请求只剩 116K 个 KV token,低于 TP2 c64 崩溃时的 122K。图捕获在 c128 升至 2048、c192 升至 2304,以覆盖 2x CONC x (1 + 5 草稿) 的批次。此处的分块 用于换取 KV 余量:TP4 为 8192(c128 实测每请求 388K),TP2 为 4096 并将 max-num-seqs 设为 2x CONC(c128 实测 260K)。c192 尚未测量,按 c128 外推 TP4 约 259K、TP2 约 173K。并发 1 至 64 保持上游的 16384 分块, 因此本分支仍是 #3735 的无 cap 对照。 扩展阶梯同时把自动 GSM8K 行从 TP4 c64 移到 TP4 c192,因为生成器按组 选取最高并发。 Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 45ee49b commit 6ad573f

5 files changed

Lines changed: 86 additions & 16 deletions

File tree

‎inferencex-e2e/benchmarks/single_node/srt-slurm-recipes/dsv41flash/vllm/mi355x-fp4-mtp/agentic.yaml‎

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,16 @@ base:
9191
WEKA_LOADER_OVERRIDE: semianalysis_cc_traces_weka_062126
9292
AIPERF_REQUIRED_SERVER_METRIC_PREFIX: 'vllm:'
9393

94-
# One variant per point (c128 excluded for both TP2 and TP4). Engram tables
95-
# move to pinned host memory at TP2, where resident tables leave too little
96-
# KV. Graph capture covers 2x CONC x (1 + 5 drafts). The prefill chunk shrinks
97-
# at TP2 from c64 to buy KV room, and where it drops below 1024 x 6 slots the
98-
# scheduler is capped at the captured shape.
94+
# One variant per point, concurrency 1 through 192 on both TP arms. Engram
95+
# tables move to pinned host memory at TP2 always and at TP4 from c128, where
96+
# resident tables leave too little KV. Graph capture covers 2x CONC x (1 + 5
97+
# drafts), which is what the benchmark admits.
98+
#
99+
# The prefill chunk stays at the upstream 16384 through c64 and is sized for
100+
# KV room at c128 and c192 only, staying at 8192 on TP4 and dropping to 4096
101+
# on TP2. Only those TP2 points fall below 1024 x 6 token slots, so only they
102+
# set max-num-seqs explicitly. SemiAnalysisAI/InferenceX#3735 is this recipe
103+
# with one further change, an 8192 cap at c32 and c64 for decode tail latency.
99104
override_tp4_c1:
100105
roles:
101106
agg:
@@ -187,6 +192,35 @@ override_tp4_c64:
187192
env:
188193
CONC: '64'
189194

195+
# c128 and c192 offload the Engram tables even at TP=4: resident leaves
196+
# 116K KV tokens per concurrent request at c128, below the 122K at which
197+
# TP=2 c64 collapsed. Offloaded, c128 measured 388K.
198+
override_tp4_c128:
199+
roles:
200+
agg:
201+
gpus: 4
202+
args:
203+
tensor-parallel-size: 4
204+
engram-config: '{"cpu_offload":true}'
205+
max-cudagraph-capture-size: 2048
206+
max-num-batched-tokens: 8192
207+
benchmark:
208+
env:
209+
CONC: '128'
210+
211+
override_tp4_c192:
212+
roles:
213+
agg:
214+
gpus: 4
215+
args:
216+
tensor-parallel-size: 4
217+
engram-config: '{"cpu_offload":true}'
218+
max-cudagraph-capture-size: 2304
219+
max-num-batched-tokens: 8192
220+
benchmark:
221+
env:
222+
CONC: '192'
223+
190224
override_tp2_c1:
191225
roles:
192226
agg:
@@ -277,3 +311,35 @@ override_tp2_c64:
277311
benchmark:
278312
env:
279313
CONC: '64'
314+
315+
# TP=2 buys KV room at c128 and c192 with a 4096 chunk, which measured 260K KV
316+
# tokens per concurrent request at c128 against 23.6K at the upstream 16384.
317+
# 4096 is below 1024 x 6 slots, so max-num-seqs drops to the 2x CONC the
318+
# benchmark actually admits.
319+
override_tp2_c128:
320+
roles:
321+
agg:
322+
gpus: 2
323+
args:
324+
tensor-parallel-size: 2
325+
engram-config: '{"cpu_offload":true}'
326+
max-cudagraph-capture-size: 2048
327+
max-num-batched-tokens: 4096
328+
max-num-seqs: 256
329+
benchmark:
330+
env:
331+
CONC: '128'
332+
333+
override_tp2_c192:
334+
roles:
335+
agg:
336+
gpus: 2
337+
args:
338+
tensor-parallel-size: 2
339+
engram-config: '{"cpu_offload":true}'
340+
max-cudagraph-capture-size: 2304
341+
max-num-batched-tokens: 4096
342+
max-num-seqs: 384
343+
benchmark:
344+
env:
345+
CONC: '192'

‎inferencex-e2e/configs/amd-master.yaml‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,13 +1508,13 @@ dsv41flash-fp4-mi355x-vllm-agentic-dspark:
15081508
agentic-coding:
15091509
- dram-utilization: 0.60
15101510
search-space:
1511-
# The recipe only changes the memory split where a point ran short of KV:
1512-
# the prefill chunk shrinks at TP=2 c64. c128 is excluded for both TP=2
1513-
# and TP=4. Every point is measured here rather than combined from the
1514-
# earlier run: the image move leaves concurrency 1-32 measured only on
1515-
# the superseded nightly-eed1f3d0 pin.
1516-
- { tp: 4, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 8, 16, 32, 64], srt-recipe: benchmarks/single_node/srt-slurm-recipes/dsv41flash/vllm/mi355x-fp4-mtp/agentic.yaml }
1517-
- { tp: 2, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 8, 16, 32, 64], srt-recipe: benchmarks/single_node/srt-slurm-recipes/dsv41flash/vllm/mi355x-fp4-mtp/agentic.yaml }
1511+
# The prefill chunk stays at the upstream 16384 through c64; c128 and
1512+
# c192 size it for KV room and offload the Engram tables on TP=4 as well.
1513+
# Every point is measured here rather than combined from the earlier run:
1514+
# the image move leaves concurrency 1-32 measured only on the superseded
1515+
# nightly-eed1f3d0 pin, and c128 and c192 are new.
1516+
- { tp: 4, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 8, 16, 32, 64, 128, 192], srt-recipe: benchmarks/single_node/srt-slurm-recipes/dsv41flash/vllm/mi355x-fp4-mtp/agentic.yaml }
1517+
- { tp: 2, kv-offloading: none, spec-decoding: mtp, conc-list: [1, 2, 4, 8, 16, 32, 64, 128, 192], srt-recipe: benchmarks/single_node/srt-slurm-recipes/dsv41flash/vllm/mi355x-fp4-mtp/agentic.yaml }
15181518

15191519
# The golden acceptance curve remains the provisional GLM-5.2-derived curve
15201520
# documented in infx/golden_al_distribution/glm5.3_mtp.yaml.

‎inferencex-e2e/docs/configuration-procedures.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -695,9 +695,9 @@ A configuration is ready for sweep only when the executable files agree, the exa
695695

696696
## DeepSeek-V4.1-Flash on MI355X
697697

698-
The `dsv41flash-fp4-mi355x-vllm-agentic-dspark` recipe extends [#2958](https://github.com/SemiAnalysisAI/InferenceX/pull/2958) to MI355X AgentX: TP4 and TP2, concurrency 1–64, native five-token DSpark. Throughput uses the [committed golden AL](../infx/golden_al_distribution/dsv41flash_dspark.yaml) of 3.51 for thinking on and five draft tokens, with synthetic rejection sampling and adaptive verification disabled. Accuracy evals retain real block rejection but, unlike the CUDA arms, also keep adaptive verification disabled: it trims verification requests on device, which the ROCm `DeepseekV4IndexerBackend` does not support, and the engine refused to start with it enabled ([run 34651830283](https://github.com/SemiAnalysisAI/InferenceX/actions/runs/34651830283)). FP4 describes the MXFP4 experts; the checkpoint also contains MXFP8 weights.
698+
The `dsv41flash-fp4-mi355x-vllm-agentic-dspark` recipe extends [#2958](https://github.com/SemiAnalysisAI/InferenceX/pull/2958) to MI355X AgentX: TP4 and TP2, concurrency 1–192, native five-token DSpark. Throughput uses the [committed golden AL](../infx/golden_al_distribution/dsv41flash_dspark.yaml) of 3.51 for thinking on and five draft tokens, with synthetic rejection sampling and adaptive verification disabled. Accuracy evals retain real block rejection but, unlike the CUDA arms, also keep adaptive verification disabled: it trims verification requests on device, which the ROCm `DeepseekV4IndexerBackend` does not support, and the engine refused to start with it enabled ([run 34651830283](https://github.com/SemiAnalysisAI/InferenceX/actions/runs/34651830283)). FP4 describes the MXFP4 experts; the checkpoint also contains MXFP8 weights.
699699

700-
Follow the AMD overrides in the merged [upstream recipe #968](https://github.com/vllm-project/recipes/pull/968): `VLLM_ROCM_USE_AITER=1`, `VLLM_ROCM_USE_AITER_MOE=1`, and `--moe-backend aiter`. The generic AITER selector uses CK experts; `VLLM_ROCM_USE_AITER_MOE_A4W4_DSV4=1` opts into the DeepSeek-V4.1 a4w4 path from [vllm-project/vllm#58819](https://github.com/vllm-project/vllm/pull/58819). This is a process-wide opt-in for MXFP4 MoE experts, including DSpark layers that use the same implementation. `VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4` additionally routes the tensor-parallel all-reduce through the INT4 quick-reduce codec, as in [upstream recipe #1061](https://github.com/vllm-project/recipes/pull/1061) and the merged MI355X DSV4-Pro and Kimi-K3 vLLM recipes. The recipe pins `semianalysis_cc_traces_weka_062126` (the unfiltered corpus) via `WEKA_LOADER_OVERRIDE`. KV stays GPU-resident. Engram stayed on GPU under the upstream AMD defaults until [vllm-project/vllm#57491](https://github.com/vllm-project/vllm/pull/57491) widened the two `is_cuda()` gates to `is_cuda_alike()`. From that commit on, ROCm resolves an `EngramConfig` and `cpu_offload` defaults to on through `VLLM_PLE_CPU_OFFLOAD`, so the recipe sets `--engram-config` explicitly rather than leaning on that default. TP=2 always offloads, since the tables need 94.4 GiB per rank there; TP=4 keeps them resident, since its KV pool is not the constraint through concurrency 64. The recipe likewise trims `--max-num-batched-tokens` only above concurrency 32, to 8192 at TP=2 c64, because the sparse-attention indexer and its companion per-rank buffers grow at roughly 4.4 MiB per batched token. Where that chunk falls below six times the API-server default of 1024 sequences, `--max-num-seqs` is capped at the graph-capture shape: DSpark verifies 1+5 tokens per sequence, and at 4096 against 1024 sequences the engram projection faults during profiling. The rule in every case is to spend device memory on KV only at the concurrencies that ran short of it, leaving the validated low-concurrency settings alone. Images built before that merge still reject the option on ROCm. The MI355X launcher uses the shared HF cache and mounts this model's repository at `/ix`, and exports `INFMAX_CONTAINER_WORKSPACE=/ix` so AgentX dependencies and outputs resolve inside that mount.
700+
Follow the AMD overrides in the merged [upstream recipe #968](https://github.com/vllm-project/recipes/pull/968): `VLLM_ROCM_USE_AITER=1`, `VLLM_ROCM_USE_AITER_MOE=1`, and `--moe-backend aiter`. The generic AITER selector uses CK experts; `VLLM_ROCM_USE_AITER_MOE_A4W4_DSV4=1` opts into the DeepSeek-V4.1 a4w4 path from [vllm-project/vllm#58819](https://github.com/vllm-project/vllm/pull/58819). This is a process-wide opt-in for MXFP4 MoE experts, including DSpark layers that use the same implementation. `VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4` additionally routes the tensor-parallel all-reduce through the INT4 quick-reduce codec, as in [upstream recipe #1061](https://github.com/vllm-project/recipes/pull/1061) and the merged MI355X DSV4-Pro and Kimi-K3 vLLM recipes. The recipe pins `semianalysis_cc_traces_weka_062126` (the unfiltered corpus) via `WEKA_LOADER_OVERRIDE`. KV stays GPU-resident. Engram stayed on GPU under the upstream AMD defaults until [vllm-project/vllm#57491](https://github.com/vllm-project/vllm/pull/57491) widened the two `is_cuda()` gates to `is_cuda_alike()`. From that commit on, ROCm resolves an `EngramConfig` and `cpu_offload` defaults to on through `VLLM_PLE_CPU_OFFLOAD`, so the recipe sets `--engram-config` explicitly rather than leaning on that default. TP=2 always offloads, since the tables need 94.4 GiB per rank there; TP=4 keeps them resident through concurrency 64, since its KV pool is not the constraint there, and offloads at c128 and c192, where resident tables leave 116K KV tokens per concurrent request, below the 122K at which TP=2 c64 collapsed. The recipe likewise trims `--max-num-batched-tokens` only above concurrency 32, because the sparse-attention indexer and its companion per-rank buffers grow at roughly 4.4 MiB per batched token: 8192 at TP=2 c64 and at both c128 and c192 on TP=4, which measured 388K KV tokens per concurrent request at c128, and 4096 at TP=2 c128 and c192, which measured 260K against 23.6K at the upstream 16384. Where that chunk falls below six times the API-server default of 1024 sequences, `--max-num-seqs` is capped at the 2 × CONC the benchmark admits: DSpark verifies 1+5 tokens per sequence, and at 4096 against 1024 sequences the engram projection faults during profiling. Only the two TP=2 points above c64 are in that regime. Graph capture covers the same 2 × CONC × (1 + 5 drafts) batch, rising from 1024 through c64 to 2048 at c128 and 2304 at c192. c192 is unmeasured on this SKU; scaling the c128 totals gives roughly 259K KV tokens per request at TP=4 and 173K at TP=2, the latter only 1.4× above the collapse line. The rule in every case is to spend device memory on KV only at the concurrencies that ran short of it, leaving the validated low-concurrency settings alone. Images built before that merge still reject the option on ROCm. The MI355X launcher uses the shared HF cache and mounts this model's repository at `/ix`, and exports `INFMAX_CONTAINER_WORKSPACE=/ix` so AgentX dependencies and outputs resolve inside that mount.
701701

702702
The current candidate pins `vllm/vllm-openai-rocm:nightly-rocm100-21d93d0d8c0e9627900020382bfce4730e61cab7`, the ROCm 10.0 nightly published 2026-10-06, with a4w4 and INT4 quick reduce enabled. It sits 151 commits past `nightly-rocm100-0cbac6cd1305f710e12193596b27488397bcb205` and adds [vllm#56720](https://github.com/vllm-project/vllm/pull/56720) (one-pass dequantize and a gather-sized grid for the compressed K cache), [vllm#57947](https://github.com/vllm-project/vllm/pull/57947) (fused QSA pre-indexer on the AMD path), [vllm#58560](https://github.com/vllm-project/vllm/pull/58560) (compressor ring kept out of the null block) and [vllm#59794](https://github.com/vllm-project/vllm/pull/59794) (AITER 0.1.24.post1, which supplies the a4w4 and quick-reduce kernels). Its GPU sweep and accuracy evaluation must qualify this image/flag combination; the evidence below describes the preceding a8w4, unquantized-collective baseline.
703703

0 commit comments

Comments
 (0)