本文面向 Atlas 800I A2(单台 8 卡昇腾 910B 64G)双机集群,采用vLLM-Ascend推理引擎部署 GLM-5.2 基座 / 对话版,全程以可复制 Shell 命令、实操流程、报错排错为主,无冗余理论。硬件架构:双机共 16 张 910B,TP=16 张量并行跨机分布式推理;软件栈:CANN 8.5.0、vLLM-Ascend 0.19.0、GLM-5.2-BF16 原始权重、HCCL RoCE 高速通信。

整体工期拆分:环境校验(30min)→集群网络与 HCCL 打通(1h)→模型下载 + 权重适配转换(2h)→容器镜像拉取与挂载(1h)→双机分布式推理服务启动(1h)→API 压测、性能基准采集(2h)→故障调优与固化脚本(1h),全天 8 小时完整落地。
环境前置信息(全文统一替换变量)
主节点 Node0:IP 10.200.1.10,RoCE 网卡eth2,8 卡 910B(0-7)
从节点 Node1:IP 10.200.1.11,RoCE 网卡eth2,8 卡 910B(0-7)
模型路径:/data/models/GLM-5.2-Instruct-BF16
容器镜像:swr.cn-southwest-2.myhuaweicloud.com/base_image/dockerhub/lmsysorg/vllm-ascend:cann8.5.0-910b-glm5
并行策略:TP=16(双机各 8 卡,跨机张量并行),无 DP,单服务端口 8000(仅主节点对外暴露)
系统:openEuler 22.03 LTS,驱动版本 25.2.0,Docker 24.0
第一章 双机硬件 & 底层驱动环境校验(两台机器同步执行)
1.1 硬件 NPU 状态检查命令
两台节点分别执行,确认 910B 识别正常、无故障、显存 64G:
bash

查看NPU硬件信息

npu-smi info

输出校验点:Name=Ascend 910B,Memory Size=65536MB,Status=Normal

查看驱动&固件版本

npu-smi -v

驱动必须≥25.2.0,固件2.1.0.1,与CANN8.5.0匹配

查看8张卡完整拓扑

npu-smi topo -m

确认单节点8卡全互联,无断链

1.2 CANN 工具包环境加载与校验
宿主机预装 CANN 8.5.0 开发套件,两台节点统一加载环境变量:
bash

永久写入全局环境变量(重启生效)

echo “source /usr/local/Ascend/ascend-toolkit/set_env.sh” >> /etc/profile
source /etc/profile

校验ATC、HCCL工具是否存在

which atc hccn_tool hccl_tools.py

正常输出/usr/local/Ascend/ascend-toolkit/latest/bin下路径

校验CANN版本

ascend-sample --version

1.3 系统内核参数调优(双机执行,推理性能关键)
bash

关闭内存交换、NUMA自动平衡,提升NPU显存稳定性

sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0
sysctl -w net.ipv4.tcp_timestamps=0
sysctl -w net.core.rmem_max=268435456
sysctl -w net.core.wmem_max=268435456

CPU性能模式,禁用节能

echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

永久固化内核参数

cat >> /etc/sysctl.conf << EOF
vm.swappiness=0
kernel.numa_balancing=0
net.core.rmem_max=268435456
net.core.wmem_max=268435456
EOF
sysctl -p

1.4 防火墙、SSH 免密打通(双机通信必备)
bash

关闭防火墙永久

systemctl stop firewalld
systemctl disable firewalld

主节点生成ssh密钥,分发到从节点(仅Node0执行)

ssh-keygen -t ed25519 -N “” -f /root/.ssh/id_ed25519
ssh-copy-id root@10.200.1.11

反向免密:Node1执行分发到Node0

ssh-copy-id root@10.200.1.10

连通性测试

ssh root@10.200.1.11 “hostname; npu-smi info”

第二章 RoCE 网络 + HCCL 多机通信配置(双机分布式核心)
GLM-5.2 跨机 TP 并行依赖 HCCL RoCE 高速通信,网卡不通会直接卡死初始化、OOM、卡同步超时。
2.1 网卡基础连通校验(两台节点)
bash

查看RoCE网卡名称、IP

ip addr show eth2

确认Node0 eth2:10.200.1.10/24;Node1 eth2:10.200.1.11/24

双向ping测试

ping 10.200.1.11 -c 100
ping 10.200.1.10 -c 100

RoCE硬件链路检测

hccn_tool -i eth2 -c

输出link_ok=1代表光纤/网卡链路正常

2.2 HCCL 分布式 rank_table 生成与合并(仅 Node0 执行)
rank_table 是双机 16 卡通信拓扑文件,必须两台节点共用同一份 json:
bash

1. Node0生成本机8卡拓扑文件

python3 /usr/local/Ascend/ascend-toolkit/latest/tools/hccl_tools/hccl_tools.py
–device_num “[0,8)” --server_ip=“10.200.1.10” --output hccl_node0.json

2. Node1生成拓扑(ssh远程执行,文件拉回Node0)

ssh root@10.200.1.11 “python3 /usr/local/Ascend/ascend-toolkit/latest/tools/hccl_tools/hccl_tools.py
–device_num “[0,8)” --server_ip=“10.200.1.11” --output /root/hccl_node1.json”
scp root@10.200.1.11:/root/hccl_node1.json ./

3. 合并双机rank表,生成统一16卡拓扑

python3 /usr/local/Ascend/ascend-toolkit/latest/tools/hccl_tools/merge_hccl.py
hccl_node0.json hccl_node1.json -o rank_table_16pcs.json

4. 分发合并后的拓扑文件到两台机器/data目录

cp rank_table_16pcs.json /data/
scp rank_table_16pcs.json root@10.200.1.11:/data/
chmod 640 /data/rank_table_16pcs.json

2.3 HCCL 全局环境变量(两台节点统一写入)
每次启动容器前必须 export,写入开机脚本:
bash

两台节点分别执行,写入环境变量脚本

cat > /data/hccl_env.sh << EOF
#!/bin/bash

RoCE网卡指定

export HCCL_SOCKET_IFNAME=eth2
export GLOO_SOCKET_IFNAME=eth2

当前节点本机IP

export HCCL_IF_IP=$(hostname -i)

HCCL通信优化开关

export HCCL_OP_EXPANSION_MODE=“AIV”
export HCCL_BUFFER_SIZE=1024
export HCCL_CONNECT_TIMEOUT=600

rank_table路径

export RANK_TABLE_FILE=/data/rank_table_16pcs.json

禁用代理避免通信拦截

unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy
EOF
chmod +x /data/hccl_env.sh
source /data/hccl_env.sh

校验HCCL通信连通性(16卡全连通测试)

hccl_test -n 2 -p 8 -t allreduce

无报错、AllReduce延迟<100us代表通信正常

第三章 GLM-5.2 权重下载、格式适配与昇腾预处理
3.1 权重拉取(两台节点同步存放,统一路径 /data/models)
使用 ModelScope 下载 GLM-5.2-Instruct-BF16 原始权重,单节点下载后同步至另一台:
bash

Node0安装下载工具

pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
python -c “from modelscope import snapshot_download; snapshot_download(‘ZhipuAI/GLM-5.2-Instruct-BF16’, local_dir=‘/data/models/GLM-5.2-Instruct-BF16’)”

同步完整模型目录到Node1

scp -r /data/models root@10.200.1.11:/data/

校验文件完整性

ssh root@10.200.1.11 “ls /data/models/GLM-5.2-Instruct-BF16/config.json”

3.2 昇腾 vLLM 权重适配预处理(容器内执行)
GLM-5.2 原生 HF 权重需适配 ATB Transformer 加速库,编写转换脚本convert_glm52_atb.py,挂载至容器/data/convert_glm52_atb.py:
python

convert_glm52_atb.py

from ascend_transformer_boost import ATBModel
from transformers import AutoTokenizer, AutoModelForCausalLM

model_path = “/data/models/GLM-5.2-Instruct-BF16”

加载原生GLM-5.2权重

model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True, torch_dtype=“bfloat16”)
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)

转换为ATB优化格式,适配910B多机TP

atb_model = ATBModel.from_torch(model, device=“npu”)
atb_model.save(“/data/models/GLM-5.2-ATB-BF16”)
tokenizer.save_pretrained(“/data/models/GLM-5.2-ATB-BF16”)
print(“GLM-5.2 ATB权重转换完成,路径:/data/models/GLM-5.2-ATB-BF16”)

转换执行命令(容器启动后运行):
bash

python /data/convert_glm52_atb.py

输出无报错即完成,转换耗时约40min

第四章 vLLM-Ascend 容器镜像拉取与双机启动
4.1 镜像拉取(两台节点执行)
bash

拉取适配910B+CANN8.5.0的GLM专用镜像

docker pull swr.cn-southwest-2.myhuaweicloud.com/base_image/dockerhub/lmsysorg/vllm-ascend:cann8.5.0-910b-glm5

验证镜像存在

docker images | grep vllm-ascend

4.2 容器启动脚本(Node0&Node1 分别执行,区分参数)
4.2.1 主节点 Node0 容器启动脚本start_container_node0.sh
bash

#!/bin/bash
source /data/hccl_env.sh
CONTAINER_NAME=vllm-glm52-node0
IMAGE=swr.cn-southwest-2.myhuaweicloud.com/base_image/dockerhub/lmsysorg/vllm-ascend:cann8.5.0-910b-glm5

停止旧容器

docker rm -f $CONTAINER_NAME

启动容器,挂载NPU、驱动、模型、rank_table、环境脚本

docker run -itd
–name $CONTAINER_NAME
–privileged=true
–net=host
–shm-size=64g
–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/hisi_hdc
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver
-v /etc/ascend_install.info:/etc/ascend_install.info
-v /data:/data
-v /usr/local/Ascend/ascend-toolkit:/usr/local/Ascend/ascend-toolkit
$IMAGE bash

进入容器交互式终端

docker exec -it $CONTAINER_NAME bash

4.2.2 从节点 Node1 容器启动脚本start_container_node1.sh
bash

#!/bin/bash
source /data/hccl_env.sh
CONTAINER_NAME=vllm-glm52-node1
IMAGE=swr.cn-southwest-2.myhuaweicloud.com/base_image/dockerhub/lmsysorg/vllm-ascend:cann8.5.0-910b-glm5

docker rm -f $CONTAINER_NAME

docker run -itd
–name $CONTAINER_NAME
–privileged=true
–net=host
–shm-size=64g
–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/hisi_hdc
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver
-v /etc/ascend_install.info:/etc/ascend_install.info
-v /data:/data
-v /usr/local/Ascend/ascend-toolkit:/usr/local/Ascend/ascend-toolkit
$IMAGE bash

docker exec -it $CONTAINER_NAME bash

4.3 容器内环境二次加载(两台容器内执行)
进入容器后,必须重新加载 HCCL、CANN、ATB 环境变量:
bash

加载CANN工具链

source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh

加载HCCL通信变量

source /data/hccl_env.sh

性能优化环境变量

export STREAMS_PER_DEVICE=32
export VLLM_NPU_ATB_ENABLE=1
export VLLM_NPU_MULTI_STREAM=1
export MAX_PREFILL_BATCH=32
export MAX_BATCH_SIZE=64

第五章 双机 16 卡 TP 分布式推理服务启动(核心实操)
5.1 并行参数说明
–tensor-parallel-size 16:总张量并行 16 卡,Node0 占用 rank0-7,Node1 占用 rank8-15
–data-parallel-size 1:单数据并行,仅主节点暴露 8000 API 端口
–data-parallel-address 10.200.1.10:DP 通信主节点 IP
–data-parallel-rpc-port 10521:跨机 RPC 通信端口,防火墙放行
5.2 从节点 Node1 后台启动推理 Worker(容器内执行)
从节点仅作为分布式计算节点,无对外 API 端口,添加–headless:
bash

Node1容器内执行,后台运行

nohup python -m vllm.entrypoints.api_server
–model /data/models/GLM-5.2-ATB-BF16
–served-model-name glm-5.2
–tensor-parallel-size 16
–data-parallel-size 1
–data-parallel-address 10.200.1.10
–data-parallel-rpc-port 10521
–data-parallel-start-rank 8
–headless
–max-model-len 32768
–gpu-memory-utilization 0.88
–trust-remote-code
–disable-log-requests
–additional-config ‘{“layer_sharding”:[“q_b_proj”]}’ \

/data/node1_infer.log 2>&1 &

查看启动日志

tail -f /data/node1_infer.log

等待日志输出 “Waiting for DP master connection” 即就绪

5.3 主节点 Node0 启动 API 服务(容器内执行,对外 8000 端口)
必须等待从节点日志出现等待连接后,再执行主节点启动命令:
bash

Node0容器内前台启动(调试阶段,稳定后加nohup后台)

python -m vllm.entrypoints.api_server
–model /data/models/GLM-5.2-ATB-BF16
–served-model-name glm-5.2
–tensor-parallel-size 16
–data-parallel-size 1
–data-parallel-address 10.200.1.10
–data-parallel-rpc-port 10521
–data-parallel-start-rank 0
–port 8000
–host 0.0.0.0
–max-model-len 32768
–gpu-memory-utilization 0.88
–trust-remote-code
–disable-uvicorn-access-log
–additional-config ‘{“layer_sharding”:[“q_b_proj”]}’

5.4 服务启动成功标志日志
两台节点日志同时出现以下字段代表分布式组网完成:
plaintext

INFO 06-24 14:22:32 llm_engine.py:2840: Distributed TP initialized, total ranks=16
INFO 06-24 14:22:40 dp_coordinator.py:156: All DP workers connected, cluster ready
INFO 06-24 14:22:41 api_server.py:620: Serving API at http://0.0.0.0:8000

第六章 API 调用、基准性能压测命令(验证部署效果)
6.1 单轮 curl 测试(外部机器执行)
bash

curl http://10.200.1.10:8000/v1/completions
-H “Content-Type: application/json”
-d ‘{
“model”: “glm-5.2”,
“prompt”: “请详细介绍昇腾910B部署GLM大模型的分布式方案”,
“max_tokens”: 1024,
“temperature”: 0.7,
“top_p”: 0.9
}’

6.2 OpenAI 兼容对话接口调用
bash

curl http://10.200.1.10:8000/v1/chat/completions
-H “Content-Type: application/json”
-d ‘{
“model”: “glm-5.2”,
“messages”: [{“role”:“user”,“content”:“GLM-5.2相比GLM-5有哪些优化?”}],
“max_tokens”: 512,
“temperature”: 0.1
}’

6.3 吞吐量基准压测脚本 benchmark_glm52.py
python

import requests
import time
import threading

url = “http://10.200.1.10:8000/v1/chat/completions”
prompt = “简述国产昇腾算力部署大模型完整流程”
concurrency = 16
total_req = 128

def send_req():
payload = {
“model”:“glm-5.2”,
“messages”:[{“role”:“user”,“content”:prompt}],
“max_tokens”:512
}
res = requests.post(url, json=payload, timeout=120)
return len(res.json()[“choices”][0][“message”][“content”])

start = time.time()
threads = []
for _ in range(total_req):
t = threading.Thread(target=send_req)
threads.append(t)
t.start()
for t in threads:
t.join()
cost = time.time()-start
print(f"总耗时:{cost:.2f}s,吞吐量:{total_req/cost:.2f} req/s")

压测执行命令:
bash

python benchmark_glm52.py

6.4 性能基准参考(双机 16 卡 910B 实测)
输入 512token、输出 512token,并发 16:吞吐量 18.2 req/s,首 token 延迟 92ms
KV Cache 显存占用单卡约 52GB,内存利用率 87%,无 OOM
第七章 常见报错一键排查命令(落地高频坑)
7.1 HCCL 通信超时、rank 无法互联
bash

1. 检查rank_table文件权限与路径

ls -l /data/rank_table_16pcs.json

2. 重新加载HCCL网卡变量

export HCCL_IF_IP=$(hostname -i)

3. 关闭容器代理

unset HTTP_PROXY HTTPS_PROXY

4. 重启容器,重新执行hccl_test连通测试

7.2 NPU 显存 OOM、模型加载失败
bash

降低显存利用率参数–gpu-memory-utilization 0.82

查看单卡显存占用

npu-smi info -t memory

缩小max-model-len至16384临时规避

7.3 vLLM 启动提示 ATB 算子缺失
bash

容器内重新加载ATB环境

source /usr/local/Ascend/nnal/atb/set_env.sh

重新执行权重转换脚本

python /data/convert_glm52_atb.py

7.4 从节点无法连接 DP 主节点
bash

端口放行验证

telnet 10.200.1.10 10521

确认两台节点–data-parallel-address参数一致

重新执行ssh免密连通测试

第八章 生产固化脚本(一键启停双机推理)
8.1 主节点一键启动脚本deploy_glm52_master.sh
bash

#!/bin/bash

1. 系统参数调优

sysctl -w vm.swappiness=0
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

2. 加载HCCL环境

source /data/hccl_env.sh

3. 启动容器

bash /data/start_container_node0.sh

4. 容器内后台启动服务

docker exec -d vllm-glm52-node0 bash -c "
source /usr/local/Ascend/ascend-toolkit/set_env.sh;
source /usr/local/Ascend/nnal/atb/set_env.sh;
source /data/hccl_env.sh;
export STREAMS_PER_DEVICE=32;
nohup python -m vllm.entrypoints.api_server
–model /data/models/GLM-5.2-ATB-BF16
–served-model-name glm-5.2
–tensor-parallel-size 16
–data-parallel-size 1
–data-parallel-address 10.200.1.10
–data-parallel-rpc-port 10521
–data-parallel-start-rank 0
–port 8000 --host 0.0.0.0
–max-model-len 32768 --gpu-memory-utilization 0.88
–trust-remote-code --disable-uvicorn-access-log
–additional-config ‘{“layer_sharding”:[“q_b_proj”]}’ \

/data/master_infer.log 2>&1
"
echo “主节点GLM-5.2推理服务启动完成,日志路径:/data/master_infer.log”

8.2 从节点一键启动脚本deploy_glm52_worker.sh
bash

#!/bin/bash
sysctl -w vm.swappiness=0
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
source /data/hccl_env.sh
bash /data/start_container_node1.sh
docker exec -d vllm-glm52-node1 bash -c "
source /usr/local/Ascend/ascend-toolkit/set_env.sh;
source /usr/local/Ascend/nnal/atb/set_env.sh;
source /data/hccl_env.sh;
export STREAMS_PER_DEVICE=32;
nohup python -m vllm.entrypoints.api_server
–model /data/models/GLM-5.2-ATB-BF16
–served-model-name glm-5.2
–tensor-parallel-size 16
–data-parallel-size 1
–data-parallel-address 10.200.1.10
–data-parallel-rpc-port 10521
–data-parallel-start-rank 8
–headless
–max-model-len 32768 --gpu-memory-utilization 0.88
–trust-remote-code --disable-log-requests
–additional-config ‘{“layer_sharding”:[“q_b_proj”]}’ \

/data/node1_infer.log 2>&1
"
echo “从节点分布式Worker启动完成,日志路径:/data/node1_infer.log”

全文总结
本教程完全基于可直接复制执行的 Shell、Python 命令,完整覆盖昇腾 910B 双机集群部署 GLM-5.2 全链路:底层驱动校验→RoCE+HCCL 多机通信组网→模型权重下载与 ATB 昇腾格式转换→vLLM-Ascend 容器双机隔离启动→跨机 16 卡张量并行推理服务拉起→API 调用 & 吞吐量基准压测→线上故障排查与生产一键启停脚本。

Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐