優化 LLM 效能:預填與解碼的同時請求處理
執行摘要
優化大型語言模型(LLM)效能需要管理 預填階段(處理輸入提示)與 解碼階段(產生後續 token)之根本差異。透過實施持續批次處理與分塊預填,開發者可以最大化 GPU 資源利用率,並顯著提升總 token 吞吐量——TNG 在標準 vLLM 部署中使用分塊預填觀測到吞吐量提升 50%。
Token 生成的兩個階段
LLM 以自回歸方式生成文字,意味著每個新 token 都依賴於所有先前的 token。此過程分為兩個不同的計算階段:
預填階段
- 功能:透過處理所有輸入提示 token,計算第一個輸出 token。
- 計算特性:高度平行化且 GPU 計算密集。因為所有輸入 token 在開始時已知,模型可以同時計算整個提示的 key 與 value 向量。
- 關鍵指標:以 首次 token 時間 (Time to First Token, TTFT) 來衡量。
解碼階段
- 功能:逐一計算每個後續 token。
- 計算特性:順序執行且受記憶體頻寬限制。每個 token 只需計算一組 key 與 value 向量,但模型必須在每一步從 GPU 記憶體存取權重與鍵值 (KV) 快取。
- 關鍵指標:以 每輸出 token 時間 (Time Per Output Token, TPOT) 來衡量。
資源利用率與吞吐量
GPU 的利用率在這兩個階段之間差異顯著。長提示的單一請求在預填階段可能使 GPU 計算能力飽和。相較之下,單一請求的解碼階段僅使用極少的計算資源,因而透過將多個請求批次化以填滿 GPU 計算容量,可提升吞吐量。
吞吐量通常在低併發水平(記憶體受限階段)時隨併發線性提升,直至 GPU 計算能力飽和(計算受限階段),此時即使併發進一步增加,吞吐量也保持不變。
同時處理策略
推論引擎使用不同的批次策略來處理同時到達的多個請求,且每種策略在延遲與效率上都有不同的取捨。
靜態批次
靜態批次將請求分組成固定批次,處理至批次中最長的請求完成後才開始新批次。
- 優點:優化 TPOT,因為解碼階段不被中斷。
- 缺點:資源利用率極低且可能導致非常高的 TTFT,因為新請求必須等待整個前一批次結束。
持續批次(預填優先)
持續批次會立即移除已完成的請求並插入新請求。「預填優先」策略會在新請求到達時立即排程預填。
- 優點:透過即時處理新請求,將 TTFT 最小化。
- 缺點:會中斷現有請求的解碼階段。由於預填操作佔據 GPU 執行時間,解碼階段的同時請求在大型預填期間可能只能產生單一 token,導致串流輸出出現「暫停」。
分塊預填
分塊預填將輸入提示切分為較小的區塊,分散於多個步驟執行。這使得在預填過程中可同時進行多個解碼步驟。
- 優點:透過同時執行計算密集的預填與記憶體受限的解碼,最大化資源效率。此舉可減少平均 TPOT,避免 token 生成的完整暫停。
- 影響:TNG 在標準 vLLM 部署中使用分塊預填報告 總 token 吞吐量提升 50%。
- 取捨:會略微增加 TTFT,且需調整區塊大小(通常介於 512 至 8192 token)以在 TTFT 與 TPOT 之間取得平衡。