分片数据并行性 - Amazon SageMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

分片数据并行性

分@@ 片数据并行性是一种节省内存的分布式训练技术,它在数据并行组中拆分模型的状态(模型参数、梯度和优化器状态)。GPUs

注意

分片数据并行度可在 SageMaker 模型并行度库 v1.11.0 及更高版本 PyTorch 中使用。

将训练作业扩展到大型GPU集群时,您可以通过将模型的训练状态分成多个GPUs集群来减少模型的每GPU内存占用。这会带来两个好处:你可以拟合更大的模型,否则标准数据并行性会耗尽内存,或者你可以使用腾GPU出的内存来增加批处理大小。

标准的数据并行度技术在数据并行组GPUs中复制训练状态,并根据操作执行梯度聚合。AllReduce分片数据并行性修改了标准的数据并行分布式训练过程,以考虑优化器状态的分片性质。用于对模型和优化器状态进行分片的一组秩称为分片组分片数据并行技术对模型的可训练参数以及分片组中相应的梯度和优化器状态进行分片。GPUs

SageMaker 通过实现 MIC 实现分片数据并行性,关于巨型模型训练的近线性缩放的 AWS 博客文章对此进行了讨论。 AWS在此实施中,您可以将分片度设置为可配置参数,该参数必须小于数据并行度。在每次向前和向后传递过程中,MIC 都会在GPUs整个操作过程中临时重新组合模型参数。AllGather在每层向前或向后传递后,MIC 会再次对参数进行分片以节省GPU内存。在向后传递过程中,MIC 会降低梯度,同时在整个操作中GPUs将其分片。ReduceScatter最后,MiCS 使用优化器状态的局部分片,将局部缩减梯度和分片梯度应用于其对应的局部参数分片。为了降低通信开销, SageMaker 模型并行度库在向前或向后通道中预取即将到来的层,并将网络通信与计算重叠。

模型的训练状态在分片组之间复制。这意味着,在将梯度应用于参数之前,除了在分片组内进行的 ReduceScatter 操作之外,还必须跨分片组进行 AllReduce 操作。

实际上,分片数据并行性在通信开销和内存效率之间进行了权衡。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.nn.paralleltorch.distributed优化器对象。

(可选)用于注册外部模型参数的额外修改

如果您的模型是使用未在模块类中定义的参数构建的,则应手动将它们注册到模块,SMP以便在此期间收集全部参数。torch.nn.Module要将参数注册到模块,请使用 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 步:使用 SageMaker Python 软件开发工具包启动训练 Job,请添加分片数据并行度参数。

要开启分片数据并行性,请将sharded_data_parallel_degree参数添加到 Estimator 中。 SageMaker PyTorch此参数指定分片训练状态的数量。GPUssharded_data_parallel_degree 的值必须是介于 1 和数据并行度之间的整数,并且必须能够整除数据并行度。请注意,该库会自动检测数字GPUs,因此数据并行度。以下附加参数可用于配置分片数据并行度。

  • "sdp_reduce_bucket_size"(int,默认值:5e8)— 以默认 dtype 的元素数量指定PyTorch DDP渐变桶的大小。

  • "sdp_param_persistence_threshold"(int,默认值:1e6)— 指定参数张量的大小,以每个元素可以持续存在的元素数量为单位。GPU分片数据并行性将每个参数张量分成GPUs一个数据并行组。如果参数张量中的元素数量小于此阈值,则不会拆分参数张量;这有助于减少通信开销,因为参数张量是跨数据并行复制的。GPUs

  • "sdp_max_live_parameters"(整数,默认值:1e9) – 指定在向前和向后传递期间,可以同时处于重新组合训练状态的最大参数数量。当活动参数的数量达到给定阈值时,提取参数的 AllGather 操作将暂停。请注意,增加此参数会增加内存占用。

  • "sdp_hierarchical_allgather"(布尔值,默认值: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 -20B 2 ml.p4d.24xlarge 2048 64 4 16
GPT-NEOX -20B 8 ml.p4d.24xlarge 2048 768 12 32

例如,如果您增加了 200 亿参数模型的序列长度或将模型的大小增加到 650 亿个参数,则您需要先尝试减小批次大小。如果在最小的批次大小(批次大小为 1)模型仍然不适合,请尝试提高模型的并行度。

具有张量并行性和集合体的分片数据并行性 NCCL

模型/参数数量 实例数 实例类型 序列长度 全局批次大小 小批次大小 分片数据并行度 张量并行度 激活分载
GPT-NEOX -65B 64 ml.p4d.24xlarge 2048 512 8 16 8 Y
GPT-NEOX -65B 64 ml.p4d.24xlarge 4096 512 2 64 2 Y

如果要将大型语言模型 (LLM) 拟合到大型集群中,同时使用序列长度较长的文本数据,从而使用较小的批处理大小,从而处理GPU内存使用量以针对较长的文本序列进行训练,则组合使用分片数据并行性和张量并行性非常有用。LLMs要了解更多信息,请参阅 使用张量并行性的分片数据并行性

有关案例研究、基准测试和更多配置示例,请参阅博客文章 Amazon SageMaker 模型并行库中的新性能改进

与集体的分片数据并行性 SMDDP

SageMaker 数据并行度库提供了针对基础架构进行了优化的集体通信原语(SMDDP集体)。 AWS 它通过使用 Elastic Fabric Adapter (EFA) 采用 all-to-all-type 通信模式来实现优化,从而产生高吞吐量且对延迟敏感度较低的集合,将与通信相关的处理卸载到上,并腾出计算周期。CPU GPU在大型集群上,与之相比,C SMDDP ollectives 可以将分布式训练性能提高多达 40%。NCCL有关案例研究和基准测试结果,请参阅博客 Amazon SageMaker 模型并行度库中的新性能改进

注意

SageMaker 模型并行度库 v1.13.0 及更高版本以及数据并行库 v1.6.0 及更高版本中提供了与 C SMDDP olletives 的分片数据并行性。 SageMaker 另请参阅Supported configurations在集合中使用分片数据并行性。SMDDP

在分片数据并行性(大规模分布式训练中常用的技术)中,AllGather集合体用于与计算并行重构向前和向后传递计算的分片层参数。GPU对于大型模型,高效执行AllGather操作对于避免GPU瓶颈问题和降低训练速度至关重要。激活分片数据并行性后,Collect SMDDP ives 会进入这些对性能至关重要的AllGather集合,从而提高训练吞吐量。

与SMDDP集体一起训练

当您的训练作业已激活分片数据并行性并满足时Supported configurations,SMDDP集合将自动激活。在内部,SMDDPCollectives 会优化集体,使其在 AWS 基础设施上保持高性能,而NCCL对于所有其他集体,则采用AllGather集体方式。此外,在不支持的配置下,所有集合(包括AllGather集合)都会自动使用后端。NCCL

从 SageMaker 模型并行度库版本 1.13.0 起,该"ddp_dist_backend"参数已添加到选项中。modelparallel此配置参数的默认值为"auto",它尽可能使用 C SMDDP ollectives,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/')

支持的配置

满足以下所有配置要求后,将在训练作业中激活使用SMDDP集体的操作。AllGather

  • 分片数据并行度大于 1

  • Instance_count 大于 1

  • Instance_type 等于 ml.p4d.24xlarge

  • SageMaker 适用于 PyTorch v1.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 size,则AllGather集合体将回退使用NCCL。

    • 默认值:128 * 1024 * 1024 (128 MB)

    • 可接受值:8192 的任意倍数

缓冲区大小变量调整指南

环境变量的默认值应该适用于大多数使用场景。我们建议仅在训练遇到 out-of-memory (OOM) 错误时才调整这些变量。

以下列表讨论了一些调整技巧,这些技巧可以减少 C SMDDP ollectives 的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 支持数据类型训练。BF16BF16数据类型使用 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=True 传递给 smp.model_creation 参数。要了解更多信息,请参阅SageMaker 示例 GitHub 存储库train_gpt_simple.py中的训练脚本。

示例 1

假设我们要GPUs在 1536 个集群GPUs(192 个节点,每个节点 8 个)上训练模型,将分片数据并行度设置为 32 (sharded_data_parallel_degree=32),将批量大小设置为 GPU 1,其中每个批次的序列长度为 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,将批次大小 per 设置GPU为 4。这形成了 192 个张量并行组或 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 来应用。

例如,假设我们要设置 32GPUs,张量 parallel 度为 4(形成一组 4GPUs),分片数据并行度为 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 群。在这种情况下,张量并行组第 0 个等级GPUs的简化数据并行组将是。(0,4,8,12,16,20,24,28)缩减数据并行组根据分片数据并行度 4 进行分片,从而得到两个复制组用于数据并行性。GPUs(0,4,8,12)形成一个分片组,该分片组共同保存第 0 张量 parallel 等级的所有参数的完整副本,GPUs(16,20,24,28)然后形成另一个这样的分片组。其他张量并行秩也有类似的分片和复制组。

图 1:张量并行度组。

图 1:(节点、分片数据并行度、张量并行度)=(4、4、4)的张量并行度组,其中每个矩形表示索引从 0 到 31 的 GPU a。GPUs形式张量并行度分组从到。TPG 0 TPG 7复制组是 ({TPG0、TPG4}、{TPG1、TPG5}、{TPG2、TPG6} 和 {TPG3, TPG7});每个复制组对的颜色相同,但填充方式不同。

图 2:分片数据并行度组。

图 2:(节点、分片数据并行度、张量并行度)= (4、4、4) 的分片数据并行度组,其中每个矩形表示索引从 0 到 31 的 GPU a。GPUs表单将分片数据并行度分组从到。SDPG 0 SDPG 7复制组是 ({SDPG0、SDPG4}、{SDPG1、SDPG5}、{SDPG2、SDPG6} 和 {SDPG3, SDPG7});每个复制组对的颜色相同,但填充方式不同。

如何激活使用张量并行性的分片数据并行性

要将分片数据并行性与张量并行性结合使用,您需要在创建估计器类的对象时tensor_parallel_degree在配置中distribution同时设置sharded_data_parallel_degree和。 SageMaker PyTorch

您还需要激活 prescaled_batch。这意味着,每个 tensor parallel 组不是各自GPU读取自己的批次数据,而是集体读取所选批次大小的组合批次。实际上,它不是将数据集分成等于数量GPUs(或数据并行大小smp.dp_size())的部分,而是将其分成等于GPUs除以数的部分tensor_parallel_degree(也称为缩小后的数据并行大小,smp.rdp_size())。有关预缩放批处理的更多详细信息,请参阅 Python 文档中的预缩批处理。SageMaker SDK另请参阅示例 GitHub 存储库中的 GPT -2 训练脚本train_gpt_simple.pySageMaker 示例

以下代码片段显示了基于中上述场景创建 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 如何将分片数据并行性应用于训练作业