diff --git a/paddle/fluid/operators/ngraph/ops/activation_op.h b/paddle/fluid/operators/ngraph/ops/activation_op.h index ef6c11bce706a84c8e6a330f3acaf69f63617516..884ec659267a5386b5715b9f8b38be8900123823 100644 --- a/paddle/fluid/operators/ngraph/ops/activation_op.h +++ b/paddle/fluid/operators/ngraph/ops/activation_op.h @@ -26,6 +26,52 @@ namespace paddle { namespace operators { namespace ngraphs { +void BuildGeluNode( + const std::shared_ptr& op, + std::shared_ptr< + std::unordered_map>> + ngb_node_map) { + auto input = platform::GetInputNode(op, "X", ngb_node_map); + auto half = paddle::platform::CreateConstant(input->get_element_type(), + input->get_shape(), {0.5}); + auto one = paddle::platform::CreateConstant(input->get_element_type(), + input->get_shape(), {1}); + auto sqrt_two = + std::make_shared(paddle::platform::CreateConstant( + input->get_element_type(), input->get_shape(), {2})); + auto out = half * input * + (one + std::make_shared(input / sqrt_two)); + platform::SetOutputNode(op, "Out", out, ngb_node_map); +} + +void BuildGeluGradNode( + const std::shared_ptr& op, + std::shared_ptr< + std::unordered_map>> + ngb_node_map) { + auto input = platform::GetInputNode(op, "X", ngb_node_map); + auto dout = platform::GetInputNode(op, "Out@GRAD", ngb_node_map); + auto half = paddle::platform::CreateConstant(input->get_element_type(), + input->get_shape(), {0.5}); + auto minus_half = paddle::platform::CreateConstant( + input->get_element_type(), input->get_shape(), {-0.5}); + auto one = paddle::platform::CreateConstant(input->get_element_type(), + input->get_shape(), {1}); + auto two = paddle::platform::CreateConstant(input->get_element_type(), + input->get_shape(), {2}); + auto pi = paddle::platform::CreateConstant( + input->get_element_type(), input->get_shape(), {3.14159265359}); + auto sqrt_two = std::make_shared(two); + auto sqrt_pi = std::make_shared(pi); + + auto first = + half * (one + std::make_shared(input * one / sqrt_two)); + auto second = half * (two / sqrt_pi) * (one / sqrt_two) * input * + std::make_shared(minus_half * input * input); + auto gelu_grad = dout * (first + second); + platform::SetOutputNode(op, "X@GRAD", gelu_grad, ngb_node_map); +} + void BuildReluGradNode( const std::shared_ptr& op, std::shared_ptr< @@ -64,6 +110,8 @@ void BuildTanhGradNode( } // namespace operators } // namespace paddle +REGISTER_NG_OP(gelu, BuildGeluNode); +REGISTER_NG_OP(gelu_grad, BuildGeluGradNode); REGISTER_NG_OP(relu_grad, BuildReluGradNode); REGISTER_NG_OP(square, BuildSquareNode); REGISTER_NG_OP(tanh_grad, BuildTanhGradNode); diff --git a/python/paddle/fluid/tests/unittests/ngraph/test_activation_ngraph_op.py b/python/paddle/fluid/tests/unittests/ngraph/test_activation_ngraph_op.py index 3c1db3bf6406cce7952b7e07dc5b39c1389d7cea..a7f167cbd415c9000311aa45bef0432f61e668ea 100644 --- a/python/paddle/fluid/tests/unittests/ngraph/test_activation_ngraph_op.py +++ b/python/paddle/fluid/tests/unittests/ngraph/test_activation_ngraph_op.py @@ -18,7 +18,7 @@ import unittest import numpy as np import paddle.fluid.core as core from paddle.fluid.tests.unittests.op_test import OpTest -from paddle.fluid.tests.unittests.test_activation_op import TestAbs, TestSigmoid, TestSquare, TestRelu, TestTanh +from paddle.fluid.tests.unittests.test_activation_op import TestAbs, TestGelu, TestSigmoid, TestSquare, TestRelu, TestTanh class TestNGRAPHReluDim4(TestRelu):