介紹vLLM硬體外掛,昇騰NPU上的最佳實踐
自2024年12月以來,透過vLLM社群和vLLM上的昇騰團隊的共同努力,我們完成了硬體可插拔RFC。該提案允許以解耦的方式將硬體整合到vLLM中,從而能夠快速且模組化地支援不同的硬體平臺。
為什麼選擇vLLM硬體外掛?
目前,vLLM已支援多種後端。然而,隨著vLLM後端數量的持續增長,出現了一些挑戰
- 程式碼複雜性增加:每個硬體後端都有自己的
Executor
、Worker
、Runner
和Attention
元件。這增加了vLLM程式碼庫的複雜性,非通用的後端特定程式碼散佈在整個專案中。 - 高維護成本:維護後端的成本很高,不僅對後端開發者,也對vLLM社群而言。當後端維護者不在時,社群貢獻者資源的稀缺使得有效新增新功能變得困難。
- 缺乏可擴充套件性:雖然vLLM透過實現
Executor
、Worker
、Runner
和Attention
遵循了結構良好的分層設計,但支援新硬體通常需要侵入性的修改或補丁,而不是動態註冊。這使得新增新後端變得麻煩。
認識到需要一種靈活和模組化的方法來整合硬體後端,我們提出了硬體外掛作為一個可行的解決方案
- 解耦的程式碼庫:硬體後端外掛程式碼保持獨立,使得vLLM核心程式碼更清晰。
- 減輕維護負擔:vLLM開發者可以專注於通用功能,而不會因後端特定實現造成的差異而感到不知所措。
- 更快整合且更獨立:新後端可以快速整合,工作量更少,並且可以獨立發展。
什麼是vLLM硬體外掛?
在介紹vLLM硬體外掛之前,我們先來看兩個前提RFC
- [RFC] vLLM外掛系統:此RFC引入了一種基於外掛的方法來支援各種定製需求,允許使用者定義自定義模型、執行器、排程器等。
- [RFC] 使vLLM與裝置無關以支援多種硬體和(vllm-project/vllm#6080):此RFC引入了平臺子模組,該子模組集中了與硬體相關的實現,以減少主程式碼庫中的條件邏輯,併為模組化奠定了基礎。
基於這些RFC,我們提出了[RFC] 硬體可插拔,它將Platform
模組整合到vLLM中作為外掛。此外,我們重構了Executor
、Worker
、ModelRunner
、AttentionBackend
和Communicator
,以更靈活地支援硬體外掛。
目前,vLLM社群已成功實現了RFC中介紹的Platform
模組。透過vllm-project/vllm-ascend和vllm-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社群的開發者協作,以增強以下方面
- 持續增強V1 Engine和VLMs。
- 擴充套件對更多模組和功能的外掛支援,例如排程器、圖模式和自定義運算元。
- 更好的使用者體驗和更高的效能。
- 維護和增強適用於相應硬體平臺的穩定外掛架構
我們鼓勵大家嘗試這個新功能!如果您有任何問題,請加入vLLM Slack並在#sig-extensible-hardware頻道參與討論。🚀
致謝
這個靈活的硬體後端外掛機制離不開眾多vLLM貢獻者的努力。因此,我們深切感謝vLLM的維護者,包括Kaichao You、Simon Mo、Cyrus Leung、Robert Shaw、Michael Goin和Jie Li,他們在相關重構、深入討論和快速評審方面做出了貢獻;vLLM上的昇騰團隊成員Xiyuan Wang、Shanshan Shen、Chenguang Li和Mengqing Cao,他們進行了機制設計和實現;vLLM上的Spyre團隊成員Joe Runde和Yannick Schnider,他們進行了可插拔排程器的設計和實現;以及其他貢獻者,包括yancong,他設計和實現了可擴充套件的量化方法;Aviv Keshet,他貢獻了可擴充套件的SamplingParams
。