在大模型训练中,ColumnParallelLinear和RowParallelLinear组件的前向与反向传播阶段常包含紧密耦合的计算与通信序列,其中计算环节主要涉及矩阵乘法(Matmul),而通信则依赖于AllReduce(在未启用序列并行时)或AllGather与ReduceScatter(在序列并行模式下)。由于这些操作间的顺序依赖性,它们往往被串行执行,导致计算与通信流程中存在空闲等待时间,进而影响整体执行效率。
为克服上述局限,我们提出了一套计算与通信并行优化方案(Communication Over Computation,简称CoC),旨在通过将计算与通信任务细化为更小粒度的子任务,实现两者的流水线式并发执行,从而最大化资源利用率与执行效率。
Python脚本层面实现
通过进一步分割张量(分为2/4/8个子张量),借助Python脚本机制,实现各子张量间计算与通信的并行处理,尤其适用于Attention模块与MLP模块的串行执行场景。
融合算子实现
量化场景下,MATMUL_ALL_REDUCE融合算子支持fp16格式下的w8A16伪量化,粒度包括per tensor、per channel与per group。
该特性主要用于训练场景,特别适合注意力Attention模块和MLP(Multi-Layer Perceptron,多层感知机)模块以串行方式执行的情况。当计算与通信存在顺序依赖,并且这些操作在模型架构中位置毗邻时,可以利用此特性进行优化。
此外,还提供是先通信还是先计算的灵活设置,这取决于具体的应用需求和模型结构。
计算通信并行优化算法通过在训练脚本中配置环境变量来进行使能。
当前计算通信并行有两种实现方法:Python脚本使能和融合算子使能,两者选其一即可。两种方式都需要替换原Megatron框架中的ColumnParallelLinear和RowParallelLinear这两个class的forward函数,替换脚本已经根据MindSpeed指定Megatron版本进行编码和适配,位于“mindspeed/core/tensor_parallel/lcal_coc/”目录下。
计算与通信并行优化功能在MindSpeed框架内的启用,主要通过训练脚本中的环境变量配置实现,需预先安装MindSpeed。
当前,该优化提供两种实现途径即Python脚本使能与融合算子使能。根据具体需求,用户可选择以下任意一种配置方式:
--use-ascend-coc --coc-parallel-num N # 指定张量分割的数量,N可选 2 /4 /8
--use-ascend-coc --coc-fused-kernel # 当前仅支持TP(Tensor Parallelism)配置为8的特定场景
根据实际测试数据,采用计算通信并行优化能够带来显著的性能改进,例如对于LLaMA2-70B模型,性能提升约5%以上。