tonyd2wild/GLM-5.2-QuantTrio-200K-4x-DGX-Spark--36tok-s
GitHub: tonyd2wild/GLM-5.2-QuantTrio-200K-4x-DGX-Spark--36tok-s
该方案提供了在 4× DGX Spark (GB10) 集群上部署全质量 GLM-5.2 模型的完整配方,通过 Int4-Int8Mix 混合精度量化与 MTP 推测解码实现 200K 上下文的高性能推理服务。
Stars: 65 | Forks: 8
# 在 4× DGX Spark 上运行 GLM-5.2(未剪枝的 QuantTrio Int4-Int8Mix) — 单流峰值 36 tok/s,200K context
## TL;DR
- **你能得到什么:** 全质量的 GLM-5.2 — 未剪枝的 QuantTrio `GLM-5.2-Int4-Int8Mix`
checkpoint,**保留了全部 256 个专家**(无 REAP/专家剪枝),跨 4× GB10 提供
200K context 服务,支持 MTP k=5 推测解码(speculative decode)、`fp8_ds_mla` KV、完整的 CUDA graphs 以及 vLLM
原生多节点(无需 Ray)。
- **测试数据(2026-07-17 配置):** **单流平均 32.5 tok/s,峰值 36.0**(预热后,单实例),
**6 并发时聚合速度为 65-75 tok/s**,200,000-token context,未剪枝。设置 `enable_thinking:false` 时,
首个可见 token 仅需 **0.36 秒**。
- **内置 Drafter:** MTP drafter 位于 checkpoint 中(layer 78) — 无需单独
下载、对齐或版本匹配 drafter 模型;`--speculative-config` 只需直接
指向 checkpoint 本身。
- **适用人群:** 拥有 4× DGX Spark (GB10) RoCE 集群,并希望复现
全质量 GLM-5.2 服务,而不是经过外科手术式精简模型的任何人。
## 硬件
- **4× NVIDIA DGX Spark (GB10)** — 每台 121 GB 统一内存。
- **四个节点之间采用 RoCE fabric。** 我们使用 CRS812 交换机,fabric 子网为
`192.168.192.0/24`,**端到端 MTU 9000(巨型帧/Jumbo frames)** — 包括交换机和
每个 NIC。如果 NCCL 能识别 IB 设备,直连线缆 mesh 也是可行的。
- **每个节点约 420 GB 可用磁盘空间** — 包含 405 GB 权重、镜像、缓存及预留空间。
**内存预算。** 405 GB 权重 → 在 TP=4 下**每个节点约 95 GiB 权重**(实测 98.07 GiB)。
在 121 GB 统一内存的 GB10 上,这为 KV cache、CUDA graphs 和 OS 留出了真正的空间。
相比之下,429 GB NVFP4 混合模型为:约 107 GB/节点 — 这是一个极其紧绷的临界点,一旦 page cache 或
预热分配稍作变动就会发生 OOM。
## 快速开始
前置条件(均在[设置](#setup-detailed)中说明):每个节点上均需配置修改过的 vLLM 镜像,
在 `/var/tmp/models` 中准备好 405 GB 的 checkpoint,在 `~/glm-triton` 中准备好 10 个 Triton kernels,以及 NCCL 2.30.4。然后,从**主节点**执行:
```
# 1. Edit the EDIT-marked config block in launch.sh (node IPs, SSH user/key, HCA + interface names).
# 2. Sanity-check the generated docker commands first.
./launch.sh --dry-run
# 3. Launch (workers start headless first, head last).
./launch.sh
# 4. Smoke test — ready after ~12 min weight load + ~10 min cudagraph warmup.
curl -s http://localhost:8210/v1/models
```
每个节点执行普通的 `docker run`;vLLM 原生多节点(`--nnodes/--node-rank`),**无需 Ray**。
`./launch.sh --stop` 会通过 `docker rm -f` 移除每个节点上的容器。
## 设置(详细)
步骤 和 步骤 运行在一台构建机器上(任意一台 Spark 均可)。步骤
涉及**每个节点**。步骤 仅从主节点运行。在通过步骤 分发镜像之前,请将步骤
(indexer 补丁)作为步骤 烘焙过程的一部分执行。
### 镜像与修改(步骤 a, b, h)
**a. 构建 vLLM 镜像(约 35-60 分钟)。** 克隆
[eugr/spark-vllm-docker](https://github.com/eugr/spark-vllm-docker) 并基于指定的
vLLM commit 进行构建:
```
git clone https://github.com/eugr/spark-vllm-docker
cd spark-vllm-docker
# PIN THE HARNESS. Later harness commits carry inline vLLM patches that do not
# apply to our pinned ref (the build fails at an llm_base_proposer.py hunk),
# and harness HEAD moves fast.
git checkout 4ed3ebf
# DISABLE THE HARNESS'S PRESET-PR AUTO-MERGE. By default ("auto"), when no
# --apply-vllm-pr is given, the Dockerfile merges a preset list of vLLM PRs
# fetched LIVE from GitHub. Those branches have moved since this recipe was
# written: merging them today fast-forwards the pinned ab666069 to current
# vLLM main. The build still "succeeds" -- and the engine then dies at
# KV-cache init (view 576 vs 656 B/token) with the b12x backend missing.
# (build-and-copy.sh's own APPLY_PRESET_VLLM_PRS=false default is NOT
# forwarded to docker build, so this sed is required.)
sed -i 's|^ARG VLLM_APPLY_PRESET_PRS=""|ARG VLLM_APPLY_PRESET_PRS="false"|' Dockerfile
./build-and-copy.sh --vllm-ref ab666069935c1f23e8ef56038b4659ac9e8f19f8 \
-t vllm-node-tf5-glm52-b12x:probe --tf5
# VERIFY THE PIN HELD. The wheel version must be a dev build AT the pin:
# grep -oE "vllm==[0-9a-z.+]*" build.log | tail -1 -> ...dev190+gab6660699...
# If it reads dev893+g52b6667xx (or any other suffix), the tree was silently
# un-pinned and the resulting image will NOT boot this recipe.
```
**b. 将修改项烘焙进镜像。** 从
[CosmicRaisins/glm-5.2-gb10](https://github.com/CosmicRaisins/glm-5.2-gb10) 的 `kernels/` 获取 10 个 kernel 文件并放入
构建机器的 `~/glm-triton` 中,然后在容器内运行两个修改脚本并 commit
结果。这两个修改脚本的作用是:
- `mods/glm52-sm12x-sparse/run.sh` — 安装 Triton sparse-MLA kernels 和 DeepGEMM bypass
(完全照搬自 ciprianveg 的压缩包)。
- `mods/glm52-b12x-sparse/run.sh` — 安装 b12x 以实现 CUDA-graph 安全的 sparse-MLA 解码(完全照搬
自 ciprianveg 的压缩包)。
**kernels 必须挂载到 `/root/models/models15/glm-triton`** — 这是
`mods/glm52-sm12x-sparse/run.sh` 预期的路径(脚本顶部的 `KERNELS=`)。完全按照我们的运行方式:
```
docker run -d --name glm52-modding \
-v ~/glm-triton:/root/models/models15/glm-triton:ro \
-v $(pwd)/mods/glm52-sm12x-sparse:/mods/glm52-sm12x-sparse:ro \
-v $(pwd)/mods/glm52-b12x-sparse:/mods/glm52-b12x-sparse:ro \
vllm-node-tf5-glm52-b12x:probe sleep infinity
docker exec glm52-modding bash /mods/glm52-sm12x-sparse/run.sh
docker exec glm52-modding bash /mods/glm52-b12x-sparse/run.sh
docker commit \
--change 'ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"]' \
--change 'CMD []' \
glm52-modding vllm-node-tf5-glm52-b12x:probe-modded
docker rm -f glm52-modding
```
你需要从 CosmicRaisins/glm-5.2-gb10 的 `kernels/` 获取的 10 个 kernel 文件(Apache-2.0;未在此处内联打包):
```
b12x_sparse_helpers.py
deepseek_v2.py
flashmla_sparse.py
patch_flashmla_ops.py
sm12x_deep_gemm_fallbacks.py
sm12x_mqa.py
sm12x_sparse_mla_attn.py
sparse_attn_indexer.py
sparse_mla_env.py
sparse_mla_kernels.py
```
两个脚本都会打印 `✓` 行;sm12x 脚本必须以 `=== glm52-sm12x-sparse complete ===` 结尾,
而 b12x 脚本必须显示成功执行 `import b12x`。
**h. 烘焙 indexer MTP-overhang 补丁(使用 `--max-num-seqs >= 3` 时必需)。** 请在步骤
的同一构建会话中进行此操作,即在 commit 和分发镜像之前。
`patches/fix-indexer-mtp-overhang.py` 修复了一个 vLLM bug,该 bug 导致 DSA indexer 仅为
`max_model_len` 分配其扩展 block-table 缓冲区大小;MTP spec tokens 可能会将请求扩展
越过该限制,并在 ≥3 个并发请求时导致引擎崩溃,报错 `RuntimeError: The expanded size of the
tensor (3125) must match the existing size (3126)`。有关完整说明,请参阅补丁的 docstring。
像修改脚本一样进行烘焙 — 将其挂载到 patch 容器中,并在执行 `docker commit` 之前运行它:
```
docker run -d --name glm52-modding \
... \
-v $(pwd)/patches:/patches:ro \
vllm-node-tf5-glm52-b12x:probe sleep infinity
# (after the two mod scripts from step b)
docker exec glm52-modding python3 /patches/fix-indexer-mtp-overhang.py
docker commit \
--change 'ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"]' \
--change 'CMD []' \
glm52-modding vllm-node-tf5-glm52-b12x:probe-modded
docker rm -f glm52-modding
```
成功时会输出 `patched: .../indexer.py`,并且该操作是幂等的(可安全重复运行)。
### c. 将镜像分发到所有节点
```
# from the build machine, for each OTHER node:
docker save vllm-node-tf5-glm52-b12x:probe-modded | \
ssh @ docker load
```
(通过 RoCE fabric 只需几分钟,而不是几小时。在较慢的链路上,中间使用 `pigz` 会有所帮助。)
### d. 权重 — 下载一次,rsync 到所有节点
**只需下载一次** checkpoint(405 GB — 请在网络最好的节点上执行):
```
hf download QuantTrio/GLM-5.2-Int4-Int8Mix \
--local-dir /var/tmp/models/glm52-int4-int8mix
```
然后**通过 RoCE fabric**(而不是外网链路)分发:
```
# from the node holding the weights, for each other node's fabric IP:
rsync -a --info=progress2 /var/tmp/models/glm52-int4-int8mix/ \
@192.168.192.X:/var/tmp/models/glm52-int4-int8mix/
```
在**每个**节点上创建 hub-layout 的 symlink(容器内的服务路径为
`/cache/huggingface/hub/glm52-int4-int8mix`):
```
mkdir -p /var/tmp/models/hub
ln -sfn ../glm52-int4-int8mix /var/tmp/models/hub/glm52-int4-int8mix
```
### e. 在每个节点上暂存 NCCL 2.30.4
镜像自带的 NCCL 会在运行时通过 `LD_PRELOAD` 被替换。在**每个**节点上:
```
pip download nvidia-nccl-cu13==2.30.4 -d /tmp/nccl --no-deps
mkdir -p /var/tmp/models/hub/nccl-2.30.4
cd /tmp/nccl && unzip -o nvidia_nccl_cu13-2.30.4*.whl 'nvidia/nccl/lib/libnccl.so.2'
cp nvidia/nccl/lib/libnccl.so.2 /var/tmp/models/hub/nccl-2.30.4/
```
### f. 在每个节点上配置 Kernels
将 CosmicRaisins/glm-5.2-gb10 `kernels/` 中的 10 个 `.py` 文件复制到**每个**
节点的 `~/glm-triton` 目录(launch.sh 会以只读方式将它们逐文件挂载到 vLLM 目录树上):
```
git clone https://github.com/CosmicRaisins/glm-5.2-gb10
for node in 192.168.192.1 192.168.192.2 192.168.192.3 192.168.192.4; do
rsync -a glm-5.2-gb10/kernels/ @$node:~/glm-triton/
done
```
### g. 启动
编辑 `launch.sh` 中标记为 `EDIT` 的配置块(节点 IP、SSH 用户/密钥、HCA 和接口
名称),然后从主节点执行:
```
./launch.sh --dry-run # sanity-check the generated docker commands first
./launch.sh
```
每个节点执行普通的 `docker run`;vLLM 原生多节点(`--nnodes/--node-rank`),**无需 Ray**。Worker
会先无头启动,head 最后启动。
### 验证
预计在 API 响应前需要 **约 12 分钟加载权重 + 约 10 分钟预热 cudagraph**:
```
curl -s http://localhost:8210/v1/models # serves as 'glm-5.2'
docker logs -f vllm_slot # follow bring-up on the head node
```
## 基准测试
### Speed-Night 2 更新(2026-07-17) — 当前服务配置
MTP k=4 → **k=5** + 显式 `cudagraph_capture_sizes`(并发为 6 时之前一直运行在
无完整 CUDA graph 状态 — 默认的 size 列表跳过了该 batch size) + `VLLM_MARLIN_USE_ATOMIC_ADD=1`:
| 指标 | 2026-07-05 配置 | **2026-07-17 配置** |
|---|---|---|
| c1 代码 / 数学 / 散文 | ~28.8 中位数 | **32.0 / 36.0 / 29.6**(平均 32.5) |
| c6 聚合 | 60.5 | **65–75** |
| 首个可见 token(交互式) | 7–10 s | 使用 `enable_thinking:false` 时为 **0.36 s** |
| MTP accept (k=5) | 3.3–3.6 (k=4) | 最高 4.88,pos-5 accept 0.547 |
完整的逐项结果、死胡同及排名路线图:[SPEED-NIGHT-FINDINGS.md](SPEED-NIGHT-FINDINGS.md)。
### 原始并发结果(2026-07-05,k=4 配置 — 历史数据)
**最终并发结果(2026-07-05)** — 在此集群上使用最终服务配置进行测量
(gmu 0.91,KV 10.95 GB,max-num-seqs 6,MTP k=4),并且在包含已验证的 indexer 补丁的镜像上启动。所有运行:512-token 生成,temperature 0,低深度 context。全部 6 个并发
级别均完成,且**零崩溃**。
| 并发 | 聚合 tok/s | 每流平均 | 每流最小 | MTP accept len |
|---|---|---|---|---|
| 1(预热,3 次中位数) | **28.8** | 28.8 | 27.3 | 3.3–3.6 |
| 2 | 37.6 | 20.2 | 18.8 | 3.50 |
| 3 | 39.3 | 13.6 | 13.1 | 3.22 |
| 4 | 53.5 | 14.1 | 13.4 | 3.28 |
| 5 | 59.1 | 12.5 | 11.8 | 3.22 |
| 6 | **60.5** | 10.6 | 10.1 | 3.23 |
备注:
- **c1 是 3 次运行的预热中位数 (27.3 / 29.0 / 28.8)。** 启动后第一次冷请求的读数会
偏低(16-22 tok/s) — 请引用预热中位数,并附带此注意事项。
- **c3-c6 行的存在仅仅是因为有了 indexer 补丁**
(`patches/fix-indexer-mtp-overhang.py`,步骤 h):没有它,引擎在 3 个并发
请求时会崩溃。这次运行验证了该补丁 — 6/6 并发级别,零崩溃。
### Context 深度 (2K-32K) — 2026-07-17 实测
事实植入召回 + 连贯性探测(事实埋在文档中段,temp 0,任务 = 召回
事实 + 总结文档)。针对在线集群运行;预热后进行提示测试。
| 深度(提示词 token 数) | 事实召回 | 输出连贯性 | 实际运行时间(含 prefill) |
|---|---|---|---|
| 2,057 | 通过 | 清晰 | 18 s |
| 4,071 | 通过 | 清晰 | 10 s |
| 8,065 | 通过 | 清晰 | 15 s |
| 16,248 | 通过 | 清晰 | 25 s |
| 32,653 | 通过 | 清晰 | 45 s |
在此技术栈上,直到 32K 深度都没有出现退化、重复或“token 沙拉”现象。背景:issue #1
曾报告(在 MLX/Apple-Silicon pipeline 上)指出,低于 BF16 的 indexer 精度会在
约 3-5K 深度时导致长上下文连贯性崩溃。该故障模式在此 vLLM/GB10 配方上直到
32K 都**没有**复现 — 这可能是因为指定的参考代码中的 indexer 路径(vLLM #4595 + b12x sparse 修改)处理
DSA indexer 的方式与 MLX 量化 pipeline 不同。如果你在其他技术栈上重新量化此 checkpoint,他们的警告依然
值得注意:请将 indexer 保持在 BF16。
### 启动遥测(已验证)
- 权重:**每个节点 98.07 GiB**。
- KV pool:**200,064 tokens**,`fp8_ds_mla`。
- 稳定状态:MemAvailable 0.6-0.9 GB + 3.6-4.5 GB swap parked(**这是设计预期** — 与
上游作者针对此配置类型的内存分析相符)。
## 配置
关键服务设置及其原理:
| 设置 | 值 | 原因 |
|---|---|---|
| `--tensor-parallel-size` | `4` | 每个 TP rank 对应一个 GB10;405 GB / 4 ≈ 95 GiB 权重/节点。 |
| `--speculative-config` | `{"method":"mtp","num_speculative_tokens":4,"draft_tensor_parallel_size":1,"attention_backend":"FLASHMLA_SPARSE"}` | MTP drafter 位于 checkpoint 内(layer 78)。k=4 且 draft TP=1 (back199640, #89):微小的 drafter 并不能从 TP 中受益,并且 draft TP=1 消除了每个推测步骤中的跨节点跳转。 |
| `--kv-cache-dtype` | `fp8_ds_mla` | fp8 sparse-MLA KV:将 KV 占用减半,仅用 10.5 GB/节点的 cache 即可实现 200K。 |
| `--compilation-config` | `{"cudagraph_mode":"FULL"}` | 为解码提供完整的 CUDA graphs。需要 b12x 修改 — 没有它,graph 捕获会崩溃(捕获期间运行 `torch.full`)。 |
| `--async-scheduling` | 开启 | 使 CPU 调度与 GPU 执行重叠 (back199640, #80) — 对 GB10 上的 tok/s 提升显著。 |
| `--max-num-batched-tokens` | `8192` | Prefill chunk 大小:大到足以实现约 700+ tok/s prefill,小到不会在深度增加时耗尽内存。 |
| `--gpu-memory-utilization` + `--kv-cache-memory-bytes` | `0.91` + `10950000000` | **确定性启动 + 精确满足 200K 的 KV 预算。** 单靠 gmu 会让 vLLM 根据*当前可用*内存来计算 KV,而在 GB10 统一内存上,这会随 page cache 波动 — 同样的命令可能会根据 cache 状态出现 OOM 或成功启动。而且 gmu 0.90 只为 KV 留下 9.78 GiB,而 200000 ctx 需要 10.19 GiB(见故障排除)。gmu 0.91 加上锁定为 10.95 GB 的 KV 可以保证每次都分配出 200,064-token 的 pool。 |
| `--max-model-len` | `200000` | 200K context,配合 fp8_ds_mla 可适应锁定的 KV 预算。 |
| `--max-num-seqs` | `6` | 最多 6 个并发流。需要 indexer MTP-overhang 补丁(步骤 h) — 如果不打补丁,引擎在 ≥3 个并发请求时会崩溃。如果构建纯单流延迟架构,请降至 1。 |
| `NCCL_MIN/MAX_NCHANNELS` | `4` | ciprianveg (#107):在 GB10 RoCE 上收窄 NCCL channels 可减少争用;更多的 channels 在这里反而更慢。 |
| `--reasoning-parser` / `--tool-call-parser` | `glm45` / `glm47` | 匹配 GLM-5.2 的推理追踪和工具调用格式的正确解析器。 |
| `--distributed-executor-backend` | `mp` | 原生多进程 + `--nnodes/--node-rank` 会合。无需 Ray。 |
## 体感延迟:思考模式是最大的影响因素
GLM-5.2 默认在输出任何可见内容之前会先输出一条推理轨迹。在此
集群上实测(短提示词,流式传输):开启默认思考时**首个可见 token 约在 7-10 秒**,
关闭思考时为 **0.36 秒** — 每个请求有约 20 倍的体感延迟差异,且无需更改服务器配置:
```
{"model": "glm-5.2", "messages": [...], "stream": true,
"chat_template_kwargs": {"enable_thinking": false}}
```
测量备注(2026-07-17):`/nothink` 提示词后缀并不能在此聊天模板上抑制思考
— 请使用 kwarg。`reasoning_effort: "low"` 方向上能减弱,但
方差很大(其中一个样本的思考时间*比默认情况更长*)。前缀缓存(Prefix caching)已启用并且有效
(相同的 8K 提示词:第二次调用时的 TTFT 为 9.9 s -> 0.7 s),因此稳定的系统提示词 +
完整历史记录重发可使多轮对话的 TTFT 保持在约 0.5 s 的下限附近。
## 超越指定的版本号进行升级(在升级任何引用前必读)
该版本指定是承重墙。10 个 Triton kernels 被直接挂载到特定的
`dist-packages/vllm/...` 路径上,修改脚本会修补特定的文件,并且服务
标志是根据 `ab666069` 的内部结构验证的 -- 例如,此配方不需要
`index_topk_pattern` 覆盖,*正是因为*该指定包含了 vLLM #45895(见
配置中的说明)。在不同的引用上,这些假设会发生变化:在 2026-07 main 版本上,b12x
backend 根本无法注册,并且 fp8_ds_mla KV 布局发生了变化(656 vs
576 B/token 视图) -- 引擎在 KV-cache 初始化时就会死掉。
将任何版本引用升级视为一次**重新验证事件**,而不是简单的重新构建:
1. 将构建框架和 vLLM 引用**一起**升级(存在更新的框架是为了构建
更新的 vLLM;混淆版本方向正是隐蔽故障的温床)。保持
`VLLM_APPLY_PRESET_PRS="false"` -- 固定的构建永远不应合并活动的 PR。
2. **以 wheel 后缀为准**:构建的 wheel 版本必须是
你所要求引用的开发版本构建。如果后缀是任何其他哈希值,停止 -- 代码树发生了变动。
3. 在信任之前先进行冒烟测试:在所有节点上启动;启动日志选择了预期的
sparse attention backend;`GPU KV cache size` 符合预期;在已知提示词上测试 temp-0
正确性;c1 数据在此 README 的数值上下 10% 范围内。
4. 预计在较大跨度的跳跃中需要重新移植 kernels/mods -- 首先对比新镜像内的 overlay 目标路径。
长期出路:上游 vLLM 在 sm_121 上提供原生的 GLM-DSA sparse 支持
(vllm-project/vllm#45317 是跟踪此问题的 ticket)。一旦完成,kernel overlay -- 以及
与之相关的大部分版本指定工作 -- 都将变得不再必要。
## 故障排除
1. **RoCE fabric IP 必须位于正确的接口上 — 并且必须在 netplan 中持久化。** 如果 fabric IP
是临时添加的,链路本地地址 (169.254.x.x) 可能会在重启/链路抖动后占据该端口,
这会**改变 GID table** — 你的 `NCCL_IB_GID_INDEX` 现在指向了错误的 GID,NCCL
要么失败要么会静默退化。请将 fabric IP 放入 netplan 中,并在
任何重启后使用 `show_gids` 进行验证。
2. **必须开启 IB 设备直通。** 如果没有 `--device /dev/infiniband` + `--cap-add IPC_LOCK`
+ `--ulimit memlock=-1:-1`,NCCL 将会**静默**回退到 socket 接口上的 TCP。
一切看起来都在运行;但解码速度只有约 12 tok/s 而不是 30+ tok/s。如果数值看起来减半了,请检查
`NCCL_DEBUG=INFO` 输出中是 `NET/IB` 还是 `NET/Socket`。
3. **GB10 统一内存上的 Page-cache 压力。** 在 CPU 和 GPU 共享相同 121 GB 内存的机器上,加载约 95 GiB 的权重会填满 page cache。
在启动之前,在每个节点上执行:
`sync && echo 3 | sudo tee /proc/sys/vm/drop_caches`。这加上显式的
`--kv-cache-memory-bytes` 就是让启动变得确定性的关键。
4. **交换机上也必须开启巨型帧,而不仅仅是 NIC。** MTU 9000 必须端到端设置;
处于 1500 的交换机端口会静默分片,并严重拖累总线带宽。
5. **不要单独信任 `--gpu-memory-utilization`。** 参见[配置](#configuration)表:
显式固定 `--kv-cache-memory-bytes`,否则相同的启动命令会根据剖析时 page cache 的状态~偶尔~发生 OOM。
6. **加载权重期间的 Page-cache 抖动。** 在 GB10 上,即使有 14–18 GB 的“可用”内存,大规模加载也会因内核内存回收而在 100% CPU 下卡顿。
在加载阶段,**每** 60 秒在**每个**节点上无条件执行一次 `sync; echo 3 > /proc/sys/vm/drop_caches`
(并且在启动前执行一次)。症状:shard 加载进度在加载过程中冻结;
手动执行 drop 操作可在几秒钟内解决卡顿。
7. **精确满足 200K 的 KV 预算。** `--gpu-memory-utilization 0.90` 只为 KV 留下 9.78 GiB —
200000 ctx 需要 10.19 GiB。使用 gmu `0.91` 和 `--kv-cache-memory-bytes 10950000000`;启动会
分配出 200,064-token 的 pool。
### 许可证
**Apache-2.0** — 见 [LICENSE](LICENSE)。这是必需的且经过深思熟虑的:`launch.sh` 源自
CosmicRaisins 的 Apache-2.0 `launch.sh`(版权声明保留在文件头中),并且
`mods/` 脚本复制了他的 Apache-2.0 修改。有关出处请参见 [NOTICE](NOTICE)。
标签:DLL 劫持, GLM, vLLM, 人工智能, 分布式系统, 响应大小分析, 大语言模型, 模型部署与推理, 模型量化, 用户模式Hook绕过, 请求拦截