ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning

发表时间: 2021-04 · arXiv:2104.07857

原文: https://arxiv.org/abs/2104.07857

Samyam Rajbhandari, Olatunji Ruwase, Jeff Rasley, Shaden Smith, Yuxiong He {samyamr, olruwase, jerasley, shsmit, yuxhe}@microsoft.com

速读

一句话结论 本文提出了异构深度学习训练系统 ZeRO-Infinity,通过将模型状态和激活全面卸载到 CPU 和 NVMe 内存,打破了单卡显存墙限制,在 512 个 GPU 上成功训练了 32 万亿参数的模型,并实现了单节点微调万亿参数模型且无需重构代码。

要解决什么问题 原有的大模型训练方案严重受限于 GPU 显存墙,导致模型规模无法继续实现千倍增长。具体而言,虽然结合了数据、模型和流水线的 3D 并行技术能扩展到万亿参数,但它要求开发者对模型代码进行大量重构,难以处理复杂依赖图的负载均衡,且最终模型大小依然受限于集群的总 GPU 显存。而现有的异构卸载技术(如 ZeRO-Offload)仅将梯度和优化器状态卸载到 CPU,参数仍需在所有 GPU 上复制并受限于单卡显存容量;同时,由于采用广播机制,受限于单条 PCIe 链路的微薄带宽,必须依赖极大的批次大小才能维持计算效率,这导致激活显存暴增甚至溢出。此外,当模型参数量达到千亿级别后,单个巨大算子前向或反向传播所需的模型状态工作内存会需要数 GB 的连续显存,极易因显存碎片化而导致内存溢出,成为阻碍模型扩展的硬性卡点。

怎么做的 核心思路是充分利用现代集群中容量巨大但速度较慢的异构存储(CPU 内存和 NVMe 固态硬盘),将所有模型状态(参数、梯度、优化器状态)和激活检查点卸载到这些廉价存储中,并通过极致的通信重叠与切分策略掩盖带宽劣势。为了绕开异构存储带宽不足的卡点,方法设计了五个关键部件。首先是带宽中心分区,传统卸载方法由单卡拥有参数并通过广播分发,只能激活单条 PCIe 链路;该方法将单个参数切分到所有数据并行进程中,需要时触发 allgather 操作。这样能并行激活所有 PCIe 链路,使异构内存到 GPU 的有效带宽随数据并行度线性增长,从而获得几乎无限的聚合带宽。其次是重叠中心设计,系统内置了动态预取器,实时追踪算子执行序列,将 NVMe 到 CPU、CPU 到 GPU 的数据传输与当前 GPU 上的计算完全重叠。训练效率的本质由峰值算力 $P_{peak}$、数据移动带宽 $B$ 和算术强度 $AI_{T}$ 决定: $$Efficiency = \frac{B \times AI_{T}}{P_{peak}}$$ 通过上述两项设计,系统大幅提升了有效带宽 $B$,在较小的批次大小下也能维持极高效率。第三是 Infinity Offload Engine,这是一个底层的 C++ 读写引擎,通过避免数据复制、复用少量固定内存来防止内存碎片化,并在 NVMe 上实现了接近峰值的异步顺序读写带宽,专门用于处理优化器状态的并行更新。第四是内存中心切片,针对单个算子过大导致工作内存溢出的问题,该技术将巨大的线性算子在数学上等效拆分为多个较小的瓦片并顺序执行。以 Transformer 中最大的线性层为例,其参数和梯度所需的工作内存为: $$MSWM = 2 \times (h_{d} \times 4h_{d} + 4h_{d}) \times 2$$ 配合按需获取和释放的机制,工作内存需求按瓦片数量成比例下降,彻底消除了为了装下大算子而引入模型并行的需求。最后是受易用性启发的实现,通过在 PyTorch 子模块中自动注入前向和反向的钩子,系统在算子执行前后自动完成参数的收集、切分和卸载;同时拦截初始化过程,确保模型在创建时即被切分,使得开发者无需重构代码即可像普通数据并行一样训练大模型。

效果如何 实验在最多 32 个 NVIDIA DGX-2 节点(共 512 张 V100 32GB GPU)上进行,训练基于 Transformer 的类 GPT 模型。对比的基线方法包括代表纯数据并行的 PyTorch DDP、代表模型并行的 Megatron-LM、代表当前最先进混合并行路线的 3D 并行,以及代表异构卸载路线的 ZeRO-Offload。在极限规模测试中,ZeRO-Infinity 在 512 张 GPU 上成功训练了 32 万亿参数的模型,相比 3D 并行支持的最大规模(6500 亿参数)提升了 50 倍。在训练 5000 亿参数模型时,其吞吐量与 3D 并行几乎持平;当模型扩大到 20 万亿参数时(3D 并行已因内存不足崩溃),该方法依然保持了 49 TFlops/GPU 的优异吞吐量。在单节点(16 张 GPU)的普及性测试中,该方法无需任何模型并行即可微调高达 1 万亿参数的模型,且单卡算力超过 40 TFlops/GPU,而同等硬件下 3D 并行连 200 亿参数都无法扩展。此外,在 1 万亿参数模型的弱扩展实验中,从 64 张 GPU 扩展到 512 张 GPU 时,由于有效利用了新增节点的聚合带宽和 CPU 算力,系统展现出了超线性可扩展性。该方法也存在一定局限:当模型规模达到 10 万亿到 20 万亿的极端情况时,训练性能会有所下降,这并非因为 NVMe 带宽不足,而是因为 CPU 内存容量见顶,限制了激活检查点的存储,迫使单卡批次大小变得极小。此外,对于隐藏层维度较小的模型,将激活检查点卸载到 CPU 会导致最多 1.2 倍的吞吐量下降,但在 32K 以上的大维度模型中影响微乎其微。

A1 主要贡献

本文旨在解决大规模深度学习模型训练中日益严峻的“GPU内存墙”问题。过去三年,最大的密集模型参数量增长了1000倍以上,而GPU内存仅增长了5倍,这使得训练超大规模模型(如万亿参数模型)需要海量的GPU资源,且对数据科学家提出了重构模型的巨大负担。

本文的核心问题与研究目标如下:
1. 支持模型规模的未来增长:如何支持模型从百亿级别(如GPT-3)增长到百-万亿级别的下一轮1000倍增长?
2. 提升大模型的可及性:如何让没有大规模GPU集群的数据科学家也能访问和微调现有的大模型?
3. 简化大模型训练:能否通过消除模型重构和多种并行方式的需求,使大模型训练更加简便?

为应对上述挑战,本文提出了ZeRO-Infinity,一个新颖的异构系统技术,其主要贡献和创新点如下:
* 内存和性能特征分析:对大规模模型训练的内存需求(第3节)和带宽需求(第4节)进行了详细的特征分析,为系统设计提供了理论依据。
* ZeRO-Infinity系统技术:这是一个包含五项创新技术的深度学习训练系统,旨在满足大规模、易用且高效的训练需求:
1. Infinity Offload Engine:通过同时利用GPU、CPU和NVMe内存以及GPU和CPU计算,充分发挥现代集群的异构架构优势。
2. Memory-Centric Tiling:一种新颖的GPU内存优化技术,用于处理巨大的算子,避免了模型并行的需要。
3. Bandwidth-Centric Partitioning:一种数据分区策略,旨在利用所有并行设备的聚合内存带宽。
4. Overlap-Centric Design:用于重叠计算和通信,以隐藏数据传输开销。
5. Ease-Inspired Implementation:通过自动化通信和数据分区,避免了模型代码重构。
* 全面的评估验证
* 前所未有的规模:在32个NVIDIA DGX-2节点(512个V100 GPU)上运行了32万亿参数的模型。
* 卓越的训练效率:在相同硬件上实现了超过25 petaflops的吞吐量。
* 超线性可扩展性:展示了万亿参数模型的超线性扩展能力。
* 可及性和易用性:在单个DGX-2节点上微调了高达万亿参数的模型,且无需模型并行或代码重构。
* 对未来硬件系统设计的启示:讨论了ZeRO-Infinity对未来硬件设计的潜在影响。
* 开源实现:在深度学习优化库DeepSpeed中开源了ZeRO-Infinity的实现。

图1:ZeRO-Infinity可以在32个NVIDIA V100 DGX-2节点(512个GPU)上训练一个32万亿参数的模型,比现有的SOTA技术3D并行大50倍。
图1:ZeRO-Infinity可以在32个NVIDIA V100 DGX-2节点(512个GPU)上训练一个32万亿参数的模型,比现有的SOTA技术3D并行大50倍。

A3 背景知识/关键Observation/设计原则

2 背景知识与相关工作

3 内存需求

4 带宽需求

4.1 量化深度学习训练中的AIT

4.2 带宽需求

图3:假设加速器的单GPU峰值可实现吞吐量为70 TFlops时,带宽对效率的影响
图3:假设加速器的单GPU峰值可实现吞吐量为70 TFlops时,带宽对效率的影响

(a) 参数和梯度带宽
图片a
图片a

(b) 优化器状态带宽
图片b
图片b

(c) 激活检查点带宽

A2 方法细节

5 ZERO-INFINITY 设计概述

5.1 为前所未有的规模设计

5.1.1 用于模型状态的Infinity offload engine
5.1.2 用于激活的CPU卸载

图4:ZeRO-Infinity在四个数据并行(DP)rank上训练一个两层模型的快照。图中描绘了第一层反向传播的通信过程。分区后的参数从慢速内存移动到GPU,然后被收集起来形成完整的层。梯度计算完毕后,它们被聚合、重新分区,然后卸载到慢速内存。层用下标表示,DP rank用上标表示。例如,$P_0^{(2)}$ 是第0层参数中由DP rank(2)拥有的部分。
图4:ZeRO-Infinity在四个数据并行(DP)rank上训练一个两层模型的快照。图中描绘了第一层反向传播的通信过程。分区后的参数从慢速内存移动到GPU,然后被收集起来形成完整的层。梯度计算完毕后,它们被聚合、重新分区,然后卸载到慢速内存。层用下标表示,DP rank用上标表示。例如,$P_0^{(2)}$ 是第0层参数中由DP rank(2)拥有的部分。

5.1.3 用于工作内存的内存中心切片(Memory-centric tiling)

5.2 为卓越的训练效率设计

5.2.1 参数和梯度的效率
5.2.2 优化器状态的效率
5.2.3 激活的效率

5.3 为易用性设计

6 效率优化

6.1 带宽中心分区(Bandwidth-Centric Partitioning)

6.2 重叠中心设计(Overlap Centric Design)

6.3 Infinity Offload Engine

7 受易用性启发的实现

7.1 自动化数据移动

7.1.1 外部参数的自动注册

7.2 初始化期间的自动模型划分

A4 实验环境

表1:实验配置。单位B表示十亿,T表示万亿,K表示1024。
表1:实验配置。单位B表示十亿,T表示万亿,K表示1024。

A4 实验结果

模型规模与速度

图5:ZeRO-Infinity训练数万亿参数模型的效率和可扩展性。
图5:ZeRO-Infinity训练数万亿参数模型的效率和可扩展性。

超线性可扩展性

普及大规模模型训练

系统特性对模型规模的影响

图6:系统特性对模型规模和性能的影响。
图6:系统特性对模型规模和性能的影响。

表2:优化器、梯度和参数状态的设备放置选项和分区策略。
表2:优化器、梯度和参数状态的设备放置选项和分区策略。

系统特性对性能的影响

A5 结论

本文提出了ZeRO-Infinity,一种新颖的异构系统技术,它通过利用GPU、CPU和NVMe内存,实现了前所未有的模型规模,同时保证了训练的可及性、易用性和卓越效率。这项工作改变了我们对大规模模型训练中内存的看法,证明了不再需要将所有训练数据都放在昂贵且有限的HBM2等高速内存中。ZeRO-Infinity展示了通过并行利用多个设备上廉价、低速但容量巨大的CPU或NVMe内存,可以获得高效训练所需的聚合带宽,从而突破GPU内存墙。

展望未来,随着GPU和其他加速器的计算能力变得更强,高效训练所需的聚合带宽也将增加。如表3所示,即使加速器的计算能力比NVIDIA V100 GPU强10倍,在一个512个加速器的集群上,ZeRO-Infinity也仅需每个加速器与慢速内存之间有30 GB/s的带宽即可保持高效。这在当前技术下,例如通过NVLink连接加速器和慢速内存,是完全可以实现的。

显然,有了ZeRO-Infinity,加速器设备内存不再是模型规模或训练效率的瓶颈。然而,在合理时间内训练数十万亿或数百万亿参数的模型仍需要计算能力的巨大飞跃,并且在未来设备上高效运行也需要设备间带宽的相应提升。我们希望,随着设备内存不再是限制因素,ZeRO-Infinity将激励未来在超强计算能力加速器和超级计算集群方面进行更多以计算和设备间带宽为中心的创新,以支持模型规模的下一个1000倍增长及其带来的进步。

表3:在一个拥有512个加速器设备(其可实现计算能力分别为NVIDIA V100 GPU的10倍和100倍)的集群上,ZeRO-Infinity保持高效所需的带宽(bw)要求。
表3:在一个拥有512个加速器设备(其可实现计算能力分别为NVIDIA V100 GPU的10倍和100倍)的集群上,ZeRO-Infinity保持高效所需的带宽(bw)要求。

A6 附录