本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
SageMaker 分布式模型并行性最佳实践
使用 SageMaker 模型parallel 库运行分布式训练作业时,请使用以下准则。
为给定模型设置正确的配置
在扩展模型时,我们建议您按顺序查看以下列表。每个列表项都讨论了使用库技术的优势以及可能出现的利弊。
提示
如果使用库功能的子集可以很好地拟合模型,则添加更多的模型并行度或节省内存的功能通常不会提高性能。
使用大型 GPU 实例类型
-
在模型并行性领域,最好使用具有大型 GPU 内存的强大实例来处理模型并行操作产生的开销,例如在多个 GPU 上对模型进行分区。我们建议使用
ml.p4d
或ml.p3dn
实例来训练大型 DL 模型。这些实例还配备了 Elastic Fabric Adapter (EFA),可提供更高的网络带宽,并支持通过模型并行进行大规模训练。
分区优化器状态
-
分片优化器状态的影响取决于数据parallel 排名的数量。通常,更高的数据并行度(与计算节点的大小成正比)可以提高内存使用效率。
当您想要缩小集群规模时,请务必检查优化器状态分片配置。例如,具有优化器状态分片的大型 DL 模型适用于具有 16 个 GPU 的节点,不适合具有 8 个 GPU 的节点,因为根本没有足够的 GPU 来对优化器状态进行分片。
有关更多信息,请参阅优化器状态分片:
激活检查点
-
通过对一组模块使用激活检查点可以提高内存效率。对模块进行分组的次数越多,内存使用效率就越高。当检查各层的顺序模块时,该
smp.set_activation_checkpointing
函数的strategy
参数将各层组合在一起以进行检查点。例如,将两层或更多层组合在一起进行检查点比一次检查一层更节省内存,这会牺牲额外的计算时间来减少内存使用量。有关更多信息,请参阅激活检查点:
张量并行性
-
张量并行度应为二的乘方(2、4、8、...、2 n),其中最大度必须等于每个节点的 GPU 数量。例如,如果您使用具有 8 个 GPU 的节点,则张量并行度的可能数字为 2、4 和 8。对于张量并行度,我们不建议使用任意数字(例如 3、5、6 和 7)。当您使用多个节点时,错误配置张量并行度可能会导致在节点间运行张量并行性;这会增加跨节点的激活通信所产生的大量开销,并且可能导致计算成本高昂。
有关更多信息,请参阅张量并行性:
跨节点的流水线并行性
-
您可以在单个节点内或跨多个节点运行流水线并行处理。当您将流水线并行性与张量并行性结合使用时,我们建议在多个节点上运行流水线并行性,并将张量并行性保持在单个节点内。
-
管道并行性带有以下三个旋钮:
microbatches
active_microbatches
、和prescaled_batch
。-
当您将张量并行性与流水线并行性结合使用时,我们建议激活,
prescaled_batch
这样可以增加每个模型parallel 组的批量大小以实现有效的流水线传输。prescaled_batch
激活后,训练脚本中设置的批tp_size
次大小将变为为未激活的每个等级设置的批次大小乘以prescaled_batch
。 -
增加数量
microbatches
有助于实现高效的流水线传输和更好的性能。请注意,有效微批量大小等于批次大小除以微批次数。如果您在保持批次大小恒定的同时增加微批次数,则每个微批处理的样品会减少。 -
的数量
active_microbatches
是流水线传输期间同时处理的微批次的最大数量。对于正在处理的每个活跃微批次,其激活次数和梯度会占用 GPU 内存。因此,增加active_microbatches
会占用更多的 GPU 内存。
-
-
如果 GPU 和 GPU 内存均未得到充分利用,则增加内存
active_microbatches
以改善流水线传输期间的并行化。 -
有关如何将张量并行与结合使用的更多信息,请参阅使用张量并行性使用的更多信息,请参阅使用张量并行性使用的更多信息,请参阅张量并行性与流水线并行性相结合管道并行
-
要查找上述参数的描述,请参阅 SageMaker Python SDK 文档
smdistributed
中的参数。
将激活任务转移到 CPU
-
确保将其与激活检查点和流水线并行性结合使用。为确保卸载和预加载在后台进行,请为微批次参数指定一个大于 1 的值。
-
卸载激活次数时,你可以增加微批次的总数,有时甚至
active_microbatches
与之匹配。这取决于检查哪些模块以及如何对模型进行分区。有关更多信息,请参阅激活卸载:
参考配置
SageMaker 模型并行度训练团队根据 GPT-2 模型、序列长度为 512 和词汇量为 50,000 的实验,提供以下参考点。
模型参数的数量 | 实例类型 | 管道并行性 | 张量并行性 | 优化器状态分片 | 激活检查点 | 预缩批次使用的批次使用 | Batch 大小 |
---|---|---|---|---|---|---|---|
10 | 16ml.p4d.24xlarge |
1 | 4 | True | 每个变 | True | batch_size=40 |
30 日 | 16ml.p4d.24xlarge |
1 | 8 | True | 每个变 | True | batch_size=32 |
60 | 32ml.p4d.24xlarge |
2 | 8 | True | 每个变 | True | batch_size=56 , microbatches=4 ,
active_microbatches=2 |
您可以从前面的配置中推断出来估算模型配置的 GPU 内存使用情况。例如,如果您增加了 100 亿参数模型的序列长度或将模型的大小增加到 200 亿,则可能需要先降低批次大小。如果模型仍然不适合,请尝试增加张量并行度。
修改您的训练脚本
-
在训练脚本中使用 SageMaker 模型parallel 库的功能之前,请先查看 SageMaker 分布式模型并行库配置提示和陷阱。
-
要更快地启动训练作业,请使用SageMaker 本地模式
。这可以帮助您在 SageMaker 笔记本实例上在本地快速运行训练作业。根据运行 SageMaker 笔记本实例的 ML 实例的规模,您可能需要通过更改模型配置(例如隐藏宽度、变压器层数和注意力头)来调整模型的大小。在使用大型集群训练完整模型之前,验证简化后的模型在笔记本实例上是否运行良好。
使用 SageMaker 控制台和亚马逊监控和记录训练Job CloudWatch
要监控 CPU 内存利用率、GPU 内存利用率和 GPU 利用率等系统级指标,请使用SageMaker 控制台
-
在左侧导航窗格中,选择培训。
-
选择 Training jobs (训练作业)。
-
在主窗格中,选择要查看更多详细信息的训练作业名称。
-
浏览主窗格并找到 “监控” 部分以查看自动可视化。
-
要查看训练作业日志,请在 “监控” 部分中选择 “查看日志”。您可以在中访问训练作业的分布式训练作业日志 CloudWatch。如果你启动了多节点分布式训练,你应该会看到多个带有 algo-n-1234567890 格式标签的日志流。algo-1 日志流跟踪来自主(第 0)节点的训练日志。
有关更多信息,请参阅使用亚马逊监控和分析培训工作 CloudWatch指标:
权限
要使用模型并行度或SageMaker 分布式训练示例笔记本运行训练
-
要使用 FsX for Lustre
,请添加 AmazonFSxFullAccess
。 -
要使用 Amazon S3 作为数据通道,请添加
AmazonS3FullAccess
。 -
要使用 Docker,构建自己的容器并将其推送到 Amazon ECR,请添加
AmazonEC2ContainerRegistryFullAccess
。 -
要获得使用整套 SageMaker 功能的完全访问权限,请添加
AmazonSageMakerFullAccess
。