From d110b5f06cb4850d79c037bda0f9a31da4c4eabb Mon Sep 17 00:00:00 2001 From: wjj19950828 Date: Wed, 22 Sep 2021 21:44:30 +0800 Subject: [PATCH 1/2] Fixed Dynamic bugs --- python/tvm/relay/frontend/paddlepaddle.py | 34 ++++++------------- .../frontend/paddlepaddle/test_forward.py | 11 +++--- 2 files changed, 16 insertions(+), 29 deletions(-) diff --git a/python/tvm/relay/frontend/paddlepaddle.py b/python/tvm/relay/frontend/paddlepaddle.py index 988a32a399bc..7de1ed4698fc 100644 --- a/python/tvm/relay/frontend/paddlepaddle.py +++ b/python/tvm/relay/frontend/paddlepaddle.py @@ -602,6 +602,7 @@ def convert_crop(g, op, block): """Operator converter for crop.""" x = g.get_node(op.input("X")[0]) + dims = len(infer_shape(x)) input_shape = op.input("Shape") input_offsets = op.input("Offsets") if input_shape: @@ -616,13 +617,15 @@ def convert_crop(g, op, block): else: offsets = op.attr("offsets") - crop_len = len(shape) - slice_start = [0] * crop_len - slice_end = shape - for i in range(crop_len): - slice_start[i] += offsets[i] - slice_end[i] += offsets[i] - out = _op.strided_slice(x, slice_start, slice_end) + if not isinstance(shape, _expr.Expr): + shape = _op.const(shape, "int32") + if not isinstance(offsets, _expr.Expr): + offsets = _op.const(offsets, "int32") + slice_start = offsets + slice_end = _op.add(shape, offsets) + strides = _op.const([1] * dims, dtype="int32") + + out = _op.strided_slice(x, slice_start, slice_end, strides) g.add_node(op.output("Out")[0], out) @@ -739,28 +742,13 @@ def convert_expand(g, op, block): """Operator converter for expand.""" x = g.get_node(op.input("X")[0]) - input_shape = list(infer_shape(x)) - - ndims = len(input_shape) if op.input("Shape"): sizes = g.get_node(op.input("Shape")[0]) sizes = _infer_value(sizes, g.get_params()) else: sizes = op.attr("shape") - out = x - out_dims = len(sizes) - if ndims < out_dims: - num_newaxis = out_dims - ndims - out = _op.expand_dims(out, axis=0, num_newaxis=num_newaxis) - input_shape = [1] * num_newaxis + input_shape - - for i in range(out_dims): - if sizes[i] != -1 and input_shape[i] == 1: - if not isinstance(sizes[i], int): - sizes[i] = int(infer_value(sizes[i], {}).numpy()) - out = _op.repeat(out, sizes[i], axis=i) - + out = _op.broadcast_to(x, sizes) 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 625340618a2d..63e4ef6172c2 100644 --- a/tests/python/frontend/paddlepaddle/test_forward.py +++ b/tests/python/frontend/paddlepaddle/test_forward.py @@ -485,18 +485,17 @@ def crop3(inputs): return paddle.crop(inputs, shape=[3, 3], offsets=offsets) @paddle.jit.to_static - def crop4(inputs): - shape = paddle.to_tensor(np.array([3, 3]).astype("int32")) - offsets = paddle.to_tensor(np.array([1, 1]).astype("int32")) + def crop4(inputs, shape, offsets): return paddle.crop(inputs, shape=shape, offsets=offsets) input_shape = [10, 10] input_data = paddle.rand(input_shape, dtype="float32") verify_model(crop1, input_data=[input_data]) shape = paddle.to_tensor(np.array([3, 3], "int32")) - # verify_model(crop2, [input_data, shape], input_shape=[[-1, -1], [2]]) + verify_model(crop2, [input_data, shape], input_shape=[[-1, -1], [2]]) verify_model(crop3, input_data=[input_data]) - verify_model(crop4, input_data=[input_data]) + offsets = paddle.to_tensor(np.array([1, 1]).astype("int32")) + verify_model(crop4, input_data=[input_data, shape, offsets], input_shape=[[-1, -1], [2], [2]]) @tvm.testing.uses_gpu @@ -691,7 +690,7 @@ def expand2(inputs, shape): x_data = paddle.rand(x_shape, dtype="float32") verify_model(expand1, input_data=[x_data]) shape = paddle.to_tensor(np.array([2, 3]).astype("int32")) - # verify_model(expand2, [x_data, shape], input_shape=[[3], [2]]) + verify_model(expand2, [x_data, shape], input_shape=[[3], [2]]) @tvm.testing.uses_gpu From 81a83f494d4ccb18ad3777a53638c885a2ec2c6f Mon Sep 17 00:00:00 2001 From: wjj19950828 Date: Wed, 22 Sep 2021 22:07:24 +0800 Subject: [PATCH 2/2] fixed conflicts --- python/tvm/relay/frontend/paddlepaddle.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/python/tvm/relay/frontend/paddlepaddle.py b/python/tvm/relay/frontend/paddlepaddle.py index 7de1ed4698fc..56a99fd2b226 100644 --- a/python/tvm/relay/frontend/paddlepaddle.py +++ b/python/tvm/relay/frontend/paddlepaddle.py @@ -1772,16 +1772,15 @@ def make_init_param_inputs(g, node, layer): axes=[0], ) return init_h, init_c - else: - all_init_h = node.input("PreState")[0] - bidirect_len = 2 if node.attr("is_bidirec") else 1 - init_h = _op.strided_slice( - g.get_node(all_init_h), - [layer * bidirect_len], - [layer * bidirect_len + bidirect_len], - axes=[0], - ) - return init_h + all_init_h = node.input("PreState")[0] + bidirect_len = 2 if node.attr("is_bidirec") else 1 + init_h = _op.strided_slice( + g.get_node(all_init_h), + [layer * bidirect_len], + [layer * bidirect_len + bidirect_len], + axes=[0], + ) + return init_h hidden_size = op.attr("hidden_size") num_layers = op.attr("num_layers")