碎片資料平行處理 - Amazon SageMaker

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

碎片資料平行處理

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

注意

分割資料平行處理原則適用於 SageMaker 模型平行程 PyTorch 式庫 v1.11.0 及更新版本。

將訓練任務擴展到大型GPU叢集時,您可以透過將模型的訓練狀態分割為多個GPUs,以減少模型的每個GPU記憶體使用量。這將返回兩個好處:您可以容納較大的模型,否則會使用標準數據並行性的內存不足,或者您可以使用釋放的內存來增加批次大GPU小。

標準資料 parallel 處理原則技術會複寫資料平行群組GPUs中的訓練狀態,並根據作業執行漸層彙總。AllReduce碎片資料平行處理會修改標準資料平行分散式訓練程序,以說明最佳化工具狀態的碎片性質。模型與最佳化工具狀態用以碎片化的一組等級稱為碎片群組分片資料平行技術會在分片群組中分割模型的可訓練參數,以及對應的漸層和最佳化器狀態。GPUs

SageMaker 透過實作 mC 來實現分片資料並行性,這在 AWS 部落格文章中討論了巨型模型訓練的近線性縮放。 AWS在此實作,您可以設定碎片程度為設定參數,該參數必須小於資料平行處理程度。在每次向前和向後通GPUs過期間,MICH 會在整個AllGather操作中暫時重新組合模型參數。在每個圖層的向前或向後傳遞之後,MICC 會再次分割參數以節省GPU記憶體。在向後傳遞期間,MICE 會減少漸層,並在操作中同時將它們分片。GPUs ReduceScatter最後,MiCS 會使用最佳化工具狀態的本機碎片,套用本機的縮減及碎片漸層至其對應本機參數碎片。為了降低通訊負荷, SageMaker 模型平行程式庫會在向前或向後傳遞中預先擷取即將到來的圖層,並將網路通訊與計算重疊。

模型的訓練狀態會跨碎片群組複寫。這表示在將漸層套用至參數之前,除在碎片群組進行的 AllReduce 作業之外,還必須在碎片群組進行 ReduceScatter 作業。

實際上,分片數據並行性在通信開銷和GPU內存效率之間進行了折衷。使用分片資料平行處理原則會增加通訊成本,但是每個記憶體佔用量 GPU (不包括因啟動而導致的記憶體使用量) 除以分片資料平行度,因此較大的模型可以容納在叢集中。GPU

選取碎片資料平行處理程度

當您針對碎片資料平行處理程度選取值時,該值必須能平均除碎片資料平行處理程度。例如,對於 8 向資料平行處理工作,請選擇 2、4 或 8 做為碎片資料平行處理程度。在選擇碎片資料平行處理程度時,建議您從小數字開始,然後逐漸增加,直到模型與所需的批次大小可一起放入記憶體。

選取批次大小

設定分割資料平行處理原則之後,請確定您找到可以在叢集上成功執行的最佳訓練組態。GPU對於訓練大型語言模型 (LLM),請從批次大小 1 開始,逐漸增加它,直到到達接收 out-of-memory (OOM) 錯誤的點為止。如果即使使用最小批次大小也遇到OOM錯誤,請套用較高程度的分割資料平行處理原則,或是分割資料平行處理原則與張量平行處理原則的組合。

如何套用碎片資料平行處理至訓練任務

若要開始使用分片資料平行處理原則,請將必要的修改套用至訓練指令碼,並使用參數設定 SageMaker PyTorch 估算器。 sharded-data-parallelism-specific 同時請考慮以參考值與範例筆記本為起點。

調整您的 PyTorch 訓練指令碼

遵循步驟 1:修改 PyTorch 訓練指令碼中的指示,以和模組的包裝smdistributed.modelparallel.torch函式來包裝torch.distributed模型torch.nn.parallel和最佳化器物件。

(選用) 註冊外部模型參數的其他修改

如果您的模型是使用模塊類中未定義的參數構建torch.nn.Module並使用的參數,則應手動將它們註冊到模塊中,以SMP便在同時收集完整的參數。若要將參數註冊到模組,請使用 smp.register_parameter(module, parameter)

class Module(torch.nn.Module): def __init__(self, *args): super().__init__(self, *args) self.layer1 = Layer1() self.layer2 = Layer2() smp.register_parameter(self, self.layer1.weight) def forward(self, input): x = self.layer1(input) # self.layer1.weight is required by self.layer2.forward y = self.layer2(x, self.layer1.weight) return y

設定 SageMaker PyTorch 估算器

在中配置 SageMaker PyTorch 估算器時步驟 2:使用開發套件啟動訓練 Job SageMaker,請新增分片資料平行處理原則的參數。

若要開啟分割資料平行處理原則,請將sharded_data_parallel_degree參數新增至估算器 SageMaker PyTorch。此參數指定訓練狀態分割的數目。GPUssharded_data_parallel_degree 的值必須為整數並介於 1 與資料平行處理程度之間,且必須能平均除資料平行處理程度。請注意,庫會自動檢測的數量,GPUs因此數據的 parallel 程度。下列其他參數可用於設定碎片資料平行處理。

  • "sdp_reduce_bucket_size"(int,預設值:5e8) — 以預設 dtype 的元素數目指定PyTorch DDP漸層值區的大小。

  • "sdp_param_persistence_threshold"(int,預設值:1e6) — 指定參數張量的大小,其中每個項目都可以持續存在的元素數目。GPU分片資料 parallel 處理原則會將每個參數張量分割成資料平GPUs行群組。如果參數 tensor 中的元素數目小於此臨界值,則不會分割參數 tensor;這有助於減少通訊負荷,因為參數張量是跨 parallel 資料複寫的。GPUs

  • "sdp_max_live_parameters"(整數,預設值:1e9) — 針對在向前與向後傳遞期間,可同時處於重新組合訓練狀態的參數指定其數量上限。當有效參數數量達到指定閾值時,使用 AllGather 作業擷取的參數會暫停。請注意,增加此參數會增加記憶體使用量。

  • "sdp_hierarchical_allgather"(boo l,預設值:True) — 如果設定為 True,則 AllGather 作業會以階層方式執行:會先在每個節點內執行,然後跨節點執行。對於多節點分散式訓練任務,會自動啟用階層式 AllGather 作業。

  • "sdp_gradient_clipping"(浮動,預設值:1.0) — 針對剪輯 L2 標準的漸層指定閾值,然後再透過模型參數向後傳播漸層。當啟用碎片資料平行處理時,也會啟用漸層剪輯。預設閾值為 1.0。如果您遇到漸層爆炸問題,請調整此參數。

下列程式碼範例顯示如何設定碎片資料平行處理。

import sagemaker from sagemaker.pytorch import PyTorch smp_options = { "enabled": True, "parameters": { # "pipeline_parallel_degree": 1, # Optional, default is 1 # "tensor_parallel_degree": 1, # Optional, default is 1 "ddp": True, # parameters for sharded data parallelism "sharded_data_parallel_degree": 2, # Add this to activate sharded data parallelism "sdp_reduce_bucket_size": int(5e8), # Optional "sdp_param_persistence_threshold": int(1e6), # Optional "sdp_max_live_parameters": int(1e9), # Optional "sdp_hierarchical_allgather": True, # Optional "sdp_gradient_clipping": 1.0 # Optional } } mpi_options = { "enabled" : True, # Required "processes_per_host" : 8 # Required } smp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script role=sagemaker.get_execution_role(), instance_count=1, instance_type='ml.p3.16xlarge', framework_version='1.13.1', py_version='py3', distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="sharded-data-parallel-job" ) smp_estimator.fit('s3://my_bucket/my_training_data/')

參考組態

SageMaker 分散式訓練團隊提供下列參考配置,您可以將其用作起點。您可以從下列組態中推斷,以實驗和估算模型組態的GPU記憶體使用量。

與集體的分片資料平行處理 SMDDP

模型/參數量 執行個體數 執行個體類型 序列長度 全域批次大小 最小批次大小 碎片資料平行程度
GPT-二十NEOX乙 2 ml.p4d.24xlarge 2048 64 4 16
GPT-二十NEOX乙 8 ml.p4d.24xlarge 2048 768 12 32

例如,如果增加 200 億個參數模型的序列長度,或增加模型大小到 650 億個參數,則需要先嘗試縮小批次大小。如果模型仍無法容納最小批次大小 (批次大小為 1),請嘗試增加模型平行處理程度。

具有張量並行性和集體的分片資料平行處理 NCCL

模型/參數量 執行個體數 執行個體類型 序列長度 全域批次大小 最小批次大小 碎片資料平行程度 張量平行程度 啟用卸載
GPT-NEOX -65 億 64 ml.p4d.24xlarge 2048 512 8 16 8 Y
GPT-NEOX -65 億 64 ml.p4d.24xlarge 4096 512 2 64 2 Y

當您想要在使用較長序列長度的文字資料時,將大型語言模型 (LLM) 納入大型叢集時,分割資料平行處理原則和 tensor 平行處理原則的結合使用非常有用,這會導致使用較小的批次大小,並因此處理GPU記憶體使用量以LLMs針對較長的文字序列進行訓練。如需進一步了解,請參閱 搭配張量平行處理的碎片資料平行處理

如需案例研究、基準測試和更多組態範例,請參閱部落格文章 Amazon SageMaker 模型 parallel 程式庫中的新效能改進

與集體的分片資料平行處理 SMDDP

數 SageMaker 據並行性庫提供了針對基礎設施優化的集體通信原語(SMDDP集體)。 AWS 它通過使用 E lastic Fabric Adapter (EFA) 採用 all-to-all-type 通信模式來實現優化,從而產生高吞吐量和較低延遲敏感的集體,將通信相關的處理卸載到,並釋放計算週期。CPU GPU在大型叢集上,SMDDPCollectives 可以提供分散式訓練效能的提升最多 40%。NCCL如需案例研究和基準測試結果,請參閱部落格 Amazon SageMaker 模型平行程式庫中的新效能改進

注意

模SMDDP型平行程式庫 v1.13.0 及更新版本以及資料平行程 SageMaker 式庫 v1.6.0 及更新版本中提供具有集合性的分割資料平行處理原則 SageMaker 。另請參閱Supported configurations以將分片資料平行性與SMDDP集合使用。

在分片數據並行性中,這是大規模分佈式培訓中常用的技術,AllGather集體用於重組分片層參數,用於前進和向後通過計算,parallel 計算。GPU對於大型模型而言,有效率地執行AllGather作業對於避免GPU瓶頸問題並降低訓練速度至關重要。當分片資料平行性啟動時,SMDDPCollectives 會落入這些關鍵效能的AllGather集體,進而改善訓練輸送量。

與SMDDP集體一起訓練

當您的訓練工作已啟動分片資料平行度並符合時Supported configurations,會自動啟動 SMDDP Collectives。在內部,SMDDP集體會優化AllGather集體,使其在 AWS 基礎設施上具有高性能,並回落到NCCL所有其他集體。此外,在不受支持的配置下,所有集合AllGather,包括自動使用後NCCL端。

由於 SageMaker 模型平行性庫版本 1.13.0,"ddp_dist_backend"參數被添加到選項中。modelparallel此組態參數的預設值為"auto",它會盡可能使用SMDDP集合項目,並回復為NCCL其他值。若要強制永遠使用資源庫NCCL,請指"nccl""ddp_dist_backend"組態參數。

下列程式碼範例會示範如何使用分片資料平行處理原則與參數來設定 PyTorch 估算器,此"ddp_dist_backend"參數預設會設定為"auto",因此可選擇新增。

import sagemaker from sagemaker.pytorch import PyTorch smp_options = { "enabled":True, "parameters": { "partitions": 1, "ddp": True, "sharded_data_parallel_degree": 64 "bf16": True, "ddp_dist_backend": "auto" # Specify "nccl" to force to use NCCL. } } mpi_options = { "enabled" : True, # Required "processes_per_host" : 8 # Required } smd_mp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script source_dir="location_to_your_script", role=sagemaker.get_execution_role(), instance_count=8, instance_type='ml.p4d.24xlarge', framework_version='1.13.1', py_version='py3', distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="sharded-data-parallel-demo", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')

支援的組態

當符合下列所有組態需求時,會在訓練工AllGather作中啟用 SMDDP Collectives 的作業。

  • 碎片資料平行處理程度大於 1

  • Instance_count 大於 1

  • Instance_type 等於 ml.p4d.24xlarge

  • SageMaker 適用於 PyTorch 1.12.1 版或更高版本的訓練容器

  • SageMaker 資料平行程式庫 v1.6.0 或更新版本

  • SageMaker 模型平行程度程式庫 v1.13.0 或更新版本

效能與記憶體調整

SMDDP集體利用額外的GPU內存。根據不同的模型訓練使用案例,有兩個環境變數可設定GPU記憶體使用量。

  • SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES— 在SMDDPAllGather作業期間,會將AllGather輸入緩衝區複製到暫存緩衝區中,以進行節點間通訊。SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES 變數控制此暫時緩衝的大小 (位元組)。如果暫存緩衝區的大小小於AllGather輸入緩衝區大小,則AllGather集體會退回使用NCCL。

    • 預設值:16 * 1024 * 1024 (16 MB)

    • 可接受值:8192 的任何倍數

  • SMDDP_AG_SORT_BUFFER_SIZE_BYTESSMDDP_AG_SORT_BUFFER_SIZE_BYTES 變數用以調整暫時緩衝大小 (位元組),以便保存從節點間通訊收集的資料。如果這個臨時緩衝區的大小小於1/8 * sharded_data_parallel_degree * AllGather input sizeAllGather集體回落使用NCCL。

    • 預設值:128 * 1024 * 1024 (128 MB)

    • 可接受值:8192 的任何倍數

緩衝大小變數的調整指引

環境變數的預設值應適用於多數使用案例。我們建議只有在訓練進入 out-of-memory (OOM) 錯誤時才調整這些變數。

下列清單討論了一些調整秘訣,以減少 SMDDP Collectives 的GPU記憶體佔用量,同時保留它們的效能提升。

  • 調校 SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES

    • 對於較小模型,AllGather 輸入緩衝大小較小。因此,對於具較少參數的模型,SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES 的所需大小可更小。

    • AllGather輸入緩衝區大小隨著sharded_data_parallel_degree增加而減少,因為模型被分片跨越多GPUs。因此,對於具較大 sharded_data_parallel_degree 值的訓練任務,SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES 的所需大小可更小。

  • 調校 SMDDP_AG_SORT_BUFFER_SIZE_BYTES

    • 對於參數較少的模型,從節點間通訊收集的資料量會較少。因此,對於具較少參數數量的此類模型,SMDDP_AG_SORT_BUFFER_SIZE_BYTES 的所需大小可更小。

一些集體可能會回落使用NCCL; 因此,您可能無法從優化的SMDDP集體中獲得性能增益。如果有其他GPU記憶體可供使用,您可以考慮增加的值,SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTESSMDDP_AG_SORT_BUFFER_SIZE_BYTES從效能提升中獲益。

下列程式碼示範如何透過將環境變數附加至 PyTorch 估算器的分佈參數mpi_options中,以設定環境變數。

import sagemaker from sagemaker.pytorch import PyTorch smp_options = { .... # All modelparallel configuration options go here } mpi_options = { "enabled" : True, # Required "processes_per_host" : 8 # Required } # Use the following two lines to tune values of the environment variables for buffer mpioptions += " -x SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES=8192" mpioptions += " -x SMDDP_AG_SORT_BUFFER_SIZE_BYTES=8192" smd_mp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script source_dir="location_to_your_script", role=sagemaker.get_execution_role(), instance_count=8, instance_type='ml.p4d.24xlarge', framework_version='1.13.1', py_version='py3', distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="sharded-data-parallel-demo-with-tuning", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')

搭配碎片資料平行處理的混合精確度訓練

為了進一步節省具有半精度浮點數和分片資料平行性的GPU記憶體,您可以在分散式訓練組態中新增一個額外的參數來啟動 16 位元浮點格式 (FP16BF16) 或 Brain 浮點格式 ()。

注意

SageMaker 模型平行程式庫 v1.11.0 及更新版本提供具有分割資料平行處理原則的混合精確度訓練。

適用於分片資料平行度的FP16訓練

若要使用分割資料平行處理原則執行FP16訓練,"fp16": True"請新增至smp_options組態字典。在訓練指令碼,您可以透過 smp.DistributedOptimizer 模組選擇靜態或動態損失縮放選項。如需詳細資訊,請參閱FP16使用模型平行度進行訓練

smp_options = { "enabled": True, "parameters": { "ddp": True, "sharded_data_parallel_degree": 2, "fp16": True } }

適用於分片資料平行度的BF16訓練

的分片數據並行性功能 SageMaker 支持數BF16據類型的培訓。數BF16據類型使用 8 位來表示浮點數的指數,而數FP16據類型使用 5 位。保留指數的 8 位元可讓 32 位元單精確度浮點 (FP32) 數字的指數保持相同。這使得FP32和之間的轉換BF16更簡單,並且明顯不易導致在FP16訓練中經常出現的溢出和下溢問題,尤其是在訓練大型模型時。雖然這兩種資料類型總共使用 16 位元,但BF16格式中指數的這種增加表示範圍會以降低精確度為代價。對於訓練大型模型,這種降低的精確度通常被認為是為取得範圍與訓練穩定性的可接受折衷。

注意

目前,BF16訓練只有在分割資料平行度啟動時才有效。

若要使用分割資料平行處理原則執行BF16訓練,"bf16": True請新增至smp_options組態字典。

smp_options = { "enabled": True, "parameters": { "ddp": True, "sharded_data_parallel_degree": 2, "bf16": True } }

搭配張量平行處理的碎片資料平行處理

如果您使用碎片資料平行處理,同時還需要減少全域批次大小,請考慮搭配碎片資料平行處理使用張量平行處理。在非常大的計算叢集 (通常為 128 個節點或以上) 上訓練具有分片資料平行處理原則的大型模型時,即使每個小批次大小也會GPU產生非常大的全域批次大小。這可能導致收斂問題或低運算效能問題。當單個批次已經很大且無法進一步減少時,僅使用分片資料並行性,就無法減少每GPU個批次的大小。在這種情況,結合使用碎片資料平行處理與張量平行處理有助於減少全域批次大小。

選擇最佳碎片資料平行與張量平行程度取決於模型規模、執行個體類型,以及對於模型收斂合理的全域批次大小。我們建議您從低張量 parallel 程度開始,以將全域批次大小納入運算叢集,以解決CUDA out-of-memory 錯誤並達到最佳效能。請參閱下列兩個範例案例,瞭解張量平行處理原則和分割資料平行處理原則的組合如何協助您透過分組GPUs模型平行處理原則來調整全域批次大小,進而產生較少的模型複本數目和較小的全域批次大小。

注意

此功能可從 SageMaker 模型平行程式庫 v1.15 取得,並支援 v1.13.1。 PyTorch

注意

此功能可透過程式庫的張量平行處理功能用於支援模型。若要尋找支援模型清單,請參閱對 Hugging Face 轉換器模型支援。另請注意,在修改訓練指令碼時,您需要傳遞 tensor_parallelism=Truesmp.model_creation 引數。若要深入了解,請參閱範SageMaker 例 GitHub 儲存庫train_gpt_simple.py中的訓練指令碼。

範例 1

假設我們想要GPUs在 1536 個叢集上訓練模型 GPUs (192 個節點各有 8 個節點),將分片資料平行處理原則的程度設定為 32 (sharded_data_parallel_degree=32),並將每個批次的批次大小設定為 1,其中每GPU個批次的序列長度為 4096 個記號。在這種情況,有 1536 個模型複本,全域批次大小變成 1536 個,每個全域批次包含約 600 萬個權杖。

(1536 GPUs) * (1 batch per GPU) = (1536 global batches) (1536 batches) * (4096 tokens per batch) = (6,291,456 tokens)

新增張量平行處理至其中可降低全域批次大小。一個配置示例可以是將張量 parallel 度設置為 8,並將每個批次大小設置GPU為 4。這形成 192 張量 parallel 組或 192 個模型副本,其中每個模型複本分佈在 8 個。GPUs批次大小 4 是每個反覆項目與每個張量平行群組的訓練資料量;也就是說,每個模型複本每次反覆會取用 4 個批次。在這種情況,全域批次大小變為 768,而每個全域批次包含約 300 萬個權杖。因此,相較於先前案例僅採用碎片資料平行處理,全域批次大小減少一半。

(1536 GPUs) / (8 tensor parallel degree) = (192 tensor parallelism groups) (192 tensor parallelism groups) * (4 batches per tensor parallelism group) = (768 global batches) (768 batches) * (4096 tokens per batch) = (3,145,728 tokens)

範例 2

當同時啟用碎片資料平行處理與張量平行處理時,程式庫會先套用張量平行處理並跨此維度來碎片化模型。對於每個張量平行等級,會按照每個 sharded_data_parallel_degree 來套用資料平行處理。

例如,假設我們要設置 32 GPUs 張量 parallel 度為 4(形成 4 組GPUs),分片數據 parallel 度為 4,最終複製度為 2。指定會根據張量 parallel 度建立八個GPU群組,如下所示:(0,1,2,3)(4,5,6,7)、、(8,9,10,11)(12,13,14,15)(16,17,18,19)、、(20,21,22,23)(24,25,26,27)(28,29,30,31)。也就是說,四個GPUs形成一張量 parallel 組。在這種情況下,張量 parallel 組的第 0 級GPUs的減少的數據 parallel 組將是。(0,4,8,12,16,20,24,28)縮減資料平行群組會基於碎片資料平行程度 4 進行碎片化,進而產生兩個資料平行處理的複寫群組。GPUs(0,4,8,12)形成一個分片組,該組共同保存第 0 張量並行排名的所有參數的完整副本,並GPUs(16,20,24,28)形成另一個此類組。其他張量平行等級也有類似的碎片與複寫群組。

圖 1:張量平行程度群組。

圖 1:張量 parallel 處理原則群組 (節點、分片資料 parallel 度、張量平行度) = (4, 4, 4),其中每個矩形代表一個從 0 到 31 GPU 的索引。GPUs表單張量平行性從到TPG0分組。TPG 7複製群組為 ({TPG0, TPG4}, {, TPG5} TPG1, {,} 和 {TPG2TPG3, TPG 6 TPG7});每個複製群組組共用相同的顏色,但填滿方式不同。

圖 2:分片資料平行處理原則群組。

圖 2:分片資料 parallel 處理原則群組 (節點、分片資料 parallel 度、張量平行度) = (4、4、4),其中每個矩形代表一個從 0 到 31 GPU 的索引。GPUs表單分片資料平行處理原則會從群組到SDPG0。SDPG 7複製群組為 ({SDPG0, SDPG4}, {, SDPG5} SDPG1, {,} 和 {SDPG2SDPG3, SDPG 6 SDPG7});每個複製群組組共用相同的顏色,但填滿方式不同。

如何利用張量平行處理啟用碎片資料平行處理

若要使用具有張量平行處理原則的分割資料平行處理原則,您需要tensor_parallel_degree在建立估算器類別的物件distribution時,在設定中設定sharded_data_parallel_degree和。 SageMaker PyTorch

您還需要啟用 prescaled_batch。這意味著,每個張量 parallel 組都會共同GPU讀取所選批次大小的合併批次,而不是每次讀取自己的數據批次。實際上,它不會將數據集分成等於GPUs(或數據 parallel 大小smp.dp_size())的部分,而是將數據集分成等於除以的數量的部GPUs分tensor_parallel_degree(也稱為減小的數據 parallel 大小smp.rdp_size())。如需預先調整 Batch 的詳細資訊,請參閱 SageMaker Python SDK 文件中的預縮放批次。另請參閱示例 GitHub 存儲庫中 GPT -2 train_gpt_simple.py的示SageMaker 例培訓腳本。

下列程式碼片段顯示了根據中上述案例建立 PyTorch 估算器物件的範例。範例 2

mpi_options = "-verbose --mca orte_base_help_aggregate 0 " smp_parameters = { "ddp": True, "fp16": True, "prescaled_batch": True, "sharded_data_parallel_degree": 4, "tensor_parallel_degree": 4 } pytorch_estimator = PyTorch( entry_point="your_training_script.py", role=role, instance_type="ml.p4d.24xlarge", volume_size=200, instance_count=4, sagemaker_session=sagemaker_session, py_version="py3", framework_version="1.13.1", distribution={ "smdistributed": { "modelparallel": { "enabled": True, "parameters": smp_parameters, } }, "mpi": { "enabled": True, "processes_per_host": 8, "custom_mpi_options": mpi_options, }, }, source_dir="source_directory_of_your_code", output_path=s3_output_location )

使用碎片資料平行處理的提示與考量事項

使用 SageMaker 模型平行程式庫的分片資料平行處理原則時,請考慮下列事項。

  • 分片資料平行處理與訓練相FP16容。若要執行FP16訓練,請參閱FP16使用模型平行度進行訓練章節。

  • 碎片資料平行處理相容張量平行處理。以下是搭配張量平行處理使用碎片資料平行處理時,可能需要考慮的項目。

    • 當搭配張量平行處理使用碎片資料平行處理時,內嵌層也會自動發佈至張量平行群組。換句話說,distribute_embedding 參數會自動設定為 True。如需張量平行處理的更多相關資訊,請參閱張量平行處理

    • 請注意,具有張量並行性的分片資料平行處理原則目前會使用NCCL集合做為分散式訓練策略的後端。

    如需進一步了解,請參閱搭配張量平行處理的碎片資料平行處理區段。

  • 碎片資料平行處理目前不相容管道平行處理最佳化工具狀態碎片。若要啟用碎片資料平行處理,請關閉最佳化工具狀態碎片,並設定管道平行程度為 1。

  • 啟用檢查點啟用卸載功能相容碎片資料平行處理。

  • 若要搭配漸層累積使用碎片資料平行處理,請在使用 smdistributed.modelparallel.torch.DistributedModel 模組包裝模型時,設定 backward_passes_per_step 引數為累積步驟數。這可確保模型複寫群組 (碎片群組) 之間的漸層 AllReduce 作業發生在漸層累積的範圍。

  • 您可以使用程式庫的檢查點和來檢查APIs使用分片資料平行度訓練的模型。smp.save_checkpoint smp.resume_from_checkpoint如需詳細資訊,請參閱檢查點分散式 PyTorch 模型 (適用於模 SageMaker 型平行程式庫 v1.10.0 及更新版本)

  • delayed_parameter_initialization 設定參數的行為會在碎片資料平行處理下發生變更。當同時開啟這兩項功能時,參數會在建立模型時立即以碎片方式初始化,而不會延遲參數初始化,以便每個等級初始化並儲存各自的參數碎片。

  • 當啟用碎片資料平行處理時,在呼叫 optimizer.step() 時,程式庫會在內部執行漸層剪輯。您不需要使用實用程序APIs進行漸變剪切,例如torch.nn.utils.clip_grad_norm_()。若要調整漸層裁剪的臨界值,您可以在建構 SageMaker PyTorch 估算器時透過分佈參數組態的參數來設定它,如區段如何套用碎片資料平行處理至訓練任務所示。sdp_gradient_clipping