Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
name: qwen35-gb200-sglang-agentic-mtp-agg-tp2ep2-hicache

model: { path: qwen3.5-fp4, container: lmsysorg/sglang:nightly-dev-20260818-c0b6474b, precision: fp4 }
identity:
model: { repo: nvidia/Qwen3.5-397B-A17B-NVFP4-V2 }
container: { image: lmsysorg/sglang:nightly-dev-20260818-c0b6474b }
slurm: { time_limit: "8:00:00" }
health_check: { max_attempts: 2160, interval_seconds: 10 }
resources: { gpu_type: gb200, gpus_per_node: 4, agg_nodes: 1, agg_workers: 1, gpus_per_agg: 2 }
infra: { nats_max_payload_mb: 8 }
frontend:
type: sglang
args:
worker-startup-timeout-secs: 3600

backend:
type: sglang
aggregated_environment:
PYTHONNOUSERSITE: "1"
NCCL_CUMEM_ENABLE: "1"
NCCL_MNNVL_ENABLE: "1"
NCCL_NVLS_ENABLE: "1"
SGLANG_ENABLE_FLASHINFER_GEMM: "true"
SGLANG_ENABLE_SPEC_V2: "1"
SGL_ENABLE_JIT_DEEPGEMM: "false"
TORCH_CUDA_ARCH_LIST: "10.0"
sglang_config:
aggregated:
served-model-name: nvidia/Qwen3.5-397B-A17B-NVFP4-V2
model-path: /model/
trust-remote-code: true
tensor-parallel-size: 2
pipeline-parallel-size: 1
data-parallel-size: 1
expert-parallel-size: 2
enable-dp-attention: false
enable-dp-lm-head: false
enable-symm-mem: false
quantization: modelopt_fp4
fp4-gemm-backend: flashinfer_cutlass
kv-cache-dtype: fp8_e4m3
mamba-ssm-dtype: bfloat16
mamba-radix-cache-strategy: extra_buffer_lazy
mamba-track-interval: 1048576
attention-backend: trtllm_mha
linear-attn-prefill-backend: flashinfer
linear-attn-decode-backend: flashinfer
moe-runner-backend: flashinfer_trtllm
speculative-moe-runner-backend: flashinfer_trtllm
speculative-algorithm: NEXTN
speculative-num-steps: 3
speculative-eagle-topk: 1
speculative-num-draft-tokens: 4
enable-linear-replayssm-spec: true
linear-replayssm-cache-len: 8
cuda-graph-max-bs: 64
max-running-requests: 80
max-prefill-tokens: 16384
chunked-prefill-size: 16384
mem-fraction-static: 0.88
# extra_buffer_lazy uses four physical Mamba state slots per running request.
# C40 remains healthy while C48 reaches the device-KV capacity cliff.
max-mamba-cache-size: 320
allow-auto-truncate: true
stream-interval: 50
scheduler-recv-interval: 10
tokenizer-worker-num: 6
page-size: 64
enable-hierarchical-cache: true
hicache-ratio: 2.5
hicache-io-backend: direct
hicache-mem-layout: page_first_direct
hicache-write-policy: write_through_selective
mamba-max-states-per-path: 1
weight-loader-prefetch-checkpoints: true
weight-loader-prefetch-num-threads: 4
weight-loader-drop-cache-after-load: true
watchdog-timeout: 1000000
enable-metrics: true
enable-cache-report: true

sbatch_directives: { mem: "0", cpus-per-task: "144" }
srun_options: { mem: "0", container-remap-root: "" }
benchmark:
type: custom
command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh
env:
INFMAX_CONTAINER_WORKSPACE: /infmax-workspace
RESULT_DIR: /logs/agentic
PORT: "8000"
IS_MULTINODE: "false"
TP: "2"
AIPERF_HTTP_X_DYNAMO_SESSION_ID_FROM_CORRELATION_ID: "true"
AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0"
WEKA_LOADER_OVERRIDE: semianalysis_cc_traces_weka_062126_256k
AIPERF_DATASET_MMAP_CACHE_DIR: /aiperf_mmap_cache
HF_HUB_CACHE: /hf_hub_cache
AIPERF_REQUIRED_SERVER_METRIC_PREFIX: "sglang:"
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: qwen35-gb200-sglang-agentic-mtp-agg-tp2ep2

model: { path: qwen3.5-fp4, container: dynamo-sglang, precision: fp4 }
model: { path: qwen3.5-fp4, container: lmsysorg/sglang:nightly-dev-20260818-c0b6474b, precision: fp4 }
identity:
model: { repo: nvidia/Qwen3.5-397B-A17B-NVFP4-V2 }
container: { image: lmsysorg/sglang:v0.5.17-cu130 }
container: { image: lmsysorg/sglang:nightly-dev-20260818-c0b6474b }
slurm: { time_limit: "8:00:00" }
health_check: { max_attempts: 2160, interval_seconds: 10 }
resources: { gpu_type: gb200, gpus_per_node: 4, agg_nodes: 1, agg_workers: 1, gpus_per_agg: 2 }
Expand Down Expand Up @@ -32,30 +32,39 @@ backend:
tensor-parallel-size: 2
data-parallel-size: 1
expert-parallel-size: 2
enable-symm-mem: true
enable-dp-attention: false
enable-dp-lm-head: false
enable-symm-mem: false
quantization: modelopt_fp4
fp4-gemm-backend: flashinfer_cutlass
kv-cache-dtype: fp8_e4m3
mamba-ssm-dtype: bfloat16
mamba-scheduler-strategy: extra_buffer
mamba-track-interval: 8192
mamba-radix-cache-strategy: extra_buffer_lazy
mamba-track-interval: 1048576
attention-backend: trtllm_mha
linear-attn-prefill-backend: flashinfer
linear-attn-decode-backend: flashinfer
moe-runner-backend: flashinfer_trtllm
speculative-moe-runner-backend: flashinfer_trtllm
speculative-algorithm: NEXTN
speculative-num-steps: 3
speculative-eagle-topk: 1
speculative-num-draft-tokens: 4
enable-linear-replayssm-spec: true
linear-replayssm-cache-len: 8
cuda-graph-max-bs: 64
max-running-requests: 40
max-running-requests: 80
max-prefill-tokens: 16384
chunked-prefill-size: 16384
mem-fraction-static: 0.85
max-mamba-cache-size: 200
max-mamba-cache-size: 320
allow-auto-truncate: true
stream-interval: 50
scheduler-recv-interval: 10
mamba-max-states-per-path: 1
weight-loader-prefetch-checkpoints: true
weight-loader-prefetch-num-threads: 4
weight-loader-drop-cache-after-load: true
enable-metrics: true
enable-cache-report: true

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ name: qwen35-gb200-sglang-agentic-mtp-agg-tp4

model:
path: qwen3.5-fp4
container: dynamo-sglang
container: lmsysorg/sglang:nightly-dev-20260818-c0b6474b
precision: fp4

identity:
model: { repo: nvidia/Qwen3.5-397B-A17B-NVFP4-V2 }
container: { image: lmsysorg/sglang:v0.5.17-cu130 }
container: { image: lmsysorg/sglang:nightly-dev-20260818-c0b6474b }

slurm: { time_limit: "8:00:00" }
health_check: { max_attempts: 2160, interval_seconds: 10 }
Expand Down Expand Up @@ -59,7 +59,7 @@ backend:
speculative-eagle-topk: 1
speculative-num-draft-tokens: 4
cuda-graph-max-bs: 64
max-running-requests: 160
max-running-requests: 80
max-prefill-tokens: 16384
chunked-prefill-size: 16384
mem-fraction-static: 0.80
Expand All @@ -69,6 +69,9 @@ backend:
scheduler-recv-interval: 10
tokenizer-worker-num: 6
mamba-max-states-per-path: 1
weight-loader-prefetch-checkpoints: true
weight-loader-prefetch-num-threads: 4
weight-loader-drop-cache-after-load: true
enable-metrics: true
enable-cache-report: true

Expand Down
34 changes: 17 additions & 17 deletions configs/nvidia-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7222,26 +7222,26 @@
- { tp: 2, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [16, 18, 20, 22, 24, 28, 32] }

qwen3.5-fp4-gb200-dynamo-sglang-agentic-mtp:
image: lmsysorg/sglang:v0.5.17-cu130
image: lmsysorg/sglang:nightly-dev-20260818-c0b6474b
model: nvidia/Qwen3.5-397B-A17B-NVFP4-V2
model-prefix: qwen3.5
runner: cluster:gb200-nv
precision: fp4
framework: dynamo-sglang
multinode: true
disagg: false
scenarios:
agentic-coding:
- dram-utilization: 0.70
- dram-utilization: 0.90
search-space:
# Measured Pareto points from the complete fast sweep. TP4 covers the
# low-latency branch; HiCache extends the high-throughput branch.
# TP4 covers the low-latency branch. TP4 HiCache is omitted because the
# half-GPU TP2/EP2 branch already dominates that operating range.
- spec-decoding: mtp
kv-offloading: none
conc-list: [1, 4, 8, 12, 16, 20, 32, 40]
conc-list: [1, 2, 4, 8, 12, 20, 24]
prefill:
num-worker: 1
tp: 4

Check warning on line 7244 in configs/nvidia-master.yaml

View check run for this annotation

Claude / Claude Code Review

[quality] Orphaned agg-gb200-tp4-mtp-hicache.yaml left after removing its master-config reference

This PR removes the last reference to `agg-gb200-tp4-mtp-hicache.yaml` from `configs/nvidia-master.yaml` (the TP4 HiCache search-space branch is replaced by the new TP2/EP2 resident + HiCache branches), leaving that recipe file orphaned and unable to pick up the new nightly image/flags its siblings received. Since unreferenced recipe files are common in this directory already, this is a minor nit — consider deleting it (or noting it as intentionally parked) as part of this cleanup.
Comment on lines 7370 to 7382

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 This PR removes the last reference to agg-gb200-tp4-mtp-hicache.yaml from configs/nvidia-master.yaml (the TP4 HiCache search-space branch is replaced by the new TP2/EP2 resident + HiCache branches), leaving that recipe file orphaned and unable to pick up the new nightly image/flags its siblings received. Since unreferenced recipe files are common in this directory already, this is a minor nit — consider deleting it (or noting it as intentionally parked) as part of this cleanup.

Extended reasoning...

What changed: configs/nvidia-master.yaml previously wired one of the agentic-coding search-space branches under qwen3.5-fp4-gb200-dynamo-sglang-agentic-mtp to CONFIG_FILE=recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp4-mtp-hicache.yaml. This PR removes that branch entirely and replaces it with two new branches — a TP2/EP2 resident arm and a TP2/EP2 HiCache arm — pointing at agg-gb200-tp2ep2-mtp.yaml and the newly-added agg-gb200-tp2ep2-mtp-hicache.yaml.

The orphan: benchmarks/multi_node/srt-slurm-recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp4-mtp-hicache.yaml (added in PR #2568) is not touched by this PR's diff at all. A repo-wide grep for agg-gb200-tp4-mtp-hicache after this diff applies returns zero matches anywhere in configs/ or the recipe tree — the file simply stops being reachable from the master config. It still carries the old lmsysorg/sglang:v0.5.17-cu130 image and the pre-refresh flag set (no extra_buffer_lazy, no ReplaySSM, no checkpoint page-cache release) that its siblings (agg-gb200-tp4-mtp.yaml, agg-gb200-tp2ep2-mtp.yaml) just received in this same PR.

Why this isn't caught elsewhere: there's no CI check that cross-references recipe files against master-config CONFIG_FILE= references, so nothing flags an orphaned recipe automatically — it just sits in-tree, increasingly stale relative to its siblings, until someone notices.

Counter-consideration (from a reviewer who refuted this as a blocking issue): a repo-wide check shows roughly 191 of 423 recipe YAMLs under srt-slurm-recipes/ are already unreferenced by any master-config CONFIG_FILE=, so parking an inactive recipe in-tree is the established norm for this directory (it functions as a reusable recipe library, not a strict 1:1 mirror of the active sweep). That's a fair point, and it's why this is filed as a nit rather than a blocker — leaving the file is consistent with existing practice, and a future TP4-HiCache revival could reuse it as a starting point. The residual concern is narrower: this file was actively wired moments before this PR and became orphaned by this PR's own change (not pre-existing drift), and it now silently diverges from the nightly image/flag refresh its direct siblings received in the same diff, which could mislead a future reader into assuming the TP4-HiCache path is still validated against current settings.

Proof of orphaning:

  1. Before: configs/nvidia-master.yaml line ~7266 (pre-diff) contains CONFIG_FILE=recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp4-mtp-hicache.yaml under the kv-offloading: dram / kv-offload-backend: hicache branch with tp: 4.
  2. After: that entire branch is deleted; the diff hunk at configs/nvidia-master.yaml:7232-7244 shows it replaced by a tp: 2, ep: 2, kv-offloading: none branch and a tp: 2, ep: 2, kv-offloading: dram/hicache branch, both pointing at agg-gb200-tp2ep2-mtp*.yaml.
  3. grep -r "agg-gb200-tp4-mtp-hicache" . post-diff → no hits outside the file's own path.
  4. The file on disk still declares container: { image: lmsysorg/sglang:v0.5.17-cu130 } while its siblings now read lmsysorg/sglang:nightly-dev-20260818-c0b6474b — confirming the drift.

Suggested fix: delete benchmarks/multi_node/srt-slurm-recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp4-mtp-hicache.yaml as part of this cleanup, or leave a one-line note if it's intentionally kept for a future TP4-HiCache revival.

ep: 1
dp-attn: false
additional-settings:
Expand All @@ -7249,25 +7249,25 @@
- "SYNTHETIC_ACCEPTANCE_LENGTH=3.39"
- "CONFIG_FILE=recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp4-mtp.yaml"
decode: { num-worker: 0, tp: 4, ep: 1, dp-attn: false }
# TP2/EP2 probes the middle and high-throughput frontier with half the
# GPU count of TP4; the HiCache arm extends beyond the old C24 ceiling.
- spec-decoding: mtp
kv-offloading: dram
kv-offload-backend: { name: hicache }
conc-list: [48, 56, 64, 72]
kv-offloading: none
conc-list: [4, 8, 12, 20]
prefill:
num-worker: 1
tp: 4
ep: 1
tp: 2
ep: 2
dp-attn: false
additional-settings:
- "SYNTHETIC_ACCEPTANCE=true"
- "SYNTHETIC_ACCEPTANCE_LENGTH=3.39"
- "CONFIG_FILE=recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp4-mtp-hicache.yaml"
decode: { num-worker: 0, tp: 4, ep: 1, dp-attn: false }
# TP2/EP2 supplies the middle of the measured frontier with half the
# GPU count of TP4.
- "CONFIG_FILE=recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp2ep2-mtp.yaml"
decode: { num-worker: 0, tp: 2, ep: 2, dp-attn: false }
- spec-decoding: mtp
kv-offloading: none
conc-list: [4, 8, 16, 20, 24]
kv-offloading: dram
kv-offload-backend: { name: hicache }
conc-list: [22, 24, 28, 32, 40]
prefill:
num-worker: 1
tp: 2
Expand All @@ -7276,7 +7276,7 @@
additional-settings:
- "SYNTHETIC_ACCEPTANCE=true"
- "SYNTHETIC_ACCEPTANCE_LENGTH=3.39"
- "CONFIG_FILE=recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp2ep2-mtp.yaml"
- "CONFIG_FILE=recipes/sglang/qwen3.5/gb200-fp4/agentic/agg-gb200-tp2ep2-mtp-hicache.yaml"
decode: { num-worker: 0, tp: 2, ep: 2, dp-attn: false }

minimaxm3-fp4-b300-vllm-agentic-mtp:
Expand Down
10 changes: 10 additions & 0 deletions perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6086,3 +6086,13 @@
- "Use TP8/EP1 concurrency 2 through 24, published FlashInfer 0.6.17 CUDA 13 wheels, and golden MTP acceptance length 3.39."
- "Use the lmsysorg/sglang:nightly-dev-cu13-20260815-a5ba081f image."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2592

- config-keys:
- qwen3.5-fp4-gb200-dynamo-sglang-agentic-mtp
scenario-type:
- agentic-coding
description:
- "Refresh GB200 Qwen3.5 NVFP4-V2 AgentX on lmsysorg/sglang:nightly-dev-20260818-c0b6474b without engine patches."
- "Add a TP2/EP2 HiCache branch and update the resident recipes with extra_buffer_lazy, ReplaySSM speculative verification, and checkpoint page-cache release."
- "Select TP4 C1/C2/C4/C8/C12/C20/C24, TP2/EP2 resident C4/C8/C12/C20, and TP2/EP2 HiCache C22/C24/C28/C32/C40 with golden synthetic acceptance length 3.39."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX

Check warning on line 6098 in perf-changelog.yaml

View check run for this annotation

Claude / Claude Code Review

perf-changelog.yaml pr-link placeholder uses 'pull/XXX' instead of the real PR number

The new changelog entry's `pr-link` uses the placeholder `pull/XXX` instead of the real PR number, even though this PR already exists as #2660. Per `docs/configuration-procedures.md:250-254`, the only sanctioned pre-PR placeholder is `pr-link: TBD`, to be replaced with the real URL immediately after PR creation; please change this to `pull/2660` so the entry is traceable back to its PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 The new changelog entry's pr-link uses the placeholder pull/XXX instead of the real PR number, even though this PR already exists as #2660. Per docs/configuration-procedures.md:250-254, the only sanctioned pre-PR placeholder is pr-link: TBD, to be replaced with the real URL immediately after PR creation; please change this to pull/2660 so the entry is traceable back to its PR.

Extended reasoning...

Bug: The changelog entry appended at the end of perf-changelog.yaml (lines 6089-6098) sets:

pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX

This is PR #2660 (per the PR metadata), so the link should read pull/2660. Every other entry among the 100+ historical entries in this file uses a concrete pull/<number> link.

Documented convention: docs/configuration-procedures.md:250-254 explicitly documents the workflow for this field: the only sanctioned placeholder to use before the PR exists is the literal string pr-link: TBD, and the author is instructed to replace it with the real URL immediately after creating the PR. XXX is neither the real number nor the sanctioned TBD placeholder — it's an ad hoc stand-in that falls outside the documented convention.

Why it's not caught elsewhere: The changelog-key generation and CI ingest logic only read config-keys and scenario-type from each entry (used to build lookup keys for benchmark results); pr-link is purely a human-facing traceability field and isn't validated or parsed by any downstream tooling. That's why this passes YAML parsing, git diff --check, and CI without complaint — nothing enforces the field's format at build time. One earlier historical entry (line 5598) also uses pull/XXX, so this isn't the first occurrence, but a single unfixed prior instance doesn't make it a sanctioned convention; it's more likely the same slip happening twice.

Impact: Low — this doesn't affect benchmark behavior, CI, or sweep execution. It's a traceability/documentation issue: anyone auditing perf-changelog.yaml later (e.g. to find which PR introduced a given config change) will hit a dead link for this entry instead of being routed to PR #2660.

Proof / walkthrough:

  1. Open perf-changelog.yaml, jump to the last entry (lines 6089-6098, added by this PR).
  2. Read pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX — XXX is not a valid PR number.
  3. Check the actual PR: per this PR's metadata, it is PR Refresh GB200 Qwen3.5 AgentX Pareto / 刷新 GB200 Qwen3.5 AgentX Pareto 配置 #2660.
  4. Check docs/configuration-procedures.md:250-254: the documented process says use pr-link: TBD before the PR exists, then swap in the real URL right after creating it — never a placeholder string like XXX.
  5. Fix: replace the line with pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2660.

Fix: Change line 6098 to pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2660.