[Klaud Cold] glm5.2-fp4-rtx6000pro-sglang-agentic: add GLM-5.2 SGLang AgentX recipe for RTX PRO 6000 / 新增 GLM-5.2 RTX PRO 6000 SGLang AgentX 基准配置 - #2335
Conversation
…e for RTX PRO 6000 Adds the SGLang counterpart to the RTX PRO 6000 vLLM recipes: TP8/EP1 GLM-5.2 NVFP4 AgentX replay at concurrency 1/2/4 on the Latitude SM120 node, plus the runner label/launcher routing it needs. SM120 deltas validated on-node: shared-experts fusion must be disabled (the checkpoint keeps the shared expert loose in BF16 while routed experts are packed NVFP4), the sparse DSA attention backend cannot run (its indexer metadata is DeepGEMM-only and DeepGEMM rejects SM120) so the Triton MLA fallback is used, and context is capped at 256k because the FP8 KV pool holds 464,768 tokens per rank. The recipe header records why sparse cannot be re-enabled by flag, so the next reader does not burn a sweep rediscovering it. 中文:新增 GLM-5.2 NVFP4 在 8x RTX PRO 6000 Blackwell(SM120) 节点上的 SGLang 智能体(AgentX)基准配置,TP8/EP1,并发 1/2/4,并补齐该运行器所需的 标签与启动器路由。已在节点上验证的 SM120 差异:必须关闭共享专家融合 (该权重的共享专家为松散 BF16,而路由专家为打包 NVFP4);稀疏 DSA 注意力 后端无法运行(其 indexer 元数据仅有 DeepGEMM 实现,而 DeepGEMM 不支持 SM120),因此回退到 Triton MLA;上下文上限设为 256k,因为 FP8 KV 池每个 rank 仅容纳 464,768 个 token。脚本头部记录了为何不能仅靠开关重新启用稀疏 路径,以避免后续读者重复踩坑并浪费一次扫描。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
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 For PR verification, add the 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 模板,包括保留英文语句 如需进行 PR 验证,请为此 PR 添加 PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档 |
1 similar comment
|
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 For PR verification, add the 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 模板,包括保留英文语句 如需进行 PR 验证,请为此 PR 添加 PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档 |
| # When MODEL_PATH is unset (stand-alone runs), fall back to the HF_HUB_CACHE. | ||
| # Either way, MODEL_PATH is what the server is launched with. | ||
| MODEL_REVISION="${GLM52_MODEL_REVISION:-aec724e8c7b8ee9db3b48c01c320f63f9cdaf8aa}" | ||
| if [[ -n "${MODEL_PATH:-}" ]]; then | ||
| if [[ ! -d "$MODEL_PATH" || -z "$(ls -A "$MODEL_PATH" 2>/dev/null)" ]]; then | ||
| hf download "$MODEL" --revision "$MODEL_REVISION" --local-dir "$MODEL_PATH" | ||
| fi | ||
| else | ||
| hf download "$MODEL" --revision "$MODEL_REVISION" | ||
| export MODEL_PATH="$MODEL" |
There was a problem hiding this comment.
🔴 When MODEL_PATH is unset — which it always is on this runner, since neither benchmark-tmpl.yml nor runners/launch_rtx6000pro-lat.sh set it (unlike launch_b300-nv.sh) — the else branch pins --revision $MODEL_REVISION only for the hf download step, then sets MODEL_PATH to the bare repo id nvidia/GLM-5.2-NVFP4. SGLang is later launched with --model-path $MODEL_PATH and no --revision flag anywhere in SGLANG_CMD, so it resolves main at server start rather than the pinned aec724e8... commit, silently defeating the reproducibility pin in the only code path CI actually exercises. Fix: add --revision "$MODEL_REVISION" to SGLANG_CMD (SGLang's launch_server supports it) or point MODEL_PATH at the resolved local snapshot directory.
Extended reasoning...
The bug. glm5.2_fp4_rtx6000pro_sglang.sh introduces a deliberate reproducibility pin: MODEL_REVISION="${GLM52_MODEL_REVISION:-aec724e8c7b8ee9db3b48c01c320f63f9cdaf8aa}". This pin is honored for the download step in both branches of the if [[ -n "${MODEL_PATH:-}" ]] conditional (lines 69-78), but only the if branch keeps MODEL_PATH pointed at a concrete local directory that was populated at that pinned revision. The else branch — taken when MODEL_PATH is unset — runs hf download \"$MODEL\" --revision \"$MODEL_REVISION\" (correctly fetching the pinned snapshot into the shared HF cache) and then does export MODEL_PATH=\"$MODEL\", i.e. sets MODEL_PATH to the bare HF repo id nvidia/GLM-5.2-NVFP4, with no revision attached to it at all.\n\nFurther down, SGLANG_CMD launches the server with --model-path \"$MODEL_PATH\" and, scanning the full argument list, there is no --revision flag anywhere. When --model-path is a bare repo id rather than a local directory, SGLang/huggingface_hub resolves the revision to the default main ref at load time — a live hub lookup, since HF_HUB_OFFLINE is not set anywhere in this recipe. So the pin governs what gets downloaded, but not what gets served: the server loads whatever main currently points to, which only coincidentally matches the pinned commit today.\n\nWhy this is not a theoretical edge case. The else branch is not a fallback for unusual manual runs — it is the only branch ever exercised in CI on this runner. benchmark-tmpl.yml's env block never sets MODEL_PATH. runners/launch_rtx6000pro-lat.sh only forwards --env MODEL_PATH to the container (i.e. passes through whatever is in the parent environment, which is nothing) — it never assigns a value, unlike the sibling launch_b300-nv.sh, which explicitly exports MODEL_PATH to a staged local directory under /data/models. So on the RTX PRO 6000 runner, MODEL_PATH is always unset, the else branch always runs, and the server is always launched against the unpinned bare repo id.\n\nStep-by-step proof:\n1. CI invokes this script with no MODEL_PATH in the environment (confirmed absent from both benchmark-tmpl.yml's env block and launch_rtx6000pro-lat.sh).\n2. [[ -n \"${MODEL_PATH:-}\" ]] is false → the else branch runs: hf download nvidia/GLM-5.2-NVFP4 --revision aec724e8c7b8ee9db3b48c01c320f63f9cdaf8aa, correctly fetching the pinned snapshot into $HF_HUB_CACHE.\n3. export MODEL_PATH=\"nvidia/GLM-5.2-NVFP4\" — the bare repo id, no revision suffix.\n4. SGLANG_CMD is built with --model-path \"nvidia/GLM-5.2-NVFP4\" and, checked against the full flag list in the script, no --revision argument exists to pin the load.\n5. python3 -m sglang.launch_server ... starts; since --model-path isn't a local directory, SGLang/transformers resolve revision "main" against the live hub (no HF_HUB_OFFLINE), and loads whatever commit main currently points to.\n6. Today, main happens to equal aec724e8..., so results are currently correct and nothing crashes — the bug is latent. But the moment upstream pushes a new commit to main for nvidia/GLM-5.2-NVFP4, step 2's download (still pinned) and step 5's load (unpinned) diverge: the server would silently serve a different checkpoint than the one benchmarked and validated in this PR's own on-node testing, potentially re-downloading a second 433 GB snapshot on top of the one already cached.\n\nWhy nothing else in the script catches this. There's no assertion after the else branch that the resolved MODEL_PATH/revision pair matches what was downloaded, and no --revision is threaded through to SGLANG_CMD from either branch — the pin is a write-only variable as far as the server launch is concerned.\n\nFix. The simplest correction is to add --revision \"$MODEL_REVISION\" to SGLANG_CMD (SGLang's launch_server accepts this flag) so the load path is pinned the same way the download path is. Alternatively, resolve MODEL_PATH to the actual local snapshot directory that hf download populates (e.g. via hf download --local-dir in the else branch too, mirroring the if branch) so --model-path always points at pinned, already-materialized content rather than a bare repo id resolved at load time.\n\nThis undermines the explicit reproducibility intent of the recipe (the B300 sibling recipe doesn't pin a revision at all, so this pin was clearly added deliberately for this config) in the exact code path that every real CI run on this runner takes, which is why I'm marking it normal rather than nit despite the fact that it's currently harmless while upstream main hasn't moved.
| fi | ||
|
|
||
| SGLANG_CMD=( | ||
| python3 -m sglang.launch_server | ||
| --model-path "$MODEL_PATH" | ||
| --served-model-name "$MODEL" | ||
| --host 0.0.0.0 | ||
| --port "$PORT" | ||
| --trust-remote-code | ||
| --tp "$TP" | ||
| --ep-size "$EP_SIZE" | ||
| --quantization modelopt_fp4 | ||
| # nvidia/GLM-5.2-NVFP4 keeps the shared expert loose and in BF16, so the | ||
| # fused-shared-expert loader cannot consume it (see the header note). | ||
| --disable-shared-experts-fusion | ||
| # SGLang would default this DSA model to --attention-backend dsa, whose | ||
| # indexer metadata is built by deep_gemm.get_paged_mqa_logits_metadata | ||
| # (the only CUDA option; 'cutedsl' is gated to SM100). DeepGEMM aborts | ||
| # with "Assertion error (attention.hpp:227): Unsupported architecture" on | ||
| # SM120 during warmup, so fall back to Triton MLA. Sparse attention is | ||
| # consequently not exercised on this GPU family. | ||
| --attention-backend "$ATTENTION_BACKEND" | ||
| "${MOE_ARGS[@]}" |
There was a problem hiding this comment.
🔴 SGLANG_CMD in this recipe never passes --kv-cache-dtype fp8_e4m3, so SGLang falls back to its default bf16 KV cache instead of the FP8 cache the recipe's header comments, nvidia-master.yaml, and the PR description all assume (464,768 tokens/rank in 23.91 GB, ~51 KB/token). The sibling glm5.2_fp4_b300_sglang.sh:118 recipe this was copied from sets the flag explicitly in the same low-latency branch — add --kv-cache-dtype fp8_e4m3 to SGLANG_CMD here too.
Extended reasoning...
The SGLANG_CMD array built at benchmarks/single_node/agentic/glm5.2_fp4_rtx6000pro_sglang.sh:172-194 never sets --kv-cache-dtype. SGLang has no auto-fp8 default for KV — omitting the flag makes it use the model dtype (bf16) for the MLA latent KV cache. This is confirmed by grepping the rest of the repo: every other recipe that relies on an FP8 KV pool sets the flag explicitly (glm5.2_fp4_b300_sglang.sh:118, dsv4_fp4_mi355x_sglang.sh:140, the srt-slurm and AMD models.yaml recipes, etc.). I verified directly that the B300 sibling this script was copied from does set --kv-cache-dtype fp8_e4m3 inside its non-DP ("STP") low-latency branch — the exact branch this RTX PRO 6000 recipe descends from — so the flag was dropped in the copy rather than being an intentional change.
The rest of the recipe is built entirely around the assumption that the KV cache is FP8. The script's own header comment, the new nvidia-master.yaml entry, and the PR description all state the "FP8 KV pool" holds 464,768 tokens per rank (23.91 GB) at mem-fraction-static 0.85, i.e. ~51 KB/token across GLM-5.2's 78 layers. That number is only consistent with an FP8 cache: GLM-5.2's MLA state is kv_lora_rank 512 + rope 64 = 576 elements/token/layer, which comes to roughly 44 KB/token in FP8 across 78 layers (close to the ~51 KB/token quoted, with indexer/page overhead) — 23.91 GB / 464,768 tokens = ~54 KB/token, again matching FP8. In bf16 the same state would be roughly double, ~88-90 KB/token, giving a pool of only ~230k-285k tokens/rank in the same 23.91 GB, not 464,768. So the on-node validation that produced 464,768 tokens/rank and the "needle retrieval at 220,029 tokens" / "two ~110k-token sessions resident" results in the PR description must have been run with --kv-cache-dtype fp8_e4m3 set — the committed script does not reproduce that configuration.
Concretely, if this ships as-is: the CI sweep runs a materially different (bf16-KV) server than the one that was validated and documented. The actual pool would be roughly half the size the sizing math assumes, which invalidates both the 256k context cap (--context-length 262144) and the concurrency-4 cutoff — a bf16 pool of ~230k-285k tokens/rank is close to or below the 262144-token context length, so a single full-length 256k session may not even fit resident, let alone the two ~110k sessions the recipe uses to justify stopping at concurrency 4. That risks continuous re-prefilling or startup/capacity failures that the documented validation did not encounter, undermining the primary purpose of this PR (recording believable on-node capacity numbers for this hardware).
To fix: add --kv-cache-dtype fp8_e4m3 to the SGLANG_CMD array, matching glm5.2_fp4_b300_sglang.sh:118, and re-validate that the pool size, context cap, and concurrency cutoff in the header/nvidia-master.yaml/PR description still hold under the corrected server config.
Step-by-step proof:
- Read
glm5.2_fp4_rtx6000pro_sglang.sh:172-194—SGLANG_CMDcontains--quantization modelopt_fp4,--attention-backend triton,--mem-fraction-static, etc., but no--kv-cache-dtypeanywhere in the array or in any exported env var. - Grep the codebase for
--kv-cache-dtypein other FP8-KV recipes — it is always passed explicitly (e.g.glm5.2_fp4_b300_sglang.sh:118), confirming SGLang requires an explicit flag rather than auto-detecting FP8 KV from the weight quantization. - Compute expected FP8 KV bytes/token for GLM-5.2 MLA:
(512 + 64) elements * 78 layers * 1 byte (fp8)≈ 44 KB/token, and cross-check against the documented 23.91 GB / 464,768 tokens ≈ 51.4 KB/token — both are in the FP8 regime. - Compute the bf16 equivalent: same element count in 2 bytes ≈ 88 KB/token, which in 23.91 GB yields ≈ 278k tokens/rank — roughly half of 464,768, and dangerously close to the 262144-token
--context-lengthsetting used by this recipe. - Conclude that the shipped script (bf16, missing flag) cannot reproduce the documented/validated 464,768-token pool, invalidating the capacity claims that justify the 256k cap and conc-4 cutoff.
|
see unofficial run visualizer at https://inferencex.semianalysis.com/inference?unofficialRun=30205556138 |
1 similar comment
|
see unofficial run visualizer at https://inferencex.semianalysis.com/inference?unofficialRun=30205556138 |
|
@Oseltamivir the AgentX/AIPerf harness has been updated, please merge origin/main into your branch and refresh your submission. Additional tuning may be necessary depending on the config. I apologize for any inconvenience. This is an automated message. |
Summary
Adds the SGLang counterpart to the RTX PRO 6000 vLLM recipes (#2312 Qwen3.5, #2332 GLM-5.2): a GLM-5.2 NVFP4 AgentX trace-replay sweep on the 8× RTX PRO 6000 Blackwell (SM120) Latitude node, TP8/EP1 with GPU-resident FP8 KV cache at concurrency 1, 2 and 4.
New config key:
glm5.2-fp4-rtx6000pro-sglang-agentic, imagelmsysorg/sglang:v0.5.15.post1-cu130(the same image as the mergedglm5.2-fp4-b300-sglang-agenticrecipe).What SM120 forces this recipe to do differently
Every item below was established on the node, not inferred:
--disable-shared-experts-fusionis mandatory. SGLang enables shared-experts fusion for this config (n_routed_experts=256,n_shared_experts=1, EP off), butnvidia/GLM-5.2-NVFP4stores the shared expert loose and unquantized (BF16[2048, 6144]) while the routed experts are packed NVFP4 ([2048, 3072]). Weight load aborts withRuntimeError: The size of tensor a (3072) must match the size of tensor b (6144) at non-singleton dimension 1— the same trap the in-tree comment records for the compressed-tensors Kimi-K2.5 checkpoint. Disabling fusion loads cleanly.dsa_paged_mqa_logits_backendaccepts onlydeepgemmon CUDA;cutedslis gated to SM100), and DeepGEMM aborts during warmup withtvm.error.InternalError: Assertion error (attention.hpp:227): Unsupported architecture. Verified still unfixed inv0.5.16-cu130. Consequence: GLM-5.2's sparse-attention advantage is not realized on this GPU family — prefill throughput decays with context as dense attention would (measured on-node, single stream: 872 tok/s at 4.4k → 580 tok/s at 100k → 418 tok/s at 244k).topk_v2, tilelang MHC prenorm and DeepGEMM HC prenorm (and forces torch paged-MQA logits) inside itsDeepseekV4ForCausalLMbranch only, whichGlmMoeDsaForCausalLMmisses. Both variants were booted on the node: startup and generation are identical, so the recipe stays minimal and the script header records where to look if the DSA path is ever revisited.mem-fraction-static 0.85(~51 KB/token across 78 layers), so 1M-token sessions cannot be resident and concurrency above 4 re-prefills continuously.On-node validation
lmsysorg/sglang:v0.5.15.post1-cu130: weights loaded (56.04 GB/GPU), KV pool 464,768 tokens/rank (23.91 GB), CUDA graphs captured,/health200.17 * 24→408with cleanreasoning_content/contentsplit through theglm45/glm47parsers — no NaN or garbage from the SM120flashinfer_cutlassNVFP4 MoE path (the failure mode of [Bug] NVFP4 models produce NaN outputs on RTX PRO 6000 Blackwell (SM120) sgl-project/sglang#18954).Can the sparse path be enabled instead? Attempted on-node — no
Because the caveat above decides how these numbers should be read, the sparse path was actually tried on the node rather than assumed dead. Patching SGLang so the indexer's paged-MQA logits go through its TileLang or torch implementations (both already used by the
dsv4indexer) and so the DeepGEMM schedule plan is no longer built unconditionally does clear the abort, and the server boots and serves. Four further walls follow:arrive_counts (384/256/128) encode theblock_I=64thread mapping, soblock_I=32compiles and then reads out of bounds.block_I=32/num_stages=1/ 128 threads, but CUDA-graph capture fails — TileLang JIT-compiles inside the capture (cudaErrorStreamCaptureUnsupported).Closing this needs an SM120-shaped sparse-MLA kernel (split the
d_v=512accumulation so KV tiles stay under ~32 KB, re-derive the barrier counts, validate against the dense path) — kernel work, not configuration. The recipe header records this so the next reader does not re-burn a sweep on the flag.Reading these numbers against vLLM: PR #2332 serves the same checkpoint on the same node with
--attention-backend B12X_MLA_SPARSE, i.e. vLLM does get sparse MLA on SM120 through B12X. A lower SGLang result here is engine kernel coverage, not a hardware or recipe regression.Also included (shared with #2312 / #2332)
runners/launch_rtx6000pro-lat.sh, thertx6000pro*/cluster:rtx6000pro-latrunner labels and hardware metadata, and thebenchmark-tmpl.ymlworkspace-ownership repair for this direct-host runner are duplicated from those PRs because neither has merged yet. The launcher here additionally resolves framework-tagged script names (<model>_<precision>_rtx6000pro_<framework>[_mtp].sh, falling back to the untagged name) so SGLang and vLLM recipes can coexist on this runner. Whichever of the three PRs merges first, the others should drop the duplicated files on rebase.中文说明
本 PR 为 RTX PRO 6000 增加 SGLang 侧的配方,与 #2312(Qwen3.5, vLLM)、#2332(GLM-5.2, vLLM)互补:在 8× RTX PRO 6000 Blackwell(SM120)Latitude 节点上运行 GLM-5.2 NVFP4 的智能体(AgentX)轨迹回放扫描,TP8/EP1,KV 缓存全部驻留 GPU(FP8),并发 1、2、4。
新增配置项
glm5.2-fp4-rtx6000pro-sglang-agentic,镜像lmsysorg/sglang:v0.5.15.post1-cu130(与已合并的glm5.2-fp4-b300-sglang-agentic相同)。SM120 带来的差异(均在节点上实测得出)
--disable-shared-experts-fusion。 SGLang 在该配置下(n_routed_experts=256、n_shared_experts=1、EP 关闭)会启用共享专家融合,但nvidia/GLM-5.2-NVFP4的共享专家是松散存放且未量化的 BF16[2048, 6144],而路由专家是打包后的 NVFP4[2048, 3072],加载权重时会报 3072 与 6144 的形状不匹配。这与代码注释中记录的 compressed-tensors 版 Kimi-K2.5 是同一个坑。关闭融合后加载正常。dsa_paged_mqa_logits_backend仅接受deepgemm,cutedsl限定 SM100),而 DeepGEMM 在预热阶段直接断言Unsupported architecture;已确认最新的v0.5.16-cu130仍未修复。因此 GLM-5.2 的稀疏注意力优势在该 GPU 系列上无法体现:单流预填充吞吐随上下文增长而下降(实测 4.4k 时 872 tok/s,100k 时 580 tok/s,244k 时 418 tok/s),与稠密注意力的表现一致。DeepseekV4ForCausalLM分支内关闭 FP8 weight-only GEMM、topk_v2、tilelang MHC prenorm、DeepGEMM HC prenorm 并强制走 torch paged-MQA logits,而GlmMoeDsaForCausalLM拿不到这些设置。两种配置都在节点上实际启动过:启动与生成结果完全一致,因此配方保持精简,并在脚本头部记录了后续若重新尝试 DSA 路径时该查看哪些开关。mem-fraction-static 0.85下 FP8 KV 池为每 rank 464,768 个 token(78 层合计约 51 KB/token),1M token 的会话无法常驻,并发超过 4 就会持续重新预填充。节点验证
lmsysorg/sglang:v0.5.15.post1-cu130上完成 TP8 启动:权重每卡 56.04 GB,KV 池每 rank 464,768 token(23.91 GB),CUDA graph 捕获完成,/health返回 200。17 * 24→408,glm45/glm47解析器正确区分reasoning_content与content,SM120 上的flashinfer_cutlassNVFP4 MoE 路径未出现 NaN 或乱码(即 [Bug] NVFP4 models produce NaN outputs on RTX PRO 6000 Blackwell (SM120) sgl-project/sglang#18954 的故障模式)。能否改用稀疏路径?已在节点上尝试——不行
由于上述限制直接决定了这些数据该如何解读,我们并没有想当然地认为稀疏路径不可用,而是实际在节点上做了尝试。给 SGLang 打补丁,让 indexer 的 paged-MQA logits 走它自带的 TileLang 或 torch 实现(这两者
dsv4的 indexer 已在使用),并且不再无条件构建 DeepGEMM 调度计划,确实可以消除那个断言,服务也能正常启动并对外提供推理。但后面还有四道坎:arrive_count(384/256/128)已经把block_I=64的线程映射写死,所以改成block_I=32虽然能编译,但会越界访问。block_I=32/num_stages=1/ 128 线程下确实能放下,但 CUDA graph 捕获失败——TileLang 会在捕获过程中做 JIT 编译(cudaErrorStreamCaptureUnsupported)。要彻底解决,需要一个适配 SM120 的稀疏 MLA 内核(把
d_v=512的累加拆分,使 KV 分块保持在约 32 KB 以内,重新推导屏障计数,并与稠密路径做数值对齐验证)——这属于内核开发工作,而非配置调整。脚本头部已记录这一结论,避免后续读者再为这个开关浪费一次扫描。与 vLLM 结果的对比方式: PR #2332 在同一节点、同一权重上使用
--attention-backend B12X_MLA_SPARSE,即 vLLM 通过 B12X 在 SM120 上确实跑的是稀疏 MLA。因此这里 SGLang 数据偏低反映的是推理引擎的内核覆盖差异,而不是硬件问题或配置退化。与 #2312 / #2332 重复的文件
runners/launch_rtx6000pro-lat.sh、rtx6000pro*与cluster:rtx6000pro-lat运行器标签及硬件元数据、以及针对该直连主机运行器的benchmark-tmpl.yml工作区属主修复,都因为那两个 PR 尚未合并而在此重复提交。本 PR 的启动器额外支持带框架后缀的脚本名(<model>_<precision>_rtx6000pro_<framework>[_mtp].sh,找不到时回退到不带后缀的名字),以便 SGLang 与 vLLM 配方在同一运行器上共存。三个 PR 中任一先合并后,其余应在 rebase 时删除重复文件。