下载
中文
注册

计算通信并行优化

背景与挑战

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

解决方案

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

Python脚本层面实现

通过进一步分割张量(分为2/4/8个子张量),借助Python脚本机制,实现各子张量间计算与通信的并行处理,尤其适用于Attention模块与MLP模块的串行执行场景。需注意,此方法对Matmul左侧矩阵的m轴尺寸有特定要求,须为分割数的整数倍;且在计算与通信片段耗时差异较大或矩阵分割数量过多时,可能遭遇主机瓶颈,影响预期性能提升。

融合算子实现

依托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中间结果)。

使用场景

计算与通信并行优化技术适用于Attention模块与MLP(Multi-Layer Perceptron,多层感知器)模块的串行执行,特别是在计算通信存在顺序依赖与位置毗邻的条件下。

使用方法

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

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

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

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

  • Python脚本使能
    --use-ascend-coc
    --coc-parallel-num   N    # 指定张量分割的数量,N可选 2 /4 /8
  • 融合算子使能
    融合算子使能要求安装ATB(Ascend Transformer Boost),请参考软件安装完成安装。
    --use-ascend-coc
    --coc-fused-kernel    # 截至当前版本,专精于支持TP(Tensor Parallelism)配置为8的特定场景
  • 融合算子的环境变量拥有更高优先级,即当“ coc-parallel-num”配值大于1且使能“coc-fused-kernel”时,前者“ coc-parallel-num”不会生效。
  • 鉴于机制层面的潜在冲突,计算通信并行优化与TP重计算通信优化特性目前无法同时启用。建议用户依据实际工作负载与性能需求,独立选用上述任一特性进行配置,以确保最佳的运行状态与资源利用效率。

使用效果

采用CoC融合算子优化后,在BLOOM 7B、BLOOM 176B与LLAMA2 70B模型的训练中,分别实现了端到端性能提升约3.20%、5.47%与7.85%。精度相对误差控制在±2%范围内,确保了模型训练的准确性。