图
- 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
以禁用大小阈值并始终折叠常量。 例如,某些模型可能会将 Tile 或 Expand 等运算应用于常量,这可能会导致非常大的张量。 与其预先计算这些常量并膨胀模型大小,不如跳过折叠它们并允许在运行时计算它们可能更合乎需要。 默认为 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.float32 或 np.int64。