外部数据并行#

特别是在大规模部署场景下,将数据并行等级的编排与负载均衡交由外部处理是合理的做法。

此时,将每个DP等级视为独立的vLLM部署(拥有独立端点),并通过外部路由器利用各服务器的实时遥测数据在它们之间均衡HTTP请求,是更便捷的方案。

快速开始#

vLLM 已原生支持外部DP功能。在vllm-ascend中,我们提供了两项增强功能:

  1. 一个启动脚本,可通过单条命令启动多个vLLM实例。

  2. 一个面向外部DP的请求长度感知型负载均衡代理。

本教程将介绍它们的使用方法。

前置条件#

  • Python 3.10+

  • 安装负载均衡代理服务器所需的依赖:

pip install fastapi httpx uvicorn

启动外部DP服务器#

首先,您需要至少两个以数据并行方式运行的vLLM服务器。这些可以是模拟服务器或实际vLLM服务器。注意:该代理在仅运行一个vLLM服务器时也能工作,但会退化为直接转发请求,这没有实际意义。

您可以手动逐个启动外部vLLM DP服务器,或使用examples/external_online_dp中的启动脚本。对于跨多节点的大规模DP场景,建议使用启动脚本以简化操作。

手动启动#

# This example shows how to manually launch a vLLM service with DP size 2 in one node.
vllm serve --host 0.0.0.0 --port 8100 --data-parallel-size 2 --data-parallel-rank 0 ... # vLLM DP0
vllm serve --host 0.0.0.0 --port 8101 --data-parallel-size 2 --data-parallel-rank 1 ... # vLLM DP1

使用启动脚本#

首先,您需要根据vLLM配置修改examples/external_online_dp/run_dp_template.sh。然后使用examples/external_online_dp/launch_online_dp.py在每个节点上通过单条命令启动多个vLLM实例。该脚本会为每个DP等级调用examples/external_online_dp/run_dp_template.sh并传入正确的DP相关参数。

在单节点上运行外部DP的示例:

cd examples/external_online_dp
# running DP4 TP4 in a node with 16 NPUs
python launch_online_dp.py --dp-size 4 --tp-size 4 --dp-size-local 4 --dp-rank-start 0 --dp-address x.x.x.x --dp-rpc-port 12342

在两个节点上运行外部DP的示例:

cd examples/external_online_dp
# running DP4 TP4 in two nodes with 8 NPUs each
# Node 0 holds DP0 DP1 and node 1 holds DP2 DP3
# Here x.x.x.x:12342 is served as the common data parallel RPC address

# On node 0:
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

# On node 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

启动负载均衡代理服务器#

在所有vLLM DP实例启动后,您可以启动负载均衡代理服务器。该服务器作为请求入口,负责在vLLM DP实例之间进行负载均衡。

该代理服务器具有以下特性:

  • 基于请求长度将请求负载均衡到多个vLLM服务器。

  • 支持兼容OpenAI的/v1/completions/v1/chat/completions端点。

  • 将后端服务器的响应流式传输给客户端。

要运行代理服务器,您需要指定每个vLLM DP实例的主机和端口:

# For example, we have already started two DP instances in single node:
# python launch_online_dp.py --dp-size 2 --tp-size 8 --dp-size-local 2 --dp-rank-start 0 --dp-address x.x.x.x --dp-rpc-port 12342
# By default, launch_online_dp.py will launch vLLM instances from starting port 9000,
# so the vLLM ports for DP0 and DP1 are 9000 and 9001 respectively.
# Then you can start the load-balance proxy server by:
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 \

完成上述操作后,您可以直接向代理服务器发送请求,运行带有外部负载均衡的DP。