diff --git a/paddle/fluid/operators/activation_op_npu.cc b/paddle/fluid/operators/activation_op_npu.cc index bb520c270fa2cb966b535362371bafe51fd13f23..1ccd99c71f339a8711744c75f21fabde8fa3e6ad 100644 --- a/paddle/fluid/operators/activation_op_npu.cc +++ b/paddle/fluid/operators/activation_op_npu.cc @@ -397,6 +397,40 @@ class HardSigmoidGradNPUKernel : public framework::OpKernel { } }; +template +class ReciprocalNPUKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override { + auto* x = ctx.Input("X"); + auto* out = ctx.Output("Out"); + auto place = ctx.GetPlace(); + out->mutable_data(place); + auto stream = + ctx.template device_context() + .stream(); + const auto& runner = NpuOpRunner("Reciprocal", {*x}, {*out}, {}); + runner.Run(stream); + } +}; + +template +class ReciprocalGradNPUKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override { + auto* out = ctx.Input("Out"); + auto* dout = ctx.Input(framework::GradVarName("Out")); + auto* dx = ctx.Output(framework::GradVarName("X")); + auto place = ctx.GetPlace(); + dx->mutable_data(place); + auto stream = + ctx.template device_context() + .stream(); + const auto& runner_dx = + NpuOpRunner("ReciprocalGrad", {*out, *dout}, {*dx}, {}); + runner_dx.Run(stream); + } +}; + } // namespace operators } // namespace paddle @@ -483,3 +517,17 @@ REGISTER_OP_NPU_KERNEL( ops::HardSigmoidGradNPUKernel, ops::HardSigmoidGradNPUKernel); + +REGISTER_OP_NPU_KERNEL( + reciprocal, + ops::ReciprocalNPUKernel, + ops::ReciprocalNPUKernel, + ops::ReciprocalNPUKernel); + +REGISTER_OP_NPU_KERNEL( + reciprocal_grad, + ops::ReciprocalGradNPUKernel, + ops::ReciprocalGradNPUKernel, + ops::ReciprocalGradNPUKernel); diff --git a/paddle/fluid/operators/mean_op_npu.cc b/paddle/fluid/operators/mean_op_npu.cc index ab0a3336b361f8c7127019e424b2bf72c6b35385..6fc371ee37c528552ae61e583a4362be0889b414 100644 --- a/paddle/fluid/operators/mean_op_npu.cc +++ b/paddle/fluid/operators/mean_op_npu.cc @@ -91,13 +91,10 @@ class MeanGradNPUKernel : public framework::OpKernel { namespace ops = paddle::operators; namespace plat = paddle::platform; REGISTER_OP_NPU_KERNEL( - mean, ops::MeanNPUKernel, - ops::MeanNPUKernel, - ops::MeanNPUKernel, + mean, ops::MeanNPUKernel, ops::MeanNPUKernel) REGISTER_OP_NPU_KERNEL( - mean_grad, ops::MeanGradNPUKernel, + mean_grad, ops::MeanGradNPUKernel, - ops::MeanGradNPUKernel, ops::MeanGradNPUKernel) diff --git a/python/paddle/fluid/tests/unittests/npu/test_reciprocal_op_npu.py b/python/paddle/fluid/tests/unittests/npu/test_reciprocal_op_npu.py new file mode 100644 index 0000000000000000000000000000000000000000..e8f5de005d421566451bff7a211961a311da3195 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/npu/test_reciprocal_op_npu.py @@ -0,0 +1,78 @@ +# Copyright (c) 2021 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, division + +import numpy as np +import unittest +import sys +sys.path.append("..") +from op_test import OpTest, skip_check_grad_ci +import paddle +paddle.enable_static() + + +class TestNPUReciprocal(OpTest): + def setUp(self): + self.op_type = "reciprocal" + self.set_npu() + self.init_dtype() + + np.random.seed(1024) + x = np.random.uniform(1, 2, [11, 17]).astype(self.dtype) + out = np.reciprocal(x) + + self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)} + self.outputs = {'Out': out} + + def test_check_output(self): + self.check_output_with_place(self.place) + + def test_check_grad(self): + if self.dtype == np.float16: + return + self.check_grad_with_place( + self.place, ['X'], 'Out', max_relative_error=0.01) + + def set_npu(self): + self.__class__.use_npu = True + self.place = paddle.NPUPlace(0) + + def init_dtype(self): + self.dtype = np.float32 + + +class TestNPUReciprocalFp64(TestNPUReciprocal): + def set_npu(self): + self.__class__.use_npu = True + self.place = paddle.NPUPlace(0) + + def init_dtype(self): + self.dtype = np.float64 + + +@skip_check_grad_ci( + reason="The backward test is not supported for float16 type on NPU.") +class TestNPUReciprocalFp16(TestNPUReciprocal): + def set_npu(self): + self.__class__.use_npu = True + self.place = paddle.NPUPlace(0) + self.__class__.no_need_check_grad = True + + def init_dtype(self): + self.dtype = np.float16 + + +if __name__ == '__main__': + unittest.main()