AleksKnezevic opened a new issue #10720:
URL: https://github.com/apache/tvm/issues/10720


   I believe that data type promotion is happening incorrectly for aten::div. 
As you can see here: 
https://pytorch.org/docs/stable/generated/torch.div.html#torch.div when both 
inputs are integers, they should get promoted to default scalar type, to allow 
true division. 
   
   ### Expected behavior
   
   Running the following code should produce a float divide: 
   > inv_freq = torch.arange(0, 64, 2) / 64
   
   ### Actual behavior
   
   It produces an integer divide:
   
   > %2 = divide(%0, 64 /* ty=int64 */, Tensor[(32), int64], int64) /* 
ty=Tensor[(32), int64] */;
   
   ### Steps to reproduce
   
   Run the following through pytorch front end: 
   
   > inv_freq = torch.arange(0, 64, 2) / 64
   
   ### Code proposal
   You didn't ask for it in the bug report, but I already fixed it locally, so 
I'll share :)
   ```
   
   diff --git a/python/tvm/relay/frontend/pytorch.py 
b/python/tvm/relay/frontend/pytorch.py
   index 1e621ff31..b8a6776a8 100644
   --- a/python/tvm/relay/frontend/pytorch.py
   +++ b/python/tvm/relay/frontend/pytorch.py
   @@ -255,6 +255,20 @@ class PyTorchOpConverter:
        # Operator implementations
        def make_elemwise(self, name):
            def elemwise(inputs, input_types):
   +            if name == "divide":
   +                # 
https://pytorch.org/docs/stable/generated/torch.div.html#torch.div
   +                # None - default behavior. Performs no rounding and, if 
both input and 
   +                # other are integer types, promotes the inputs to the 
default scalar type.
   +                if all(["int" in input_type for input_type in 
input_types[:2]]):
   +                    input_types[:2] = ["float32"] * 2
   +                    cast_inputs = []
   +                    for inp in inputs[:2]:
   +                        if np.isscalar(inp):
   +                            cast_inputs.append(_expr.const(inp, 
dtype="float32"))
   +                        else:
   +                            cast_inputs.append(_op.cast(inp, "float32"))
   +                    inputs[:2] = cast_inputs
   +
                data0, data1 = self.pytorch_promote_types(inputs[:2], 
input_types[:2])
                return get_relay_op(name)(data0, data1)
    
    
   ```
   


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