apache / tvm

Open deep learning compiler stack for cpu, gpu and specialized accelerators
https://tvm.apache.org/
Apache License 2.0
11.58k stars 3.43k forks source link

AttributeError during ConvertLayout to NHWC #6410

Closed leandron closed 3 years ago

leandron commented 4 years ago

When using tvm.relay.transform.ConvertLayout (in the context of #6302), I'm getting some errors that are not really clear on how they are related to the convert process.

It seems ConvertLayout it is looking for shape (this check was introduced in #5284), when trying to find depthwise convolutions, but it doesn't seem to be the case that shape is there for some imported models, and might need some fixing. https://github.com/apache/incubator-tvm/blob/4b48d89c79a72f7799606e845bdb1ed938baa115/python/tvm/relay/op/nn/_nn.py#L158-L164

This is the error I see, when trying to run ConvertLayout on an ONNX model:

AttributeError: <class 'tvm.relay.expr.TupleGetItem'> has no attribute shape

To reproduce the issue, you can run the script below:

  1. Download resnet50:

    wget https://github.com/onnx/models/raw/master/vision/classification/resnet/model/resnet50-v2-7.onnx
  2. Run the ConvertLayout following the script below:

    
    import onnx
    import tvm
    from tvm import relay

boilerplate to load the ONNX model

model = onnx.load("resnet50-v2-7.onnx") name = model.graph.input[0].name proto_shape = model.graph.input[0].type.tensor_type.shape.dim shape = [d.dim_value for d in proto_shape] shape_dict = {name: shape} mod, params = relay.frontend.from_onnx(model, shape_dict)

converting layout

desired_layouts = {'nn.conv2d': ['NHWC', 'default']} seq = tvm.transform.Sequential([relay.transform.RemoveUnusedFunctions(), relay.transform.ConvertLayout(desired_layouts)])

with tvm.transform.PassContext(opt_level=3): mod = seq(mod)

with relay.build_config(opt_level=3): graph, lib, params = relay.build(mod, "llvm", params=params)



PS: It also happens if I get a NHWC TFlite model and try to force it into an NHWC convertion, but that is a negative test, that is why I didn't add it here.

cc @comaniac @jwfromm 
lhutton1 commented 4 years ago

I think this is happening because the shape of data is accessed by data.shape, at some point something in TVM changed meaning shape needs to be accessed by data.checked_type.shape. It looks like the convert layout tests didn't pick this up.

leandron commented 4 years ago

If we agree this is a legitimate issue, I found two places that need fixing:

https://github.com/apache/incubator-tvm/blob/4b48d89c79a72f7799606e845bdb1ed938baa115/python/tvm/relay/op/nn/_nn.py#L160

https://github.com/apache/incubator-tvm/blob/4b48d89c79a72f7799606e845bdb1ed938baa115/python/tvm/relay/qnn/op/layout_conversions.py#L65

zhiics commented 3 years ago

cc @anijain2305

anijain2305 commented 3 years ago

Thanks @leandron for raising the issue. Your fixes look good to me.

leandron commented 3 years ago

Just to mention, I checked PR #6419 and it completely fixes this issue here, so we can close it once that PR is merged.

zhiics commented 3 years ago

Thanks @leandron. This can be closed now.