Amazon 分佈式培訓 SageMaker - Amazon SageMaker

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

Amazon 分佈式培訓 SageMaker

SageMaker 提供分散式訓練資料庫,並支援各種分散式訓練選項,適用於深度學習工作,例如電腦視覺 (CV) 和自然語言處理 (NLP)。透 SageMaker過分散式訓練程式庫,您可以執行可高度擴充且符合成本效益的自訂資料 parallel 建立模型深度學習訓練工作。您也可以使用其他分散式訓練架構和套件,例如 PyTorch DistributedDataParallel (DDP) torchrun、MPI (mpirun) 和參數伺服器。在整份文件中,指示和範例著重於如何使用 SageMaker Python 為深度學習工作設定分散式訓練選項SDK。

提示

若要了解機器學習 (ML) 訓練及處理任務的分散式運算的最佳實務,請參閱 SageMaker 最佳實務的分散式運算

開始之前

SageMaker 訓練支援單一執行個體和多個執行個體上的分散式訓練,因此您可以大規模執行任何規模的訓練。我們建議您使用框架估算器類,例如 SageMaker Python TensorFlow中的PyTorch和SDK,這是具有各種分佈式培訓選項的培訓工作啟動器。當您建立估算器物件時,物件會設定分散式訓練基礎結構、CreateTrainingJobAPI在後端執行、尋找目前工作階段執行的區域,然後提取預先封裝的 AWS 深度學習容器之一,其中包括深度學習架構、分散式訓練架構和驅動程式。EFA如果您想要將FSx檔案系統掛載至訓練執行個體,則必須將VPC子網路和安全群組 ID 傳遞給估算器。在中執行分散式訓練工作之前 SageMaker,請先閱讀下列有關基本基礎結構設定的一般指南。

可用性區域與網路後擋板

使用多個執行個體 (也稱為節點) 時,請務必瞭解連接執行個體的網路、它們如何讀取訓練資料,以及它們如何在它們之間共用資訊。例如,當您執行分散式資料 parallel 訓練任務時,有許多因素 (例如用於執行AllReduce作業的運算叢集節點之間的通訊,以及 Amazon Simple Storage Service 或 Amazon FSx in Lustre 中的節點和資料儲存之間的資料傳輸) 扮演至關重要的角色,以達到最佳運用運算資源和更快的訓練速度。若要降低通訊額外負荷,請務必在相同的可用區域中設定執行個體、VPC子網路 AWS 區域 和資料儲存。

GPU具有更快網路和高輸送量儲存的執行個

您可以在技術上使用任何執行個體進行分散式訓練。如果您需要執行多節點分散式訓練工作來訓練大型模型 (例如大型語言模型 (LLMs) 和擴散模型,這些模型需要更快的節點間換換,我們建議EFA支援的已啟用執行個體。GPU SageMaker特別是,為了實現中效能最高的分散式訓練工作 SageMaker,我們建議配備 A100 的 P4d 和 P4dE 執行個體。NVIDIA GPUs這些還配備了高輸送量、低延遲的本機執行個體儲存以及更快速的節點內部網路。對於資料儲存,我們建議 Amazon FSx for Lustre 提供高輸送量來存放訓練資料集和模型檢查點。

在 Amazon 開始使用分散式培訓 SageMaker

如果您已經熟悉分散式訓練,請選擇下列其中一個符合您偏好策略或架構的選項以開始使用。如果您想要了解一般的分散式訓練,請參閱基本分散式訓練概念

SageMaker 分散式訓練資料庫已針對 SageMaker 訓練環境進行最佳化,可協助您調整分散式訓練工作 SageMaker,並提高訓練速度和輸送量。這些資料庫提供資料平行和模型平行訓練策略。它們結合了軟體和硬體技術來改善節點間與節點間的通訊,並透過內建選項擴充 SageMaker訓練功能,這些選項只需對訓練指令碼進行最少的程式碼變更。GPU 

使用 SageMaker 分散式資料平行處理 (SMDDP) 程式庫

該程式SMDDP庫透過針對 AWS 網路基礎設施AllReduce和 Amazon SageMaker ML 執行個AllGather體拓撲最佳化的實作和集體通訊操作來改善節點之間的通訊。您可以使用程式SMDDP庫做為 PyTorch基礎的分散式訓練套件的後端PyTorch 分散式資料並行 (DDP)、PyTorch 完全分割資料 parallel 處理 (FSDP) 和威天。DeepSpeedDeepSpeed下列程式碼範例會示範如何設定PyTorch估算器,以便在兩個ml.p4d.24xlarge執行個體上啟動分散式訓練工作。

from sagemaker.pytorch import PyTorch estimator = PyTorch( ..., instance_count=2, instance_type="ml.p4d.24xlarge", # Activate distributed training with SMDDP distribution={ "pytorchddp": { "enabled": True } } # mpirun, activates SMDDP AllReduce OR AllGather # distribution={ "torch_distributed": { "enabled": True } } # torchrun, activates SMDDP AllGather # distribution={ "smdistributed": { "dataparallel": { "enabled": True } } } # mpirun, activates SMDDP AllReduce OR AllGather )

若要瞭解如何準備訓練指令碼並啟動分散式資料 parallel 訓練工作 SageMaker,請參閱使用分散式資料平行程式庫執行 SageMaker 分散式訓練

使用模 SageMaker 型平行程式庫 () SMP

SageMaker 提供程式SMP庫並支援各種分散式訓練技術,例如分割資料平行處理、流水線、張量平行處理、最佳化器狀態分割等。要了解有關SMP圖書館提供的更多信息,請參閱 SageMaker 模型平行程式庫的核心功能

若要使用 SageMaker的模型平行程式庫,請設定 SageMaker 架構估算器的distribution參數。支持的框架估計器是PyTorch和。TensorFlow下列程式碼範例示範如何透過在兩個 ml.p4d.24xlarge 執行個體使用模型平行程式庫,建立用於分散式訓練的架構估算器。

from sagemaker.framework import Framework distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # enter parameter key-value pairs here } }, }, "mpi": { "enabled" : True, ... # enter parameter key-value pairs here } } estimator = Framework( ..., instance_count=2, instance_type="ml.p4d.24xlarge", distribution=distribution )

若要了解如何調整訓練指令碼、在estimator類別中設定發佈參數,以及啟動分散式訓練工作,請參閱SageMaker的模型平行程度程式庫 (另請參閱 SageMaker Python SDK 文件APIs中的分散式訓練)。

使用開放原始碼分散式訓練架構

SageMaker 還支持以下選項進行操作,mpiruntorchrun在後端。

基本分散式訓練概念

SageMaker的分散式訓練程式庫使用下列分散式訓練術語和功能。

資料集和批次

  • 訓練資料集:用於訓練模型的所有資料。

  • 全域批次大小:每次反覆運算中從訓練資料集中選取的記錄數目,以傳送至叢集GPUs中。這是在每次反覆運算時計算梯度的記錄數。如果使用資料平行處理,則等於模型副本總數乘以每個副本批次大小:global batch size = (the number of model replicas) * (per-replica batch size)。在機器學習文獻,全域批次大小的單一批次通常被稱為小批次

  • 每個副本批次大小:使用資料平行處理時,這是傳送至每個模型副本的記錄數。每個模型副本都會對此批次執行向前和向後傳遞,以計算權重更新。在處理下一組每個副本批次之前,產生的權重更新會在所有副本之間同步 (平均)。

  • 微型批次:小批次的子集,或者,如果使用混合模型和資料平行處理,則它是每個副本大小批次的子集。當您使用 SageMaker的分散式模型平行程式庫時,每個微批次都會輸入訓練管線, one-by-one 並遵循程式庫執行階段所定義的執行排程

訓練

  • Epoch:整個資料集的一個訓練週期。每個時期有多個反覆運算這很常見。您在訓練中使用的 Epoch 數量對於您的模型及案例來說是唯一的。

  • 反覆運算:使用全域批次大小批次 (小批次) 訓練資料執行的單一向前和向後傳遞。訓練期間執行的反覆運算次數取決於全域批次大小和用於訓練的 Epoch 數量。例如,如果資料集包含 5,000 個範例,而您使用的全域批次大小為 500,則需要 10 次反覆運算才能完成單一 Epoch。

  • 學習速率:影響權重根據模型計算誤差而變化的量的變數。學習速率對於模型的收斂能力以及收斂的速度及最佳化方面起著重要作用。

執行個體和 GPUs

  • 執行個體: AWS 機器學習運算執行個體。這些也稱為節點

  • 叢集大小:使用 SageMaker的分散式訓練程式庫時,這是執行個體數目乘以每個執行個體GPUs中的數目。例如,如果您在訓練工作中使用兩個 ml.p3.8xlarge 執行個體,GPUs每個執行個體都有 4 個,則叢集大小為 8。雖然增加叢集大小可以縮短訓練時間,但必須最佳化執行個體之間的通訊;否則,節點之間的通訊可能會增加額外負荷,並導致訓練時間變慢。 SageMaker 分散式訓練程式庫旨在最佳化 Amazon EC2 ML 運算執行個體之間的通訊,進而提高裝置使用率和更快的訓練時間。

分散式訓練方案

  • 資料平行處理:分散式訓練中的一種策略,其中訓練資料集會在運算叢集GPUs中分割為多個,該叢集由多個 Amazon EC2 ML 執行個體組成。每個節點都GPU包含模型的複本,接收不同批次的訓練資料,執行向前和向後傳遞,並與其他節點共用權重更新以進行同步處理,然後再進行下一個批次,並最終進行另一個時代。

  • 模型平行處理:分散式訓練中的一種策略,其中模型在運算叢集GPUs中跨多個分區,其中包含多個 Amazon EC2 ML 執行個體。該模型可能很複雜,並且具有大量隱藏的層與權重,因此無法容納單一執行個體的記憶體。每個都GPU帶有模型的一個子集,通過該子集的數據流和轉換被共享和編譯。在使用率和訓練時間方面,模型平行處理原則的效GPU率在很大程度上取決於模型的分割方式以及用來執行向前和向後傳遞的執行排程。

  • 管道執行排程 (管道):管道執行排程決定進行計算 (微型批次) 的順序,以及在模型訓練期間跨裝置處理資料的順序。Pipelining 是一種技術,可以在模型平行性中實現真正的平行化,並通過在不同的數據樣本上同時GPUs運算來克服循序計算造成的性能損失。如需進一步了解,請參閱管道執行排程

進階概念

在訓練模型時,Machine Learning (ML) 從業人員通常會面臨兩個擴展挑戰:縮放模型大小擴展訓練資料。 雖然模型大小和複雜度可能會導致更好的精確度,但是您可以將模型大小放入單個CPU或中的模型大小有限制GPU。此外,擴展模型大小可能會導致更多的計算和更長的訓練時間。

並非所有模型都能夠很好處理訓練資料擴展,因為它們需要在記憶體中擷取所有訓練資料以進行訓練。它們只能垂直縮放,並擴展到越來越大的執行個體類型。在大多數情況下,擴展訓練資料會導致更長的訓練時間。

深度學習 (DL) 是一個特定的機器學習 (ML) 演算法系列,由多層人工神經網路組成。最常見的訓練方法是使用迷你批量隨機梯度下降()。SGD在迷你批量中SGD,模型是通過在減少其誤差的方向上對其係數進行小的迭代變化來訓練。這些反覆運算是在訓練資料集的相同大小的子範本 (稱為小批次) 所進行。對於每個小批次,該模型在小批次的每個記錄中執行,測量其誤差並估計誤差的梯度。然後在小批次的所有記錄中測量平均梯度,並為每個模型係數提供更新方向。訓練資料集的一個完整傳遞稱為 Epoch。模型訓練通常包含數十到數百個 Epoch。Mini-Batch SGD 有幾個好處:首先,它的迭代設計使得訓練時間理論上線性的數據集大小。其次,在指定的小批次,每個記錄都由模型單獨處理,除了最終的梯度平均值之外,不需要記錄間通訊。因此,小批次的處理特別適合於平行化和分散式。 

透過將小批次的記錄分配到不同的運算裝置上,將SGD訓練 parallel 化,稱為資料並行分散式訓練,也是最常用的 DL 發佈範例。資料平行訓練是一種相關的分散式策略,可以擴展小批次大小並更快處理每個小批次。但是,資料平行訓練帶來了額外的複雜性:必須使用來自所有工作人員的梯度來計算小批次梯度平均值並將其傳達給所有工作者,這一步驟稱為 allreduce,該步驟可以代表不斷增長的額外負荷,因為訓練叢集被擴展,如果實施不當或實施不當的硬體減法,也會大大減少訓練時間。 

數據 parallel SGD 仍然需要開發人員能夠適應至少模型和計算設備中的單個記錄,例如單個CPU或GPU. 在訓練非常大的模型 (例如自然語言處理 (NLP) 中的大型變壓器,或在高解析度影像上進行分割模型時,可能會發生這種情況不可行。分解工作負載的另一種方法是在多個運算裝置對模型進行分割,這種方法稱為模型平行分散式訓練

策略

分散式訓練通常分為兩種方法:資料平行與模型平行。資料 parallel 是分散式訓練最常見的方法:您擁有大量資料、批次處理,然後將資料區塊傳送至多個CPUs或 GPUs (節點) 以供神經網路或 ML 演算法處理,然後合併結果。每個節點上的神經網路都相同。模型平行方法用於無法整體裝入節點記憶體的大型模型;它分解模型並將不同的部分放置在不同的節點。在這種情況下,您需要將批次的資料傳送到每個節點,以便在模型的所有部分處理資料。

術語網路模型通常可以互換使用:大型模型實際上是具有許多層及參數的大型網路。使用大型網路進行訓練會產生一個大型模型,然後使用所有預先訓練的參數及其權重將模型載入到記憶體中。當您分解模型以將其拆分到節點時,您也會分解基礎網路。網路由層組成,若要分割網路,您可以將層放在不同的運算裝置。

在裝置間天真地分割圖層的一個常見陷阱是嚴重GPU的不足利用率。在向前和向後傳遞中,訓練本質上是連續的,並且在給定的時間,只有一個人GPU可以主動計算,而其他人則等待發送的激活。現代模型平行程式庫透過使用管道執行計劃來提高裝置使用率來解決此問題。但是,只有 Amazon SageMaker 的分佈式模型 parallel 庫包括自動模型拆分。程式庫的兩個核心特徵,即自動模型分割及管道執行排程,可透過自動化決策來簡化實作模型平行處理的程序,進而提高裝置使用效率。

透過資料平行與模型平行進行訓練

如果您正在使用大型資料集進行訓練,請從資料平行方法開始。如果在訓練期間記憶體不足,您可能需要切換到模型平行方法,或嘗試混合模型和資料平行處理。您也可以嘗試以下方法來改善資料平行的效能:

  • 變更模型的超參數。

  • 減少批次大小。

  • 繼續減小批次大小,直到合適為止。如果您將批次大小減少到 1,但仍然耗盡記憶體,那麼您應該嘗試模型平行訓練。

嘗試漸層壓縮 (FP16,INT8):

嘗試減小輸入大小:

  • 如果您增加NLP序列連結、需要調整批次大小或向上調整以分攤批次,請縮小序列長度。GPUs

  • 降低影像解析度。

檢查是否使用批次標準化,因為這可能會影響收斂。當您使用分散式訓練時,您的批次會被分割,GPUs而較低批次大小的影響可能會產生較高的錯誤率,從而中斷模型收斂。例如,如果您在批次大小為 64 的單GPU一網路上對網路進行原型設計,然後擴充為使用四個 p3dn.24xlarge,您現在擁有 32 個,GPUs而每GPU批次大小會從 64 下降到 2。這可能會破壞您在單一節點看到的收斂。

在下列情況下,從模型平行訓練開始:

  • 您的模型不適用於單一裝置。

  • 由於您的模型大小,您在選擇較大的批次大小時面臨限制,例如,如果您的模型重量佔用了大部分GPU內存,並且您被迫選擇較小,次最佳的批次大小。 

若要深入瞭解 SageMaker 分散式程式庫,請參閱下列內容:

最低分散式訓練

為您的使用案例及資料自訂超參數,以獲得最佳的擴展效率。在下面的討論中,我們將重點介紹一些最具影響力的訓練變數,並提供 state-of-the-art 實作參考,以便您可以進一步瞭解您的選項。此外,我們建議您參考偏好架構的分散式訓練文件。

批次大小

SageMaker 分佈式工具包通常允許您在更大的批次上進行培訓。例如,如果模型適合單一裝置,但只能以小批次規模進行訓練,則使用平行模型訓練或資料平行訓練可讓您嘗試較大的批次。

請注意,批次大小會在每次反覆運算時控制模型更新中的雜訊量,直接影響模型準確度。增加批次大小可減少梯度估計的雜訊量,這在從非常小的批次大小開始增加時會有所幫助,但是當批次大小增加到較大值時,可能會導致模型準確度降低。 

提示

調整您的超參數,以確保您的模型在增加批次大小時訓練到滿意的收斂。

當批次增加時,已開發出許多技術來維持良好的模型收斂性。

小批次大小

在中SGD,迷你批次大小會量化漸層估計中存在的雜訊量。小批次會導致非常雜訊的小批次梯度,這並不能代表資料集的真實梯度。大型小批次會導致小批次梯度接近資料集的真實梯度,而且可能不會有足夠的雜訊–可能會保持鎖定在不相關的最小值範圍內。

如需進一步了解有關這些技術的詳細資訊,請參閱以下論文:

案例

以下幾節涵蓋了您可能想要擴展訓練的案例,以及如何使用 AWS 資源來執行此操作。

從單個縮放GPU到多個 GPUs

機器學習使用的資料量或模型大小可能會導致訓練模型的時間比您願意等待的時間更長。有時,訓練根本沒有作用,因為模型或訓練資料太大。一種解決方案是增加GPUs您用於培訓的數量。 在具有多GPUs個執行個體 (例如具p3.16xlarge有 8 個) 的執行個體上GPUs,資料和處理會分成八個GPUs。當您使用分散式訓練程式庫時,這可能會導致訓練模型所需的時間近乎線性的加速。它需要稍微超過 1/8 的時間,它將p3.2xlarge採取一個GPU。

執行個體類型 GPUs
p3.2xlarge 1
p3.8xlarge 4
p3.16xlarge 8
p3dn.24xlarge 8
注意

SageMaker 訓練所使用的 ml 執行個體類型與對應 p3 執行個體類型的GPUs數目相同。例如,ml.p3.8xlarge具有與 p3.8xlarge-4 相GPUs同的數目。

從單一執行個體擴展至多個執行個體

如果您想要進一步擴展訓練規模,可以使用更多執行個體。不過,您應該先選擇較大的執行個體類型,然後再新增更多執行個體。複查上一個表格,瞭解每個 p3 執行處理類型中GPUs有多少。

如果您已經將一個單GPU一的跳轉p3.2xlarge到四個p3.8xlarge,但決定需要更多的處理能力,則如果您GPUs在嘗試增加執行個體數量p3.16xlarge之前選擇一個,則可能會看到更好的效能並產生更低的成本。視您使用的程式庫而定,當您在單一執行個體進行訓練時,與使用多個執行個體的情況相比,效能更好、成本更低。

當您準備擴展實例的數量時,您可以通過設置您的 SageMaker Python SDK estimator 函數來完成此操作instance_count。例如,您可以建立 instance_type = p3.16xlargeinstance_count = 2。而不是一個單獨GPUs的八個p3.16xlarge,你有 16 GPUs 跨兩個相同的實例。下圖顯示單一執行個體的擴展和輸送量,從 8 GPUs 個開始,增加到 64 個執行個體,總計 256 個GPUs。

Chart showing how throughput increases and time to train decreases with more GPUs.

自訂訓練指令碼

儘管部署和擴展實例數量 SageMaker 變得簡單GPUs,並且根據您選擇的框架,管理數據和結果可能非常具有挑戰性,這就是為什麼經常使用外部支持庫的原因。 這種最基本的分散式訓練形式需要修改訓練指令碼以管理資料散發。

SageMaker 還支持 Horovod 和每個主要深度學習框架原生的分佈式培訓實施。如果您選擇使用這些架構中的範例,可以遵循 Deep Learning Containers SageMaker 的容器指南,以及示範實作的各種範例筆記本