GLM-5.3-Flash 在 8×A800 (sm_80) 上跑通(三):性能数据、显存账与生产运维
首发CSDN · 技术连载第 3 篇(共 3 篇) 配套开源项目:GLM-5.3-Flash on 8×A800 (sm_80) 部署套件 前两篇讲了方案和 7 连坑。本篇收尾:实测性能、为什么必须 8 卡、以及上生产后的日常运维。
1. 成功跑通(v7 里程碑)
一路修完 7 个坑之后,v7 镜像成功起服务:
| 权重加载 | 39.8 GiB/卡 ×8,~36 s(页缓存热) |
| 引擎 init 全程 | 335.5 s(含 TileLang JIT、autotune、图捕获) |
| Graph 捕获 | 86 s,3.46 GiB |
| KV cache | 18.39 GiB/卡 → 1,535,933 tokens(1M ctx 并发 1.46×) |
| VRAM 稳态 | 76.7/80 GiB 每卡(GMU 0.90 + graphs) |
API 验证通过:
- /v1/models:zai-org/GLM-5.3-Flash,max_model_len=1,048,576 ✓
- 数学 sanity:13×17 → content=221,reasoning=13*17=221,reasoning_effort=low 生效 ✓
- 中文长文生成质量正常(量子计算短文,结构完整)✓
- 单流吞吐 61.9 → 72.2 tok/s(含 TTFT;MTP×5 生效)
2. 生产配置定稿(v8,端口 8008)
在 v7 基础上调整参数并重测:
| 端口 | 8006 | 8008 |
| GMU(显存利用率) | 0.90 | 0.95 |
| max_num_seqs | 256 | 32(图捕获集缩小:86s/3.46GiB → 66s/2.71GiB) |
| max_model_len | 1,048,576 | 1,048,576(保持) |
生产实测(同机同镜像):
- KV 池 2,004,983 tokens(GMU 0.95 后每卡 KV ≈22.4 GiB)
- VRAM 稳态 ~78.0/80 GiB 每卡
- 引擎 init ~5.5 min;sanity(13×17)响应 0.43 s
- 单流吞吐 79.0 tok/s(含 TTFT,较 v7 的 72.2 提升约 9%)
- 1M 上下文为真实可跑满的单路上限(池 2.0M > 1M),并发满长上限 ~1.9 路
一个细节:max_num_seqs 从 256 降到 32,反而让 graph 捕获更小更快(86s/3.46GiB → 66s/2.71GiB),吞吐还有提升。说明"并发参数不是越大越好"——它直接决定 CUDA-graph 捕获集的大小。
3. 为什么必须 8 卡?—— 显存账
很多人会问"4 卡行不行"。算一笔账就清楚了:
- 权重 ≈306 GiB / 8 卡 ≈ 38.3 GiB/卡(实测加载 39.8 GiB)
- gpu-memory-utilization 0.95 → 每卡预算 76 GiB → KV 池 2,004,983 tokens
- 4 卡方案:仅权重就 76.5 GiB/卡 > 物理上限 80 GiB,直接不可行
所以 8 卡不是"选择",是硬性门槛。
4. 一键部署脚本
核心封装在 deploy_glm53_flash_a800.sh,默认值全部支持环境变量覆盖:
| PORT | 8008 | 对外端口(容器内固定 8000) |
| GMU | 0.95 | GPU 显存利用率 |
| MAX_SEQS | 32 | 最大并发序列 |
| MAX_MODEL_LEN | 1048576 | 上下文长度 |
| NUM_SPEC_TOKENS | 5 | MTP 投机解码 token 数 |
| TP / GPUS | 8 / 0…7 | 张量并行 / 卡映射 |
| IMAGE | glm53-flash-sm80 | 使用的镜像 |
| EXTRA_ARGS | — | 追加 vLLM 参数 |
本地权重路径通过一个 git 忽略的配置文件注入,仓库里的模板是通用路径。
# 一键部署
./deploy_glm53_flash_a800.sh
# 盯启动日志(关键里程碑见下表)
docker logs -f glm53-flash-a800-8008
启动里程碑(参考耗时):
| 权重加载 | ~36 s(页缓存热) | Model loading took 39.8 GiB |
| 引擎初始化(TileLang JIT + autotune) | ~5.5 min | init engine … took |
| CUDA 图捕获 | ~66 s(2.71 GiB) | Graph capturing finished |
| 就绪 | — | Application startup complete. |
5. 冒烟验证
./test_api.sh 8008
脚本做三件事:/v1/models 探活 → chat completion 数学 sanity(13*17→221)→ reasoning 解析检查(产出如下):
content : 221
reasoning(head) : 13*17=221
usage : prompt=xx completion=xx reasoning_tokens=xx
finish_reason : stop
PASS if content above is 221.
直接对话示例(OpenAI 兼容,含 reasoning 解析):
curl -s http://localhost:8008/v1/chat/completions \\
-H 'Content-Type: application/json' \\
-d '{"model":"zai-org/GLM-5.3-Flash",
"messages":[{"role":"user","content":"用三句话介绍卷积神经网络"}],
"chat_template_kwargs":{"reasoning_effort":"low"}}' | python3 -m json.tool
6. 日常运维
- 重启:重复执行 ./deploy_glm53_flash_a800.sh(脚本自动删旧容器)。关键优化:Triton/TileLang JIT 缓存已持久化到 vllm_cache/,重启跳过重编译(省数分钟)
- 停止:docker rm -f glm53-flash-a800-8008
- 换端口试跑:PORT=9000 ./deploy_glm53_flash_a800.sh
- 小上下文快速验证:MAX_MODEL_LEN=32768 ./deploy_glm53_flash_a800.sh
- 前台调试(看全量日志,Ctrl+C 停):./run_debug.sh
# 前台调试启动(同生产配置,–rm + 前台,便于盯全量日志)
./run_debug.sh –enforce-eager –max-model-len 32768
# 日志查询
docker logs -f glm53-flash-a800-8008
run_debug.sh 默认端口 8007,参数已对齐生产配置(GMU 0.95 / seqs 32 / 1M ctx / sparse_mla_force_mqa / JIT 缓存挂载),避免"调试配置与生产行为不一致"的误导。
7. 三个可复用的工程经验
8. 项目文件速查
| deploy_glm53_flash_a800.sh | 一键生产部署(TP8 + EP + MTP,端口 8008) |
| run_debug.sh | 前台调试启动(同配置,看全量日志) |
| test_api.sh | 冒烟测试(探活 + 数学 sanity + reasoning 解析) |
| Dockerfile.glm53-sm80 | 基座镜像 + 补丁层 → 自定义镜像 |
| _port/patches_glm53_sm80/ | 10 个镜像内补丁文件 |
| _port/probe_*.py | GPU 探针:logits 内核正确性、kpool 量化字节级校验 |
| env.local.example | 本机配置模板(复制为 env.local,git 忽略) |
9. 结语
-
三篇连载到此结束。总结一句话:GLM-5.3-Flash 跑在 sm_80 上不是"能不能",而是"要不要"的问题——官方不支持的代价是一套约 10 个文件的补丁和几次连环踩坑,但换来的是在存量 A800 上把 320B MoE 模型以 79 tok/s 稳定对外服务。
-
如果你的团队也在为"存量卡跑新模型"发愁,希望这套方案(尤其是探针方法论和架构门控思路)对你有用。
开源项目链接:https://gitee.com/kill-life/glm5.3-flash-deployment-a800 许可:Apache-2.0。 补丁为 vLLM(Apache-2.0)衍生代码,含 PR #47629 社区内核。 模型权重由 Z.ai 独立分发,不在本套件内。





