摘要:当初的模型以及其参数更加简单,仅仅一两张的卡曾经无奈满足现如今训练规模的要求,分布式训练应运而生。
本文分享自华为云社区《分布式训练 Allreduce 算法》,原文作者:我抽签必中。
当初的模型以及其参数更加简单,仅仅一两张的卡曾经无奈满足现如今训练规模的要求,分布式训练应运而生。
分布式训练是怎么的?为什么要应用 Allreduce 算法?分布式训练又是如何进行通信的?本文就带你理解大模型训练所必须的分布式训练 Allreduce 算法。
通信概念
咱们了解计算机的算法都是基于一个一个函数操作组合在一起失去的,那么咱们在解说分布式算法之前,咱们必须先理解一下组成这种算法所利用于硬件的函数操作——汇合通信的基本概念,
Broadcast(播送):将根服务器 (Root Rank) 上的数据散发播送给所有其余服务器(Rank)
如图所示,当一台服务器计算实现了本人局部的参数数据,在分布式训练中想要把本人这部分数据同时发送给其余所有服务器,那么这种操作形式就叫做播送(broadcast)。
Scatter(散射):将根服务器上的数据散射为等同大小的数据块,每一个其余服务器失去一个数据块
如图所示,当一台服务器计算实现本人局部的参数数据,然而因为有时候服务器上全副的参数数据过大,于是咱们想要把这台服务器上的数据切分成几个等同大小的数据块 (buffer),再依照序列(rank index) 向其余服务器发送其中的一个数据块,这就叫做散射(Scatter)。
Gather(汇集):将其余服务器上的数据块间接拼接到一起,根服务器 (Root Rank) 获取这些数据
如图所示,当服务器都做了散射之后,每个服务器取得了其余服务器的一个数据块,咱们将一台服务器取得的数据块拼接在一起的操作就叫做汇集(Gather)。
AllGather(全汇集):所有的服务器都做上述 Gather 的操作,于是所有服务器都取得了全副服务器上的数据
如图所示,所有的服务器都将本人收到的数据块拼接在一起(都做汇集的操作),那么就是全汇集(AllGather)。
Reduce(规约):对所有服务器上的数据做一个规约操作(如最大值、求和),再将数据写入根服务器
如图所示,当所有服务器都做播送或散射的时候,咱们作为接管方的服务器收到各服务器发来的数据,咱们将这些收到的数据进行某种规约的操作(常见如求和,求最大值)后再存入本人服务器内存中,那么这就叫规约(Reduce)
AllReduce(全规约):对所有服务器上的数据做一个规约操作(如最大值、求和),再将数据写入根服务器
如图所示,同样每一个服务器都实现上述的规约操作,那么就是全规约(Allreduce)。这也就是分布式训练最根底的框架,将所有的数据通过规约操作集成到各个服务器中,各个服务器也就取得了完全一致的、蕴含本来所有服务器上计算参数的规约数据。
ReduceScatter(散射规约):服务器将本人的数据分为等同大小的数据块,每个服务器将依据 index 失去的数据做一个规约操作即,即先做 Scatter 再做 Reduce。
概念中,咱们也经常遇到散射规约(ReduceScatter)这样的名词,简略来讲,就是先做散射(Scatter),将服务器中数据切分成等同大小的数据块,再依照序列(Rank Index),每一个服务器所取得的参数数据做规约(Reduce)。这就相似于全汇集,只不过咱们将数据不是简略拼接到一起而是做了规约操作(求和或最大值等操作)。
了解各种硬件测的基本概念当前,咱们对于分布式训练也应该有有一些了解了,即是分布式通过切分训练数据,让每一台服务器计算他所属的 min-batch 数据,再通过上述的 reduce 等操作进行同步,从而使得每个服务器上的参数数据都是雷同的。
分布式通信算法
Parameter Server(PS)算法:根服务器将数据分成 N 份分到各个服务器上(Scatter),每个服务器负责本人的那一份 mini-batch 的训练,失去梯度参数 grad 后,返回给根服务器上做累积(Reduce),失去更新的权重参数后,再播送给各个卡(broadcast)。
这是最后的分布式通信框架,也是在几卡的较小规模的训练时,一种罕用的办法,然而不言而喻的当规模变大模型上则会呈现重大问题:
- 每一轮的训练迭代都须要所有卡都将数据同步完做一次 Reduce 才算完结,并行的卡很多的时候,木桶效应就会很重大,一旦有一张卡速度较慢会拖慢整个集群的速度,计算效率低。
- Reducer 服务器工作过重,成为瓶颈,所有的节点须要和 Reducer 进行数据、梯度和参数的通信,当模型较大或者数据较大的时候,通信开销很大,根节点收到巨量的数据,从而造成瓶颈。
Halving and doubling(HD)算法:服务器间两两通信,每步服务器都能够取得对方所有的数据,从而一直进行,使得所有服务器全副数据。
这种算法躲避了单节点瓶颈的问题,同时每个节点都将它的发送、承受带宽都使用起来,是目前极大大规模通信罕用的形式,然而它也有着它的问题,即是在最初步数中会有大量数据传递,使得速度变慢。
如果 服务器数为非二次幂 的状况下,如下图 13 台服务器,多出的 5 台会在之前与之后做单向全副数据的通信,其余服务器依照二次幂 HD 的形式进行通信,详情请参考 Rabenseifner R. 的 Optimization of Collective Reduction Operations 论文。然而在实用场景下,最初是将 HD 计算后含有所有参数数据的最大块的数据间接粗犷地向多进去的那几台服务器发送,导致这步的通信工夫占比极大。
Ring 算法:以环形相连,每张卡都有左手卡和右手卡,一个负责接管,一个负责发送,循环实现梯度累积,再循环做参数同步。分为 Scatter Reduce 和 All Gather 两个环节。
更为具体的图解
Ring 算法在中等规模的运算中十分有劣势,较小的传输数据量,无瓶颈,带宽齐全利用起来。
毛病则是在大型规模集群运算中,微小的服务器内数据,极长的 Ring 环,Ring 的这种切分数据块的形式就不再占优势。
参考:
- http://research.baidu.com/bri…
- https://docs.nvidia.com/deepl…
- https://zhuanlan.zhihu.com/p/…
- Rabenseifner R. (2004) Optimization of Collective Reduction Operations. In: Bubak M., van Albada G.D., Sloot P.M.A., Dongarra J. (eds) Computational Science – ICCS 2004. ICCS 2004. Lecture Notes in Computer Science, vol 3036. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3…
点击关注,第一工夫理解华为云陈腐技术~