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

**前反向计算的性能优化**

自动性能调优工具

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](https://www.mindspore.cn/docs/zh-CN/r2.0/api_python/amp/mindspore.amp.auto_mixed_precision.html?&highlight=amp_level)

**去除冗余算子**

· 存在转换算子过多（TransData、Cast类算子）且耗时明显时，如果是用户手动加入的算子，可分析其必要性，如果对精度没有影响，可去掉冗余的Cast、TransData算子；

· 如果是MindSpore自动生成的转换算子过多，可能是MindSpore框架针对某些特殊情况没有充分优化，请到[MindSpore社区](https://gitee.com/mindspore/mindspore/issues)反馈。

**优化算子并行度**

· 去除循环依赖

· 小算子组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)
```

