外部数据并行#

特别是在大规模部署场景下,在外部处理数据并行(Data Parallel, DP)Rank 的编排和负载均衡通常更有意义。

在这种情况下,将每个 DP Rank 视为一个独立的 vLLM 部署会更方便。每个 Rank 拥有自己的端点(Endpoint),并通过外部路由器在它们之间分配 HTTP 请求负载,同时利用来自每个服务器的实时遥测数据来做出路由决策。

快速入门#

外部 DP 功能已由 vLLM 原生支持。在 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 Rank 内部调用 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 separately.
# 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。