自2024年12月以來,透過vLLM社群和vLLM上的昇騰團隊的共同努力,我們完成了硬體可插拔RFC。該提案允許以解耦的方式將硬體整合到vLLM中,從而能夠快速且模組化地支援不同的硬體平臺。


為什麼選擇vLLM硬體外掛?

目前,vLLM已支援多種後端。然而,隨著vLLM後端數量的持續增長,出現了一些挑戰

  • 程式碼複雜性增加:每個硬體後端都有自己的ExecutorWorkerRunnerAttention元件。這增加了vLLM程式碼庫的複雜性,非通用的後端特定程式碼散佈在整個專案中。
  • 高維護成本:維護後端的成本很高,不僅對後端開發者,也對vLLM社群而言。當後端維護者不在時,社群貢獻者資源的稀缺使得有效新增新功能變得困難。
  • 缺乏可擴充套件性:雖然vLLM透過實現ExecutorWorkerRunnerAttention遵循了結構良好的分層設計,但支援新硬體通常需要侵入性的修改或補丁,而不是動態註冊。這使得新增新後端變得麻煩。

認識到需要一種靈活和模組化的方法來整合硬體後端,我們提出了硬體外掛作為一個可行的解決方案

  • 解耦的程式碼庫:硬體後端外掛程式碼保持獨立,使得vLLM核心程式碼更清晰。
  • 減輕維護負擔:vLLM開發者可以專注於通用功能,而不會因後端特定實現造成的差異而感到不知所措。
  • 更快整合且更獨立:新後端可以快速整合,工作量更少,並且可以獨立發展。

什麼是vLLM硬體外掛?

在介紹vLLM硬體外掛之前,我們先來看兩個前提RFC

基於這些RFC,我們提出了[RFC] 硬體可插拔,它將Platform模組整合到vLLM中作為外掛。此外,我們重構了ExecutorWorkerModelRunnerAttentionBackendCommunicator,以更靈活地支援硬體外掛。

目前,vLLM社群已成功實現了RFC中介紹的Platform模組。透過vllm-project/vllm-ascendvllm-project/vllm-spyre專案驗證了其功能。利用此外掛機制,我們成功地將vLLM與昇騰NPU和IBM Spyre後端進行了整合。


如何透過vLLM硬體外掛機制整合新的後端

本節將從開發者和使用者的角度深入探討如何透過硬體外掛整合新的後端。

開發者視角

要使用硬體外掛將新的後端整合到vLLM中,請按照以下步驟操作

步驟1:建立新專案並初始化平臺

首先為新的後端建立一個Python專案並新增一個platform.py檔案。然後,從vllm.platforms匯入Platform類並實現所需的屬性和方法。

您可以參考vLLM Ascend專案中的platform.py作為示例。

步驟2:實現自定義Worker、Model Runner、Attention Backend和Communicator模組

根據新後端的需要,實現以下模組

from vllm.worker.worker_base import WorkerBase
from vllm.worker.model_runner_base import ModelRunnerBase
from vllm.attention.backends.abstract import AttentionBackend
from vllm.distributed.device_communicators.base_communicator import CommunicatorBase

這些類在vLLM中都有相應的基類。同樣,您可以參考vLLM Ascend的實現作為示例。

步驟3:註冊外掛

使用Python的入口點機制在setup.py中註冊外掛

setup(
    entry_points={'vllm.platform_plugins': ["{your_platform_name} = {code_path}:{register_function}"]}
)
  • {your_platform_name}:新後端的名稱(可以是任意的)。
  • {code_path}:主Python模組的路徑。
  • {register_function}:註冊函式,返回在步驟1中定義的Platform類的路徑。

參考vLLM Ascend中的setup.py獲取實際示例。


使用者視角

使用者只需在執行前安裝vllm和您的外掛,以vllm-ascend為例

pip install vllm vllm-ascend

啟動時,您將看到以下日誌,這意味著後端外掛正在正常工作

INFO 02-06 15:49:01 __init__.py:30] Available plugins for group vllm.platform_plugins:
INFO 02-06 15:49:01 __init__.py:32] name=ascend, value=vllm_ascend:register
… …
INFO 02-06 15:49:01 __init__.py:44] plugin ascend loaded.
INFO 02-06 15:49:01 __init__.py:181] Platform plugin ascend is activated

未來展望

未來,我們將繼續與vLLM社群的開發者協作,以增強以下方面

  1. 持續增強V1 Engine和VLMs。
  2. 擴充套件對更多模組和功能的外掛支援,例如排程器、圖模式和自定義運算元。
  3. 更好的使用者體驗和更高的效能。
  4. 維護和增強適用於相應硬體平臺的穩定外掛架構

我們鼓勵大家嘗試這個新功能!如果您有任何問題,請加入vLLM Slack並在#sig-extensible-hardware頻道參與討論。🚀

致謝

這個靈活的硬體後端外掛機制離不開眾多vLLM貢獻者的努力。因此,我們深切感謝vLLM的維護者,包括Kaichao YouSimon MoCyrus LeungRobert ShawMichael GoinJie Li,他們在相關重構、深入討論和快速評審方面做出了貢獻;vLLM上的昇騰團隊成員Xiyuan WangShanshan ShenChenguang LiMengqing Cao,他們進行了機制設計和實現;vLLM上的Spyre團隊成員Joe RundeYannick Schnider,他們進行了可插拔排程器的設計和實現;以及其他貢獻者,包括yancong,他設計和實現了可擴充套件的量化方法;Aviv Keshet,他貢獻了可擴充套件的SamplingParams