Skip to content

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 结合的情况下,专家层形成大小为 (DP×TP) 的并行组。

1.2 负载均衡的重要性

由于每个 DP 引擎拥有独立的 KV Cache,通过实时考量各引擎的状态(当前已调度请求、等待请求、KV Cache 状态等),可以智能分配新 Prompt,从而最大化前缀缓存(Prefix Caching)效益。

2. 内部负载均衡(Internal Load Balancing)模式

内部负载均衡提供自包含的 DP 部署方案,对外只暴露一个统一的 API 入口

2.1 单节点部署

bash
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-addressDP 进程间 RPC 通信的“头节点”IP
--data-parallel-rpc-portDP 进程间 RPC 通信端口
--headless标识为非头节点,不启动 API 服务器

示例 1:两节点部署 DP=4,节点 0 运行 Rank 0/1,节点 1 运行 Rank 2/3。

bash
# 节点 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 引擎。

bash
# 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 13345

2.3 使用 Ray 后端

使用 --data-parallel-backend=ray 可简化多节点部署,只需一个启动命令即可启动所有本地和远程 DP 进程,无需手动指定 --data-parallel-address

bash
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 模式下:

  1. 每个 DP 进程是一个独立的 vLLM 部署实例。
  2. 每个实例拥有独立的 API 端点。
  3. 外部路由或代理服务在这些实例之间分配 HTTP 请求。

外部路由可利用每个 vLLM 服务器的实时遥测数据(如 KV Cache 命中率、队列长度)制定更优路由决策。

3.2 单节点示例

若 DP Rank 位于同一节点,使用默认 RPC 端口,但需为每个 Rank 指定不同 HTTP 端口:

bash
# 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 8001

3.3 多节点示例

bash
# 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 提供了两项关键增强:

  1. 一键启动脚本:通过 launch_online_dp.py 快速启动多个 vLLM 实例。
  2. 请求长度感知负载均衡代理(Request-Length-Aware Load Balance Proxy):根据请求上下文长度智能路由,优化吞吐量。

4.1 前提条件

  • Python 3.10+。
  • 安装代理依赖:
bash
  pip install fastapi httpx uvicorn

4.2 启动外部 DP 服务器

4.2.1 手动启动(DP Size 2)

bash
# 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)

bash
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)

bash
# 节点 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 12342

4.3 启动负载均衡代理

所有 vLLM DP 实例启动后(默认从 9000 端口递增),启动代理作为统一入口。

代理特性:

  • 基于请求长度的智能负载均衡。
  • 支持 OpenAI 兼容的 /v1/completions/v1/chat/completions
  • 支持后端到客户端的流式响应。
bash
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 部署。

参考

Maintained by Robin