首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onnx自定义op注册

onnx自定义op注册
EN

Stack Overflow用户
提问于 2022-03-09 21:06:42
回答 2查看 1.1K关注 0票数 0

我正在寻找与ONNX/ONNX运行时中的keras自定义层类似的特性。我理解解决这个问题的方法是在onnx中实现一个自定义操作符以便进行实验。文档似乎将C++中的实现作为一个共享库,并在python中使用它。https://onnxruntime.ai/docs/reference/operators/add-custom-op.html

是否有一种方法可以在python中为onnx定义自定义op,仅用于实验目的,并用于推断?我试过这样做,但给出了‘错误: PyOp不是一个注册函数/op’https://onnxruntime.ai/docs/reference/operators/custom-python-operator.html

Python代码:

代码语言:javascript
复制
import onnx
import onnxruntime as ort

A = onnx.helper.make_tensor_value_info('A', onnx.TensorProto.FLOAT, [4])
B = onnx.helper.make_tensor_value_info('B', onnx.TensorProto.FLOAT, [4])
C = onnx.helper.make_tensor_value_info('C', onnx.TensorProto.FLOAT, [4])
D = onnx.helper.make_tensor_value_info('D', onnx.TensorProto.FLOAT, [4])
E = onnx.helper.make_tensor_value_info('E', onnx.TensorProto.FLOAT, [4])
F = onnx.helper.make_tensor_value_info('F', onnx.TensorProto.FLOAT, [4])

ad1_node = onnx.helper.make_node('Add', ['A', 'B'], ['S'])

mul_node = onnx.helper.make_node('Mul', ['C','D'], ['P'])

ad2_node = onnx.helper.make_node('Add', ['S', 'P'], ['H'])

py1_node = onnx.helper.make_node(op_type = 'PyOp', #required, must be 'PyOp'
                            inputs = ['H'], #required
                            outputs = ['F'], #required
                            domain = 'pyopadd_2', #required, must be unique
                            input_types = [onnx.TensorProto.FLOAT], #required
                            output_types = [onnx.TensorProto.FLOAT], #required
                            module = 'mymodule', #required
                            class_name = 'Add_2', #required
                            compute = 'compute') #optional, 'compute' by default

graph = onnx.helper.make_graph([ad1_node,mul_node,ad2_node, py1_node], 'multi_pyop_graph', [A,B,C,D], [F])
model = onnx.helper.make_model(graph, opset_imports=[onnx.helper.make_opsetid('pyopadd_2', 1)], producer_name = 'pyop_model')
onnx.save(model, './modeltemp.onnx')

ort_session = ort.InferenceSession('./modeltemp.onnx')
ort_output = ort_session.run(["F"], {'A':[1,2,3,4], 'B':[1,1,1,1], 'C':[2,2,2,2], 'D':[3,3,3,3]})
print(ort_output)

mymodule.py

代码语言:javascript
复制
class Add_2:
    def compute(self, S):
        return S+2
EN

回答 2

Stack Overflow用户

发布于 2022-03-28 15:01:10

这不是您使用PyOp的方式。首先:您需要实现在python中尝试使用的操作符。第二:您需要注册在ONNXRuntime会话中实现的操作符。第三:运行包含自定义操作的模型的推断。

这里可以找到一个例子,tutorial.ipynb,您必须查看名为“在python中实现op”的部分。警告!这个笔记本中的PyOp叫做PyCustomOpDef,如果您直接从ONNX模型开始,您不需要担心这个笔记本中的任何其他东西。只需要将"ai.onnx.contrib"包含在模型的选项集中,并在节点域中设置相同的域"ai.onnx.contrib"

代码语言:javascript
复制
# for the model
DOMAIN = "ai.onnx.contrib"
VERSION = 1 # try 2 or 3, I had some issues with the versioning
new_opset = onnx.helper.make_opsetid(DOMAIN, VERSION)
loaded_model.opset_import.append(new_opset)

# for the node, like in your code 
domain = 'ai.onnx.contrib', #required, must be unique
票数 1
EN

Stack Overflow用户

发布于 2022-03-23 03:14:10

正如自定义python-运算符明确指出的那样,您必须自己构建with运行时:

--config Release --enable_language_interop_ops --build_wheel

该功能不随of运行时的预构建版本而来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71415978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档