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:
parent
c5d91ceafe
commit
2370d33c73
@ -0,0 +1,50 @@
|
||||
# DSV4 优化点迁移·A 基线战役报告 — GLM-5.3-NVFP4 TP8+EAGLE @ 60.1(2026-09-10)
|
||||
|
||||
继 D 基线战役(同目录 REPORT.md)之后,应用户要求把同一组 DSV4 优化手段搬到
|
||||
**方案 A(TP8+EAGLE 生产配方)** 基线上重测。口径不变:i16384/o512/cc 8-64 五点、
|
||||
输出吞吐高者优、每臂门+三轮取中位、同语料固定窗口(radix 开启下实测零缓存污染)。
|
||||
|
||||
基线配置 = deploy_glm53_605.sh 逐字复刻(60.5 生产同款,md5 fcd9109b):
|
||||
TP8 / EAGLE 4/1(draft 内嵌主权重)/ 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 ≈0(cc8 +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_runner(4 文件 API 代差适配);② 等上游合入 nightly 后直接开。
|
||||
|
||||
## A 基线自身的重要画像(比优化点本身更有价值)
|
||||
|
||||
1. **掉图陷阱主导场景二**:生产 A 的 decode 图只到 bs8,MRR16 → cc16-64 全程 eager
|
||||
decode(`cuda graph: False`),TPOT 168-197ms vs 图内 62-64ms,吞吐平台 ~70-73。
|
||||
已发表"场景二 A 行 95.3/96.2(TPOT 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-32):MRR16 封顶后平台 ~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_widths,runtime_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*.log(25 个)、/data/glm53_exp/logs/{deploy,chain,gate}_A*.log
|
||||
|
||||
## 机器状态
|
||||
|
||||
- 实验 5 个容器(expA0a/0b/2/3/5)全部拆除;生产 glm53-pp4 docker start 还原+核验
|
||||
- 拆除运维坑:A0a 容器出现 zombie(rm -f 首杀失败,重试成功,显存归零后正常)
|
||||
@ -0,0 +1,89 @@
|
||||
# 原始压测数据 — DSV4 优化点迁移实验·A 基线(TP8+EAGLE)战役(60.1,2026-09-10)
|
||||
|
||||
口径:与 D 基线战役完全一致 —— i16384 / o512 / cc∈{8,16,32,40,64},输出吞吐 tok/s
|
||||
(bench_corpus.py,PG19 真实语料固定窗口 run-id 9311-9313 池C + 9314/9315 pool-override),
|
||||
每臂 3 轮取中位,cc40/64 点 nreq=80/128。
|
||||
|
||||
## A 配置基线的两条路径(读数前必读)
|
||||
|
||||
生产 A 配方(deploy_glm53_605.sh,60.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.2,TPOT 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 nightly,1轮) | 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 | 判定 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| A0b(latest 镜像) | +2.0% | −6.4% | −7.1% | −8.3% | −11.1% | **镜像门判负→留 nightly**(cc8 图内中性偏好,eager 全降) |
|
||||
| A2(autotune@nightly) | **+3.4%** | −5.8% | −4.8% | −8.9% | −9.4% | **净判负**:图内点真胜、eager 四点全败(cc16 分布不重叠) |
|
||||
| A3(IPC@latest,vs 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 论断一致) |
|
||||
| A3(vs 生产 nightly A0a 净效应) | +7.2% | −2.0% | +1.3% | −1.7% | −5.0% | **净≈打平**:IPC 收益被 latest 镜像自身 eager 劣势抵消 |
|
||||
|
||||
TPOT 副指标(r1 mean,秒/token):A3 全点为 latest 系最优(cc8 58.8ms 甚至优于 nightly
|
||||
基线 64.4ms——图内 AR 亦被 IPC one-shot 优化;cc16 183.6 vs A0b 197.7;cc64 206.4 vs 224.1)。
|
||||
|
||||
## A3 的落地含义
|
||||
|
||||
IPC@TP8 机制增益为真且可观(+4.6~9.1%),但补丁包仅兼容 latest(sglang 侧 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 验证可跑),
|
||||
对照基线改为 A0b(latest stock,镜像内 A/B,IPC 变量隔离不变)。8/8 rank 激活确认。
|
||||
|
||||
|
||||
## A0a TPOT 参考(mean,秒/token)
|
||||
|
||||
cc8: 0.0644/0.0625(r1/r2,图内);cc16: 0.1882/0.1784(eager);cc32: 0.1682(r1)。
|
||||
|
||||
## 运维事件记录
|
||||
|
||||
- A0a 拆除时容器 zombie(大 GPU 容器滞留,rm -f 首次失败"PID is zombie and can not be
|
||||
killed"),第二次 rm 成功、显存归零后正常重部署;defunct 进程表残留零内存无害。
|
||||
@ -0,0 +1,76 @@
|
||||
#!/bin/bash
|
||||
# deploy_glm53_a_exp.sh — 方案A(TP8+EAGLE) 配置克隆部署器,DSV4 优化点迁移实验 A 基线版。
|
||||
# 启动参数逐字复刻 deploy_glm53_605.sh(md5 fcd9109b,60.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"
|
||||
Loading…
x
Reference in New Issue
Block a user