作者:Apoorv Gupta Karan Dhiman Ruhan Prasad 和 Zhaoqi Zhu,2023年12月5日
重点摘要
大规模语言模型LLM的训练在过去一年中变得非常普遍,包含多个公开发布的模型,如 Llama2、Falcon 和 StarCoder。为提高训练速度,亚马逊 SageMaker 最近发布了一种优化的 AllGather 集体操作,这可以大幅度减轻 GPU 之间的通信瓶颈,进而加快训练速度。本文将介绍 SMDDP 如何运作、如何在 SageMaker 训练脚本中启用 SMDDP,以及您可以期待的性能提升。

传统的数据并行训练方法通过在多块 GPU 之间复制一个完整模型来处理数据集的不同数据片。后向传播过程中,各 GPU 工作节点之间会平均梯度,从而更新每个模型副本,尽管它们在不同的数据片上进行训练。尽管这一方法可以加快对庞大数据集的训练,但一些较大的模型如 Llama2 70B可能无法完全加载到 GPU 内存中,限制了传统数据并行的应用。
为了克服这一限制,分片数据并行解决方案如 DeepSpeed ZeRO 和 PyTorch FSDP 的需求日益增加。在分片数据并行中,模型参数、梯度及优化器状态被分割并在 GPU 之间分发,而不是在每个 GPU 上复制整个模型。这种方法允许 GPU 在更小的内存使用下进行并行计算。
AllGather 集体操作是分片数据并行中非常重要的功能。尽管 NCCL 通常用于此操作,但其底层实现并未针对亚马逊 EC2 实例的网络基础架构进行优化。SMDDP 是为 NVIDIA GPU 提供的集体通信库,作为 NCCL 的替代品,能更好地为分布式训练服务。
AWS 优化的 AllGather 采用了一些技术以实现更好的性能:
通过弹性计算适配器EFA移动数据:EFA 是一种低延迟和高吞吐量的网络解决方案,适合 AWS 的网络基础架构。GDRCopy 协调本地 NVLink 和 EFA 网络流量:GDRCopy 是一个库,能够提供 CPU 进程与 GPU CUDA 内核之间的低延迟通信。减少 GPU 流处理器的使用:AWS P4d/P4de 实例配备 NVIDIA A100 GPU,而 SMDDP 集体操作仅使用少量流处理器,从而将更多计算能力留给模型内核。SMDDP 集体操作通过 PyTorch 的 torchdistributed 模块与进程组集成。用户可以编写通用的分布式代码,并根据所用设备选取相应的后端。
下面是如何使用 SMDDP 的示例代码:
pythonimport smdistributeddataparalleltorchtorchsmddpdeepspeedinitdistributed(distbackend=smddp) # 替换 nccl
pythonimport smdistributeddataparalleltorchtorchsmddpdistinitprocessgroup(backend=smddp) # 替换 nccl
一元机场ink在没有模型训练的情况下,针对单独的 AllGather 性能进行基准测试,结果显示 SMDDP 的带宽利用率超过 NCCL。以下表格是两者在 32 个 p4d 实例上的对比结果:
配置性能模型/训练集群13B Llama264 p4d24xlarge 节点 (512 NVIDIA A100 GPUs)65B GPTNeoX64 p4d24xlarge 节点 (512 NVIDIA A100 GPUs)本文介绍了如何通过简单的两行代码更改,显著加快在亚马逊 SageMaker 上的分片数据并行训练。随着 LLM 的推广,大规模分布式训练的需求日益增长,但高昂的成本和通信瓶颈成为主要挑战。通过 SMDDP,能够在更大规模下更快地训练,同时节省计算资源。您可以在 亚马逊 SageMaker 示例的 GitHub 存储库 中找到更多 SMDDP 在分片数据并行训练中的示例。
Apoorv Gupta 是 AWS 的软件开发工程师,专注于为 AWS 基础设施和硬件构建最佳深度学习系统。他对分布式计算和 ML 加速器非常感兴趣,业余时间喜欢旅行和打游戏。
Karan Dhiman 是位于加拿大多伦多的 AWS 软件开发工程师,热衷于机器学习并致力于加速分布式计算工作负载的解决方案构建。
Ruhan Prasad 是 AWS 的软件开发工程师,致力于使分布式深度学习训练在 SageMaker 上更快、更便宜、更易用。他的业余爱好包括打网球、旅行和烹饪。
Zhaoqi Zhu 是 AWS 的高级软件开发工程师,热衷于分布式系统和低级优化。他的爱好包括边喝(非减肥)汽水边观看足球赛。
标签: 亚马逊 SageMaker PyTorch