模型平行處理簡介 - Amazon SageMaker AI

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

模型平行處理簡介

模型平行處理原則是一種分散式訓練方法,深度學習模型會在多個裝置間分割,不論是在執行個體內部或執行個體間皆如此。此簡介頁面提供模型平行處理的高階概觀、如何協助克服訓練 DL 模型時所發生的問題的說明,以及 SageMaker 模型平行程式庫提供的範例,以協助管理模型平行策略和記憶體消耗。

什麼是模型平行處理?

增加深度學習模型 (圖層和參數) 的大小可以為複雜的任務 (例如電腦視覺和自然語言處理) 提供更佳的準確性。不過,您可以放入單一 記憶體的最大模型大小有限制GPU。訓練 DL 模型時,GPU記憶體限制可能會以下列方式造成瓶頸:

  • 它們會限制您可以訓練的模型大小,因為模型的記憶體佔用量會與參數數量成比例擴展。

  • 它們會在訓練期間限制每個GPU批次的大小,進而降低GPU使用率和訓練效率。

為了克服在單一 上訓練模型的相關限制GPU, SageMaker 提供模型平行程式庫,以協助在多個運算節點上有效率地分發和訓練 DL 模型。此外,透過 程式庫,您可以使用 EFA支援的裝置來實現最最佳化的分散式訓練,以低延遲、高輸送量和作業系統旁路增強節點間通訊的效能。

使用模型平行處理之前預估記憶體

使用 SageMaker 模型平行程式庫之前,請考慮下列事項,以了解訓練大型 DL 模型的記憶體需求。

對於使用 AMP(FP16) 和 Adam 最佳化工具的訓練任務,每個參數所需的GPU記憶體約為 20 個位元組,我們可以依下列方式細分:

  • FP16 參數 ~ 2 個位元組

  • FP16 梯度 ~ 2 個位元組

  • 根據 Adam FP32最佳化工具的最佳化工具狀態 ~ 8 個位元組

  • 參數FP32的副本 ~ 4 個位元組 ( optimizer apply(OA) 操作需要)

  • 梯度 ~ 4 位元組的FP32複本 (OA 操作需要)

即使對於具有 100 億個參數的相對較小 DL 模型,它也需要至少 200GB 的記憶體,這比單一 上可用的一般GPU記憶體 (例如,NVIDIAA100 具有 40GB/80GB 記憶體,V100 具有 16/32 GB) 大得多GPU。請注意,除了模型和最佳化工具狀態的記憶體需求之外,還有其他記憶體取用者,例如在轉送傳遞中產生的啟動。所需的記憶體可能大於 200GB。

對於分散式訓練,我們建議您GPUs分別使用具有 NVIDIA V100 和 A100 Tensor 核心的 Amazon EC2 P3 和 P4 執行個體。如需CPU核心、RAM、連接儲存磁碟區和網路頻寬等規格的詳細資訊,請參閱 Amazon EC2執行個體類型頁面中的加速運算一節。

即使使用加速運算執行個體,很明顯,具有大約 100 億個參數的模型,例如 Megatron-LM 和 T5,甚至具有數百億個參數的較大模型,例如 GPT-3,都無法在每個GPU裝置中容納模型複本。

程式庫如何運用模型平行處理與記憶體節省技術

該程式庫包含各種類型的模型平行處理功能和記憶體節省功能,例如最佳化工具狀態碎片、啟動檢查點、啟動卸載。所有這些技術都可以結合起來,以有效率地訓練包含數千億個參數的大型模型。

碎片資料平行處理 (適用於 PyTorch)

碎片資料平行處理是一種節省記憶體的分散式訓練技術,可將模型的狀態 (模型參數、漸層和最佳化工具狀態) 分割到資料平行群組GPUs中。

SageMaker AI 透過實作 MiCS 來實作碎片資料平行處理,MiCS 是一個程式庫,可模擬 c 滲透率,並在部落格文章中討論巨型模型訓練的近線性擴展 AWS

您可以將碎片資料平行處理套用至模型,以作為獨立的策略。此外,如果您使用的是配備 NVIDIA A100 Tensor GPUs核心 、 效能最佳的GPU執行個體ml.p4d.24xlarge,則可以利用 SMDDP Collectives 提供的AllGather操作提高訓練速度。

若要深入了解碎片資料平行處理,並了解如何設定碎片資料平行處理,或結合使用碎片資料平行處理與其他技術,例如張量平行處理和FP16訓練,請參閱 碎片資料平行處理

管道平行處理 (適用於 PyTorch 和 TensorFlow)

管道平行處理會跨裝置集合分割一組層或作業,讓每個作業完好無缺。當您指定模型分割區數目的值 (pipeline_parallel_degree) 時, GPUs(processes_per_host) 的總數必須除以模型分割區數目。若要正確設定,您必須指定正確的 pipeline_parallel_degreeprocesses_per_host 參數值。簡單的數學原理如下:

(pipeline_parallel_degree) x (data_parallel_degree) = processes_per_host

在特定您提供的兩個輸入參數的情況下,該程式庫負責計算模型複本的數量 (亦稱為 data_parallel_degree)。

例如,如果您將 "processes_per_host": 8 "pipeline_parallel_degree": 2和 設定為使用 ML 執行個體搭配八位GPU工作者,例如 ml.p3.16xlarge,則程式庫會自動設定跨 GPUs和四向資料平行處理的分散式模型。下圖說明模型如何分佈在八項GPUs達成四向資料平行處理和雙向管道平行處理。每個模型複本,其中我們將其定義為管道平行群組,並將其標記為 PP_GROUP,並分割為兩個 GPUs。模型的每個分割區都指派給四個 GPUs,其中四個分割區複本位於資料平行群組中,並標記為 DP_GROUP。如果沒有張量平行處理,管道平行群組本質上就是模型平行群組。

模型如何分佈在八項GPUs達成四向資料平行處理和雙向管道平行處理。

若要深入了解管道平行處理,請參閱 SageMaker 模型平行處理程式庫的核心功能

若要開始使用管道平行處理執行模型,請參閱使用 SageMaker 模型平行程式庫執行 SageMaker 分散式訓練任務

Tensor 平行處理 (適用於 PyTorch)

張量平行處理會跨裝置將各個層或 nn.Modules 分割,藉此平行執行。下圖顯示最簡單的範例,說明程式庫如何將模型分割成四層,以達到雙向張量平行處理 ("tensor_parallel_degree": 2)。每個模型複本的圖層會分割並分佈到兩個 GPUs。在此範例中,模型平行組態也包含 "pipeline_parallel_degree": 1"ddp": True(在背景中使用 PyTorch DistributedDataParallel 套件),因此資料平行處理的程度會變成八個。程式庫會管理張量分散式模型複本之間的通訊。

程式庫如何將模型分割為四個圖層以達成雙向張量平行處理的最簡單範例 ("tensor_parallel_degree": 2)。

此功能的實用性在於您可以選取特定的層或層子集,藉此套用張量平行處理。若要深入了解 的張量平行處理和其他記憶體節省功能 PyTorch,並了解如何設定管道和張量平行處理的組合,請參閱 張量平行處理

Optimizer 狀態分割 (適用於 PyTorch)

如要了解程式庫如何執行最佳化工具狀態碎片,不妨參考一個具有四層的簡單範例模型。最佳化狀態分割的關鍵概念是您不需要在所有 中複寫最佳化工具狀態GPUs。相反地,最佳化工具狀態的單一複本會 data-parallel 等級進行資料分割,而不會跨裝置提供備援。例如,0 GPU 會保留第一層的最佳化工具狀態,下一個 GPU 1 會保留 L2 的最佳化工具狀態,以此類推。下列動畫圖顯示使用最佳化工具狀態碎片技術的向後傳播。在向後傳播結束時,optimizer apply (OA) 作業會更新最佳化工具狀態的運算和網路時間,而 all-gather (AG) 作業則會更新下一次反覆運算的模型參數。最重要的是,該reduce操作可與 0 GPU 上的運算重疊,進而提高記憶體效率並更快向後傳播。在目前的實作中,AG 和 OA 作業不會與 compute 重疊。這可能會導致在 AG 作業期間延伸運算,因此可能會有所取捨。

使用最佳化工具狀態碎片技術的向後傳播。

如需如何使用此功能的詳細資訊,請參閱最佳化工具狀態碎片

啟用卸載和檢查點 (適用於 PyTorch)

為了節省GPU記憶體,程式庫支援啟用檢查點,以避免在轉送期間將內部啟用存放在使用者指定模組的GPU記憶體中。程式庫會在向後傳遞期間重新運算這些啟動項目。此外,啟用卸載功能會將儲存的啟用卸載至CPU記憶體,並在向後傳遞GPU期間擷取回 ,以進一步減少啟用記憶體佔用。如需如何使用這些功能的詳細資訊,請參閱啟用檢查點啟用卸載

為您的模型選擇正確的技術

如需選擇正確技術和組態的詳細資訊,請參閱SageMaker 分散式模型平行最佳實務組態秘訣和陷阱