GitHub | 文件 | 論文

大型語言模型 (LLM) 有望從根本上改變我們在各行各業中使用人工智慧的方式。然而,實際部署這些模型具有挑戰性,即使在昂貴的硬體上,速度也可能出奇地慢。今天,我們很高興推出 vLLM,這是一個用於快速 LLM 推理和服務的開源庫。vLLM 利用了分頁注意力 (PagedAttention),我們新的注意力演算法,可以有效地管理注意力鍵和值。配備分頁注意力的 vLLM 重新定義了 LLM 服務的最先進水平:它提供的吞吐量比 HuggingFace Transformers 高達 24 倍,而無需任何模型架構更改。

vLLM 在加州大學伯克利分校開發,並在過去的兩個月裡部署在 Chatbot Arena 和 Vicuna Demo 上。它是使 LLM 服務價格合理的核心技術,即使對於像 LMSYS 這樣計算資源有限的小型研究團隊也是如此。立即透過我們的 GitHub 倉庫 中的單個命令試用 vLLM。

超越最先進的效能

我們將 vLLM 的吞吐量與 HuggingFace Transformers (HF)(最流行的 LLM 庫)和 HuggingFace Text Generation Inference (TGI)(之前的最先進技術)進行比較。我們在兩種設定下進行評估:NVIDIA A10G GPU 上的 LLaMA-7B 和 NVIDIA A100 GPU (40GB) 上的 LLaMA-13B。我們從 ShareGPT 資料集中取樣請求的輸入/輸出長度。在我們的實驗中,與 HF 相比,vLLM 的吞吐量提高了24 倍,與 TGI 相比,吞吐量提高了3.5 倍


當每個請求要求一個輸出補全時的服務吞吐量。vLLM 實現的吞吐量比 HF 高 14 倍 - 24 倍,比 TGI 高 2.2 倍 - 2.5 倍。


當每個請求要求三個並行輸出補全時的服務吞吐量。vLLM 實現的吞吐量比 HF 高 8.5 倍 - 15 倍,比 TGI 高 3.3 倍 - 3.5 倍。

秘訣:分頁注意力

在 vLLM 中,我們發現 LLM 服務的效能瓶頸在於記憶體。在自迴歸解碼過程中,LLM 的所有輸入 token 都會生成其注意力鍵和值張量,並且這些張量會儲存在 GPU 記憶體中以生成下一個 token。這些快取的鍵和值張量通常被稱為 KV 快取。KV 快取是

  • 龐大的: 在 LLaMA-13B 中,單個序列最多佔用 1.7GB。
  • 動態的: 其大小取決於序列長度,序列長度是高度可變且不可預測的。因此,有效管理 KV 快取提出了一個重大挑戰。我們發現,由於碎片化和過度預留,現有系統浪費了 60% – 80% 的記憶體。

為了解決這個問題,我們引入了 分頁注意力 (PagedAttention),這是一種受作業系統中經典虛擬記憶體和分頁思想啟發的注意力演算法。與傳統的注意力演算法不同,分頁注意力允許在非連續記憶體空間中儲存連續的鍵和值。具體來說,分頁注意力將每個序列的 KV 快取劃分為塊,每個塊包含固定數量 token 的鍵和值。在注意力計算期間,分頁注意力核心有效地識別並獲取這些塊。


分頁注意力: KV 快取被劃分為塊。塊不需要在記憶體空間中是連續的。

由於塊不需要在記憶體中是連續的,我們可以像作業系統虛擬記憶體中那樣以更靈活的方式管理鍵和值:可以將塊視為頁面,將 token 視為位元組,將序列視為程序。序列的連續邏輯塊透過塊表對映到非連續物理塊。物理塊在生成新 token 時按需分配。


使用分頁注意力處理請求的示例生成過程。

在分頁注意力中,記憶體浪費僅發生在序列的最後一個塊中。在實踐中,這實現了接近最佳的記憶體使用率,僅浪費不到 4%。記憶體效率的提高被證明是非常有益的:它允許系統批次處理更多序列,提高 GPU 利用率,從而顯著提高吞吐量,如上面的效能結果所示。

分頁注意力還具有另一個關鍵優勢:高效的記憶體共享。例如,在並行取樣中,從同一提示生成多個輸出序列。在這種情況下,提示的計算和記憶體可以在輸出序列之間共享。


並行取樣的示例。

分頁注意力透過其塊表自然地實現了記憶體共享。類似於程序如何共享物理頁面,分頁注意力中的不同序列可以透過將其邏輯塊對映到相同的物理塊來共享塊。為了確保安全共享,分頁注意力會跟蹤物理塊的引用計數並實現寫入時複製 (Copy-on-Write) 機制。


對請求進行多次輸出取樣的示例生成過程。

分頁注意力的記憶體共享大大降低了複雜取樣演算法(如並行取樣和束搜尋)的記憶體開銷,將其記憶體使用量減少了高達 55%。這可以轉化為高達 2.2 倍的吞吐量提升。這使得此類取樣方法在 LLM 服務中變得實用。

分頁注意力是 vLLM 背後的核心技術,我們的 LLM 推理和服務引擎支援各種模型,具有高效能和易於使用的介面。有關 vLLM 和分頁注意力的更多技術細節,請檢視我們的 GitHub 倉庫,並請關注我們的論文。

LMSYS Vicuna 和 Chatbot Arena 背後的無名英雄

今年四月,LMSYS 開發了流行的 Vicuna 聊天機器人模型,並將其公開發布。從那時起,Vicuna 已在 Chatbot Arena 中為數百萬使用者提供服務。最初,LMSYS FastChat 採用基於 HF Transformers 的 服務後端 來為聊天演示提供服務。隨著演示變得越來越受歡迎,峰值流量多次攀升,使得 HF 後端成為一個重要的瓶頸。LMSYS 和 vLLM 團隊共同努力,很快開發了 FastChat-vLLM 整合,以使用 vLLM 作為新的後端,以支援不斷增長的需求(流量增加高達 5 倍)。在 LMSYS 的早期 內部微基準測試 中,vLLM 服務後端可以實現比初始 HF 後端高 30 倍的吞吐量。

自四月中旬以來,最流行的模型(如 Vicuna、Koala 和 LLaMA)都已成功使用 FastChat-vLLM 整合進行服務——LMSYS 使用 FastChat 作為多模型聊天服務前端,vLLM 作為推理後端,能夠利用有限數量的大學贊助 GPU 為數百萬使用者提供高吞吐量低延遲的 Vicuna 服務。LMSYS 正在將 vLLM 的使用擴充套件到更廣泛的模型,包括 Databricks Dolly、LAION 的 OpenAsssiant 和 Stability AI 的 stableLM。對更多模型的支援正在開發中,即將推出。


4 月至 5 月期間 Chatbot Arena 中由 FastChat-vLLM 整合服務的請求。實際上,超過一半的 Chatbot Arena 請求使用 vLLM 作為推理後端。

vLLM 的使用還顯著降低了運營成本。藉助 vLLM,LMSYS 能夠將用於服務上述流量的 GPU 數量減少 50%。vLLM 平均每天處理 3 萬個請求,高峰時達到 6 萬個,這清楚地證明了 vLLM 的穩健性。

開始使用 vLLM

使用以下命令安裝 vLLM(檢視我們的安裝指南瞭解更多資訊)

$ pip install vllm

vLLM 可用於離線推理和線上服務。要將 vLLM 用於離線推理,您可以匯入 vLLM 並在您的 Python 指令碼中使用 LLM

from vllm import LLM

prompts = ["Hello, my name is", "The capital of France is"]  # Sample prompts.
llm = LLM(model="lmsys/vicuna-7b-v1.3")  # Create an LLM.
outputs = llm.generate(prompts)  # Generate texts from the prompts.

要將 vLLM 用於線上服務,您可以透過以下方式啟動與 OpenAI API 相容的伺服器

$ python -m vllm.entrypoints.openai.api_server --model lmsys/vicuna-7b-v1.3

您可以使用與 OpenAI API 相同的格式查詢伺服器

$ curl https://:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "lmsys/vicuna-7b-v1.3",
        "prompt": "San Francisco is a",
        "max_tokens": 7,
        "temperature": 0
    }'

有關更多使用 vLLM 的方法,請檢視快速入門指南



部落格由 Woosuk Kwon 和 Zhuohan Li(加州大學伯克利分校)撰寫。特別感謝 Hao Zhang 整合 vLLM 和 FastChat 並撰寫相應部分。我們感謝整個團隊 — Siyuan Zhuang、Ying Sheng、Lianmin Zheng(加州大學伯克利分校)、Cody Yu(獨立研究員)、Joey Gonzalez(加州大學伯克利分校)、Hao Zhang(加州大學伯克利分校和 UCSD)和 Ion Stoica(加州大學伯克利分校)。