找分布式工作复习学习系列---市面分布式框架解析之Deepspeed(二)

一、Deepspeed

核心是zero优化器

1、总览

微软开发ZeRO是为了克服数据并行性和模型并行性的限制,同时实现两者的优点。ZeRO通过在数据并行进程中划分模型状态(参数,梯度和优化器状态),而不是复制它们,从而消除了数据并行进程中的内存冗余。它在训练期间使用动态通信计划,以在分布式设备之间共享必要的状态,以保持计算粒度和数据并行性的通信量。

ZeRO驱动的数据并行性,它允许每个设备的内存使用量随数据并行性的程度线性扩展,并产生与数据并行性相似的通信量。 ZeRO支持的数据并行性可以适合任意大小的模型,只要聚合的设备内存足够大以共享模型状态即可

2、ZeRO的三个阶段及其优势

ZeRO具有三个主要的优化阶段(如图1所示),分别对应于优化器状态,梯度和参数的划分。 累计启用时:

    1. 优化器状态分区(Pos) -减少了4倍的内存,通信容量与数据并行性相同
    1. 增加梯度分区(Pos+g) - 8x内存减少,通信容量与数据并行性相同
  • 3.增加参数分区(Pos+g+p) -内存减少与数据并行度和复杂度成线性关系。

例如,跨64个gpu (Nd = 64)进行拆分将减少64倍的内存。通信容量适度增加了50%。

ZeRO消除了内存冗余,并使群集的全部聚合内存容量可用。 启用所有三个阶段后,ZeRO可以仅在1024个NVIDIA GPU上训练一个万亿参数模型。 一个具有16位精度的类似Adam之类的优化器的参数化万亿模型需要大约16 TB的内存来保存优化器的状态,梯度和参数。 16TB除以1024即为16GB,这在GPU的合理范围内。


ZeRO-Offload 通过同时利用GPU和宿主机 CPU 的计算和存储资源,提升了较少的 GPU 资源下可以高效训练的最大模型规模。它让我们可以在单张 V100 上进行最高至 1300 亿参数的模型训练,10 倍于当前最高水平,同时保持每 GPU 30Tflop 的高训练吞吐量。

通过使单 GPU 具备训练数十亿参数的模型的能力,ZeRO-Offload 让大模型训练变得亲民,让硬件资源有限的深度学习从业者也能参与其中。


在单 GPU 上使用默认的 PyTorch 和 ZeRO-Offload 能训练的最大模型规模的柱状图

图 6:可以在单 GPU 上使用默认的 PyTorch 和 ZeRO-Offload 训练的最大的模型规模。

ZeRO-Offload 背后的核心技术是在 ZeRO-2 的基础上将优化器状态和梯度卸至 CPU 内存。这个方法让 ZeRO-Offload 能最大程度降低拷贝至 CPU 导致的计算效率损失,同时达到和 ZeRO-2 相同,甚至有时超过的效率。下图展示了 Zero-OffLoad 的架构:

图7: ZeRO-Offload 概述。

了解 ZeRO-Offload 是如何在单GPU上训练数十亿参数模型的

训练 GPT 和 T5 这样有数十亿参数的模型需要多个 GPU 来存储模型和状态量。大模型训练大多通过跨 GPU 的模型并行来解决显存限制问题。最近,我们发布了 ZeRO,一个高效利用显存的优化器,它会将模型状态量(优化器状态量、梯度和模型参数)分布在多个并行 GPU 上,让数十亿参数模型可以在不使用模型并行的情况下进行训练。然而,ZeRO 还是需要大量数据并行的 GPU 来保存划分后的模型状态量,因此只有少数人有条件进行这种模型训练。

ZeRO-Offload 让单 GPU 可以进行大模型训练,从而使这种训练变得平民化。为了在不使用多个 GPU 的情况下训练数十亿个参数的模型,ZeRO-Offload 继承了 ZeRO-2 的划分优化器状态量和梯度的方法。和 ZeRO-2 不同之处在于,ZeRO-Offload 并没有在每个 GPU 上保存一部分优化器状态量和梯度,而是把两者都移到了本机内存上。Optimizer 状态在整体训练过程中都保存在内存中。梯度则是在反向计算过程中在 GPU 上进行计算并通过 reduce-scatter 进行平均,之后每个数据并行进程把自己的那份平均后的梯度卸到 CPU 上(图7中的 g offload)并弃掉不属于自己负责的部分。

一旦梯度到了 CPU 上,划分后的优化状态量就会并行地在 CPU 上进行更新(图7中的 p update)。在更新进行完后,划分后的参数就被移回GPU并用 all gather 操作进行更新 (图7中的 g swap)。Zero-Offload 也通过使用不同 CUDA stream 来重叠通信(如 g offload 和 g swap)和计算(如反向传播和 p update) 以提高训练效率。

从模型规模,训练速度和扩展性看 ZeRO-Offload 的优势

10 倍模型扩展:在单张 32GB V100 GPU 上,图 6 显示 PyTorch 能最多训练有 13 亿个参数的模型,而 ZeRO-Offload 能训练 130 亿个参数的模型,是 PyTorch 的 10 倍。这是因为 ZeRO-Offload 在整个训练过程中将消耗了大部分 GPU 显存的优化器状态保留在本机内存中,同时还在反向传播过程中将计算出来的梯度移至 CPU。因此,节省的 GPU 显存可用于训练更大的模型。

高效的训练吞吐量:如图 8 所示,在训练 100 亿参数模型时,即使仅使用单个 GPU 进行训练,使用 ZeRO-Offload 仍可让每个 GPU 有超过 30 Tflops 的吞吐量,并且其吞吐量随 GPU 数量增长呈近完美的线性增长。

ZeRO-Offload 是 ZeRO-2 的完美补充,支持在少量 GPU 上高效训练大型模型。通过利用 CPU 内存来减少了模型所需的 GPU 显存,ZeRO-Offload 让在 1 到 16 个 GPU 上训练大模型变得可行。在 32 个 GPU 上,ZeRO-Offload 的性能略高于 ZeRO-2; 性能提升来源于 ZeRO-Offload 节省的 GPU 显存,它们让我们可以在更大 batch 下训练了模型,因此尽管存在拷贝至 CPU 的开销,GPU 计算效率仍然可以提高。在有更多的 GPU(例如 64 和 128)的情况下,ZeRO-2 的性能优于 ZeRO-Offload,因为两者现在都可以运行类似大小的batch,ZeRO-2 没有将数据移至 CPU 的开销,并且 GPU 上进行优化器更新要比 CPU 上快得多。总而言之,ZeRO-Offload 是 ZeRO-2 的补充,并扩展了 ZeRO 家族的优化范围,从单台设备到数千台设备,都有大型模型训练的优化方案。


使用 ZeRO-Offload 和 ZeRO-2 在 128 张 GPU 上训练有 100 亿参数的 GPT-2 模型的的吞吐量的柱状图。

3、DeepSpeed

实现了ZeRO的第一阶段(优化器状态分区(简称ZeRO-OS)),具有支持1000亿参数模型的强大能力。 该代码将与我们的培训优化库DeepSpeed一起发布。 DeepSpeed通过与PyTorch兼容的轻量级API带来了最新的培训技术,例如ZeRO,分布式培训,混合精度和检查点。 只需对PyTorch模型进行几行代码更改,就可以利用DeepSpeed解决潜在的性能挑战,并提高培训速度和规模。 DeepSpeed在四个方面表现出色(如图2所示):

(1)、3大基础并行方式

  • 数据并行是深度学习中的一种普遍使用的技术。在该技术中,每批输入的训练数据都在数据并行的 worker 之间平分。反向传播后需要通信并规约梯度,以保证优化器在各个 worker 上进行相同的更新。数据并行性具有几个明显的优势,包括计算效率高和实现起来工作量小。但是,数据并行的 batch 大小随 worker 数量提高,而我们往往无法在不影响收敛性的情况下一直增加 batch 大小。
  • 显存效率:数据并行会在所有 worker 之间进行模型和优化器的复制,因此显存效率不高。DeepSpeed 开发了 ZeRO ,它是一系列用于提高数据并行的显存效率的优化器。 这项工作依赖于 ZeRO 的 1 阶段,该阶段在 worker 之间划分优化器状态量以减少冗余。
  • 计算效率:随着我们提高并行度,每个 worker 执行的计算量是恒定的。数据并行可以在小规模上实现近乎线性扩展。但是,在 worker 之间规约梯度的通信开销跟模型大小成正相关,所以当模型很大或通信带宽很低时,计算效率会受限。。梯度累积是一种用来均摊通信成本的一种常用策略。它会进一步增加batch大小,在本地使用 micro-batch 多次进行正向和反向传播积累梯度后,再进行梯度规约和优化器更新。
  • 模型并行是包含范围很广的一类技术。它会在多个 worker 之间划分模型的各个层。就其本质而言,模型并行性的计算和通信因模型结构而异,因此在实现上有很大的工作量。DeepSpeed 借用了英伟达的 Megatron-LM 来为基于 Transformer 的语言模型提供大规模模型并行功能。模型并行会根据 worker 数量成比例地减少显存使用量,也是这三种并行度中显存效率最高的。但是其代价是计算效率最低。
  • 显存效率:模型并行会根据 worker 数量成比例地减少显存使用量。至关重要的是,这是减少单个网络层的激活显存的唯一方法。DeepSpeed 通过在模型并行 worker 之间划分激活显存来进一步提高显存效率。
  • 计算效率:由于每次前向和反向传播中都需要额外通信激活值,模型并行的计算效率很低。模型并行需要高通信带宽,并且不能很好地扩展到通信带宽受限的节点。此外,每个模型并行worker 都会减少每个通信阶段之间执行的计算量,从而影响计算效率。模型并行性通常与数据并行性结合使用,以在内存和计算效率之间进行权衡。
  • 流水线并行训练引擎也被包含在了这次发布的DeepSpeed中!流水线并行将模型的各层划分为可以并行处理的阶段。当一个阶段完成一个 micro-batch 的正向传递时,激活内存将被通信至流水线的下一个阶段。类似地,当下一阶段完成反向传播时,将通过管道反向通信梯度。必须同时计算多个 micro-batch 以确保流水线的各个阶段能并行计算。目前已经开发出了几种用于权衡内存和计算效率以及收敛行为的方法,例如 PipeDream。DeepSpeed 采用的方法是通过梯度累积来实现并行,并保持与传统数据并行和模型并行训练在相同的总 batch 大小下收敛情况相同。
  • 显存效率:模型并行会根据 worker 数量成比例地减少显存使用量。至关重要的是,这是减少单个网络层的激活显存的唯一方法。DeepSpeed 通过在模型并行 worker 之间划分激活显存来进一步提高显存效率。
  • 计算效率:由于每次前向和反向传播中都需要额外通信激活值,模型并行的计算效率很低。模型并行需要高通信带宽,并且不能很好地扩展到通信带宽受限的节点。此外,每个模型并行worker 都会减少每个通信阶段之间执行的计算量,从而影响计算效率。模型并行性通常与数据并行性结合使用,以在内存和计算效率之间进行权衡。

此外,流水线并行性会在每个 batch 的开始和结束时因为需要重新填充或排空流水线而产生 bubble overhead。使用流水线阶段数的 4 倍或 8 倍的梯度累积步骤(以及 batch 大小)进行训练,相较于只有一个流水线阶段分别达到了 81% 和 90% 的扩展性。

(2)、3D混合并行

数据,模型和流水线并行在提高内存和计算效率方面均起到特定的作用。图 1 说明了我们的 3D 策略。

  • 显存效率:先将模型的各层划分到不同的流水线阶段,并进一步把每个阶段的层通过模型并行进行划分。这种 2D 组合同时减少了模型、优化器和激活函数所消耗的内存。不过,我们不能在不引入通信开销的情况下无限地划分模型,而通信开销会限制计算效率。
  • 计算效率:为了在不牺牲计算效率的情况下将 worker 数量扩展至超出模型和流水线并行能支持的规模,我们使用了 ZeRO 支持的数据并行功能(ZeRO-DP)。ZeRO-DP 不仅可以通过划分优化器状态量进一步提高显存利用效率,而且还可以通过利用基于通信拓扑的映射关系,以最小的通信开销扩展到任意数量的 GPU。
  1. 基于通信拓扑的 3D 映射(图2):通过利用两个关键的架构属性,我们将 3D 并行中的每个维度仔细地映射到 worker 上,以实现最大的计算效率。
    优化节点内和节点间的通信带宽:模型并行是这三种策略中通信开销最大的,因此我们优先考虑将模型并行 worker 组放置在节点内以利用更大的节点内带宽。这里我们基于英伟达 Megatron-LM 进行了张量切分式的模型并行。当模型并行组不占满节点内的所有 worker 时,我们选择将数据并行组放置在节点内。不然就跨节点进行数据并行。流水线并行的通信量最低,因此我们可以跨节点调度流水线的各个阶段,而不受通信带宽的限制。
  2. 通过并行通信增大带宽:每个数据并行组需要通信的梯度量随着流水线和模型并行的规模线性减小,因此总通信量少于单纯使用数据并行。此外,每个数据并行组会在局部的一小部分 worker 内部独立进行通信,组间通信可以相互并行。这样的结果是,通过减少通信量和增加局部性与并行性,数据并行通信的有效带宽被增大了


    该图显示了一个有 32 个 worker 进行 3D 并行的例子。神经网络的各层分为四个流水线阶段。每个流水线阶段中的层在四个模型并行 worker 之间进一步划分。最后,每个流水线阶段有两个数据并行实例,且 ZeRO 在这 2 个副本之间划分优化器状态量。

    图 1:一个有 32 个 worker 进行 3D 并行的例子。神经网络的各层分为四个流水线阶段。每个流水线阶段中的层在四个模型并行 worker 之间进一步划分。最后,每个流水线阶段有两个数据并行实例,且 ZeRO 在这 2 个副本之间划分优化器状态量。


    彩色块显示图 1 中的 worker 到八个节点(每个节点有四个 GPU)的系统上的 GPU 的映射。同一颜色的 GPU 在同一节点上。

具体理解方式:
首先stage0先算,stage0算完之后,stage1算,同时stage0再算,完成流水线并行。
另外,stage0内部算的时候,7层模型会通过megatron进行模型并行的计算。
图 2:图 1 中的 worker 到八个节点(每个节点有四个 GPU)的系统上的 GPU 的映射。同一颜色的 GPU 在同一节点上。
了解关于 3D 并行训练万亿参数模型的更多信息

使用 8 路模型并行,64 路流水线并行和 8 路数据并行,可以在 4096 个英伟达 A100 GPU 上扩展训练一个万亿参数模型。

通过结合模型并行和流水线并行,3D 并行可实现出色的内存效率和跨多个节点的高效计算效率。模型并行性提高了节点内的激活内存和模型状态量的存储效率,而流水线并行,相较于仅使用模型并行,则可以在不牺牲计算效率的情况下,跨节点高效存储模型状态。在 micro-batch 大小为 1 的万亿参数例子中,在使用激活值 checkpoint 以及上述 3D 并行后,模型状态量会消耗 30 GB 的显存,划分后的激活值消耗 2.5 GB 的内存。这样总显存占用为 32.5 GB,就能够使用具有 40 GB 内存的英伟达 A100 GPU 来容纳和训练这样的模型了。

结合模型并行与流水线并行,可以使流水线并行在非常小的 batch 下以最小的 bubble overhead 实现高计算效率。在 8 路模型并行下,每个模型使用 micro-batch 为 1 个微批处理将导致每个 GPU 的有效 micro-batch 大小为 1/8。因此,使用 8 倍于管道并行度的梯度累加步骤,只会让每张 GPU 上的总累计 batch 大小为 1,并且流水并行处理可以实现 90% 的计算效率。与数据并行性结合使用时,这让 4096 张 GPU 上的总有效 batch 大小为 4096,并仍然可以达到 90% 的流水线效率。

思考:但是数据并行会怎样影响计算效率呢?难道数据并行不是需要每张 GPU 都有大 batch 才能保持高效吗?

模型并行可以将每张GPU上的有效 batch 大小减小到小于 1。这使流水线并行即使在小 batch 下仍可以隐藏流水线 bubble overhead。请注意,通过跨节点使用流水线并行性,我们就可以让流水线每个阶段的数据并行节点之间的独立进行通信,并且与其他流水线阶段并行进行。实际上,在高端 GPU 集群中常见的完全连接的网络拓扑中,这对可用于数据并行训练的有效通信带宽具有重要意义。由于流水线阶段中的每个节点都可以与其对应的数据并行节点并行通信,因此有效的通信带宽与流水线阶段数成正比。通过设置64个并行流水线阶段,有效带宽将变为往返单个节点的带宽的 64 倍。流水线并行带给数据并行如此大的有效带宽,这使数据并行在计算与通信比率非常低的小 batch 情况下,也能实现高效扩展。

(3)、DeepSpeed 稀疏注意力机制:以 6 倍快的速度执行 10 倍长的序列

基于注意力机制的深度学习模型(例如,Transformers)在捕获输入序列中的 token 之间的关系(即使是两者之间距离很长)方面非常有效。因此,它们常与文本,图像和语音相关的输入配合使用。这些输入的序列长度可至数千 token。然而,尽管注意力模块有效地捕获了长序列内的依赖关系,在实际应用中,对长序列输入的支持受计算量和显存的限制。计算量和显存需求关于序列长度(n)呈二次方级增长。

为了解决此限制,DeepSpeed 提供了一套稀疏注意力 kernel——它是一种工具性技术,可以通过块状稀疏计算将注意力计算的计算和显存需求降低几个数量级。这套工具不仅缓解了注意力计算的内存瓶颈,而且其稀疏计算非常高效。它的 API 可以方便地集成进任何基于 Transformer 的模型。除了提供各种稀疏结构外,它还可以灵活处理任何用户自定义的块状稀疏结构。

更具体地说,稀疏注意力(SA)可以设计计算靠近的 token 之间的局部注意力,或通过使用局部注意力计算得到 summary token,进而得到全局注意力。此外,SA 既支持随机注意力,也支持局部、全局和随机注意力的任意组合,如图 10 中的蓝色,橙色和绿色块。这使SA将内存占用减小到(O(wn)),其中1(

彩色小方块显示可变的稀疏度结构

在 GPU 上的高效实现:尽管稀疏注意力的基本实现会节省显存,但在计算上,它可能会比稠密计算要差。这主要是由于稀疏数据导致了内存访问的分散性。开发高效的稀疏内核通常是颇具挑战性的,尤其是在 GPU 上。DeepSpeed 提供了在 Triton 中开发的高效的稀疏注意力 kernel。这些 kernel 呈块状稀疏范式结构,可实现对齐的内存访问,减少GPU线程分支并平衡处理器上的工作负载。

系统性能:如图11所示,SA 支持 10 倍长的序列最高 6.3 倍的计算提速。左图显示了可在 BERT-Base 和 BERT-Large 中运行的最长序列长度。我们的实验有以下三种设置:稠密模式,具有激活 checkpoint 的稠密模式和具有激活 checkpoint 的稀疏(SA)模式。与 BERT-Base 和 BERT-Large 的稠密模式相比,SA 的序列分别长 10 倍和 16 倍。 此外,与稠密模式相比,SA 减少了总计算量,并提高了训练速度:提高的效率随着序列长度的增加而提高,对于 BERT-Base 而言,提升速度高达 6.3 倍,而对于 BERT-Large,则高达 5.3 倍。

图11:BERT 模型的可支持的最大序列长度(左);在单英伟达 V100 GPU 上训练具有不同序列长度的 BERT-Base(中)和 BERT-Large(右)的时间。

了解 SA 如何使其准确率与全稠密注意力相当甚至比它更高

涉及稀疏注意力的相关工作(Sparse Transformer,Longformer,BigBird)均显示出比全注意力更高的准确性,与我们的经验一致。除了降低内存开销和加快计算速度外,我们还在生产模型中观察到 SA 有更高准确性并更快收敛的情况。下图说明了训练基于 BERT 的长文本理解(序列长度 2048)生产模型的准确性。该实验在以下三种设置中进行:从头开始进行稠密训练,从头开始进行 SA 训练,以及从使用序列长度为 512 的密集型 checkpoint 继续进行 SA 训练。我们已经观察到,对于从头开始进行预训练,SA较于稠密设置收敛的速度更高,精度更好。此外,就时间和准确性而言,从用 SA 继续训练预先训练好的 checkpoint 的效果甚至更好。

图12:长文本理解应用的准确性

(4)1 比特 Adam:减少5倍的通信量并提升 3.4 倍的训练速度

大型模型(如 BERT 和 GPT-3)的扩展训练需要基于模型设计,体系结构和系统功能的细致优化。从系统的角度来看,通信效率已成为主要的瓶颈,尤其是在使用标准 TCP 且网络带宽有限的商用系统上。

通信压缩是减少在此类系统上的训练时间的重要技术。压缩通信的最有效方法之一是误差补偿压缩,即使在1比特压缩下,它也可以提供稳定的收敛速度。但是,最新的误差补偿技术仅适用于一些和梯度线性相关的简单优化器,例如随机梯度下降(SGD)和 Momentum SGD。这些技术无法和 Adam 之类的非线性优化器整合,后者在许多任务(包括训练类似 BERT 的模型)中带来了最好的收敛率和精度。

对于像 Adam 之类的强大优化器而言,由于它依赖于梯度的非线性特征(在方差项上),针对它来开发基于误差补偿的压缩技术是一项颇具挑战性的工作,因此限制了先进的通信压缩技术的实用价值。

理解经典压缩技术的背景

通信压缩的一种方法是1比特压缩,它可以被表示为:


image.png

在这种压缩中,我们用 1 比特表示每个数字,从而将内存需求减少 32 倍。问题在于,这种直接的方法会大大降低收敛速度,没什么实用价值。最近的研究表明,通过使用误差补偿压缩,我们有望在通信压缩下保证几乎相同的收敛率。

误差补偿的思想可以概括为:1)进行压缩,2)记忆压缩误差,然后3)在下一次迭代中把压缩误差加回来。对于 SGD,误差压缩相当于:


image.png

其中(C(⋅))是1比特压缩算子。这种误差压缩的优点在于压缩误差的历史值(e_t)和(e_t-1)最终会相互抵消, 这使得:


image.png

该策略已经被证明适用于所有线性依赖于梯度的优化算法,例如 SGD 和 Momentum SGD。

了解将误差补偿应用于 Adam 的挑战

我们在下面提供了 Adam 算法的概述。更新规则如下:


image.png

如上图的公式所示,方差项 (v_t) 和梯度 (g_t) 呈非线程关系。如果我们对 Adam 进行普通的误差补偿,我们会发现(见图 13)Adam 将无法收敛。


由于对梯度的非线性依赖,误差补偿压缩不适用于 Adam
用 1 比特 Adam 压缩通信

为了在使用 Adam 优化器时压缩通信,我们开发了 1 比特 Adam,它通过预处理解决了梯度中的非线性依赖问题。我们观察到非线性项方差((v_t))的变化幅度在几个训练周期后显著降低,之后将 (v_t) 设置为常数不会改变收敛速度。所以提出的 1 位 Adam 优化器由两部分组成(如图 14 所示):预热阶段,本质上就是原始的 Adam 算法。压缩阶段,使方差项保持恒定,并将剩余的线性项(即动量)压缩为 1 位表示形式。

该算法的压缩阶段由阈值参数控制(如图 14 所示)。当我们检测到“方差”的变化降至某个阈值以下时,就切换到压缩阶段。我们的研究表明,热身阶段只需要全部训练步骤的 15-20%。

进一步了解 1 比特 Adam 的底层机制

1 比特 Adam 的权重按以下公式进行更新。对于第 i 个 worker,在压缩阶段:


image.png

image.png
应对 1 比特 Adam 的系统挑战

除了算法上的挑战外,在训练系统中应用 1 比特 Adam 还有两个系统挑战。首先,我们需要具备将动量转换为 1 比特表示形式的功能的高效 kernel。其次,我们需要高效的通信方案来在不同的 GPU 之间传输压缩后的动量。压缩的目的是减少总体训练时间,以使带宽受限的商品系统可以用来训练大型模型。我们在 DeepSpeed 中解决了这些具有挑战性的问题,并针对在通信效率受限的系统上进行训练的场景,对 1 比特 Adam 实现进行了全面的优化。

1 比特 Adam 在通信受限系统上的优势

1 比特 Adam 提供了和 Adam 相同的收敛能力,并且最多可以减少 5 倍的通信量,用来进行 BERT-Large 预训练任务时,可达最高 3.5 倍的吞吐量,用于 SQuAD fine-tuning 任务时,可达 2.7 倍的高吞吐量。端到端吞吐量的提高来源于在压缩阶段观察到的 6.6 倍(图 15 左)和 6.2 倍(图 15 右)速度提升。值得一提的是,我们的 1 位 Adam 优化器在 40 Gb 以太网系统上的扩展性非常好,其性能可与 Adam 在 40 Gb InfiniBand QDR 系统上的扩展性相媲美。我们注意到,基于 iPerf 基准,40 Gb 以太网上的有效带宽为 4.1 Gbps,而基于 InfiniBand perftest 微基准,InfiniBand 提供了 32 Gbps 的近峰带宽。

NVIDIA V100 GPU 上的 BERT-Large 预训练(左)和 SQuAD fine-tuning(右)的 1 比特 Adam 扩展性。BERT 预训练的 batch 大小为 16/GPU,SQuAD fine-tuning 为 3/GPU。

Reference
https://zhuanlan.zhihu.com/p/106783111
https://zhuanlan.zhihu.com/p/343570325

二、Megatron

三、horovod

四、Ray

五、paddlepaddle

六、oneflow


Data Parallelism (数据并行)

  • Naive:每个worker存储一份model和optimizer,每轮迭代时,将样本分为若干份分发给各个worker,实现并行计算
  • ZeRO: Zero Redundancy Optimizer,微软提出的数据并行内存优化技术,核心思想是保持Naive数据并行通信效率的同时,尽可能降低内存占用

Model/Pipeline Parallelism (模型并行)

  • Naive: 纵向切割模型,将不同的layers放到不同的device上,按顺序进行正/反向传播
  • GPipe:小批量流水线方式的纵向切割模型并行
  • Megatron-LM:Tensor-slicing方式的模型并行加速

Non-parallelism approach (非并行技术)

  • Gradient Accumulation: 通过梯度累加的方式解决显存不足的问题,常用于模型较大,单卡只能塞下很小的batch的并行训练中
  • CPU Offload: 同时利用 CPU 和 GPU 内存来训练大型模型,即存在GPU-CPU-GPU的 transfers操作
  • etc.:还有很多不一一罗列(如Checkpointing, Memory Efficient Optimizer等)

你可能感兴趣的:(找分布式工作复习学习系列---市面分布式框架解析之Deepspeed(二))