Skip to content

feat(bench): add GLM-5.3-Flash FP8 and NVFP4 AgentX on GB300 / feat(bench): 新增 GB300 上的 GLM-5.3-Flash FP8 与 NVFP4 AgentX - #4715

Open
functionstackx wants to merge 17 commits into
mainfrom
feat/glm53flash-fp8-gb300-sglang
Open

functionstackx wants to merge 17 commits into
mainfrom
feat/glm53flash-fp8-gb300-sglang

Conversation

@functionstackx

@functionstackx functionstackx commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

This PR adds both GLM-5.3-Flash AgentX MTP lanes for one GB300 tray (TP4/EP1, lmsysorg/sglang:v0.5.22-cu130@sha256:e3a4f06001a29542fc4a8638536d9ffc5eb9c9942b08603c09b19a56eae4a1ae):

Config key Checkpoint
glm5.3flash-fp8-gb300-sglang-agentic-mtp zai-org/GLM-5.3-Flash
glm5.3flash-fp4-gb300-sglang-agentic-mtp nvidia/GLM-5.3-Flash-NVFP4

It replaces four experimental GB300 PRs: FP8 base (this PR), FP8 HiCache #4732, NVFP4 base #4716 and NVFP4 HiCache #4728.

Each precision forms one dashboard curve:

  • No offload at concurrency 1, 4, 8, 16, 24 and 32.
  • HiCache (CPU DRAM KV offload) at concurrency 40, 44 and 48.

These concurrency points cover the throughput-versus-p90-E2EL Pareto frontier seen in those earlier runs. Points dropped as marginal or dominated: c2, c12, c56, c64 and c80. FP8 c2 and c12 sit on the interactivity frontier but add little next to c1, c4, c8 and c16. NVFP4 c1 is kept as the low-concurrency endpoint even though the earlier NVFP4 c2 point dominated it. MTP uses the GLM-5.3-Flash golden curve on main, glm-5.3-flash__mtp__native__default-default (MTP5 = 3.60).

Hidden admission cap: points stop at c48. Neither recipe sets --max-running-requests. When the flag is unset under EAGLE, SGLang sets max_running_requests=48 (_handle_eagle_family in v0.5.22 speculative_hook.py). The server log of run 41308011021 shows max_running_requests=48 with no flag set. Requests above 48 queue instead of running. In the earlier runs, c56–c80 lost throughput and E2EL grew quickly, so no point above c48 is submitted.

Recipe

Both precisions follow the SGLang cookbook GLM-5.3-Flash GB300 cells:

  • Low Latency, FP8 for FP8.
  • Low Latency, NVFP4 (NVDA) for NVFP4.

The served flags are --tp-size 4, --dsa-prefill-backend trtllm, --dsa-decode-backend trtllm, --kv-cache-dtype fp8_e4m3, --moe-runner-backend flashinfer_trtllm, and EAGLE with --speculative-num-steps 5 --speculative-eagle-topk 1 --speculative-num-draft-tokens 6. Parsers are auto (the cookbook default overlay). NVFP4 adds --quantization modelopt_fp4. expert-parallel-size 1 and context-length 1048576 equal the defaults; the model's max_position_embeddings is 1048576.

The tuning flags in the earlier NVFP4 recipe are removed: mem-fraction-static, max-running-requests, cuda-graph-max-bs-decode, chunked/max prefill sizes, loader options and enable-cache-report. The explicit SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE=0 and SGLANG_GLM_NEXTN_MOE_PTPC=0 are also removed; both default to False in v0.5.22 environ.py. trust-remote-code is removed because it is a no-op for the native Glm5NextForConditionalGeneration.

Deviation from the cookbook: HiCache sizing. The cookbook's HiCache option is --enable-hierarchical-cache --hicache-size 32. This PR uses --enable-hierarchical-cache --hicache-host-memory-fraction 0.90 instead, which is SGLang's auto-sizer at the fraction measured in #4732 and #4728.

  • Why 32 GB is too small: in v0.5.22, --hicache-size 32 caps all host pools (KV, Mamba and DSA indexer) at 32 GB per rank in total (_split_hicache_size). The FP8 device pool is 103.94 GB KV plus 9.45 GB indexer per rank (18.6M tokens). v0.5.22 warns when a host pool is smaller than the device pool ("L2 cache effectiveness is reduced"), so a 32 GB tier adds almost no capacity on GB300.
  • Why 0.90 rather than the 0.8 default: at 0.8 the host/device ratio falls to about 1.0 for FP8 and below 1 for NVFP4. At 0.90, [DNM, Experimental] feat(bench): GLM-5.3-Flash GB300 FP8 HiCache concurrency / [DNM, Experimental] feat(bench): GLM-5.3-Flash GB300 FP8 HiCache 并发 #4732's c48 job (125015030160) allocated 128.08 GB KV, 41.79 GB Mamba and 8.26 GB indexer per rank, which is 178.13 GB per rank at a ratio of 1.12.
  • Measured effect: with that tier, FP8 at concurrency 48 moved from 59.4k tok/s/GPU at 33.7 s p90 E2EL (no offload) to 63.8k at 28.6 s (run 41352868017).
  • write_through, kernel I/O and page_first layout equal the image defaults, so they are not set.

CPU DRAM. dram-utilization: 0.7495 records 723 GB per node (int(920,000 MiB × 1.048576 × 0.7495) of 964.7 GB), the maximum the auto-sized HiCache pools allocated in run 42026173061. The auto-sizer follows each node's free host memory, so allocation varies by node. TP4 uses all four GPUs on the tray, so the MODELS.md proportional allowance is the whole node.

Lane Node Host headroom (GiB) Ratio KV + Mamba + indexer per rank (GB) Per node (GB)
FP8 c40 r01-c016 840.2 1.119 128.00 + 41.75 + 8.25 = 178.00 712.00
FP8 c44 r01-c010 852.8 1.136 129.94 + 42.40 + 8.38 = 180.72 722.88
FP8 c48 r01-c012 836.3 1.114 127.40 + 41.56 + 8.21 = 177.17 708.68
NVFP4 c40 r01-c017 840.3 0.945 129.84 + 41.79 + 8.37 = 180.00 720.00
NVFP4 c44 r01-c018 843.0 0.948 130.26 + 41.90 + 8.40 = 180.56 722.24
NVFP4 c48 r01-c007 842.9 0.948 130.25 + 41.90 + 8.39 = 180.54 722.16

The run was ingested with the earlier 0.7386 setting (712 GB per node). That stored value will be corrected to 723 GB through an InferenceX-app changelog backfill; the run is not repeated. Under the cookbook NVFP4 recipe the device KV pool is larger than in #4728, so the NVFP4 host/device ratio is 0.95 even at fraction 0.90.

Draft heads are served as shipped.

  • FP8: the embedded NextN head loads as FP8 (2.28 GB per rank).
  • NVFP4: layer 45 (the MTP layer) is in the checkpoint's exclude_modules, so it ships BF16. It loads at 3.93 GB per rank through the image default (speculative_draft_model_quantization auto, not set explicitly).
  • No draft-precision override or environment variable is set.

Expected curves

Some earlier measurements are only estimates because the recipes changed.

The expected frontier is 7 points on throughput vs p90 E2EL and 9 on interactivity, per precision. The fresh sweep below replaces these estimates.

Chosen points and their sources (total tok/s per GPU, p90 E2EL)
Precision KV Conc Throughput/GPU p90 E2EL (s) Source run / job
FP8 none 1 5,905 13.94 41308011021 / 124853381257
FP8 none 4 8,521 10.61 41308011021 / 124878535966
FP8 none 8 14,875 9.74 41308011021 / 124878535987
FP8 none 16 27,260 10.50 41308011021 / 124878535977
FP8 none 24 41,927 15.56 41308011021 / 124878535922
FP8 none 32 53,008 17.92 41308011021 / 124878536085
FP8 HiCache 40 57,651 21.85 41352868017 / 125015030270
FP8 HiCache 44 ~60,700 ~25.2 interpolated c40/c48
FP8 HiCache 48 63,838 28.61 41352868017 / 125015030160
NVFP4 none 1 6,263 12.66 41301633576 / 124833849444 (old recipe)
NVFP4 none 4 9,099 9.32 41301633576 / 124857144881 (old recipe)
NVFP4 none 8 15,352 8.46 41301633576 / 124857144890 (old recipe)
NVFP4 none 16 28,099 9.05 41301633576 / 124857144894 (old recipe)
NVFP4 none 24 ~41,600 ~12.9 interpolated c16/c32
NVFP4 none 32 55,013 16.72 41301633576 / 124857144786 (old recipe)
NVFP4 HiCache 40 57,042 23.93 41352698576 / 125012338187 (old recipe)
NVFP4 HiCache 44 ~57,700 ~28.6 interpolated c40/c48
NVFP4 HiCache 48 58,386 33.31 41352698576 / 125012338053 (old recipe)

The earlier runs record empty-stream InvalidInferenceResultError requests at every point (about 4–8% of records). Reported throughput excludes them.

Harness-only settings (not serving optimizations)

These settings are identical in both recipes:

  • Server: served-model-name, watchdog-timeout: 1800, enable-metrics.
  • Server environment: PYTHONNOUSERSITE, PYTHONUNBUFFERED, HF_HUB_OFFLINE, SGLANG_TIMEOUT_KEEP_ALIVE=900.
  • Job: Slurm time_limit, health_check.
  • Client: AIPERF_HTTP_TCP_USER_TIMEOUT, AIPERF_REQUIRED_SERVER_METRIC_PREFIX, KV_OFFLOADING.

Both recipes declare identity for the runtime provenance check: the checkpoint revision (FP8 46a050be…, the revision the GB300 runtime fingerprint of run 41352868017 reported; NVFP4 1d007386…) and frameworks.sglang: 0.5.22. AIPERF_APPLY_CHAT_TEMPLATE is not set. runners.yaml adds the staged GLM-5.3-Flash and GLM-5.3-Flash-NVFP4 checkpoints to the gb300-nv cluster.

AI model disclosure
  • claude-opus-5-5 (Claude Opus 5.5) consolidated the four GB300 PRs into this one: point selection, cookbook alignment, recipes, config, changelog, this description, and sweep monitoring.
  • A coordinating lead agent and an independent reviewer agent directed and reviewed the work. Their exact model identifiers were not exposed to this agent and could not be verified.
  • Earlier commits on this branch, and the source runs, came from GPT-6 Astra, as recorded in the previous description.
中文

本 PR 在单个 GB300 托盘(TP4/EP1,lmsysorg/sglang:v0.5.22-cu130)上新增 GLM-5.3-Flash 的两条 AgentX MTP 配置:FP8(zai-org/GLM-5.3-Flash)和 NVFP4(nvidia/GLM-5.3-Flash-NVFP4)。它取代四个实验性 GB300 PR:FP8 基础(本 PR)、FP8 HiCache #4732、NVFP4 基础 #4716 和 NVFP4 HiCache #4728。每种精度构成一条曲线:并发 1、4、8、16、24、32 使用 GPU 内 KV,并发 40、44、48 使用 HiCache(CPU DRAM KV 卸载)。边际或被支配的 c2、c12、c56、c64、c80 已删除(FP8 的 c2、c12 位于交互性前沿上但增益很小;保留的 NVFP4 c1 是被支配点,作为低并发端点保留)。MTP 使用 main 上的 golden 曲线 glm-5.3-flash__mtp__native__default-default(MTP5 = 3.60)。

隐藏的准入上限:配方未设置 --max-running-requests,SGLang 在 EAGLE 下未设置该参数时通用地默认取 max_running_requests=48(v0.5.22 speculative_hook.py 中的 _handle_eagle_family,并非针对该模型或 GB300),超过 48 的请求只会排队,因此测试点止于 c48。

配方遵循 SGLang cookbook 的 GLM-5.3-Flash GB300 单元(FP8 Low Latency;NVFP4 使用 NVDA 单元,额外设置 --quantization modelopt_fp4)。删除了旧 NVFP4 配方中的调优参数、两个 NextN 环境变量(v0.5.22 默认均为 False)以及无作用的 trust-remote-code。

与 cookbook 的偏差:cookbook 的 HiCache 为 --hicache-size 32,在 v0.5.22 中这是每个 rank 所有主机池合计 32 GB,远小于约 113 GB/rank 的设备 KV 池,v0.5.22 会警告这会降低 L2 效果。本 PR 改用 SGLang 自动分配,--hicache-host-memory-fraction 0.90(#4732/#4728 实测值):#4732 的 c48 作业每 rank 分配 178.13 GB(KV 128.08 + Mamba 41.79 + 索引器 8.26),比例 1.12。FP8 在 c48 从 59.4k tok/s/GPU、p90 E2EL 33.7 s 提升到 63.8k、28.6 s。记录的 CPU DRAM 为每节点 723 GB(dram-utilization: 0.7495,节点 964.7 GB),即 run 42026173061 中自动分配的最大值;六个 HiCache 作业实测每节点 708.68–722.88 GB(FP8 708.68/712.00/722.88,NVFP4 720.00/722.16/722.24),随节点空闲内存变化。该 run 入库时记录为 712 GB,将通过 InferenceX-app 的 changelog backfill 更正为 723 GB,不重新运行。NVFP4 在 cookbook 配方下设备 KV 池更大,fraction 0.90 时主机/设备比例为 0.95。

推测头按原样服务:FP8 的 NextN 为 FP8;NVFP4 的 MTP 层(第 45 层)在 exclude_modules 中,以 BF16 发布并按镜像默认加载。未设置任何推测头精度覆盖。

预期曲线中 FP8 无卸载点为精确值;HiCache 点(fraction 0.90)、NVFP4 全部点与插值点均为估计值(配方已改变);新的完整 sweep 结果将取代这些估计。

@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

Thanks for the contribution!

  • Review: If this PR changes files owned by someone other than a repository admin or @SemiAnalysisAI/core, ask one eligible CODEOWNER to complete the latest PR_REVIEW_CHECKLIST.md before contacting a core maintainer on Slack. Follow the template exactly, including As a PR reviewer and CODEOWNER, I have reviewed this and have, so sign-off verification triggers.
  • PR verification: Sweeps run only when the PR appends an inferencex-e2e/perf-changelog.yaml entry and carries exactly one primary label: full-sweep-fail-fast (strongly recommended; canary plus per-matrix fail-fast), full-sweep-enabled (canary; matrix jobs continue after a failure), or non-canary-full-sweep-enabled (no canary or fail-fast). The modifiers all-evals, evals-only, and agentx-fast require a primary label. On fork PRs, a maintainer applies the label. See sweep labels and reuse.
  • After merging: PR authors must ensure all GitHub Actions jobs pass. Transient failures often pass on rerun; see how to rerun failed jobs.
中文

感谢你的贡献!

  • **审阅:**如果 PR 修改的文件归属于仓库管理员及 @SemiAnalysisAI/core 之外的 CODEOWNER,请先联系一位有资格的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,再通过 Slack 联系核心维护者。必须严格遵循模板,并保留 As a PR reviewer and CODEOWNER, I have reviewed this and have,才能触发签核验证。
  • **PR 验证:**只有当 PR 在 inferencex-e2e/perf-changelog.yaml 末尾追加了条目,并且恰好带有一个主标签时,才会运行扫描:full-sweep-fail-fast(强烈推荐;canary 加逐矩阵 fail-fast)、full-sweep-enabled(有 canary;矩阵任务在失败后继续运行)或 non-canary-full-sweep-enabled(无 canary,也无 fail-fast)。修饰标签 all-evals、evals-only 和 agentx-fast 必须与主标签一起使用。fork PR 的标签由维护者添加。参见扫描标签与复用。
  • **合并后:**PR 作者必须确保所有 GitHub Actions 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

@functionstackx functionstackx added the full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) label Nov 1, 2026
@functionstackx functionstackx changed the title feat(bench): add GLM-5.3-Flash FP8 GB300 / feat(bench): 新增 GLM-5.3-Flash FP8 GB300 [DNM, Experimental] feat(bench): add GLM-5.3-Flash FP8 GB300 / [DNM, Experimental] feat(bench): 新增 GLM-5.3-Flash FP8 GB300 Nov 1, 2026
dp-attn: false
decode: { num-worker: 1, tp: 16, dcp-size: 16, ep: 1, dp-attn: false }

glm5.3flash-fp8-gb300-sglang-agentic-mtp:

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 GLM-5.3-Flash GB300 lane will never have results collected after merge, because the PR adds no perf-changelog.yaml entry. The new benchmarked key glm5.3flash-fp8-gb300-sglang-agentic-mtp changes what runs. AGENTS.md:87 requires a changelog entry for each affected config key, and that entry is what triggers result collection. Fix: append one block at the tail of inferencex-e2e/perf-changelog.yaml with config-keys: [glm5.3flash-fp8-gb300-sglang-agentic-mtp]. Keep every existing byte unchanged, since the file is append-only (AGENTS.md:88).

Why this was flagged

The diff adds a new master-config key glm5.3flash-fp8-gb300-sglang-agentic-mtp at nvidia-master.yaml:8823. It also adds the recipe glm5.3flash/sglang/gb300-fp8-mtp/agentic.yaml, which python -m infx.matrix.changed would list as affected. AGENTS.md:87 says a change that alters what any benchmark runs needs a perf-changelog.yaml entry for the affected config keys, and that "the entry triggers result collection". grep glm5.3flash inferencex-e2e/perf-changelog.yaml finds nothing, and the diff does not touch that file. After merge, no result collection is triggered for the new lane, so no GLM-5.3-Flash GB300 AgentX results are produced or published. The base branch has no such lane, so the PR's stated goal is not delivered. No other mechanism replaces the changelog trigger.

Verification: The trigger is merging the PR as it stands. The diff adds the new benchmarked key glm5.3flash-fp8-gb300-sglang-agentic-mtp at inferencex-e2e/configs/nvidia-master.yaml:8823. It does not touch inferencex-e2e/perf-changelog.yaml. So this new lane gets no PR sweep and no result collection after merge.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Addressed in commit 505ac3a after the reviewed commit: one append-only block now lists glm5.3flash-fp8-gb300-sglang-agentic-mtp and this PR URL. Changelog validation passed. GPU jobs remain queued; this is not a GPU or canary pass.

已在审查所基于的提交之后,通过提交 505ac3a 追加唯一的 changelog 区块,包含该配置键和本 PR URL。Changelog 校验已通过。GPU 任务仍在排队,尚不能声称 GPU 或 canary 已通过。

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

@Oseltamivir

Copy link
Copy Markdown
Collaborator

/use 41308011021

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

@Oseltamivir staging run 41308011021. Existing staged runs will be preserved; a completion link will be posted here.

@Oseltamivir
Oseltamivir changed the base branch from feat/glm53flash-golden-al to main November 5, 2026 11:25
Single-node SGLang v0.5.22 TP4 MTP 5/1/6 lanes for FP8 and NVFP4 using
the SGLang cookbook GB300 recipe: GPU-resident KV at low concurrency and
an auto-sized HiCache host tier (host memory fraction 0.90) at high
concurrency.
@Oseltamivir Oseltamivir changed the title [DNM, Experimental] feat(bench): add GLM-5.3-Flash FP8 GB300 / [DNM, Experimental] feat(bench): 新增 GLM-5.3-Flash FP8 GB300 feat(bench): add GLM-5.3-Flash FP8 and NVFP4 AgentX on GB300 / feat(bench): 新增 GB300 上的 GLM-5.3-Flash FP8 与 NVFP4 AgentX Nov 5, 2026
@Oseltamivir Oseltamivir added full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) and removed full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) labels Nov 5, 2026
Pin lmsysorg/sglang:v0.5.23-cu130 for the FP8 and NVFP4 GB300 lanes and
declare the expected SGLang version and FP8 checkpoint revision in the
recipe identities.
@Oseltamivir Oseltamivir added full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) and removed full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) labels Nov 5, 2026
Return both GB300 lanes to lmsysorg/sglang:v0.5.22-cu130 and declare
SGLang 0.5.22 in the recipe identities.
@Oseltamivir Oseltamivir added full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) and removed full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) labels Nov 5, 2026
@Oseltamivir

Copy link
Copy Markdown
Collaborator

/use 42026173061

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

@Oseltamivir staged run 42026173061.

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
Set dram-utilization to 0.7495 (723 GB per node) on both GB300 lanes,
covering the 708.7-722.9 GB per node the auto-sized HiCache pools
allocated in run 42026173061.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended)

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

2 participants