流水线并行水平划分模型,即按照层对模型进行划分;张量并行则是垂直划分模型。
再好好理解激活和梯度!
梯度数目一般是等于参数数目的(除了梯度重新参数化那些!!)
注意激活值等也是要保存的!:存储wb,激活值,梯度,以及adam等,还有一些零时信息
3d并行的一个解释:这个很不错
更多的理解:ok
提到了tf的一些策略和异步方法:做个了结
1.zero系列就是特殊的数据并行啊,感觉和其它3d并行不矛盾啊,但是通信可能比较多;2.但是对于tp很疑惑,这个是怎么实现呢,可以全部跑一遍(如果分开存在小的气泡且要通信,全跑存在浪费但是减少通信);3.zero2之后,后向过程中通信增加,就是梯度那个环境,假设是同步跨卡交互,zero还要allreduce,bloom也测试确实效率下降较多!
好好理解参数量,一共是3份,mv这两个默认是0,不需要传递!!另外正常情况下,要传递的只有梯度!!权重,优化器情况是不用管的,而且是先计算完,最后再同步,之后同步后调用更新!
激活值开启混合精度也是fp16的!
deepspead使用的一些技巧:标记,需要测试
使用方法补充:ok,需要重点标记
官网:标记
zero说明:这个文章解释的很不错
zero2补充:这个是可以使用cpu或gpu处理交互数据的!
非常不错,图很好!还有一堆知识: 重点!!
1.分析zero1:优化器不需要同步,如果一张卡一层这种,如果是不全的话,是需要同步的!是要按照层划分的;2.zero1后向通信不变,前向必须通信啊!不然w怎么同步呢?
horovod说明:这个也是一个并行库,uber开源的,相关安装方法,比较麻烦,需要自己配置对应的通信库(默认是基于mpi的)、gpu支持 信息很全面!
horovod代码细节:重点标记
mpi+nccl组成
对于ddp方法,每一个gpu一个进程(确实观察到了这个现象)
目前好像torch.distributed.launch已经建议废除,使用torchrun
ddp的代码细节: 大佬非常厉害
ddp相关的一些说明:这个比较全面
gpu用nccl,cpu用gloo一般
对比说明:先就用ddp自带的,那个找别的机器测试一下
常用的通信库:openmpi(2009,没有考虑节点延迟,带宽不同的问题),nccl(2015还不支持,2017之后支持多节点),gloo,加油一个阿里巴巴的accl(基于Having-Doubling,做了拓扑,但是会变换节点链接)
allreduce有很多种方法,很多种代码!
经典架构是ps
α + S / B + S * C 通信时间包括:节点通信第一项,数据/带宽第二项,数据计算时间第三项
1.ps:2*(α + S/B) + NSC,主节点带宽非常容易成为瓶颈
2.树状算法:2*(log2k+1)次通信,如果是2n次,没有1 ,整理耗时 2*log2N(α + S/B + S*C )*
3.蝴蝶算法:全部通信,log2N*(α + S/B + S*C )
4.环状通信:*2*(N-1)[α+S/(NB)] + (N-1)[(S/N)C]
非常全面:这个文章写的很好,而且给出了相关的可能时间,重点标记!
ring-allreduce 最早是百度的文章
allreduce原理:可以看一下百度的文章
accl说明:暂时没有看,标记一下,优化了环形通信的节点太多时延问题
还有异步相关的:这个看到的不多
有个很好奇的,allreduce比如2*8情况,是16节点还是8节点2个主通信?
第一个是2(16-1)=30
第二个是2(8-1)+1+7=22
上面3种的补充:仔细研究