From 2ba27f941b2e4b88e1f5e1fdc2ad21fd2455dd0f Mon Sep 17 00:00:00 2001 From: Jinkun Lin Date: Sun, 12 Jun 2022 22:21:16 +0000 Subject: [PATCH 1/2] Fix onnx round import with float64 inputs. --- python/tvm/relay/frontend/onnx.py | 7 +++-- tests/python/frontend/onnx/test_forward.py | 32 ++++++++++++++++++---- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/python/tvm/relay/frontend/onnx.py b/python/tvm/relay/frontend/onnx.py index 29c0a778ef6e..595f12d4d5bd 100644 --- a/python/tvm/relay/frontend/onnx.py +++ b/python/tvm/relay/frontend/onnx.py @@ -5095,9 +5095,10 @@ def _impl_v11(cls, inputs, attr, params): # Onnx round uses Banker's rounding which rounds .5 to the nearest even integer x = inputs[0] - half = _expr.const(0.5, dtype="float32") - one = _expr.const(1, dtype="float32") - two = _expr.const(2, dtype="float32") + dtype = infer_type(x).checked_type.dtype + half = _expr.const(0.5, dtype=dtype) + one = _expr.const(1, dtype=dtype) + two = _expr.const(2, dtype=dtype) rounded = _op.ceil(x - half) bankers_mask = one - (_op.ceil(x + half) - _op.floor(x + half)) diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 967597f7d12b..71507e4a09b2 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -966,24 +966,43 @@ def add_noop_to_input_attr(attr_name, attr): def _test_onnx_op_elementwise( - target, dev, inshape, outfunc, npargs, dtype, opname, kwargs, opset=None + target, dev, inshape, outfunc, npargs, dtype, opname, kwargs, opset=None, verify=True ): indata = np.random.uniform(-1, 1, size=inshape).astype(dtype) outdata = outfunc(indata, **npargs) y = helper.make_node(opname, ["in"], ["out"], **kwargs) + onnx_dtype = { + 'float16': TensorProto.FLOAT16, + 'float32': TensorProto.FLOAT, + 'float64': TensorProto.DOUBLE, + }[dtype] + graph = helper.make_graph( [y], opname + "_test", - inputs=[helper.make_tensor_value_info("in", TensorProto.FLOAT, list(indata.shape))], - outputs=[helper.make_tensor_value_info("out", TensorProto.FLOAT, list(outdata.shape))], + inputs=[helper.make_tensor_value_info("in", onnx_dtype, list(indata.shape))], + outputs=[helper.make_tensor_value_info("out", onnx_dtype, list(outdata.shape))], ) model = helper.make_model(graph, producer_name=opname + "_test") - verify_with_ort_with_inputs( - model, [indata], [outdata.shape], opset=opset, dtype=dtype, target=target, dev=dev - ) + if verify: + verify_with_ort_with_inputs( + model, [indata], [outdata.shape], opset=opset, dtype=dtype, target=target, dev=dev + ) + else: + get_tvm_output( + model, + [indata], + target, + dev, + [outdata.shape], + dtype, + opset=opset, + opt_level=3, + ) + @tvm.testing.parametrize_targets @@ -1058,6 +1077,7 @@ def test_clip_min_max_as_inputs(target, dev): @tvm.testing.parametrize_targets def test_round(target, dev): _test_onnx_op_elementwise(target, dev, (2, 4, 5, 6), np.round, {}, "float32", "Round", {}) + _test_onnx_op_elementwise(target, dev, (2, 4, 5, 6), np.round, {}, "float64", "Round", {}, verify=False) # enable verification once ORT supports float64 def _test_finite_ops(target, dev, inshape, outfunc, npargs, dtype, opname, kwargs): From 5d3ecef824c98ddc8f3703194677b2382b00e319 Mon Sep 17 00:00:00 2001 From: Jinkun Lin Date: Sun, 12 Jun 2022 22:58:51 +0000 Subject: [PATCH 2/2] Fix lint and optimize dtype mapping. --- tests/python/frontend/onnx/test_forward.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 71507e4a09b2..c58e920ead1b 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -973,17 +973,13 @@ def _test_onnx_op_elementwise( y = helper.make_node(opname, ["in"], ["out"], **kwargs) - onnx_dtype = { - 'float16': TensorProto.FLOAT16, - 'float32': TensorProto.FLOAT, - 'float64': TensorProto.DOUBLE, - }[dtype] + ONNX_DTYPE = mapping.NP_TYPE_TO_TENSOR_TYPE[np.dtype(dtype)] graph = helper.make_graph( [y], opname + "_test", - inputs=[helper.make_tensor_value_info("in", onnx_dtype, list(indata.shape))], - outputs=[helper.make_tensor_value_info("out", onnx_dtype, list(outdata.shape))], + inputs=[helper.make_tensor_value_info("in", ONNX_DTYPE, list(indata.shape))], + outputs=[helper.make_tensor_value_info("out", ONNX_DTYPE, list(outdata.shape))], ) model = helper.make_model(graph, producer_name=opname + "_test") @@ -1004,7 +1000,6 @@ def _test_onnx_op_elementwise( ) - @tvm.testing.parametrize_targets def test_floor(target, dev): _test_onnx_op_elementwise(target, dev, (2, 4, 5, 6), np.floor, {}, "float32", "Floor", {}) @@ -1077,7 +1072,9 @@ def test_clip_min_max_as_inputs(target, dev): @tvm.testing.parametrize_targets def test_round(target, dev): _test_onnx_op_elementwise(target, dev, (2, 4, 5, 6), np.round, {}, "float32", "Round", {}) - _test_onnx_op_elementwise(target, dev, (2, 4, 5, 6), np.round, {}, "float64", "Round", {}, verify=False) # enable verification once ORT supports float64 + _test_onnx_op_elementwise( + target, dev, (2, 4, 5, 6), np.round, {}, "float64", "Round", {}, verify=False + ) # TODO: enable verification once ORT supports float64 def _test_finite_ops(target, dev, inshape, outfunc, npargs, dtype, opname, kwargs):