onnx_ir.convenienceΒΆ
- onnx_ir.convenience.convert_attribute(name, attr, attr_type=None)ΒΆ
Convert a Python object to a _core.Attr object.
This method is useful when constructing nodes with attributes. It infers the attribute type based on the type of the Python value.
- Parameters:
name (str) β The name of the attribute.
attr (str | int | float | Sequence[int] | Sequence[float] | Sequence[str] | TensorProtocol | TensorProto | Attr | GraphProtocol | Sequence[GraphProtocol] | GraphProto | TypeProtocol | Sequence[TypeProtocol] | None) β The value of the attribute.
attr_type (AttributeType | None) β The type of the attribute. This is required when attr is None. When provided, it overrides the inferred type.
- Returns:
A
Attrobject.- Raises:
ValueError β If
attrisNoneandattr_typeis not provided.TypeError β If the type of the attribute is not supported.
- Return type:
- onnx_ir.convenience.convert_attributes(attrs)ΒΆ
Convert a dictionary of attributes to a list of _core.Attr objects.
It infers the attribute type based on the type of the value. The supported types are: int, float, str, Sequence[int], Sequence[float], Sequence[str],
_core.Tensor, and_core.Attr:>>> import onnx_ir as ir >>> import onnx >>> import numpy as np >>> attrs = { ... "int": 1, ... "float": 1.0, ... "str": "hello", ... "ints": [1, 2, 3], ... "floats": [1.0, 2.0, 3.0], ... "strings": ["hello", "world"], ... "tensor": ir.Tensor(np.array([1.0, 2.0, 3.0])), ... "tensor_proto": ... onnx.TensorProto( ... dims=[3], ... data_type=onnx.TensorProto.FLOAT, ... float_data=[1.0, 2.0, 3.0], ... name="proto", ... ), ... "graph": ir.Graph([], [], nodes=[], name="graph0"), ... "graphs": [ir.Graph([], [], nodes=[], name="graph1"), ir.Graph([], [], nodes=[], name="graph2")], ... "type_proto": ir.TensorType(ir.DataType.FLOAT), ... "type_protos": [ir.TensorType(ir.DataType.FLOAT), ir.TensorType(ir.DataType.FLOAT)], ... } >>> convert_attributes(attrs) [Attr('int', INT, 1), Attr('float', FLOAT, 1.0), Attr('str', STRING, 'hello'), Attr('ints', INTS, (1, 2, 3)), Attr('floats', FLOATS, (1.0, 2.0, 3.0)), Attr('strings', STRINGS, ('hello', 'world')), Attr('tensor', TENSOR, Tensor<DOUBLE,[3]>(array([1., 2., 3.]), name=None)), Attr('tensor_proto', TENSOR, TensorProtoTensor<FLOAT,[3]>(array([1., 2., 3.], dtype=float32), name='proto')), Attr('graph', GRAPH, Graph( name='graph0', inputs=( ), outputs=( ), len()=0 )), Attr('graphs', GRAPHS, (Graph( name='graph1', inputs=( ), outputs=( ), len()=0 ), Graph( name='graph2', inputs=( ), outputs=( ), len()=0 ))), Attr('type_proto', TYPE_PROTO, Tensor(FLOAT)), Attr('type_protos', TYPE_PROTOS, (Tensor(FLOAT), Tensor(FLOAT)))]
Important
An empty sequence should be created with an explicit type by initializing an Attr object with an attribute type to avoid type ambiguity. For example:
ir.Attr("empty", [], type=ir.AttributeType.INTS)
- Parameters:
attrs (Mapping[str, str | int | float | Sequence[int] | Sequence[float] | Sequence[str] | TensorProtocol | TensorProto | Attr | GraphProtocol | Sequence[GraphProtocol] | GraphProto | TypeProtocol | Sequence[TypeProtocol] | None]) β A dictionary of {<attribute name>: <python objects>} to convert.
- Returns:
A list of
_core.Attrobjects.- Raises:
TypeError β If an attribute type is not supported.
- Return type:
- onnx_ir.convenience.create_value_mapping(graph)ΒΆ
Return a dictionary mapping names to values in the graph.
The mapping includes values from subgraphs. Duplicated names are omitted, and the first value with that name is returned. Values with empty names are excluded from the mapping.
Changed in version 0.1.2: Values from subgraphs are now included in the mapping.
- onnx_ir.convenience.get_const_tensor(value, propagate_shape_type=False)ΒΆ
Get the constant tensor from a value, if it exists.
A constant tensor can be obtained if the value has a
const_valueset (as in the case of an initializer) or if the value is produced by a Constant node.This function will not alter the
const_valueof the value, but it will propagate the shape and type of the constant tensor to the value if propagate_shape_type is set to True.Added in version 0.1.2.
- Parameters:
- Returns:
The constant tensor if it exists, otherwise None.
- Raises:
ValueError β If the Constant node does not have exactly one output or one attribute.
- Return type:
TensorProtocol | None
- onnx_ir.convenience.replace_all_uses_with(values, replacements, replace_graph_outputs=False)ΒΆ
Replace all uses of the given values with the replacements.
This is useful when nodes in the graph are replaced with new nodes, where the old users need to be updated to use the outputs of the new nodes.
For example, suppose we have the following graph:
A -> {B, C}
We want to replace the node A with a new node D:
>>> import onnx_ir as ir >>> input = ir.val("input") >>> node_a = ir.Node("", "A", [input]) >>> node_b = ir.Node("", "B", node_a.outputs) >>> node_c = ir.Node("", "C", node_a.outputs) >>> node_d = ir.Node("", "D", [input]) >>> replace_all_uses_with(node_a.outputs, node_d.outputs) >>> len(node_b.inputs) 1 >>> node_b.inputs[0].producer().op_type 'D' >>> len(node_c.inputs) 1 >>> node_c.inputs[0].producer().op_type 'D' >>> len(node_a.outputs[0].uses()) 0
When values and replacements are sequences, they are zipped into pairs. All users of the first value is replaced with the first replacement, and so on.
Note
Be sure to remove the old nodes from the graph using
graph.remove()if they are no longer needed, or useonnx_ir.passes.common.RemoveUnusedNodesPassto remove all unused nodes in the graph.Tip
Handling graph outputs
To also replace graph outputs that reference the values being replaced, either set
replace_graph_outputsto True, or manually update the graph outputs before calling this function to avoid an error being raised whenreplace_graph_outputs=False.Be careful when a value appears multiple times in the graph outputs - this is invalid. An identity node will need to be added on each duplicated outputs to ensure a valid ONNX graph.
You may also want to assign the name of this value to the replacement value to maintain the name when it is a graph output.
Added in version 0.1.12: The
replace_graph_outputsparameter is added.Added in version 0.1.12: ValueError is raised when
replace_graph_outputsis False && when the value to replace is a graph output.- Parameters:
values (ValueProtocol | Sequence[ValueProtocol]) β The value or values to be replaced.
replacements (ValueProtocol | Sequence[ValueProtocol]) β The new value or values to use as inputs.
replace_graph_outputs (bool) β If True, graph outputs that reference the values being replaced will also be updated to reference the replacements.
- Raises:
ValueError β When
replace_graph_outputsis False && when the value to replace is a graph output.- Return type:
None
- onnx_ir.convenience.replace_nodes_and_values(graph_or_function, /, insertion_point, old_nodes, new_nodes, old_values, new_values)ΒΆ
Replaces nodes and values in the graph or function.