本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
模型并行性简介
模型并行性是一种分布式训练方法,在这种方法中,深度学习模型在实例内部或实例间对多个设备进行分区。本简介页面概述了模型并行性,描述了它如何帮助克服训练通常非常大的 DL 模型时出现的问题,以及 SageMaker 模型并行库提供的帮助管理模型并parallel 策略的示例以及内存消耗。
什么是模型并行性?
增加深度学习模型(图层和参数)的大小可以提高计算机视觉和自然语言处理等复杂任务的准确性。但是,单个 GPU 内存中可以容纳的最大模型大小是有限制的。在训练 DL 模型时,GPU 内存限制可能在以下方面成为瓶颈:
-
它们限制了您可以训练的模型的大小,因为模型的内存占用量与参数数量成比例地缩放。
-
它们在训练期间限制每个 GPU 的批处理大小,从而降低 GPU 利用率和训练效率。
为了克服与在单个 GPU 上训练模型相关的限制, SageMaker 提供了模型parallel 库以帮助在多个计算节点上高效地分发和训练 DL 模型。此外,借助该库,您可以使用支持 EFA 的设备实现最优化的分布式训练,这些设备通过低延迟、高吞吐量和操作系统旁路增强节点间通信的性能。
在使用模型并行度之前估算内存需求
在使用 SageMaker 模型parallel 库之前,请考虑以下几点,以了解训练大型 DL 模型的内存需求。
对于使用 AMP (FP16) 和 Adam 优化器的训练作业,每个参数所需的 GPU 内存约为 20 字节,我们可以将其细分如下:
-
一个 FP16 参数 ~ 2 字节
-
FP16 梯度大约 2 字节
-
基于 Adam 优化器的 FP32 优化器状态约 8 字节
-
大约 4 字节参数的 FP32 副本(
optimizer apply
(OA) 操作需要) -
一个 FP32 渐变副本 ~ 4 字节(OA 操作需要)
即使对于具有100亿个参数的相对较小的DL模型,它也可能至少需要200GB的内存,这比单个GPU上可用的典型GPU内存(例如,具有40GB/80GB内存的NVIDIA A100和具有16/32 GB的V100)大得多。请注意,除了模型和优化器状态的内存要求外,还有其他内存消耗者,例如正向传递中生成的激活次数。所需的内存可能远大于 200GB。
对于分布式训练,我们建议您使用具有 NVIDIA A100 或 V100 Tensor Core GPU 的 Amazon EC2 P3 和 P4 实例。有关 CPU 内核、RAM、附加存储量和网络带宽等规格的更多详细信息,请参阅 Amazon EC2 实例类型
即使使用加速计算实例,很明显,具有大约 100 亿个参数的模型(例如 Megatron-LM 和 T5),甚至具有数千亿个参数的更大模型(例如 GPT-3)也无法拟合每个 GPU 设备中的模型副本。
该库如何采用模型并行和内存节省技术
该库包含两种类型的模型并行特性:流水线并行性和张量并行性,以及其他节省内存的功能,例如优化器状态分片、激活检查点和激活卸载。所有这些技术都可以组合起来,高效地训练大型模型,例如 GPT-2,它由数千亿个参数组成。
管道并行性
流水线并行度将一组层或操作划分到一组设备上,使每个操作保持不变。为模型分区数 (pipeline_parallel_degree
) 指定值时,GPU 总数 (processes_per_host
) 必须可除以模型分区的数量。要正确,必须为pipeline_parallel_degree
和processes_per_host
参数指定的值正确。简单的数学如下:
(pipeline_parallel_degree) x (data_parallel_degree) = processes_per_host
根据您提供的两个输入参数,该库负责计算模型副本(也称为data_parallel_degree
)的数量。
例如,如果您设置"pipeline_parallel_degree": 2
并"processes_per_host": 8
使用具有八个 GPU 工作线程的 ML 实例,例如,则库会自动设置跨 GPU 的分布式模型和四向数据并行度。ml.p3.16xlarge
下图说明了模型如何分布在八个 GPU 上,实现四向数据并行和双向流水线并行。每个模型副本都分为两个 GPU,我们将其定义为PP_GROUP
管道并行组并将其标记为。模型的每个分区都分配给四个 GPU,其中四个分区副本位于数据parallel 组中并标记为DP_GROUP
。如果没有张量并行性,管道parallel 组本质上就是模型parallel 组。

要深入探讨管道平行主义,请参阅 SageMaker 模型并行库的核心功能。
要开始使用流水线并行运行模型,请参阅使用模型并行库运行 SageMaker 分布式训练Jo b。 SageMaker
张量并行度(可用于 PyTorch)
Tensor 并行度可拆分单个层nn.Modules
,或者跨设备parallel 运行。下图显示了该库如何将模型分割为四层以实现双向张量并行 ("tensor_parallel_degree": 2
) 的最简单示例。每个模型副本的层被一分为二并分布到两个 GPU 中。在此示例中,模型parallel 配置还包括"pipeline_parallel_degree": 1
和"ddp": True
(在后台使用 PyTorch DistributedDataParallel 包),因此数据并行度变为八。该库管理张量分布式模型副本之间的通信。

此功能的用处在于,您可以选择特定的层或层的子集来应用张量并行性。要深入了解张量并行性和其他节省内存的功能 PyTorch,以及如何设置流水线和张量并行度的组合,请参阅 SageMaker模型并行库的扩展功能 PyTorch。
优化器状态分片(可用于 PyTorch)
要了解该库如何执行优化器状态分片,请考虑一个包含四层的简单示例模型。优化状态分片的关键思想是,你不需要在所有 GPU 中复制优化器状态。取而代之的是,优化器状态的单个副本在数据parallel 等级之间进行分片,设备之间没有冗余。例如,GPU 0 保存第一层的优化器状态,下一个 GPU 1 保存第 2 层的优化器状态,依此类推。以下动画图显示了使用优化器状态分片技术的向后传播。在向后传播结束时,optimizer apply
(OA) 操作需要计算和网络时间来更新优化器状态,all-gather
(AG) 操作需要计算和网络时间来更新下一次迭代的模型参数。最重要的是,该reduce
操作可以与 GPU 0 上的计算重叠,从而提高内存效率和更快的向后传播。在当前的实施中,AG 和 OA 操作与之不重叠compute
。它可能导致在 AG 操作期间延长计算时间,因此可能需要权衡取舍。

有关如何使用该功能的更多信息,请参阅优化器状态分片。
激活卸载和检查点(可用于 PyTorch)
为了节省 GPU 内存,该库支持激活检查点,以避免在正向传递期间将内部激活存储在用户指定模块的 GPU 内存中。库会在向后传递期间重新计算这些激活次数。此外,激活卸载功能将存储的激活转移到 CPU 内存,并在向后传递期间回迁到 GPU,以进一步减少激活内存占用。有关如何使用这些功能的更多信息,请参阅激活检查点和激活卸载。
为您的模型选择正确的技术
有关选择正确技术和配置的更多信息,请参阅SageMaker 分布式模型并行最佳实践和配置提示和陷阱。