跳到内容

数据并行部署

vLLM 支持数据并行部署,即将模型权重复制到独立的实例/GPU 上,以处理独立的请求批次。

这适用于密集模型和混合专家(MoE)模型。

对于 MoE 模型,特别是像 DeepSeek 这样采用 MLA(多头潜在注意力)的模型,使用数据并行处理注意力层,并使用专家并行(EP)或张量并行(TP)处理专家层是有益的。

在这种情况下,数据并行排名(rank)并非完全独立。前向传播必须对齐,且无论当前待处理的请求是否少于数据并行(DP)排名数,所有排名中的专家层都必须在每次前向传播过程中进行同步。

默认情况下,专家层构成大小为 DP × TP 的张量并行组。若要使用专家并行,请包含 --enable-expert-parallel 命令行参数(在多节点情况下需在所有节点上设置)。有关注意力层和专家层在启用 EP 后的不同行为,请参阅 专家并行部署

在 vLLM 中,每个 DP 排名都部署为独立的“核心引擎”进程,通过 ZMQ 套接字与前端进程通信。数据并行注意力可以与张量并行注意力结合使用,在这种情况下,每个 DP 引擎拥有数量等于所配置 TP 大小的每个 GPU 的工作进程。

对于 MoE 模型,当任何排名中有正在进行的请求时,我们必须确保在当前没有任何请求调度的所有排名中执行空的“虚拟”前向传播。这由与所有排名通信的独立 DP 协调器进程处理,并每隔 N 步执行一次集体操作,以确定何时所有排名都处于空闲状态并可以暂停。当 TP 与 DP 结合使用时,专家层构成一个大小为 DP × TP 的组(默认使用张量并行,如果设置了 --enable-expert-parallel,则使用专家并行)。

在所有情况下,在 DP 排名之间进行负载均衡都是有益的。对于在线部署,可以通过考虑每个 DP 引擎的状态(特别是其当前调度和等待中的队列,以及 KV 缓存状态)来优化这种均衡。每个 DP 引擎都有独立的 KV 缓存,通过智能分发提示词(prompts),可以最大化前缀缓存(prefix caching)的收益。

本文档侧重于在线部署(使用 API 服务器)。DP + EP 也支持离线使用(通过 LLM 类),示例请参考 examples/offline_inference/data_parallel.py

在线部署支持两种不同的模式:带有内部负载均衡的自包含模式,或外部每排名进程部署及负载均衡模式。

内部负载均衡

vLLM 支持提供单个 API 端点的“自包含”数据并行部署。

只需在 vllm 命令行参数中加入 --data-parallel-size=4 即可配置。这将需要 4 个 GPU。它可以与张量并行结合使用,例如 --data-parallel-size=4 --tensor-parallel-size=2,这需要 8 个 GPU。在调整 DP 部署大小时,请记住 --max-num-seqs 参数适用于每个 DP 排名。

跨多个节点运行单个数据并行部署时,需要在每个节点上运行不同的 vllm serve 命令,并指定该节点应运行的 DP 排名。在这种情况下,仍然会有一个单一的 HTTP 入口点——API 服务器仅在一个节点上运行,但不一定要与 DP 排名部署在同一节点上。

这将在单个 8-GPU 节点上运行 DP=4, TP=2

vllm serve $MODEL --data-parallel-size 4 --tensor-parallel-size 2

这将在主节点上运行 DP 排名 0 和 1,在第二个节点上运行排名 2 和 3,实现 DP=4

# Node 0  (with ip address 10.99.48.128)
vllm serve $MODEL --data-parallel-size 4 --data-parallel-size-local 2 \
                  --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 2 \
                  --data-parallel-start-rank 2 \
                  --data-parallel-address 10.99.48.128 --data-parallel-rpc-port 13345

这将在第一个节点上仅运行 API 服务器,在第二个节点上运行所有引擎,实现 DP=4

# Node 0  (with ip address 10.99.48.128)
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

通过指定 --data-parallel-backend=ray,此 DP 模式也可以与 Ray 一起使用

vllm serve $MODEL --data-parallel-size 4 --data-parallel-size-local 2 \
                  --data-parallel-backend=ray

使用 Ray 时有几个显著的区别

  • 只需在一个节点上执行单个启动命令即可启动所有本地和远程 DP 排名,因此比在每个节点上启动更方便
  • 无需指定 --data-parallel-address,运行该命令的节点将自动用作 --data-parallel-address
  • 无需指定 --data-parallel-rpc-port
  • 当单个 DP 组需要多个节点时,例如如果单个模型副本需要至少在两个节点上运行,请确保设置 VLLM_RAY_DP_PACK_STRATEGY="span",在这种情况下,--data-parallel-size-local 将被忽略并自动确定
  • 远程 DP 排名将根据 Ray 集群的节点资源进行分配

目前,内部 DP 负载均衡是在 API 服务器进程内完成的,并基于每个引擎中的运行队列和等待队列。未来通过结合 KV 缓存感知逻辑,可以使其更加复杂。

使用此方法部署较大的 DP 规模时,API 服务器进程可能会成为瓶颈。在这种情况下,可以使用正交的 --api-server-count 命令行选项进行扩展(例如 --api-server-count=4)。这对用户是透明的——仍然只暴露一个 HTTP 端点/端口。请注意,这种 API 服务器的扩展是“内部”的,并且仍然局限于“主”节点。

DP Internal LB Diagram

混合负载均衡

混合负载均衡介于内部和外部方法之间。每个节点运行自己的 API 服务器,仅将请求排队到部署在该节点上的数据并行引擎。上游负载均衡器(例如 Ingress 控制器或流量路由)将用户请求分发到这些单节点端点。

使用 --data-parallel-hybrid-lb 启用此模式,同时仍以全局数据并行大小启动每个节点。与内部负载均衡的主要区别在于:

  • 必须提供 --data-parallel-size-local--data-parallel-start-rank,以便每个节点知道它拥有哪些排名。
  • --headless 不兼容,因为每个节点都暴露一个 API 端点。
  • 根据本地排名数量缩放每个节点的 --api-server-count

在这种配置下,每个节点将调度决策保持在本地,这减少了跨节点流量并避免了在大规模 DP 下的单节点瓶颈。

外部负载均衡

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

在这种情况下,将每个 DP 排名视为单独的 vLLM 部署(具有自己的端点)会更方便,并让外部路由器在它们之间平衡 HTTP 请求,同时利用每个服务器的实时遥测数据进行路由决策。

对于非 MoE 模型,这已经可以轻松完成,因为每个部署的服务器都是完全独立的。无需使用任何数据并行命令行选项。

我们支持 MoE DP+EP 的等效拓扑,可通过以下命令行参数配置。

如果 DP 排名位于同一节点/IP 地址,则使用默认的 RPC 端口,但必须为每个排名指定不同的 HTTP 服务器端口

# 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

对于多节点情况,还必须指定排名 0 的地址/端口

# Rank 0  (with ip address 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 排名 0 引擎部署在同一节点。

DP External LB Diagram

在上图中,每个虚线框对应于 vllm serve 的单独启动——例如,它们可以是单独的 Kubernetes Pod。