From 2e07615682168a7b9e31afa85588e0b7363d8f4e Mon Sep 17 00:00:00 2001 From: oyjxer <1728722986@qq.com> Date: Fri, 19 Mar 2021 19:58:03 +0800 Subject: [PATCH 1/2] fix elementwise_grad --- .../elementwise/elementwise_div_op_npu.cc | 10 ++++-- .../npu/test_elementwise_div_op_npu.py | 32 +++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/paddle/fluid/operators/elementwise/elementwise_div_op_npu.cc b/paddle/fluid/operators/elementwise/elementwise_div_op_npu.cc index 268d17ca924d6..db44df1e6fde4 100644 --- a/paddle/fluid/operators/elementwise/elementwise_div_op_npu.cc +++ b/paddle/fluid/operators/elementwise/elementwise_div_op_npu.cc @@ -110,9 +110,15 @@ class ElementwiseDivGradNPUKernel : public framework::OpKernel { if (dy) { dy->mutable_data(place); - Tensor y_grad_w(x->type()); + Tensor neg_out(y->type()); + neg_out.mutable_data(y->dims(), place); + auto neg_out_runner = NpuOpRunner("Neg", {*out}, + {neg_out}, {}); + neg_out_runner.Run(stream); + + Tensor y_grad_w(y->type()); y_grad_w.mutable_data(y->dims(), place); - auto y_grad_w_runner = NpuOpRunner("Mul", {*out, y_power}, + auto y_grad_w_runner = NpuOpRunner("Div", {neg_out, *y}, {y_grad_w}, {}); y_grad_w_runner.Run(stream); diff --git a/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py b/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py index e0aa8d277f7d8..70211cf85135b 100644 --- a/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py +++ b/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py @@ -32,7 +32,7 @@ class TestElementwiseDiv(OpTest): def setUp(self): self.set_npu() self.op_type = "elementwise_div" - self.place = paddle.NPUPlace(0) + self.place = paddle.NPUPlace(5) self.init_dtype() np.random.seed(SEED) @@ -56,12 +56,24 @@ def init_dtype(self): def test_check_output(self): self.check_output_with_place(self.place, check_dygraph=False) - # TODO(ascendrc): Div grad test - # def test_check_grad(self): - # if self.dtype == np.float16: - # return - # self.check_grad(['X'], 'Out') - # + def test_check_grad_normal(self): + self.check_grad_with_place( + self.place, ['X', 'Y'], + 'Out', + max_relative_error=0.007, + check_dygraph=False) + + def test_check_grad_ingore_x(self): + self.check_grad_with_place( + self.place, ['Y'], + 'Out', + max_relative_error=0.007, + no_grad_set=set("X"), + check_dygraph=False) + + def test_check_grad_ingore_y(self): + self.check_grad_with_place( + self.place, ['X'], 'Out', no_grad_set=set("Y"), check_dygraph=False) @unittest.skipIf(not paddle.is_compiled_with_npu(), @@ -70,7 +82,7 @@ class TestElementwiseDivFp16(OpTest): def setUp(self): self.set_npu() self.op_type = "elementwise_div" - self.place = paddle.NPUPlace(0) + self.place = paddle.NPUPlace(5) self.init_dtype() np.random.seed(SEED) @@ -123,7 +135,7 @@ def _test(self, run_npu=True): e = paddle.multiply(a, b) f = paddle.multiply(c, d) f.stop_gradient = True - g = paddle.divide(e, f) + g = fluid.layers.elementwise_div(e, f) fc_1 = fluid.layers.fc(input=g, size=128) prediction = fluid.layers.fc(input=fc_1, size=2, act='softmax') @@ -134,7 +146,7 @@ def _test(self, run_npu=True): sgd.minimize(loss) if run_npu: - place = paddle.NPUPlace(0) + place = paddle.NPUPlace(5) else: place = paddle.CPUPlace() From bf674014e9e89123bbe1a1159abd40da33be9b58 Mon Sep 17 00:00:00 2001 From: oyjxer <1728722986@qq.com> Date: Fri, 19 Mar 2021 21:18:20 +0800 Subject: [PATCH 2/2] fix elementwise_div_grad --- .../tests/unittests/npu/test_elementwise_div_op_npu.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py b/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py index 70211cf85135b..0ae2678d10b47 100644 --- a/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py +++ b/python/paddle/fluid/tests/unittests/npu/test_elementwise_div_op_npu.py @@ -32,7 +32,7 @@ class TestElementwiseDiv(OpTest): def setUp(self): self.set_npu() self.op_type = "elementwise_div" - self.place = paddle.NPUPlace(5) + self.place = paddle.NPUPlace(0) self.init_dtype() np.random.seed(SEED) @@ -82,7 +82,7 @@ class TestElementwiseDivFp16(OpTest): def setUp(self): self.set_npu() self.op_type = "elementwise_div" - self.place = paddle.NPUPlace(5) + self.place = paddle.NPUPlace(0) self.init_dtype() np.random.seed(SEED) @@ -146,7 +146,7 @@ def _test(self, run_npu=True): sgd.minimize(loss) if run_npu: - place = paddle.NPUPlace(5) + place = paddle.NPUPlace(0) else: place = paddle.CPUPlace()