現代 AI 推論的「調度藝術」:從靜態批次處理到連續批次處理 (Continuous Batching)
在 LLM(大型語言模型)的生產環境中,推論成本的高低並不直接取決於模型參數量,而取決於一個核心指標:吞吐量 (Throughput)。

現代 AI 推論的「調度藝術」:從靜態批次處理到連續批次處理 (Continuous Batching)
在 LLM(大型語言模型)的生產環境中,推論成本的高低並不直接取決於模型參數量,而取決於一個核心指標:吞吐量 (Throughput)。
如果你在開發一個 AI 服務,你會發現最簡單的推論方式是「靜態批次處理 (Static Batching)」:將 4 個使用者的請求打包在一起,等所有請求都生成完畢後,一次性回傳。但這種方式在實際應用中存在一個致命缺陷——「木桶效應」。
靜態批次處理的痛點:等待最慢的那個 Token
LLM 生成文字是自迴歸的,每個請求生成的 Token 數量不可預測。假設一個 Batch 中有三個請求:
- 請求 A:生成 10 個 Token 就結束了。
- 請求 B:生成 50 個 Token 才結束。
- 請求 C:生成 500 個 Token 才結束。
在靜態批次處理中,即使請求 A 和 B 早早完成了,GPU 資源也必須被佔用直到請求 C 完成。這意味著 GPU 在處理 A 和 B 的位置上出現了大量的「空轉」氣泡(Bubbles),極大地浪費了計算資源。
連續批次處理 (Continuous Batching) 的煉金術
為了解決這個問題,現代推論框架(如 vLLM, TensorRT-LLM)引入了 連續批次處理 (Continuous Batching)。其核心邏輯是將調度粒度從「請求級」細化到「Token 級」。
在連續批次處理中,推論引擎不再等待整個 Batch 完成,而是在每一個迭代步 (Iteration) 結束後立即檢查狀態:
1. 即時釋放:如果請求 A 在第 10 步生成了 <|endoftext|>,它會立即被移出 Batch 並回傳給使用者。
2. 即時填充:一旦 A 離開,調度器立即從等待佇列中拉入一個新的請求 D 進入該槽位。
3. 動態對齊:GPU 在每一步計算時,只對當前活躍的請求進行矩陣運算。
這種機制將 GPU 的利用率推向極致,使得系統能夠以極高的併發量維持低延遲回應。
從記憶體管理看 PagedAttention
連續批次處理雖然解決了計算調度問題,但帶來了新的挑戰:記憶體碎片化。由於每個請求的長度不一且動態變化,傳統的連續記憶體配置會導致嚴重的內部碎片(Internal Fragmentation)。
這就是為什麼 vLLM 推出了 PagedAttention。它借鑑了作業系統虛擬記憶體的頁面機制:
- 將 KV Cache 分割成固定大小的「頁 (Blocks)」。
- 使用一個映射表記錄實體頁與邏輯序列的對應關係。
- 當需要增加 Token 時,動態申請一個新的實體頁,而不需要在記憶體中移動之前的所有資料。
實戰啟示:如何選擇推論策略?
對於開發者而言,理解這些底層機制有助於優化部署方案:
- 追求極致吞吐量 $\rightarrow$ Continuous Batching + PagedAttention:適用於高併發的 Chatbot 服務。
- 追求極低首字延遲 $\rightarrow$ Speculative Decoding (投機採樣):用一個小模型預預測 Token,大模型平行驗證,進一步壓低延遲。
- 顯存受限 $\rightarrow$ 量化 (Quantization) + KV Cache 壓縮:透過 FP8 或 INT4 量化減少 KV Cache 的體積,從而在同一張顯示卡上容納更多併發請求。
AI 推論的演進路徑非常清晰:從單純追求算力 $\rightarrow$ 到優化記憶體頻寬 $\rightarrow$ 再到精細化的調度管理。在這個過程中,「減少浪費」比「增加算力」往往能帶來更顯著的性能飛躍。
留言區
歡迎分享你的想法!
載入留言中…