onnx_graphsurgeon修改onnx计算图

export_onnx

onnx_graphsurgeon.export_onnx(graph: onnx_graphsurgeon.ir.graph.Graph, do_type_check=True, **kwargs) → onnx.onnx_ml_pb2.ModelProto
将onnx_graphsurgeon导出到onnx模型。

Parameters

  • graph (Graph) – The graph to export

  • do_type_check (bool) – Whether to check that input and output tensors have data types defined, and fail if not.

  • kwargs – Additional arguments to onnx.helper.make_model

Returns:A corresponding ONNX model.

Return type:onnx.ModelProto

import_onnx

onnx_graphsurgeon.import_onnx(onnx_model: onnx.onnx_ml_pb2.ModelProto) → onnx_graphsurgeon.ir.graph.Graph
从提供的onnx模型导入onnx graphsurgerGraph。

Parameters

Returns:对应 onnx-graphsurgeon Graph.

Return type:Graph

Graph

class onnx_graphsurgeon.Graph(nodes: Sequence[onnx_graphsurgeon.ir.node.Node] = None, inputs: Sequence[onnx_graphsurgeon.ir.tensor.Tensor] = None, outputs: Sequence[onnx_graphsurgeon.ir.tensor.Tensor] = None, name=None, doc_string=None, opset=None, import_domains=None)
Bases: object,表示包含节点和张量的图。

Parameters
        nodes (Sequence[Node]) :图中节点的列表
        inputs (Sequence[Tensor])  : 图形输入张量列表
        outputs (Sequence[Tensor])  :图形输出张量列表
        name (str)  : 图形的名称。默认为"onnx_graphsurgon_graph"
        doc_string (str) :图形的doc_string。默认为""
        opset (int)  : 导出此图形时要使用的ONNX操作集

cleanup

 cleanup(remove_unused_node_outputs=False, recurse_subgraphs=True, remove_unused_graph_inputs=False)

从图形中删除未使用的节点和张量。如果节点或张量对任何图形输出都没有贡献,则认为它是未使用的。

此外,图输入张量的任何生产者节点以及图中不存在的图输出张量的消费者节点都将从图中删除。

注意:此函数永远不会修改图形输出张量。

Parameters

  • remove_unused_node_outputs (bool) :是否删除节点的未使用输出张量。这将永远不会删除空张量(即可选但省略的)输出。默认为False。

  • recurse_subgraphs (bool) : 是否递归清理子图。默认为True。

  • remove_unused_graph_inputs (bool) : 是否删除未使用的图形输入。默认为False。

toposort

对图形进行拓扑排序。

toposort(recurse_subgraphs=True)

Parameters

  • recurse_subgraphs (bool) :是否对子图进行递归拓扑排序。默认为True。

Returns:self

tensors

 tensors(check_duplicates=False)

通过遍历所有节点,创建此图使用的所有张量的张量映射。此映射中省略了空张量。
张量保证按图中节点的顺序排列。因此,如果图是拓扑排序的,张量映射也将是拓扑排序。

Parameters

  • check_duplicates (bool) :如果遇到多个同名张量,是否失败。

Raises:OnnxGraphSurgeonException ,如果check_duplicates为True,并且图中的多个不同张量共享相同的名称。
Returns:张量名称到张量的映射。
Return type:OrderedDict[str, Tensor]

layer

layer(inputs=[], outputs=[], *args, **kwargs)

创建一个节点,将其添加到此图,并可选地创建其输入和输出张量。

输入和输出列表可以包括各种不同类型:

  • Tensor:提供的任何张量都将在创建的节点的输入/输出中按原样使用。

  • str:如果提供了一个字符串,该函数将使用该字符串生成一个新的张量以生成名称。它将在提供的字符串末尾添加一个索引,以避免重复的张量名称,但由于这不能保证名称是唯一的,因此您应该尽量确保提供的字符串是唯一的。为了避免重复名称的问题,您可以自己生成名称并提供Tensor s。

  • numpy.ndarray:如果提供了NumPy数组,此函数将使用名称前缀"onnx_graphsurgon_Constant"生成常量张量

  • Union[List[Number], Tuple[Number]]:如果提供了数字(int或float)的列表或元组,此函数将使用名称前缀"onnx_graphsurgon_Constant"生成常量张量。张量的值将是包含指定值的1D数组。数据类型将为np。float32或np.int64。

Node

class onnx_graphsurgeon.Node(op: str, name: str = None, attrs: Dict[str, object] = None, inputs: List[Tensor] = None, outputs: List[Tensor] = None)

Bases: object,节点表示图中的一个操作,消耗零个或多个Tensors,生成零个或更多个Tensors

Parameters

  • op (str) :节点执行的操作

  • name (str) :节点名

  • attrs (Dict[str, object]) :将属性名称映射到其值的字典。

  • inputs (List[Tensor]) : 零个或多个输入张量的列表。

  • outputs (List[Tensor]) : 零个或多个输出张量的列表。

 i(tensor_idx=0, producer_idx=0)
    方便函数,用于获取该节点的输入张量之一的生产者节点。请注意,与o()函数相比,参数是交换的;这是因为张量可能只有一个生产者

For example:

assert node.i() == node.inputs[0].inputs[0]
assert node.i(1, 2) == node.inputs[1].inputs[2]
Parameters
        tensor_idx (int) :此节点的输入张量的索引。默认为0。
        producer_idx (int) : 如果张量有多个生产者,则输入张量生产者的索引。默认为0
Returns:指定的生产者(输入)节点。
Return type: Node
o(consumer_idx=0, tensor_idx=0)
    方便函数,用于获取该节点的输出张量之一的消费者节点。

For example:

assert node.o() == node.outputs[0].outputs[0]
assert node.o(2, 1) == node.outputs[1].outputs[2]
Parameters
        consumer_idx (int):输入张量的使用者索引。默认为0。
        tensor_idx (int): 如果节点有多个输出,则该节点的输出张量的索引。默认为0。
Returns: 指定的使用者(输出)节点
Return type:Node
copy(inputs: List[Tensor] = None, outputs: List[Tensor] = None, tensor_map=None)
制作此节点的浅副本,覆盖输入和输出信息。

注意:通常情况下,您只应该制作一个Graph的副本。

Tensor

Tensor

class onnx_graphsurgeon.Tensor

Bases: object,graph中张量的抽象基类,这个类是抽象的,不能直接构造

is_empty()

# 返回此张量在graph中是否为空
# 注:此处的“空”是指张量的名称,对于可选张量,省略了该名称,而不是张量的形状
# 返回类型:bool

to_constant

to_constant(values: numpy.ndarray, data_location: int = None)

就地修改此张量以将其转换为常量,这意味着张量的consumers/producers都将看到更新

参数:

  • values(np.narray):此张量中的值
  • data_location(int):表示张量数据存储位置的枚举值。通常,这将来自onnx.TensorProto.DataLocation。

to_variable

to_variable(dtype: numpy.dtype = None, shape: Sequence[Union[int, str]] = [])

就地修改此张量以将其转换为变量,这意味着张量的consumers/producers都将看到更新

参数:

  • dtype(np.dtype)–张量的数据类型
  • shape(Sequence[int])–张量的形状
  • 返回值:self

i

i(tensor_idx=0, producer_idx=0)

方便函数,用于获取此张量的输入节点之一的输入张量。请注意,与o()函数相比,参数是交换的;这是因为张量可能只有一个生产者

例如:

assert tensor.i() == tensor.inputs[0].inputs[0]
assert tensor.i(1, 2) == tensor.inputs[2].inputs[1]

参数

  • tensor_idx(int):输入节点的输入张量的索引,默认为0

  • producer_idx(int):如果张量有多个生产者,则输入张量的生产者节点的索引,默认为0

  • 返回值:指定的生产者(输入)Tensor

  • 返回类型:Tensor

o

o(consumer_idx=0, tensor_idx=0)

方便函数,用于获取此张量的输出节点之一的输出张量。
例如:

assert tensor.o() == tensor.outputs[0].outputs[0]
assert tensor.o(2, 1) == tensor.outputs[2].outputs[1]

参数

  • consumer_idx(int):输入张量的消费者索引,默认为0
  • tensor_idx(int):节点的输出张量的索引,如果节点有多个输出,默认为0

返回值:指定的生产者(输出)Tensor
返回类型:Tensor

Variable

class onnx_graphsurgeon.Variable(name: str, dtype: numpy.dtype = None, shape: Sequence[Union[int, str]] = None)
Bases: onnx_graphsurgeon.ir.tensor.Tensor,表示一个张量,其值直到推理时才知道。

参数:

  • name (str) :张量名字

  • dtype (numpy.dtype) : 张量的数据类型

  • shape (Sequence[Union[int, str]]) :张量的形状,如果模型使用尺寸参数,则可能包含字符串。

to_constant(values: numpy.ndarray)

就地修改此张量以将其转换为常量。这意味着张量的consumers/producers都将看到更新。

参数:

  • values(np.narray)–此张量中的值
  • data_location(int)–表示张量数据存储位置的枚举值。通常,这将来自onnx.TensorProto.DataLocation。
copy()

制作此张量的浅拷贝,省略输入和输出信息。

注意:通常情况下,您只应该制作一个Graph的副本。

参考:https://docs.nvidia.com/deeplearning/tensorrt/onnx-graphsurgeon/docs/ir/graph.html

实践

猜你喜欢

转载自blog.csdn.net/weixin_42905141/article/details/127454901