comaniac opened a new issue #5928:
URL: https://github.com/apache/incubator-tvm/issues/5928


   Pointed out by @trevor-m, the following case that uses a `batch_norm -> 
get(0)` to match MobileNet V2, but some subgraphs were failed to be matched and 
partitioned.
   
   ```python
   import tvm
   from tvm import relay
   from tvm.relay.dataflow_pattern import *
   import gluoncv as gcv # require pip install gluoncv
   from tvm.relay.build_module import bind_params_by_name
   
   def get_gcv_model(model_name):
       """Pull a Gluon CV model."""
       import gluoncv as gcv
   
       model_name = model_name.lower()
   
       print('Pulling the model from Gluon CV model zoo...')
       shape = (1, 3, 224, 224)
       if model_name.find('inception') != -1:
           shape = (1, 3, 299, 299)
       elif model_name.find('yolo3') != -1:
           shape = (1, 3, 320, 320)
       elif model_name.startswith('ssd'):
           tokens = re.search(r'ssd_(\d+)_', model_name)
           size = int(tokens.group(1))
           shape = (1, 3, size, size)
       net = gcv.model_zoo.get_model(model_name, pretrained=True)
       ret = relay.frontend.from_mxnet(net, shape={'data': shape})
       return ret[0], ret[1], ('data', shape)
   
   mod, params, data_shape = get_gcv_model('mobilenetv2_1.0')
   mod["main"] = bind_params_by_name(mod["main"], params)
   
   
   bn_out = is_op('nn.batch_norm')(wildcard(), wildcard(), wildcard(), 
wildcard(), wildcard())
   pat = is_tuple_get_item(bn_out, 0)
   print(pat.partition(mod['main']))
   ```
   
   Here is a log snippet:
   
   ```
     %21 = fn (%FunctionVar_52_0, %FunctionVar_52_1, %FunctionVar_52_2, 
%FunctionVar_52_3, %FunctionVar_52_4, 
PartitionedFromPattern="nn.batch_norm_TupleGetItem0_") {
       %20 = nn.batch_norm(%FunctionVar_52_0, %FunctionVar_52_1, 
%FunctionVar_52_2, %FunctionVar_52_3, %FunctionVar_52_4);
       %20.0
     };
   %22 = %21(%19, meta[relay.Constant][21] /* ty=Tensor[(96), float32] */ /* 
ty=Tensor[(96), float32] */, meta[relay.Constant][22] /* ty=Tensor[(96), 
float32] */ /* ty=Tensor[(96), float32] */, meta[relay.Constant][23] /* 
ty=Tensor[(96), float32] */ /* ty=Tensor[(96), float32] */, 
meta[relay.Constant][24] /* ty=Tensor[(96), float32] */ /* ty=Tensor[(96), 
float32] */);
     %23 = clip(%22, a_min=0f, a_max=6f);
     %24 = nn.conv2d(%23, meta[relay.Constant][25] /* ty=Tensor[(24, 96, 1, 1), 
float32] */ /* ty=Tensor[(24, 96, 1, 1), float32] */, padding=[0, 0, 0, 0], 
channels=24, kernel_size=[1, 1]);
     %25 = nn.batch_norm(%24, meta[relay.Constant][26] /* ty=Tensor[(24), 
float32] */ /* ty=Tensor[(24), float32] */, meta[relay.Constant][27] /* 
ty=Tensor[(24), float32] */ /* ty=Tensor[(24), float32] */, 
meta[relay.Constant][28] /* ty=Tensor[(24), float32] */ /* ty=Tensor[(24), 
float32] */, meta[relay.Constant][29] /* ty=Tensor[(24), float32] */ /* 
ty=Tensor[(24), float32] */);
     %26 = %25.0;
     %27 = nn.conv2d(%26, meta[relay.Constant][30] /* ty=Tensor[(144, 24, 1, 
1), float32] */ /* ty=Tensor[(144, 24, 1, 1), float32] */, padding=[0, 0, 0, 
0], channels=144, kernel_size=[1, 1]);
     %29 = fn (%FunctionVar_50_0, %FunctionVar_50_1, %FunctionVar_50_2, 
%FunctionVar_50_3, %FunctionVar_50_4, 
PartitionedFromPattern="nn.batch_norm_TupleGetItem0_") {
       %28 = nn.batch_norm(%FunctionVar_50_0, %FunctionVar_50_1, 
%FunctionVar_50_2, %FunctionVar_50_3, %FunctionVar_50_4);
       %28.0
     };
   ```
   
   As can be seen, `batch_norm` `%20` and `%28` were successfully matched and 
partitioned, but `%25` wasn't. It seems to me that they are all the same, tho.
   
   @mbrookhart could you help take a look? Thanks


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to