onnx_ir.convenience

onnx_ir.convenience.convert_attribute(name, attr, attr_type=None)

将 Python 对象转换为 _core.Attr 对象。

此方法在构造带属性的节点时很有用。它根据 Python 值的类型推断属性类型。

参数:
返回:

一个 Attr 对象。

引发:
  • ValueError – 如果 attrNone 且未提供 attr_type

  • TypeError – 如果不支持属性的类型。

返回类型:

Attr

onnx_ir.convenience.convert_attributes(attrs)

将属性字典转换为 _core.Attr 对象列表。

它根据值的类型推断属性类型。支持的类型有:int、float、str、Sequence[int]、Sequence[float]、Sequence[str]、_core.Tensor_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)))]

重要提示

空序列应通过使用属性类型初始化 Attr 对象来创建显式类型,以避免类型模糊性。例如

ir.Attr("empty", [], type=ir.AttributeType.INTS)
参数:

attrs (Mapping[str, str | int | float | Sequence[int] | Sequence[float] | Sequence[str] | TensorProtocol | TensorProto | Attr | GraphProtocol | Sequence[GraphProtocol] | GraphProto | TypeProtocol | Sequence[TypeProtocol] | None]) – 要转换的 {<属性名称>: } 字典。

返回:

一个 _core.Attr 对象列表。

引发:

TypeError – 如果不支持属性类型。

返回类型:

list[Attr]

onnx_ir.convenience.create_value_mapping(graph)

返回将图中的名称映射到值的字典。

映射包括来自子图的值。重复的名称被省略,并返回具有该名称的第一个值。空名称的值被排除在映射之外。

0.1.2 版本中已更改: 子图中的值现在包含在映射中。

参数:

graph (Graph) – 要从中提取映射的图。

返回:

将名称映射到值的字典。

返回类型:

dict[str, Value]

onnx_ir.convenience.get_const_tensor(value, propagate_shape_type=False)

如果存在,从值中获取常量张量。

如果值设置了 const_value(如初始化器的情况),或者值由 Constant 节点生成,则可以获取常量张量。

此函数不会更改值的 const_value,但如果 propagate_shape_type 设置为 True,它会将常量张量的形状和类型传播到值。

0.1.2 版本新增。

参数:
  • value (Value) – 要从中获取常量张量的值。

  • propagate_shape_type (bool) – 如果为 True,则值的形状和类型将传播到 Value。

返回:

如果存在常量张量,则返回常量张量,否则返回 None。

引发:

ValueError – 如果 Constant 节点没有恰好一个输出或一个属性。

返回类型:

TensorProtocol | None

onnx_ir.convenience.replace_all_uses_with(values, replacements, replace_graph_outputs=False)

将给定值的所有用途替换为替代值。

当图中的节点被新节点替换时,这很有用,旧的用户需要更新以使用新节点的输出。

例如,假设我们有以下图

A -> {B, C}

我们想用新节点 D 替换节点 A

>>> 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

当值和替换是序列时,它们被压缩成对。第一个值的所有用户都被第一个替换值替换,依此类推。

注意

如果不再需要旧节点,请务必使用 graph.remove() 从图中删除它们,或者使用 onnx_ir.passes.common.RemoveUnusedNodesPass 删除图中所有未使用的节点。

提示

处理图输出

要替换引用正在替换的值的图输出,请将 replace_graph_outputs 设置为 True,或者在调用此函数之前手动更新图输出,以避免在 replace_graph_outputs=False 时引发错误。

当一个值在图输出中多次出现时要小心——这是无效的。需要在每个重复输出上添加一个恒等节点,以确保有效的 ONNX 图。

您可能还需要将此值的名称分配给替换值,以在它作为图输出时保持名称。

0.1.12 版本中新增: 添加了 replace_graph_outputs 参数。

0.1.12 版本中新增: replace_graph_outputs 为 False 且要替换的值是图输出时,会引发 ValueError。

参数:
  • values (ValueProtocol | Sequence[ValueProtocol]) – 要替换的值或值列表。

  • replacements (ValueProtocol | Sequence[ValueProtocol]) – 用作输入的新值或值列表。

  • replace_graph_outputs (bool) – 如果为 True,则引用正在替换的值的图输出也将更新以引用替换值。

引发:

ValueError – 当 replace_graph_outputs 为 False 且要替换的值是图输出时。

返回类型:

onnx_ir.convenience.replace_nodes_and_values(graph_or_function, /, insertion_point, old_nodes, new_nodes, old_values, new_values)

替换图或函数中的节点和值。

参数:
  • graph_or_function (Graph | Function) – 要替换节点和值的图或函数。

  • insertion_point (Node) – 插入新节点后的节点。

  • old_nodes (Sequence[Node]) – 要替换的节点。

  • new_nodes (Sequence[Node]) – 替换用的节点。

  • old_values (Sequence[Value]) – 要替换的值。

  • new_values (Sequence[Value]) – 替换用的值。

返回类型: