AI News HubLIVE
站内改写

在連續批處理中解鎖非同步性

本文解釋瞭如何透過分離CPU和GPU工作負載來大幅提升推理效能。連續批處理透過緊密打包批次提高了GPU利用率,但同步操作導致CPU和GPU交替等待,造成近四分之一的執行時間浪費。透過使用非預設CUDA流和事件實現非同步批處理,可以讓CPU和GPU並行工作,消除空閒間隙,實現免費的24%加速。文章詳細介紹了CUDA流、事件機制以及如何將它們應用於連續批處理,並提供了在transformers庫中的實現程式碼。

文章情報

工程師進階

要點

  • 同步連續批處理中CPU和GPU交替工作,導致GPU空閒時間佔比約24%。
  • 使用非預設CUDA流和事件可以實現CPU和GPU的並行執行。
  • 透過H2D、計算和D2H三個流以及事件同步,可以構建非同步批處理流程。
  • 非同步批處理無需新核心或模型更改,即可獲得顯著的效能提升。

為什麼重要

這條新聞值得關注,因為同步連續批處理中CPU和GPU交替工作,導致GPU空閒時間佔比約24%。

技術影響

可能影響模型選型、推理成本、產品能力和評測基準。

在AI推理中,GPU的利用率至關重要。H200例項每小時成本約5美元,一天下來就是140美元,因此必須讓GPU始終處於工作狀態。連續批處理透過緊密打包批次消除了填充浪費,但同步模式下的CPU和GPU交替等待造成了新的浪費。為了確保GPU 100%時間都在計算,我們需要消除這些空閒間隙。本文介紹如何透過非同步批處理解決這一問題。

同步批處理的迴圈中,CPU準備批次時GPU空閒,GPU計算時CPU空閒。在實際分析中,使用批大小32和8B模型生成8K令牌時,總耗時300.6秒,其中24.0%的時間GPU在空閒等待CPU完成。這意味著如果完全消除CPU開銷,生成時間可降至228秒,即24%的免費加速。這不需要任何新的核心或模型更改,僅需協調硬體。

實現非同步批處理的關鍵在於使用CUDA流。預設流是同步的,會阻塞其他流,因此必須使用非預設流。文章將GPU操作分為三類:主機到裝置(H2D)傳輸、計算、裝置到主機(D2H)傳輸,併為每種操作分配獨立流。但流之間獨立執行會導致資料依賴問題,必須使用CUDA事件進行同步。事件是一個標記,可以記錄在流中,其他流可以等待該事件完成。例如,計算流必須等待H2D傳輸完成才能開始計算。

具體實現中,CPU依次提交H2D傳輸、記錄事件、計算流等待事件、計算、記錄事件、D2H流等待事件、D2H傳輸。所有操作在CPU上非阻塞提交,實際執行由GPU排程。這樣CPU可以在GPU執行當前批次時立即開始準備下一批次,實現流水線並行。文章還討論瞭如何正確使用事件避免死鎖,以及如何在transformers庫中整合這一最佳化。非同步批處理已在transformers庫的連續批處理中實現,程式碼開源可供參考。最終效果是GPU利用率接近100%,吞吐量顯著提升。此外,文章還介紹了CPU啟動開銷的概念,以及如何透過流和事件實現精確的同步。這些技術細節對於理解非同步批處理的工作原理至關重要。