小羊駝背后的英雄,伯克利開源LLM推理與服務(wù)庫:GPU減半、吞吐數(shù)十倍猛增
隨著大語言模型(LLM)的不斷發(fā)展,這些模型在很大程度上改變了人類使用 AI 的方式。然而,實際上為這些模型提供服務(wù)仍然存在挑戰(zhàn),即使在昂貴的硬件上也可能慢得驚人。
現(xiàn)在這種限制正在被打破。最近,來自加州大學(xué)伯克利分校的研究者開源了一個項目 vLLM,該項目主要用于快速 LLM 推理和服務(wù)。vLLM 的核心是 PagedAttention,這是一種新穎的注意力算法,它將在操作系統(tǒng)的虛擬內(nèi)存中分頁的經(jīng)典思想引入到 LLM 服務(wù)中。
配備了 PagedAttention 的 vLLM 將 LLM 服務(wù)狀態(tài)重新定義:它比 HuggingFace Transformers 提供高達(dá) 24 倍的吞吐量,而無需任何模型架構(gòu)更改。
項目地址:https://github.com/vllm-project/vllm
總結(jié)而言,vLLM 具有如下特點:
- 最先進(jìn)的服務(wù)吞吐量;
- PagedAttention 可以有效的管理注意力的鍵和值;
- 動態(tài)批處理請求;
- 優(yōu)化好的 CUDA 內(nèi)核;
- 與流行的 HuggingFace 模型無縫集成;
- 高吞吐量服務(wù)與各種解碼算法,包括并行采樣、beam search 等等;
- 張量并行以支持分布式推理;
- 流輸出;
- 兼容 OpenAI 的 API 服務(wù)。
vLLM 還可以無縫支持許多 Huggingface 模型,包括以下架構(gòu):
- 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 表示,自發(fā)布以來,vLLM 一直是 Chatbot Arena 和 Vicuna Demo 背后的無名英雄,它能處理高峰流量并高效地為流行模型提供服務(wù)。它已將 LMSYS(一個開放的研究組織,旨在讓每個人都能訪問大型模型) 使用的 GPU 數(shù)量減少了一半,同時每天平均處理 30K 次對話。
vLLM 性能如何?
該研究將 vLLM 的吞吐量與最流行的 LLM 庫 HuggingFace Transformers (HF),以及之前具有 SOTA 吞吐量的 HuggingFace Text Generation Inference(TGI)進(jìn)行了比較。此外,該研究將實驗設(shè)置分為兩種:LLaMA-7B,硬件為 NVIDIA A10G GPU;另一種為 LLaMA-13B,硬件為 NVIDIA A100 GPU (40GB)。他們從 ShareGPT 數(shù)據(jù)集中采樣輸入 / 輸出長度。結(jié)果表明,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:解決內(nèi)存瓶頸
該研究發(fā)現(xiàn),在 vLLM 庫中 LLM 服務(wù)的性能受到內(nèi)存瓶頸的影響。在自回歸解碼過程中,所有輸入到 LLM 的 token 會產(chǎn)生注意力鍵和值的張量,這些張量保存在 GPU 內(nèi)存中以生成下一個 token。這些緩存鍵和值的張量通常被稱為 KV 緩存,其具有:
- 內(nèi)存占用大:在 LLaMA-13B 中,緩存單個序列最多需要 1.7GB 內(nèi)存;
- 動態(tài)且不可預(yù)測:KV 緩存的大小取決于序列長度,這是高度可變和不可預(yù)測的。因此,這對有效地管理 KV 緩存挑戰(zhàn)較大。該研究發(fā)現(xiàn),由于碎片化和過度保留,現(xiàn)有系統(tǒng)浪費了 60% - 80% 的內(nèi)存。
為了解決這個問題,該研究引入了 PagedAttention,這是一種受操作系統(tǒng)中虛擬內(nèi)存和分頁經(jīng)典思想啟發(fā)的注意力算法。與傳統(tǒng)的注意力算法不同,PagedAttention 允許在非連續(xù)的內(nèi)存空間中存儲連續(xù)的鍵和值。具體來說,PagedAttention 將每個序列的 KV 緩存劃分為塊,每個塊包含固定數(shù)量 token 的鍵和值。在注意力計算期間,PagedAttention 內(nèi)核可以有效地識別和獲取這些塊。
PagedAttention:KV 緩存被劃分成塊,塊不需要在內(nèi)存空間中連續(xù)。
因為塊在內(nèi)存中不需要連續(xù),因而可以用一種更加靈活的方式管理鍵和值,就像在操作系統(tǒng)的虛擬內(nèi)存中一樣:可以將塊視為頁面,將 token 視為字節(jié),將序列視為進(jìn)程。序列的連續(xù)邏輯塊通過塊表映射到非連續(xù)物理塊中。物理塊在生成新 token 時按需分配。
使用 PagedAttention 的請求的示例生成過程。
在 PagedAttention 中,內(nèi)存浪費只會發(fā)生在序列的最后一個塊中。這使得在實踐中可以實現(xiàn)接近最佳的內(nèi)存使用,僅浪費不到 4 %。這種內(nèi)存效率的提升被證明非常有用,允許系統(tǒng)將更多序列進(jìn)行批處理,提高 GPU 使用率,顯著提升吞吐量。
PagedAttention 還有另一個關(guān)鍵優(yōu)勢 —— 高效的內(nèi)存共享。例如在并行采樣中,多個輸出序列是由同一個提示(prompt)生成的。在這種情況下,提示的計算和內(nèi)存可以在輸出序列中共享。
并行采樣示例。
PagedAttention 自然地通過其塊表格來啟動內(nèi)存共享。與進(jìn)程共享物理頁面的方式類似,PagedAttention 中的不同序列可以通過將它們的邏輯塊映射到同一個物理塊的方式來共享塊。為了確保安全共享,PagedAttention 會對物理塊的引用計數(shù)進(jìn)行跟蹤,并實現(xiàn)寫時復(fù)制(Copy-on-Write)機制。
對于對多輸出進(jìn)行采樣的請求,它的示例生成過程是這樣的。
PageAttention 的內(nèi)存共享大大減少了復(fù)雜采樣算法的內(nèi)存開銷,例如并行采樣和集束搜索的內(nèi)存使用量降低了 55%。這可以轉(zhuǎn)化為高達(dá) 2.2 倍的吞吐量提升。這種采樣方法也在 LLM 服務(wù)中變得實用起來。
PageAttention 成為了 vLLM 背后的核心技術(shù)。vLLM 是 LLM 推理和服務(wù)引擎,為各種具有高性能和易用界面的模型提供支持。
是什么在背后默默支撐 Vicuna 和 Chatbot Arena
今年 4 月,LMSYS 公開發(fā)布了流行的 Vicuna(小羊駝)聊天機器人模型。從那時起,Vicuna 就在 Chatbot Arena 中為數(shù)百萬用戶提供服務(wù)。最開始,LMSYS 的開源聊天機器人 FastChat 采用基于 HF Transformer 的服務(wù)后端來為聊天 demo 提供服務(wù)。
隨著 demo 變得越來越流行,峰值流量增加了幾倍,導(dǎo)致 HF 后端成為一個嚴(yán)重的瓶頸。LMSYS 和 vLLM 團(tuán)隊展開合作并很快開發(fā)了 FastChat-vLLM 集成,使用 vLLM 作為新的后端,從而滿足不斷增長的需求(5 倍流量)。在 LMSYS 早期的內(nèi)部微基準(zhǔn)測試中,vLLM 服務(wù)后端可以實現(xiàn)的吞吐量是初始 HF 后端的 30 倍。
此外,自 4 月中旬以來,Vicuna、Koala 和 LLaMA 等最受歡迎的模型都已經(jīng)成功地使用 FastChat-vLLM 集成服務(wù)。LMSYS 以 FastChat 為多模型聊天服務(wù)前端,以 vLLM 作為推理后端,這樣可以利用大學(xué)贊助的有限 GPU,高吞吐量、低延遲地為數(shù)百萬用戶提供 Vicuna。
目前,LMSYS 正在將 vLLM 的使用范圍擴展到更廣泛的大模型,包括 Databricks Dolly、LAION 的 OpenAsssiant、Stability AI 的 stableLM。對于更多模型的支持正在開發(fā)并即將到來。
4 月至 5 月,Chatbot Arena 中 FastChat-vLLM 集成服務(wù)的請求情況。事實上,Chatbot Arena 中超過一半的請求都使用 vLLM 作為推理后端。
vLLM 的使用還顯著降低了運營成本。借助 vLLM,LMSYS 能夠?qū)⒂糜谔幚砩鲜隽髁康?GPU 數(shù)量減少 50%。vLLM 平均每天可以處理 30k 請求,峰值為 60k,這說明了 vLLM 的穩(wěn)健性很強。
vLLM 的安裝與使用
你可以通過以下 pip 命令安裝 vLLM。
$ pip install vllm
vLLM 可以用于離線推理和在線服務(wù)。在使用 vLLM 進(jìn)行離線推理任務(wù)時,你需要導(dǎo)入 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 進(jìn)行在線服務(wù)時,你可以通過以下命令啟動一個兼容 OpenAI API 的服務(wù)器。
$ python -m vllm.entrypoints.openai.api_server --model lmsys/vicuna-7b-v1.3
你還可以利用與 OpenAI API 相同的格式來查詢服務(wù)器。
$ 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
}'