外部 DP#

特别是在大规模部署中,由外部系统来处理数据并行rank的编排和负载均衡可能更为合理。

在这种情况下,将每个 DP rank 视为一个独立的 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 rank 内部调用 `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 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。