[Bug] [Relax][ONNX] Runtime-shape Reshape import passes TensorType to relax.op.reshape
- Dominant language
- Python
- Stars
- 13.7k
- Forks
- 4k
- Avg merge
- 2d 1h
- Merged PRs (30d)
- 112
Description
### Expected behavior
The Relax ONNX frontend should import a valid ONNX Reshape whose shape input is a runtime INT64 tensor, or report that feature as unsupported.
### Actual behavior
The script constructs a valid ONNX model. `onnx.checker.check_model` and ONNX Runtime session construction succeed. `from_onnx` fails while converting `Reshape`:
```text
Error converting operator Reshape, with inputs: [data, shape]
Traceback (most recent call last):
...
File ".../src/relax/op/tensor/manipulate.cc", line 1014, in InferTypeReshape
TVM_FFI_VISIT_THROW(TypeError, call)
TypeError: Reshape requires the input new shape to be Shape. However, the given one is relax.TensorType
```
### Environment
* OS: macOS 15.6 (Darwin 24.6.0, arm64)
* Python: 3.12.2
* TVM: c7b458e946bc4266915da582457476bdcd9705ae (tag v0.26.0; package reports 0.26.dev0)
* ONNX: 1.17.0
* ONNX Runtime: 1.21.1
* Frontend: `tvm.relax.frontend.onnx.from_onnx`
### Steps to reproduce
The following self-contained script constructs the model:
```python
#!/usr/bin/env python3
"""Reproduce the Relax ONNX runtime-shape Reshape import failure."""
import onnx
import onnxruntime as ort
from onnx import TensorProto, helper
from tvm.relax.frontend.onnx import from_onnx
def main() -> None:
data = helper.make_tensor_value_info("data", TensorProto.FLOAT, [2, 3])
shape = helper.make_tensor_value_info("shape", TensorProto.INT64, [2])
out = helper.make_tensor_value_info("out", TensorProto.FLOAT, [3, 2])
graph = helper.make_graph(
[helper.make_node("Reshape", ["data", "shape"], ["out"])],
"reshape_runtime_shape",
[data, shape],
[out],
)
model = helper.make_model(graph, opset_imports=[helper.make_opsetid("", 18)])
onnx.checker.check_model(model)
ort.InferenceSession(model.SerializeToString(), providers=["CPUExecutionProvider"])
from_onnx(model, opset=18, keep_params_in_input=True)
if __name__ == "__main__":
main()
```
### Analysis
The runtime `Reshape` shape input is represented as `relax.TensorType`, while Relax `reshape` expects a `Shape` argument. The failure occurs during ONNX import.
### Triage
* needs-triage
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the self-contained reproduction and the `tvm.relax.frontend.onnx.from_onnx` Reshape conversion, then inspect `src/relax/op/tensor/manipulate.cc` at `InferTypeReshape`. Confirm the runtime INT64 shape case and make sure the importer either handles it successfully or reports it as unsupported without the current type error.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- compilers, machine-learning
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100