小羊駝背后的英雄,伯克利開源LLM推理與服務庫:GPU減半、吞吐數十倍猛增
隨著大語言模型(LLM)的不斷發展,這些模型在很大程度上改變了人類使用 AI 的方式。然而,實際上為這些模型提供服務仍然存在挑戰,即使在昂貴的硬件上也可能慢得驚人。
現在這種限制正在被打破。最近,來自加州大學伯克利分校的研究者開源了一個項目 vLLM,該項目主要用于快速 LLM 推理和服務。vLLM 的核心是 PagedAttention,這是一種新穎的注意力算法,它將在操作系統的虛擬內存中分頁的經典思想引入到 LLM 服務中。
配備了 PagedAttention 的 vLLM 將 LLM 服務狀態重新定義:它比 HuggingFace Transformers 提供高達 24 倍的吞吐量,而無需任何模型架構更改。
項目地址:https://github.com/vllm-project/vllm
總結而言,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
}'