# 使能图算融合¶

Linux Ascend GPU 模型调优 中级 高级

## 概述¶

• 对网络执行时间具有较高性能要求的场景；

• 通过拼接基本算子实现自定义组合算子，并希望对这些基本算子进行自动融合，以提升自定义组合算子性能的场景。

## 使用方法¶

from mindspore import context
context.set_context(enable_graph_kernel=True)


### 样例脚本¶

import numpy as np
import mindspore.context as context
from mindspore import Tensor
from mindspore.nn import Cell
import mindspore.ops as ops

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

class MyNet(Cell):
def __init__(self):
super(MyNet, self).__init__()
self.mul = ops.Mul()

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

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


result: [[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]]


## 自定义组合算子¶

1. 在脚本中用基本算子组合的方式实现自定义算子定义和使用；

2. 打开图算融合配置；

3. 图算融合对自定义组合算子中的基本算子自动进行算子融合，并生成高性能融合算子。

### 样例脚本¶

import numpy as np
import mindspore.context as context
from mindspore import Tensor
from mindspore.nn import Cell
import mindspore.ops as ops

context.set_context(mode=context.GRAPH_MODE, device_target="GPU")
# enable graph kernel optimization.
context.set_context(enable_graph_kernel=True)

class MyOp(Cell):
""" my first custom OP composited by basic OPs """
def __init__(self):
super(MyOp, self).__init__()
self.sub = ops.Sub()
self.mul = ops.Mul()

def construct(self, x, y):
a = self.sub(x, y)
return self.mul(a, x)

class MyNet(Cell):
def __init__(self):
super(MyNet, self).__init__()
self.mul = ops.Mul()
self.pow = ops.Pow()
self.my_op = MyOp()

def construct(self, x, y):
a = self.mul(x, 2.0)
b = self.pow(a, 3.0)
res = self.my_op(b, y)
return res

x = np.ones((4, 4)).astype(np.float32) * 0.2
y = np.ones((4, 4)).astype(np.float32) * 0.3
net = MyNet()
result = net(Tensor(x), Tensor(y))
print("result: {}".format(result))


result: [[-0.015104 -0.015104 -0.015104 -0.015104]
[-0.015104 -0.015104 -0.015104 -0.015104]
[-0.015104 -0.015104 -0.015104 -0.015104]
[-0.015104 -0.015104 -0.015104 -0.015104]]