跳到內容

資料並行部署

vLLM 支援資料並行部署,其中模型權重在獨立的例項/GPU 上進行復制,以處理獨立的請求批次。

這適用於密集模型和 MoE 模型。

對於 MoE 模型,特別是像 DeepSeek 這樣採用 MLA(多頭潛在注意力)的模型,將資料並行用於注意力層,將專家並行或張量並行(EP 或 TP)用於專家層會更有優勢。

在這些情況下,資料並行等級並非完全獨立。前向傳播必須對齊,並且所有等級的專家層在每次前向傳播期間都需要同步,即使待處理請求少於 DP 等級數量。

專家層預設會形成一個 (DP x TP) 大小的張量並行組。要啟用專家並行,請包含 `--enable-expert-parallel` 命令列引數(在多節點情況下的所有節點上)。

在 vLLM 中,每個 DP 等級都被部署為一個獨立的“核心引擎”程序,透過 ZMQ 套接字與前端程序通訊。資料並行注意力可以與張量並行注意力結合使用,在這種情況下,每個 DP 引擎擁有數量等於配置的 TP 大小的每個 GPU 工作程序。

對於 MoE 模型,當任何等級中有任何請求正在進行時,我們必須確保在所有當前沒有排程請求的等級中執行空的“虛擬”前向傳播。這透過一個獨立的 DP 協調器程序處理,該程序與所有等級通訊,並且每 N 步執行一次集體操作,以確定所有等級何時都變為空閒並可以暫停。當 TP 與 DP 結合使用時,專家層會形成一個大小為 (DP x TP) 的 EP 或 TP 組。

在所有情況下,在 DP 等級之間進行請求負載均衡都是有益的。對於線上部署,可以透過考慮每個 DP 引擎的狀態來最佳化這種均衡,特別是其當前已排程和等待(排隊)的請求以及 KV 快取狀態。每個 DP 引擎都有一個獨立的 KV 快取,並且可以透過智慧地引導提示來最大化字首快取的效益。

本文件側重於線上部署(帶有 API 伺服器)。DP + EP 也支援離線使用(透過 LLM 類),示例請參見 examples/offline_inference/data_parallel.py

線上部署支援兩種不同的模式——自包含的內部負載均衡,或外部的按等級程序部署和負載均衡。

內部負載均衡

vLLM 支援“自包含的”資料並行部署,公開單個 API 端點。

只需在 vllm serve 命令列引數中包含例如 `--data-parallel-size=4` 即可進行配置。這將需要 4 個 GPU。它可以與張量並行結合,例如 `--data-parallel-size=4 --tensor-parallel-size=2`,這將需要 8 個 GPU。

在多個節點上執行單個數據並行部署需要在每個節點上執行不同的 `vllm serve`,指定哪些 DP 等級應在該節點上執行。在這種情況下,仍然會有一個單一的 HTTP 入口點——API 伺服器將只在一個節點上執行,但它不一定需要與 DP 等級共同定位。

這將在單個 8 GPU 節點上執行 DP=4, TP=2

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

這將在頭節點上執行 DP=4 的 DP 等級 0 和 1,在第二個節點上執行等級 2 和 3

# 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

這種 DP 模式也可以透過指定 `--data-parallel-backend=ray` 與 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 等級將根據 Ray 叢集的節點資源進行分配

目前,內部 DP 負載均衡是在 API 伺服器程序中完成的,並基於每個引擎中執行中和等待中的佇列。未來可以透過整合 KV 快取感知邏輯使其更加複雜。

使用此方法部署大型 DP 時,API 伺服器程序可能成為瓶頸。在這種情況下,可以使用正交的 `--api-server-count` 命令列選項來橫向擴充套件(例如 `--api-server-count=4`)。這對使用者來說是透明的——仍然公開單個 HTTP 端點/埠。請注意,此 API 伺服器的橫向擴充套件是“內部的”,並且仍限於“頭”節點。

DP Internal LB Diagram

外部負載均衡

特別是對於更大規模的部署,外部處理資料並行等級的編排和負載均衡可能更有意義。

在這種情況下,將每個 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。