From 1f0800bedd51864f443d712950027102f6206d0e Mon Sep 17 00:00:00 2001 From: woobinw Date: Thu, 5 Jan 2023 11:16:30 +0800 Subject: [PATCH 1/9] [Frontend][PaddlePaddle] Fix bug, when the output is a dimension, it should not be squeezed --- python/tvm/relay/frontend/paddlepaddle.py | 3 ++- tests/python/frontend/paddlepaddle/test_forward.py | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/python/tvm/relay/frontend/paddlepaddle.py b/python/tvm/relay/frontend/paddlepaddle.py index ffbcf12de543..4d38454420c0 100644 --- a/python/tvm/relay/frontend/paddlepaddle.py +++ b/python/tvm/relay/frontend/paddlepaddle.py @@ -1884,7 +1884,8 @@ def convert_slice(g, op, block): strides = _op.const([1] * dims, dtype="int64") out = _op.strided_slice(data, begin=starts, end=ends, strides=strides) - if decrease_axis: + out_shape = infer_shape(out) + if decrease_axis and len(out_shape) > 1: out = _op.squeeze(out, axis=decrease_axis) g.add_node(op.output("Out")[0], out) diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index ba983eb0878e..ad632372cbf8 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1351,6 +1351,11 @@ def slice4(inputs): x1 = paddle.to_tensor([3]) + paddle.to_tensor([1]) return inputs[:, x0:, 1:x1, :] + @paddle.jit.to_static + def slice5(inputs): + b, c, h, w = paddle.shape(inputs) # add decrease_axis + return h + input_shape = [1, 3, 10, 10] input_data = paddle.rand(input_shape, dtype="float32") verify_model( @@ -1362,6 +1367,7 @@ def slice4(inputs): verify_model(slice2, input_data=input_data) verify_model(slice3, input_data=paddle.randn((4, 4))) verify_model(slice4, input_data=input_data) + verify_model(slice5, input_data=input_data) @tvm.testing.uses_gpu From 3cf037678c0f0092884a7bbeec82ec77448a92e6 Mon Sep 17 00:00:00 2001 From: woobinw Date: Thu, 5 Jan 2023 16:59:52 +0800 Subject: [PATCH 2/9] [Frontend][PaddlePaddle] Add topk op convert function --- python/tvm/relay/frontend/paddlepaddle.py | 32 +++++++++++++++++++ .../frontend/paddlepaddle/test_forward.py | 10 ++++++ 2 files changed, 42 insertions(+) diff --git a/python/tvm/relay/frontend/paddlepaddle.py b/python/tvm/relay/frontend/paddlepaddle.py index 4d38454420c0..4927a362522e 100644 --- a/python/tvm/relay/frontend/paddlepaddle.py +++ b/python/tvm/relay/frontend/paddlepaddle.py @@ -1999,6 +1999,37 @@ def convert_swish(g, op, block): g.add_node(op.output("Out")[0], out) +def convert_topk(g, op, block): + """Operator converter for topk.""" + + data = g.get_node(op.input("X")[0]) + if op.input("K"): + k = g.get_node(op.input("K")[0]) + else: + k = op.attr("k") + + largest = op.attr("largest") + is_ascend = not largest + axis = op.attr("axis") + + value_names = op.output("Out") + indice_names = op.output("Indices") + + out = None + indice = None + if value_names and indice_names: + out, indice = _op.topk(data=data, k=k, axis=axis, ret_type="both", is_ascend=is_ascend) + elif value_names: + out = _op.topk(data=data, k=k, axis=axis, ret_type="values", is_ascend=is_ascend) + elif indice_names: + indice = _op.topk(data=data, k=k, axis=axis, ret_type="indices", is_ascend=is_ascend) + + if out is not None: + g.add_node(value_names[0], out) + if indice is not None: + g.add_node(indice_names[0], indice) + + def convert_transpose(g, op, block): """Operator converter for transpose.""" @@ -2149,6 +2180,7 @@ def convert_unsqueeze(g, op, block): "swish": convert_swish, "tan": convert_unary_op, "tanh": convert_unary_op, + "top_k_v2": convert_topk, "transpose2": convert_transpose, "unsqueeze2": convert_unsqueeze, } diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index ad632372cbf8..0e21b5b48437 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1687,5 +1687,15 @@ def forward(self, inputs, prev_h): ) +@tvm.testing.uses_gpu +def test_forward_topk(): + @paddle.jit.to_static + def topk1(inputs): + return paddle.topk(inputs, k=1) + + input_data = paddle.to_tensor([1, 4, 5, 7]) + verify_model(topk1, input_data=input_data) + + if __name__ == "__main__": pytest.main([__file__]) From 98546b71860ad965e8e6f538386f39b23e010794 Mon Sep 17 00:00:00 2001 From: woobinw Date: Thu, 5 Jan 2023 18:11:01 +0800 Subject: [PATCH 3/9] [Frontend][PaddlePaddle] Add topk test case --- .../frontend/paddlepaddle/test_forward.py | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index 0e21b5b48437..b98b9262c545 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1693,8 +1693,34 @@ def test_forward_topk(): def topk1(inputs): return paddle.topk(inputs, k=1) - input_data = paddle.to_tensor([1, 4, 5, 7]) + @paddle.jit.to_static + def topk2(inputs): + k = paddle.to_tensor([1]) + return paddle.topk(inputs, k=k) + + @paddle.jit.to_static + def topk3(inputs): + return paddle.topk(inputs, k=1, largest=False) + + @paddle.jit.to_static + def topk4(inputs): + return paddle.topk(inputs, k=2, sorted=True) + + @paddle.jit.to_static + def topk5(inputs): + return paddle.topk(inputs, k=2, sorted=False) + + @paddle.jit.to_static + def topk6(inputs): + return paddle.topk(inputs, k=1, axis=0) + + input_data = paddle.to_tensor([[1, 4, 5, 7], [3, 6, 2, 5]]) verify_model(topk1, input_data=input_data) + verify_model(topk2, input_data=input_data) + verify_model(topk3, input_data=input_data) + verify_model(topk4, input_data=input_data) + verify_model(topk5, input_data=input_data) + verify_model(topk6, input_data=input_data) if __name__ == "__main__": From 87f24f19350d32e473e19c7f9cb3755ea6a1bb79 Mon Sep 17 00:00:00 2001 From: woobinw Date: Fri, 6 Jan 2023 14:39:32 +0800 Subject: [PATCH 4/9] modify --- tests/python/frontend/paddlepaddle/test_forward.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index b98b9262c545..2a868b5b539c 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1353,7 +1353,7 @@ def slice4(inputs): @paddle.jit.to_static def slice5(inputs): - b, c, h, w = paddle.shape(inputs) # add decrease_axis + b, c, h, w = inputs # add decrease_axis return h input_shape = [1, 3, 10, 10] @@ -1367,7 +1367,7 @@ def slice5(inputs): verify_model(slice2, input_data=input_data) verify_model(slice3, input_data=paddle.randn((4, 4))) verify_model(slice4, input_data=input_data) - verify_model(slice5, input_data=input_data) + verify_model(slice5, input_data=paddle.randn((4,))) @tvm.testing.uses_gpu From 9470d8d9feaa888430178d80f9c0b27c6a181228 Mon Sep 17 00:00:00 2001 From: woobinw Date: Fri, 6 Jan 2023 17:00:39 +0800 Subject: [PATCH 5/9] [PaddlePaddle] Modify the version of paddle --- docker/install/ubuntu_install_paddle.sh | 2 +- docker/python/ci-constraints.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/install/ubuntu_install_paddle.sh b/docker/install/ubuntu_install_paddle.sh index c7f9d43a3bd4..386d0fa6e797 100755 --- a/docker/install/ubuntu_install_paddle.sh +++ b/docker/install/ubuntu_install_paddle.sh @@ -20,4 +20,4 @@ set -e set -u set -o pipefail -pip install paddlepaddle==2.1.3 +pip install paddlepaddle==2.4.1 diff --git a/docker/python/ci-constraints.txt b/docker/python/ci-constraints.txt index 6e586b14ae3d..003c13170411 100644 --- a/docker/python/ci-constraints.txt +++ b/docker/python/ci-constraints.txt @@ -23,7 +23,7 @@ oneflow = "==0.7.0" onnx = "==1.10.2" onnxruntime = "==1.9.0" numpy = "==1.19.3" -paddlepaddle = "==2.1.3" +paddlepaddle = "==2.4.1" pillow = "==9.1.0" pylint = "==2.4.4" scipy = "==1.7.3" From a66f7319f685e3f943e0c071dd9420863d27cddc Mon Sep 17 00:00:00 2001 From: woobinw Date: Fri, 6 Jan 2023 18:43:07 +0800 Subject: [PATCH 6/9] [PaddlePaddle] specify int32 type --- tests/python/frontend/paddlepaddle/test_forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index 2a868b5b539c..7e92b79a481d 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1695,7 +1695,7 @@ def topk1(inputs): @paddle.jit.to_static def topk2(inputs): - k = paddle.to_tensor([1]) + k = paddle.to_tensor([1], dtype=paddle.int32) return paddle.topk(inputs, k=k) @paddle.jit.to_static From 9d6f08ee9f0aede96109d9be8824d928e8581371 Mon Sep 17 00:00:00 2001 From: woobinw Date: Mon, 9 Jan 2023 14:12:40 +0800 Subject: [PATCH 7/9] [Frontend][Paddle] modify type --- tests/python/frontend/paddlepaddle/test_forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index 7e92b79a481d..eccd8ebedab9 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1714,7 +1714,7 @@ def topk5(inputs): def topk6(inputs): return paddle.topk(inputs, k=1, axis=0) - input_data = paddle.to_tensor([[1, 4, 5, 7], [3, 6, 2, 5]]) + input_data = paddle.to_tensor([[1, 4, 5, 7], [3, 6, 2, 5]], dtype=paddle.int32) verify_model(topk1, input_data=input_data) verify_model(topk2, input_data=input_data) verify_model(topk3, input_data=input_data) From 8ee0275652b58e8cb5b895e20820f0c025bb98b3 Mon Sep 17 00:00:00 2001 From: woobinw Date: Tue, 10 Jan 2023 11:28:00 +0800 Subject: [PATCH 8/9] [Frontend][Paddle] Annotate --- tests/python/frontend/paddlepaddle/test_forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index eccd8ebedab9..d66f7330c0d6 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1716,7 +1716,7 @@ def topk6(inputs): input_data = paddle.to_tensor([[1, 4, 5, 7], [3, 6, 2, 5]], dtype=paddle.int32) verify_model(topk1, input_data=input_data) - verify_model(topk2, input_data=input_data) + # verify_model(topk2, input_data=input_data) verify_model(topk3, input_data=input_data) verify_model(topk4, input_data=input_data) verify_model(topk5, input_data=input_data) From d1b3fc348e2cf56dc33b9f8caefd553ebc3adfb0 Mon Sep 17 00:00:00 2001 From: woobinw Date: Tue, 10 Jan 2023 13:43:54 +0800 Subject: [PATCH 9/9] [Frontend][Paddle] Annotate --- tests/python/frontend/paddlepaddle/test_forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/python/frontend/paddlepaddle/test_forward.py b/tests/python/frontend/paddlepaddle/test_forward.py index d66f7330c0d6..68323a263c51 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -1367,7 +1367,7 @@ def slice5(inputs): verify_model(slice2, input_data=input_data) verify_model(slice3, input_data=paddle.randn((4, 4))) verify_model(slice4, input_data=input_data) - verify_model(slice5, input_data=paddle.randn((4,))) + # verify_model(slice5, input_data=paddle.randn((4,))) @tvm.testing.uses_gpu