vLLM Prefill-Decode 分散式架構與 MORI-IO

vLLM Prefill-Decode 分散式架構與 MORI-IO

vLLM 為單節點部署引入了 Prefill-Decode(PD)分散式架構,使 8 GPU AMD Instinct MI300X 節點的 goodput 提升 2.5 倍。透過將計算受限的 prefill 階段與記憶體頻寬受限的 decode 階段分離,vLLM 消除了這些工作負載在同一 GPU 資源競爭時通常會出現的 Inter-Token Latency(ITL)峰值。

共置服務的瓶頸

在標準的單體部署中,prefill 與 decode 工作負載共用相同的 GPU 資源與排程器。由於 prefill 使用大型 GEMM 並行處理整個提示詞,它受限於計算,耗時遠超單一 decode 步驟。當一個 prefill 請求加入批次時,會阻塞所有正在進行的 decode 流,導致 Inter-Token Latency(ITL)出現不可預測的峰值。

單節點 PD 分散式架構

與普遍認為分散式需要多節點叢集的觀念相反,vLLM 在單一 8 GPU 節點內實現此架構。系統轉為微服務架構,包含三個元件:

  • Prefill Instance(Prefill 實例): 處理輸入提示詞並產生 KV 快取(例如使用 GPU 0–3)。
  • Decode Instance(Decode 實例): 使用已傳輸的 KV 快取產生輸出 token(例如使用 GPU 4–7)。
  • Proxy Server(代理伺服器): 作為入口點,將請求先導向 prefill 實例,再導向 decode 實例。

為了在這些實例之間傳輸數 GB 的 KV 快取資料,vLLM 使用 MORI-IO,這是一個基於 RDMA 的 KV 快取連接器,建構於開源的 MORI(Modular RDMA Interface)框架之上。

KV 快取傳輸模式:讀取 vs. 寫入

MORI-IO 支援兩種不同的傳輸模式,可透過 VLLM_MORIIO_CONNECTOR_READ_MODE 環境變數進行設定:

讀取模式 (VLLM_MORIIO_CONNECTOR_READ_MODE=1)

在讀取模式下,代理會串行分派請求。它會等待 prefill 實例完成並回傳 remote_block_ids 後,才將請求轉發給 decode 實例。decode 實例隨後透過 RDMA 從 prefill 實例的記憶體中拉取 KV 快取。

寫入模式(預設)

在寫入模式下,代理會同時向 prefill 與 decode 實例分派請求。當 prefill 實例計算每一層時,它會透過 RDMA WRITE 直接將 KV 資料寫入 decode 實例預先分配的記憶體。此方式消除了代理的序列化開銷,並使 decode 隊列的等待與 prefill 計算重疊。

Property(屬性) Read Mode(讀取模式) Write Mode(寫入模式)
RDMA Direction(RDMA 方向) Decode 從 prefill 拉取 Prefill 推送至 decode
Proxy Dispatch(代理分派) Serial (await prefill $\rightarrow$ dispatch decode)(串行(等待 prefill $\rightarrow$ 分派 decode)) Concurrent (prefill and decode in parallel)(同時(prefill 與 decode 並行))
Block ID Relay(Block ID 中繼) 需要透過代理 不需要
KV Cleanup(KV 清理) Decode 通知 prefill 釋放區塊 Prefill 追蹤寫入完成

效能結果與 Goodput

在 8 GPU MI300X 節點上使用 Qwen3-235B-A22B-FP8 模型(2000 token 提示詞,1000 token 輸出),vLLM 以 goodput 來衡量效能——即在請求同時滿足首 token 時間 (TTFT) < 1 秒且 ITL < 50 毫秒的最大請求率。

主要發現

  • 2.5 倍 Goodput 提升: 寫入模式在 8 req/s 的速率下,有 73/100 的請求符合 SLO,遠高於標準 TP8 服務的 26/100。
  • 消除 ITL 峰值: 分散式模式完全消除了 ITL 違規,因為 decode 引擎與計算密集的 prefill 工作相互隔離。
  • TTFT 折衷: 分散式會因額外的 RDMA 傳輸與代理開銷而提升 TTFT。寫入模式相較於讀取模式提供更佳的 TTFT,因為它消除了代理的序列化。

部署與設定

部署 PD 分散式需要在 vLLM 中設定 kv-transfer-config。兩個實例皆必須指定 MoRIIOConnector 並設定各自的角色(prefill 使用 kv_producer,decode 使用 kv_consumer)。

埠需求

  • proxy_ping_port:用於實例向代理註冊的 ZMQ 端點。
  • http_port:vLLM HTTP 伺服器的推論請求埠。
  • handshake_port:一次性的 KV 快取布局元資料交換埠。
  • notify_port:每個請求的同步訊號,指示 KV 區塊已就緒。

使用情境摘要

Situation(情境) Recommendation(建議)
ITL p99 超過生產負載下的 SLO 分散式
TTFT 為主要限制因素 標準服務
高併發且提示詞較長 分散式
請求率低且提示詞較短 標準服務

Sources