首页 > 编程知识 正文

分布式认知模型举例,分布式

时间:2023-05-05 09:56:59 阅读:13894 作者:493

要了解大型模型的培训困难,让我们来看看为什么需要大型分布式培训,从传统的分布式培训到大型模型的出现。 其次,了解大规模培训的挑战。

从分布式培训到大型培训,最常见的培训方法是单卡,即在一台服务器上安装一个AI芯片,这是最简单的培训方法。 随着数据量的增加,为了提高模型的训练速度,出现了单机多卡。 在多个AI芯片并行并在一台机器上配置8枚AI芯片的示例中,将数据分割为8部分,分别在8枚AI芯片上运行一次BP算法来计算梯度,并将所有AI芯片上计算出的梯度平均后更新模型参数。 这样,以前每次只能在BP上训练一个batch的数据现在变成了8个batch。

模型和数据规模的增大意味着训练时间的增加。 为了加快模型训练的速度,可以增加计算资源来缩短训练时间,于是出现了分布式训练。 分布式培训物理上使用多台机器,每台机器都有多个AI芯片,网络模型在不同机器的不同AI芯片上运行,以提高整体培训速度。 简单地理解,实质上就是将单卡的负载卸下了多卡。

让我们来看看引入分布式培训的两个原因。

1 )第一,数据规模大,训练时间长。 对于独立8卡,假设针对COCO为115k规模的数据集,resnet152模型的训练需要40小时。 Open Image dataset v4图像数据集的培训在1,740 k规模下可能需要相对40天。 对于生命宝贵、推迟毕业的炼丹来说,需要不断调整网络结构、尝试新参数、修改下游任务等工作,单机单卡和单机多卡的训练速度是不能接受的,需要分散式训练。

2 )第二点是分布式训练可能会带来更高的准确率。 首先,请想起为什么要使用SGD优化模型。 随机梯度下降的“随机”是指每次从数据集中随机提取较小的batch数据,计算真值与模型预测值之间的误差,然后反向传播。 之所以只选择一个小batch,一个是随机数据产生的小batch梯度方向,理论和实践证明可以在一定程度上模拟整个数据的梯度下降方向,另一个是AI芯片的内存有限然而,实际上小batch梯度并不代替整个数据集的梯度方向,而每次小batch由BP算法求解的梯度方向与整个数据集不完全匹配。 这将导致优化迭代(训练)过程不断振动。 分布式训练可以使用更大的batch size来避免优化过程中的振动。

数据并行:分布式训练场景中,由于数据规模的增加,数据并行化可以隔离输入数据,使得每个AI芯片只需要处理部分数据。 计算通信可以重叠,通信需求低,并行效率高的优点是不能执行大的模型。

模型并行:此外,模型各层参数量越大、模型层数越深,模型越能并行修改网络层内的计算方式,将单层计算负荷和内存负荷划分为多个AI芯片。 缺点是通信和计算串行,对通信要求高。

流水线并行:也可以利用流水并行,将不同的网络层配置在不同的AI芯片上执行,并且将计算负载和存储器负载分割为多个AI芯片。 计算出的通信可以重叠,具有通信需求低的优点; 但是,有管线间的空闲bubble,需要与重新计算并用。

通过划分数据、网络模型和要运行的流水线,分布式训练可以有效地减少单卡资源负荷,提高训练任务的计算和内存吞吐量,而单卡在训练中

现在一切都看起来那么美,有分散训练就足够了。 理论上,AI芯片的数量越多,模型训练越快。 但是,随着培训数据集的规模进一步扩大,数据并行化将受到限制。 随着培训资源扩大到一定规模,通信瓶颈的存在,增加计算资源的边际效应变得明显,增加资源也无法加速。 这个比例叫做加速比。 假设单个设备的吞吐量为t,有n个设备的系统的吞吐量为nT,并且假设该系统实际达到的吞吐量为T_n。 “最终加速比”(scale factor )如下:

理论上,无论设备数量n有多少,加速比都期待越接近1越好。

另外,随着网络模型的增大,模型所需的内存急剧膨胀,算子增加,单卡即使进行模型分割和流水线分割,也很难在合理的时间内完成一个step的训练,最终分散训练就是这样的这也是一个大模型的出现,是对系统的挑战。

此时,面向大模型,需要引入大规模训练技术,在解决内存的同时,不受计算资源的限制,使算法开发人员能够方便地进行高效的分布式调试和代码编写。 快乐地训练大模型。

大规模训练的挑战与普通的分散训练相比,大规模训练在技术上需要考虑的问题更为复杂。

首先,问题是如何利用多卡突破内存限制瓶颈,而对于单卡无法提供的大型号,大型培训将使用大量计算资源,包括

何通信、协作是另一个难题;最后,如何平衡各类层出不穷的大规模训练技术,使得众多技术形成一个完整高效的训练方案,更是一大学问。

下面,将大规模训练技术面临的挑战分为四个部分:内存、通讯、计算和调优。

内存墙

模型训练无可避免的问题就是内存墙。

下面举两个例子,在进行ResNet152对120G的ImageNet数据进行训练时,在使用Batch Size=128,Input Image Size=512x512的前提下,训练过程占用了16G的内存,在GPU一般具有16G内存的情况下,没办法把模型放在一个一块AI芯片上。想进一步加大每次执行数据的Batch size,模型训练的内存占用也会随之增长,最后高于AI芯片的内存容量,触碰到了内存墙,模型无法训练。

以2000亿参数的鹏程盘古大模型为例,2000亿的参数内存占用就消耗了754GB,训练过程因为会有权重、激活、优化器状态、再加上自动微分所产生临时变量,需要3500GB的内存,一个大模型训练就需要100多块具有32G内存的AI芯片。

要理解内存墙出现的本质,就需要了解内存增长的本质。在ResNet50的1轮迭代,打开看看内存占用变化:

1)网络模型开始计算的时候,内存占用不断增加,直到达到峰值1.2GB。

2)峰值过后内存开始逐渐释放,内存占用慢慢降到320M。

3)1个step计算结束后,仍有一部分内存驻留,内存保持在320M。

可以发现,模型训练对内存的占用可以分为两部分:

1)一部分是模型自身的权重参数、优化器状态信息,由于是比较固定的所以称为静态参数。

2)另一部分是模型在前向计算和反向传播的时候,会产生诸如前向输出Forward Output、梯度输出Output Gradient、算子计算时候的临时变量等,这部分内存会在反向传播时逐渐释放掉,因此被称为动态参数。

从这里面可以发现,在计算过程的内存峰值,是否遇到内存墙,主要是由动态内存决定。即使绞尽脑汁,降低静态内存意义并不是很大,关键在于降低内存占用的峰值。

**静态内存**

以ResNet50为例,静态内存占用大约1.2G:

ResNet50 = 250M(权重参数) + 900M(优化器参数和动量) ~ 1.2G

在计算过程中,神经网络模型每一层的卷积或者全连接计算,都会把权重W_m长期保存下来,用作网络的权重参数更新。另外针对诸如ADAM的优化器,会存储优化器的动量等信息,用于优化器计算。

一块AI芯片有16G,最大能塞满20+亿参数的模型,但是这时候已经没有额外空间,留给动态内存进行分配啦。所以说降低动态内存的峰值才是人间正道。

**动态内存**

静态内存比较好理解,下面主要看看动态内存。动态内存一般指的在自动微分Autogard过程,产生的中间变量。

神经网络层数非常多,在计算过程中,神经网络模型每一层的前向输出Forward Output都需要保存下来给反向传播时候使用;而在神经网络的反向传播计算过程中,需要记录下权重梯度Weight Gradient(W_g),给优化器使用,在后续的step中更新梯度的信息;另外还有梯度输出Output Gradient同样在反向传播的过程中,继续在反向传播的过程中,作为上一层网络模型的输入。

当然,这里面还会有一些正向和反向的算子中间变量需要消耗内存的,由此,上述的O_f、O_g、W_g、OP累积下来,会造成巨大的内存开销。从ResNet50的例子中,我们可以看出,动态内存是静态内存的X倍(,静态内存占用了1.2G内存,而动态内存则占用了25G内存,比例非常不平衡)。

静态内存和动态内存都可能造成内存墙的问题。相互独立但又相互制约,任意一侧的增大都会导致留给另一侧的显存空间变小,所以单单对一侧做优化是不够的,必须同时优化静态和动态内存。

为了能够将大模型运行起来,需要使用模型并行、流水并行等技术,但是这些技术又会降低AI芯片的计算吞吐量。

通讯墙

大模型通过模型并行、流水线并行切分到AI集群后,通讯便成了主要的性能瓶颈。

从模型切分的角度来考虑,大模型再怎么切分其仍然是一个模型,因而模型切分到不同的机器后,仍然需要通信来对分布在不同机器的参数进行总体聚合。

在通讯方式的角度来看,参数聚合(All Reduce)就会对通讯提出很多需求,例如使用同步的更新策略,还是使用异步的更新策略,如何对模型局部变量进行更新等。

另外,在网络通讯的角度,由于专用的AI加速芯片中内存与计算单元ALU非常进,使得片内带宽很大,计算速度很快,但是在集群中的网络传输速度远远不能匹配专用的AI加速芯片运算速率。

直接用更大的带宽不能解决这些问题吗?

从图中,我们可以看到,随着网络带宽从1Gbps到100Gbps,利用率从接近100%下降到40%左右。随着网络带宽的增加,带宽的利用率将会越来越低,高带宽所带来的收益会遇到瓶颈。

随着机器规模的扩大,基于同步的All Reduce通讯聚合方式,会因为大量的AI芯片和服务器之间频繁进行同步,出现水桶效应,也就是最慢的一路通讯,将会决定整个AI集群的通讯的高度。

如果采用目前比较流行的Ring-AllReduce的通信聚合方式,当通讯的环越大,通讯的延长将会不断地被扩大。另外网络协议的多次握手的方式,诸如此类的开销会导致训练无法有效利用带宽。

总体而言,通讯过程中,需要综合考虑数据参数量、计算量、计算类型、数据样本量、集群带宽拓扑和通讯策略等不同的因素,才能设计出性能较优的切分策略,最大化利用通讯效率,提高通讯比。

性能墙

性能墙呢主要是指计算资源利用率的问题。随着大模型的提出,对算力需求更加迫切,理论上在4K的集群上每块卡快1分钟,总体就快了68个小时。大模型会增加对算力的需求,但是随着大模型引入各项分布式并行技术的同时,会降低计算资源的利用率。

计算效率在MMlab的贴总结得非常好,我们同样从底至上分为算子层(Operator Level)、图层(Graph Level)和任务层(Task Level)三个方面。

**算子层(Operator Level)**

在Operator Level的问题大模型和普通模型遇到的问题都是类似,主要是指对算子级别的优化。

1)其中比较突出的问题是模型小算子过多,可以通过算子融合进行优化,例如对Conv+Bn+Act三个算子进行融合成一个大算子。但是还有很多算子融合策略无法穷举,如何通过计算编译技术,对小算子进行融合。

2)第二点就是算子实现不够高效,类似于卷积CONV算子针对2x2和3x3 Kernel大小的使用Winograd算法代替。可是这种算法是人为提出了,更多的高效Kernel算子,如何利用编译技术,去寻找最好的多线程并行计算。

3)最后一点就是内存局部性差,对算子和内存的开销进行分析,可以对计算时算子输出有相同的shape进行复用。

**图层(Graph Level)**

Graph Level指如何对计算图进行优化,进而加速大规模训练。

一般而言,如果没有遇到控制流和大模型,一个模型只有一个图。但是当遇到大模型的时候,由于一块AI芯片的内存没办法满足大模型的内存需求,因此需要对算子和模型进行切分。这时候涉及两方面的问题。

1)如何搜索和切分处计算效率更高的子图,分配到不同的机器上进行计算。

2)数据在通讯和内存之间如何增加overlay重叠部分,提高单卡整体的计算率。

**任务层Task Level**

大集群大模型的分布式混合了各种并行训练策略,在任务层级,性能的瓶颈从计算转移到了通信,如何降低通信量,缩减通信域规模,尽可能把通信时延隐藏在计算中,是大规模训练的核心关注点。

大规模训练技术中,不仅要求AI芯片的计算性能足够强悍,同时也依赖于AI框架的大规模分布式训练的运行和调度效率,以及在分布式并行等各种优化手段的权衡。

调优墙

在数千节点的集群上进行模型开发,听到就头皮发麻。我平时把EffectNet网络模型魔改,还不一定能够收敛,调一次参数再训练一次,单机多卡一个星期就过去了。那要是大模型训练了1个月遇到Loss跑飞了怎么办?

所以在数千节点的集群上,需要考虑到提升算法工程师分布式调试调优的效率,另外还要考虑降低工程师对大模型进行并行切分的难度。除了对人的考虑,还要对硬件集群的管理,需要保证计算的正确性、性能、可用性。要是有一台机器坏了,如何快速恢复训练中的参数。

总结一句话,大模型训练考验的是算法、数据、框架、资源调度等全栈和全流程的综合能力。希望MindSpore能够在大模型引领业界。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。