你正在參加 Google 的 ML 工程師面試。 面試官:我們需要在 1,000 個 GPU 上訓練一個 LLM。你會如何確保所有 GPU 共享它們所學到的東西? 你:使用中央參數伺服器來聚合和重新分配權重。 面試結束。 這是你錯過的內容:
在多GPU訓練中,一個主要的運行時瓶頸發生在GPU同步期間。 例如,在通過數據並行進行的多GPU訓練中: - 相同的模型被分配到不同的GPU。 - 每個GPU處理整個數據集的不同子集。 查看這個 👇
這導致不同設備之間的梯度不同。 因此,在每個 GPU 設備上更新模型參數之前,我們必須將梯度傳達給所有其他設備以進行同步。 接下來讓我們了解兩種常見的策略!
算法 1) 全部歸約 一個明顯的方法是將梯度從一個設備發送到所有其他設備以進行同步。 但這會消耗大量帶寬。 如果每個 GPU 有 "N" 個元素,並且有 "G" 個 GPU,則總傳輸量為 G*(G-1)*N 個元素 👇
我們可以通過將所有元素轉移到一個 GPU,計算最終值,然後將其發送回所有其他 GPU 來優化這一點。 這是一個重大的改進。 但現在單個 GPU 必須接收、計算並回傳梯度,因此這無法擴展。
算法 2) 環形歸約 階段 #1) 分享歸約 首先,梯度在每個 GPU 上被劃分為 G 個區段 (G = GPU 的總數)。 檢查這個 👇
在一次迭代中,每個 GPU 將一個區段發送到下一個 GPU: - GPU1 將 a₁ 發送到 GPU2,並將其加到 b₁ - GPU2 將 b₂ 發送到 GPU3,並將其加到 c₂ - GPU3 將 c₃ 發送到 GPU4,並將其加到 d₃ - GPU4 將 d₄ 發送到 GPU1,並將其加到 a₄ 檢查這個 👇
這個過程再次進行: - GPU1 將 (d₄+a₄) 發送給 GPU2,並將其加到 b₄。 - GPU2 將 (a₁+b₁) 發送給 GPU3,並將其加到 c₁。 - GPU3 將 (b₂+c₂) 發送給 GPU4,並將其加到 d₂。 - GPU4 將 (c₃+d₃) 發送給 GPU1,並將其加到 a₃。 檢查這個 👇
在最後的迭代中,以下段落被轉移到下一個GPU。 這導致每個GPU都有一個完整的段落,我們可以將這些完整的段落轉移到所有其他GPU。 查看這個 👇
階段 #2) 只分享 現在每個 GPU 都擁有一整個段,我們可以將這些完整的段轉移到所有其他 GPU。 這個過程的執行方式與我們上面討論的類似,因此我們不會詳細說明。 下面顯示了第一次迭代👇
接下來,我們進行第 2 和第 3 次迭代。 這些與我們在第一階段學到的類似。 查看這個 👇
這樣就完成了! 模型權重已在 GPU 之間同步。 雖然傳輸的總元素數量與我們在「單 GPU 主控」方法中相同,但這種環形方法更具可擴展性,因為它不會將整個負載放在一個 GPU 上。 查看這個 👇
預設情況下,深度學習模型僅使用單個 GPU 進行訓練,即使有多個 GPU 可用。 訓練模型的理想方法是將訓練工作負載分配到多個 GPU 上。 該圖顯示了四種多 GPU 訓練策略👇
364.79K