yy-fighting 4d6dac010c r37 addendum: B'(nomtp) vs PP+MTP same-profile input/output throughput comparison (i16k/o512 random-ids cc8-64)
同栈同脚本 nomtp 对拍:cc8 打平(每token 41.0 vs 41.6ms 拐点实证)、cc16 mtp +6%+TTFT-32%、cc>=32 B' 反超 0.9-5.4%(TPOT 好2x);图修复把 r36 1.81x 惨败收敛到 ±6% 水平线;生产 r37 mtp 已恢复核验
2026-09-09 09:24:25 +08:00

6.0 KiB
Raw Blame History

GLM-5.3-NVFP4 PP+MTP verify CUDA graph 修复r37— 2026-09-08 @ 174.1.60.8

上一个实验glm53_ppmtp_r36_degloo判定PP+MTP eager 模式正确但 MTP 机器开销吃光收益step 239ms@cc16 vs 净胜拐点 148ms图模式r36g则正确性崩溃accept 2.85→1.05 + 数字乱码)。本实验继续修复图捕获并兑现 MTP+PP 双优势。结果修复成功killer e2e -40%、TPOT -40%、TTFT 近乎减半,全面胜过在役 A16 配置并留役生产。

环境

  • 镜像 lmsysorg/sglang:nightly-dev-cu13-20260901-07c8f729GLM-5.3-NVFP48×RTX 6000DSM120
  • TP4PP2 + EAGLE3 steps / topk1 / 4 draft tokensDSAhicache 3memfrac 0.88chunk 8192 --disable-overlap-scheduleSYNC_MASK=127de-GLOO 中继r36 遗产)
  • r36 的 8 个挂载文件全部沿用 + 本实验新增第 9 挂载decode_cuda_graph_runner

排查过程(按时间序)

  1. :1515 切片修复r33 注释的根因猜测decode runner execute() 对非末 stage 的 PPProxyTensors 按 self.bs(请求数)切片,截断 TARGET_VERIFY 树行bs×4→ 改按 raw_num_token必要但不充分 r37 实测 accept 仍 1.02-1.27 + 乱码bs=1 零 padding 下确定性复现 → 排除竞态/padding
  2. 按 stage 二分:把 /root/sglang_patch2/eagle_worker_common.py 的 _PP_FORCE_EAGER_VERIFY 门扩展为 1/2/3 模式(全 eager / 仅首 stage eager / 仅末 stage eager。判决
    • 模式 2PP0 eager + PP1 图)→ 仍乱码;模式 3PP0 图 + PP1 eager→ 完全正确。
    • 缺陷唯一在末 stagePP1的 verify 图PP0 图(含 :1515 修复)被实证正确。
  3. 遥测runner 内置 VRFY-IN/BUF/G/SLOT + xcheckSGLANG_PP_SPEC_DEBUG=2/3
    • 入口 relayed hidden 每轮新鲜正常;返回 hidden_states 新鲜logits argmax 全是高频英文 token' of'/' the'/':' tokenizer 解码实证)→ "模型没看到上下文"signature。
    • VRFY-SLOTpp 槽位注册健康enabled=True copy_from_fb=True buffer=静态张量 data_ptr 一致)。
    • VRFY-BUFfill_from 之后静态 pp 缓冲仍全零VRFY-IN needs_init=False → 真凶。

根因(真·根因,取代 r33 的 :1515 猜测为唯一根因)

spec worker 的 plan-stream 在 prepare 阶段预跑 load_batcheagle_prepare_for_verify 的 overlap 设计)——彼时 PP 中继尚未到达pp_proxy_tensors=Nonefill_from 跳过全部 pp 槽位,仅完成常规槽位 + 注意力元数据, batch 被标记 pre-plannedneeds_forward_metadata_init()=False。前向流 execute() 于是走 pre-planned 早退路径, 该路径只补拷 input_ids/positions 两个 spec 必需字段 → pp_proxyhidden_states/residual/topk_indices 静态缓冲永远是分配时的全零。捕获图内的 clone kernelrun_once 体内,:1212从静态缓冲拷零 → 末 stage 在零激活上 计算 → logits 为"无上下文"垃圾 → 全拒 + 乱码。

一切旁证自洽:

  • PP0首 stage不吃 pp 输入input_ids/positions 恰好是早退路径补拷的两个)→ 模式 3 正确;
  • B'nomtp+图+PP无 spec worker plan-stream → 走完整 fill_from 路径 → 正确;
  • TP8 A16 无 PP → 正确;
  • 图 logits ≈ eager 参考滞后一轮xcheck 实测):零 token 嵌入 + 上一轮 KV 历史的注意力产出。

修复patches/decode_cuda_graph_runner_fix.py第 9 挂载文件)

两处改动:

  1. execute() :1515PPProxyTensors 抽取改按 self.raw_num_token 切(原 :bs 截断树行decode width=1 时二者等价于 raw/padded 行数之差,树行场景必须 raw_num_token
  2. load_batch() pre-planned 早退路径:新增 pp_proxy 补拷——pp_proxy_tensors 各 key 拷入静态缓冲 [:src.shape[0]]pad 尾(self.bs*captured_req_width 之外)清零保确定性。这是本修复的核心。

生产运行时遥测代码VRFY-* / xcheck随文件留存由 SGLANG_PP_SPEC_DEBUG 门控0=关闭,无开销)。

验证阶梯(全部通过)

  • 质量门 7/7 ×2 bootGSM8K×5/中文推理/tool call
  • accept 恢复 3.59-3.75eager 档);
  • conc_test ×3 ALL-OK、killer ×6 零崩溃(三个 boot 累计);
  • 性能见 results/bench_results.mdvs eager -40% e2evs A16 在役配置 -40% e2e、TTFT 33s vs 58-61s。

生产终态

60.8 glm53-nvfp4:30000 = r37 胜者配置verify 图 + draft eager + de-GLOO + mask127 --restart unless-stopped,已取代 A16 留役A16 脚本 deploy_glm53_605.sh 留盘可切回)。 draft 图DRAFTEAGER=0实测无增益噪声带内互有胜负保持 eager 以少一个变量。

遗产与提醒

  • /root/sglang_patch2/eagle_worker_common.py 已被本实验覆盖为 bisect 版md5 babb6461…env "1"/"0" 语义与 r36 版完全兼容,新增 "2"/"3" 单侧模式r36 档案中的旧 md5 以本目录为准。
  • 语料池 61,772 token 剩余(< 一次 i8k 262,144i8k 永久无重跑余量killer random-ids 为标准口径。
  • 09-09 补测 cc 扫频i16k/o512cc 8/16/32/40/64nreq=2cc吞吐 cc16 起饱和 130-135 tok/s accept 全档 3.46-3.68,详见 results/bench_results.md扫频脚本 scripts/r37_cc_sweep.sh、日志 results/r37sweep_cc*.log。
  • 09-09 B'(nomtp) 同口径对拍(同栈同脚本 nomtp 模式、同 seed/nreq/flush-cache唯一变量=开不开 MTP cc8 打平(拐点实证:每 token 41.0 vs 41.6ms)、cc16 mtp +6% 且 TTFT -32%、cc≥32 B' 反超 0.9-5.4% 且单请求 TPOT 好 2×verify 大步×chunk 交错放大排队相位停顿)。图修复把 r36 时代 1.81× 惨败收敛到 ±6% 水平线。脚本 scripts/nomtp_cc_sweep.sh、日志 results/nomtpsweep_cc*.log + nomtp_sweep_all.log 判读全表见 results/bench_results.md "B'(nomtp) vs PP+MTP(r37)" 节。
  • 勘误:历次 bench 的 rc=1 与 JSON 缺失真因 = 容器内 /data/hf_models/bs_results/ 目录从未存在(写 output-file 必失败,指标在 stdout 日志无损09-09 已补建目录,此后 JSON 可正常落盘。