From af6f34d16823ddd3da80c1aa4d2818525114f4cf Mon Sep 17 00:00:00 2001 From: Aurelius84 Date: Wed, 29 Jun 2022 12:55:05 +0000 Subject: [PATCH 1/5] [Dy2Stat]Enhance nonlocal machanism while returning single var --- .../fluid/dygraph/dygraph_to_static/convert_operators.py | 4 ++-- .../fluid/dygraph/dygraph_to_static/ifelse_transformer.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py b/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py index cbb4655f354a5a..611ef035b4189c 100644 --- a/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py +++ b/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py @@ -307,11 +307,11 @@ def _recover_args_state(outs, get_args, set_args, return_name_ids): init_args = get_args() # recover args state num_outs = len(return_name_ids) - num_args = 1 if not isinstance(init_args, tuple) else len(init_args) + num_args = len(init_args) assert num_outs <= num_args if num_args == 1: - final_outs = outs + final_outs = (outs,) else: outs = (outs, ) if num_outs == 1 else outs final_outs = outs + init_args[num_outs:] diff --git a/python/paddle/fluid/dygraph/dygraph_to_static/ifelse_transformer.py b/python/paddle/fluid/dygraph/dygraph_to_static/ifelse_transformer.py index 1935629f54e865..d599e5fe0356a0 100644 --- a/python/paddle/fluid/dygraph/dygraph_to_static/ifelse_transformer.py +++ b/python/paddle/fluid/dygraph/dygraph_to_static/ifelse_transformer.py @@ -575,7 +575,7 @@ def {func_name}(): template = """ def {func_name}(): nonlocal {vars} - return {vars} + return {vars}, """ func_def = template.format( func_name=unique_name.generate(GET_ARGS_FUNC_PREFIX), @@ -607,7 +607,7 @@ def {func_name}({args}): template = """ def {func_name}({args}): nonlocal {vars} - {vars} = {args} + {vars}, = {args} """ func_def = template.format( func_name=unique_name.generate(SET_ARGS_FUNC_PREFIX), From 4f4e7c304d07a2987a541c7b084a3b9547ffa4b4 Mon Sep 17 00:00:00 2001 From: Aurelius84 Date: Thu, 30 Jun 2022 02:52:26 +0000 Subject: [PATCH 2/5] [Dy2Stat]Enhance nonlocal machanism while returning single var --- .../paddle/fluid/dygraph/dygraph_to_static/convert_operators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py b/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py index 611ef035b4189c..fea69988925890 100644 --- a/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py +++ b/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py @@ -311,7 +311,7 @@ def _recover_args_state(outs, get_args, set_args, return_name_ids): assert num_outs <= num_args if num_args == 1: - final_outs = (outs,) + final_outs = (outs, ) else: outs = (outs, ) if num_outs == 1 else outs final_outs = outs + init_args[num_outs:] From 9befc28918f09743b0e17417813589f5f23d4d29 Mon Sep 17 00:00:00 2001 From: Aurelius84 Date: Thu, 30 Jun 2022 05:55:35 +0000 Subject: [PATCH 3/5] fix unittest --- .../dygraph_to_static/test_program_translator.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/dygraph_to_static/test_program_translator.py b/python/paddle/fluid/tests/unittests/dygraph_to_static/test_program_translator.py index 41968278f7bc06..8d2665129e94ef 100644 --- a/python/paddle/fluid/tests/unittests/dygraph_to_static/test_program_translator.py +++ b/python/paddle/fluid/tests/unittests/dygraph_to_static/test_program_translator.py @@ -74,11 +74,11 @@ def dyfunc_with_if_else(x_v, label=None): def get_args_0(): nonlocal x_v - return x_v + return x_v, def set_args_0(__args): nonlocal x_v - x_v = __args + x_v, = __args def true_fn_0(): nonlocal x_v @@ -96,11 +96,11 @@ def false_fn_0(): def get_args_1(): nonlocal __return_value_0, label, x_v - return __return_value_0, label, x_v + return __return_value_0, label, x_v, def set_args_1(__args): nonlocal __return_value_0, label, x_v - __return_value_0, label, x_v = __args + __return_value_0, label, x_v, = __args def true_fn_1(): nonlocal __return_value_0, label, x_v @@ -131,11 +131,11 @@ def dyfunc_with_if_else(x_v, label=None): def get_args_2(): nonlocal x_v - return x_v + return x_v, def set_args_2(__args): nonlocal x_v - x_v = __args + x_v, = __args def true_fn_2(): nonlocal x_v @@ -153,11 +153,11 @@ def false_fn_2(): def get_args_3(): nonlocal __return_value_1, label, x_v - return __return_value_1, label, x_v + return __return_value_1, label, x_v, def set_args_3(__args): nonlocal __return_value_1, label, x_v - __return_value_1, label, x_v = __args + __return_value_1, label, x_v, = __args def true_fn_3(): nonlocal __return_value_1, label, x_v From 3b3b28a31265212f568c45825aa7015bc83fdf33 Mon Sep 17 00:00:00 2001 From: Aurelius84 Date: Thu, 30 Jun 2022 08:53:00 +0000 Subject: [PATCH 4/5] fix conflict --- .../paddle/fluid/dygraph/dygraph_to_static/utils.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/python/paddle/fluid/dygraph/dygraph_to_static/utils.py b/python/paddle/fluid/dygraph/dygraph_to_static/utils.py index 466e9ee4d34c1d..b51635b85f9455 100644 --- a/python/paddle/fluid/dygraph/dygraph_to_static/utils.py +++ b/python/paddle/fluid/dygraph/dygraph_to_static/utils.py @@ -38,6 +38,9 @@ PADDLE_MODULE_PREFIX = 'paddle.' DYGRAPH_MODULE_PREFIX = 'paddle.fluid.dygraph' DYGRAPH_TO_STATIC_MODULE_PREFIX = 'paddle.fluid.dygraph.dygraph_to_static' +GET_ARGS_FUNC_PREFIX = 'get_args' +SET_ARGS_FUNC_PREFIX = 'set_args' +ARGS_NAME = '__args' class BaseNodeVisitor(gast.NodeVisitor): @@ -1619,7 +1622,7 @@ def {func_name}(): template = """ def {func_name}(): nonlocal {nonlocal_vars} - return {vars} + return {vars}, """ func_def = template.format( func_name=unique_name.generate(GET_ARGS_FUNC_PREFIX), @@ -1628,11 +1631,6 @@ def {func_name}(): return gast.parse(textwrap.dedent(func_def)).body[0] -GET_ARGS_FUNC_PREFIX = 'get_args' -SET_ARGS_FUNC_PREFIX = 'set_args' -ARGS_NAME = '__args' - - def create_set_args_node(names): """ Create set_args function as follows: @@ -1661,7 +1659,7 @@ def {func_name}({args}): template = """ def {func_name}({args}): nonlocal {nonlocal_vars} - {vars} = {args} + {vars}, = {args} """ func_def = template.format( func_name=unique_name.generate(SET_ARGS_FUNC_PREFIX), From c2ebd5e4519e4e5af51ae5d809d8e2aaa003694d Mon Sep 17 00:00:00 2001 From: Aurelius84 Date: Thu, 30 Jun 2022 12:06:42 +0000 Subject: [PATCH 5/5] fix unittest --- .../dygraph/dygraph_to_static/convert_operators.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py b/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py index 3ec9e3703ab831..c0c679e2e1ef03 100644 --- a/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py +++ b/python/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py @@ -50,18 +50,13 @@ def convert_while_loop(cond, body, getter, setter): def _run_paddle_while(cond, body, getter, setter): # NOTE: loop_vars of Paddle op `control_flow.while_loop` must be Paddle Tensors. - def to_list(x): - if isinstance(x, (tuple, list)): return x - return [x] # UndefinedVar will become data layer not check. - loop_vars = [to_static_variable(var) for var in to_list(getter())] - setter(loop_vars if len(loop_vars) > 1 else - loop_vars[0]) # change the non-local var to variable + loop_vars = [to_static_variable(var) for var in getter()] + setter(loop_vars) # change the non-local var to variable # variable maybe modified to inner var. change it into loop_vars = control_flow.while_loop(cond, body, loop_vars) - setter(loop_vars if len(loop_vars) > 1 else - loop_vars[0]) # change the non-local var to variable + setter(loop_vars) # change the non-local var to variable return loop_vars