Hugging Face:從第一原理出發的持續批次化

Continuous batching 是大型語言模型(LLM)服務中的關鍵優化技術,透過平行處理多個對話並在完成後立即切換,最大化吞吐量。透過消除填充需求並允許預填與解碼階段同時處理,持續批次化使 AI 服務能有效應對數千名同時使用者。

注意力機制與預填階段的角色

LLM 生成的核心是注意力機制,這是網路中唯一令不同 token 互動的部分。在標準的前向傳遞中,模型會處理輸入序列(即預填階段)以預測下一個 token。

此過程會將輸入 token 投射為查詢($Q$)、鍵($K$)與值($V$)狀態。模型接著透過 $Q K^{T}$ 計算相似度分數,其相對於序列長度 $n$ 的複雜度為 $\mathcal{O}(n^{2} d)$ 的二次方。會套用因果注意力遮罩,以確保每個 token 只與其之前的 token 互動,防止未來的 token 影響過去。

使用 KV 快取優化生成

若模型在每次生成新 token 時,都重新計算序列中所有先前 token 的 $K$ 與 $V$ 狀態,則逐一生成 token(解碼階段)將極度浪費計算資源。

KV 快取 透過儲存預填與先前解碼步驟中產生的鍵和值狀態來解決此問題。這將生成第 $n + 1$ 個 token 的計算成本從 $\mathcal{O}(n^{2})$ 降低至 $\mathcal{O}(n)$,以記憶體換取計算。舉例來說,在 Llama-2-7B 中,儲存一個 token 需要大約 16 KB 的記憶體(float16 精度),跨越 32 層與 32 個 heads。

透過分塊預填處理大型提示

當初始提示極度長時,激活所需的記憶體可能超過可用的 GPU 記憶體,導致無法在一次前向傳遞中完成預填。

分塊預填 透過將初始提示切分為較小、易於處理的區塊來解決此問題。利用 KV 快取,模型會儲存第一個區塊的狀態,並將其前置於後續區塊的狀態之上,使提示能以增量方式處理而不遺失資訊。

從批次生成到持續批次化

為了提升吞吐量(每秒生成的 token 數),模型會平行處理多個提示。然而,傳統方法會帶來顯著的低效:

  • 批次生成: 需要所有提示長度相同,必須使用填充 token(<pad>)。當提示長度不一致時,這會造成浪費。
  • 動態排程: 允許將完成的提示替換為新提示,但仍需大量填充,因為預填階段的新提示必須與解碼階段的其他提示一起批次處理。

不規則批次化

為了消除填充浪費,不規則批次化 完全移除批次維度,改以將所有提示串接成單一序列。透過注意力遮罩嚴格控制 token 之間的互動,確保來自同一提示的 token 不會與其他提示的 token 互動。

持續批次化演算法

持續批次化結合不規則批次化與動態排程,以確保 GPU 完全被利用。此過程遵循以下邏輯步驟:

  1. 最大化記憶體預算: 系統嘗試填滿每批次 $m$ 個 token 的 GPU 記憶體預算。
  2. 優先解碼: 先將所有目前處於解碼階段的提示加入批次(每個佔用一個 token)。
  3. 以預填填補: 使用剩餘空間加入處於預填階段的提示,必要時以分塊預填切分輸入。
  4. 動態替換: 完成的提示(產生 <eos> token 的)會立即被移除,並以新進來的請求取代。

關鍵技術彙總

技術 主要好處
KV 快取 在解碼過程中避免重新計算過去 token 的表示。
分塊預填 使能處理超出 GPU 記憶體限制的提示。
不規則批次化 透過串接序列並使用遮罩,消除填充浪費。
動態排程 透過即時交換請求,維持高吞吐量。

SUMMARY: Hugging Face 介紹了持續批次化,這項技術透過結合 KV 快取、分塊預填與不規則批次化以及動態排程,最大化 LLM 的吞吐量,並消除填充浪費。

TITLE: Hugging Face:從第一原理出發的持續批次化

Sources