深度学习框架中的并行

深度学习框架中的分布式通信算子和并行训练

(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。

在流水线并行的这个过程当中,由于在反向传播的时候可能需要保留中间结果,这意味着更多的显存占用。所以可以设计一个策略,在需要进行反向传播的时候,我们再重新进行一次前向传播。

上一篇:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)


下一篇:tf.gather,tf.gather_nd,tf.boolean_mask