module onnx_tools.onnx_manipulations
#
Short summary#
module mlprodict.onnx_tools.onnx_manipulations
Implements a class able to compute the predictions from on an ONNX model.
Classes#
class |
truncated documentation |
---|---|
Overwrites class dictionary to debug more easily. |
Functions#
function |
truncated documentation |
---|---|
Changes the type of an input. |
|
Changes the type of an input or an output of a subgraph. |
|
Enumerates all the nodes of a model. |
|
Returns the list of hidden inputs used by subgraphs. |
|
Enumerates all opsets used in a model. |
|
Hashes the content of an object. It uses module |
|
Inserts results into an ONNX graph to produce an extended ONNX graph. It can be saved and looked into with a tool such … |
|
Converts an ONNX FunctionProto into a ModelProto. The function does not handle attributes yet. |
|
Inlines functions in an ONNX graph. |
|
Converts an ONNX model into a function. The returned function has no attribute. |
|
Renames input or outputs names. |
|
Renames all names except the inputs and outputs. |
|
Replaces some of the function in model. |
|
Returns the depth of the graph. |
|
Overwrites the main opset in an ONNX file. Does not change any node definition. |
|
Takes a model and changes its outputs. |
Methods#
method |
truncated documentation |
---|---|
Adds a value. |
|
Returns a copy. |
|
Removes one element. |
|
Updates many values. |
Documentation#
Implements a class able to compute the predictions from on an ONNX model.
- mlprodict.onnx_tools.onnx_manipulations._change_subgraph_io_type_shape_list(io_list, type_changes, shape_changes)#
- mlprodict.onnx_tools.onnx_manipulations._get_new_name(prefix, name, existing_names)#
- class mlprodict.onnx_tools.onnx_manipulations._inline_mapping(verbose, fLOG, level)#
Bases:
dict
Overwrites class dictionary to debug more easily.
- Parameters:
verbose – verbosity
fLOG – logging function
level – sub graph level
- __init__(verbose, fLOG, level)#
- __setitem__(key, value)#
Adds a value.
- copy()#
Returns a copy.
- remove(o)#
Removes one element.
- update(d)#
Updates many values.
- mlprodict.onnx_tools.onnx_manipulations._onnx_function_to_model_convert_io(ens, type_info, shape_fct)#
- mlprodict.onnx_tools.onnx_manipulations._onnx_inline_function_graph(graph, protos, existing_names, mapping, verbose, fLOG, rename, level)#
- mlprodict.onnx_tools.onnx_manipulations._onnx_inline_function_node(node, protos, existing_names, verbose, fLOG, level)#
- mlprodict.onnx_tools.onnx_manipulations.change_input_type(onx, changes)#
Changes the type of an input.
- Parameters:
onx – ONNX model
changes – dictionary ‘{ name: new proto element type }`
- Returns:
new onx
- mlprodict.onnx_tools.onnx_manipulations.change_subgraph_io_type_shape(onx, type_changes=None, shape_changes=None, recursive=True)#
Changes the type of an input or an output of a subgraph.
- Parameters:
onx – ModelProto, GraphProto
type_changes – dictionary ‘{ name: new proto element type }` or function f(input) -> type
shape_changes – dictionary ‘{ name: new shape }` or function f(input) -> shape
recursive – True
- Returns:
new onx
- mlprodict.onnx_tools.onnx_manipulations.enumerate_model_node_outputs(model, add_node=False, order=False)#
Enumerates all the nodes of a model.
- Parameters:
model – ONNX graph
add_node – if False, the function enumerates all output names from every node, otherwise, it enumerates tuple (output name, node)
order – goes through outputs following the graph order
- Returns:
enumerator
Returns the list of hidden inputs used by subgraphs.
- Parameters:
nodes – list of nodes
- Returns:
list of names
- mlprodict.onnx_tools.onnx_manipulations.get_opsets(model, include_functions=True, exc=True)#
Enumerates all opsets used in a model.
- Parameters:
model – ModelProto or FunctionProto
include_functions – include opsets used in functions
exc – raise an exception if conflicts are detected
- Returns:
dictionary
- mlprodict.onnx_tools.onnx_manipulations.hash_onnx_object(obj, max_size)#
Hashes the content of an object. It uses module
hashlib
.- Parameters:
obj – onnx graph (it must have a method SerializeToString)
max_size – size of the hash
- Returns:
hash
- mlprodict.onnx_tools.onnx_manipulations.insert_results_into_onnx(model, results, as_parameter=True, suffix='_DBG', param_name=None, node_type='DEBUG', domain='DEBUG', domain_opset=1)#
Inserts results into an ONNX graph to produce an extended ONNX graph. It can be saved and looked into with a tool such as netron.
- Parameters:
model – ONNX graph
results – results to be added in a dictionary
as_parameter – add new nodes with results as one parameter (True) or as initializer (False)
suffix – suffix to add to new results
param_name – name of the parameter to add (by default the result name), it can be a function param_name(reult_name) -> parameter_name
node_type – type of the new node
domain – domain the new node
domain_opset – opset for domain
- Returns:
new ONNX graph
See method
OnnxInference.run2onnx
to see a graph this function produces.New in version 0.7.
- mlprodict.onnx_tools.onnx_manipulations.onnx_function_to_model(onx, functions=None, type_info=None, as_function=False, shape_fct=None)#
Converts an ONNX FunctionProto into a ModelProto. The function does not handle attributes yet.
- Parameters:
onx – onnx function
functions – additional functions to append to the model
type_info – dictionary or callable which returns the type of inputs or outputs if it cannot be guessed
as_function – if True, the function stays as a function and a single node is created to call that function
shape_fct – function to specify the shapes, signature: shape_fct(name, proto_type) -> list
- Returns:
function
- mlprodict.onnx_tools.onnx_manipulations.onnx_inline_function(obj, protos=None, existing_names=None, verbose=0, fLOG=None)#
Inlines functions in an ONNX graph.
- Parameters:
obj – onnx graph, FunctionProto, :epkg:`GraphProto`, ModelProto
protos – if None, the function assumes obj is of type ModelProto and the goal is to inline every function. If protos a list of strings, the function only inlines the functions in that list. If protos is a dictionary { (domain, type): FunctionProto }, the function replaces every node (domain, type) by the code given in this dictionary
existing_names – no new name will be taken in that set
verbose – verbosity
fLOG – logging function
- Returns:
modified object, list of modified nodes
New in version 0.9.
- mlprodict.onnx_tools.onnx_manipulations.onnx_model_to_function(onx, name=None, domain='custom', opset_imports=None, doc_string=None, inputs2par=None)#
Converts an ONNX model into a function. The returned function has no attribute.
- Parameters:
onx – onnx model
name – function name
domain – function domain
opset_imports – opset to import as a dictionary {domain: version}
doc_string – doc string
inputs2par – dictionary to move some inputs as attributes { name: None or default value }
- Returns:
function, other functions
Warning
FunctionProto does not support default values yet. They are ignored.
- mlprodict.onnx_tools.onnx_manipulations.onnx_rename_inputs_outputs(onx, rename)#
Renames input or outputs names.
- Parameters:
onx – GraphProto, ModelProto
rename – dictionary {old_name: new_name}
- Returns:
new onx
- mlprodict.onnx_tools.onnx_manipulations.onnx_rename_names(model, strategy='simple', recursive=True, verbose=0, fLOG=<built-in function print>, counts=None, replace=None, taken=None)#
Renames all names except the inputs and outputs.
- Parameters:
model – onnx model
strategy – two strategies are implemented, see below
recursive – walk through subgraphs
verbose – verbose, if positive, reports on all changed names
fLOG – logging function
counts – used for recursion
replace – used for recursion, it can be also used to to fix some replacements
taken – used for recursion
- Returns:
onnx model (the model is modified in place)
Strategies:
- ‘simple’: use a letter n for node, r, i for initializer,
this letter is followed by a number
- ‘type’: the name depends on the node type and content,
the hash is kept as small as possible
- mlprodict.onnx_tools.onnx_manipulations.onnx_replace_functions(model, replace)#
Replaces some of the function in model.
- Parameters:
model – ModelProto
replace – dictionary { (domain, name): FunctionProto }
- Returns:
new model
- mlprodict.onnx_tools.onnx_manipulations.onnx_subgraphs_level(obj)#
Returns the depth of the graph.
- Parameters:
obj – onnx object
- Returns:
integer
- mlprodict.onnx_tools.onnx_manipulations.overwrite_opset(model, new_opset)#
Overwrites the main opset in an ONNX file. Does not change any node definition.
- Parameters:
model – ONNX model
new_opset – new opset
- Returns:
ONNX model
- mlprodict.onnx_tools.onnx_manipulations.select_model_inputs_outputs(model, outputs=None, inputs=None, infer_shapes=False, overwrite=None, remove_unused=True, verbose=0, fLOG=None)#
Takes a model and changes its outputs.
- Parameters:
model – ONNX model
inputs – new inputs, same ones if None
outputs – new outputs, same ones if None
infer_shapes – infer inputs and outputs shapes
overwrite – overwrite type and shapes for inputs or outputs, overwrite is a dictionary {‘name’: (numpy dtype, shape)}
remove_unused – remove unused nodes from the graph
verbose – display information while converting
fLOG – logging function
- Returns:
modified model
The function removes unneeded nodes.
Change ONNX model inputs
The following exampels shows how to change the inputs of model to bypass the first nodes. Shape inferences fails to determine the new inputs type. They need to be overwritten. verbose=1, fLOG=print shows the number of deleted nodes.
import onnx from mlprodict.onnx_tools.onnx_manipulations import select_model_inputs_outputs onx = onnx.load(path) onx2 = select_model_inputs_outputs( onx, inputs=["SentenceTokenizer/SentencepieceTokenizeOp:0", "SentenceTokenizer/SentencepieceTokenizeOp:1"], infer_shapes=True, verbose=1, fLOG=print, overwrite={'SentenceTokenizer/SentencepieceTokenizeOp:0': (numpy.int32, None), 'SentenceTokenizer/SentencepieceTokenizeOp:1': (numpy.int64, None)}) onnx.save(onx2, path2)