Skip to content

[Bug] Mul + ReduceSum crashes in onnx frontend #20117

Description

@XYZboom

Expected behavior

tvm.relax.frontend.onnx.from_onnx() should successfully import any valid ONNX model, including Min with two constant inputs. The imported Relax IR module should represent the correct elementwise minimum computation.

Actual behavior

from_onnx() crashes with a TypeError during the Min operator conversion:

Error converting operator Min, with inputs: [metadata["relax.expr.Constant"][0]
# Metadata omitted. Use show_meta=True in script() method to show it., metadata["relax.expr.Constant"][0]
# Metadata omitted. Use show_meta=True in script() method to show it.]

TypeError: only integer scalar arrays can be converted to a scalar index

Environment

  • OS: Linux (x86_64, conda environment)
  • GPU: NVIDIA GeForce RTX 3080 Ti (12GB VRAM, CUDA 580.76.05)
  • TVM version: 0.25.0.post1
  • Target: cuda (GPU compilation)
  • Python: 3.12

Steps to reproduce

from onnx import helper, TensorProto
import onnxruntime as ort
import numpy as np

c1 = helper.make_tensor("c1_v", TensorProto.FLOAT, [2], [1.0, 2.0])
c2 = helper.make_tensor("c2_v", TensorProto.FLOAT, [2], [3.0, 4.0])
v_out = helper.make_tensor_value_info('v_out', TensorProto.FLOAT, [2])

n1 = helper.make_node('Constant', inputs=[], outputs=['c1'], value=c1)
n2 = helper.make_node('Constant', inputs=[], outputs=['c2'], value=c2)
n3 = helper.make_node('Min', inputs=['c1', 'c2'], outputs=['v_out'])

_graph = helper.make_graph([n1, n2, n3], 'min_const', [], [v_out])
_model = helper.make_model(_graph, opset_imports=[helper.make_opsetid('', 11)])

np.random.seed(42)
_sess = ort.InferenceSession(_model.SerializeToString(), providers=['CPUExecutionProvider'])
_result = _sess.run(None, {})

from tvm.relax.frontend.onnx import from_onnx
mod = from_onnx(_model)
Error converting operator Min, with inputs: [metadata["relax.expr.Constant"][0]
# Metadata omitted. Use show_meta=True in script() method to show it., metadata["relax.expr.Constant"][0]
# Metadata omitted. Use show_meta=True in script() method to show it.]
Traceback (most recent call last):
  File "/root/autodl-tmp/data/maybeBug/onnx-tvm-cpu-scalar-index-001/reduced_minimal.py", line 15, in <module>
    mod = from_onnx(_model)
          ^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py", line 5864, in from_onnx
    return g.from_onnx(graph, opset)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py", line 5393, in from_onnx
    self._construct_nodes(graph)
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py", line 5602, in _construct_nodes
    raise err
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py", line 5596, in _construct_nodes
    op = self._convert_operator(op_name, inputs, attr, self.opset)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py", line 5696, in _convert_operator
    sym = op_function(self.bb, inputs, attrs, [self._nodes, self._params])
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py", line 2253, in _impl_v1
    output = cls.numpy_op(*np_inputs)  # pylint: disable=not-callable
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/numpy/_core/fromnumeric.py", line 3299, in min
    return _wrapreduction(a, np.minimum, 'min', axis, None, out,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/aifuzzer/lib/python3.12/site-packages/numpy/_core/fromnumeric.py", line 83, in _wrapreduction
    return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: only integer scalar arrays can be converted to a scalar index
[19:59:47] /project/src/relax/ir/block_builder.cc:66: Warning: BlockBuilder destroyed with remaining blocks!

Triage

  • frontend:onnx
  • needs-triage

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-triagePRs or issues that need to be investigated by maintainers to find the right assignees to address ittype: bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions