128k low-cc capacity topology: TP2PP4-nomtp winner (60.8 serving, 60.5 v2 delivered, 09-09)

诊断 60.5 排队根因:KV 池 276,864 token 纯容量算术(MLA KV 按 PP 分层切分,
池≈PP 度数倍增;TP8 调参无解,fp8 断言封顶 314,944 < c3 需求 394,752)。
四臂对拍(i128k/o512 冷缓存 cc1-4,PG19 真实语料同窗口映射):
- A-mirror(60.5 现状):c3 起容量排队,cc4 TTFT p50 119.6s,痛点复现
- r37(TP4PP2+MTP):池 384,960,c3 起排队
- B'(TP4PP2 nomtp):池 589,696,c4 零排队
- TP2PP4 nomtp 池 909,632 优胜:cc4 in 5907 / out 23.1 tok/s,
  TTFT p50 全场最优(cc1 15.5s),e2e 88.8s
优胜者验证全过:质量门 7/7;512k 单条 TTFT 88.4s;900k 单条可完成
(单条上限 ~909k 实证);并发上限 c6(cc7 第 7 条起排队);hit90 cc4
输入吞吐 17,625 tok/s、TTFT 7.3s。
60.8 末态:TP2PP4 容器在役(restart=unless-stopped)。
60.5 交付:deploy_glm53_605_v2.sh(一键部署+前置检查,原脚本=回滚路径)。
资产:arm_runner.sh / val_runner.sh / all_summaries.json(26 点全量) /
profile glm53_nvfp4_pro6000_sglang_tp2pp4_hicache.env / CURRENT.md 两行更新。
This commit is contained in:
yy-fighting 2026-09-09 12:43:11 +08:00
parent 498e333730
commit 92517e87f0
8 changed files with 1881 additions and 2 deletions

View File

@ -11,10 +11,10 @@
| 60.2 (6000D-2) | `glm53-nvfp4` 实验容器09-08 晚 TP1PP8 phaserun_phase.sh 实验链进行中) | **他人实验进行中,勿动**(方案 F PD 链已拆除GPU7 曾有外部裸金属任务)。动卡前仍先核实归属 | `profiles/pro6000/glm53_nvfp4_pro6000_pd_{prefill→decode 侧}.env` |
| 60.3 | 无容器,但 8 卡被外部裸金属训练占用(`/data/mas/larm`09-08 晚实测) | 外部任务,勿动(此前台账漏记) | — |
| 60.4 | `glm53-nvfp4`Up:30000restart=unless-stopped09-09 部署) | **TP2PP4 GLM-5.3-NVFP4 在役**60.1 方案 D 生产配方复刻TP2/PP4/mem0.85/MRR48/chunk16384/radix-off/无投机/SM120 三件套/disable-custom-all-reduce/index_topk_freq=4镜像 nightly-dev-20260828-daf63171health 200、生成冒烟通过。09-09 经授权清退外部 vllm 评测流水线tmux `mas` 的 run_multiseed.sh 链,带 --resume 可续跑)后部署;启动脚本 `/root/deploy_s2_test_604.sh`(基于 exp602/deploy_s2_test.sh唯一改动 restart=unless-stopped。旧 `dsv4_scan` 容器仍在盘Exited | `profiles/pro6000/glm53_nvfp4_pro6000_sglang_tp2pp4.env`(同 60.1 D 口径) |
| 60.5 | `glm53-nvfp4`Up 29h | **NVFP4 团队生产**deploy_glm53_605.shmd5 fcd9109b。生产机铁律不实验、不重启、不覆盖脚本 | `profiles/pro6000/glm53_nvfp4_pro6000_sglang_tp8eagle.env`(方案 A 口径) |
| 60.5 | `glm53-nvfp4`Up 29h | **NVFP4 团队生产**deploy_glm53_605.shmd5 fcd9109b。生产机铁律不实验、不重启、不覆盖脚本。**09-09 已交付容量扩容 v2 脚本TP2PP4-hicache 优胜配置,池 909,632/c6/单条 909k与 60.8 现役同款),未执行,择维护窗口跑 `/root/deploy_glm53_605_v2.sh`;回滚=原脚本** | `profiles/pro6000/glm53_nvfp4_pro6000_sglang_tp8eagle.env`(方案 A 口径);待切 `glm53_nvfp4_pro6000_sglang_tp2pp4_hicache.env` |
| 60.6 | 无容器,但 8 卡被外部裸金属实验占用(`/data/hzy/sparse-opd-*`09-08 晚实测) | 外部任务,勿动(此前台账漏记) | — |
| 60.7 | 基本空4 卡仍有 `/home/user/dirA_exp` 外部小任务09-08 晚实测) | 09-08 已拆除清空(方案 F 前身单机实验 + 场景一深优资产留盘),不再恢复 | — |
| 60.8 | `glm53-nvfp4`Up:30000restart=unless-stopped | **r37 PP+MTP verify-graph 口径在役**09-08 深夜取代 A16TP4PP2 + EAGLE 3/1/4 + verify CUDA graph + draft eager + de-GLOO + SYNC_MASK=1279 挂载文件,启动 `bash /root/deploy_ppmtp_r37.sh '--tp 4 --pp-size 2 --disable-overlap-schedule --max-prefill-tokens 16384' mtp 8192 0.88 1 1 0 0`)。质量门 7/7 ×2、conc_test×3、killer×6 零崩溃killer cc16 双种子 **63.8/64.7s vs A16 105.6/96.0s-40%**、TPOT 41.5/39.3ms、TTFT 33s vs 58-61s近乎减半。修复根因=pre-planned 早退路径缺 pp_proxy 补拷(详见 `experiments/pro6000/glm53_ppmtp_r37_verify_graph/`。A16 切回脚本 deploy_glm53_605.sh 留盘sglang_patch2/eagle_worker_common.py 已升级 bisect 版("1"/"0" 语义兼容) | `experiments/pro6000/glm53_ppmtp_r37_verify_graph/`patches+scripts+results 全量);前史 `experiments/pro6000/glm53_ppmtp_r36_degloo/` |
| 60.8 | `glm53-nvfp4`Up:30000restart=unless-stopped | **TP2PP4-nomtp 容量扩容口径在役**09-09 按用户决定取代 r37TP2PP4 + radix/hicache 开 + ctx 1048576 + cu13 栈 9 挂载 + de-GLOOmemfrac 0.85/chunk 8192/MRR 16KV 池 **909,632**,启动 `bash /root/deploy_ppmtp_r37.sh '--tp 2 --pp-size 4 --disable-overlap-schedule --max-prefill-tokens 16384 --disable-custom-all-reduce --context-length 1048576' nomtp 8192 0.85`。四臂对拍优胜vs A-mirror/r37/B'i128k/o512 c1-4c4 输入/输出 **5,907/23.1 tok/s**、TTFT p50 43.4s、并发上限 c6、单条 ~909k900k 实跑、512k 单条 TTFT 88.4s、90% 命中 c4 输入 17,625 tok/s质量门 7/7。r37 的 MTP 优势区间是 i16k/cc≤16切回 = deploy_ppmtp_r37.sh mtp 模式(详见 `experiments/pro6000/glm53_nvfp4_128k_capacity_topology/` | `profiles/pro6000/glm53_nvfp4_pro6000_sglang_tp2pp4_hicache.env`;实验全量 `experiments/pro6000/glm53_nvfp4_128k_capacity_topology/`;前史 r37 `experiments/pro6000/glm53_ppmtp_r37_verify_graph/` |
## 方案 A-F 一览GLM-5.3-NVFP4 @ pro60002026-09-08 双场景报告口径)

View File

@ -0,0 +1,44 @@
# GLM-5.3-NVFP4 SGLang TP=2 PP=4 + hicache deployment profile (single RTX 6000D node, 8 GPUs).
# 2026-09-09 128k 低并发容量扩容实验优胜配置60.8 现役60.5 交付 deploy_glm53_605_v2.sh 待执行)。
# 可执行部署脚本experiments/pro6000/glm53_nvfp4_128k_capacity_topology/scripts/deploy_glm53_605_v2.sh
#
# 与方案 Dglm53_nvfp4_pro6000_sglang_tp2pp4.env的关键差异勿混淆
# - radix/hicache 保持开启60.5 真实流量命中率 90%+,关 radix 不可接受D 为 16k 独立输入场景关了 radix
# - cu13 镜像 + 9 补丁只读挂载de-GLOO request_receiver / decode_cuda_graph_runner_fix 等 r37 栈遗产,
# nomtp 下 spec 相关补丁为惰性de-GLOO 为 PP 通用修复D 用旧镜像 20260828 无挂载
# - --reasoning-parser glm45 --tool-call-parser glm47 齐备(质量门 7/7D 当时 6/7
# - --context-length 1048576模型原生 1MD 未设chunk 8192D 16384MRR 16D 48
# - 实测60.8i128k/o512 冷缓存KV 池 909,632 tokenA 的 3.29×)、并发上限 c6、
# 单条上限 ~909k900k 实跑通过、c4 输入/输出 5,907/23.1 tok/s、TTFT p50 43.4s、
# 512k 单条 TTFT 88.4s、90% 命中 c4 输入 17,625 tok/s
# - memfrac 0.85 为验证档PP0 stage 空闲 22GB 提示 0.88 有余量(未验证,改动须重跑质量门+容量冒烟)
PLATFORM=pro6000
EXPERIMENT=glm53_nvfp4_128k_capacity_topology
MODEL_NAME=GLM-5.3-NVFP4
ENGINE=sglang
RUNTIME=docker
DOCKER_IMAGE=lmsysorg/sglang:nightly-dev-cu13-20260901-07c8f729
CONTAINER_NAME=glm53-nvfp4
MODEL_PATH=/data/hf_models/GLM-5.3-NVFP4
SERVED_MODEL_NAME=/data/hf_models/GLM-5.3-NVFP4
PORT=30000
HEALTH_PATH=/health
HEALTH_WAIT_S=1800
CONTAINER_PYTHON=python3
TP=2
PP=4
MEM_FRACTION_STATIC=0.85
MAX_RUNNING_REQUESTS=16
CHUNKED_PREFILL_SIZE=8192
CONTEXT_LENGTH=1048576
DEVICE_VARS="CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7"
ENGINE_ENV="PYTHONUNBUFFERED=1 SGLANG_PP_DEGLOO=1 SGLANG_PP_SPEC_FORCE_EAGER_DRAFT=1 SGLANG_PP_FORCE_EAGER_VERIFY=0 SGLANG_PP_SPEC_DEBUG=0"
DOCKER_FLAGS="--gpus all --shm-size 64g --ipc=host --cap-add SYS_PTRACE -p ${PORT}:${PORT}"
VOLUMES="/data/hf_models:/data/hf_models + 9 patch ro-mounts (full list in scripts/deploy_glm53_605_v2.sh; files live in /root + /root/sglang_patch2 on the host)"
BOOTSTRAP="python3 -m sglang.launch_server ${LAUNCH_ARGS}"
LAUNCH_ARGS="--model-path ${MODEL_PATH} --tp-size ${TP} --pp-size ${PP} --mem-fraction-static ${MEM_FRACTION_STATIC} --max-running-requests ${MAX_RUNNING_REQUESTS} --chunked-prefill-size ${CHUNKED_PREFILL_SIZE} --disable-shared-experts-fusion --moe-runner-backend flashinfer_cutlass --disable-flashinfer-autotune --reasoning-parser glm45 --tool-call-parser glm47 --enable-hierarchical-cache --hicache-ratio 3 --disable-overlap-schedule --max-prefill-tokens 16384 --disable-custom-all-reduce --context-length ${CONTEXT_LENGTH} --host 0.0.0.0 --port ${PORT}"

View File

@ -0,0 +1,135 @@
# GLM-5.3-NVFP4 128k 低并发容量扩容与拓扑选型实验报告 — 2026-09-09 @ 174.1.60.8
## 一、结论速览
**优胜配置 = TP2PP4 nomtp**radix/hicache 保持开启、`--context-length 1048576`、cu13 栈 9 挂载、memfrac 0.85、chunk 8192
| 维度 | 60.5 现役TP8+EAGLE | 优胜配置TP2PP4 nomtp | 提升 |
|---|---|---|---|
| KV 池token | 276,864 | **909,632** | 3.29× |
| i128k 并发上限 | c2c3 起排队) | **c6**c7 起排队,实测) | 3× |
| 单条请求上限 | 264kctx 270,336 参数所限) | **~909k**900k 实跑通过) | 3.4× |
| c4 输入吞吐 | 3,228 tok/s | **5,907 tok/s** | 1.83× |
| c4 输出吞吐 | 12.6 tok/s | **23.1 tok/s** | 1.83× |
| c4 TTFT p50 | 119.6s | **43.4s** | 64% |
| c4 e2e p50 | 161.3s | **88.8s** | 45% |
| 90% 命中真实流量形态c4 | — | 输入 **17,625 tok/s**、TTFT 7.3s | — |
- 质量门 7/7 通过GSM8K×5 + 中文推理 + tool callPP4+radix+hicache+parser 新组合无 correctness 问题)。
- **60.8 已按用户决定部署优胜配置留役**restart=unless-stopped替代 r37
- **60.5 交付 `deploy_glm53_605_v2.sh`(只交未执行)**,原 `deploy_glm53_605.sh` 原样留盘即回滚路径。
## 二、问题诊断60.5 生产日志实证)
现役容器 `glm53-nvfp4`TP8 + EAGLE 4/1/5memfrac 0.90fp8 KVhicache-ratio 3`--context-length 270336`
1. **"单条最高 256k" 不是模型限制**:模型原生 `max_position_embeddings = 1,048,576`1M。上限来自部署参数 `--context-length 270336`,且 KV 池 276,864 也刚好只装得下一条 26.4 万请求。
2. **排队是纯容量算术**:单条 16~22 万 token 请求占池 0.58~0.90;近期一万行日志 ~13% 的 decode 步有 `#queue-req>0`09-08 有一次池满 retract。日志实例一条 173k95% 命中)请求在 160k 请求 decode 期间排队无法准入。
3. **命中不省并发容量**radix/hicache 只加速重复前缀的 prefill不同文档的并发请求各自全额驻留 KV照样排队。60.5 真实流量 12万~22万 token、命中率 90%+,仍然撞容量墙。
4. **TP8 调参无解(结构性)**:每 token KV 57.3KBMLA 44.9 + DSA indexer ~10fp8_e4m3 已是断言封死的硬顶FP4 启动即 AssertionErrorTP8 全系调参上限 314,94460.6 实测 0.89+hicache4< c3×128k 需求 394,752
## 三、机理:为什么只有 PP 拓扑能解
GLM-5.3 是 MLA/DSA 家族,**KV 在 TP 组内每卡全量复制、只按 PP 分层切**TP8 每卡存全部 78 层 KV15.85GB→276,864 tokenPP2 每卡存半数层×2PP4 每卡存 1/4 层×4实际因 hicache/图开销打折)。**KV 池容量 ≈ PP 度数倍增,与 TP 度数无关**。这就是 TP4PP2≈2.37×、TP2PP4≈3.29×实测的来源。另MTP/EAGLE 的 draft KV + verify 图额外吃池r37 同 memfrac 下 589,696→384,96035%)。
## 四、实验方法
- **平台**60.88×RTX 6000D 85.6GB,与 60.5 同型);四配置臂各部署后跑同窗口。
- **场景**i131072 / o512 / cc∈{1,2,3,4}nreq=8/点PG19 真实语料bench_corpus.pyinput_ids 直发 /generatetemp 0ignore_eosstream
- **公平性协议**每点独立语料窗口cc1→base 10Mcc2→11,048,576cc3→12,097,152cc4→13,145,728**所有臂用同一映射=同文本**;每点前 `POST /flush_cache`(实测连 host 层一起清,复跑命中率 0.0);每臂先做一次不计分的 131k 形状预热吸收内核首触成本实测不做会污染首点16k 首跑 1653 vs 复跑 4526 tok/s
- **指标口径**(沿用 rev20 双场景协议):输入吞吐 = 总输入 token/墙钟;输出吞吐 = 服务端 completion_tokens 总和/墙钟TTFT = 发出→首个流式响应(含排队);命中率从 TP0 Prefill 日志核算。queue-req 日志用于排队取证。
- **配置臂**
- **arm0 r37**60.8 在役原样TP4PP2+EAGLE 3/1/4+verify 图memfrac 0.88,池 384,960
- **arm1 A-mirror**60.5 现役逐参数复刻(旧镜像 20260828池 276,864ctx 270,336
- **arm2 B'**TP4PP2 nomtpmemfrac 0.88ctx 524,288池 589,696
- **arm3 TP2PP4**TP2PP4 nomtpmemfrac 0.85ctx 1048576radix/hicache 开,含 glm45/glm47 parser池 909,632
## 五、主扫数据i128k/o512冷缓存
**输入吞吐tok/s**
| cc | A-mirror池276,864 | r37池384,960 | B'池589,696 | TP2PP4池909,632 |
|---|---|---|---|---|
| 1 | 3,026 | **4,110** | 3,737 | 3,262 |
| 2 | 3,142 | **4,754** | 4,619 | 4,635 |
| 3 | 3,214 | 5,016 | 4,843 | **5,017** |
| 4 | 3,228 | 5,061 | 5,256 | **5,907** |
**输出吞吐tok/s**
| cc | A-mirror | r37 | B' | TP2PP4 |
|---|---|---|---|---|
| 1 | 11.8 | **16.1** | 14.6 | 12.7 |
| 2 | 12.3 | **18.6** | 18.0 | 18.1 |
| 3 | 12.6 | 19.6 | 18.9 | **19.6** |
| 4 | 12.6 | 19.8 | 20.5 | **23.1** |
**TTFT p50 / max**(排队签名 = p50 跳升整请求时长倍数)
| cc | A-mirror | r37 | B' | TP2PP4 |
|---|---|---|---|---|
| 1 | 37.8 | 21.1 | 21.0 | **15.5** |
| 2 | 37.8 / 76.9 | 21.1 / 41.7 | 41.3 | 29.0 |
| 3 | **77.2** / 120.3 | 43.6 / 73.8 | 41.3 / 61.6 | **29.6** / 43.4 |
| 4 | **119.6** / 156.4 | 72.2 / 93.9 | 61.6 / 81.9 | **43.4** / 57.3 |
**e2e p50 / max**
| cc | A-mirror | r37 | B' | TP2PP4 |
|---|---|---|---|---|
| 1 | 43.8 | **31.7** | 35.0 | 40.2 |
| 2 | 83.7 / 121.6 | **55.3** / 76.6 | 56.8 | 56.5 |
| 3 | 121.7 / 163.3 | **75.2** / 105.1 | 80.0 | 75.8 |
| 4 | 161.3 / 201.8 | 103.3 / 125.2 | 99.7 | **88.8** |
**排队证据与机理注解**
- A-mirror池只容 2 条并发c3/c4 排队TTFT p50 77→120sc4 输入吞吐被排队锁死在 3,228prefill 带宽根本没用满)。
- r37池 384,960 同样只容 2 条 + 1 条错峰补位c3/c4 排队TTFT p50 43.6→72.2s;日志 518 行 queue-req>0。**60.8 原在役配置在本场景也不合格。**
- B'c3/c4 全并发准入、零容量排队(稳态 usage 精确停在 0.22/0.45/0.67/0.89e2e p50≈max 波内同步)。日志中的 queue-req 行是 chunk 调度/波间 radix 逐出瞬态秒级非容量排队——判据TTFT 缩放=纯 prefill 带宽分摊cc2 p50=max=41.3≈2×21.0)。
- TP2PP4同上零容量排队且 TTFT 全场最优4 级流水 prefill 重叠最深cc1 TTFT 15.5s、串行 prefill 等效 ~8.5k tok/s代价是 TPOT 最慢cc1 48.4ms vs B' 27.3 vs r37 20.7 vs A 12.0c1 短输出场景 e2e 吃亏40.2sc2 起被并发摊平、c3/c4 反超。
- MTP/EAGLE 观察accept 随并发上升r37 2.91→3.64A-mirror 3.31→4.26verify batch 越大接受越高);但 MTP 的 35% 池代价在本容量场景不划算——r37 全程吞吐被 B'/TP2PP4 压制或打平。
## 六、优胜者TP2PP4附加验证
| 验证项 | 结果 |
|---|---|
| 质量门 | **7/7**GSM8K 72/3/60/63/10 + 鸡兔同笼 23 + tool call get_weather北京 |
| 512k 单条523,776+512 真实语料) | ✅ TTFT 88.4se2e 114.4sTPOT 50.9ms(旧配置直接拒绝) |
| 900k 单条900,000+512 | ✅ TTFT 210.6se2e 237.8s —— **单条上限 ~909k 实证**(池减 512 后的余量) |
| cc5 | ✅ in 5,747 / out 22.5e2e p50≈max 107s零容量排队 |
| cc6 | ✅ in 5,849 / out 22.9e2e p50≈max 122.7s,零容量排队 —— **并发上限 = c6** |
| cc7 | ⚠️ 第 7 条排队TTFT max 138.7s、e2e max 179.7s)—— 边界与池算术吻合7×131,584=921,088 > 909,632 |
| 90% 命中 c460.5 真实流量形态,实测命中 0.8999 | in **17,625** / out 68.9 tok/sTTFT p50 **7.3s**e2e 29.9s —— radix 去重+hicache 对重复查询流量再放大 ~3× |
## 七、方案对比与推荐
| 方案 | 池 | c4 in/out | 容量定位 | 判定 |
|---|---|---|---|---|
| ATP8+EAGLE60.5 现役) | 276,864 | 3,228/12.6 | c2、单条 264k | 本场景被全面支配,淘汰 |
| r37TP4PP2+MTP60.8 昨日在役) | 384,960 | 5,061/19.8 | c2、单条 ~380k | c3 起排队,容量不合格;仅 c1 最优 |
| B'TP4PP2 nomtp | 589,696 | 5,256/20.5 | c4、单条 ~588k512k 单条会占 89% 池、堵死并发) | 强力备选16k 短文本场景历史成绩好 |
| **TP2PP4 nomtp优胜** | **909,632** | **5,907/23.1** | **c6、单条 ~909k、512k 单条+2 并发共存** | 用户需求512k 单条+长上下文为主)下的正解 |
**推荐**60.5 采用 TP2PP4 nomtp`deploy_glm53_605_v2.sh`,参数与 60.8 现役完全一致。决策依据c3/c4/c5/c6 吞吐全场第一 + 唯一满足"512k 单条与并发共存" + 质量门 7/7 + TTFT 全档最优。若 60.5 未来 16k 短文本流量占比显著上升,再评估切 B'(其 s1 短文本历史成绩比 TP2PP4 好 27~48%)。
**留观旋钮**未验证报告只记录不推荐memfrac 0.85→0.88 或可再抬池PP0 空闲 22GB 最大的 stage 不均匀提示有空间TP2PP4+MTP 可修 c1 短输出短板(池约降至 ~59 万,恰为 B' 水平hicache-ratio 3→4 扩 host 前缀池60.6 在 TP8 验证过)。
**r37 角色变化说明**r37 的 MTP 优势区间是 i16k/cc≤1609-09 判决 +6%@cc16),本次让位给容量优先的 TP2PP4 是按用户明确选择执行;若 60.8 未来主要服务短文本低并发,可用 deploy_ppmtp_r37.sh mtp 模式一键切回。
## 八、已证伪 / 排除项(本轮+引用前判)
- TP8 任何调参fp8 KV 断言封顶 + 上限 314,944 < c3 需求 394,75260.6 数据
- r37 现役直接顶上:池 384,960c3 差 1 万 token 仍排队(本轮实测)。
- MTP/EAGLE 换 KV 池draft+verify 图 35% 池,本场景不划算。
- HiSparse 超池驻留:本 nightly 自旋不可用60.6 前判)。
- TP1PP8池 2M 但吞吐 12~33%60.2 前判),仅当需要 >c6 且能接受慢时再议。
- PD 分离/DP/EP前判劣化或不可用与本问题正交。
## 九、资产与复现
- **60.8**:容器 glm53-nvfp4:30000 = 优胜配置restart=unless-stopped。启动命令 = `bash /root/deploy_ppmtp_r37.sh '--tp 2 --pp-size 4 --disable-overlap-schedule --max-prefill-tokens 16384 --disable-custom-all-reduce --context-length 1048576' nomtp 8192 0.85`。实验日志全量:`/root/bench_logs/128kexp/`26 点 SUMMARY 已提取为 all_summaries.json
- **60.5**:交付 `deploy_glm53_605_v2.sh`(内嵌完整 docker run+前置检查+显存归零等待+健康门+回滚提示);回滚 = `bash /root/deploy_glm53_605.sh`。执行前置检查会列出缺失的补丁/镜像清单60.8 /root 均有)。
- **压测复现**`bash /root/arm_runner.sh <arm>`c1-4 四点+形状预热)、`bash /root/val_runner.sh <arm>`512k/900k/cc5-7/hit90语料窗口映射与 flush 协议见第四节;质量门 `bash /root/quality_gate_605.sh`
- **仓库归档**`experiments/pro6000/glm53_nvfp4_128k_capacity_topology/`README=本报告、scripts、results/20260909profile `deploy/profiles/pro6000/glm53_nvfp4_pro6000_sglang_tp2pp4_hicache.env`CURRENT.md 已更新 60.8 行。
*报告与数据ZCode 实验 2026-09-09压测窗口 run-id 9501-9507/9601-9604/9990-9991全部冷缓存口径。*

View File

@ -0,0 +1,3 @@
e782a8767d4478711757669f83adb64b *scripts/arm_runner.sh
f6f5a49937ac6e8a0157ba1eb11b8ee7 *scripts/deploy_glm53_605_v2.sh
8eb75693f01f6055b15ecc3d62feff08 *scripts/val_runner.sh

View File

@ -0,0 +1,36 @@
#!/bin/bash
# 128k capacity experiment - per-arm bench runner (i131072/o512, cc 1-4, nreq 8)
# usage: nohup bash arm_runner.sh <arm-name> >/dev/null 2>&1 &
# per-cc-point corpus windows are distinct but the mapping is identical for every arm:
# cc1 base 10000000, cc2 11048576, cc3 12097152, cc4 13145728 (all in consumed space, flushed)
ARM=${1:?arm name required}
URL=http://127.0.0.1:30000
LOGD=/root/bench_logs/128kexp
mkdir -p $LOGD
echo "$(date +%T) [$ARM] start" >> $LOGD/${ARM}_progress.log
# wait until server idle (no running/queued requests in recent logs)
for i in $(seq 1 60); do
R=$(docker logs --since 20s glm53-nvfp4 2>&1 | grep -cE 'running-req: [1-9]|queue-req: [1-9]')
if [ "$R" -eq 0 ]; then break; fi
sleep 10
done
flush() { curl -s -X POST $URL/flush_cache >/dev/null; sleep 2; }
# shape warmup (not scored): one 128k prefill to absorb kernel first-touch cost
flush
python3 /root/bench_corpus.py --input-len 131072 --output-len 64 --shared-frac 0 \
--concurrency 1 --num-requests 1 --run-id 9991 --pool-override 17000000 \
> $LOGD/${ARM}_warmup.log 2>&1
echo "$(date +%T) [$ARM] warmup done" >> $LOGD/${ARM}_progress.log
declare -A BASE=( [1]=10000000 [2]=11048576 [3]=12097152 [4]=13145728 )
for CC in 1 2 3 4; do
flush
python3 /root/bench_corpus.py --input-len 131072 --output-len 512 --shared-frac 0 \
--concurrency $CC --num-requests 8 --run-id 950${CC} --pool-override ${BASE[$CC]} \
> $LOGD/${ARM}_cc${CC}.log 2>&1
echo "$(date +%T) [$ARM] cc$CC done rc=$?" >> $LOGD/${ARM}_progress.log
done
echo "ALL-DONE" >> $LOGD/${ARM}_progress.log

View File

@ -0,0 +1,129 @@
#!/bin/bash
# deploy_glm53_605_v2.sh — GLM-5.3-NVFP4 60.5 生产容量扩容配置2026-09-09 交付)
#
# 目的:解决 60.5 现役 TP8+EAGLE 配置的 KV 池容量问题(池 276,864 token
# - 单条请求上限 264k--context-length 270336 所致,模型原生支持 1M
# - 并发>1 且总 token>~26 万时排队i128k 下 c3 起必然排队)
# 本配置 = 2026-09-09 在 60.8 同型机8×RTX 6000D四臂对拍优胜者
# TP2 PP4 nomtp + radix/hicache 开 + ctx 1M + cu13 栈 9 挂载
# 实测池 909,632 token3.29×i128k 并发上限 c2→c6单条上限 264k→909k
# c4 输入/输出吞吐 5907/23.1 tok/s现役口径 3228/12.6 的 1.83×/1.83×
# 质量门 7/7。完整数据experiments/pro6000/glm53_nvfp4_128k_capacity_topology/
#
# ⚠️ 运维提示:
# 1) 在维护窗口执行:会移除现役 glm53-nvfp4 容器,停机约 10-15 分钟(权重加载+健康)。
# 2) 回滚 = 原脚本原样留盘bash /root/deploy_glm53_605.shTP8+EAGLE 原配置)。
# 3) 与 60.8 现役(本配置已留役)一致,脚本可互相对拍 md5。
#
# 用法: bash deploy_glm53_605_v2.sh # 部署到 30000 端口
# ROLLBACK_ONLY=1 bash deploy_glm53_605_v2.sh # 仅回滚到原配置
set -u
IMAGE=lmsysorg/sglang:nightly-dev-cu13-20260901-07c8f729
PORT=30000
# ---- 前置检查(缺什么给什么清单,不猜) ----
MISSING=0
if [ -z "$(docker images -q $IMAGE 2>/dev/null)" ]; then
echo "[MISS] 镜像不存在: $IMAGE"
echo " 拉取: docker pull $IMAGE"
echo " 或从 60.8 导: ssh 60.8 'docker save $IMAGE | gzip' | gunzip | docker load"
MISSING=1
fi
MOUNTS=(
"/root/sglang_patch2/layer_setup.py"
"/root/sglang_patch2/validation_hook.py"
"/root/eagle_worker_v2_mask.py"
"/root/sglang_patch2/eagle_worker_common.py"
"/root/sglang_patch2/deepseek_nextn.py"
"/root/scheduler_pp_mixin_r35.py"
"/root/request_receiver_degloo.py"
"/root/sglang_patch2/deepseek_v2.py"
"/root/decode_cuda_graph_runner_fix.py"
)
for f in "${MOUNTS[@]}"; do
if [ ! -f "$f" ]; then
echo "[MISS] 补丁文件缺失: $f"
MISSING=1
fi
done
if [ "$MISSING" = "1" ]; then
echo "[STOP] 上述文件在 60.8 /root 均有(含 sglang_patch2/ 子目录scp 全部补齐后重跑本脚本。"
exit 1
fi
if [ "${ROLLBACK_ONLY:-0}" = "1" ]; then
echo "[rollback] 恢复 60.5 原生产配置TP8+EAGLE..."
exec bash /root/deploy_glm53_605.sh
fi
# ---- 移除旧容器(等待显存归零,纪律:重部署前必等显存<1500MiB ----
docker update --restart=no glm53-nvfp4 >/dev/null 2>&1
for i in 1 2 3 4 5 6 7 8; do
docker rm -f glm53-nvfp4 >/dev/null 2>&1
docker ps -a --format '{{.Names}}' | grep -q '^glm53-nvfp4$' || break
sleep 5
done
if docker ps -a --format '{{.Names}}' | grep -q '^glm53-nvfp4$'; then
echo "[ERROR] 旧容器删不掉zombie 时重试即可)"; exit 1
fi
echo "[wait] 等待显存释放 (<1500MiB/卡)..."
for i in $(seq 1 60); do
MAXMI=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | sort -rn | head -1)
[ "$MAXMI" -lt 1500 ] && break
sleep 5
done
echo "[wait] 显存就绪 (${MAXMI}MiB max)"
# ---- 部署优胜配置(与 60.8 实验臂 arm3_TP2PP4 完全一致) ----
docker run -d --name glm53-nvfp4 --gpus all --shm-size 64g --ipc=host --cap-add SYS_PTRACE \
-v /root/sglang_patch2/layer_setup.py:/sgl-workspace/sglang/python/sglang/srt/model_executor/model_runner_components/layer_setup.py:ro \
-v /root/sglang_patch2/validation_hook.py:/sgl-workspace/sglang/python/sglang/srt/arg_groups/validation_hook.py:ro \
-v /root/eagle_worker_v2_mask.py:/sgl-workspace/sglang/python/sglang/srt/speculative/eagle_worker_v2.py:ro \
-v /root/sglang_patch2/eagle_worker_common.py:/sgl-workspace/sglang/python/sglang/srt/speculative/eagle_worker_common.py:ro \
-v /root/sglang_patch2/deepseek_nextn.py:/sgl-workspace/sglang/python/sglang/srt/models/deepseek_nextn.py:ro \
-v /root/scheduler_pp_mixin_r35.py:/sgl-workspace/sglang/python/sglang/srt/managers/scheduler_pp_mixin.py:ro \
-v /root/request_receiver_degloo.py:/sgl-workspace/sglang/python/sglang/srt/managers/scheduler_components/request_receiver.py:ro \
-v /root/sglang_patch2/deepseek_v2.py:/sgl-workspace/sglang/python/sglang/srt/models/deepseek_v2.py:ro \
-v /root/decode_cuda_graph_runner_fix.py:/sgl-workspace/sglang/python/sglang/srt/model_executor/runner/decode_cuda_graph_runner.py:ro \
-e SGLANG_PP_DEGLOO=1 -e SGLANG_PP_SPEC_FORCE_EAGER_DRAFT=1 -e SGLANG_PP_FORCE_EAGER_VERIFY=0 -e SGLANG_PP_SPEC_DEBUG=0 \
--restart no -p ${PORT}:${PORT} \
-v /data/hf_models:/data/hf_models \
$IMAGE \
python3 -m sglang.launch_server \
--model-path /data/hf_models/GLM-5.3-NVFP4 \
--tp 8 \
--mem-fraction-static 0.85 \
--max-running-requests 16 \
--chunked-prefill-size 8192 \
--disable-shared-experts-fusion \
--moe-runner-backend flashinfer_cutlass \
--disable-flashinfer-autotune \
--reasoning-parser glm45 --tool-call-parser glm47 \
--enable-hierarchical-cache --hicache-ratio 3 \
--tp 2 --pp-size 4 --disable-overlap-schedule --max-prefill-tokens 16384 \
--disable-custom-all-reduce --context-length 1048576 \
--host 0.0.0.0 --port ${PORT}
echo "[deploy] TP2PP4-nomtp 容量扩容配置启动,等待健康(最长 1800s..."
for i in $(seq 10 10 1800); do
code=$(curl -s -o /dev/null -m3 -w '%{http_code}' http://127.0.0.1:${PORT}/health 2>/dev/null)
if [ "$code" = "200" ]; then
echo "[OK] healthy after ${i}s"
docker update --restart=unless-stopped glm53-nvfp4 >/dev/null && echo "[OK] restart=unless-stopped 已设置"
POOL=$(docker logs glm53-nvfp4 2>&1 | grep -m1 -oE 'max_total_num_tokens=[0-9]+')
echo "[INFO] ${POOL} (60.8 同型机实测 909632若显著低于此值请停下核查)"
echo "[NEXT] 质量门: bash /root/quality_gate_605.sh 期望 PASS=7 FAIL=0"
echo "[NEXT] 容量冒烟: 300k 单条请求应能正常完成(旧配置会直接拒绝)"
exit 0
fi
if ! docker ps --format '{{.Names}}' | grep -q '^glm53-nvfp4$'; then
echo "[DIED] 容器启动失败,最近错误:"
docker logs --tail 40 glm53-nvfp4 2>&1 | grep -iE 'error|assert|not support' | tail -8
echo "[回滚] bash /root/deploy_glm53_605.sh"
exit 1
fi
sleep 10
done
echo "[TIMEOUT] 健康等待超时;回滚: bash /root/deploy_glm53_605.sh"
exit 1

View File

@ -0,0 +1,48 @@
#!/bin/bash
# winner validation runner (TP2PP4): big singles, cc boundary, 90%-hit point
# usage: nohup bash val_runner.sh <arm-name> >/dev/null 2>&1 &
ARM=${1:?arm name required}
URL=http://127.0.0.1:30000
LOGD=/root/bench_logs/128kexp
echo "$(date +%T) [$ARM] val start" >> $LOGD/${ARM}_progress.log
for i in $(seq 1 60); do
R=$(docker logs --since 20s glm53-nvfp4 2>&1 | grep -cE 'running-req: [1-9]|queue-req: [1-9]')
if [ "$R" -eq 0 ]; then break; fi
sleep 10
done
flush() { curl -s -X POST $URL/flush_cache >/dev/null; sleep 2; }
# 1) 512k single (real corpus): 523776+512 = 524288
flush
python3 /root/bench_corpus.py --input-len 523776 --output-len 512 --shared-frac 0 \
--concurrency 1 --num-requests 1 --run-id 9601 --pool-override 10000000 \
> $LOGD/${ARM}_single512k.log 2>&1
echo "$(date +%T) [$ARM] single512k rc=$?" >> $LOGD/${ARM}_progress.log
# 2) 900k single (pool ceiling probe): 900000+512 = 900512 vs pool 909632
flush
python3 /root/bench_corpus.py --input-len 900000 --output-len 512 --shared-frac 0 \
--concurrency 1 --num-requests 1 --run-id 9602 --pool-override 10000000 \
> $LOGD/${ARM}_single900k.log 2>&1
echo "$(date +%T) [$ARM] single900k rc=$?" >> $LOGD/${ARM}_progress.log
# 3-5) cc boundary: 5 / 6 fit, 7 exceeds pool (921088 > 909632) -> expect queuing
declare -A BASEB=( [5]=10000000 [6]=11048576 [7]=12097152 )
for CC in 5 6 7; do
flush
python3 /root/bench_corpus.py --input-len 131072 --output-len 512 --shared-frac 0 \
--concurrency $CC --num-requests 8 --run-id 950${CC} --pool-override ${BASEB[$CC]} \
> $LOGD/${ARM}_cc${CC}.log 2>&1
echo "$(date +%T) [$ARM] cc$CC rc=$?" >> $LOGD/${ARM}_progress.log
done
# 6) 90%-hit cc4 point (mirrors 60.5 real traffic: shared 117968 + unique 13104x8)
flush
python3 /root/bench_corpus.py --input-len 131072 --output-len 512 --shared-frac 0.9 \
--concurrency 4 --num-requests 8 --run-id 9604 --pool-override 15000000 \
> $LOGD/${ARM}_hit90_cc4.log 2>&1
echo "$(date +%T) [$ARM] hit90_cc4 rc=$?" >> $LOGD/${ARM}_progress.log
echo "VAL-ALL-DONE" >> $LOGD/${ARM}_progress.log