【MindSpore第七期两日集群营】使用hybrid方式开发自定义算子

举报
张辉 发表于 2022/09/21 12:10:08 2022/09/21
【摘要】 MindSpore第七期两日集群营

继续看视频:https://www.bilibili.com/video/BV1nW4y1b7HP

了解一下hybrid的开发方法:

cke_2760.png

cke_3129.png

这里其实需要注意几个问题:

1.需要有ms_kernel装饰器

2.算子内不能直接tensor相加,而是必须用标量相加。


我们先按照例子试试 二维张量的加法函数:

vi self_def2.py


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

@ms_kernel
def tensor_add_2d(x,y):
    result = output_tensor(x.shape, x.dtype)

    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            result[i,j] = x[i,j] + y[i,j]

    return result

tensor_add_2d_op = ops.Custom(func = tensor_add_2d)

input_tensor_x = ms.Tensor(np.random.normal(0,1,[2,3]).astype(np.float32))
input_tensor_y = ms.Tensor(np.random.normal(0,1,[2,3]).astype(np.float32))
result_cus = tensor_add_2d_op(input_tensor_x,input_tensor_y)
print(result_cus)

执行下看看:

python self_def2.py

cke_18371.png

参考 https://xihe.mindspore.cn/projects/zichun_ye/cus_ops_repo/blob/cus_ops/cus_ops.py

将其改为三维加法:

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

@ms_kernel
def tensor_add_3d(x,y):
    result = output_tensor(x.shape, x.dtype)

    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            for k in range(x.shape[2]):
                result[i,j,k] = x[i,j,k] + y[i,j,k]

    return result

tensor_add_3d_op = ops.Custom(func = tensor_add_3d)

input_tensor_x = ms.Tensor(np.random.normal(0,1,[2,3,4]).astype(np.float32))
print("x\n",input_tensor_x)
input_tensor_y = ms.Tensor(np.random.normal(0,1,[2,3,4]).astype(np.float32))
print("y\n",input_tensor_y)
result_cus = tensor_add_3d_op(input_tensor_x,input_tensor_y)
print("hybrid, tensor_add_3d_op\n",result_cus)复制

执行:

cke_22607.png

那我们怎么看这个计算结果对不对呢?很简单,按照上一个博客(  使用pyfunc方式开发自定义算子 https://bbs.huaweicloud.com/blogs/375511 )的方式重做一次,对比结果就可以了:


#pyfunc
ms.set_context(mode=ms.GRAPH_MODE,device_target="CPU")

def infer_shape_py(x,y):
    return x

def infer_dtype_py(x,y):
    return x

tensor_add_3d_py_func = ops.Custom(func = tensor_add_3d,
                out_shape = infer_shape_py,
                out_dtype = infer_dtype_py,
                func_type="pyfunc")

result_pyfunc = tensor_add_3d_py_func(input_tensor_x,input_tensor_y)
print ("pyfunc\n",result_pyfunc)复制

重新执行:

python self_def3.py

cke_5039.png

cke_5936.png

比较下 hybrid的结果跟pyfunc的结果好像是一样的。

(全文完,谢谢阅读)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。