# Problem Description

I am trying to deploy a [PyTorch 
model](https://github.com/mit-han-lab/ProxylessNAS) to TVM. When loading the 
onnx version via `relay.frontend.from_onnx`, it throws the following errors


```python
  %239 = take(%238, int64(0), axis=0)
  %240 = expand_dims(%239, axis=0)
  %241 = expand_dims(int64(-1), axis=0)
  %242 = (%240, %241)
  concatenate(%242) an internal invariant was violated while typechecking your 
program [00:12:52] 
/Users/ligeng/Workspace/tvm/src/relay/op/tensor/transform.cc:204: Check failed: 
e_dtype == dtype (int64 vs. int32) : relay.concatenate requires all tensors 
have the same dtype
```

The complete log is attached on 
[Gist](https://gist.github.com/Lyken17/9f74f71998c1f4761f04b8147e546eb2). It 
seems somewhere in the Relay is trying to concatenate Int64 and Int32 and 
causes the dtype error. After some exploration, I locate the related onnx 
snippets

```python
  %545 : Float(1, 1432, 1, 1) = onnx::GlobalAveragePool(%544), scope: 
ProxylessNASNets/AdaptiveAvgPool2d[global_avg_pooling]
  %546 : Long() = onnx::Constant[value={0}](), scope: ProxylessNASNets
  %547 : Tensor = onnx::Shape(%545), scope: ProxylessNASNets
  %548 : Long() = onnx::Gather[axis=0](%547, %546), scope: ProxylessNASNets
  %549 : Long() = onnx::Constant[value={-1}](), scope: ProxylessNASNets
  %550 : Tensor = onnx::Unsqueeze[axes=[0]](%548)
  %551 : Tensor = onnx::Unsqueeze[axes=[0]](%549)
  %552 : Tensor = onnx::Concat[axis=0](%550, %551)
  %553 : Float(1, 1432) = onnx::Reshape(%545, %552), scope: ProxylessNASNets
  %output1 : Float(1, 1000) = onnx::Gemm[alpha=1, beta=1, transB=1](%553, 
%classifier.linear.weight, %classifier.linear.bias), scope: 
ProxylessNASNets/LinearLayer[classifier]/Linear[linear]
```

which is generated from the following pytorch code 

```python
    def forward(self, x):
        x = self.first_conv(x)
        for block in self.blocks:
            x = block(x)
        if self.feature_mix_layer:
            x = self.feature_mix_layer(x)
        x = self.global_avg_pooling(x)
        x = x.view(x.size(0), -1)  # flatten
        return x
```

It looks like the size `x.size(0)` is treated as `int32` when parsing to onnx. 
So I first try to manually set the dtype.

```python
         x = x.view(x.size(0), x.size(1))  # flatten
```

This time, Halide IR raises the error 

```python
[00:31:38] /Users/ligeng/Workspace/tvm/src/relay/pass/pass_manager.cc:312: 
Executing function pass : InferType with opt level: 0
[00:31:38] /Users/ligeng/Workspace/tvm/src/relay/pass/pass_manager.cc:312: 
Executing function pass : SimplifyInference with opt level: 0
[00:31:38] /Users/ligeng/Workspace/tvm/src/relay/pass/pass_manager.cc:312: 
Executing function pass : FuseOps with opt level: 1
[00:31:38] /Users/ligeng/Workspace/tvm/src/relay/pass/pass_manager.cc:312: 
Executing function pass : InferType with opt level: 0
Traceback (most recent call last):
  File "/Users/ligeng/Workspace/ProxylessNAS/load_onnx.py", line 32, in <module>
    sym, params = relay.frontend.from_onnx(onnx_model, shape_dict)
  File "/Users/ligeng/Workspace/tvm/python/tvm/relay/frontend/onnx.py", line 
1246, in from_onnx
    sym, params = g.from_onnx(graph, opset)
  File "/Users/ligeng/Workspace/tvm/python/tvm/relay/frontend/onnx.py", line 
1074, in from_onnx
    op = self._convert_operator(op_name, inputs, attr, opset)
  File "/Users/ligeng/Workspace/tvm/python/tvm/relay/frontend/onnx.py", line 
1180, in _convert_operator
    sym = convert_map[op_name](inputs, attrs, self._params)
  File "/Users/ligeng/Workspace/tvm/python/tvm/relay/frontend/onnx.py", line 
417, in _impl_v1
    graph, lib, params = tvm.relay.build(func, target="llvm", params=params)
  File "/Users/ligeng/Workspace/tvm/python/tvm/relay/build_module.py", line 
196, in build
    params)
  File "/Users/ligeng/Workspace/tvm/python/tvm/relay/build_module.py", line 
107, in build
    self._build(func, target, target_host)
  File "/Users/ligeng/Workspace/tvm/python/tvm/_ffi/_ctypes/function.py", line 
209, in __call__
    raise get_last_ffi_error()
  File "/Users/ligeng/Workspace/tvm/3rdparty/HalideIR/src/ir/IR.cpp", line 469
TVMError: Check failed: args[i].type() == Int(32): Args to call to halide 
function must be type Int(32)
```

Halide IR requires all args to be Int32, so my current work through is to loose 
the dtype check `3rdparty/HalideIR/src/ir/IR.cpp line 468` from

```
       for (size_t i = 0; i < args.size(); i++) {
            internal_assert(args[i].type() == Int(32))
            << "Args to call to halide function must be type Int(32)\n";
        }
```

to 

```
       for (size_t i = 0; i < args.size(); i++) {
            internal_assert(args[i].type() == Int(32) or args[i].type() == 
Int(64))
            << "Args to call to halide function must be type Int(32)\n";
        }
```





---
[Visit 
Topic](https://discuss.tvm.ai/t/onnx-relay-inconsistency-between-int32-and-int64-after-view-opeartion/2940/1)
 to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, [click 
here](https://discuss.tvm.ai/email/unsubscribe/e35e27d7f15f73002cbd5916d2c440688f3edf7ebb238c47e7bef3bf9fd76758).

Tianqi Chen, UW, Seattle, WA, 98105, United States
http://tracking.discuss.tvm.ai/tracking/unsubscribe?msgid=HX6NywscW6NWpbWMz6lCDw2

Reply via email to