動態批處理 是什麼?
Dynamic Batching:動態批處理 的完整解釋
根據系統負載和數據可用性,動態調整批次大小和處理時機的推理最佳化技術,用於平衡吞吐量和延遲。
核心概念
動態批處理(Dynamic Batching)源於一個基本的性能權衡問題:批處理可以提高計算效率,但會增加延遲。在傳統的推理服務中,系統通常採用固定的批次大小,如每次批處理 32 或 64 個請求。但在實際應用中,請求的到達率是不均勻的。在低負載時,等待足夠的請求來填滿一個批次會浪費時間。在高負載時,固定的批次大小可能導致隊列堆積,增加延遲。
動態批處理的核心思想是根據當前的系統狀態調整批次大小和等待時間。在低負載時,系統可以接受更長的等待時間來積累請求。在高負載時,系統可以使用較小的批次以保持低延遲。這樣可以在不同的負載條件下都保持較好的性能。
動態批處理涉及幾個關鍵參數:最大批次大小(最多一次批處理多少個請求)、最大等待時間(最多等待多久才執行批處理,即使沒有達到最大批次大小)、隊列深度和目標延遲。
運作原理
動態批處理的運作涉及請求調度、批次組裝和執行。
當推理請求到達時,它們首先被放入輸入隊列。系統持續監控隊列的大小和請求等待時間。根據以下條件之一,系統決定組裝一個批次並執行推理:
- 隊列中的請求數達到最大批次大小。
- 隊列中最早的請求已經等待達到最大等待時間。
- 系統預測下一個請求需要較長時間才能到達,需要立即執行以減少延遲。
動態批處理的調度算法可以很簡單,也可以很複雜。最簡單的算法是設置一個最大批次大小和最大等待時間,然後執行上述邏輯。更複雜的算法可能考慮:
- 優先級隊列:不同優先級的請求有不同的等待時間限制。
- 優先級調度:優先執行重要的請求。
- 多隊列調度:不同大小或不同類型的請求維護不同的隊列。
推理執行後,系統需要將結果返回給相應的請求者。在批處理中,這涉及到索引管理,以確保每個結果都返回給正確的請求。
一個關鍵的實現細節是如何高效地組裝批次。在 GPU 推理中,需要將不同的輸入組織成相同形狀的張量。如果輸入長度不同(如文本序列),可能需要進行填充(padding)。NVIDIA TensorRT 和其他推理引擎提供了專門的動態批處理支援。
實際應用
在線上推薦系統中,動態批處理可以顯著提高吞吐量。一個典型的例子是點擊率預測(Click-Through Rate Prediction)。系統需要為每個用戶-商品對預測點擊概率。通過動態批處理,系統可以批量處理來自多個用戶的預測請求,同時保持 P99 延遲在 100ms 以內。
在自然語言處理中,文本生成服務使用動態批處理來處理文本生成任務。例如,一個聊天機器人後端可能同時接收來自多個用戶的文本生成請求。通過動態批處理,這些請求可以被批量處理,提高 GPU 的利用率。
在計算機視覺中,物體偵測服務通常面臨不均勻的請求負載。監控攝像頭在夜間可能產生很少的請求,而在白天產生大量請求。動態批處理幫助系統在這些不同的負載條件下保持穩定的性能。
在多租户推理平台中,動態批處理可以提高資源利用率。不同租户的推理請求可以被批量執行,只要這不會違反延遲 SLA。
在離線數據處理中,動態批處理被用於在數據可用時立即開始處理,同時也能從批處理中受益。這對於 ETL(提取-轉換-加載)流程很有用。
常見誤區
一個常見的誤區是認為動態批處理適用於所有情況。實際上,動態批處理對延遲敏感的應用可能不太適合。如果系統需要非常低的延遲(如低於 10ms),動態批處理的等待時間可能是不可接受的。
另一個誤區是認為動態批處理會複雜化系統。實際上,現代推理引擎(如 NVIDIA TensorRT、ONNX Runtime)已經內置了動態批處理支援,使得應用程序員可以透明地使用動態批處理,而不需要修改推理邏輯。
還有人誤以為動態批處理只適用於 GPU。實際上,動態批處理也可以應用於 CPU 推理,雖然收益可能較小。
與相關技術的比較
動態批處理與請求級並行化都是提高推理吞吐量的方法。請求級並行化簡單地並行執行多個請求,但不利用批處理的計算效率。動態批處理既享受批處理的效率,又提供靈活的延遲控制。
與流水線並行化相比,動態批處理在單個設備上工作,而流水線並行化跨越多個設備。兩者可以結合使用以進一步提高性能。
與專業的負載均衡器相比,動態批處理是在推理引擎層面實現的調度優化,更加輕量級。