GLM-5-w8a8 双机 DP=2 部署
背景:本文介绍了在昇腾NPU环境下,基于vLLM框架实现双机DP=2部署GLM-5-w8a8模型的具体方法。该模型采用w8a8量化技术,能够在保证推理精度的前提下有效降低显存占用。通过双机数据并行部署,可以突破单机显存限制,支撑更大规模模型的稳定运行。
使用场景:本方案适用于昇腾NPU上的vLLM模型部署场景,特别适合需要跨机扩展推理能力的生产环境。GLM-5-w8a8模型可用于对话生成、文本理解等常见大语言模型任务。该部署方案可为开发者在硬件平台上高效运行推理服务提供参考。
价值收益:本方案显著降低了基于昇腾芯片进行大模型部署的技术门槛,使开发者能够更便捷地完成分布式推理配置。通过双机DP=2与w8a8量化的结合,在保障模型性能的同时提升了资源利用效率。该实践为AI算力环境下的模型服务化落地提供了可行路径。
一、模型信息
| 属性 | 值 |
|------|-----|
| 模型 ID | Eco-Tech/GLM-5-w8a8 |
| 架构 | `glm_moe_dsa`(GLM-5 MoE,78 层,256 专家)|
| 量化格式 | w8a8(权重 INT8,激活 BF16)|
| 权重数量 | 181 个 safetensor(~713GB)|
| 推理框架 | vLLM-Ascend 0.17.0rc1 |
二、部署步骤
2.1 安装 docker(所有节点)
yum install -y docker && systemctl start docker && systemctl enable docker
2.2 拉取镜像(所有节点)
docker pull quay.io/ascend/vllm-ascend:v0.17.0rc1
2.3 创建容器(所有节点)
注意:必须列出所有 8 张卡(davinci0~7),不能只写 davinci_manager
Master 示例:
docker run -d \\
--name glm5-master \\
--network host \\
--shm-size=500g \\
--privileged=true \\
-w /home \\
--device=/dev/davinci0 \\
--device=/dev/davinci1 \\
--device=/dev/davinci2 \\
--device=/dev/davinci3 \\
--device=/dev/davinci4 \\
--device=/dev/davinci5 \\
--device=/dev/davinci6 \\
--device=/dev/davinci7 \\
--device=/dev/davinci\_manager \\
--device=/dev/devmm\_svm \\
--device=/dev/hisi\_hdc \\
-v /usr/local/dcmi:/usr/local/dcmi \\
-v /usr/local/Ascend/driver/tools/hccn\_tool:/usr/local/Ascend/driver/tools/hccn\_tool \\
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \\
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \\
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \\
-v /etc/ascend\_install.info:/etc/ascend\_install.info \\
-v /tmp/models:/tmp/models \\
-v /usr/lib64/libstdc++.so.6:/usr/lib64/libstdc++.so.6 \\
quay.io/ascend/vllm-ascend:v0.17.0rc1 \\
bash -c "sleep infinity"
Worker 示例:
docker run -d \\
--name glm5-worker \\
--network host \\
--shm-size=500g \\
--privileged=true \\
-w /home \\
--device=/dev/davinci0 \\
--device=/dev/davinci1 \\
--device=/dev/davinci2 \\
--device=/dev/davinci3 \\
--device=/dev/davinci4 \\
--device=/dev/davinci5 \\
--device=/dev/davinci6 \\
--device=/dev/davinci7 \\
--device=/dev/davinci\_manager \\
--device=/dev/devmm\_svm \\
--device=/dev/hisi\_hdc \\
-v /usr/local/dcmi:/usr/local/dcmi \\
-v /usr/local/Ascend/driver/tools/hccn\_tool:/usr/local/Ascend/driver/tools/hccn\_tool \\
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \\
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \\
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \\
-v /etc/ascend\_install.info:/etc/ascend\_install.info \\
-v /tmp/models:/tmp/models \\
-v /usr/lib64/libstdc++.so.6:/usr/lib64/libstdc++.so.6 \\
quay.io/ascend/vllm-ascend:v0.17.0rc1 \\
bash -c "sleep infinity"
2.4 Patch transformers(所有节点)
v0.17.0rc1 镜像的 transformers 不认识 `glm_moe_dsa` 架构,需要手动 patch。三处都要改:
第一处:CONFIG\_MAPPING
docker exec {容器名} sed -i '174a\\ ("glm\_moe\_dsa", "DeepseekV2Config"),' /usr/local/python3.11.14/lib/python3.11/site-packages/transformers/models/auto/configuration\_auto.py
第二处:MODEL\_NAMES\_MAPPING
docker exec {容器名} sed -i '616a\\ ("glm\_moe\_dsa", "GLM-5"),' /usr/local/python3.11.14/lib/python3.11/site-packages/transformers/models/auto/configuration\_auto.py
第三处:\_\_getitem\_\_ fallback
docker exec {容器名} sed -i '1054,1055c\\ if module\_name not in self.\_modules:\\n try:\\n self.\_modules[module\_name] = importlib.import\_module(f".{module\_name}", "transformers.models")\\n except ModuleNotFoundError:\\n self.\_modules[module\_name] = importlib.import\_module(".deepseek\_v2", "transformers.models")' /usr/local/python3.11.14/lib/python3.11/site-packages/transformers/models/auto/configuration\_auto.py
docker exec {容器名} sed -i '1054d' /usr/local/python3.11.14/lib/python3.11/site-packages/transformers/models/auto/configuration\_auto.py
2.5 启动 vLLM
先启动 master,再启动 worker(间隔 5 秒)
Master(rank 0)
nohup docker exec -d {容器名} bash -c '
export HCCL\_OP\_EXPANSION\_MODE="AIV"
export HCCL\_IF\_IP="{master内网IP}"
export GLOO\_SOCKET\_IFNAME="bond1"
export TP\_SOCKET\_IFNAME="bond1"
export HCCL\_SOCKET\_IFNAME="bond1"
export OMP\_PROC\_BIND=false
export OMP\_NUM\_THREADS=1
export HCCL\_BUFFSIZE=200
export PYTORCH\_NPU\_ALLOC\_CONF=expandable\_segments:True
export ASCEND\_RT\_VISIBLE\_DEVICES=0,1,2,3,4,5,6,7
vllm serve /tmp/models/Eco-Tech/GLM-5-w8a8 \\
--host 0.0.0.0 --port 8077 \\
--data-parallel-size 2 \\
--data-parallel-size-local 1 \\
--data-parallel-start-rank 0 \\
--data-parallel-address {master内网IP} \\
--data-parallel-rpc-port 13389 \\
--tensor-parallel-size 8 \\
--quantization ascend \\
--seed 1024 \\
--served-model-name glm5 \\
--enable-expert-parallel \\
--max-num-seqs 20 \\
--max-model-len 32768 \\
--max-num-batched-tokens 4096 \\
--trust-remote-code \\
--enable-prefix-caching \\
--gpu-memory-utilization 0.92 \\
--additional-config "{\\"multistream\_overlap\_shared\_expert\\":true,\\"fuse\_qknorm\_rope\\":false,\\"fuse\_muls\_add\\":true,\\"enable\_npugraph\_ex\\":true}" \\
--compilation-config "{\\"cudagraph\_capture\_sizes\\":[1,4,8,12,16,20,24,28,32,36,40,48,56,64,80,96],\\"cudagraph\_mode\\":\\"FULL\_DECODE\_ONLY\\"}" \\
--enable-auto-tool-choice \\
--tool-call-parser glm47
' > /tmp/vllm-master.log 2>&1 &
Worker(rank 1,等 5 秒)
sleep 5 && nohup docker exec -d {worker容器名} bash -c '
export HCCL\_OP\_EXPANSION\_MODE="AIV"
export HCCL\_IF\_IP="{worker内网IP}"
export GLOO\_SOCKET\_IFNAME="bond1"
export TP\_SOCKET\_IFNAME="bond1"
export HCCL\_SOCKET\_IFNAME="bond1"
export OMP\_PROC\_BIND=false
export OMP\_NUM\_THREADS=1
export HCCL\_BUFFSIZE=200
export PYTORCH\_NPU\_ALLOC\_CONF=expandable\_segments:True
export ASCEND\_RT\_VISIBLE\_DEVICES=0,1,2,3,4,5,6,7
vllm serve /tmp/models/Eco-Tech/GLM-5-w8a8 \\
--host 0.0.0.0 --port 8077 \\
--headless \\
--data-parallel-size 2 \\
--data-parallel-size-local 1 \\
--data-parallel-start-rank 1 \\
--data-parallel-address {master内网IP} \\
--data-parallel-rpc-port 13389 \\
--tensor-parallel-size 8 \\
--quantization ascend \\
--seed 1024 \\
--served-model-name glm5 \\
--enable-expert-parallel \\
--max-num-seqs 20 \\
--max-model-len 32768 \\
--max-num-batched-tokens 4096 \\
--trust-remote-code \\
--enable-prefix-caching \\
--gpu-memory-utilization 0.92 \\
--additional-config "{\\"multistream\_overlap\_shared\_expert\\":true,\\"fuse\_qknorm\_rope\\":false,\\"fuse\_muls\_add\\":true,\\"enable\_npugraph\_ex\\":true}" \\
--compilation-config "{\\"cudagraph\_capture\_sizes\\":[1,4,8,12,16,20,24,28,32,36,40,48,56,64,80,96],\\"cudagraph\_mode\\":\\"FULL\_DECODE\_ONLY\\"}" \\
--enable-auto-tool-choice \\
--tool-call-parser glm47
' > /tmp/vllm-worker.log 2>&1 &
三、验证
等待约 3-5 分钟后,在 master 节点执行:
curl http://{master内网IP}:8077/v1/models
应返回 `glm-5`,`max_model_len: 32768`。
推理测试:
curl http://{master内网IP}:8077/v1/chat/completions \\
-H "Content-Type: application/json" \\
-d '{
"model": "glm-5",
"messages": [{"role": "user", "content": "Hello, who are you?"}],
"max\_tokens": 100
}'
四、访问服务
服务启动后,通过 master 节点的 8077 端口访问:
http://{master内网IP}:8077
API 端点:
- `GET /v1/models` — 查看可用模型
- `POST /v1/chat/completions` — 对话
- `POST /v1/completions` — 文本补全
五、重启恢复
5.1 确认容器在运行
docker ps | grep glm5
5.2 重新启动 vLLM(顺序:先 worker,再 master)
等几秒后,分别执行 2.5 节的启动命令。
5.3 确认进程运行
worker 上
docker exec {worker容器名} bash -c "ps -ef | grep 'vllm serve' | grep -v grep"
master 上
docker exec {master容器名} bash -c "ps -ef | grep 'vllm serve' | grep -v grep"
应该各有 1 个 vllm 进程。
六、常见问题排查
6.1 查看启动日志
master 日志
docker exec {master容器名} tail -50 /tmp/vllm-master.log
worker 日志
docker exec {worker容器名} tail -50 /tmp/vllm-worker.log
6.2 确认端口在监听
docker exec {容器名} bash -c "netstat -tlnp | grep 8077"
6.3 确认 NPU 进程
docker exec {容器名} bash -c "npu-smi info | grep 'Process id'"
应该各有 8 个进程(TP=8)。
6.4 常见错误
Transformers 不认识 glm_moe_dsa 架构:
Transformers does not recognize this architecture
→ transformers patch 未完成,见本文档 3.4 节
KV cache 不足:
6.7 GiB KV cache needed, but only 5.16 GiB available
→ 降低 `--max-model-len` 到 32768
BC-Linux 21.10 内核 bug:
basic\_string::\_S\_construct null not valid
→ 升级到 BigCloud Linux 22.10
TCPStore 连接超时:
Did not receive response from front-end process within 5 minutes
→ worker 启动顺序错误;确认先跑 master 等几秒再跑 worker
Connection refused on port 8077:
→ vllm 进程未启动,看日志确认
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)