计算通信并行优化

背景与挑战

在大模型训练中,ColumnParallelLinear和RowParallelLinear组件的前向与反向传播阶段常包含紧密耦合的计算与通信序列,其中计算环节主要涉及矩阵乘法(Matmul),而通信则依赖于AllReduce(在未启用序列并行时)或AllGather与ReduceScatter(在序列并行模式下)。由于这些操作间的顺序依赖性,它们往往被串行执行,导致计算与通信流程中存在空闲等待时间,进而影响整体执行效率。

解决方案

为克服上述局限,我们提出了一套计算与通信并行优化方案(Communication Over Computation,简称CoC),旨在通过将计算与通信任务细化为更小粒度的子任务,实现两者的流水线式并发执行,从而最大化资源利用率与执行效率。

Python脚本层面实现

通过进一步分割张量(分为2/4/8个子张量),借助Python脚本机制,实现各子张量间计算与通信的并行处理,尤其适用于Attention模块与MLP模块的串行执行场景。

  • 要求:对于Python脚本侧实现,Matmul左矩阵的m轴尺寸需为2、4或8的倍数。这是因为切分后的矩阵块需要能够在多个处理器或设备之间均匀分布,以确保负载平衡。
  • 限制:该方法不适用于计算与通信片段耗时相差较大的情况。如果两者的时间消耗差异显著,可能会导致某些进程等待其他较慢的操作完成,从而抵消了并行化的收益。
  • 注意事项:当切分数较大时,可能会遇到host bound问题(即CPU成为瓶颈),这会阻碍预期性能提升的实现。因此,在设计分割策略时,必须考虑到这一点,避免过度细分任务。

融合算子实现

依托MTE(Memory Transfer Engine,内存传输引擎)远程内存访问能力,以融合大Kernel的形式,内部细化计算与通信任务,实现两者的流水线并行执行。目前支持以下融合算子:
  • MATMUL_ALL_REDUCE融合算子(先计算后通信)及其确定性计算。

    量化场景下,MATMUL_ALL_REDUCE融合算子支持fp16格式下的w8A16伪量化,粒度包括per tensor、per channel与per group。

  • MATMUL_REDUCE_SCATTER融合算子(先计算后通信)及其确定性计算。
  • ALL_GATHER_MATMUL及ALL_GATHER_MATMUL_V2融合算子(先通信后计算,V2版本支持获取ALL_GATHER中间结果)。

使用场景

此外,还提供是先通信还是先计算的灵活设置,这取决于具体的应用需求和模型结构。

使用方法

计算通信并行优化算法通过在训练脚本中配置环境变量来进行使能。

当前计算通信并行有两种实现方法:Python脚本使能和融合算子使能,两者选其一即可。两种方式都需要替换原Megatron框架中的ColumnParallelLinear和RowParallelLinear这两个class的forward函数,替换脚本已经根据MindSpeed指定Megatron版本进行编码和适配,位于“mindspeed/core/tensor_parallel/lcal_coc/”目录下。

计算与通信并行优化功能在MindSpeed框架内的启用,主要通过训练脚本中的环境变量配置实现,需预先安装MindSpeed。

当前,该优化提供两种实现途径即Python脚本使能与融合算子使能。根据具体需求,用户可选择以下任意一种配置方式:

  • 融合算子的环境变量拥有更高优先级,即当“ coc-parallel-num”配置值大于1且使能“coc-fused-kernel”时,前者“ coc-parallel-num”不会生效。
  • 暂不兼容--use-ascend-mc2特性 。
  • 暂未适配MoE模型。

使用效果

根据实际测试数据,采用计算通信并行优化能够带来显著的性能改进,例如对于LLaMA2-70B模型,性能提升约5%以上。