跳到主要内容

2D 张量并行

作者: Zhengda Bian, Yongbin Li

前置教程

示例代码

相关论文

引言

1D张量并行没有对 activations 进行划分,就大规模模型而言,这也会消耗大量的内存。 为了平均分配计算和内存负荷,在 SUMMA(可扩展的通用矩阵乘法算法)的基础上, 2D张量并行 被引入。

我们还是以线性层 Y=XAY = XA 为例。 给定 P=q×qP=q\times q 个处理器(必要条件), 如 q=2q=2, 我们把输入 XX 和权重A AA 都划分为

[X00X01X10X11] and [A00A01A10A11].\left[\begin{matrix} X_{00} & X_{01} \\ X_{10} & X_{11} \end{matrix} \right] \text{~and~} \left[\begin{matrix} A_{00} & A_{01} \\ A_{10} & A_{11} \end{matrix} \right].

该计算包括 qq 步。 当 t=1t=1 时, Xi0X_{i0} 在其行中被广播, 而 A0jA_{0j} 在其列中被广播。因此,我们有

[X00,A00X00,A01X10,A00X10,A01].\left[\begin{matrix} X_{00},A_{00} & X_{00},A_{01} \\ X_{10},A_{00} & X_{10},A_{01} \end{matrix} \right].

然后我们在每个处理器 (i,j)(i, j) 上将 Xi0X_{i0}A0jA_{0j} 相乘为

[X00A00X00A01X10A00X10A01](1).\left[\begin{matrix} X_{00}A_{00} & X_{00}A_{01} \\ X_{10}A_{00} & X_{10}A_{01} \end{matrix} \right] (1).

同样,当 t=2t=2 时, Xi1X_{i1} 在其行中被广播, A1jA_{1j} 在其列中被广播, 我们将它们相乘为

[X01A10X01A11X11A10X11A11](2).\left[\begin{matrix} X_{01}A_{10} & X_{01}A_{11} \\ X_{11}A_{10} & X_{11}A_{11} \end{matrix} \right] (2).

通过将 (1)(1)(2)(2) 相加,我们有

Y=XA=[X00A00+X01A10X00A01+X01A11X10A00+X11A10X10A01+X11A11].Y = XA = \left[\begin{matrix} X_{00}A_{00}+X_{01}A_{10} & X_{00}A_{01}+X_{01}A_{11} \\ X_{10}A_{00}+X_{11}A_{10} & X_{10}A_{01}+X_{11}A_{11} \end{matrix} \right].

效率

给定 P=q×qP=q\times q 个处理器, 我们展现理论上的计算和内存成本,以及基于环形算法的2D张量并行的前向和后向的通信成本。

计算内存 (参数)内存 (activations)通信 (带宽)通信 (时延)
O(1/q2)O(1/q^2)O(1/q2)O(1/q^2)O(1/q2)O(1/q^2)O(6(q1)/q)O(6(q-1)/q)O(6(q1))O(6(q-1))

使用

ColossalAI的最新版本还暂不支持2D张量并行,但2D张量并行的功能会在未来的版本被集成入Shardformer中。关于Shardformer的原理和用法细节请参考当前目录下的Shardformer文档。

对于老版本ColossalAI的用户,2D张量并行的用法请参考ColossalAI-Examples - 2D Tensor Parallelism