建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

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

确定
我再想想
选择版块
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

风无影

发帖: 39粉丝: 2

发消息 + 关注

更新于2021年04月06日 16:58:16 147 11
直达本楼层的链接
楼主
显示全部楼层
[问题求助] 【200DK产品】【TBE自定义算子功能】转模型的算子缺失 和 TBE自定义算子工程衔接

【功能模块】

DK200  , C73版本

Mindstudio :2.3.3  


【操作步骤&问题现象】

TBE中级和高级的教程学习了下,比如那个add和sqrt的算子,是生成om和.o  .json,或者是执行文件.run,可以跑在板子上

我现在项目中有个算子不支持,我按照这个TBE的custom添加完了算子,怎么加到DDK里面,使得原模型能转换成功呢?这块一直没有教程说明

我猜,是不是编译出 缺失的这个算子的 单独so (或者.o  .json),放在DDK的lib路径就可以在host下转模型了

【截图信息】



【日志信息】(可选,上传日志内容或者附件)


举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

Tx-

发帖: 17粉丝: 2

级别 : 版主,版块专家

发消息 + 关注

发表于2021年04月06日 18:01:02
直达本楼层的链接
沙发
显示全部楼层

您好,问题已收录,正在定位中

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

风无影

发帖: 39粉丝: 2

发消息 + 关注

更新于2021年04月06日 18:23:29
直达本楼层的链接
板凳
显示全部楼层

补充下,我这个缺失的算子是caffe的

想问下,caffe下可以用tbe添加算子吗,看例子是支持caffe的

REGISTER_CUSTOM_OP("EluGrad")
089     .FrameworkType(TENSORFLOW)  // Enumerated type. The options are as follows: CAFFE, TENSORFLOW


点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

caorp

发帖: 5粉丝: 7

级别 : 版主

发消息 + 关注

更新于2021年04月06日 19:53:40
直达本楼层的链接
地板
显示全部楼层

CAFFE算子开发流程如下,全流程的话你往上翻一翻:

https://support.huaweicloud.com/tbedevg-cann330alphaXinfer/atlaste_10_0068.html

有其他问题欢迎再提问!

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

风无影

发帖: 39粉丝: 2

发消息 + 关注

发表于2021年04月08日 12:02:55
直达本楼层的链接
5#
显示全部楼层

我按照TBE视频,生成了该算子的.run文件,执行.run,看到so已经在

20.0.RC1/x86_64-linux_gcc7.3.0/opp/framework/custom/caffe/libcust_caffe_parsers.so 下面,

但是转换模型的时候还是报找不到算子

[ERROR] GE(7570,atc):2021-04-08-12:02:15.075.807 [framework/domi/parser/caffe/caffe_parser.cc:648]7570 AddNode: ErrorNo: -1(failed) Unsupport op[res2a_padch] optype[PadChannel], you should customize the op at first.


怎么破?

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

caorp

发帖: 5粉丝: 7

级别 : 版主

发消息 + 关注

发表于2021年04月08日 14:20:07
直达本楼层的链接
6#
显示全部楼层

https://support.huaweicloud.com/tbedevg-cann330alphaXinfer/atlaste_10_0063.html

算子原型定义,

https://support.huaweicloud.com/tbedevg-cann330alphaXinfer/atlaste_10_0064.html

算子信息库定义

上面两步做了没有啊?如果没有请做一下下呢

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

风无影

发帖: 39粉丝: 2

发消息 + 关注

发表于2021年04月08日 15:44:50
直达本楼层的链接
7#
显示全部楼层

回复:caorp 发表于 2021-4-8 14:20 https://support.huaweicloud.com/tbedevg-cann330alphaXinfer/atlaste_10_0063.html

做了啊,检查没啥问题。UT也过了

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

风无影

发帖: 39粉丝: 2

发消息 + 关注

发表于2021年04月08日 15:47:01
直达本楼层的链接
8#
显示全部楼层

回复:caorp 发表于 2021-4-8 14:20 https://support.huaweicloud.com/tbedevg-cann330alphaXinfer/atlaste_10_0063.html

不过有个疑问, op[res2a_padch] 算子name我其实没用上,用的都是算子类型optype[PadChannel], 不知道是否需要配置op name

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

caorp

发帖: 5粉丝: 7

级别 : 版主

发消息 + 关注

发表于2021年04月08日 16:58:51
直达本楼层的链接
9#
显示全部楼层

ini文件里面第一行需要和prototxt里面type一样

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

风无影

发帖: 39粉丝: 2

发消息 + 关注

发表于2021年04月08日 17:42:13
直达本楼层的链接
10#
显示全部楼层

回复:caorp 发表于 2021-4-8 16:58 ini文件里面第一行需要和prototxt里面type一样

最开始怀疑命名的问题,算子的optype是PadChannel,所以这两个也没用默认值而是自定义
opFile.value=PadChannel
opInterface.value=PadChannel

这个是注册的方法:
namespace domi {
REGISTER_CUSTOM_OP("PadChannel")
.FrameworkType(CAFFE)
.OriginOpType("PadChannel")
.ParseParamsFn(AutoMappingFn)
.ImplyType(ImplyType::TVM);
} // namespace domi

PadChannel.h的内容:
#ifndef GE_OPS_OP_PROTO_ADD_H_
#define GE_OPS_OP_PROTO_ADD_H_
#include "graph/operator_reg.h"
namespace ge {
REG_OP(PadChannel)
.INPUT(x1, TensorType({DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_INT16,
DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
DT_COMPLEX64, DT_STRING}))
.OUTPUT(y,
TensorType({DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_INT16,
DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
DT_COMPLEX64, DT_STRING}))
.OP_END_FACTORY_REG(PadChannel)
}

#endif //GE_OPS_OP_PROTO_ADD_H_

PadChannel.ini的内容:
[PadChannel]
input0.name=x1
input0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32
input0.shape=all
input0.paramType=required
input0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND
output0.name=y
output0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32
output0.shape=all
output0.paramType=required
output0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND
opFile.value=PadChannel
opInterface.value=PadChannel

PadChannel.py的内容,实现部分还没完成,暂时用的Sqrt的,但是不影响
#!/usr/bin/env python

-- coding:utf-8 --

"""
Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved.

This program is free software; you can redistribute it and/or modify
it under the terms of the Apache License Version 2.0.You may not use this file
except in compliance with the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Apache License for more details at
http://www.apache.org/licenses/LICENSE-2.0

add
"""
from future import absolute_import

import te.lang.cce
from te import tvm
from te.platform.fusion_manager import fusion_manager
from topi import generic
from topi.cce import util

General limitation of the reduce size for input shape: 2**31

SHAPE_SIZE_LIMIT = 2147483648
NUM_ONE_HALF = 0.5
NUM_MINUS_ONE = -1

pylint: disable=locally-disabled,too-many-arguments,unused-argument

@fusion_manager.register("PadChannel")
def PadChannel_compute(input_x, dtype, kernel_name="PadChannel"):

data16 = input_x[0]

date = data16
if dtype == "float16":
    date = te.lang.cce.cast_to(data16, "float32")

log_val = te.lang.cce.vlog(date)
const_val = tvm.const(0.5, "float32")
mul_val = te.lang.cce.vmuls(log_val, const_val)
res = te.lang.cce.vexp(mul_val)

if dtype == "float16":
    res = te.lang.cce.cast_to(res, "float16")
# print ("res = " + res)
return res

@util.check_input_type((list, tuple), str, str)
def PadChannel(shape, dtype, kernel_name="PadChannel"):

input_dtype = dtype.lower()

util.check_shape_rule(shape)
util.check_tensor_shape_size(shape)
util.check_kernel_name(kernel_name)

data_input = tvm.placeholder(shape, name="data_input", dtype=input_dtype)
res = PadChannel_compute((data_input,), input_dtype, kernel_name)

"""
TODO:
auto schedule
"""
with tvm.target.cce():
    schedule = generic.auto_schedule(res)

"""
TODO:
operator build
"""
config = {"name": kernel_name,
          "tensor_list": [data_input, res]}

te.lang.cce.cce_build_code(schedule, config)


点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

caorp

发帖: 5粉丝: 7

级别 : 版主

发消息 + 关注

更新于2021年04月09日 09:38:30
直达本楼层的链接
11#
显示全部楼层

不好意思,麻烦问下,你的自定义算子工程方便发上来吗?如果不方便发这边的话,我私信你给联系方式。

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

邀请回答
您可以邀请3位专家

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200