

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

# 分布式训练策略
<a name="distributed-training-strategies"></a>

分布式训练通常按两种方法来拆分：数据并行和模型并行。*数据并行*是分布式训练的最常见方法：您有很多数据，将其分成批次，然后将数据块发送到多个 CPU 或 GPU（节点）以供神经网络或 ML 算法处理，然后合并结果。每个节点上的神经网络都是一样的。*模型并行*方法用于不能整体放到一个节点的内存中的大型模型；该方法拆分模型，不同的部分放在不同的节点上。在这种情况下，您需要将数据批次发送到各个节点，以便在模型的所有部分上处理数据。

术语*网络*和*模型*经常可以互换使用：大型模型实际上是一个具有许多层和参数的大型网络。使用大型网络进行训练会生成一个大型模型，将模型以及所有预训练的参数及其权重加载回网络，会将大型模型加载到内存中。当您拆分模型以在节点之间分布模型时，您也会拆分底层网络。网络由层组成，为了拆分网络，您可以将层放置在不同的计算设备上。

在设备之间拆分层时，一个常见的内在缺陷是 GPU 的利用率严重不足。无论是向前还是向后传递，训练在本质上都是顺序的，在给定时间，只有一个 GPU 可以有效地进行计算，而其他 GPU 则等待发送激活信号。为了解决这个问题，现代模型并行库使用管道执行计划来提高设备利用率。但是，只有 Amazon SageMaker AI 的分布式模型并行库包含自动模型拆分。该库有两个核心功能：自动模型拆分和管道执行计划，通过制定自动化决策以实现高效设备利用，简化了实施模型并行的过程。

## 使用数据并行和模型并行进行训练
<a name="distributed-training-data-model-parallel"></a>

如果您在使用大型数据集进行训练，请首先使用数据并行方法。如果您在训练期间内存不足，则可能需要切换到模型并行方法，或尝试混合使用模型并行和数据并行。您还可以尝试以下方法，通过数据并行来提高性能：
+ 更改模型的超参数。
+ 减少批次大小。
+ 继续减少批次大小，直至能够放入。如果您将批量大小减少到 1，但内存仍然不足，那就应该尝试模型并行训练。

尝试梯度压缩（FP16、INT8）：
+ 在 NVIDIA TensorCore-equipped 硬件上，使用[混合精度训练](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html)可以提高速度并降低内存消耗。
+ SageMaker AI 的分布式数据并行度库支持开箱即用的自动混合精度 (AMP)。除了对训练脚本进行框架级别的修改之外，您无需执行额外操作即可启用 AMP。如果梯度在 FP16 中，则 A SageMaker I 数据并行库在 FP16 中运行其操作。`AllReduce`有关对您的训练脚本实施 AMP API 的更多信息，请参阅以下资源：
  + [框架- PyTorch](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#pytorch) 在 *NVIDIA 深度学习性能文档*中
  + [框架- TensorFlow](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow) 在 *NVIDIA 深度学习性能文档*中
  + *NVIDIA 开发人员文档*中的[适用于深度学习的自动混合精度](https://developer.nvidia.com/automatic-mixed-precision)
  + *博客中@@ [引入原生 PyTorch 自动混合精度，以便在 NVIDIA GPU 上更快地进行训练](https://pytorch.org/blog/accelerating-training-on-nvidia-gpus-with-pytorch-automatic-mixed-precision/) PyTorch *
  + TensorFlow *TensorFlow文档*中的@@ [混合精度 API](https://www.tensorflow.org/guide/mixed_precision)

尝试减小输入大小：
+ 如果您增加序列链接、需要减少批处理大小或增加 GPU 以分散批次，则减少 NLP 序列长度。
+ 降低图像分辨率。

检查是否使用了批次标准化，因为这可能会影响收敛性。在使用分布式训练时，您的批次在 GPU 之间拆分，而小得多的批次大小可能会带来更高的错误率，进而干扰模型的收敛。例如，如果您在批次大小为 64 的单个 GPU 上对网络进行原型设计，然后扩展到使用 4 个 p3dn.24xlarge，那么现在有 32 个 GPU，而每个 GPU 的批次大小从 64 降至 2。这可能会破坏您在单个节点上可以实现的收敛。

在以下情况下从模型并行训练开始：
+  您的模型不能放入单个设备中。
+ 由于模型大小，您在选择较大的批次大小方面面临限制，例如模型加权占用了大部分 GPU 内存，而且您被迫选择较小、较不理想的批次大小。  

要了解有关 SageMaker AI 分布式库的更多信息，请参阅以下内容：
+  [使用 SageMaker AI 分布式数据并行库运行分布式训练](data-parallel.md) 
+  [（已存档） SageMaker 模型并行度库 v1.x](model-parallel.md) 