跳到內容

分散式編碼器

一個分散式編碼器將多模態 LLM 的視覺編碼器階段執行在一個獨立於預填充/解碼器階段的程序中。將這兩個階段部署在獨立的 vLLM 例項中帶來三個實際好處

  1. 獨立、細粒度擴充套件
  2. 更低的首次令牌延遲 (TTFT)
  3. 編碼器輸出的跨程序複用和快取

設計文件:https://docs.google.com/document/d/1aed8KtC6XkXtdoV87pWT0a8OJlZ-CpnuLLzmR8l9BAE


1. 動機

1. 獨立、細粒度擴充套件

  • 視覺編碼器很輕量,而語言模型則大幾個數量級。
  • 語言模型可以並行化,而不會影響編碼器叢集。
  • 可以獨立地新增或刪除編碼器節點。

2. 更低的首次令牌延遲 (TTFT)

  • 純語言請求完全繞過視覺編碼器。
  • 編碼器輸出僅在需要的注意力層注入,縮短了預填充的關鍵路徑。

3. 跨程序複用和快取

  • 程序內編碼器將複用限制在單個工作程序中。
  • 遠端共享快取允許任何工作程序檢索現有嵌入,消除了冗餘計算。

2. 使用示例

當前的參考路徑是ExampleConnector
下面的即用型指令碼展示了工作流程

1 個編碼器例項 + 1 個 PD 例項:examples/online_serving/disaggregated_encoder/disagg_1e1pd_example.sh

1 個編碼器例項 + 1 個預填充例項 + 1 個解碼例項:examples/online_serving/disaggregated_encoder/disagg_1e1p1d_example.sh


3. 測試指令碼

請參考目錄tests/v1/ec_connector

4. 開發

分散式編碼是透過執行兩個部分實現的

  • 編碼器例項 - 執行視覺編碼的 vLLM 例項。
  • 預填充/解碼 (PD) 例項 - 執行語言預填充和解碼。
    • PD 可以是單個普通例項,使用disagg_encoder_example.sh (E->PD),也可以是分散式例項,使用disagg_epd_example.sh (E->P->D)

聯結器將編碼器快取 (EC) 嵌入從編碼器例項傳輸到 PD 例項。
所有相關程式碼都在vllm/distributed/ec_transfer目錄下。

關鍵抽象

  • ECConnector - 用於檢索編碼器生成的 EC 快取的介面。
    • 排程器角色 - 檢查快取是否存在並排程負載。
    • 工作程序角色 - 將嵌入載入到記憶體中。

這是一個說明分散式編碼器流程的圖

Disaggregated Encoder Flow

對於 PD 分散式部分,預填充例項接收快取,與上述分散式編碼器流程完全相同。預填充例項執行 1 步 (預填充 -> 輸出 1 個令牌),然後將 KV 快取傳輸到解碼例項以完成剩餘執行。KV 傳輸部分純粹發生在 PD 例項執行之後。

docs/features/disagg_prefill.md 展示了分散式預填充 (v0) 的簡要思路

我們使用vllm/distributed/kv_transfer/kv_connector/v1/nixl_connector.py中的NixlConnector建立了示例設定,並參考了tests/v1/kv_connector/nixl_integration/toy_proxy_server.py來促進 P 和 D 之間的 KV 傳輸;