From a3e4f8ac3e612f7221212401d57fd18b5639d1a1 Mon Sep 17 00:00:00 2001 From: xp224797 Date: Wed, 27 Jan 2021 16:02:51 +0800 Subject: [PATCH 1/3] Frontend: add onnx GlobalLpPool op --- python/tvm/relay/frontend/onnx.py | 13 +++++++ tests/python/frontend/onnx/test_forward.py | 45 ++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/python/tvm/relay/frontend/onnx.py b/python/tvm/relay/frontend/onnx.py index 5471f67ea106..b4c21954a418 100644 --- a/python/tvm/relay/frontend/onnx.py +++ b/python/tvm/relay/frontend/onnx.py @@ -961,6 +961,18 @@ def _impl_v1(cls, inputs, attr, params): return _op.power(out, reci_p) +class GlobalLpPool(OnnxOpConverter): + """Operator converter for GlobalLpPool.""" + + @classmethod + def _impl_v1(cls, inputs, attr, params): + in_shape = infer_shape(inputs[0]) + assert len(in_shape) >= 4, "input shape support NCHW or NCDHW" + attr["kernel_shape"] = in_shape[2:] + + return LpPool._impl_v1(inputs, attr, params) + + class Mul(Elemwise): """Operator converter for Multiply.""" @@ -3578,6 +3590,7 @@ def _get_convert_map(opset): # defs/nn "AveragePool": AveragePool.get_converter(opset), "LpPool": LpPool.get_converter(opset), + "GlobalLpPool": GlobalLpPool.get_converter(opset), "MaxPool": MaxPool.get_converter(opset), "MaxUnpool": MaxUnpool.get_converter(opset), "Conv": Conv.get_converter(opset), diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 9e0eb1f75217..6c88496100b4 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -3298,6 +3298,50 @@ def verify_lppool(x_shape, kernel_shape, p, strides, pads, out_shape, auto_pad=" ) +def verify_global_lppool(x_shape, p, out_shape): + pool_node = helper.make_node( + "GlobalLpPool", + inputs=["x"], + outputs=["y"], + p=p, + ) + + graph = helper.make_graph( + [pool_node], + "global_lppool_test", + inputs=[helper.make_tensor_value_info("x", TensorProto.FLOAT, list(x_shape))], + outputs=[helper.make_tensor_value_info("y", TensorProto.FLOAT, list(out_shape))], + ) + + model = helper.make_model(graph, producer_name="global_lppool_test") + verify_with_ort(model, [x_shape], out_shape) + + +@tvm.testing.uses_gpu +def test_global_lppool(): + + # Pool2D + verify_global_lppool( + x_shape=[1, 15, 32, 32], + p=2, + out_shape=[1, 15, 1, 1], + ) + + # Pool2D + verify_global_lppool( + x_shape=[1, 15, 32, 32], + p=3, + out_shape=[1, 15, 1, 1], + ) + + # Pool3D + verify_global_lppool( + x_shape=[1, 15, 3, 32, 32], + p=2, + out_shape=[1, 15, 1, 1, 1], + ) + + def verify_rnn( seq_length, batch_size, @@ -5644,3 +5688,4 @@ def repeat(N, D): test_random_uniform() test_convinteger() test_batch_matmul() + test_global_lppool() From 08700aeb822929882aa41e1188935fecaa2bfc3a Mon Sep 17 00:00:00 2001 From: alter-xp Date: Sat, 25 Sep 2021 15:40:21 +0800 Subject: [PATCH 2/3] update --- python/tvm/relay/frontend/onnx.py | 2 +- tests/python/frontend/onnx/test_forward.py | 29 ++++++++++------------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/python/tvm/relay/frontend/onnx.py b/python/tvm/relay/frontend/onnx.py index b4c21954a418..6e05646b935a 100644 --- a/python/tvm/relay/frontend/onnx.py +++ b/python/tvm/relay/frontend/onnx.py @@ -966,8 +966,8 @@ class GlobalLpPool(OnnxOpConverter): @classmethod def _impl_v1(cls, inputs, attr, params): + # TODO: GlobalLpPool does not yet support dynamic shapes in_shape = infer_shape(inputs[0]) - assert len(in_shape) >= 4, "input shape support NCHW or NCDHW" attr["kernel_shape"] = in_shape[2:] return LpPool._impl_v1(inputs, attr, params) diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 6c88496100b4..7f8e7ba4f142 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -3298,7 +3298,7 @@ def verify_lppool(x_shape, kernel_shape, p, strides, pads, out_shape, auto_pad=" ) -def verify_global_lppool(x_shape, p, out_shape): +def verify_global_lppool(x_shape, p, out_shape, target, dev): pool_node = helper.make_node( "GlobalLpPool", inputs=["x"], @@ -3314,31 +3314,28 @@ def verify_global_lppool(x_shape, p, out_shape): ) model = helper.make_model(graph, producer_name="global_lppool_test") - verify_with_ort(model, [x_shape], out_shape) + verify_with_ort(model, [x_shape], out_shape, target=target, dev=dev) -@tvm.testing.uses_gpu -def test_global_lppool(): +@tvm.testing.parametrize_targets +def test_global_lppool(target, dev): - # Pool2D + # LpPool1D + verify_global_lppool(x_shape=[1, 15, 16], p=2, out_shape=[1, 15, 1], target=target, dev=dev) + + # LpPool2D verify_global_lppool( - x_shape=[1, 15, 32, 32], - p=2, - out_shape=[1, 15, 1, 1], + x_shape=[1, 15, 32, 32], p=2, out_shape=[1, 15, 1, 1], target=target, dev=dev ) - # Pool2D + # LpPool2D verify_global_lppool( - x_shape=[1, 15, 32, 32], - p=3, - out_shape=[1, 15, 1, 1], + x_shape=[1, 15, 32, 32], p=3, out_shape=[1, 15, 1, 1], target=target, dev=dev ) - # Pool3D + # LpPool3D verify_global_lppool( - x_shape=[1, 15, 3, 32, 32], - p=2, - out_shape=[1, 15, 1, 1, 1], + x_shape=[1, 15, 3, 32, 32], p=2, out_shape=[1, 15, 1, 1, 1], target=target, dev=dev ) From 42b0d59ca2bff0583d5a55cd9881a4edb17286d7 Mon Sep 17 00:00:00 2001 From: alter-xp Date: Sat, 25 Sep 2021 21:49:27 +0800 Subject: [PATCH 3/3] fix for test --- tests/python/frontend/onnx/test_forward.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 7f8e7ba4f142..e4cb83a5cb05 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -3314,7 +3314,9 @@ def verify_global_lppool(x_shape, p, out_shape, target, dev): ) model = helper.make_model(graph, producer_name="global_lppool_test") - verify_with_ort(model, [x_shape], out_shape, target=target, dev=dev) + verify_with_ort( + model, [x_shape], out_shape, use_vm=True, convert_to_static=True, target=target, dev=dev + ) @tvm.testing.parametrize_targets