資料並行部署¶
vLLM 支援資料並行部署,其中模型權重被複制到獨立的例項/GPU 上,以處理獨立的請求批次。
這適用於密集模型和 MoE 模型。
對於 MoE 模型,特別是像 DeepSeek 這樣採用 MLA(多頭潛在注意力)的模型,可以考慮為注意力層使用資料並行,為專家層使用專家並行或張量並行(EP 或 TP)。
在這些情況下,資料並行等級(ranks)並非完全獨立。前向傳播必須對齊,並且所有等級的專家層在每次前向傳播時都需要同步,即使要處理的請求數量少於 DP 等級。
預設情況下,專家層形成一個大小為 DP × TP 的張量並行組。要使用專家並行,請包含 --enable-expert-parallel CLI 引數(在多節點情況下,所有節點都需要)。有關注意力層和專家層在啟用 EP 後行為差異的詳細資訊,請參閱 專家並行部署。
在 vLLM 中,每個 DP 等級被部署為一個獨立的“核心引擎”程序,透過 ZMQ 套接字與前端程序通訊。資料並行注意力可以與張量並行注意力結合使用,在這種情況下,每個 DP 引擎擁有等於配置的 TP 大小的每個 GPU 工作程序數。
對於 MoE 模型,當任何等級中有請求正在處理時,我們必須確保在當前沒有安排任何請求的等級中執行空的“虛擬”前向傳播。這透過一個獨立的 DP 協調器程序(與所有等級通訊)和一個每 N 步執行的集體操作來處理,以確定所有等級何時空閒並可以暫停。當 TP 與 DP 一起使用時,專家層形成一個大小為 DP × TP 的組(預設使用張量並行,如果設定了 --enable-expert-parallel 則使用專家並行)。
在所有情況下,對 DP 等級之間的請求進行負載均衡都是有益的。對於線上部署,可以透過考慮每個 DP 引擎的狀態來最佳化這種均衡——特別是其當前已安排和等待(排隊)的請求以及 KV 快取狀態。每個 DP 引擎都有獨立的 KV 快取,透過智慧地分配提示(prompts)可以最大化字首快取的優勢。
本文件側重於線上部署(透過 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。在調整 DP 部署大小時,請記住 --max-num-seqs 是按 DP 等級應用的。
在多節點上執行單個數據並行部署需要在每個節點上執行不同的 vllm serve,並指定該節點上應執行的 DP 等級。在這種情況下,仍然會有一個單一的 HTTP 入口點——API 伺服器將在其中一個節點上執行,但不必與 DP 等級共置。
這將在一個 8 GPU 的節點上執行 DP=4,TP=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
這將執行 DP=4,其中第一個節點上只有 API 伺服器,所有引擎都在第二個節點上
# 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 模式也可以與 Ray 一起使用,方法是指定 --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 伺服器的擴充套件是“內部”的,仍然限制在“主”節點上。
混合負載均衡¶
混合負載均衡介於內部和外部方法之間。每個節點執行自己的 API 伺服器,這些伺服器僅將請求排隊到位於該節點上的資料並行引擎。上游負載均衡器(例如,入口控制器或流量路由器)將使用者請求分發到這些每節點端點。
使用 --data-parallel-hybrid-lb 啟用此模式,同時仍然使用全域性資料並行大小啟動每個節點。與內部負載均衡的主要區別在於:
- 您必須提供
--data-parallel-size-local和--data-parallel-start-rank,以便每個節點知道它擁有的等級。 - 與
--headless不相容,因為每個節點都公開一個 API 端點。 - 根據本地等級的數量,每個節點按比例縮放
--api-server-count。
在此配置中,每個節點將排程決策保留在本地,這減少了跨節點流量,並避免了在較大 DP 大小時出現單節點瓶頸。
外部負載均衡¶
特別是在大規模部署中,由外部系統來處理資料並行rank的編排和負載均衡可能更為合理。
在這種情況下,將每個 DP 等級視為單獨的 vLLM 部署,並具有自己的端點,然後由外部路由器在它們之間平衡 HTTP 請求,利用來自每個伺服器的適當即時遙測資料來做出路由決策,這樣更方便。
對於非 MoE 模型,這已經可以輕鬆實現,因為每個部署的伺服器都是完全獨立的。對此不需要使用資料並行 CLI 選項。
我們支援 MoE DP+EP 的等效拓撲,可以透過以下 CLI 引數進行配置。
如果 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 引擎共置。
在上圖中,每個虛線框對應於一次單獨的 vllm serve 啟動——這些可能是單獨的 Kubernetes pod,例如。

