vLLM 数据并行部署
vLLM 通过 PagedAttention 机制显著提高了大语言模型服务吞吐量。为了进一步提升部署规模与效率,vLLM 提供了灵活的数据并行(Data Parallelism,DP)方案。本文将解析 vLLM 的 DP 部署模式,并重点介绍 vLLM-Ascend 针对外部 DP 的增强工具。
1. 数据并行概述
在 vLLM 的数据并行架构中,每个 DP 进程被视为一个独立的“核心引擎”(Core Engine)实例,通过 ZMQ 套接字与前端(Front-end)进程通信。
1.1 并行组合策略
数据并行可与其他并行技术组合使用:
- DP + TP:每个 DP 引擎内部包含多个 GPU Worker,数量由 TP 大小决定。例如
--data-parallel-size=4 --tensor-parallel-size=2共需 8 个设备,分成 4 组 DP,每组 2 个 TP。 - EP 与 MoE 模型:对于 MoE 模型,DP 与 TP / EP 可协同工作。在 TP 与 DP 结合的情况下,专家层形成大小为
的并行组。
1.2 负载均衡的重要性
由于每个 DP 引擎拥有独立的 KV Cache,通过实时考量各引擎的状态(当前已调度请求、等待请求、KV Cache 状态等),可以智能分配新 Prompt,从而最大化前缀缓存(Prefix Caching)效益。
2. 内部负载均衡(Internal Load Balancing)模式
内部负载均衡提供自包含的 DP 部署方案,对外只暴露一个统一的 API 入口。
2.1 单节点部署
vllm serve $MODEL --data-parallel-size 4 --tensor-parallel-size 2上述命令将在一个拥有 8 块 GPU 的节点上启动 DP=4、TP=2 的部署。
2.2 多节点部署
跨多节点部署时,需在每个节点运行不同的 vllm serve 命令,指定该节点承载的 DP 进程。API 服务器仅在一个节点上运行,不必与 DP 引擎同节点。
| 参数 | 说明 |
|---|---|
--data-parallel-size | 全局 DP 进程总数 |
--data-parallel-size-local | 当前节点上的 DP 进程数 |
--data-parallel-start-rank | 当前节点本地 DP 进程的起始 Rank |
--data-parallel-address | DP 进程间 RPC 通信的“头节点”IP |
--data-parallel-rpc-port | DP 进程间 RPC 通信端口 |
--headless | 标识为非头节点,不启动 API 服务器 |
示例 1:两节点部署 DP=4,节点 0 运行 Rank 0/1,节点 1 运行 Rank 2/3。
# 节点 0(IP: 10.99.48.128),作为 API 服务器
vllm serve $MODEL \
--data-parallel-size 4 \
--data-parallel-size-local 2 \
--data-parallel-address 10.99.48.128 \
--data-parallel-rpc-port 13345
# 节点 1(引擎节点)
vllm serve $MODEL \
--headless \
--data-parallel-size 4 \
--data-parallel-size-local 2 \
--data-parallel-start-rank 2 \
--data-parallel-address 10.99.48.128 \
--data-parallel-rpc-port 13345示例 2:节点 0 仅运行 API 服务器,节点 1 运行所有 DP 引擎。
# Node 0
vllm serve $MODEL \
--data-parallel-size 4 \
--data-parallel-size-local 0 \
--data-parallel-address 10.99.48.128 \
--data-parallel-rpc-port 13345
# Node 1
vllm serve $MODEL \
--headless \
--data-parallel-size 4 \
--data-parallel-size-local 4 \
--data-parallel-address 10.99.48.128 \
--data-parallel-rpc-port 133452.3 使用 Ray 后端
使用 --data-parallel-backend=ray 可简化多节点部署,只需一个启动命令即可启动所有本地和远程 DP 进程,无需手动指定 --data-parallel-address。
vllm serve $MODEL \
--data-parallel-size 4 \
--data-parallel-size-local 2 \
--data-parallel-backend=ray使用 Ray 时的差异:
- 只需在任意节点执行单一启动命令。
- 无需指定
--data-parallel-address与--data-parallel-rpc-port。 - 当单个 DP 组需要跨多个节点时,需设置
VLLM_RAY_DP_PACK_STRATEGY="span",此时--data-parallel-size-local会被忽略并自动确定。 - 远程 DP 进程根据 Ray 集群资源动态分配。
3. 外部负载均衡(External Load Balancing)模式
对于超大规模部署,将 DP 进程的编排与负载均衡交给外部系统更具优势。
3.1 核心概念
外部 DP 模式下:
- 每个 DP 进程是一个独立的 vLLM 部署实例。
- 每个实例拥有独立的 API 端点。
- 外部路由或代理服务在这些实例之间分配 HTTP 请求。
外部路由可利用每个 vLLM 服务器的实时遥测数据(如 KV Cache 命中率、队列长度)制定更优路由决策。
3.2 单节点示例
若 DP Rank 位于同一节点,使用默认 RPC 端口,但需为每个 Rank 指定不同 HTTP 端口:
# Rank 0
CUDA_VISIBLE_DEVICES=0 vllm serve $MODEL \
--data-parallel-size 2 \
--data-parallel-rank 0 \
--port 8000
# Rank 1
CUDA_VISIBLE_DEVICES=1 vllm serve $MODEL \
--data-parallel-size 2 \
--data-parallel-rank 1 \
--port 80013.3 多节点示例
# Rank 0(IP: 10.99.48.128)
vllm serve $MODEL \
--data-parallel-size 2 \
--data-parallel-rank 0 \
--data-parallel-address 10.99.48.128 \
--data-parallel-rpc-port 13345
# Rank 1
vllm serve $MODEL \
--data-parallel-size 2 \
--data-parallel-rank 1 \
--data-parallel-address 10.99.48.128 \
--data-parallel-rpc-port 13345在此场景下,协调器进程与 DP Rank 0 引擎共置一处。
4. vLLM-Ascend 外部 DP 部署实战
针对昇腾(Ascend)硬件场景,vLLM-Ascend 提供了两项关键增强:
- 一键启动脚本:通过
launch_online_dp.py快速启动多个 vLLM 实例。 - 请求长度感知负载均衡代理(Request-Length-Aware Load Balance Proxy):根据请求上下文长度智能路由,优化吞吐量。
4.1 前提条件
- Python 3.10+。
- 安装代理依赖:
pip install fastapi httpx uvicorn4.2 启动外部 DP 服务器
4.2.1 手动启动(DP Size 2)
# vLLM DP Rank 0
vllm serve --host 0.0.0.0 --port 8100 \
--data-parallel-size 2 --data-parallel-rank 0 ...
# vLLM DP Rank 1
vllm serve --host 0.0.0.0 --port 8101 \
--data-parallel-size 2 --data-parallel-rank 1 ...4.2.2 使用启动脚本(推荐)
修改 examples/external_online_dp/run_dp_template.sh 后,使用 launch_online_dp.py 一键启动。
单节点示例(DP=2,TP=4):
cd examples/external_online_dp
python launch_online_dp.py \
--dp-size 2 \
--tp-size 4 \
--dp-size-local 2 \
--dp-rank-start 0 \
--dp-address x.x.x.x \
--dp-rpc-port 12342两节点分布式示例(DP=4,TP=4):
# 节点 0
cd examples/external_online_dp
python launch_online_dp.py \
--dp-size 4 --tp-size 4 --dp-size-local 2 \
--dp-rank-start 0 \
--dp-address x.x.x.x --dp-rpc-port 12342
# 节点 1
python launch_online_dp.py \
--dp-size 4 --tp-size 4 --dp-size-local 2 \
--dp-rank-start 2 \
--dp-address x.x.x.x --dp-rpc-port 123424.3 启动负载均衡代理
所有 vLLM DP 实例启动后(默认从 9000 端口递增),启动代理作为统一入口。
代理特性:
- 基于请求长度的智能负载均衡。
- 支持 OpenAI 兼容的
/v1/completions与/v1/chat/completions。 - 支持后端到客户端的流式响应。
cd examples/external_online_dp
python dp_load_balance_proxy_server.py \
--host 0.0.0.0 --port 8000 \
--dp-hosts 127.0.0.1 127.0.0.1 \
--dp-ports 9000 9001客户端请求发送到 0.0.0.0:8000,代理将智能路由到不同 vLLM DP 实例,实现外部负载均衡的 DP 部署。