From 66873cfb4c2600d472c947600b7a67d0393756ea Mon Sep 17 00:00:00 2001 From: Danilo Date: Thu, 21 Sep 2023 20:48:55 +0200 Subject: [PATCH 1/4] [Unity] Fix TVMError when loading ONNX model with CumSum operator --- python/tvm/relax/frontend/onnx/onnx_frontend.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/tvm/relax/frontend/onnx/onnx_frontend.py b/python/tvm/relax/frontend/onnx/onnx_frontend.py index fbd478ee5ab4..791680cce3d2 100644 --- a/python/tvm/relax/frontend/onnx/onnx_frontend.py +++ b/python/tvm/relax/frontend/onnx/onnx_frontend.py @@ -729,6 +729,8 @@ def _impl_v14(cls, bb, inputs, attr, params): if isinstance(axis, relax.Constant): axis = int(axis.data.numpy()) + elif isinstance(axis,relax.Var): + axis = 0 data = relax.op.cumsum(data, axis) if attr.get("reverse", 0) != 0: data = bb.emit_te(topi.flip, data, axis=axis if axis else 0) From 5b62c4b7a4be1e94f6f602e6b030fd6b74661987 Mon Sep 17 00:00:00 2001 From: Danilo Date: Mon, 25 Sep 2023 14:29:17 +0200 Subject: [PATCH 2/4] Add regression test for loading ONNX model with CumSum operator --- .../tvm/relax/frontend/onnx/onnx_frontend.py | 2 +- tests/python/frontend/onnx/test_forward.py | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/python/tvm/relax/frontend/onnx/onnx_frontend.py b/python/tvm/relax/frontend/onnx/onnx_frontend.py index 791680cce3d2..aff3853b1350 100644 --- a/python/tvm/relax/frontend/onnx/onnx_frontend.py +++ b/python/tvm/relax/frontend/onnx/onnx_frontend.py @@ -729,7 +729,7 @@ def _impl_v14(cls, bb, inputs, attr, params): if isinstance(axis, relax.Constant): axis = int(axis.data.numpy()) - elif isinstance(axis,relax.Var): + elif isinstance(axis, relax.Var): axis = 0 data = relax.op.cumsum(data, axis) if attr.get("reverse", 0) != 0: diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index b9f2d14b7888..b7757faf7386 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -37,6 +37,7 @@ from tvm.contrib import graph_executor, utils from tvm.relay.frontend.common import infer_type from tvm.relay.build_module import bind_params_by_name +from tvm.relax.frontend.onnx import from_onnx from relay.utils.tag_span import _create_span, _set_span, _verify_structural_equal_with_span import onnx @@ -5376,6 +5377,27 @@ def verify_softplus(indata): input_data = np.random.randn(1, 32, 32, 3).astype("float32") verify_softplus(input_data) +def test_load_cumsum(): + """test_load_cumsum""" + + def create_cumsum_model(): + input_shape = [2, 3] + + graph = helper.make_graph( + [ + helper.make_node("CumSum", inputs=["X", "axis"], outputs=["Y"]), + ], + "cumsum_graph", + inputs=[ + helper.make_tensor_value_info("X", onnx.TensorProto.DOUBLE, input_shape), + helper.make_tensor_value_info("axis", onnx.TensorProto.INT32, [1], 'axis'), + ], + outputs= + [helper.make_tensor_value_info("Y", onnx.TensorProto.DOUBLE, input_shape)], + ) + return helper.make_model(graph) + + from_onnx(create_cumsum_model()) @tvm.testing.parametrize_targets def test_cumsum(target, dev): From 92318253da9b20f1596268cf3e1f1dbfa8450ba8 Mon Sep 17 00:00:00 2001 From: Danilo Date: Mon, 25 Sep 2023 15:43:53 +0200 Subject: [PATCH 3/4] Fix formatting --- tests/python/frontend/onnx/test_forward.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index b7757faf7386..161353050faf 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -2920,7 +2920,6 @@ def test_batch_norm_dynamic_subgraph(target, dev): """test_batch_norm_dynamic_subgraph""" def verify_batch_norm_dynamic_subgraph(in_shape, o_shape): - batchnorm = onnx.helper.make_node( "BatchNormalization", inputs=["x", "scale", "B", "mean", "var"], outputs=["Y"] ) @@ -5377,6 +5376,7 @@ def verify_softplus(indata): input_data = np.random.randn(1, 32, 32, 3).astype("float32") verify_softplus(input_data) + def test_load_cumsum(): """test_load_cumsum""" @@ -5390,15 +5390,15 @@ def create_cumsum_model(): "cumsum_graph", inputs=[ helper.make_tensor_value_info("X", onnx.TensorProto.DOUBLE, input_shape), - helper.make_tensor_value_info("axis", onnx.TensorProto.INT32, [1], 'axis'), + helper.make_tensor_value_info("axis", onnx.TensorProto.INT32, [1], "axis"), ], - outputs= - [helper.make_tensor_value_info("Y", onnx.TensorProto.DOUBLE, input_shape)], + outputs=[helper.make_tensor_value_info("Y", onnx.TensorProto.DOUBLE, input_shape)], ) return helper.make_model(graph) from_onnx(create_cumsum_model()) + @tvm.testing.parametrize_targets def test_cumsum(target, dev): """test_cumsum""" @@ -6651,7 +6651,6 @@ def verify_qlinearconv( bias=False, per_channel_quantization=False, ): - x_array = np.random.randint(low=0, high=255, size=x_shape).astype("uint8") w_array = np.random.uniform(low=0, high=255, size=w_shape).astype("uint8") @@ -7011,7 +7010,6 @@ def test_qlinearadd(target, dev): """test_qlinearadd""" def verify_qlinearadd(a_shape, b_shape, c_shape): - _ = np.random.random(a_shape).astype("float32") _ = np.random.random(b_shape).astype("float32") @@ -7044,7 +7042,6 @@ def test_qlinearmul(target, dev): """test_qlinearmul""" def verify_qlinearmul(a_shape, b_shape, c_shape): - _ = np.random.random(a_shape).astype("float32") _ = np.random.random(b_shape).astype("float32") @@ -7079,7 +7076,6 @@ def test_qlinearleakyrelu(target, dev): """test_qlinearleakyrelu""" def verify_qlinearleakyrelu(inshape, kwargs): - in_array = np.random.random(inshape).astype("float32") node = helper.make_node("LeakyRelu", ["X"], ["Y"], **kwargs) @@ -7107,7 +7103,6 @@ def test_qlinearsigmoid(target, dev): """test_qlinearsigmoid""" def verify_qlinearsigmoid(a_shape): - _ = np.random.random(a_shape).astype("float32") input_nodes = [helper.make_tensor_value_info("a", TensorProto.FLOAT, list(a_shape))] @@ -7133,7 +7128,6 @@ def test_qlinearsoftmax(target, dev): """test_qlinearsoftmax""" def verify_qlinearsoftmax(a_shape): - _ = np.random.random(a_shape).astype("float32") input_nodes = [helper.make_tensor_value_info("a", TensorProto.FLOAT, list(a_shape))] @@ -7909,7 +7903,6 @@ def verify_scan( scan_output_directions, opset, ): - body_input_shapes = copy.deepcopy(input_shapes) num_state_inputs = len(input_shapes) - num_scan_inputs From 972f1ed471783c851f25b6315cb8201596b10d54 Mon Sep 17 00:00:00 2001 From: Danilo Date: Tue, 3 Oct 2023 15:58:20 +0200 Subject: [PATCH 4/4] Fix spacing errors --- tests/python/frontend/onnx/test_forward.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 161353050faf..c64b5e881369 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -2920,6 +2920,7 @@ def test_batch_norm_dynamic_subgraph(target, dev): """test_batch_norm_dynamic_subgraph""" def verify_batch_norm_dynamic_subgraph(in_shape, o_shape): + batchnorm = onnx.helper.make_node( "BatchNormalization", inputs=["x", "scale", "B", "mean", "var"], outputs=["Y"] ) @@ -6651,6 +6652,7 @@ def verify_qlinearconv( bias=False, per_channel_quantization=False, ): + x_array = np.random.randint(low=0, high=255, size=x_shape).astype("uint8") w_array = np.random.uniform(low=0, high=255, size=w_shape).astype("uint8") @@ -7010,6 +7012,7 @@ def test_qlinearadd(target, dev): """test_qlinearadd""" def verify_qlinearadd(a_shape, b_shape, c_shape): + _ = np.random.random(a_shape).astype("float32") _ = np.random.random(b_shape).astype("float32") @@ -7042,6 +7045,7 @@ def test_qlinearmul(target, dev): """test_qlinearmul""" def verify_qlinearmul(a_shape, b_shape, c_shape): + _ = np.random.random(a_shape).astype("float32") _ = np.random.random(b_shape).astype("float32") @@ -7076,6 +7080,7 @@ def test_qlinearleakyrelu(target, dev): """test_qlinearleakyrelu""" def verify_qlinearleakyrelu(inshape, kwargs): + in_array = np.random.random(inshape).astype("float32") node = helper.make_node("LeakyRelu", ["X"], ["Y"], **kwargs) @@ -7103,6 +7108,7 @@ def test_qlinearsigmoid(target, dev): """test_qlinearsigmoid""" def verify_qlinearsigmoid(a_shape): + _ = np.random.random(a_shape).astype("float32") input_nodes = [helper.make_tensor_value_info("a", TensorProto.FLOAT, list(a_shape))] @@ -7128,6 +7134,7 @@ def test_qlinearsoftmax(target, dev): """test_qlinearsoftmax""" def verify_qlinearsoftmax(a_shape): + _ = np.random.random(a_shape).astype("float32") input_nodes = [helper.make_tensor_value_info("a", TensorProto.FLOAT, list(a_shape))] @@ -7903,6 +7910,7 @@ def verify_scan( scan_output_directions, opset, ): + body_input_shapes = copy.deepcopy(input_shapes) num_state_inputs = len(input_shapes) - num_scan_inputs