InternalGraph¶
- class InternalGraph(name, qualname)[源代码]¶
InternalGraph
是 TracedModule 中使用的主要数据结构。它用来表示 Module 的 forward 方法的执行过程。例如,下面的代码
import megengine.random as rand import megengine.functional as F import megengine.module as M import megengine.traced_module as tm class MyModule(M.Module): def __init__(self): super().__init__() self.param = rand.normal(size=(3, 4)) self.linear = M.Linear(4, 5) def forward(self, x): return F.relu(self.linear(x + self.param)) net = MyModule() inp = F.zeros(shape = (3, 4)) traced_module = tm.trace_module(net, inp)
- Will produce the following
InternalGraph
: print(traced_module.graph)
MyModule.Graph (self, x) { %2: linear = getattr(self, "linear") -> (Linear) %3: param = getattr(self, "param") -> (Tensor) %4: add_out = x.__add__(param, ) %5: linear_out = linear(add_out, ) %6: relu_out = nn.relu(linear_out, ) return relu_out }
- add_output_node(node)[源代码]¶
向计算图中添加一个输出节点。
调用
add_output_node
后,图形输出将变成一个tuple
。tuple
的第一个元素是原始输出,第二个元素是node
。例如,下面的代码
import megengine.functional as F import megengine.module as M import megengine.traced_module as tm class MyModule(M.Module): def forward(self, x): x = x + 1 return x net = MyModule() inp = F.zeros(shape = (1, )) traced_module = tm.trace_module(net, inp) graph = traced_module.graph inp_node = graph.inputs[1] out_node = graph.outputs[0] graph.add_output_node(inp_node) graph.add_output_node(out_node) out = traced_module(inp)
将生成以下
InternalGraph
和out
:print(graph) print(out)
MyModule.Graph (self, x) { %2: add_out = x.__add__(1, ) return add_out, x, add_out } ((Tensor([1.], device=xpux:0), Tensor([0.], device=xpux:0)), Tensor([1.], device=xpux:0))
- exprs(recursive=True)[源代码]¶
获取构成这个计算图的 Exprs。
- 参数
recursive – 是否获取子图中的 Exprs 。默认值:True
- 返回
ExprFilter
包含计算图的所有 Exprs.
- get_node_by_id(node_id=None, recursive=True)[源代码]¶
通过
id
来过滤 Nodes.Node
的id
可以通过下面的代码获得# node : Node print("{:i}".format(node)) print(node.__format__("i")) # graph : InternalGraph print("{:i}".format(graph)) print(graph.__format__("i"))
- get_node_by_name(name=None, ignorecase=True, recursive=True)[源代码]¶
通过全名来过滤 Nodes.
Node
的全名可以通过下面的代码获得# node : Node print("{:p}".format(node)) print(node.__format__("p")) # graph : InternalGraph print("{:p}".format(graph)) print(graph.__format__("p"))
- insert_exprs(expr=None)[源代码]¶
初始化 trace 模式和插入位置。
当在 with 语句中使用时,将临时设置 trace 模式,然后在with语句退出时恢复正常模式:
with graph.insert_exprs(e): # set the trace mode ... # trace function or module ... # inert exprs into graph and resotre normal mode
- 参数
expr (
Optional
[Expr
]) – 在哪个expr
之后插入。如果为None,插入位置将根据输入节点自动设置。- 返回
一个资源管理器,它将在
__enter__
里初始化 trace 模式,并在__exit__
里恢复正常模式。
- nodes(recursive=True)[源代码]¶
获取构成这个计算图的节点。
- 参数
recursive – 是否获取子图中的 Nodes. 默认值:True
- 返回
包含此计算图的所有节点的
NodeFilter
。
- property qualname¶
获取此计算图的 qualname 。qualname 可以用来从被跟踪的模块或普通模块中获取子模块。
示例
import megengine.module as M import megengine.traced_module as tm import megengine as mge class block(M.Module): def __init__(self): super().__init__() self.relu = M.ReLU() def forward(self, x): return self.relu(x) class module(M.Module): def __init__(self): super().__init__() self.block = block() def forward(self, x): x = self.block(x) return x net = module() traced_net = tm.trace_module(net, mge.Tensor([0.])) qualname = traced_net.block.graph.qualname # qualname = "module.block" qualname = qualname.split(".", 1)[-1] # qualname = "block" assert qualname in list(map(lambda x: x[0], net.named_modules())) assert qualname in list(map(lambda x: x[0], traced_net.named_modules()))
- 返回类型
- replace_node(repl_dict)[源代码]¶
替换图中的节点。
- 参数
repl_dict (
Dict
[Node
,Node
]) – 指定如何替换节点的 map {old_Node: new_Node} 。
- reset_outputs(outputs)[源代码]¶
重置计算图的输出节点。
注解
此方法只支持重置没有父图的计算图的输出。
- 参数
outputs – 内部元素为 Node 的对象。支持元组、列表、字典等。
例如,下面的代码
import megengine.functional as F import megengine.module as M import megengine.traced_module as tm class MyModule(M.Module): def forward(self, x): x = x + 1 return x net = MyModule() inp = F.zeros(shape = (1, )) traced_module = tm.trace_module(net, inp) graph = traced_module.graph inp_node = graph.inputs[1] out_node = graph.outputs[0] graph.reset_outputs((out_node, {"input": inp_node})) out = traced_module(inp)
将生成以下
InternalGraph
和out
:print(graph) print(out)
MyModule.Graph (self, x) { %2: add_out = x.__add__(1, ) return add_out, x } (Tensor([1.], device=xpux:0), {'input': Tensor([0.], device=xpux:0)})
- property top_graph¶
得到这个计算图的父图。
- 返回
一个
InternalGraph
.
- Will produce the following