Matmul_Add融合优化

背景与挑战

模型训练中开启了梯度累加功能,但累加效率较慢,梯度累加中的Add算子占比较高。

解决方案

MindSpeed将matmul操作和add操作合并成一个融合算子。该融合算子的详细接口与使用说明请参见融合算子API清单中的npu_matmul_add_fp32接口。

使用场景

LLaMA及GPT大模型均可使用。

使用方法

融合算子使能要求安装ATB(Ascend Transformer Boost),请参考软件安装完成安装。

去掉--no-gradient-accumulation-fusion即可调用Matmul_Add融合算子。

  • npu_matmul_add_fp32暂不支持MFU(Model FLOPS Utilization,模型算力利用率)统计。
  • 融合算子与小算子之间存在一定的精度差异。

    精度差异的根本原因:

    小算子matmul操作结束后,会先将得到的结果进行降精度(由fp32到bf16)再升精度(由bf16到fp32)最后进行add操作,这种先降再升的操作会损失一部分精度,而融合算子会跳过这一操作直接进行累加,故精度上存在差异。

    具体变化过程如下:

    • 小算子dtype变化过程:bf16*bf16=fp32->bf16->fp32+fp32=fp32
    • 融合算子dtype变化过程:bf16*bf16=fp32+fp32=fp32

使用效果

在内存没有完全使用或占满的情况下,开启Matmul_Add融合算子,模型训练的性能将得到提升,在LLaMA2-7B模型下,性能增益约2%。