Skip to content

Pytorch generated ONNX graph with GLOW #1580

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
dmoham1476 opened this issue Sep 4, 2018 · 5 comments
Closed

Pytorch generated ONNX graph with GLOW #1580

dmoham1476 opened this issue Sep 4, 2018 · 5 comments

Comments

@dmoham1476
Copy link

Hi

I was able to generate an alexnet.onnx graph from Pytorch using this tutorial
https://pytorch.org/docs/stable/onnx.html

I then tried to run this graph with GLOW. I see that in the generated ONNX graph for the Reshape operator, the tensor names are id: 29 for data and id: 36 for shape input. I get this assertion error -

#3 0x00007ffff6810c82 in _GI___assert_fail (assertion=0x643460 "tensors.count(name) && "There is no tensor registered with this name."",

(gdb) bt
#0 0x00007ffff6818428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007ffff681a02a in __GI_abort () at abort.c:89
#2 0x00007ffff6810bd7 in _assert_fail_base (fmt=,
assertion=assertion@entry=0x643460 "tensors
.count(name) && "There is no tensor registered with this name."",
file=file@entry=0x643420 "/ml/arch/dmohan/projects/glow/lib/Importer/ProtobufLoader.cpp", line=line@entry=33,
function=function@entry=0x643940 glow::ProtobufLoader::getTensorByName(llvm::StringRef)::__PRETTY_FUNCTION__ "glow::Tensor* glow::ProtobufLoader::getTensorByName(llvm::StringRef)") at assert.c:92
#3 0x00007ffff6810c82 in _GI___assert_fail (assertion=0x643460 "tensors.count(name) && "There is no tensor registered with this name."",
file=0x643420 "/ml/arch/dmohan/projects/glow/lib/Importer/ProtobufLoader.cpp", line=33,
function=0x643940 glow::ProtobufLoader::getTensorByName(llvm::StringRef)::__PRETTY_FUNCTION__ "glow::Tensor* glow::ProtobufLoader::getTensorByName(llvm::StringRef)") at assert.c:101
#4 0x0000000000424373 in glow::ProtobufLoader::getTensorByName (this=0x959910, name=...)
at /ml/arch/dmohan/projects/glow/lib/Importer/ProtobufLoader.cpp:32
#5 0x000000000044ad28 in glow::CommonOperatorLoader<glow_onnx::NodeProto, glow_onnx::AttributeProto>::loadReshape (this=0x959910, op=...,
dict=std::unordered_map with 0 elements) at /ml/arch/dmohan/projects/glow/include/glow/Importer/CommonOperatorLoader.h:240
#6 0x000000000044654e in glow::CommonOperatorLoader<glow_onnx::NodeProto, glow_onnx::AttributeProto>::tryLoadCommonOperator (this=0x959910,
typeName=..., op=..., dict=std::unordered_map with 0 elements)
at /ml/arch/dmohan/projects/glow/include/glow/Importer/CommonOperatorLoader.h:429
#7 0x000000000043fece in glow::ONNXModelLoader::loadOperator (this=0x959910, op=...) at /ml/arch/dmohan/projects/glow/lib/Importer/ONNX.cpp:181
#8 0x0000000000443dbe in glow::ONNXModelLoader::loadNetwork (this=0x959910, net=...) at /ml/arch/dmohan/projects/glow/lib/Importer/ONNX.cpp:514
#9 0x000000000044426f in glow::ONNXModelLoader::ONNXModelLoader (this=0x959910,
modelDescFilename="/ml/arch/dmohan/projects/vision/alexnet.onnx", tensorNames=..., tensors=..., F=...)
at /ml/arch/dmohan/projects/glow/lib/Importer/ONNX.cpp:571
#10 0x000000000041b88f in main (argc=4, argv=0x7fffffffe9c8) at /ml/arch/dmohan/projects/glow/tools/loader/ImageClassifier.cpp:197
(gdb) f 5
#5 0x000000000044ad28 in glow::CommonOperatorLoader<glow_onnx::NodeProto, glow_onnx::AttributeProto>::loadReshape (this=0x959910, op=...,
dict=std::unordered_map with 0 elements) at /ml/arch/dmohan/projects/glow/include/glow/Importer/CommonOperatorLoader.h:240
240 Tensor *constShapeTensor = getTensorByName(op.input(1));
(gdb) p op.input(1)
$1 = "36"

@rdzhabarov
Copy link
Contributor

rdzhabarov commented Sep 4, 2018

If you look at the ONNX loader, "shape" comes either from the "shape" attribute or from the input.
It seems like Glow expects input(1) to be statically defined in the net.initializers().

Does that "shape" come from an activation?

@dmoham1476
Copy link
Author

It seems the shape parameter in the graph doesn't have a kind:initializer that I see for Reshape nodes in other graphs. I also see the data input to the Reshape node comes from a previous MaxPool node and the shape input comes from a previous Concat layer and hence the concat=>result is becoming the Shape

@jfix71
Copy link
Contributor

jfix71 commented Sep 5, 2018

I've had issues like this and at least in my case the shape info is statically known, but the ONNX exporter decided to export multiple nodes to create the shape vector instead of statically passing it in as member inputs. We would need to do some sort of constant propagation to get the shape, but we don't currently support this. Your options are to implement this constant propagation in Glow, modify the proto manually with the shape info yourself, or ONNX needs to be taught to not do it like this.

@rdzhabarov
Copy link
Contributor

"modify the proto manually with the shape info yourself"

Seems a good short-term solution for one off problem.

@dmoham1476 does that work for you? If it does feel free to close the issue.

@dmoham1476
Copy link
Author

Ok, I see a similar behavior with the Shape when I converted pytorch sqeezenet to onnx using torch.onnx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants