大模型前反向计算的性能优化

前反向计算的性能优化

自动性能调优工具

AOE(ascend optimization engine) 是一款专门为DaVinci平台打造的计算图性能自动调优工具,可通过增加参数:context.set_context(auto_tune_mode=“RL,GA”)使能。

网络转混合精度

1、在不影响精度的前提下,将float32类型修改为float16类型:net.to_float(mstype.float16)

2、可设置amp_level=“O2”来设置混合精度,进行性能优化。aml_level具体介绍可参考:设置amp_level

去除冗余算子

  • 存在转换算子过多(TransData、Cast类算子)且耗时明显时,如果是用户手动加入的算子,可分析其必要性,如果对精度没有影响,可去掉冗余的Cast、TransData算子;
  • 如果是MindSpore自动生成的转换算子过多,可能是MindSpore框架针对某些特殊情况没有充分优化,请到MindSpore社区反馈。

优化算子并行度

  • 去除循环依赖
  • 小算子组batch

TOP算子的性能优化

  • mindinsight解析后,可通过网页版查看训练过程中各算子的耗时情况,重点关注耗时排名靠前的部分算子。
    如Dense,MatMul算子fp32数据类型时,性能一般都很差,需要将算子输入数据cast成fp16,再将算子输出cast回fp32。
  • 代码示例:
def __init__(self):
        super(self).__init__()
        self.matmul = ops.MatMul(transpose_b=True)
        self.cast = ops.Cast()
def construct(self):
        input_tensor = self.cast(input_tensor, ms.float16)
        output_weights = self.cast(output_weights, ms.float16)
        logits = self.matmul(input_tensor, output_weights)
        logits = self.cast(logits, ms.float32)