Skip to content

feat: add Qwen3.5 RTX PRO 6000 SGLang recipe / 新增 Qwen3.5 RTX PRO 6000 SGLang 基准配置 - #2312

Merged
functionstackx merged 10 commits into
mainfrom
agent/qwen35-rtx6000pro-vllm
Jul 30, 2026
Merged

feat: add Qwen3.5 RTX PRO 6000 SGLang recipe / 新增 Qwen3.5 RTX PRO 6000 SGLang 基准配置#2312
functionstackx merged 10 commits into
mainfrom
agent/qwen35-rtx6000pro-vllm

Conversation

@Oseltamivir

Copy link
Copy Markdown
Collaborator

No description provided.

@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

Comment thread configs/nvidia-master.yaml Outdated
Comment on lines +1346 to +1363
# Qwen3.5-397B-A17B NVFP4 single-node vLLM sweep using 4 of 8 RTX PRO
# 6000 Blackwell GPUs. Both arms use ordinary NCCL collectives on PCIe.
qwen3.5-fp4-rtx6000pro-vllm:
image: vllm/vllm-openai:v0.25.1@sha256:e4f88a835143cd22aee2397a26ec6bb80b3a4a6fe0c882bcbc63822904766089
model: nvidia/Qwen3.5-397B-A17B-NVFP4
model-prefix: qwen3.5
runner: rtx6000pro-lat
precision: fp4
framework: vllm
multinode: false
scenarios:
fixed-seq-len:
- isl: 8192
osl: 1024
search-space:
- { tp: 4, conc-list: [1, 4, 16, 64] }
- { tp: 4, ep: 4, conc-list: [1, 4, 16, 64] }

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 adds the new config-key qwen3.5-fp4-rtx6000pro-vllm to configs/nvidia-master.yaml but doesn't append a matching entry to perf-changelog.yaml. Per AGENTS.md, the changelog is the append-only benchmark trigger log, so without an entry the new recipe won't get picked up/triggered for benchmarking — please add a config-keys: [qwen3.5-fp4-rtx6000pro-vllm] block at the end of perf-changelog.yaml describing the new RTX PRO 6000 recipe, with a link to this PR. / 此 PR 在 configs/nvidia-master.yaml 中新增了配置项 qwen3.5-fp4-rtx6000pro-vllm,但没有在 perf-changelog.yaml 中添加对应条目。根据 AGENTS.md,该变更日志是仅追加的基准测试触发日志,缺少条目会导致新配方无法被触发进行基准测试——请在 perf-changelog.yaml 文件末尾添加一个 config-keys: [qwen3.5-fp4-rtx6000pro-vllm] 区块,描述这个新的 RTX PRO 6000 配方,并附上此 PR 的链接。

Extended reasoning...

What's missing: configs/nvidia-master.yaml gains a brand-new config-key, qwen3.5-fp4-rtx6000pro-vllm (lines 1346-1363 of the diff), defining a 4-GPU RTX PRO 6000 vLLM sweep for Qwen3.5-397B-A17B NVFP4. The PR's four changed files are benchmarks/single_node/fixed_seq_len/qwen3.5_fp4_rtx6000pro.sh, configs/nvidia-master.yaml, configs/runners.yaml, and runners/launch_rtx6000pro-lat.shperf-changelog.yaml is not touched at all, and grep -n rtx6000pro perf-changelog.yaml returns zero matches.

Why this matters: AGENTS.md is explicit on this point in two places. It describes perf-changelog.yaml as the "benchmark trigger log; append-only" (Directory Structure section), and the "Adding a benchmark configuration" workflow spells out the exact sequence: "Add entries to configs/nvidia-master.yaml or amd-master.yaml ..., append to perf-changelog.yaml, then validate with generate_sweep_configs.py full-sweep." This isn't a style nit — the repo's own CI encodes it as a hard requirement: .github/workflows/claude-pr-review.yml has a dedicated check that fires exactly on this condition ("If either master config file was edited AND perf-changelog.yaml was NOT edited in the same PR" → comment that it must be updated), and .github/workflows/run-sweep.yml runs a "Validate perf-changelog matrix" step against `--changelog-file perf-changelog.yaml" as part of the sweep pipeline.

Concrete example / proof: Looking at the tail of perf-changelog.yaml, every recent config-key addition follows the same pattern — e.g. PR #2301 (kimik2.5-fp4-mi355x-vllm-disagg), PR #2249 (kimik2.5-fp4-b200-dynamo-trt), PR #2258/#2259 (the MTP variants) — each has a config-keys: block naming the new/changed key, a description: list, and a pr-link:. Doing the same grep for qwen3.5-fp4-rtx6000pro-vllm (or just rtx6000pro) against perf-changelog.yaml on this branch comes back empty, confirming the new recipe has no changelog entry — unlike every comparable precedent in the file.

Impact if merged as-is: Since the changelog is what triggers/documents which configs get benchmarked, the new qwen3.5-fp4-rtx6000pro-vllm recipe would sit in nvidia-master.yaml without ever being picked up by the changelog-driven trigger path, and the sweep-matrix validation step in CI would have nothing to validate this key against. That defeats the actual purpose of the PR (getting this recipe benchmarked and its results published), even though the recipe script, runner, and hardware wiring are otherwise correctly added.

Fix: Append a new entry to the end of perf-changelog.yaml with config-keys: [qwen3.5-fp4-rtx6000pro-vllm], a short description of the new RTX PRO 6000 recipe, and a pr-link to this PR, matching the format of the most recent entries in the file.

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 changelog is still not touched. configs/nvidia-master.yaml now defines qwen3.5-fp4-rtx6000pro-sglang (the recipe was switched from vLLM to SGLang in a later commit), but perf-changelog.yaml has no entry for qwen3.5-fp4-rtx6000pro-sglang (or the old -vllm key) anywhere in the file — a full grep for rtx6000pro against perf-changelog.yaml returns nothing. Please append a config-keys: [qwen3.5-fp4-rtx6000pro-sglang] entry at the end of perf-changelog.yaml with a description of the RTX PRO 6000 SGLang recipe and a pr-link to this PR, matching the format of the most recent entries.

@github-actions

Copy link
Copy Markdown
Contributor

Replace the vLLM benchmark script with an SGLang one and rename the
config key to qwen3.5-fp4-rtx6000pro-sglang. Pin
lmsysorg/sglang:v0.5.16-cu130, whose auto backend resolution knows that
trtllm-gen MoE is SM100-only and routes modelopt_fp4 routed experts to
FlashInfer CUTLASS on SM120.

96 GiB per GPU forces two deviations from the B300 SGLang recipe:
mem-fraction-static drops to 0.7 with a 2-request prefill chunk (0.8
with a 32k chunk sized the KV pool at 2.2M tokens and OOM'd on the first
8k prefill), and the six tokenizer workers are dropped because each pins
a ~0.7 GiB CUDA context on GPU 0.

The launcher now prefers a framework-tagged benchmark script, matching
the B200/B300 launchers, so vLLM and SGLang recipes for the same model
can coexist.

Validated on the node through the real launcher at all four corners of
the sweep with every request successful: TEP4 conc 64 640/640 at 6198
tok/s, TP4 conc 64 640/640 at 5999 tok/s, TEP4 conc 1 10/10 at 672
tok/s, TP4 conc 1 10/10 at 658 tok/s.

中文:将 Qwen3.5 RTX PRO 6000 基准配置从 vLLM 切换为 SGLang。配置键更名为
qwen3.5-fp4-rtx6000pro-sglang,镜像固定为 lmsysorg/sglang:v0.5.16-cu130
——该版本的自动后端选择已知 trtllm-gen MoE 仅支持 SM100,会在 SM120 上将
modelopt_fp4 路由专家切换到 FlashInfer CUTLASS。受限于每卡 96 GiB 显存,
相比 B300 配方做了两处调整:mem-fraction-static 降到 0.7 并将预填充分块
缩小到两个请求(0.8 配 32k 分块会把 KV 池撑到 220 万 token,首次 8k 预填充
即 OOM),并移除六个 tokenizer worker(每个都会在 GPU 0 上占用约 0.7 GiB
CUDA 上下文)。启动器改为优先选择带框架后缀的基准脚本,与 B200/B300 启动器
一致,使同一模型的 vLLM 与 SGLang 配方可以共存。已在节点上通过真实启动器
验证扫描的四个角落,全部请求成功。
@Oseltamivir Oseltamivir changed the title feat: add Qwen3.5 RTX 6000 Pro vLLM recipe / 新增 Qwen3.5 RTX 6000 Pro vLLM 基准配置 feat: add Qwen3.5 RTX PRO 6000 SGLang recipe / 新增 Qwen3.5 RTX PRO 6000 SGLang 基准配置 Jul 27, 2026
@Oseltamivir
Oseltamivir marked this pull request as draft July 27, 2026 04:57
@Oseltamivir
Oseltamivir marked this pull request as ready for review July 27, 2026 04:57
@claude

claude Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Oseltamivir's task in 5m 59s —— View job


Review complete

  • Gather context (diff vs origin/main, read changed files)
  • Validate config entry in configs/nvidia-master.yaml (image accessibility, model prefix, perf-changelog)
  • Review benchmark script qwen3.5_fp4_rtx6000pro_sglang.sh
  • Review launch script runners/launch_rtx6000pro-lat.sh
  • Review configs/runners.yaml wiring
  • Post review feedback

Summary

1 blocking issue (inline comment on configs/nvidia-master.yaml:1348): perf-changelog.yaml still has no entry for the new config key. This carries over unresolved from the previous review — the key has since been renamed from qwen3.5-fp4-rtx6000pro-vllm to qwen3.5-fp4-rtx6000pro-sglang, but the changelog was never updated. Without an appended entry, the recipe won't be triggered for benchmarking after merge. A ready-to-paste entry is in the inline comment.

Everything else checks out:

  • Config entry: lmsysorg/sglang:v0.5.16-cu130 is a public Docker Hub image; model-prefix: qwen3.5 matches the many existing Qwen3.5 keys; conc-list and the omitted ep (defaults to 1 in generate_sweep_configs.py) are both handled by the generator; runner: rtx6000pro-lat resolves correctly.
  • Benchmark script: correctly uses SGLang's --ep-size "$EP_SIZE", multi-line server launch formatting, and closely mirrors the existing qwen3.5_fp4_b300.sh SGLang recipe with well-documented SM120/PCIe adjustments (FlashInfer CUTLASS backends, --disable-custom-all-reduce, lower --mem-fraction-static with rationale). --cuda-graph-max-bs-decode has precedent in dsv4_fp4_mi355x_sglang.sh.
  • Launch script: Docker-based direct-node runner pulling the public image with --pull=missing — same accepted pattern as launch_h100-cr.sh and launch_mi325x-tw.sh, so no enroot import is needed here. Framework-tagged script resolution (qwen3.5_fp4_rtx6000pro_sglang.sh via FRAMEWORK) and ${RUNNER_NAME%%_*}launch_rtx6000pro-lat.sh routing both line up.
  • runners.yaml: labels, cluster entry, and gpus-per-node: 8 wiring are consistent.

CI: PR checks pass; the full sweep run for the SGLang head is currently queued (run 30238542970) — that run will be the real validation of the new image tag and server flags on the RTX PRO 6000 node.

Note: I could not verify the v0.5.16-cu130 tag's existence on Docker Hub from this environment (network access to hub.docker.com was not permitted), so the queued sweep is the authoritative check there.


The merge with main resolved perf-changelog.yaml by taking main's copy
and re-appending this PR's entry, but only main's copy was staged, so
the merge commit dropped the entry. Without it the PR diff no longer
touches perf-changelog.yaml and run-sweep.yml's path filter never
matches.

中文:与 main 合并时对 perf-changelog.yaml 采用了「取 main 版本再追加本 PR
条目」的方式,但只暂存了 main 的版本,导致合并提交丢失了该条目。缺少该条目
后 PR 的改动不再涉及 perf-changelog.yaml,run-sweep.yml 的路径过滤器便不会
匹配。此提交恢复该条目。

# Qwen3.5-397B-A17B NVFP4 single-node SGLang sweep using 4 of 8 RTX PRO
# 6000 Blackwell GPUs. Both arms use ordinary NCCL collectives on PCIe.
qwen3.5-fp4-rtx6000pro-sglang:

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.

🔴 BLOCKING: Master config was modified but perf-changelog.yaml was not updated. This is the same issue flagged in the previous review — it now applies to the renamed key qwen3.5-fp4-rtx6000pro-sglang (the changelog still has no rtx6000pro entry at all).

Why it matters: Per AGENTS.md, perf-changelog.yaml is the append-only benchmark trigger log. Without an entry, the new recipe won't be picked up for benchmarking after merge, which defeats the purpose of the PR.

Fix: Append this to the end of perf-changelog.yaml (it's read chronologically, newest at the bottom):

- config-keys:
    - qwen3.5-fp4-rtx6000pro-sglang
  description:
    - "Add Qwen3.5-397B-A17B NVFP4 single-node SGLang 8k/1k fixed-seq-len sweep on 4x RTX PRO 6000 Blackwell (TP4 and TP4/EP4 arms, concurrency 1-64) using lmsysorg/sglang:v0.5.16-cu130"
  pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2312

Fix this →


🔴 阻断性问题:修改了 master 配置但没有更新 perf-changelog.yaml。这与上次审阅指出的问题相同——现在适用于重命名后的配置项 qwen3.5-fp4-rtx6000pro-sglang(变更日志中仍然没有任何 rtx6000pro 条目)。根据 AGENTS.md,该文件是仅追加的基准测试触发日志;缺少条目会导致合并后新配方不会被触发进行基准测试。请将上述条目追加到 perf-changelog.yaml 文件末尾(按时间顺序读取,最新的在底部)。

@github-actions

Copy link
Copy Markdown
Contributor

Drive the checkpoint's built-in MTP draft head through SGLang's EAGLE
path (3 steps, top-k 1, 4 draft tokens) over the same 8k/1k grid as the
non-MTP config.

mem-fraction-static bounds weights plus the KV and Mamba pools, so the
4.05 GiB per-rank draft head has to be paid for by raising the fraction,
not lowering it: 0.65 and 0.75 both left the pools empty, and 0.85 came
up with only 4.56 GiB free per rank. 0.80 lands at 1.08M KV tokens with
9.6 GiB free. max-running-requests now tracks the tested concurrency
rather than a fixed 128, since the client never opens more connections
and the oversized Mamba state pool was what starved the draft head.

Validated on the node through the real launcher, every request
successful: TEP4 conc 64 640/640 at 6895 tok/s (+11% over the non-MTP
arm, mean TTFT 27.2s to 9.6s) and TEP4 conc 1 10/10 at 1233 tok/s (+83%,
mean TPOT 12.6ms to 6.5ms).

中文:为 Qwen3.5 RTX PRO 6000 SGLang 配方新增 MTP 分支,通过 SGLang 的 EAGLE
路径驱动检查点内置的 MTP 草稿头(3 步、top-k 1、4 个草稿 token),扫描网格与
非 MTP 配置相同。mem-fraction-static 同时约束权重与 KV/Mamba 池,因此每卡
4.05 GiB 的草稿头必须通过调高该比例来容纳,而非调低:0.65 与 0.75 都会让池为
空,0.85 虽能启动但每卡仅剩 4.56 GiB。0.80 可得到 108 万 KV token 且剩余
9.6 GiB。max-running-requests 改为跟随被测并发数而非固定 128,因为客户端不会
建立更多连接,过大的 Mamba 状态池正是草稿头显存不足的原因。已在节点上通过真实
启动器验证,全部请求成功。
@github-actions

Copy link
Copy Markdown
Contributor

@functionstackx functionstackx left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

lgtm

@functionstackx

Copy link
Copy Markdown
Collaborator

/reuse-sweep-run

Resolve two conflicts that merge_with_reuse.sh does not auto-resolve:
- configs/runners.yaml: both sides appended to the hardware-metadata map; keep
  both entries, with cluster:gb300-nv continuing the GB family and
  cluster:rtx6000pro-lat after it, before the AMD block.
- perf-changelog.yaml: take main's file wholesale and re-append this PR's two
  entries (qwen3.5-fp4-rtx6000pro-sglang and -mtp) at the tail, per the
  documented recipe. No lines deleted relative to main.

中文:解决 merge_with_reuse.sh 无法自动处理的两处冲突:(1) configs/runners.yaml —
双方都向硬件元数据表追加了条目,保留两者,cluster:gb300-nv 紧随 GB 系列,
cluster:rtx6000pro-lat 置于其后、AMD 区块之前;(2) perf-changelog.yaml —— 按既定
做法完整采用 main 的版本,再将本 PR 的两条条目追加到文件末尾,相对 main 无任何删除。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@functionstackx

Copy link
Copy Markdown
Collaborator

/reuse-sweep-run

@functionstackx
functionstackx merged commit 1a549a3 into main Jul 30, 2026
26 checks passed
@functionstackx
functionstackx deleted the agent/qwen35-rtx6000pro-vllm branch July 30, 2026 06:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Development

Successfully merging this pull request may close these issues.

2 participants