ciprianveg/gb10-glm-5.2
GitHub: ciprianveg/gb10-glm-5.2
在 8 节点 GB10 集群上通过 TP8+MTP 部署 GLM-5.2-Int4-Int8 量化大模型的高性能推理方案,包含针对 vLLM 的多项深度补丁与调度优化。
Stars: 6 | Forks: 0
# gb10-glm-5.2 — 在 8× DGX Spark (GB10, sm_121) 上运行 GLM-5.2-Int4-Int8Mix
## 概述
在 **8 节点 GB10 集群** 上通过 TP8 + PP1 及 MTP k=4 部署 [QuantTrio/GLM-5.2-Int4-Int8Mix](https://huggingface.co/QuantTrio/GLM-5.2-Int4-Int8Mix) (检查点内 MTP)。
**当前生产环境配置:** TP8 + PP1 (1,211 t/s prefill,35 t/s 连贯语料库 decode,54 t/s 游戏 benchmark,91/100 工具评估 — 依赖 `fix-fsm-toolcall` 修改来实现稳定的 MTP 工具调用)
**实验性配置:** TP4 + PP2 达到 1800tps prefill,但 MTP 接受率受阻,约为 8%,而预期约为 85%
| 配置 | Prefill (t/s) | Decode (t/s) | MTP 接受率 |
|--------|--------------|--------------|----------------|
| **TP8+PP1 (生产)** | **~1,211** | **~35** | ~85% |
| TP4+PP2 (实验) | ~1,800 | ~12 | ~8% |
## 快速开始
```
# 1. Clone dependencies
git clone https://github.com/eugr/spark-vllm-docker ../spark-vllm-docker
cd ../spark-vllm-docker && ./run-recipe.sh --discover # generates .env with cluster IPs
# 2. Build image
cd ../gb10-glm-5.2
./build.sh # builds + copies to all 7 workers (~13 min)
# ./build.sh --solo # 仅 build
# 3. Deploy & run(从 spark-vllm-docker)
cd ../spark-vllm-docker
./run-recipe.sh ../gb10-glm-5.2/recipes/glm52-int4int8-v16.yaml --setup
```
## 构建 Stack
以 CosmicRaisins 的 DCP1 方案 (TP8+PP1, MTP k=4, B12X_MLA_SPARSE) 为起点,此镜像升级至 codex/fathomless-firmament-v16-unified-20260712 统一分支,并添加了针对性的补丁和运行时修改。
### 基础版本
| 组件 | 版本 | 原因 |
|-----------|---------|-----|
| vLLM fork | `local-inference-lab/vllm` @ `5dffea8` (分支 `codex/fathomless-firmament-v16-unified-20260712`) | DSpark 支持,SM120 PCIe 服务,GLM-5.2 MTP kernel,MRv2 model runner,B12X MoE 集成 |
| b12x | `lukealonso/b12x` @ `97b3d64` (master) | W4A8 MoE,统一 SM120 稀疏 MLA,PCIe DCP collectives,decode 优化 (在旧分支上使用 MTP k=4 约为 28–49 t/s → 提升至 33–55 t/s 区间) |
| CUDA | 13.2.0 | GB10 / sm_121 支持 |
| PyTorch | 2.11.0 | 由 v16 分支锁定 |
| FlashInfer | 预构建的 sm_121 wheels | 稀疏 MLA attention kernel |
| NCCL | 2.30.4 (自定义 aarch64) | 支持 3 节点 mesh ring |
| transformers | ≥5.0 (`--tf5` 构建标志) | GLM-5.2 模型定义所需 |
### 补丁 (patches/v16-final/)
| 补丁 | 用途 | 生产环境? |
|-------|---------|:-----------:|
| `01-pr72-1-draft-dcp-config-propagation.patch` | DCP 配置 → draft 模型 (防止在 DCP>1 时 MTP 崩溃)。来自 CosmicRaisins 的 PR #72。 | ✅ |
| `03-draft-quant-packed-mapping.patch` | 量化 NextN draft token 映射 (如果没有此补丁,量化的 draft 会静默构建为未量化,导致 MTP 接受率暴跌)。来自 CosmicRaisins。 | ✅ |
| `04-v16-essential.patch` | 三个修复:(1) DeepSeekMTP `SupportsPP` 接口,(2) flashinfer_sm120 稀疏 MLA 中陈旧的 `topk_indices_buffer` (来自 PR #46994),(3) PP 下的 MTP `embed_tokens` 加载。 | ✅ |
| `06-b12x-stale-topk-buffer.patch` | 将相同的陈旧 `topk_indices_buffer` 修复应用于 `b12x_mla_sparse.py` (PR #46994 中的修复 #4)。如果没有此补丁,`_maybe_share_lm_head` 会替换 indexer 的 buffer,但后端仍持有陈旧的引用 → 导致无效的 DSA attention 且接受率约为 30% 而非 ~85%。 | ✅ |
| `05-pp-mtp-broadcast-and-draft-relay.patch` | PR #46994 修复 #2 (将 padding 广播至 `max_sample_len`) + 修复 #3 (draft token 中继至非最后一个 PP rank)。 | 仅限 PP2 |
| `07-draft-pp-size-fix.patch` | 设置 draft `pipeline_parallel_size=1` 而不是复制 target 的值。 | 仅限 PP2 |
**生产镜像 (TP8+PP1) 仅使用补丁 01、03、04、06。**
### 运行时修改
**`fix-fsm-toolcall`** (PR #44993) — 修复在工具调用 + MTP 期间出现的 `"Failed to advance FSM"` 错误。v16 fork 已包含 PR #44297 (`trim_reasoning_for_advance`) 和 #46149 (结构化标签中的 `reasoning=reasoning_enabled`),但 `should_advance()` 仍使用 `num_computed_tokens - num_output_placeholders` 来推导 delta 窗口 —— 这在 MTP 拒绝时会失效 (placeholder 数量保持 >0,窗口起点越过 reasoning-end 标记,语法从未被强制执行 → HTTP 500)。此修改将 `new_token_ids` 直接传递给 `should_advance()`,绕过有缺陷的 placeholder 计算,并将同步推进 (same-step advance) 扩展到所有后端类型。
**`decode-aware-scheduler`** (penguinchang,NVIDIA 开发者论坛 2026-07-15) — 防止在并发负载下,长 prefill 请求耗尽 decode 流的资源。当 decode 处于活动状态时,prefill 被限制在共享的 token 预算内 (生产环境中为 256 tokens/step);当空闲时,prefill 获得完整的 batched token 预算。每个 step 最多只能有 1 个长 prefill,并进行轮转 (round-robin)。将 decode 停顿从数秒的阻塞减少至约 0.5 秒。有关调优指南,请参见 [mods/decode-aware-scheduler/README.md](mods/decode-aware-scheduler/README.md)。
## 配方文件 (Recipe Files)
- `recipes/glm52-int4int8-v16.yaml` — **生产环境** (TP8+PP1, DCP=1, MTP k=4)
- `recipes/glm52-int4int8-v16-pp2.yaml` — **实验性** (TP4+PP2, MTP k=4, MTP 接受率低)
两个配方文件都引用相同的镜像标签:`vllm-node-tf5-glm52-v16:latest`
## 环境要求
- 8× GB10 / DGX Spark (sm_121, aarch64)
- 节点间 RoCE v2 (ConnectX-7, 子网 192.168.177.0/24)
- 每个节点约 410 GB 权重 (或通过 NFS 挂载)
- eugr/spark-vllm-docker 用于构建 + 部署
## 性能表现 (llama-benchy, 连贯语料库, tg=1500)
| 深度 | Prefill (t/s) | 平均 decode (t/s) | 峰值 decode (t/s) | TTFR (ms) |
|-------|--------------:|-----------------:|------------------:|----------:|
| 0 | 1,211 ± 0.9 | 34.9 ± 2.8 | 53.5 ± 3.5 | 1,693 |
| 4k | 1,117 ± 100.7 | 38.3 ± 0.5 | 58.0 ± 0.0 | 5,461 |
| 16k | 1,215 ± 23.8 | 37.7 ± 0.0 | 58.0 ± 0.0 | 14,867 |
| 32k | 1,176 ± 4.7 | 33.3 ± 2.7 | 54.5 ± 2.5 | 28,963 |
| 100k | 1,128 ± 0.9 | 34.8 ± 3.8 | 51.5 ± 1.5 | 90,448 |
| 200k | 1,019 ± 0.0 | 37.8 ± 0.0 | 50.0 ± 0.0 | 198,327 |
**游戏 benchmark (Snake, 1500 tokens, temp=0, thinking=已禁用):** 持续速度为 54.16 tok/s
```
=== Game Benchmark (Single-Stream, temp=0, thinking=disabled) ===
Waiting for server to be ready...
Server ready after 1s
Running game benchmark (Snake game generation)...
Completion tokens: 1500
Prompt tokens: 43
Total tokens: 1543
Wall time: 27.69s
Average tok/s: 54.16
```
**代码上下文** (与上述连贯语料库相比):单一流 (single-stream) 下平均生成速度为 40–55 t/s,在 2 个并发请求下为 60–70 t/s。
**长上下文代码 benchmark** (4000-token 输入,1500-token 输出,单一流):
```
=== Long-Context Benchmark ===
Type: coding
Target input: 4000 tokens
Output: 1500 tokens
Actual tokens: 3999 tokens (confirmed by server)
Sending request (streaming via httpx)...
============ Result ============
Input tokens: 4012
Output tokens: 1500
Wall time: 34.33s
TTFT: 2996.0 ms
Prefill tok/s: 1339.1
Gen tok/s: 47.8
Mean ITL: 20.9 ms
```
### 工具评估 (tool-eval-bench v2.0.0)
| 指标 | 得分 |
|--------|------:|
| **总体质量** | 91 / 100 (★★★★★ 优秀) |
| 响应能力 | 43 / 100 (中位回合:3.6s) |
| 可部署性 | 77 / 100 (α=0.7) |
| 通过率 | 59 通过,8 部分通过,2 失败 (126/138 pts) |
| Token 效率 | 0.6 pts/1K tokens (共 210K tokens) |
| 最弱类别 | Toolset Scale (62%) |
## 许可证
Apache-2.0 (本仓库)。部署 MIT 权重 (GLM-5.2 由 Z.ai 提供 → QuantTrio 量化版本)。
标签:DLL 劫持, GB10, vLLM, 人工智能, 大语言模型, 推理优化, 模型量化, 用户模式Hook绕过, 请求拦截, 逆向工具, 集群计算