

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

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

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

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

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

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

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

尝试渐变压缩 (FP16, INT8)：
+ 在 TensorCore配备 NVIDIA 的硬件上，使用[混合精度训练](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html)可以提高速度并减少内存消耗。
+ SageMaker AI 的分布式数据并行度库支持开箱即用的自动混合精度 (AMP)。除了对训练脚本进行框架级别的修改之外，您无需执行额外操作即可启用 AMP。如果有梯度 FP16，则 SageMaker AI 数据并行度库将在中运行其操作。`AllReduce` FP16有关在训练脚本中实现 AMP APIs 的更多信息，请参阅以下资源：
  + [框架- 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 博客*中@@ [引入原生 PyTorch 自动混合精度，以便 GPUs在 NVIDIA 上更快地进行训练](https://pytorch.org/blog/accelerating-training-on-nvidia-gpus-with-pytorch-automatic-mixed-precision/)
  + TensorFlow *TensorFlow文档 APIs*中的@@ [精度好坏参半](https://www.tensorflow.org/guide/mixed_precision)

尝试减小输入大小：
+ 如果您增加序列链接、需要向下调整批次大小或向上调整批次以分散批次，请减少 NLP 序列长度。 GPUs 
+ 降低图像分辨率。

检查是否使用了批次标准化，因为这可能会影响收敛性。当你使用分布式训练时，你的批次会被分开，批量小得多的结果可能是错误率更高，从而中断模型的收敛性。 GPUs 例如，如果您在单个 GPU 上创建网络原型，批量大小为 64，然后放大到使用四个 p3dn.24xlarge，那么您现在有 32 个， GPUs 并且每个 GPU 的批处理大小从 64 降至 2。这可能会破坏您在单个节点上可以实现的收敛。

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

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