(1)首先要了解有哪些并行的种类。
(a)数据并行
(b)层内模型并行,这里有Fully Connected模型并行,Group Convolution并行等等。
(c)层间模型并行,这里包括一些流水线并行,,手动checkpoint和GPipe的知识。
(2) 常见的通信算子
首先要知道,集合通讯(Collective communication)有一对多,多对多。还有点对点通信,Point-to-Point通信。这些通信算子都是求导完备的通信算子。
a. broadcast, one sender, multiple receiver。
b. reduce,combine data from all senders。
c. all-reduce, Combine data from senders, deliver the result to all participant.
d. gather, multiple sender, one receiver
e. all-gather,gather messages from all, deliver messages to all participants.
f. all-to-all, a transpose. internal implementation is complex. 原本是数据切分,现在可以编成模型切分。
g. scatter, inverse to gather.
h. all scatter.
(3)介绍一下简单参数并行。
首先,数据并行就是,模型复制多次,拆分数据。现在的简单参数并行就是拆分模型,在需要进行线性操作之前,用all-gather收集信息。在反向传播之前进行一次reduce-scatter。
数据并行和模型并行的区别。数据并行在进行操作的时候(只针对前向来说),是不需要通信的。比如矩阵乘可以一直往前面走,而模型并行需要一次all-gather。
层内模型并行。
如何实现由模型并行到数据并行的转换呢?就是一个比较重要的算子的功能了。all-to-all。all-to-all配合上all-gather就可以实现模型的各种并行操作了。
场景一:
Fully Connected模型并行。在人脸场景下,由于feature只有1k左右,但是由于人的id众多,可能到几百万,所以最后一层模型就上G。为了handle这种情况,肯定是要模型并行的。如果觉得之后比较难算loss,可以进行一次all-to-all,但是实际上是不需要的,这里涉及到一个softmax函数的性质(我不会)。
场景二:
group convolution:
组卷积,其实只需要一次通讯,所以可以判一次开头和结尾。
流水线并行(Pipeline Parallelism)
由于在原来的流水线中,只有等上一块卡做完之后,下一块卡才能开始工作,这显然是不怎么科学。所以就可以把数据拆一拆,算一个部分之后,立马交给下一张卡去进行计算。
手动checkpoint与Gpipe。
在流水线并行的这个过程当中,由于在反向传播的时候可能需要保留中间结果,这意味着更多的显存占用。所以可以设计一个策略,在需要进行反向传播的时候,我们再重新进行一次前向传播。