吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了

PHPz
發布: 2024-03-01 22:55:13
轉載
1070 人瀏覽過

大型語言模型 (LLM) 被廣泛應用於需要多個鍊式生成呼叫、高階提示技術、控制流程以及與外部環境互動的複雜任務。儘管如此,目前用於編程和執行這些應用程式的高效系統卻存在明顯的不足之處。

研究人員最近提出了一種新的結構化生成語言(Structured Generation Language),稱為SGLang,旨在改進與LLM的互動性。透過整合後端運行時系統和前端語言的設計,SGLang使得LLM的效能更高、更易於控制。這項研究也獲得了機器學習領域的知名學者、CMU助理教授陳天奇的轉發。

吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了

總的來說,SGLang 的貢獻主要包括:

  • 在後端,研究團隊提出了RadixAttention,這是一種跨多個LLM 產生呼叫的KV 快取(KV cache)重複使用技術,自動且有效率。

  • 在前端開發中,團隊研究出一種靈活的領域特定語言,可嵌入Python,用於控制生成過程。這種語言可以在解釋器模式或編譯器模式下執行。

後端前端元件可協同運作,可提高複雜 LLM 程式的執行和程式設計效率。

該研究使用 SGLang 實現了常見的 LLM 工作負載,包括智能體、推理、提取、對話和小樣本學習任務,並在 NVIDIA A10G GPU 上採用 Llama-7B 和 Mixtral-8x7B 模型。如下圖 1 、圖 2 表明,與現有系統(即 Guidance 和 vLLM)相比,SGLang 的吞吐量提高了 5 倍。

吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了

圖1:不同系統在LLM 任務上的吞吐量(A10G、FP16 上的Llama-7B、張量平行度= 1)

吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了

圖2:不同系統在LLM 任務上的吞吐量(A10G、FP16 上的Mixtral-8x7B,張量並行度= 8)

在後端:使用RadixAttention 自動KV 快取復用

在SGLang 運行時的開發過程中,該研究發現了複雜LLM 程式的最佳化關鍵——KV 快取復用,目前系統對此處理不佳。 KV 快取復用意味著具有相同前綴的不同 prompt 可以共享中間 KV 緩存,避免冗餘的記憶體和計算。在涉及多個 LLM 呼叫的複雜程式中,可能存在各種 KV 快取復用模式。下圖 3 說明了 LLM 工作負載中常見的四種此類模式。雖然某些系統能夠在某些場景下處理 KV 快取復用,但通常需要手動配置和臨時調整。此外,由於可能的複用模式的多樣性,即使透過手動配置,現有系統也無法自動適應所有場景。

吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了

圖 3:KV 快取共享範例。藍色框是可共享的 prompt 部分,綠色框是不可共享的部分,黃色框是不可共享的模型輸出。可共享的部分包括小樣本學習範例、自​​洽(self-consistency)問題、多輪對話中的對話歷史以及思維樹(tree-of-thought)中的搜尋歷史。

為了有系統地利用這些複用機會,該研究提出了一種在運行時自動 KV 快取復用的新方法 —— RadixAttention。此方法不是在完成產生請求後丟棄 KV 緩存,而是在基數樹(radix tree)中保留 prompt 和產生結果的 KV 快取。這種資料結構可以實現高效的前綴搜尋、插入和驅逐。該研究實現了最近最少使用(LRU)驅逐策略,並輔以快取感知調度策略,以提高快取命中率。

基數樹可作為 trie(前綴樹)節省空間的替代方案。與典型的樹不同,基數樹的邊緣不僅可以用單一元素來標記,還可以用不同長度的元素序列來標記,這提高了基數樹的效率。

該研究利用基數樹來管理映射,這種映射是在充當鍵的 token 序列和充當值的相應 KV 快取張量之間進行的。這些 KV 快取張量以分頁佈局儲存在 GPU 上,其中每個頁的大小相當於一個 token。

考慮到 GPU 記憶體容量有限,無法重新訓練無限的 KV 快取張量,這就需要驅逐策略。研究採用 LRU 驅逐策略,遞歸地驅逐葉節點。此外,RadixAttention 與連續批次和分頁注意力等現有技術相容。對於多模態模型,RadixAttention 可以輕鬆擴展以處理圖像 token。

下圖說明了在處理多個傳入請求時如何維護基數樹。前端總是向運行時發送完整的 prompt,運行時會自動進行前綴匹配、復用和快取。樹狀結構儲存在 CPU 上,維護開銷較小。

吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了

圖 4. 採用 LRU 驅逐策略的 RadixAttention 操作範例,分九個步驟進行說明。

圖 4 演示了基數樹回應各種請求的動態演變。這些請求包括兩個聊天會話、一批小樣本學習查詢和自洽性抽樣。每個樹邊緣都帶有一個標籤,表示子字串或 token 序列。節點採用顏色編碼以反映不同的狀態:綠色表示新新增的節點,藍色表示在該時間點存取的快取節點,紅色表示已被驅逐的節點。

前端:使用SGLang 輕鬆進行LLM 程式設計

在前端,該研究提出了SGLang,一種嵌入在Python 中的特定領域的語言,允許表達進階prompt 技術、控制流程、多模態、解碼約束和外部互動。 SGLang 函數可以透過各種後端運行,例如 OpenAI、Anthropic、Gemini 和本機模型。

吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了

圖 5. 用 SGLang 實現多維文章評分。

圖 5 顯示了一個具體範例。它利用分支 - 解決 - 合併 prompt 技術實現多維文章評分。此函數使用 LLM 從多個維度評估文章的質量,合併判斷,產生摘要,並分配最終等級。突出顯示的區域說明了 SGLang API 的使用。 (1) fork 建立 prompt 的多個並行副本。 (2) gen 呼叫 LLM 生成並將結果儲存在變數中。該呼叫是非阻塞的,因此它允許多個生成呼叫在後台同時運行。 (3) [variable_name] 檢索產生的結果。 (4) 選擇對生成施加約束。 (5) run 使用其參數執行 SGLang 函數。

給定這樣一個 SGLang 程序,我們可以透過解釋器執行它,也可以將其追蹤為資料流程圖並使用圖執行器運行它。後一種情況為一些潛在的編譯器最佳化開闢了空間,例如程式碼移動、指令選擇和自動調整。

SGLang 的語法很大程度上受到 Guidance 的啟發,並引入了新的原語,也處理程式內並行性和批次。所有這些新功能都有助於 SGLang 的出色性能。

基準測試

研究團隊在常見的 LLM 工作負載上測試了其係統,並報告了所實現的吞吐量。

具體來說,研究在1 個NVIDIA A10G GPU (24GB) 上測試了Llama-7B,在8 個具有張量並行性的NVIDIA A10G GPU 上使用FP16 精度測試了Mixtral-8x7B,並使用vllm v0.2.5、指導v0.1.8 和Hugging Face TGI v1.3.0 作為基準系統。

如圖 1 和圖 2 所示,SGLang 在所有基準測試中都優於基準系統,吞吐量提高了 5 倍。它在延遲方面也表現出色,特別是對於第一個 token 延遲,其中前綴快取命中可以帶來顯著的好處。這些改進歸功於 RadixAttention 的自動 KV 快取復用、解釋器實現的程式內並行性以及前端和後端系統的協同設計。此外,消融研究表明,即使沒有快取命中,也沒有明顯的開銷,這會導致在運行時始終啟用 RadixAttention。

參考連結:https://lmsys.org/blog/2024-01-17-sglang/

以上是吞吐量提升5倍,聯合設計後端系統和前端語言的LLM介面來了的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:jiqizhixin.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!