glm53 dsv4-migration A-baseline (TP8+EAGLE) campaign: image negative, autotune split-negative, IPC@TP8 real win +4.6~9.1% but net-neutral vs production (patch/image coupling); eager-trap profile + day-drift finding (60.1, 09-10)

This commit is contained in:
yy-fighting 2026-09-10 19:04:28 +08:00
parent c5d91ceafe
commit 2370d33c73
3 changed files with 215 additions and 0 deletions

View File

@ -0,0 +1,50 @@
# DSV4 优化点迁移·A 基线战役报告 — GLM-5.3-NVFP4 TP8+EAGLE @ 60.12026-09-10
继 D 基线战役(同目录 REPORT.md之后应用户要求把同一组 DSV4 优化手段搬到
**方案 ATP8+EAGLE 生产配方)** 基线上重测。口径不变i16384/o512/cc 8-64 五点、
输出吞吐高者优、每臂门+三轮取中位、同语料固定窗口radix 开启下实测零缓存污染)。
基线配置 = deploy_glm53_605.sh 逐字复刻60.5 生产同款md5 fcd9109b
TP8 / EAGLE 4/1draft 内嵌主权重)/ 5 / mem0.90 / MRR16 / chunk8192 / fp8KV+hicache3 /
decode 图桶 bs1-8 / ctxlen270336 / 双 parser。部署器 `scripts/deploy_glm53_a_exp.sh`
## 总判决
| 优化手段 | A 基线判决 | 与 D 基线对照 |
|---|---|---|
| **latest 镜像**0.5.19+fi0.6.18 | **判负**cc8 图内 +2.0%eager 四点 6.4~11.1% | D 上中性≤0.7%)——**eager 路径对 flashinfer 代差敏感**,图内不敏感 |
| **autotune+持久缓存** | **净判负**cc8 +3.4%图内真胜eager 四点 4.8~9.4%(漂移校正后"最多 5%、从不帮忙" | D 上五点全胜 +1.2~3.2%——**autotune 收益=图内形状启动时剖析eager 形状运行时选 tactic 反而劣于静态默认** |
| **PCIe-IPC AR 包** | **机制真胜、落地打平**vs 同镜像基线全点 **+4.6~+9.1%**cc8/cc64 分布不重叠),但包仅兼容 latest而 latest 自带 eager 劣势把净效应吃回 vs 生产 nightly ≈0cc8 +7.2% 真胜cc16-64 ±2~5% | D(TP2) 上判负 0.4~3.5%——**IPC 收益随 TP 度单调升2→8 度3.5%→+9.1%DSV4 论断完整验证** |
| page-mark / native-heads | 判死/N/A与并行度无关见 REPORT.md | 同 D |
**对生产 A 配置的净建议维持现状nightly + autotune off + 无补丁)。**
本优化集没有可直接落地的净增益项唯一验证为真的增益IPC@TP8)被补丁的镜像代差锁死,
落地路径二选一(均未执行):① 把 IPC 钩子从 PR #34528 树移植回 nightly 的
parallel_state/base_runner4 文件 API 代差适配);② 等上游合入 nightly 后直接开。
## A 基线自身的重要画像(比优化点本身更有价值)
1. **掉图陷阱主导场景二**:生产 A 的 decode 图只到 bs8MRR16 → cc16-64 全程 eager
decode`cuda graph: False`TPOT 168-197ms vs 图内 62-64ms吞吐平台 ~70-73。
已发表"场景二 A 行 95.3/96.2TPOT 123.5ms"实为 **A-s2 变体**decode 图覆盖 bs16
图内 bs16 TPOT≈123ms 物理自洽)。两口径不可混读;生产 A 在本场景的真实水平是本战役
A0a 行89.5/69.7/73.1/73.4/73.4)。
2. **EAGLE 正常带**accept len 2.71 / rate 0.43(真实语料 2.1-2.9 带内)。
3. **日内漂移**8.5h 连续满载后 eager 点系统性 6~8% 而**图内点不动**A5 回切实测)
——签名指向 CPU 侧kernel-launch 密集路径),非 GPU 热频。方法论eager 指标
跨长窗不可比A/B 须背靠背。
4. cc40/64 为 A 首测点(发表报告只有 cc8-32MRR16 封顶后平台 ~73不随并发升。
## 数据与资产
- 逐轮原始数据+中位+TPOT+判决表:`results_a_baseline/results_A_raw.md`
- 部署器:`scripts/deploy_glm53_a_exp.sh`EXP_NAME/EXP_IMAGE/AUTOTUNE/EXTRA_ENV/INJECT_DIR
- IPC 包 nightly 移植失败记录ImportError: derive_parallel_widthsruntime_context 代差)
与 8/8 rank 激活验证均在 results_A_raw.md
- 远端 60.1/root/{deploy_glm53_a_exp.sh,run_arm_chain.sh,run_exp_s2.sh}、
/root/bench_logs/exp_A*.log25 个)、/data/glm53_exp/logs/{deploy,chain,gate}_A*.log
## 机器状态
- 实验 5 个容器expA0a/0b/2/3/5全部拆除生产 glm53-pp4 docker start 还原+核验
- 拆除运维坑A0a 容器出现 zombierm -f 首杀失败,重试成功,显存归零后正常)

View File

@ -0,0 +1,89 @@
# 原始压测数据 — DSV4 优化点迁移实验·A 基线TP8+EAGLE战役60.12026-09-10
口径:与 D 基线战役完全一致 —— i16384 / o512 / cc∈{8,16,32,40,64},输出吞吐 tok/s
bench_corpus.pyPG19 真实语料固定窗口 run-id 9311-9313 池C + 9314/9315 pool-override
每臂 3 轮取中位cc40/64 点 nreq=80/128。
## A 配置基线的两条路径(读数前必读)
生产 A 配方deploy_glm53_605.sh60.5 在役同款TP8 / EAGLE 4/1/5 / mem0.90 /
MRR16 / chunk8192 / fp8KV+hicache3 / **decode 图桶 bs 1-8** / ctxlen270336 / 双 parser。
- **cc8**decode bs≤8 全程**图内**TPOT 62.5-64.4ms(与已发表 A s2 行 64.5ms 逐字吻合)
- **cc16/32/40/64**MRR16 → decode bs 稳定 16 > 图上限 8 → **全程 eager**(掉图陷阱),
TPOT 168-196ms吞吐平台 ~70-73.4。**已发表 A s2 行95.3/96.2TPOT 123.5/123.7ms
是 A-s2 变体**decode 图覆盖到 bs16 → 图内 bs16 TPOT≈123ms物理自洽——
本战役基线=生产原版 A非 A-s2两口径不可混读。
- EAGLE 工作正常accept len 2.71 / rate 0.43(真实语料正常带 2.1-2.9)。
- 协议验证radix+hicache 开启下同 run-id 跨轮复用**实测干净**——全役 0 条非零
#cached-token prefill池 277k 远小于每轮 5.2M token 流量,自我清空)。
- 质量:门 7/7双 parser 使 tool-call 通过,优于 D 基线战役的 6/7
## 输出吞吐out tok/s逐轮 + 中位
| 臂 | cc8 | cc16 | cc32 | cc40 | cc64 |
|---|---|---|---|---|---|
| **A0a** nightly 基线 | 86.05/91.23/**89.46** | 67.17/69.66/**69.66** | 73.09/69.51/**73.09** | 73.77/73.35/**73.35** | 72.59/73.52/**73.38** |
| **A0b** latest 基线 | 88.93/91.25/91.22→**91.22** | 61.92/65.23/69.13→**65.23** | 67.88/67.38/69.92→**67.88** | 67.26/67.70/63.98→**67.26** | 63.83/65.45/65.24→**65.24** |
| **A2** nightly+autotune | 92.14/93.42/92.51→**92.51** | 65.78/65.65/64.27→**65.65** | 66.02/70.67/69.56→**69.56** | 64.59/66.81/67.00→**66.81** | 65.44/66.46/67.06→**66.46** |
| A3 latest+IPC | 94.84/95.88/96.10→**95.88** | 66.07/70.11/68.25→**68.25** | 68.69/74.02/74.24→**74.02** | 72.12/69.68/72.71→**72.12** | 69.88/69.47/69.51→**69.51** |
| A5 回切确认stock nightly1轮 | 91.16 | 64.07 | 68.26 | 68.96 | 68.88 |
## A5 回切确认与日内漂移发现19:01 完成)
- **cc8 完美复现**91.16 落在 A0a 带顶86.1-91.2),机器健康。
- **eager 四点系统性 6~8%**64.1/68.3/69.0/68.9 vs A0a 中位 69.7/73.1/73.4/73.4)。
A0a(10:00) 与 A5(18:25) 相隔 8.5h 连续满载。漂移签名:**图内点不动、eager 点全体下移**
→ 指向 CPU 侧kernel-launch 密集路径受主机持续负载状态影响),非 GPU 热降频。
- **判决稳健性复核**A0b/A2 的败点与基带分布不重叠(差距 5-11%2-4% 漂移解释不掉;
autotune 精确伤害收窄为"最多 ~5%、从不帮忙"A3 晚 A0b 四小时,漂移反而压低 IPC
实测胜幅——**+4.6~9.1% 是下界**cc8 各臂效应autotune +3.4%、IPC +5.1%)无漂移干扰。
- **方法论结论:跨长时间窗比较 eager 指标不可靠A/B 必须背靠背或同臂内交替。**
A0a 格式 r1/r2/中位r3 列于下;其余臂 r1/r2/r3→中位
A0a r3 补充cc8=89.46 cc16=70.04 cc32=73.67 cc40=73.23 cc64=73.38(中位计算已含)。
## 中位数对比vs A0a nightly 基线)
| 臂 | cc8 | cc16 | cc32 | cc40 | cc64 | 判定 |
|---|---|---|---|---|---|---|
| A0blatest 镜像) | +2.0% | 6.4% | 7.1% | 8.3% | 11.1% | **镜像门判负→留 nightly**cc8 图内中性偏好eager 全降) |
| A2autotune@nightly | **+3.4%** | 5.8% | 4.8% | 8.9% | 9.4% | **净判负**图内点真胜、eager 四点全败cc16 分布不重叠) |
| A3IPC@latestvs A0b 镜像内对照) | **+5.1%** | **+4.6%** | **+9.1%** | **+7.2%** | **+6.5%** | **全点真胜**cc8/cc64 分布不重叠TP8 主场成立TP2 同包 0.4~3.5% → TP8 +4.6~9.1%,随 TP 度单调升,与 DSV4 论断一致) |
| A3vs 生产 nightly A0a 净效应) | +7.2% | 2.0% | +1.3% | 1.7% | 5.0% | **净≈打平**IPC 收益被 latest 镜像自身 eager 劣势抵消 |
TPOT 副指标r1 mean秒/tokenA3 全点为 latest 系最优cc8 58.8ms 甚至优于 nightly
基线 64.4ms——图内 AR 亦被 IPC one-shot 优化cc16 183.6 vs A0b 197.7cc64 206.4 vs 224.1)。
## A3 的落地含义
IPC@TP8 机制增益为真且可观(+4.6~9.1%),但补丁包仅兼容 latestsglang 侧 4 文件依赖
新版 runtime_context API而 latest 在本配置上自带 6~11% eager 劣势,两者相抵后
对生产nightly无净收益。**可行落地路径有二**(未执行):
1. 把 IPC 钩子移植回 nightly 的 parallel_state/base_runner真正的增益来源工作量集中在
4 个 sglang 文件的 API 代差适配);
2. 等上游 PR #34528 合入 nightly 镜像后直接启用。
autotune 分裂机制图内形状在启动图捕获时剖析选优cc8 +3.4% 复现了 D 基线全图内
+1.2~3.2% 的收益方向eager 形状在压测中首次使用时剖析,孤立条件下选出的 tactic 在
并发负载下反而劣于静态默认cc16 64.3-65.8 vs 基线 67.2-70.0 分布不重叠)。
EAGLE 配置下 autotune 剖析还会在 r1 引入一次性开销eager 形状首用即剖)。
## A3 夜间镜像移植失败记录2026-09-10 16:05 部署)
IPC 12 文件包在 nightly-dev-20260828 上启动即崩:
`ImportError: cannot import name 'derive_parallel_widths' from
'sglang.srt.runtime_context'`——包内 parallel_state.py 提取自 PR #34528 新版树,
依赖 latest 才有的 runtime_context API。A3 改跑 latest包已在 D 战役 arm3 验证可跑),
对照基线改为 A0blatest stock镜像内 A/BIPC 变量隔离不变。8/8 rank 激活确认。
## A0a TPOT 参考mean秒/token
cc8: 0.0644/0.0625r1/r2图内cc16: 0.1882/0.1784eagercc32: 0.1682r1
## 运维事件记录
- A0a 拆除时容器 zombie大 GPU 容器滞留rm -f 首次失败"PID is zombie and can not be
killed"),第二次 rm 成功、显存归零后正常重部署defunct 进程表残留零内存无害。

View File

@ -0,0 +1,76 @@
#!/bin/bash
# deploy_glm53_a_exp.sh — 方案A(TP8+EAGLE) 配置克隆部署器DSV4 优化点迁移实验 A 基线版。
# 启动参数逐字复刻 deploy_glm53_605.shmd5 fcd9109b60.5 生产同款):
# TP8 / EAGLE 4/1/5 / mem0.90 / MRR16 / chunk8192 / maxpre16384 / fp8KV+hicache3 /
# decode 图桶 1-8 / prefill 图 max8 / ctxlen270336 / 双 parser glm45+glm47
# 用法(环境变量驱动):
# EXP_NAME=glm53-expA0a EXP_IMAGE=lmsysorg/sglang:nightly-dev-20260828-daf63171 bash deploy_glm53_a_exp.sh
# AUTOTUNE=1 -> 去掉 --disable-flashinfer-autotune
# EXTRA_ENV='-e A=1 -e B=2' -> 追加 docker 环境变量
# INJECT_DIR=/path -> 含 inject_manifest.txt每行 relpath:container_path的注入目录
# 缓存挂载(/data/glm53_exp/ 下三目录 + SGLANG_CACHE_DIR全臂恒开保证除研究变量外
# 环境完全一致(与 D 基线战役同款)。原生产容器 glm53-pp4 不动,实验结束 docker start 还原。
set -uo pipefail
NAME=${EXP_NAME:?EXP_NAME required}
IMAGE=${EXP_IMAGE:?EXP_IMAGE required}
AUTOTUNE=${AUTOTUNE:-0}
EXTRA_ENV=${EXTRA_ENV:-}
INJECT_DIR=${INJECT_DIR:-}
PORT=30000
mkdir -p /data/glm53_exp/fi_jit_cache /data/glm53_exp/sglang_cache /data/glm53_exp/triton_cache /data/glm53_exp/logs
docker rm -f "$NAME" >/dev/null 2>&1 || true
for i in $(seq 1 15); do docker ps -a --format '{{.Names}}' | grep -q "^${NAME}$" || break; sleep 2; done
for i in $(seq 1 90); do
m=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | sort -n | tail -1)
echo "drain check ${i}: max_gpu_mem=${m}MiB $(date +%T)"
[ "$m" -lt 2000 ] && break
sleep 10
done
if [ "${m:-99999}" -ge 2000 ]; then echo "DRAIN_TIMEOUT max=${m}MiB"; exit 1; fi
AUTOTUNE_FLAG="--disable-flashinfer-autotune"
if [ "$AUTOTUNE" = "1" ]; then AUTOTUNE_FLAG=""; fi
docker create --gpus all --shm-size 64g --ipc=host -p ${PORT}:${PORT} \
-v /data/hf_models:/data/hf_models \
-v /data/glm53_exp/fi_jit_cache:/root/.cache/flashinfer \
-v /data/glm53_exp/sglang_cache:/root/.cache/sglang \
-v /data/glm53_exp/triton_cache:/root/.triton \
-e SGLANG_CACHE_DIR=/root/.cache/sglang \
$EXTRA_ENV \
--name "$NAME" "$IMAGE" \
python3 -m sglang.launch_server \
--model-path /data/hf_models/GLM-5.3-NVFP4 --tp 8 \
--mem-fraction-static 0.90 --max-running-requests 16 \
--chunked-prefill-size 8192 --max-prefill-tokens 16384 \
--disable-shared-experts-fusion --moe-runner-backend flashinfer_cutlass $AUTOTUNE_FLAG \
--speculative-algorithm EAGLE --speculative-num-steps 4 --speculative-eagle-topk 1 --speculative-num-draft-tokens 5 \
--kv-cache-dtype fp8_e4m3 --enable-hierarchical-cache --hicache-ratio 3 \
--cuda-graph-max-bs-decode 8 --cuda-graph-bs-decode 1 2 3 4 6 8 --cuda-graph-max-bs-prefill 8 \
--context-length 270336 --reasoning-parser glm45 --tool-call-parser glm47 \
--host 0.0.0.0 --port ${PORT} >/dev/null || { echo CREATE_FAILED; exit 1; }
CID=$(docker ps -aq --filter "name=${NAME}")
[ -n "$CID" ] || { echo CREATE_FAILED_NO_CID; exit 1; }
if [ -n "$INJECT_DIR" ] && [ -f "$INJECT_DIR/inject_manifest.txt" ]; then
while IFS=':' read -r rel target; do
case "$rel" in ''|\#*) continue;; esac
docker cp "$INJECT_DIR/$rel" "$CID:$target" || { echo "CP_FAILED $rel"; exit 1; }
done < "$INJECT_DIR/inject_manifest.txt"
fi
docker start "$NAME" || { echo START_FAILED; exit 1; }
READY=0
for i in $(seq 1 90); do
sleep 20
curl -sf localhost:${PORT}/health >/dev/null 2>&1 && { READY=1; break; }
docker ps --format '{{.Names}}' | grep -q "^${NAME}$" || { echo "CONTAINER_DIED at check $i"; docker logs "$NAME" 2>&1 | tail -30; exit 1; }
done
if [ "$READY" != "1" ]; then echo "START_TIMEOUT"; docker logs "$NAME" 2>&1 | tail -40; exit 1; fi
echo "READY at $(date +%H:%M:%S)"
docker logs "$NAME" 2>&1 | grep -m1 "max_total_num_tokens" || true
docker logs "$NAME" 2>&1 | grep -m1 "avail mem" || true
docker ps --filter "name=${NAME}" --format '{{.Names}} {{.Status}}'
echo "DEPLOY_DONE $NAME"