分散式編碼器¶
一個分散式編碼器將多模態 LLM 的視覺編碼器階段執行在一個獨立於預填充/解碼器階段的程序中。將這兩個階段部署在獨立的 vLLM 例項中帶來三個實際好處
- 獨立、細粒度擴充套件
- 更低的首次令牌延遲 (TTFT)
- 編碼器輸出的跨程序複用和快取
設計文件: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)
- PD 可以是單個普通例項,使用
聯結器將編碼器快取 (EC) 嵌入從編碼器例項傳輸到 PD 例項。
所有相關程式碼都在vllm/distributed/ec_transfer目錄下。
關鍵抽象¶
- ECConnector - 用於檢索編碼器生成的 EC 快取的介面。
- 排程器角色 - 檢查快取是否存在並排程負載。
- 工作程序角色 - 將嵌入載入到記憶體中。
這是一個說明分散式編碼器流程的圖
對於 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 傳輸;
