class onnx_graphsurgeon.Graph(nodes: Sequence[Node] = None, inputs: Sequence[Tensor] = None, outputs: Sequence[Tensor] = None, name=None, doc_string=None, opset=None, import_domains=None, producer_name: str = None, producer_version: str = None, functions: Sequence[Function] = None)

基类: object

表示包含节点和张量的图。

参数:
  • nodes (Sequence[Node]) – 此图中节点的列表。

  • inputs (Sequence[Tensor]) – 图输入张量的列表。

  • outputs (Sequence[Tensor]) – 图输出张量的列表。

  • name (str) – 图的名称。默认为 “onnx_graphsurgeon_graph”。

  • doc_string (str) – 图的文档字符串。默认为 “”。

  • opset (int) – 导出此图时要使用的 ONNX opset。

  • producer_name (str) – 用于生成模型的工具的名称。默认为 “”。

  • producer_version (str) – 生成工具的版本。默认为 “”。

static register(opsets=None)

为指定的 opset 组向 Graph 类注册一个函数。 注册该函数后,可以像普通的成员函数一样访问它。

例如

@Graph.register()
def add(self, a, b):
    return self.layer(op="Add", inputs=[a, b], outputs=["add_out_gs"])

graph.add(a, b)
参数:

opsets (Sequence[int]) – 要为其注册函数的一组 opset。 如果为不同的 opset 注册,则可以同时注册具有相同名称的多个函数。 为相同的 opset 注册具有重复名称的函数将覆盖先前为这些 opset 注册的任何函数。 默认情况下,该函数将为所有 opset 注册。

node_ids()

返回一个上下文管理器,该管理器为图中的节点提供唯一的整数 ID。

例如

with graph.node_ids():
    assert graph.nodes[0].id != graph.nodes[1].id
返回:

一个上下文管理器,为节点提供唯一的整数 ID。

返回类型:

NodeIDAdder

subgraphs(recursive=False)

用于迭代此图中包含的所有子图的便捷函数。 子图在 ONNX 控制流节点(如 “If” 和 “Loop”)的属性中找到。

参数:

recursive (bool) – 是否递归搜索此图的子图以查找更多子图。 默认为 False。

返回:

一个生成器,用于迭代此图中包含的子图。

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

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

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

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

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

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

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

  • recurse_functions (bool) – 是否也清理此图的本地函数。 默认为 True。

返回:

self

toposort(recurse_subgraphs=True, recurse_functions=True, mode='full')

就地对图进行拓扑排序。

参数:
  • recurse_subgraphs (bool) – 是否递归地对子图进行拓扑排序。 仅当 mode=“full” 或 mode=“nodes” 时适用。 默认为 True。

  • recurse_functions (bool) – 是否对该图的函数的节点进行拓扑排序。 仅当 mode=“full” 或 mode=“nodes” 时适用。 默认为 True。

  • mode (str) – 是否重新排序此图的节点列表、函数列表或两者都重新排序。 可能的值: - “full”:对节点列表和函数列表进行拓扑排序。 - “nodes”:仅对节点列表进行排序。 - “functions”:仅对函数列表进行排序。 默认为 “full”。

返回:

self

tensors(check_duplicates=False)

通过遍历所有节点,创建此图使用的所有张量的张量映射。 空张量将从该映射中省略。

张量保证按照图中节点的顺序排列。 因此,如果图是拓扑排序的,则张量映射也将是拓扑排序的。

参数:

check_duplicates (bool) – 是否在遇到具有相同名称的多个张量时失败。

Raises:

OnnxGraphSurgeonException – 如果 check_duplicates 为 True 且图中多个不同的张量共享相同的名称。

返回:

张量名称到张量的映射。

返回类型:

OrderedDict[str, Tensor]

fold_constants(fold_shapes=True, recurse_subgraphs=True, partitioning=None, error_ok=True, flatten_subgraphs=True, size_threshold=None, should_exclude_node=None, recurse_functions=True)

就地折叠图中的常量。 在调用此函数之前,图的节点和函数必须进行拓扑排序(请参阅 toposort())。

此函数不会在折叠常量后删除它们。 为了摆脱这些悬空节点,您可以运行 cleanup() 函数。

注意:由于此函数的实现方式,该图必须可导出到 ONNX,并且可在 ONNX-Runtime 中评估。 此外,必须安装 ONNX-Runtime。

参数:
  • fold_shapes (bool) – 是否折叠图中的 Shape 节点。 这需要图中推断形状,并且只能折叠静态形状。 默认为 True。

  • recurse_subgraphs (bool) – 是否递归折叠子图中的常量。 默认为 True。

  • partitioning (Union[str, None]) –

    是否/如何对图进行分区,以便在一个模型部分中折叠时发生的错误不会影响其他部分。 可用模式为

    • None:不对图进行分区。 如果推理失败,则不会折叠任何常量。

    • “basic”:对图进行分区。 如果在一个分区中推理失败,其他分区将

      不受影响。

    • “recursive”:递归地对图进行分区。 如果在一个分区中推理失败,则该分区

      将进一步分区。

    默认为 None。

  • error_ok (bool) – 是否应禁止推理错误。 当此项为 False 时,推理期间遇到的任何错误都将重新引发。 默认为 True。

  • flatten_subgraphs (bool) – 是否在可能的情况下展平子图。 例如,可以将具有常量条件的 If 节点展平到父图中。

  • size_threshold (int) – 要折叠的常量的最大大小阈值(以字节为单位)。 任何大于此值的张量都不会被折叠。 设置为 None 以禁用大小阈值并始终折叠常量。 例如,某些模型可能会将 TileExpand 等运算应用于常量,这可能会导致非常大的张量。 与其预先计算这些常量并膨胀模型大小,不如跳过折叠它们并允许在运行时计算它们可能更合乎需要。 默认为 None。

  • should_exclude_node (Callable[[gs.Node], bool]) – 一个可调用对象,它接受来自图的 onnx-graphsurgeon 节点,并报告是否应将其从折叠中排除。 这仅针对其他可折叠的节点调用。 请注意,阻止节点被折叠也会阻止其消费者被折叠。 默认为始终返回 False 的可调用对象。

  • recurse_functions (bool) – 是否折叠此图的函数中的常量。 默认为 True。

返回:

self

layer(inputs=None, outputs=None, *args, **kwargs)

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

输入和输出列表可以包含各种不同的类型

  • 张量:

    提供的任何张量都将按原样用作创建的节点的输入/输出。 因此,您必须确保提供的张量具有唯一的名称。

  • str:

    如果提供字符串,则此函数将使用该字符串生成一个新张量以生成名称。 它将在提供的字符串末尾附加一个索引,以保证名称唯一。

  • numpy.ndarray:

    如果提供 NumPy 数组,则此函数将使用名称前缀 “onnx_graphsurgeon_constant” 生成一个 Constant 张量,并在前缀末尾附加一个索引,以保证名称唯一。

  • Union[List[Number], Tuple[Number]]:

    如果提供数字(int 或 float)的列表或元组,则此函数将使用名称前缀 “onnx_graphsurgeon_lst_constant” 生成一个 Constant 张量,并在前缀末尾附加一个索引,以保证名称唯一。 张量的值将是包含指定值的一维数组。 数据类型将为 np.float32np.int64

参数:
  • inputs (List[Union[Tensor, str, numpy.ndarray]]) – 输入列表

  • outputs (List[Union[Tensor, str, numpy.ndarray]]) – 输出列表

  • args/kwargs – 这些直接传递给 Node 的构造函数

返回:

节点的输出张量

返回类型:

List[Tensor]

copy(tensor_map: OrderedDict[str, Tensor] | None = None)

复制图。

这将复制图中的所有节点和张量,但不会对权重或属性进行深度复制(Graph 属性除外,将使用其 copy 方法复制)。

参数:

tensor_map (OrderedDict[str, Tensor]) – 从外部图到张量的张量名称映射。 如果这是最外层的图,则应为 None

返回:

图的副本。

返回类型: