

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

# 模型并行性概念
<a name="model-parallel-intro-v2"></a>

模型并行性是一种分布式训练方法，其中深度学习 (DL) 模型分为多个 GPUs 和实例。 SageMaker 模型并行库 v2 (SMP v2) 与原生 PyTorch APIs 库和功能兼容。这使您可以方便地调整 PyTorch 完全分片数据并行 (FSDP) 训练脚本以适应 SageMaker训练平台，并利用 SMP v2 提供的性能改进。本介绍页面提供了有关模型并行性的整体概述，并介绍了模型并行性如何帮助解决在训练通常非常大的深度学习 (DL) 模型时出现的问题。它还提供了 SageMaker模型并行库为帮助管理模型并行策略和内存消耗而提供的示例。

## 什么是模型并行性？
<a name="model-parallel-what-is-v2"></a>

对于计算机视觉和自然语言处理等复杂的任务，增加深度学习模型（层和参数）的大小可以提高准确性。但是，在单个 GPU 的内存中所能容纳的最大模型大小有限制。在训练 DL 模型时，GPU 内存限制可能会在以下方面成为瓶颈：
+ 它们限制了您可以训练的模型的大小，因为模型的内存占用量与参数数量成比例扩展。
+ 它们限制训练期间的每个 GPU 的批次大小，从而降低了 GPU 利用率和训练效率。

为了克服与在单个 GPU 上训练模型相关的限制， SageMaker AI 提供了模型并行库，以帮助在多个计算节点上高效地分发和训练 DL 模型。此外，借助该库，您可以使用支持 EFA 的设备实现优化的分布式训练，这些设备具备低延迟、高吞吐量和 OS 旁路等特性，可以增强节点间通信的性能。

## 在使用模型并行性之前估算内存需求
<a name="model-parallel-intro-estimate-memory-requirements-v2"></a>

在使用 SageMaker 模型并行库之前，请考虑以下内容，以了解训练大型 DL 模型的内存需求。

对于使用 `float16` (FP16) 或 `bfloat16` (BF16) 和 Adam 优化器等自动混合精度的训练作业，每个参数所需的 GPU 内存约为 20 字节，我们可以将其分解如下：
+  FP16 或 BF16 参数 \$1 2 字节
+  FP16 或 BF16 渐变 \$1 2 字节
+ 基于 Adam FP32 优化器的优化器状态 \$1 8 字节
+ 大约 4 字节的参数 FP32 副本（`optimizer apply`（OA）操作需要）
+ 大约 4 字节的渐变 FP32 副本（OA 操作需要）

即使对于具有 100 亿个参数这样的相对较小 DL 模型，它也会需要至少 200 GB 的内存，这比单个 GPU 上典型的可用 GPU 内存（例如，NVIDIA A100 具有 40 GB/80 GB 内存）大得多。除了模型和优化器状态的内存要求外，还有其他因素也会占用内存，例如在向前传递中生成的激活。所需的内存可能远远超过 200 GB。

对于分布式训练，我们建议您使用分别具有 NVIDIA A100 和 H100 Tensor Core 的 Amazon EC2 P4 和 P5 实例。 GPUs 有关 CPU 核心、RAM、附属存储卷和网络带宽等规格的详细信息，请参阅 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)页面的*加速计算*部分。有关 SMP v2 支持的实例类型，请参阅 [支持的实例类型](distributed-model-parallel-support-v2.md#distributed-model-parallel-supported-instance-types-v2)。

即使使用加速型计算实例，对于具有大约 100 亿个参数的模型（例如 Megatron-LM 和 T5），甚至具有数千亿个参数的更大模型（例如 GPT-3），也无法在每个 GPU 设备中容纳模型副本。

## 库如何使用模型并行性和内存节省技术
<a name="model-parallel-intro-features-v2"></a>

库中包含各种类型的模型并行功能和节省内存的功能，例如优化器状态分片、激活检查点和激活分载。所有这些技术可以结合使用，从而高效地训练由数千亿个参数组成的大型模型。

**Topics**
+ [分片数据并行性](#model-parallel-intro-sdp-v2)
+ [专家并行性](#model-parallel-intro-expert-parallelism-v2)
+ [张量并行性](#model-parallel-intro-tp-v2)
+ [激活检查点并卸载](#model-parallel-intro-activation-offloading-checkpointing-v2)
+ [为模型选择合适的技术](#model-parallel-intro-choosing-techniques-v2)

### 分片数据并行性
<a name="model-parallel-intro-sdp-v2"></a>

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

SMP v2 通过 FSDP 实现了分片数据并行性，并对其进行了扩展，以实现规模感知混合分片策略，详见博客文章 [AWS上巨型模型训练的近线性扩展](https://www.amazon.science/blog/near-linear-scaling-of-gigantic-model-training-on-aws)。

您可以将分片数据并行性作为独立策略应用到模型。此外，如果您使用的是配备NVIDIA A100 Tensor Core的最高性能的GPU实例 GPUs`ml.p4de.24xlarge`，`ml.p4d.24xlarge`并且可以利用[SageMaker 数据并行度](data-parallel.md) (SMDDP) 库提供的`AllGather`操作提高的训练速度。

要深入研究分片数据并行性并学习如何对其进行设置，或者将分片数据并行性与其他技术（例如张量并行和混合精度训练）结合使用，请参阅 [混合分片数据并行性](model-parallel-core-features-v2-sharded-data-parallelism.md)。

### 专家并行性
<a name="model-parallel-intro-expert-parallelism-v2"></a>

SMP v2 与 [NVIDIA 威震天](https://github.com/NVIDIA/Megatron-LM)集成，除了支持原生 FSDP 之外，还实现了*专家并行性*。 PyTorch APIs您可以保持 PyTorch FSDP 训练代码不变，并应用 SMP 专家并行性在 AI 中训练*混合专家* (MoE) 模型。 SageMaker 

MoE 模型是一种转换器模型，由多个*专家*组成，每个专家都由一个神经网络组成，通常是一个前馈网络 (FFN)。一个称为*路由器*的网关网络决定将哪些令牌发送给哪些专家。这些专家专门处理输入数据的特定方面，使模型的训练速度更快，计算成本更低，同时达到与其对应的密集模型相同的性能质量。*专家并行性*是一种并行性技术，用于在 GPU 设备上处理 MoE 模型的专家拆分。

要了解如何使用 SMP v2 训练 MoE 模型，请参阅 [专家并行性](model-parallel-core-features-v2-expert-parallelism.md)。

### 张量并行性
<a name="model-parallel-intro-tp-v2"></a>

*张量并行*可跨设备拆分各个层（即 `nn.Modules`），以并行运行。下图显示了一个最简单的示例，演示 SMP 库如何拆分具有四个层的模型，以实现两路张量并行 (`"tensor_parallel_degree": 2`)。在下图中，模型并行组、张量并行组和数据并行组的符号分别为 `MP_GROUP`、`TP_GROUP` 和 `DP_GROUP`。每个模型副本的层被一分为二，分布为两 GPUs层。库管理张量分布式模型副本之间的通信。

![\[演示 SMP 库如何拆分具有四个层的模型以实现两路张量并行 ("tensor_parallel_degree": 2) 的最简单的示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/distributed/model-parallel/smp-v2-tensor-parallel.png)


要深入了解张量并行性和其他节省内存的功能 PyTorch，以及如何设置核心功能的组合，请参阅。[张量并行性](model-parallel-core-features-v2-tensor-parallelism.md)

### 激活检查点并卸载
<a name="model-parallel-intro-activation-offloading-checkpointing-v2"></a>

为了节省 GPU 内存，库支持激活检查点，以避免在向前传递期间，将用户指定模块的内部激活存储在 GPU 内存中。库会在向后传递期间重新计算这些激活。此外，通过激活卸载，它还能将存储的激活卸载到 CPU 内存中，并在后向传递时将其取回 GPU，从而进一步减少激活内存占用。有关如何使用这些功能的更多信息，请参阅 [激活检查点](model-parallel-core-features-v2-pytorch-activation-checkpointing.md) 和 [激活分载](model-parallel-core-features-v2-pytorch-activation-offloading.md)。

### 为模型选择合适的技术
<a name="model-parallel-intro-choosing-techniques-v2"></a>

有关选择合适技术和配置的更多信息，请参阅 [SageMaker 分布式模型并行性最佳实践](model-parallel-best-practices-v2.md)。