本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
模型平行處理簡介
模型平行處理原則是一種分散式訓練方法,深度學習模型會在多個裝置間分割,不論是在執行個體內部或執行個體間皆如此。此簡介頁面提供有關模型 parallel 處理原則的高階概觀、說明它如何協助克服訓練大小通常非常大的 DL 模型時所產生的問題,以及 SageMaker 模型 parallel 程式庫所提供的協助管理模型平行策略以及記憶體消耗的範例。
什麼是模型平行處理?
增加深度學習模型 (圖層和參數) 的大小可以為複雜的任務 (例如電腦視覺和自然語言處理) 提供更佳的準確性。但是,您可以容納在單個記憶體中的最大模型大小有限制GPU。訓練 DL 模型時,GPU記憶體限制可能會以下列方式成為瓶頸:
-
它們會限制您可以訓練的模型大小,因為模型的記憶體佔用量會與參數數量成比例擴展。
-
它們限制了培訓期間的每GPU批次大小,從而降低了GPU使用率和培訓效率。
為了克服在單一模型上訓練模型的相關限制GPU,請 SageMaker 提供模型 parallel 程式庫,以協助在多個運算節點上有效地分配和訓練 DL 模型。此外,借助該庫,您可以使用EFA支持的設備實現最優化的分散式培訓,這樣可以通過低延遲,高輸送量和操作系統繞過來增強節點間通信的性能。
使用模型平行處理之前預估記憶體
在您使用 SageMaker 模型 parallel 程式庫之前,請考慮下列事項,以瞭解訓練大型 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憶體大得多(例如,具有 40GB/80GB 記憶體的 NVIDIA A100,以及具有 16/32 GB 的 V100)。GPU請注意,除了模型和最佳化工具狀態的記憶體需求之外,還有其他記憶體取用者,例如在轉送傳遞中產生的啟動。所需的記憶體可能大於 200GB。
對於分散式訓練,我們建議您分別使用具有 NVIDIA V100 和 A100 張量核心的 Amazon EC2 P3 和 P4 執行個體。GPUs如需CPU核心、RAM附加儲存磁碟區和網路頻寬等規格的詳細資訊,請參閱 Amazon EC2 執行個體類型
即使使用加速的運算執行個體,很明顯,具有大約 100 億個參數 (例如 Megatron-LM 和 T5) 的模型,甚至是具有數百億個參數 (例如 GPT -3) 的大型模型,也無法在每個裝置中放入模型複本。GPU
程式庫如何運用模型平行處理與記憶體節省技術
該程式庫包含各種類型的模型平行處理功能和記憶體節省功能,例如最佳化工具狀態碎片、啟動檢查點、啟動卸載。所有這些技術都可以結合起來,以有效率地訓練包含數千億個參數的大型模型。
主題
分片資料平行處理原則 (適用於) PyTorch
分割資料 parallel 性是一種節省記憶體的分散式訓練技術,可將模型狀態 (模型參數、漸層和最佳化程式狀態) 分割到資料平行群組中。GPUs
SageMaker 實作分片資料平行處理,透過 MIC 的實作,這是一個程式庫,它可以將 mmunication 縮放,並在關於巨型模型訓練的近線性縮放部落格文章中討論。 AWS
您可以將碎片資料平行處理套用至模型,以作為獨立的策略。此外,如果您使用配備 NVIDIA A100 Tensor 核心的效能最高的GPU執行個體 GPUsml.p4d.24xlarge
,則可以利用 Collectives 提供的AllGather
操作提高的訓練速度。SMDDP
若要深入了解分割資料平行處理原則,並瞭解如何設定資料,或結合使用分割資料平行處理原則與其他技術 (例如張量平行處理和訓練),請參閱。FP16 碎片資料平行處理
管線平行度 (可用於 PyTorch 和 TensorFlow)
管道平行處理會跨裝置集合分割一組層或作業,讓每個作業完好無缺。當您指定模型分割區 (pipeline_parallel_degree
) 的數值時,() 的總數必須由模型分割區的數目整除。GPUs processes_per_host
若要正確設定,您必須指定正確的 pipeline_parallel_degree
和 processes_per_host
參數值。簡單的數學原理如下:
(pipeline_parallel_degree) x (data_parallel_degree) = processes_per_host
在特定您提供的兩個輸入參數的情況下,該程式庫負責計算模型複本的數量 (亦稱為 data_parallel_degree
)。
例如,如果您設定"pipeline_parallel_degree": 2
並"processes_per_host": 8
使用具有八個 GPU Worker (例如) 的 ML 執行個體ml.p3.16xlarge
,程式庫會自動設定跨四向資料平行處理原則的GPUs分散式模型。下圖說明GPUs實現四向資料平行性和雙向管線平行處理原則的八個模型如何分散。每個模型副本,我們將其定義為管道並行組並將其標記為PP_GROUP
,被分割為兩個GPUs。模型的每個分割區都會指派給四個GPUs,其中四個分割區複本位於資料 parallel 群組中並標示為DP_GROUP
。如果沒有張量平行處理,管道平行群組本質上就是模型平行群組。
若要深入了解管道平行處理,請參閱 SageMaker 模型平行程式庫的核心功能。
若要開始使用管線平行處理原則執行模型,請參閱使用 SageMaker 模型平行程式庫執行 SageMaker 分散式訓練 Job。
張量平行度 (適用於) PyTorch
張量平行處理會跨裝置將各個層或 nn.Modules
分割,藉此平行執行。下圖顯示最簡單的範例,說明程式庫如何將模型分割成四層,以達到雙向張量平行處理 ("tensor_parallel_degree": 2
)。每個模型複本的層被平分並分成兩個。GPUs在這個範例中,模型 parallel 組態也包含"pipeline_parallel_degree": 1
和 "ddp": True
(在背景中使用 PyTorch DistributedDataParallel 套件),因此資料平行處理原則的程度會變成 8。程式庫會管理張量分散式模型複本之間的通訊。
此功能的實用性在於您可以選取特定的層或層子集,藉此套用張量平行處理。若要深入瞭解張量平行處理和其他節省記憶體的功能 PyTorch,並瞭解如何設定管線和張量平行處理原則的組合,請參閱。張量平行處理
優化器狀態分片(可用於 PyTorch)
如要了解程式庫如何執行最佳化工具狀態碎片,不妨參考一個具有四層的簡單範例模型。優化狀態分片的關鍵思想是您不需要在所有. GPUs 相反地,最佳化工具狀態的單一複本會 data-parallel 等級進行資料分割,而不會跨裝置提供備援。例如,GPU0 會保留第一層的最佳化處理器狀態,下一個 GPU 1 會保留 L2 的最佳化器狀態,依此類推。下列動畫圖顯示使用最佳化工具狀態碎片技術的向後傳播。在向後傳播結束時,optimizer apply
(OA) 作業會更新最佳化工具狀態的運算和網路時間,而 all-gather
(AG) 作業則會更新下一次反覆運算的模型參數。最重要的是,該reduce
操作可能會與 GPU 0 上的計算重疊,從而導致更高的內存效率和更快的向後傳播。在目前的實作中,AG 和 OA 作業不會與 compute
重疊。這可能會導致在 AG 作業期間延伸運算,因此可能會有所取捨。
如需如何使用此功能的詳細資訊,請參閱最佳化工具狀態碎片。
啟用卸載和檢查點 (適用於) PyTorch
為了節省內GPU存,該庫支持激活檢查點,以避免在正向傳遞期間將內部激活存儲在內GPU存中用於用戶指定的模塊。程式庫會在向後傳遞期間重新運算這些啟動項目。此外,啟動卸載功能會將儲存的啟動卸載至CPU記憶體,並在向後傳遞GPU期間擷取回,以進一步減少啟動記憶體佔用量。如需如何使用這些功能的詳細資訊,請參閱啟用檢查點和啟用卸載。
為您的模型選擇正確的技術
如需有關選擇正確技術和組態的詳細資訊,請參閱SageMaker 分散式模型平行最佳作法和組態提示和陷阱。