garfield0xff opened a new issue, #18373:
URL: https://github.com/apache/tvm/issues/18373

   ### Expected behavior
   Run End-to-End Optimize tutorial code  [tvm 0.22 
guideline](https://tvm.apache.org/docs/how_to/tutorials/e2e_opt_model.html)
   
   ### Output
   ```
   Traceback (most recent call last):
   ^^^^^^
     File ".../base_fx_graph_translator.py", line 938, in _conv2d
       return self._conv2d_impl(
              ^^^^^^^^^^^^^^^^^^
     File ".../base_fx_graph_translator.py", line 925, in _conv2d_impl
       assert len(self.shape_of(bias)) == 1
                  ^^^^^^^^^^^^^^^^^^^
     File ".../base_fx_graph_translator.py", line 84, in shape_of
       if not isinstance(tensor.struct_info, relax.TensorStructInfo):
                         ^^^^^^^^^^^^^^^^^^
   
   tvm.error.InternalError: Check failed: (ptr) is false: The struct_info is 
not populated, check if you have normalized the expr
   [16:55:59] /block_builder.cc:64: Warning: BlockBuilder destroyed with 
remaining blocks!
   ```
   
   ### Environment
   
   - OS        : Mac M2 ( Sequoia  ) 
   - TVM     : 0.22.dev0
   - Python : 3.11.14
   - Pytorch : 2.8.0 
   
   ### Steps to reproduce
   
   ```
   import os
   import numpy as np
   import torch
   from torch.export import export
   from torchvision.models.resnet import ResNet18_Weights, resnet18
   
   torch_model = resnet18(weights=ResNet18_Weights.DEFAULT).eval()
   
   from tvm import relax
   from tvm.relax.frontend.torch import from_exported_program
   
   # Give an example argument to torch.export
   example_args = (torch.randn(1, 3, 224, 224, dtype=torch.float32),)
   
   # Skip running in CI environment
   IS_IN_CI = os.getenv("CI", "") == "true"
   
   if not IS_IN_CI:
       # Convert the model to IRModule
       with torch.no_grad():
           exported_program = export(torch_model, example_args)
           mod = from_exported_program(exported_program, 
keep_params_as_input=True)
   
       mod, params = relax.frontend.detach_params(mod)
       mod.show()
   ```
   
   ### Note
   Updated _conv2d_impl to handle both Python None and relax.null_value() 
before calling shape_of and reshaping. This prevents the assert from triggering 
when a Conv2d operation has no bias. While this makes the code work, I'm not 
sure if this is the correct approach.
   
   ```
       def _conv2d_impl(
           self,
           x: relax.Expr,
           weight: relax.Expr,
           bias: Optional[relax.Expr],
           strides: Optional[Tuple],
           padding: Optional[Tuple],
           dilation: Optional[Tuple],
           groups: Optional[Tuple],
       ):
           conv2d = self.block_builder.emit(
               relax.op.nn.conv2d(
                   x,
                   weight,
                   strides=strides,
                   padding=padding,
                   dilation=dilation,
                   groups=groups,
                   data_layout="NCHW",
                   kernel_layout="OIHW",
                   out_dtype="float32",
               )
           )
   
           
           if bias is None:
               return conv2d
           # add 
           if isinstance(bias, relax.Call) and bias.op == 
relax.op.null_value().op:
               return conv2d
           assert len(self.shape_of(bias)) == 1
           bias = relax.op.reshape(bias, (1, -1, 1, 1))
           return self.block_builder.emit(relax.op.add(conv2d, bias))
   ```
   
   
   ### Triage
   
   - needs-triage
   - bug
   


-- 
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.

To unsubscribe, e-mail: [email protected]

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

Reply via email to