外部数据并行#

特别是在大规模部署场景下,在外部处理数据并行等级的编排与负载均衡是有意义的。

在这种情况下,将每个数据并行等级视为一个独立的 vLLM 部署(拥有自己的端点),并使用一个外部路由器在它们之间平衡 HTTP 请求,同时利用来自每个服务器的适当实时遥测数据来做出路由决策,会更加方便。

开始使用#

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

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

  2. 一个支持外部数据并行、可感知请求长度的负载均衡代理。

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

先决条件#

  • Python 3.10+

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

pip install fastapi httpx uvicorn

启动外部数据并行服务器#

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

您可以手动逐个启动外部 vLLM 数据并行服务器,也可以使用 examples/external_online_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 实例。它将在内部为每个数据并行等级调用 examples/external_online_dp/run_dp_template.sh,并传入适当的数据并行相关参数。

在单个节点上运行外部数据并行的示例:

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

在两个节点上运行外部数据并行的示例:

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 数据并行实例启动后,您现在可以启动负载均衡代理服务器。该服务器作为传入请求的入口点,并在各个 vLLM 数据并行实例之间进行负载均衡。

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

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

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

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

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

# 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 \

此后,您可以直接向代理服务器发送请求,并运行具有外部负载均衡功能的数据并行。