1

我有一个模型,从 pytorch 导出,我会调用main_model.onnx. 它有一个我将调用的输入节点main_input,它需要一个整数列表。我可以在 onnxruntime 中加载它并发送一个整数列表,它工作得很好。

我制作了另一个 ONNX 模型,我将pre_model.onnx使用 inputpre_input和 output进行调用pre_output。这会预处理一些文本,因此输入是文本,并且pre_output是整数列表,完全main_model.onnx符合输入的需要。

我的目标是,使用 Pythononnx.helper工具,创建一个接受文本作为输入的超级模型,并通过我的pre-model.onnx,可能是某个连接器节点(Identity也许?),然后main_model.onnx在一个大combined.onnx模型中运行。

我尝试使用pre_model.graph.node+Identity connector+main_model.graph.node作为新图中的节点,但是从 pytorch 导出的参数以这种方式丢失了。有没有办法保留所有这些参数和所有内容,并导出这个更大的组合 ONNX 模型?

4

2 回答 2

2

这是有可能实现的,尽管有点棘手。您可以探索 ONNX 提供的 Python API ( https://github.com/onnx/onnx/blob/master/docs/PythonAPIOverview.md )。这将允许您将模型加载到内存中,并且您必须使用公开的 API 来“组合”您的组合模型(将两个 GraphProto 消息合并为一个 - 这说起来容易做起来难 - 你必须确保你没有' 这样做时不要违反 onnx 规范),最后将新的 Graphproto 存储在新的 ModelProto 中,你就有了组合模型。我还将在完成时通过 onnx 检查器运行它,以确保模型在创建后有效。

于 2021-04-14T08:13:55.647 回答
0

如果您有静态尺寸输入,sclblonnx包是合并 Onnx 模型的简单解决方案。但是,它不支持动态大小输入。

对于动态大小输入,一种解决方案是使用前面所述的 ONNX API 编写您自己的代码。

另一种解决方案是使用onnx-tensorflowonnx2pytorch等工具将两个 ONNX 模型转换为框架(Tensorflow 或 PyTorch)。然后将一个网络的输出作为另一个网络的输入,并将整个网络导出为 Onnx 格式。

于 2021-09-06T12:39:42.230 回答