# MindSpore 图算融合 GPU调试

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): Ascend/GPU

软件环境: MindSpore 版本: 2.2.10

执行模式（静态图/动态图）： 不限

Python 版本: 3.8

操作系统平台: linux

**2. 图算融合**

2.1 图算融合描述

图算融合简单地说就是将几个算子合并成一个复合粒度算子，以提升性能。

基本算子的组合理论上可以表达任何现有计算图，但是复合算子有更好的通用组合表达能力，

为了兼顾这两样，mindspore提供了图算融合能力，打破算子边界。

图算融合可以通过自动分析和优化现有网络计算图逻辑，并结合目标硬件能力，

对计算图进行计算化简和替代、算子拆分和融合、算子特例化编译等优化，以提升设备计算资源利用率，实现对网络性能的整体优化。

图算融合是通过ms.set\_context\(enable\_graph\_kernel=True\)开启的，也可以通过（graph\_kernel\_flags：图算融合的优化选项）来控制，

当与enable\_graph\_kernel冲突时，它的优先级更高，但是graph\_kernel\_flags更适用于有经验的用户。

2.2 图算融合的开启方式

1. ms.set\_context\(enable\_graph\_kernel=True\)

2. ms.set\_context\(graph\_kernel\_flags="--opt\_level=2 --dump\_as\_text"\)

opt\_level：设置优化级别。默认值：2。当opt\_level的值大于0时，启动图算融合。可选值包括：

0：关闭图算融合。

1：启动算子的基本融合。

2：包括级别1的所有优化，并打开更多的优化，如CSE优化算法、算术简化等。

3：包括级别2的所有优化，并打开更多的优化，如SitchingFusion、ParallelFusion等。在某些场景下，该级别的优化激进且不稳定。使用此级别时要小心。

**3. 图算融合支持的后端和模式**

Ascend/GPU

GRAPH\_MODE/PYNATIVE\_MODE

**4. 运行脚本及结果分析**

使能图算融合

```
import numpy as np
import mindspore as ms
from mindspore.nn import Cell
import mindspore.ops as ops

ms.set_context(mode=ms.GRAPH_MODE, device_target="GPU")
# save graph ir to view fusion detail.
ms.set_context(save_graphs=2)
# enable graph kernel optimization.
ms.set_context(enable_graph_kernel=True)

class MyNet(Cell):
    def construct(self, x):
        a = ops.mul(x, 2.0)
        res = ops.add(a, 1.0)
        return res

x = np.ones((4, 4)).astype(np.float32) * 0.5
net = MyNet()
result = net(ms.Tensor(x))
print("result: {}".format(result))
```

![](figures/zh-cn_image_0000002143524765.png)

执行完成后，Mul+Add融合成一个算子，所以akg\_kernel\_meta里面生成了这个算子的json及其他文件。

![](figures/zh-cn_image_0000002143524857.png)

ir图里面也可以看出算子融合了。

关闭算子融合

```
    import numpy as np
    import mindspore as ms
    from mindspore.nn import Cell
    import mindspore.ops as ops

    ms.set_context(mode=ms.GRAPH_MODE, device_target="GPU")
    # save graph ir to view fusion detail.
    ms.set_context(save_graphs=2)
    # enable graph kernel optimization.
    ms.set_context(enable_graph_kernel=False)

    class MyNet(Cell):
        def construct(self, x):
            a = ops.mul(x, 2.0)
            res = ops.add(a, 1.0)
            return res

    x = np.ones((4, 4)).astype(np.float32) * 0.5
    net = MyNet()
    result = net(ms.Tensor(x))
    print("result: {}".format(result))
```

执行完成后，Mul+Add未融合成一个算子，所以akg\_kernel\_meta不存在。开启图算融合，不仅可以让基本算子进行融合，也可以让自定义算子进行融合，自定义算子与基本算子进行融合。

