AllToAll通信为什么用于EP并行?
1 AllToAll通信原理
首先要明白ALLTOALL通信是做了什么事情。
假设我们有3个进程(A、B、C),每个进程都有三段数据,分别是a1, a2, a3;b1, b2, b3;c1, c2, c3。
进程A想发送:a1到进程A自己,a2到进程B,a3到进程C。
进程B想发送:b1到进程A,b2到进程B自己,b3到进程C。
进程C想发送:c1到进程A,c2到进程B,c3到进程C自己。
在执行AlltoAll操作后:
进程A会拥有:a1(自己的),b1(从B接收的),c1(从C接收的)。
进程B会拥有:a2(从A接收的),b2(自己的),c2(从C接收的)。
进程C会拥有:a3(从A接收的),b3(从B接收的),c3(自己的)。
这样,通过AlltoAll通信,每个进程都能得到来自其他进程的数据,同时也分享了自己的数据。
用矩阵表示就是:
用一句话描述:将进程 i 的发送缓冲区中的第 j 块数据发送给进程 j,进程 j 将接收到的来 自进程 i 的数据块放在自身接收缓冲区的第 i 块位置。
也可以参考小编的另外一篇文章:
https://zhuanlan.zhihu.com/p/717814079
2 什么是EP并行?
EP并行一般使用在MOE层,先了解下什么是MOE。
2.1 MOE
- 将FFN分为多个,每个称为一个专家
- 引入route,负责分发token到不同的专家
- 每个token只有部分专家参与计算,从而极大减少计算量,但是维持效果
每个FFN都是一个专家,不同的专家可能在不同的卡上。
假设当前有4个专家,1个token经过Router分发后,会形成类似index的排序结构[1,3],表示当前的token会给专家1处理和专家3处理。
2.1 EP并行
结合如下的图具体分析。
- 图中的DP=2,EP=2
- 每个DP域内,有TP并行,并且开了sp并行(为了与TP联合使用)
- 经过Route后,会进行数据重排,以便选择合适的专家;
- 黄色的部分,表示要给EP1计算;蓝色的部分表示要给EP2计算;
- 将需要给EP1计算的数据收集起来放在一起;将需要给EP2计算的数据收集起来放在一起(这里就是引入AllToAll的关键)
- 然后经过FFN的计算。
- 计算完成之后,再将数据发送回各自的DP域。
3 AlltoAll通信为什么用于EP并行?
通过上述的第5步就是问题的回答。