From ec38be670d1f21b39b0dd87bbba621766f59ac64 Mon Sep 17 00:00:00 2001 From: xiongkun Date: Thu, 14 Jul 2022 21:11:44 +0800 Subject: [PATCH] [ Dy2Static ] fix the outputs of net is x,x (#44313) * fix the outputs of net is x,x * add unittest for duplicate output * fix --- .../dygraph_to_static/partial_program.py | 8 +++ .../test_duplicate_output.py | 65 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 python/paddle/fluid/tests/unittests/dygraph_to_static/test_duplicate_output.py diff --git a/python/paddle/fluid/dygraph/dygraph_to_static/partial_program.py b/python/paddle/fluid/dygraph/dygraph_to_static/partial_program.py index 318585972f..4faa4a098e 100644 --- a/python/paddle/fluid/dygraph/dygraph_to_static/partial_program.py +++ b/python/paddle/fluid/dygraph/dygraph_to_static/partial_program.py @@ -441,11 +441,18 @@ class PartialProgramLayer: continue input_vars.append(var) + # mapping from name(string) -> VarBase + out_varbase_map = {} + def create_out(var_id): var = self._outputs[var_id] assert isinstance(var, framework.Variable) var_desc = var.desc varbase = None + + if var_desc.name() in out_varbase_map: + return out_varbase_map[var_desc.name()] + if not framework._in_eager_mode_: var_base = core.VarBase(var_desc.dtype(), var_desc.shape(), var_desc.name(), var_desc.type(), False) @@ -453,6 +460,7 @@ class PartialProgramLayer: var_base = core.eager.Tensor(var_desc.dtype(), var_desc.shape(), var_desc.name(), var_desc.type(), False) + out_varbase_map[var_desc.name()] = var_base return var_base # Create VarBase to receive output data. diff --git a/python/paddle/fluid/tests/unittests/dygraph_to_static/test_duplicate_output.py b/python/paddle/fluid/tests/unittests/dygraph_to_static/test_duplicate_output.py new file mode 100644 index 0000000000..aea7a1910b --- /dev/null +++ b/python/paddle/fluid/tests/unittests/dygraph_to_static/test_duplicate_output.py @@ -0,0 +1,65 @@ +# Copyright (c) 2019 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. + +from __future__ import print_function + +import numpy as np +import unittest + +import paddle + +np.random.seed(1) + +if paddle.fluid.is_compiled_with_cuda(): + place = paddle.fluid.CUDAPlace(0) +else: + place = paddle.fluid.CPUPlace() + + +class SimpleNet(paddle.nn.Layer): + + def __init__(self): + super().__init__() + self._linear = paddle.nn.Linear(1, 1) + + def forward(self, x): + """ forward with duplicate outputs. + """ + x = self._linear(x) + return x, x + + +class TestDuplicateOutput(unittest.TestCase): + """ + TestCase for the transformation from control flow `if/else` + dependent on tensor in Dygraph into Static `fluid.layers.cond`. + """ + + def setUp(self): + self.net = paddle.jit.to_static(SimpleNet()) + self.x = paddle.to_tensor([1.0]) + + def _run_static(self): + loss0, loss1 = self.net(self.x) + loss0.backward() + param = self.net.parameters() + self.assertEqual(param[0].grad.numpy(), 1.0) + + def test_ast_to_func(self): + self._run_static() + + +if __name__ == '__main__': + with paddle.fluid.framework._test_eager_guard(): + unittest.main() -- GitLab