I have a model, exported from pytorch, I'll call main_model.onnx
. It has an input node I'll call main_input
that expects a list of integers. I can load this in onnxruntime and send a list of ints and it works great.
I made another ONNX model I'll call pre_model.onnx
with input pre_input
and output pre_output
. This preprocesses some text so input is the text, and pre_output
is a list of ints, exactly as main_model.onnx
needs for input.
My goal here is, using the Python onnx.helper
tools, create one uber-model that accepts text as input, and runs through my pre-model.onnx
, possibly some connector node (Identity
maybe?), and then through main_model.onnx
all in one big combined.onnx
model.
I have tried using pre_model.graph.node
+Identity connector+main_model.graph.node
as nodes in a new graph, but the parameters exported from pytorch are lost this way. Is there a way to keep all those parameters and everything around, and export this one even larger combined ONNX model?
This is possible to achieve albeit a bit tricky. You can explore the Python APIs offered by ONNX (https://github.com/onnx/onnx/blob/master/docs/PythonAPIOverview.md). This will allow you to load models to memory and you'll have to "compose" your combined model using the APIs exposed (combine both the GraphProto messages into one - this is easier said than done - you' ll have to ensure that you don't violate the onnx spec while doing this) and finally store the new Graphproto in a new ModelProto and you have your combined model. I would also run it through the onnx checker on completion to ensure the model is valid post its creation.