摘要:简要介绍一下akg正反向算子的注册和关联流程。

本文分享自华为云社区《AKG正反向算子注册+关联》,作者:木子_007 。

一、环境

硬件:eulerosv2r8.aarch64

mindspore:1.1

算子注册需要编译安装框架才能生效,所以默认环境中已经有了mindspore的源码,并且已经可以编译安装

二、正向算子制作及测试

这里制作一个计算向量平方的算子

正向:y = x**2

反向:y = 2*x

先介绍正向

2.1 定义正向算子

路径:mindspore/akg/python/akg/ms/cce/,创建cus_square.py

参照同级目录下计算逻辑的定义,定义向量平方的计算逻辑

"""cus_square"""
from akg.tvm.hybrid import script
from akg.ops.math import mul
import akg
def CusSquare(x):output_shape = x.shapek = output_shape[0]n = output_shape[1]@scriptdef cus_square_compute(x):y = output_tensor(output_shape, dtype=x.dtype)for i in range(k):for j in range(n):y[i, j] = x[i, j] * x[i, j]return youtput = cus_square_compute(x)attrs = {'enable_post_poly_loop_partition': False,'enable_double_buffer': False,'enable_feature_library': True,'RewriteVarTensorIdx': True}return output, attrs

然后在同级目录下的__init__.py文件中添加内容

from .cus_square import CusSquare

2.2 注册算子

到路径:mindspore/ops/_op_impl/akg/ascend,创建cus_square.py,添加如下代码

"""CusSquare op"""
from mindspore.ops.op_info_register import op_info_register, AkgAscendRegOp, DataType as DTop_info = AkgAscendRegOp("CusSquare") \.fusion_type("ELEMWISE") \.input(0, "x") \.output(0, "output") \.dtype_format(DT.F32_Default, DT.F32_Default) \.get_op_info()
@op_info_register(op_info)
def _cus_square_akg():"""CusSquare Akg register"""return

然后在同级目录的__init__.py添加如下代码

from .cus_square import _cus_square_akg

2.3 定义算子原语

到:mindspore/ops/operations,新创建一个_cus_ops.py,添加如下代码

描述算子的输入:x,输出output

infer_shape:描述输出数据的shape

infer_dtype:说明输出数据的类型

x1_shape:指的是第一个输入的shape

x1_dtype:指的是第一个输入参数的dtype

import mathfrom ..primitive import prim_attr_register, PrimitiveWithInfer
from ...common import dtype as mstype
from ..._checkparam import Validator as validator
from ..._checkparam import Relclass CusSquare(PrimitiveWithInfer):"""CusSquare"""@prim_attr_registerdef __init__(self):self.init_prim_io_names(inputs=['x'], outputs=['output'])def infer_shape(self, x1_shape):return x1_shapedef infer_dtype(self, x1_dtype):return x1_dtype

然后在同目录下的__init__.py文件中添加原语信息

from ._cus_ops import CusSquare

2.4 在ccsrc中添加算子的查询信息

在mindspore/ccsrc/backend/kernel_compiler/http://kernel_query.cc的KernelQuery函数中添加如下信息

// cus_square
const PrimitivePtr kPrimCusSquare = std::make_shared<Primitive>("CusSquare");
if (IsPrimitiveCNode(kernel_node, kPrimCusSquare)) {kernel_type = KernelType::AKG_KERNEL;
}

2.5 编译安装框架

回到mindspore根目录

bash build.sh -e ascend -j4
cd ./build/package
pip install mindspore_ascend-1.1.2-cp37-cp37m-linux_aarch64.whl --force-reinstall

2.6 测试

import numpy as np
import mindspore.nn as nn
import mindspore.context as context
from mindspore import Tensor
from mindspore.ops import operations as Pcontext.set_context(mode=context.GRAPH_MODE, device_target="Ascend")class Net(nn.Cell):def __init__(self):super(Net, self).__init__()self.square = P.CusSquare()def construct(self, data):return self.square(data)def test_net():x = np.array([[1.0, 4.0, 9.0]]).astype(np.float32)net = Net()output = net(Tensor(x))print("x: ", x)print("output: ", output)
if __name__ == "__main__":test_net()

输出

三、反向算子的制作和测试

3.1 制作流程

反向算子的计算逻辑:对向量元素进行求导,如 y = x^2,则求导之后 y` = 2x

实际例子就是输入向量[1, 4, 9] 输出就是 [2, 8, 18]

反向算子明明为CusSquareGrad,与前边的计算平方的算子流程相同,这里只贴一下关键代码,流程不再赘述

计算逻辑代码cus_square_grad.py

"""cus_square_grad"""
from akg.tvm.hybrid import script
import akgdef CusSquareGrad(x):output_shape = x.shapek = output_shape[0]n = output_shape[1]@scriptdef cus_square_compute_grad(x):y = output_tensor(output_shape, dtype=x.dtype)for i in range(k):for j in range(n):y[i, j] = x[i, j] * 2return youtput = cus_square_compute_grad(x)attrs = {'enable_post_poly_loop_partition': False,'enable_double_buffer': False,'enable_feature_library': True,'RewriteVarTensorIdx': True}return output, attrs

注册原语

class CusSquareGrad(PrimitiveWithInfer):"""CusSquareGrad"""@prim_attr_registerdef __init__(self):self.init_prim_io_names(inputs=['x'], outputs=['output'])def infer_shape(self, x1_shape):return x1_shapedef infer_dtype(self, x1_dtype):return x1_dtype  

3.2 测试

import numpy as np
import mindspore.nn as nn
import mindspore.context as context
from mindspore import Tensor
from mindspore.ops import operations as Pcontext.set_context(mode=context.GRAPH_MODE, device_target="Ascend")class Net(nn.Cell):def __init__(self):super(Net, self).__init__()self.square = P.CusSquareGrad()   # 替换为grad算子def construct(self, data):return self.square(data)def test_net():x = np.array([[1.0, 4.0, 9.0]]).astype(np.float32)net = Net()output = net(Tensor(x))print("x: ", x)print("output: ", output)
if __name__ == "__main__":test_net()

输出

四、正反向算子关联及测试

在源码 mindspore/mindspore/ops/_grad/grad_array_ops.py中添加如下代码

@bprop_getters.register(P.CusSquare)
def get_bprop_cussquare(self):"""Generate bprop of CusSquare"""cus_square_grad = P.CusSquareGrad()matmul = ops.Mul()def bprop(x, out, dout):gradient = cus_square_grad(x)dx = matmul(gradient, dout)return (dx,)return bprop

bprop函数的输入是,正向的输入x,正向的输出out,反向的梯度输入dout

上面代码的意思是指定算子CusSquare的反向梯度的计算方法,CusSquareGrad作为其中的一个函数使用

gradient = cus_square_grad(x)计算的是本平方算子的梯度,但并不能直接返回这个梯度

反向网络到该算子,最后返回的是dx,注意算子的反向梯度计算一定要放在整个网络的反向链式梯度计算中

测试

import numpy as np
import mindspore.nn as nn
import mindspore.context as context
from mindspore import Tensor
from mindspore.ops import operations as P
from mindspore.ops import composite as Ccontext.set_context(mode=context.GRAPH_MODE, device_target="Ascend")class Net(nn.Cell):def __init__(self):super(Net, self).__init__()self.square = P.CusSquare()  def construct(self, data):return self.square(data)def test_net():x = Tensor(np.array([[1.0, 4.0, 9.0]]).astype(np.float32))grad = C.GradOperation(get_all=True)    # 计算网络梯度net = Net()output = grad(net)(x)print("x: ", x)print("output: ", output)
if __name__ == "__main__":test_net()

输出

点击关注,第一时间了解华为云新鲜技术~

带你了解AKG正反向算子注册+关联流程相关推荐

  1. GA/T 1400协议 - 注册注销流程

    需求:作为下级平台将数据推送至上级平台.第一步需要下级平台向上级平台进行注册/注销. 目录 一.准备材料: 二.注册/注销接口 1.接口文档 2.入参对象 3. 注册/注销请求方法体示例: 三.注册/ ...

  2. MindSpore框架TBE算子开发全流程

    本文为MindSpore框架TBE算子开发全流程的图文案例.         视频案例请移步MindsSpore框架TBE算子开发全流程 MindSpore框架TBE算子开发全流程 一.工具介绍 1. ...

  3. MindSpore框架AICPU算子开发全流程

    视频案例,可以查看哔哩哔哩MindSpore框架AICPU算子演示视频 一.MindSpore AI算子介绍 1.1 MindSpore框架介绍 MindSpore是华为公司推出的新一代深度学习框架, ...

  4. 个人邮箱哪个好,163个人邮箱注册申请流程详解!

    个人邮箱哪个好,TOM的163个人邮箱注册申请流程详解.163邮箱是一个具有历史性的邮箱,也是大众很喜爱的品牌.通常被域名办公必备的神器,最近,小编看到163vip.Com邮箱正式登陆,这是即163. ...

  5. 公司邮箱注册申请流程,好用的邮箱功能开启高效办公

    公司邮箱因主要用于沟通业务,很多公司会选择用企业邮箱,更方便公司管理所有员工的邮箱,也方便员工使用.小编以TOM企业邮箱为例,为大家介绍下如何注册申请企业邮箱,以及企业邮箱中那些好用的功能. 公司邮箱 ...

  6. 阿里云商标顾问注册申请流程及常见问题解答

    阿里云商标顾问注册申请,有阿里云商标专家提供一对一服务,商标顾问提供商标检索.商标注册成功率分析.优化商标注册方案及代提交商标注册申请等服务,商标百科来详细说下阿里云商标顾问注册申请流程及常见问题解答 ...

  7. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,我是 Vic,今天给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. ...

  8. 怎么申请企业电子邮箱?TOM企业邮箱注册电子邮件流程详解

    电子邮箱渐渐成为生活中发送办公信息不可缺少的工具,有20年经验的TOM邮箱就是一个不错的选择,有的小伙伴还不太清楚注册的流程,其实方法很简单. 企业电子邮箱怎么申请注册 首先我们要去浏览器中搜索&qu ...

  9. Linux 系统注册系统服务流程

    Linux 系统注册系统服务流程 在/etc/systemd/system定义test.service文件(以定义启动nginx服务为例子) [Unit] Description=nginx serv ...

最新文章

  1. 商品秒杀,防并发解决思路
  2. 【连载】优秀程序员的 45 个习惯之习惯33
  3. golang键盘输入:从控制台获取信息
  4. java判断是否安装了pdf_Java检查PDF文件是否损坏
  5. 【官方文档】《暗黑世界V1.4》API说明!
  6. 给年薪不到48w的程序员提个醒!!
  7. android来电事件,android – 来电时没有响铃事件
  8. 【codevs1851】越狱,快速幂数学
  9. atitit 软件框架类库设计的艺术.docx 目录 1. index 1 2. 第2章 设计api的动力之源 14 2 2.1. .1 分布式开发 14 2 2.2. 2.2 模块化应用程序 16
  10. 使用wamp3.0.6安装LimeSurvey时报“参数默认值只能为NULL”错误的解决办法
  11. 常用LDO低压差线性稳压芯片封装型号以及基本电路
  12. 科技开发规划VBS屌丝暗色调
  13. [SystemVerilog] 基于 FPGA 的数字钟设计
  14. 基于 PCA 的人脸识别系统及人脸姿态分析
  15. android 语音播报(通过手说tts 实现中文语音播报)
  16. jQuery判断是否为数字
  17. Excel-旋风图制作
  18. 创客学院 level1第一节学习完成(第一次写博客)
  19. 土地利用覆被变化的概念_土地利用/覆被变化(LUCC)研究现状与展望
  20. AngularJS 整理学习

热门文章

  1. 调优 | 别再说你不会 JVM 性能监控和调优了
  2. 作为window对象属性的元素 多窗口和窗体
  3. JavaScript逻辑运算符“”和“||”短路原则的应用
  4. Bootstrap 警告框的外观
  5. ROS Rviz 显示轨迹 Python
  6. ipone怎么没有科学计算机,ipone7与ipone8其实根本没什么区别呀
  7. c语言继承与派生作用,C++中继承与派生是如何实现的?
  8. mvc移动创建oracle表,使用 ASP.NET MVC (C#)在15分钟内创建电影数据库应用程序 | Microsoft Docs...
  9. 计算机网络中什么叫总衰耗_计算机网络中的“带宽”,为什么是指“在单位时间内...
  10. mysql运行效率最高archive_MySQL 的优化方案总结