From ad267cb56e156ba8792bdd42bf65e3091c697109 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sat, 8 Apr 2023 18:07:10 +0000 Subject: [PATCH 1/8] [Dy2St] fix name conflbetweent in mulitple to_static --- .../paddle/jit/dy2static/partial_program.py | 6 ++ .../dygraph_to_static/test_gradname_parse.py | 0 .../test_multiple_to_static.py | 57 +++++++++++++++++++ 3 files changed, 63 insertions(+) rename {python/paddle/fluid/tests/unittests => test}/dygraph_to_static/test_gradname_parse.py (100%) create mode 100644 test/dygraph_to_static/test_multiple_to_static.py diff --git a/python/paddle/jit/dy2static/partial_program.py b/python/paddle/jit/dy2static/partial_program.py index 3c3039d3713473..24c76fefa3367a 100644 --- a/python/paddle/jit/dy2static/partial_program.py +++ b/python/paddle/jit/dy2static/partial_program.py @@ -938,6 +938,7 @@ def _restore_out(self, out_vars): """ flatten_outputs = self._outputs.tolist() + self._clear_out_name(flatten_outputs) for i, idx in enumerate(self._outputs.var_ids): flatten_outputs[idx] = out_vars[i] outs = self._outputs.restore(flatten_outputs) @@ -946,6 +947,11 @@ def _restore_out(self, out_vars): return outs + def _clear_out_name(self, out_vars): + """Clear output name to avoid name conflict in mulitple program""" + for var in out_vars: + var.name = "" + @switch_to_static_graph def _clone_for_test(self, main_program): return main_program.clone(for_test=True) diff --git a/python/paddle/fluid/tests/unittests/dygraph_to_static/test_gradname_parse.py b/test/dygraph_to_static/test_gradname_parse.py similarity index 100% rename from python/paddle/fluid/tests/unittests/dygraph_to_static/test_gradname_parse.py rename to test/dygraph_to_static/test_gradname_parse.py diff --git a/test/dygraph_to_static/test_multiple_to_static.py b/test/dygraph_to_static/test_multiple_to_static.py new file mode 100644 index 00000000000000..fe7d2e2ef8d64c --- /dev/null +++ b/test/dygraph_to_static/test_multiple_to_static.py @@ -0,0 +1,57 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +import numpy as np + +import paddle +from paddle.jit import to_static + + +@paddle.jit.not_to_static +def part1(x): + return x + 1 + + +@paddle.jit.not_to_static +def part2(x): + return x + x + + +def foo(x): + x = to_static(part1)(x) + + # It will enter a new unique_name guard, so before applying this fix, + # the name of x will be conflict with the name of x in part2 + paddle.enable_static() + paddle.disable_static() + + x = to_static(part2)(x) + return x + + +class TestMultipleToStaticNameConflict(unittest.TestCase): + def test_multiple_to_static(self): + x = paddle.to_tensor([4.0]) + + paddle.jit.enable_to_static(False) + out_dygraph = foo(x) + paddle.jit.enable_to_static(True) + out_static = foo(x) + np.testing.assert_allclose(out_dygraph.numpy(), out_static.numpy()) + + +if __name__ == "__main__": + unittest.main() From b40e78969e5fda881a419b90b0094ce6a5ab72bf Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sat, 8 Apr 2023 18:23:58 +0000 Subject: [PATCH 2/8] refine code --- python/paddle/jit/dy2static/partial_program.py | 8 ++++---- test/dygraph_to_static/test_multiple_to_static.py | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/python/paddle/jit/dy2static/partial_program.py b/python/paddle/jit/dy2static/partial_program.py index 24c76fefa3367a..d81292806c47cd 100644 --- a/python/paddle/jit/dy2static/partial_program.py +++ b/python/paddle/jit/dy2static/partial_program.py @@ -938,7 +938,7 @@ def _restore_out(self, out_vars): """ flatten_outputs = self._outputs.tolist() - self._clear_out_name(flatten_outputs) + self._clear_outputs_name(flatten_outputs) for i, idx in enumerate(self._outputs.var_ids): flatten_outputs[idx] = out_vars[i] outs = self._outputs.restore(flatten_outputs) @@ -947,10 +947,10 @@ def _restore_out(self, out_vars): return outs - def _clear_out_name(self, out_vars): + def _clear_outputs_name(self, outputs): """Clear output name to avoid name conflict in mulitple program""" - for var in out_vars: - var.name = "" + for tensor in outputs: + tensor.name = "" @switch_to_static_graph def _clone_for_test(self, main_program): diff --git a/test/dygraph_to_static/test_multiple_to_static.py b/test/dygraph_to_static/test_multiple_to_static.py index fe7d2e2ef8d64c..e1decc2f59b2cb 100644 --- a/test/dygraph_to_static/test_multiple_to_static.py +++ b/test/dygraph_to_static/test_multiple_to_static.py @@ -34,7 +34,8 @@ def foo(x): x = to_static(part1)(x) # It will enter a new unique_name guard, so before applying this fix, - # the name of x will be conflict with the name of x in part2 + # the name of x will be conflict with the name of x in part2 (they are + # both `tmp_0`) paddle.enable_static() paddle.disable_static() From b3cecb86d043e54291abfb22cee28a9a4bbd7cc4 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sat, 8 Apr 2023 18:28:07 +0000 Subject: [PATCH 3/8] refine code --- test/dygraph_to_static/test_multiple_to_static.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/dygraph_to_static/test_multiple_to_static.py b/test/dygraph_to_static/test_multiple_to_static.py index e1decc2f59b2cb..1504c62e99b595 100644 --- a/test/dygraph_to_static/test_multiple_to_static.py +++ b/test/dygraph_to_static/test_multiple_to_static.py @@ -33,7 +33,7 @@ def part2(x): def foo(x): x = to_static(part1)(x) - # It will enter a new unique_name guard, so before applying this fix, + # It will enter a new unique_name guard, so before applying this fix (#52692), # the name of x will be conflict with the name of x in part2 (they are # both `tmp_0`) paddle.enable_static() From f787725eb790746ec362550625d4bef52964baf3 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sat, 8 Apr 2023 18:56:33 +0000 Subject: [PATCH 4/8] fix flatten target --- python/paddle/jit/dy2static/partial_program.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/paddle/jit/dy2static/partial_program.py b/python/paddle/jit/dy2static/partial_program.py index d81292806c47cd..15379c13dd490d 100644 --- a/python/paddle/jit/dy2static/partial_program.py +++ b/python/paddle/jit/dy2static/partial_program.py @@ -938,9 +938,9 @@ def _restore_out(self, out_vars): """ flatten_outputs = self._outputs.tolist() - self._clear_outputs_name(flatten_outputs) for i, idx in enumerate(self._outputs.var_ids): flatten_outputs[idx] = out_vars[i] + self._clear_outputs_name(flatten_outputs) outs = self._outputs.restore(flatten_outputs) if outs is not None and len(outs) == 1: outs = outs[0] From 13366ddc31720ca5c8ff6a9e21ae42419b2481ce Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sun, 9 Apr 2023 04:50:08 +0000 Subject: [PATCH 5/8] only change tensor name --- python/paddle/jit/dy2static/partial_program.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/paddle/jit/dy2static/partial_program.py b/python/paddle/jit/dy2static/partial_program.py index 15379c13dd490d..9782e07b6e1810 100644 --- a/python/paddle/jit/dy2static/partial_program.py +++ b/python/paddle/jit/dy2static/partial_program.py @@ -949,8 +949,9 @@ def _restore_out(self, out_vars): def _clear_outputs_name(self, outputs): """Clear output name to avoid name conflict in mulitple program""" - for tensor in outputs: - tensor.name = "" + for output in outputs: + if isinstance(output, paddle.Tensor): + output.name = "" @switch_to_static_graph def _clone_for_test(self, main_program): From 20315b1debe61a7038dcb62b06cf76d19de5cb78 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sun, 9 Apr 2023 06:19:22 +0000 Subject: [PATCH 6/8] revert test mv --- .../tests/unittests}/dygraph_to_static/test_gradname_parse.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {test => python/paddle/fluid/tests/unittests}/dygraph_to_static/test_gradname_parse.py (100%) diff --git a/test/dygraph_to_static/test_gradname_parse.py b/python/paddle/fluid/tests/unittests/dygraph_to_static/test_gradname_parse.py similarity index 100% rename from test/dygraph_to_static/test_gradname_parse.py rename to python/paddle/fluid/tests/unittests/dygraph_to_static/test_gradname_parse.py From 1f5a08d6f493b68b6ed38df9669cca9e2c1b9603 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sun, 9 Apr 2023 08:25:41 +0000 Subject: [PATCH 7/8] clear input name --- python/paddle/jit/dy2static/partial_program.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/jit/dy2static/partial_program.py b/python/paddle/jit/dy2static/partial_program.py index 9782e07b6e1810..280747671f0426 100644 --- a/python/paddle/jit/dy2static/partial_program.py +++ b/python/paddle/jit/dy2static/partial_program.py @@ -863,7 +863,7 @@ def _prepare(self, inputs): var = None var = core.eager.Tensor( value=value, - name=self._inputs[i].desc.name(), + name="", # self._inputs[i].desc.name(), persistable=False, place=expected_place, zero_copy=True, @@ -879,7 +879,7 @@ def _prepare(self, inputs): var.stop_gradient = True else: var = value - var.name = self._inputs[i].desc.name() + var.name = "" # self._inputs[i].desc.name() else: continue input_vars.append(var) @@ -940,7 +940,7 @@ def _restore_out(self, out_vars): flatten_outputs = self._outputs.tolist() for i, idx in enumerate(self._outputs.var_ids): flatten_outputs[idx] = out_vars[i] - self._clear_outputs_name(flatten_outputs) + # self._clear_outputs_name(flatten_outputs) outs = self._outputs.restore(flatten_outputs) if outs is not None and len(outs) == 1: outs = outs[0] From 5c40f887cf6d6dc2379990ee80b338ece8e13884 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Sun, 9 Apr 2023 09:03:42 +0000 Subject: [PATCH 8/8] Revert "clear input name" This reverts commit 1f5a08d6f493b68b6ed38df9669cca9e2c1b9603. --- python/paddle/jit/dy2static/partial_program.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/jit/dy2static/partial_program.py b/python/paddle/jit/dy2static/partial_program.py index 280747671f0426..9782e07b6e1810 100644 --- a/python/paddle/jit/dy2static/partial_program.py +++ b/python/paddle/jit/dy2static/partial_program.py @@ -863,7 +863,7 @@ def _prepare(self, inputs): var = None var = core.eager.Tensor( value=value, - name="", # self._inputs[i].desc.name(), + name=self._inputs[i].desc.name(), persistable=False, place=expected_place, zero_copy=True, @@ -879,7 +879,7 @@ def _prepare(self, inputs): var.stop_gradient = True else: var = value - var.name = "" # self._inputs[i].desc.name() + var.name = self._inputs[i].desc.name() else: continue input_vars.append(var) @@ -940,7 +940,7 @@ def _restore_out(self, out_vars): flatten_outputs = self._outputs.tolist() for i, idx in enumerate(self._outputs.var_ids): flatten_outputs[idx] = out_vars[i] - # self._clear_outputs_name(flatten_outputs) + self._clear_outputs_name(flatten_outputs) outs = self._outputs.restore(flatten_outputs) if outs is not None and len(outs) == 1: outs = outs[0]