From bb7f34594cec12407c83a83121f33d4239b0dccd Mon Sep 17 00:00:00 2001 From: liaogang Date: Mon, 31 Jul 2017 22:19:08 +0800 Subject: [PATCH 1/6] Add mean cpu/gpu op --- paddle/operators/CMakeLists.txt | 24 ++++++++++------- paddle/operators/mean_op.cc | 46 ++++++++++++++++++++++++++++++++ paddle/operators/mean_op.cu | 4 +++ paddle/operators/mean_op.h | 36 +++++++++++++++++++++++++ paddle/operators/mean_op_test.cc | 25 +++++++++++++++++ 5 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 paddle/operators/mean_op.cc create mode 100644 paddle/operators/mean_op.cu create mode 100644 paddle/operators/mean_op.h create mode 100644 paddle/operators/mean_op_test.cc diff --git a/paddle/operators/CMakeLists.txt b/paddle/operators/CMakeLists.txt index 5085e1b925..c62c852b13 100644 --- a/paddle/operators/CMakeLists.txt +++ b/paddle/operators/CMakeLists.txt @@ -44,18 +44,24 @@ endfunction() op_library(add_op SRCS add_op.cc add_op.cu) cc_test(add_op_test SRCS add_op_test.cc DEPS add_op) +op_library(mean_op SRCS mean_op.cc mean_op.cu) +cc_test(mean_op_test SRCS mean_op_test.cc DEPS mean_op) + op_library(mul_op SRCS mul_op.cc mul_op.cu) op_library(rowwise_add_op SRCS rowwise_add_op.cu rowwise_add_op.cc) -op_library(sigmoid_op SRCS sigmoid_op.cu sigmoid_op.cc) + +op_library(sigmoid_op SRCS sigmoid_op.cc sigmoid_op.cu) op_library(softmax_op SRCS softmax_op.cc softmax_op.cu) op_library(cross_entropy_op SRCS cross_entropy_op.cc cross_entropy_op.cu) - -op_library(fc_op SRCS fc_op.cc DEPS mul_op rowwise_add_op sigmoid_op - softmax_op net) - op_library(sgd_op SRCS sgd_op.cc sgd_op.cu) -op_library(recurrent_network_op SRCS recurrent_network_op.cc DEPS op_desc -tensor op_registry operator net) -cc_test(recurrent_network_op_test SRCS recurrent_network_op_test.cc DEPS -recurrent_network_op gtest mul_op add_op) +op_library(fc_op + SRCS fc_op.cc + DEPS mul_op rowwise_add_op sigmoid_op softmax_op net) + +op_library(recurrent_network_op + SRCS recurrent_network_op.cc + DEPS op_desc tensor net) +cc_test(recurrent_network_op_test + SRCS recurrent_network_op_test.cc + DEPS recurrent_network_op mul_op add_op) diff --git a/paddle/operators/mean_op.cc b/paddle/operators/mean_op.cc new file mode 100644 index 0000000000..fc486a7435 --- /dev/null +++ b/paddle/operators/mean_op.cc @@ -0,0 +1,46 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +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. */ + +#include "paddle/operators/mean_op.h" + +namespace paddle { +namespace operators { + +class MeanOp : public OperatorWithKernel { +protected: + void InferShape(const std::vector &inputs, + const std::vector &outputs) const override { + PADDLE_ENFORCE(inputs.size() == 1, "Input size of AddOp must be one"); + PADDLE_ENFORCE(outputs.size() == 1, "Output size of AddOp must be one"); + PADDLE_ENFORCE(inputs[0] != nullptr && outputs[0] != nullptr, + "Input/Output of MeanOp must be initialized."); + outputs[0]->Resize(framework::make_ddim({1})); + } +}; + +class MeanOpMaker : public OpProtoAndCheckerMaker { +public: + MeanOpMaker(OpProto *proto, OpAttrChecker *op_checker) + : OpProtoAndCheckerMaker(proto, op_checker) { + AddInput("X", "The input of mean op"); + AddOutput("Out", "The output of mean op"); + AddComment("Mean Operator"); + } +}; + +} // namespace operators +} // namespace paddle + +REGISTER_OP(mean, ops::MeanOp, ops::MeanOpMaker); +REGISTER_OP_CPU_KERNEL(mean, ops::MeanKernel); diff --git a/paddle/operators/mean_op.cu b/paddle/operators/mean_op.cu new file mode 100644 index 0000000000..4dbb566b1d --- /dev/null +++ b/paddle/operators/mean_op.cu @@ -0,0 +1,4 @@ +#include "paddle/framework/op_registry.h" +#include "paddle/operators/mean_op.h" + +REGISTER_OP_GPU_KERNEL(mean, ops::AddKernel); diff --git a/paddle/operators/mean_op.h b/paddle/operators/mean_op.h new file mode 100644 index 0000000000..21fa579643 --- /dev/null +++ b/paddle/operators/mean_op.h @@ -0,0 +1,36 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +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. */ + +#pragma once +#include "paddle/operators/type_alias.h" + +namespace paddle { +namespace operators { + +template +class MeanKernel : public OpKernel { +public: + void Compute(const KernelContext& context) const override { + auto input = context.Input(0)->Get(); + auto output = context.Output(0)->GetMutable(); + + output->mutable_data(context.GetPlace()); + EigenVector::Flatten(*output).device( + *(context.GetEigenDevice())) = + EigenVector::Flatten(input).mean(); + } +}; + +} // namespace operators +} // namespace paddle diff --git a/paddle/operators/mean_op_test.cc b/paddle/operators/mean_op_test.cc new file mode 100644 index 0000000000..375dcd50e1 --- /dev/null +++ b/paddle/operators/mean_op_test.cc @@ -0,0 +1,25 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +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. */ + +#include + +#include + +USE_OP(mean); + +TEST(MeanOp, GetOpProto) { + auto& protos = paddle::framework::OpRegistry::protos(); + auto it = protos.find("mean"); + ASSERT_NE(it, protos.end()); +} From 1e676f684d58cfce90f194f85c422306543543da Mon Sep 17 00:00:00 2001 From: liaogang Date: Tue, 1 Aug 2017 16:10:52 +0800 Subject: [PATCH 2/6] Add mean op unit test in python --- paddle/operators/mean_op.cu | 5 +++-- paddle/operators/mean_op.h | 4 ++-- paddle/pybind/CMakeLists.txt | 11 +++++++++-- paddle/pybind/pybind.cc | 1 + python/paddle/v2/framework/tests/CMakeLists.txt | 1 + python/paddle/v2/framework/tests/test_mean_op.py | 16 ++++++++++++++++ 6 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 python/paddle/v2/framework/tests/test_mean_op.py diff --git a/paddle/operators/mean_op.cu b/paddle/operators/mean_op.cu index 4dbb566b1d..740157cbc5 100644 --- a/paddle/operators/mean_op.cu +++ b/paddle/operators/mean_op.cu @@ -1,4 +1,5 @@ -#include "paddle/framework/op_registry.h" +#define EIGEN_USE_GPU + #include "paddle/operators/mean_op.h" -REGISTER_OP_GPU_KERNEL(mean, ops::AddKernel); +REGISTER_OP_GPU_KERNEL(mean, ops::MeanKernel); diff --git a/paddle/operators/mean_op.h b/paddle/operators/mean_op.h index 21fa579643..483b3eb601 100644 --- a/paddle/operators/mean_op.h +++ b/paddle/operators/mean_op.h @@ -26,8 +26,8 @@ public: auto output = context.Output(0)->GetMutable(); output->mutable_data(context.GetPlace()); - EigenVector::Flatten(*output).device( - *(context.GetEigenDevice())) = + + EigenScalar::From(*output).device(*(context.GetEigenDevice())) = EigenVector::Flatten(input).mean(); } }; diff --git a/paddle/pybind/CMakeLists.txt b/paddle/pybind/CMakeLists.txt index 7d0e68a8f3..845589dcb1 100644 --- a/paddle/pybind/CMakeLists.txt +++ b/paddle/pybind/CMakeLists.txt @@ -1,2 +1,9 @@ -cc_library(paddle_pybind SHARED SRCS pybind.cc DEPS pybind python - add_op fc_op sgd_op cross_entropy_op recurrent_network_op) +cc_library(paddle_pybind SHARED + SRCS pybind.cc + DEPS pybind python + fc_op + sgd_op + add_op + mean_op + cross_entropy_op + recurrent_network_op) diff --git a/paddle/pybind/pybind.cc b/paddle/pybind/pybind.cc index 08a8bd0d8b..4fa481bedf 100644 --- a/paddle/pybind/pybind.cc +++ b/paddle/pybind/pybind.cc @@ -33,6 +33,7 @@ USE_OP(onehot_cross_entropy); USE_OP_WITHOUT_KERNEL(fc); USE_OP(sgd); USE_OP(mul); +USE_OP(mean); USE_OP(sigmoid); USE_OP(softmax); USE_OP(rowwise_add); diff --git a/python/paddle/v2/framework/tests/CMakeLists.txt b/python/paddle/v2/framework/tests/CMakeLists.txt index cdaaa60674..540636a0e8 100644 --- a/python/paddle/v2/framework/tests/CMakeLists.txt +++ b/python/paddle/v2/framework/tests/CMakeLists.txt @@ -10,6 +10,7 @@ add_python_test(test_framework test_sgd_op.py test_cross_entropy_op.py test_mul_op.py + test_mean_op.py test_sigmoid_op.py test_softmax_op.py test_rowwise_add_op.py diff --git a/python/paddle/v2/framework/tests/test_mean_op.py b/python/paddle/v2/framework/tests/test_mean_op.py new file mode 100644 index 0000000000..78fff1eeff --- /dev/null +++ b/python/paddle/v2/framework/tests/test_mean_op.py @@ -0,0 +1,16 @@ +import unittest +from op_test_util import OpTestMeta +import numpy as np + + +class TestMeanOp(unittest.TestCase): + __metaclass__ = OpTestMeta + + def setUp(self): + self.type = "mean" + self.X = np.random.random((32, 784)).astype("float32") + self.Out = np.mean(self.X) + + +if __name__ == '__main__': + unittest.main() From 426f0999320324f87ad54f72dd1e54733667712d Mon Sep 17 00:00:00 2001 From: liaogang Date: Tue, 1 Aug 2017 22:16:13 +0800 Subject: [PATCH 3/6] Remove duplicate fc_op --- paddle/operators/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/paddle/operators/CMakeLists.txt b/paddle/operators/CMakeLists.txt index de318c7dec..b910bee836 100644 --- a/paddle/operators/CMakeLists.txt +++ b/paddle/operators/CMakeLists.txt @@ -55,9 +55,6 @@ op_library(softmax_op SRCS softmax_op.cc softmax_op.cu) op_library(cross_entropy_op SRCS cross_entropy_op.cc cross_entropy_op.cu) op_library(fill_zeros_like_op SRCS fill_zeros_like_op.cc fill_zeros_like_op.cu) -op_library(fc_op SRCS fc_op.cc DEPS mul_op rowwise_add_op sigmoid_op - softmax_op net) - op_library(sgd_op SRCS sgd_op.cc sgd_op.cu) op_library(fc_op From 6e0661cf9cc2a198f34273caab02355380c771c3 Mon Sep 17 00:00:00 2001 From: liaogang Date: Tue, 1 Aug 2017 23:20:56 +0800 Subject: [PATCH 4/6] Change ContextKernel to ExecutionKernel --- paddle/operators/mean_op.cc | 11 +++++------ paddle/operators/mean_op.h | 8 ++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/paddle/operators/mean_op.cc b/paddle/operators/mean_op.cc index fc486a7435..fe34d6ad40 100644 --- a/paddle/operators/mean_op.cc +++ b/paddle/operators/mean_op.cc @@ -19,13 +19,12 @@ namespace operators { class MeanOp : public OperatorWithKernel { protected: - void InferShape(const std::vector &inputs, - const std::vector &outputs) const override { - PADDLE_ENFORCE(inputs.size() == 1, "Input size of AddOp must be one"); - PADDLE_ENFORCE(outputs.size() == 1, "Output size of AddOp must be one"); - PADDLE_ENFORCE(inputs[0] != nullptr && outputs[0] != nullptr, + void InferShape(const InferShapeContext &ctx) const override { + PADDLE_ENFORCE(ctx.InputSize() == 1, "Input size of AddOp must be one"); + PADDLE_ENFORCE(ctx.OutputSize() == 1, "Output size of AddOp must be one"); + PADDLE_ENFORCE(ctx.InputVar(0) != nullptr && ctx.OutputVar(0) != nullptr, "Input/Output of MeanOp must be initialized."); - outputs[0]->Resize(framework::make_ddim({1})); + ctx.Output(0)->Resize(framework::make_ddim({1})); } }; diff --git a/paddle/operators/mean_op.h b/paddle/operators/mean_op.h index 483b3eb601..5f7d443751 100644 --- a/paddle/operators/mean_op.h +++ b/paddle/operators/mean_op.h @@ -21,14 +21,14 @@ namespace operators { template class MeanKernel : public OpKernel { public: - void Compute(const KernelContext& context) const override { - auto input = context.Input(0)->Get(); - auto output = context.Output(0)->GetMutable(); + void Compute(const ExecutionContext& context) const override { + auto input = context.Input(0); + auto output = context.Output(0); output->mutable_data(context.GetPlace()); EigenScalar::From(*output).device(*(context.GetEigenDevice())) = - EigenVector::Flatten(input).mean(); + EigenVector::Flatten(*input).mean(); } }; From 9d5c3d246cef6cb3d1df5042041d57ebd5fddd50 Mon Sep 17 00:00:00 2001 From: liaogang Date: Wed, 2 Aug 2017 15:33:54 +0800 Subject: [PATCH 5/6] test --- .pre-commit-config.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 980a97a07c..9984d21a2d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,10 +17,14 @@ - id: detect-private-key files: (?!.*third_party)^.*$ | (?!.*book)^.*$ - id: end-of-file-fixer -- repo: https://github.com/PaddlePaddle/clang-format-pre-commit-hook.git - sha: 28c0ea8a67a3e2dbbf4822ef44e85b63a0080a29 +- repo: local hooks: - - id: clang-formater + - id: clang-format + name: clang-format + description: Format files with ClangFormat. + entry: clang-format -i + language: system + files: \.(c|cc|cxx|cpp|h|hpp|hxx|java|js|m|proto)$ - repo: https://github.com/PaddlePaddle/pre-commit-golang sha: 8337620115c25ff8333f1b1a493bd031049bd7c0 hooks: From 61f3d12d99883a4b23c07fd7b11f73501e6d7ff9 Mon Sep 17 00:00:00 2001 From: liaogang Date: Wed, 2 Aug 2017 15:35:50 +0800 Subject: [PATCH 6/6] test precommit --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9984d21a2d..2ca988c406 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ description: Format files with ClangFormat. entry: clang-format -i language: system - files: \.(c|cc|cxx|cpp|h|hpp|hxx|java|js|m|proto)$ + files: \.(c|cc|cxx|cpp|h|hpp|hxx)$ - repo: https://github.com/PaddlePaddle/pre-commit-golang sha: 8337620115c25ff8333f1b1a493bd031049bd7c0 hooks: