一、小纪要
1、这篇文章是近期大多数做分布式并行训练的 baseline之一 ;
2、这篇文章侧重点就是model parallelism,往细了说就是layer parallelism,再通俗点就是,grouped layer parallelism;
3、曾经最常用的是,data parallelism,但是随着transformer等大模型的出现,不用model parallelism基本上等于放弃研究了,所以model parallelism再次回归,然后大热。
二、提出问题
1、大多数现存的model parallel在结构上会有特定要求或改变,或者只能针对一些特殊任务;(就是会设计模型修改)
2、玩深度学习的人需要一个可靠,灵活的框架来实现model parallelism
3、模型越来越深,参数越来越多
作者给出了下,近期在CV和NLP两个领域的模型与精度的点图,就是想让我们看下,参数越多精度越高
三、解决方法
1、将网络模型的layer 分组,每一个组是一个连续的layer序列
2、将minibatch(B)划分,提出microbatch(m)概念,B = M * m(这里M 就是microbatch的个数,理论上在Gpipe文章中,应该等于pipeline的个数)
首先对“字母”进行一下说明:每个模型有层,
就代表了某些的某一层,因此对应的forward标记为
,参数标记为
;
代表了计算开销;
假设我们要把整个model划分为个部分,每个部分用
表示,其中包含了从
到
的layer;那么
对应的forward就等价于
;同理开销函数
因此,使用Gpipe就需要自定义三个东西(K,M--microbatch的个数,定义序列L)
这里可以发现,作者提出的方法,存在bubble time,,但是当
的时候这个bubble time就不用很在乎了
3、这种方式也可以和data parallelism结合,进一步增加并行规模(比如,可以每个node上多卡进行pipeline parallelism,跨node进行data parallelism)
4、re-materialization 重计算技术,因为pipeline之后,在等待反向传播的时候,需要保留每个layer,每个microbatch的activation,这部分需要很多的内存;因此可以不保存,只需要保存每个小组的output在内存中即可;反向传播的时候重新计算整个,就可以重建全部的activation;
这张图可以看出来,activation需要的内存开销是非常大的
四、其他说明3
1、继续采用基于minibatch的同步梯度反向传播,也就是在一个minibatch中的最后一个microbatch结束才计算最终的loss和开始反向传播,最后更新权重
2、注意batch norm的统计正确
3、实验