Onnx export node.scopeName() returns "" since pytorch 1.4 broke it

I need a means of connecting model.modules and exported jit graph.
in torch 1.3 I used to be able to do

import torchvision
import torch
from torch.onnx import utils
model = torchvision.models.resnet18()
tensor = torch.randn([1,3,224,224])
trace, out = torch.jit.get_trace_graph(model, tensor)
graph = trace.graph()
graph = utils._optimize_graph(graph, operator_export_type=torch._C._onnx.OperatorExportTypes.ONNX)
for i, node in enumerate(graph.nodes()):
    scopename = ".".join([x.split('[')[-1] for x in
                                  [s for s in node.scopeName().split("]")] if len(x.split('[')) > 1])
    print("node.scopeName() <%s>  named_module:"%scopename, dict(model.named_modules())[scopename])

Which gives me a nice way to be able to inspect the latents with _hooks at the same time that I know connectivity, hence can see properties like receptive filed and so on.

Since 1.4 scopeName() is empty. Looks like the pointer gets wiped out instead of stored in jit.trace

I just tried in 1.8 and it is still empty, I do realize that code should change to something like

from torch.onnx import TrainingMode
from torch.onnx import utils
graph, dic, out = utils._model_to_graph(model, tensor, training=TrainingMode.TRAINING, _retain_param_name=True)
for i, node in enumerate(graph.nodes()):

I know, I can “retain_names” and then i can grab the common prefix of the inputs that is not numeric, which will give me the scopeName of nodes with inputs. Conv yes, but not other nodes like ReLUs…

I also know that instead of _model_to_graph() I could do

trace = torch.jit.trace(model, tensor)
graph = trace.inlined_graph

which keeps the dirtier version out of which I can get the scopename, anyway, hacks.

  • Is there a reason scopeName() gets cleared by jit?
  • Anyone know if there is an alternative to scopeName such that I can connect a graph to the trace of the graph, node by node?
    Or do I have to fix the code, probably around <pytorch/torch/csrc/jit/ir/ir.h>

where is my mind, i logged this as a bug one year ago… i guess, last time i looked at this.

the answer to previous query works for this one… torch._C.Node.scopeName() missing in pytorch 1.4 · Issue #33463 · pytorch/pytorch · GitHub