在大模型推理的多机部署中,vLLM 常见的实现方式是基于 Ray 的分布式方案。不过,借助多节点参数组合(如 DP + TP),也可以在不依赖额外调度框架的情况下完成跨机协同推理。本文将以实际环境为例,介绍如何通过这种方式完成多节点部署配置。
- 硬件环境:两台 Atlas 800I A2(8张 910B 64G)
- 示例模型:Qwen/Qwen3.5-397B-A17B 的 w8a8 量化版 Eco-Tech/Qwen3.5-397B-A17B-w8a8-mtp
- 推理引擎参考文档:docs.vllm.ai/projects/as…
部署核心步骤:
- 拉取最新的 vllm-ascend 镜像
- 在 GPUStack 平台中,将该镜像作为 vLLM 后端添加
- 获取跨机部署所需的网络信息(提取主从节点的网卡名称与 IP 地址)
- 配置主节点
- 配置从节点
- 启动服务并进行推理测试
添加自定义后端版本
在平台中添加自定义后端时,请参考以下配置:
- 版本名称:建议与镜像的 Tag 保持一致(例如 0.18.0rc1)
- 镜像地址:swr.cn-south-1.myhuaweicloud.com/gpustack/vllm-ascend:v0.18.0rc1 (GPUStack 同步的国内源镜像,原镜像:quay.io/ascend/vllm-ascend:v0.18.0rc1)
- 支持框架:CANN
- 入口命令:
vllm serve - 执行命令:
{{model_path}} --host {{worker_ip}} --port {{port}} --served-model-name {{model_name}}
双花括号包裹的部分为 GPUStack 动态值的占位符。
获取跨机部署的信息
在进行跨机部署前,需要分别确认主节点和从节点的网卡信息。
主节点网络状态:
从节点网络状态:
根据实际网络环境选择任一可用网卡即可。关键要求是该网卡与其他节点处于同一网段,并且能够正常通信。
注意:这里选择的网卡仅用于 API 通信,对网络要求较低,但底层通信仍依赖高速网络:
验证多节点通信:docs.vllm.ai/projects/as…
以本文的演示环境为例,网络参数选取如下:
- 主节点:网络接口名称为
enp67s0f0,本地 IP 为192.168.13.33。 - 从节点:网络接口名称为
enp67s0f0,本地 IP 为192.168.13.34。
vLLM 跨机分布式部署
主节点配置
- 在 GPUStack 部署页面,展开部署菜单,选择 ModelScope
-
搜索并选择模型:
Eco-Tech/Qwen3.5-397B-A17B-w8a8-mtp -
初始配置时,先将副本数调整为 0
提示:我们需要等待主从两个模型的参数都配置完毕后,再统一进行启动。
- 将推理后端设置为 vLLM,并将版本指定为我们在前面步骤中添加的
0.18.0rc1
- 将调度方式修改为“手动”,并勾选主节点(Node 1)对应的所有 NPU 卡
- 进入详细参数配置页面
主节点高级参数填写如下:
--data-parallel-size 2 --tensor-parallel-size 8 # 并行策略:2个数据并行(DP),8个张量并行(TP)。注意:需保持在同一行
--data-parallel-size-local=1 # 当前节点上运行的 DP 副本数
--api-server-count=2 # API 服务进程数(未指定时默认等于 DP 数量)
--data-parallel-address=192.168.13.33 # 多节点 DP 场景下的主节点 IP 地址。请以实际环境中获取的地址为准
--data-parallel-rpc-port=13389 # 多节点 DP 的 RPC 通信端口
--seed=1024 # 随机种子(多节点需保持一致以对齐采样逻辑,默认: 0)
--enable-expert-parallel
--max-num-seqs=16 # 单次迭代最大并发序列数(吞吐量与延迟/显存的折中点)
--max-model-len=32768 # 最大上下文长度(按需设置,过大易导致显存溢出 OOM)
--max-num-batched-tokens=8192 # 单次 Batch 处理的最大 Token 数(用于控制显存峰值)
--gpu-memory-utilization=0.90
--trust-remote-code
--async-scheduling # 启用异步调度(重叠 CPU 调度与 GPU 计算开销,提升吞吐)
--no-enable-prefix-caching
--speculative_config '{"method":"qwen3_5_mtp","num_speculative_tokens":3,"enforce_eager":true}'
--compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}'
--additional-config '{"enable_cpu_binding":true,"multistream_overlap_shared_expert":true}'
--disable-access-log-for-endpoints /health,/metrics,/ping # 屏蔽健康检查等探针接口的访问日志,保持日志清晰聚焦业务请求
注意:--tensor-parallel-size 参数请与 --data-parallel-size 参数保持在同一行,避免单独换行导致参数校验失败。GPUStack 平台后续版本将对该部署方式进行优化。
主节点环境变量填写如下:
PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
HCCL_IF_IP=192.168.13.33 # 请以实际环境中获取的地址为准
GLOO_SOCKET_IFNAME=enp67s0f0 # 请以实际环境中获取的网卡名称为准
TP_SOCKET_IFNAME=enp67s0f0 # 同上
HCCL_SOCKET_IFNAME=enp67s0f0 # 同上
OMP_PROC_BIND=false
OMP_NUM_THREADS=1
HCCL_BUFFSIZE=1024
TASK_QUEUE_ENABLE=1
VLLM_ENGINE_READY_TIMEOUT_S=1500 # vLLM 引擎启动的超时时间(秒),多节点大模型加载耗时较长,需适当调大(此处设为 25 分钟)
从节点配置
- 直接克隆已配置好的主节点模型
- 将调度选项中,勾选从节点(Node 2)对应的所有 NPU 卡
- 调整从节点的高级参数,与主节点相比差异如下:
- --api-server-count=2
+ --data-parallel-start-rank=1
+ --headless
- 调整从节点的环境变量,与主节点相比差异如下:
- HCCL_IF_IP=192.168.13.33
+ HCCL_IF_IP=192.168.13.34
注意:如果网卡名称不一致,也需进行修改。
启动并测试模型
至此,跨机 DP 的相关参数已全部配置完毕。您可以将主节点与从节点的副本数从 0 恢复为 1,以启动模型实例。启动的先后顺序没有严格限制,短时间内依次启动即可。
等待主节点模型成功启动并处于 Running 状态后,即可在试验场发起对话测试。
注意:从节点会一直处于 Staring 状态,这是正常的。
如何禁用思考过程?
在请求体中传入 enable_thinking: false,参考示例如下:
curl http://your-gpustack-server/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${YOUR_GPUSTACK_API_KEY}" \
-d '{
"model": "qwen3.5-397b-1",
"messages": [
{
"role": "user",
"content": "你好"
}
],
"extra_body": {
"chat_template_kwargs": {
"enable_thinking": false
}
}
}'
小结
在多节点 DP 部署下,请求会在各节点之间进行分发。相比简单的均匀分配,这种方式能够结合各节点当前的运行状态(如请求处理进度、负载情况等)进行更动态的调度,从而减少单节点因长请求导致的阻塞,在高并发场景下整体吞吐更稳定。
加入 GPUStack 社区
GPUStack 社区聚焦 AI 基础设施与大模型实践。
社区中持续分享真实环境下的部署经验、问题排查案例,以及推理引擎、算力管理和系统架构相关讨论。
欢迎扫码加入 GPUStack 社区,与更多关注 AI Infra 与大模型推理实践的伙伴一起交流、学习与分享。
若群聊已满或二维码失效,请访问以下页面查看最新群二维码: github.com/gpustack/gp…