

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

# 分片数据并行性
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism"></a>

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

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

将训练作业扩展到大型 GPU 集群时，您可以通过将模型的训练状态分为多个集群来减少模型的每 GPU 内存占用。 GPUs这会带来两个好处：您可以容纳在标准数据并行性下会耗尽内存的更大模型；或者您可以使用腾出的 GPU 内存来增加批次大小。

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

SageMaker 人工智能通过实现 MIC 实现分片数据并行性， AWS 博客文章巨型模型训练的[近线性扩展](https://www.amazon.science/blog/near-linear-scaling-of-gigantic-model-training-on-aws)对此进行了讨论。 AWS在此实施中，您可以将分片度设置为可配置参数，该参数必须小于数据并行度。在每次向前和向后传递过程中，MIC 都会在 GPUs 整个操作过程中临时重新组合模型参数。`AllGather`在每层向前或向后传递后，MiCS 会再次对参数进行分片以节省 GPU 内存。在向后传递过程中，MIC 会降低梯度，同时在整个操作中 GPUs 将其分片。`ReduceScatter`最后，MiCS 使用优化器状态的局部分片，将局部缩减梯度和分片梯度应用于其对应的局部参数分片。为了降低通信开销， SageMaker 模型并行度库在向前或向后通道中预取即将到来的层，并将网络通信与计算重叠。

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

实际上，分片数据并行性在通信开销和 GPU 内存效率之间进行了权衡。使用分片数据并行性会增加通信成本，但是在每个 GPU 上占用的内存量（不包括激活导致的内存使用量）会除以分片数据并行度，因此可以将更大的模型放入 GPU 集群。

**选择分片数据并行度**

当您为分片数据并行度选择一个值时，该值必须能够整除数据并行度。例如，对于 8 路数据并行性作业，请选择 2、4 或 8 作为分片数据并行度。在选择分片数据并行度时，我们建议您从一个较小的数字开始，然后逐渐增加它，直到模型与所需的批次大小均适合内存。

**选择批次大小**

设置分片数据并行性后，请确保您找到了可以在 GPU 集群上成功运行的最佳训练配置。要训练大型语言模型 (LLM)，请从批次大小 1 开始，然后逐渐增加批次大小，直到达到接收 out-of-memory (OOM) 错误的程度。如果您即使使用最小的批次也会遇到 OOM 错误，请应用更高的分片数据并行度，或者将分片数据并行性和张量并行性结合使用。

**Topics**
+ [如何将分片数据并行性应用于训练作业](#model-parallel-extended-features-pytorch-sharded-data-parallelism-how-to-use)
+ [参考配置](#model-parallel-extended-features-pytorch-sharded-data-parallelism-how-to-use-config-sample)
+ [使用 SMDDP 集合体的分片数据并行性](#model-parallel-extended-features-pytorch-sharded-data-parallelism-smddp-collectives)
+ [混合精度训练与分片数据并行性](#model-parallel-extended-features-pytorch-sharded-data-parallelism-16bits-training)
+ [使用张量并行性的分片数据并行性](#model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism)
+ [使用分片数据并行性的提示和注意事项](#model-parallel-extended-features-pytorch-sharded-data-parallelism-considerations)

## 如何将分片数据并行性应用于训练作业
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-how-to-use"></a>

要开始使用分片数据并行性，请对训练脚本进行必要的修改，然后使用参数设置 SageMaker PyTorch 估计器。 sharded-data-parallelism-specific另外还可以考虑以参考值和示例笔记本为起点。

### 调整您的 PyTorch 训练脚本
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-how-to-use-modify-script"></a>

按照[步骤 1：修改 PyTorch 训练脚本](model-parallel-customize-training-script-pt.md)中的说明使用和模块的`smdistributed.modelparallel.torch`包装器封装模型`torch.nn.parallel`和`torch.distributed`优化器对象。

**（可选）用于注册外部模型参数的额外修改**

如果您的模型使用 `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 估算器
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-how-to-use-set-estimator"></a>

在中配置 SageMaker PyTorch 估算器时[第 2 步：使用 SageMaker Python 软件开发工具包启动训练 Job](model-parallel-sm-sdk.md)，请添加分片数据并行度参数。

要开启分片数据并行性，请将`sharded_data_parallel_degree`参数添加到 Estimator 中。 SageMaker PyTorch此参数指定分片训练状态的数量。 GPUs `sharded_data_parallel_degree` 的值必须是介于 1 和数据并行度之间的整数，并且必须能够整除数据并行度。请注意，该库会自动检测数字 GPUs ，因此数据并行度。以下附加参数可用于配置分片数据并行度。
+ `"sdp_reduce_bucket_size"`*（int，默认值：5e8）*— 以默认 dtype 的元素数量指定 [PyTorch DDP 渐变桶](https://pytorch.org/docs/stable/notes/ddp.html#internal-design)的大小。
+ `"sdp_param_persistence_threshold"`*（整数，默认值：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/')
```

## 参考配置
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-how-to-use-config-sample"></a>

 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 要了解更多信息，请参阅[使用张量并行性的分片数据并行性](#model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism)。

有关案例研究、基准测试和更多配置示例，请参阅博客文章 [Amazon A SageMaker I 模型并行库中的新性能改进](https://aws.amazon.com/blogs/machine-learning/new-performance-improvements-in-amazon-sagemaker-model-parallel-library/)。

## 使用 SMDDP 集合体的分片数据并行性
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-smddp-collectives"></a>

 SageMaker 数据并行度库提供针对基础架构进行了优化的集体通信基元（SMDDP 集合）。 AWS 它通过使用 Ela [stic Fabric Adapter (EFA) Adapter (EFA)](https://aws.amazon.com/hpc/efa/) 来实现优化，从而产生高吞吐量且对延迟不敏感的集合，将与通信相关的处理分流给 CPU，并腾出 GPU 周期用于计算。 all-to-all-type在大型集群上，与 NCCL 相比，SMDDP 集合体可以将分布式训练性能提高多达40%。有关案例研究和基准测试结果，请参阅博客 [Amazon A SageMaker I 模型并行度库中的新性能改进](https://aws.amazon.com/blogs/machine-learning/new-performance-improvements-in-amazon-sagemaker-model-parallel-library/)。

**注意**  
 SageMaker 模型并行度库 v1.13.0 及更高版本以及数据并行库 v1.6.0 及更高版本中提供了与 SMDDP Collectives 的分片数据并行性。 SageMaker 有关在 SMDDP 集合体中使用分片数据并行性的信息，另请参阅[Supported configurations](#sharded-data-parallelism-smddp-collectives-supported-config)。

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

**使用 SMDDP 集合体进行训练**

当您的训练作业已激活分片数据并行性并满足[Supported configurations](#sharded-data-parallelism-smddp-collectives-supported-config)时，SMDDP 集合体会自动激活。在内部，SMDDP Collectives 会优化`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 集合体。
+ 分片数据并行度大于 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` – 在 SMDDP `AllGather` 操作期间，`AllGather` 输入缓冲区被复制到临时缓冲区中，用于节点间通信。`SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES` 变量控制此临时缓冲区的大小（以字节为单位）。如果临时缓冲区的大小小于 `AllGather` 输入缓冲区的大小，则 `AllGather` 集合体将回退到使用 NCCL。
  + 默认值：16 \$1 1024 \$1 1024 (16 MB)
  + 可接受值：8192 的任意倍数
+  `SMDDP_AG_SORT_BUFFER_SIZE_BYTES` – `SMDDP_AG_SORT_BUFFER_SIZE_BYTES` 变量用于调整临时缓冲区的大小（以字节为单位），以保存从节点间通信中收集的数据。如果临时缓冲区的大小小于 `1/8 * sharded_data_parallel_degree * AllGather input size`，则 `AllGather` 集合体将回退到使用 NCCL。
  + 默认值：128 \$1 1024 \$1 1024 (128 MB)
  + 可接受值：8192 的任意倍数

**缓冲区大小变量调整指南**

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

以下列表讨论了一些调整技巧，可以减少 SMDDP 集合体的 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_BYTES` 和 `SMDDP_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/')
```

## 混合精度训练与分片数据并行性
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-16bits-training"></a>

要通过半精度浮点数和分片数据并行度进一步节省 GPU 内存，您可以通过向分布式训练配置中添加一个附加参数来激活 16 位[浮点格式 (FP16BF16) 或 Brain 浮点格式](https://en.wikichip.org/wiki/brain_floating-point_format) ()。

**注意**  
 SageMaker 模型并行度库 v1.11.0 及更高版本中提供了具有分片数据并行性的混合精度训练。

**用于使用分片数据并行度进行 FP16 训练**

要使用分片数据并行度运行 FP16 训练，请`"fp16": True"`添加到配置字典中。`smp_options`在训练脚本中，您可以通过 `smp.DistributedOptimizer` 模块在静态和动态损失缩放选项之间进行选择。有关更多信息，请参阅 [FP16 使用模型并行度进行训练](model-parallel-extended-features-pytorch-fp16.md)。

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

**用于使用分片数据并行度进行 BF16 训练**

 SageMaker AI 的分片数据并行功能支持数据类型训练。 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
    }
}
```

## 使用张量并行性的分片数据并行性
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism"></a>

如果您使用分片数据并行性并且还需要减小全局批次大小，请考虑将[张量并行性](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-extended-features-pytorch-tensor-parallelism.html)与分片数据并行性结合使用。在非常大的计算集群（通常包含 128 个节点或更多）上训练采用分片数据并行性的大型模型时，即使每个 GPU 的批次大小很小，也会得到非常大的全局批次大小。这可能会导致收敛问题或计算性能低下问题。当单个批次已经很大并且无法进一步缩小时，有时候仅使用分片数据并行性无法减少每个 GPU 上的批次大小。在这种情况下，将分片数据并行性与张量并行性结合使用，有助于减少全局批次大小。

最佳分片数据并行度和张量并行度的选择，取决于模型的规模、实例类型以及模型能够合理收敛的全局批次大小。我们建议您从低张量 parallel 度开始，以使全局批量大小适合计算集群，从而解决 CUDA out-of-memory 错误并获得最佳性能。请参阅以下两个示例案例，了解张量并行性和分片数据并行性的组合如何帮助您通过对模型并行性进行分组 GPUs 来调整全局批次大小，从而减少模型副本的数量和更小的全局批次大小。

**注意**  
此功能可从 SageMaker 模型并行度库 v1.15 中获得，并支持 v1.13.1。 PyTorch 

**注意**  
此功能可通过库的张量并行度功能，面向支持的模型提供。要查找支持的模型列表，请参阅[对 Hugging Face 转换器模型的支持](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-extended-features-pytorch-hugging-face.html)。另请注意，在修改训练脚本时，您需要将 `tensor_parallelism=True` 传递给 `smp.model_creation` 参数。要了解更多信息，请参阅 *SageMaker AI 示例 GitHub 存储库[https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel/gpt2/train_gpt_simple.py#L793](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel/gpt2/train_gpt_simple.py#L793)*中的训练脚本。

### 示例 1
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism-ex1"></a>

假设我们要 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)
```

向其添加张量并行性，使其可以减少全局批次大小。在一种配置示例中，可以将张量并行度设置为 8，将每个 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
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism-ex2"></a>

当分片数据并行性和张量并行性均已激活时，库会首先应用张量并行性，并在该维度上对模型分片。对于每个张量并行秩，数据并行性根据 `sharded_data_parallel_degree` 来应用。

例如，假设我们要设置 32 GPUs ，张量 parallel 度为 4（形成一组 4 GPUs），分片数据并行度为 4，最终复制度为 2。该分配基于如下所示张量并行度创建八个 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：张量并行组。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/distributed/model-parallel/sdp_tp_group_tp.jpg)


图 1：（节点、分片数据并行度、张量并行度）=（4, 4, 4）的张量并行组，其中每个矩形代表一个指数从 0 到 31 的 GPU。从 TPG 到 T 0 PG 的 GPUs 形式张量并行度分组。7复制组为（\$1TPG0, TPG4\$1、\$1TPG1, TPG5\$1、\$1TPG2, TPG6\$1 和 \$1TPG3, TPG7\$1）；每个复制组对的颜色相同，但填充方式不同。

![\[图 2：分片数据并行组。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/distributed/model-parallel/sdp_tp_group_sdp.jpg)


图 2：（节点、分片数据并行度、张量并行度）=（4, 4, 4）的分片数据并行组，其中每个矩形代表一个指数从 0 到 31 的 GPU。该 GPUs 表单将从 SDPG 到 SDPG 的数据并行分组划分0。7复制组为（\$1SDPG 0, SDPG 4\$1、\$1SDPG 1, SDPG 5\$1、\$1SDPG 2, SDPG 6\$1 和 \$1SDPG 3, SDPG 7\$1）；每个复制组对的颜色相同，但填充方式不同。

### 如何激活使用张量并行性的分片数据并行性
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism-activate"></a>

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

您还需要激活 `prescaled_batch`。这意味着，不是每个 GPU 读取自己的批次数据，而是每个张量并行组集体读取具有所选批次大小的一个组合批次。实际上，它不是将数据集分成等于数量 GPUs （或数据并行大小`smp.dp_size()`）的部分，而是将其分成等于 GPUs 除以数的部分`tensor_parallel_degree`（也称为缩小后的数据并行大小，`smp.rdp_size()`）。有关预缩放批处理的更多详细信息，请参阅 *SageMaker Python* SDK 文档中的 Pres [caled Bat](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smd_model_parallel_general.html#prescaled-batch) ch。另请参阅 *SageMaker AI 示例 GitHub 存储库中的 GPT-2 训练脚本[https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel/gpt2/train_gpt_simple.py#L164](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel/gpt2/train_gpt_simple.py#L164)示例*。

以下代码片段显示了基于中上述场景创建 PyTorch 估算器对象的示例。[示例 2](#model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism-ex2)

```
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
)
```

## 使用分片数据并行性的提示和注意事项
<a name="model-parallel-extended-features-pytorch-sharded-data-parallelism-considerations"></a>

在使用 SageMaker 模型并行度库的分片数据并行度时，请考虑以下几点。
+ 分片数据并行性与训练兼容。 FP16 要进行 FP16训练，请参阅一[FP16 使用模型并行度进行训练](model-parallel-extended-features-pytorch-fp16.md)节。
+ 分片数据并行性与张量并行性兼容。将分片数据并行性与张量并行性结合使用时，您可能需要考虑以下几点。
  + 将分片数据并行性与张量并行性结合使用时，嵌入层也会自动分布在张量并行组中。换而言之，`distribute_embedding` 参数会自动设置为 `True`。有关张量并行性的更多信息，请参阅[张量并行性](model-parallel-extended-features-pytorch-tensor-parallelism.md)。
  + 请注意，具有张量并行性的分片数据并行性目前使用 NCCL 集合体作为分布式训练策略的后端。

  要了解更多信息，请参阅[使用张量并行性的分片数据并行性](#model-parallel-extended-features-pytorch-sharded-data-parallelism-with-tensor-parallelism)一节。
+ 分片数据并行性目前不兼容[管道并行性](model-parallel-intro.md#model-parallel-intro-pp)或[优化器状态分片](model-parallel-extended-features-pytorch-optimizer-state-sharding.md)。要激活分片数据并行性，请关闭优化器状态分片，并将管道并行度设置为 1。
+ [激活检查点](model-parallel-extended-features-pytorch-activation-checkpointing.md)和[激活分载](model-parallel-extended-features-pytorch-activation-offloading.md)功能与分片数据并行性兼容。
+ 要将分片数据并行性与梯度累积一起使用，请在使用 [https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_pytorch.html#smdistributed.modelparallel.torch.DistributedModel](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_pytorch.html#smdistributed.modelparallel.torch.DistributedModel) 模块包装模型时，将 `backward_passes_per_step` 参数设置为累积步骤数。这可确保跨模型复制组（分片组）的梯度 `AllReduce` 操作发生在梯度累积的边界上。
+ 您可以使用库的检查点检查使用分片数据并行度训练的模型，以及。 APIs `smp.save_checkpoint` `smp.resume_from_checkpoint`有关更多信息，请参阅 [对分布式 PyTorch 模型执行检查点操作（适用于 SageMaker 模型并行度库 v1.10.0 及更高版本）](distributed-model-parallel-checkpointing-and-finetuning.md#model-parallel-extended-features-pytorch-checkpoint)。
+ 在分片数据并行性下，[https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_pytorch.html#smdistributed.modelparallel.torch.delay_param_initialization](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_pytorch.html#smdistributed.modelparallel.torch.delay_param_initialization) 配置参数的行为会发生变化。同时启用这两个功能时，在分片方式下，将在模型创建时立即初始化参数，而不是延迟参数初始化，这样每个秩都会初始化并存储自己的参数分片。
+ 当分片数据并行性被激活时，该库会在 `optimizer.step()` 调用运行时在内部执行梯度裁剪。您无需使用实用工具 APIs 进行渐变剪裁，例如[https://pytorch.org/docs/stable/generated/torch.nn.utils.clip_grad_norm_.html](https://pytorch.org/docs/stable/generated/torch.nn.utils.clip_grad_norm_.html)。要调整梯度裁剪的阈值，可以在构造 SageMaker PyTorch 估计器时通过分布参数配置的参数对其进行设置，如部分所示。`sdp_gradient_clipping` [如何将分片数据并行性应用于训练作业](#model-parallel-extended-features-pytorch-sharded-data-parallelism-how-to-use)