Transformers 文件

並行方法

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

並行方法

多 GPU 設定能有效加速訓練,並將大型模型載入記憶體,否則這些模型將無法適應單個 GPU。它依賴於跨 GPU 的工作負載並行化。有幾種並行型別,如資料並行、張量並行、流水線並行和模型並行。每種並行型別以不同的方式拆分工作負載,無論是資料還是模型。

本指南將討論各種並行方法、它們的組合以及為您的設定選擇合適的策略。有關分散式訓練的更多詳細資訊,請參閱 Accelerate 文件。

有關擴充套件大型語言模型的綜合指南,請查閱 Ultrascale Playbook,它提供了詳細的策略和大規模訓練的最佳實踐。

可擴充套件性策略

使用 模型記憶體計算器 計算模型所需的記憶體。然後參考下表,根據您的設定選擇策略。

設定 場景 策略
單節點/多 GPU 適合單個 GPU DistributedDataParallel 或 ZeRO
不適合單個 GPU PipelineParallel、ZeRO 或 TensorParallel
最大模型層不適合 TensorParallel 或 ZeRO
多節點/多 GPU 節點間連線速度快 (NVLink 或 NVSwitch) ZeRO 或 3D 並行(PipelineParallel、TensorParallel、DataParallel)
節點間連線速度慢 ZeRO 或 3D 並行(PipelineParallel、TensorParallel、DataParallel)

資料並行

資料並行將資料均勻分佈到多個 GPU 上。每個 GPU 都持有一個模型的副本並同時處理其資料部分。最後,每個 GPU 的結果會同步併合並。

資料並行透過並行處理資料顯著縮短了訓練時間,並且可以根據可用的 GPU 數量進行擴充套件。然而,同步每個 GPU 的結果可能會增加開銷。

資料並行有兩種型別:DataParallel (DP) 和 DistributedDataParallel (DDP)。

DataParallel

DataParallel 支援在單機多 GPU 上進行分散式訓練。

  1. 預設 GPU,即 GPU 0,讀取一批資料並將其中的一小批資料傳送到其他 GPU。
  2. GPU 0 複製一份最新模型到其他 GPU。
  3. 在每個 GPU 上執行一次 前向 傳播,並將它們的輸出傳送到 GPU 0 以計算損失。
  4. 損失從 GPU 0 分佈到其他 GPU 進行 後向 傳播。
  5. 每個 GPU 的梯度傳送回 GPU 0 並進行平均。

DistributedDataParallel

DistributedDataParallel 支援跨多臺機器多 GPU 進行分散式訓練。

  1. 主程序將模型從預設 GPU(GPU 0)複製到每個 GPU。
  2. 每個 GPU 直接處理一小批資料。
  3. 反向 傳播過程中,區域性梯度在所有 GPU 上進行平均。

建議使用 DDP,因為它減少了 GPU 之間的通訊開銷,有效地利用了每個 GPU,並且可以擴充套件到多臺機器。

ZeRO 資料並行

零冗餘最佳化器(Zero Redundancy Optimizer)是一種更記憶體高效的資料並行型別。它透過在資料並行程序中劃分引數、梯度和最佳化器狀態來顯著提高記憶體效率,從而減少記憶體使用。ZeRO 有三個階段:

  • 第一階段劃分最佳化器狀態
  • 第二階段劃分最佳化器和梯度狀態
  • 第三階段劃分最佳化器、梯度和引數

模型並行

模型並行將模型分佈到多個 GPU 上。有多種方法可以拆分模型,但典型的方法是將模型層分佈到 GPU 上。在前向傳播中,第一個 GPU 處理一批資料並將其傳遞給下一個 GPU 上的下一組層。對於反向傳播,資料從最後一層反向傳送到第一層。

模型並行是一種訓練模型的好策略,這些模型太大而無法適應單個 GPU 的記憶體。然而,GPU 利用率是不平衡的,因為一次只有一個 GPU 處於活動狀態。在 GPU 之間傳遞結果也會增加通訊開銷,這可能是一個瓶頸。

流水線並行

流水線並行在概念上與模型並行非常相似,但它效率更高,因為它減少了 GPU 空閒時間。流水線並行不是等待每個 GPU 完成處理一批資料,而是建立資料的微批次。一旦一個微批次完成,它就會被傳遞到下一個 GPU。這樣,每個 GPU 都可以同時處理部分資料,而無需等待其他 GPU 完全完成處理一個迷你批次資料。

流水線並行與模型並行具有相同的優點,但它優化了 GPU 利用率並減少了空閒時間。但是,流水線並行可能更復雜,因為模型可能需要重寫為 nn.Sequential 模組的序列,而且也不可能完全減少空閒時間,因為最後一次 前向 傳播也必須等待 反向 傳播完成。

張量並行

張量並行將大型張量計算分佈到多個 GPU 上。張量被水平或垂直切片,每個切片由一個單獨的 GPU 處理。每個 GPU 對其張量切片執行計算,最後同步結果以重建最終結果。

張量並行對於訓練不適合單個 GPU 記憶體的大型模型非常有效。它也更快、更高效,因為每個 GPU 都可以並行處理其張量切片,並且可以與其他並行方法結合使用。然而,與其他並行方法一樣,張量並行增加了 GPU 之間的通訊開銷。

混合並行

並行方法可以結合使用,以實現更大的記憶體節省和更高效地訓練具有數十億引數的模型。

資料並行和流水線並行

資料並行和流水線並行將資料分佈到 GPU 上,並將每個迷你批次資料分成微批次以實現流水線並行。

每個資料並行等級都將該過程視為只有一個 GPU 而不是兩個,但 GPU 0 和 1 可以將微批次資料解除安裝到 GPU 2 和 3,從而減少空閒時間。

這種方法透過減少空閒 GPU 利用率來最佳化並行資料處理。

ZeRO 資料並行、流水線並行和模型並行(3D 並行)

資料並行、流水線並行和模型並行相結合,形成 3D 並行,以最佳化記憶體和計算效率。

記憶體效率透過將模型分割到 GPU 上並將其分成多個階段以建立流水線來實現。這使得 GPU 可以在微批次資料上並行工作,從而減少模型、最佳化器和啟用的記憶體使用。

ZeRO 資料並行實現了計算效率,其中每個 GPU 只儲存模型、最佳化器和啟用的一部分。這允許資料並行節點之間有更高的通訊頻寬,因為通訊可以獨立進行或與其他流水線階段並行進行。

這種方法可擴充套件到具有數萬億引數的超大型模型。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.