Berkeley vLLM:算力減半、吞吐增十倍

lsgxeva發表於2024-05-12

Berkeley vLLM:算力減半、吞吐增十倍

來源 https://zhuanlan.zhihu.com/p/697142422

隨著大語言模型(LLM)的不斷髮展,這些模型在很大程度上改變了人類使用 AI 的方式。然而,實際上為這些模型提供服務仍然存在挑戰,即使在昂貴的硬體上也可能慢得驚人。

現在這種限制正在被打破。最近,來自加州大學伯克利分校的研究者開源了一個專案 vLLM,該專案主要用於快速 LLM 推理和服務。vLLM 的核心是 PagedAttention,這是一種新穎的注意力演算法,它將在作業系統的虛擬記憶體中分頁的經典思想引入到 LLM 服務中。

配備了 PagedAttention 的 vLLM 將 LLM 服務狀態重新定義:它比 HuggingFace Transformers 提供高達 24 倍的吞吐量,而無需任何模型架構更改。

專案地址:

總結而言,vLLM 具有如下特點:

  • 最先進的服務吞吐量;
  • PagedAttention 可以有效的管理注意力的鍵和值;
  • 動態批處理請求;
  • 最佳化好的 CUDA 核心;
  • 與流行的 HuggingFace 模型無縫整合;
  • 高吞吐量服務與各種解碼演算法,包括並行取樣、beam search 等等;
  • 張量並行以支援分散式推理;
  • 流輸出;
  • 相容 OpenAI 的 API 服務。

vLLM 還可以無縫支援許多 Huggingface 模型,包括以下架構:

  • GPT-2 (gpt2、gpt2-xl 等);
  • GPTNeoX (EleutherAI/gpt-neox-20b、databricks/dolly-v2-12b、stabilityai/stablelm-tuned-alpha-7b 等);
  • LLaMA (lmsys/vicuna-13b-v1.3、young-geng/koala、openlm-research/open_llama_13b 等)
  • OPT (facebook/opt-66b、facebook/opt-iml-max-30b 等)。

值得一提的是,vLLM 已被部署在 Chatbot Arena 和 Vicuna 中。專案作者之一 Zhuohan Li 表示,自發布以來,vLLM 一直是 Chatbot Arena 和 Vicuna Demo 背後的無名英雄,它能處理高峰流量並高效地為流行模型提供服務。它已將 LMSYS(一個開放的研究組織,旨在讓每個人都能訪問大型模型) 使用的 GPU 數量減少了一半,同時每天平均處理 30K 次對話。

vLLM 效能如何?

該研究將 vLLM 的吞吐量與最流行的 LLM 庫 HuggingFace Transformers (HF),以及之前具有 SOTA 吞吐量的 HuggingFace Text Generation Inference(TGI)進行了比較。此外,該研究將實驗設定分為兩種:LLaMA-7B,硬體為 NVIDIA A10G GPU;另一種為 LLaMA-13B,硬體為 NVIDIA A100 GPU (40GB)。他們從 ShareGPT 資料集中取樣輸入 / 輸出長度。結果表明,vLLM 的吞吐量比 HF 高 24 倍,比 TGI 高 3.5 倍。

vLLM 的吞吐量比 HF 高 14 倍 - 24 倍,比 TGI 高 2.2 倍 - 2.5 倍。

vLLM 的吞吐量比 HF 高 8.5 - 15 倍,比 TGI 高 3.3 - 3.5 倍。

PagedAttention:解決記憶體瓶頸

該研究發現,在 vLLM 庫中 LLM 服務的效能受到記憶體瓶頸的影響。在自迴歸解碼過程中,所有輸入到 LLM 的 token 會產生注意力鍵和值的張量,這些張量儲存在 GPU 記憶體中以生成下一個 token。這些快取鍵和值的張量通常被稱為 KV 快取,其具有:

記憶體佔用大:在 LLaMA-13B 中,快取單個序列最多需要 1.7GB 記憶體;

  • 動態且不可預測:KV 快取的大小取決於序列長度,這是高度可變和不可預測的。因此,這對有效地管理 KV 快取挑戰較大。該研究發現,由於碎片化和過度保留,現有系統浪費了 60% - 80% 的記憶體。

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

PagedAttention:KV 快取被劃分成塊,塊不需要在記憶體空間中連續。

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

使用 PagedAttention 的請求的示例生成過程。

在 PagedAttention 中,記憶體浪費只會發生在序列的最後一個塊中。這使得在實踐中可以實現接近最佳的記憶體使用,僅浪費不到 4 %。這種記憶體效率的提升被證明非常有用,允許系統將更多序列進行批處理,提高 GPU 使用率,顯著提升吞吐量。

PagedAttention 還有另一個關鍵優勢 —— 高效的記憶體共享。例如在並行取樣中,多個輸出序列是由同一個提示(prompt)生成的。在這種情況下,提示的計算和記憶體可以在輸出序列中共享。

並行取樣示例。

PagedAttention 自然地透過其塊表格來啟動記憶體共享。與程序共享物理頁面的方式類似,PagedAttention 中的不同序列可以透過將它們的邏輯塊對映到同一個物理塊的方式來共享塊。為了確保安全共享,PagedAttention 會對物理塊的引用計數進行跟蹤,並實現寫時複製(Copy-on-Write)機制。

對於對多輸出進行取樣的請求,它的示例生成過程是這樣的。

PageAttention 的記憶體共享大大減少了複雜取樣演算法的記憶體開銷,例如並行取樣和集束搜尋的記憶體使用量降低了 55%。這可以轉化為高達 2.2 倍的吞吐量提升。這種取樣方法也在 LLM 服務中變得實用起來。

PageAttention 成為了 vLLM 背後的核心技術。vLLM 是 LLM 推理和服務引擎,為各種具有高效能和易用介面的模型提供支援。

是什麼在背後默默支撐 Vicuna 和 Chatbot Arena

今年 4 月,LMSYS 公開發布了流行的 Vicuna(小羊駝)聊天機器人模型。從那時起,Vicuna 就在 Chatbot Arena 中為數百萬使用者提供服務。最開始,LMSYS 的開源聊天機器人 FastChat 採用基於 HF Transformer 的服務後端來為聊天 demo 提供服務。

隨著 demo 變得越來越流行,峰值流量增加了幾倍,導致 HF 後端成為一個嚴重的瓶頸。LMSYS 和 vLLM 團隊展開合作並很快開發了 FastChat-vLLM 整合,使用 vLLM 作為新的後端,從而滿足不斷增長的需求(5 倍流量)。在 LMSYS 早期的內部微基準測試中,vLLM 服務後端可以實現的吞吐量是初始 HF 後端的 30 倍。

此外,自 4 月中旬以來,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 平均每天可以處理 30k 請求,峰值為 60k,這說明了 vLLM 的穩健性很強。

vLLM 的安裝與使用

你可以透過以下 pip 命令安裝 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 http://localhost: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 的相關研究論文也即將放出。

============= End

相關文章