From 695b10377e3905f8ac519668e005b8deaa8f2ed9 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 15 Nov 2017 20:05:08 +0800 Subject: [PATCH 0001/1416] port hsigmoid layer --- paddle/operators/hierarchical_sigmoid_op.cc | 121 ++++++++++++++++++++ paddle/operators/hierarchical_sigmoid_op.h | 35 ++++++ paddle/operators/math/CMakeLists.txt | 1 + paddle/operators/math/matrix_bit_code.cc | 84 ++++++++++++++ paddle/operators/math/matrix_bit_code.h | 64 +++++++++++ 5 files changed, 305 insertions(+) create mode 100644 paddle/operators/hierarchical_sigmoid_op.cc create mode 100644 paddle/operators/hierarchical_sigmoid_op.h create mode 100644 paddle/operators/math/matrix_bit_code.cc create mode 100644 paddle/operators/math/matrix_bit_code.h diff --git a/paddle/operators/hierarchical_sigmoid_op.cc b/paddle/operators/hierarchical_sigmoid_op.cc new file mode 100644 index 00000000000..1f77ff1268a --- /dev/null +++ b/paddle/operators/hierarchical_sigmoid_op.cc @@ -0,0 +1,121 @@ +/* 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 "hierarchical_sigmoid_op.h" + +namespace paddle { +namespace operators { + +/** + * Organize the classes into a binary tree. At each node, a sigmoid function + * is used to calculate the probability of belonging to the right branch. + * This idea is from "F. Morin, Y. Bengio (AISTATS 05): + * Hierarchical Probabilistic Neural Network Language Model." + * + * Here we uses a simple way of making the binary tree. + * Assuming the number of classes C = 6, + * The classes are organized as a binary tree in the following way: + * + * @code{.py} + * *-*-*- 2 + * | | |- 3 + * | | + * | |-*- 4 + * | |- 5 + * | + * |-*- 0 + * |- 1 + * @endcode + * + * where * indicates an internal node, and each leaf node represents a class. + * - Node 0 ... C-2 are internal nodes. + * - Node C-1 ... 2C-2 are leaf nodes. + * - Class c is represented by leaf node \f$c+C-1\f$. + * + * We assign an id for each node: + * - the id of root be 0. + * - the left child of a node i is 2*i+1. + * - the right child of a node i is 2*i+2. + * + * It's easy to see that: + * - the parent of node i is \f$\left\lfloor(i-1)/2\right\rfloor\f$. + * - the j-th level ancestor of node i is + * \f$\left\lfloor(i+1)/2^{j+1}\right\rfloor - 1\f$. + * - A node i is a left child of its parent if \f$(i-1)\%2==0\f$. + * + */ + +class HierarchicalSigmoidOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + void InferShape(framework::InferShapeContext* ctx) const override { + PADDLE_ENFORCE(ctx->HasInputs("X"), "Inputs(X) should not be null."); + PADDLE_ENFORCE(ctx->HasInput("Label"), "Input(Label) should not be null."); + PADDLE_ENFORCE(ctx->HasOutput("Out"), "Output(Out) should not be null."); + const int64_t batch_size = ctx->GetInputsDim("X")[0][0]; + const int64_t size = ctx->GetInputsDim("X").size(); + std::vector output_shape({batch_size, size}); + ctx->SetOutputDim("Out", framework::make_ddim(output_shape)); + } +}; + +class HierarchicalSigmoidGradOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + void InferShape(framework::InferShapeContext* ctx) const override {} +}; + +class HierarchicalSigmoidOpMaker : public framework::OpProtoAndCheckerMaker { + public: + HierarchicalSigmoidOpMaker(framework::OpProto* proto, + framework::OpAttrChecker* op_checker) + : OpProtoAndCheckerMaker(proto, op_checker) { + AddInput("X", + "(TensorArray, required) The input array. Each Tensor has the " + "same shape with [N * D]." + .AsDuplicable(); + AddInput("Label", + "(Tensor, required), The labels of training data. It's a" + "1-D tensor."); + AddInput("Bias", + "(Tensor, optional), The bias is a 1-D tensor, " + "which is applied to the output"); + AddOutput("Out", + "(Tensor, required) The output of hierarchical sigmoid operator."); + AddAttr("num_classes", + "(int, required)", + "The number of classes"); + AddComment(R"DOC( +The hierarchical sigmoid operator organize the classes into a binary tree. +At each node, a sigmoid function is used to caculate the probability of +belonging to the right branch. This idea is from +"F. Morin, Y. Bengio (AISTATS 05): +Hierarchical Probabilistic Neural Network Language Model." + )DOC"); + } +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +REGISTER_OP(hierarchical_sigmoid, ops::HierarchicalSigmoidOp, + ops::HierarchicalSigmoidOpMaker, hierarchical_sigmoid_grad, + ops::HierarchicalSigmoidGradOp); +REGISTER_OP_CPU_KERNEL( + hierarchical_sigmoid, + ops::HierarchicalSigmoidOpKernel); +REGISTER_OP_CPU_KERNEL( + hierarchical_sigmoid_grad, + ops::HierarchicalSigmoidGradOpKernel); diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h new file mode 100644 index 00000000000..8a753605d6e --- /dev/null +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -0,0 +1,35 @@ +/* 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/framework/op_registry.h" +#include "paddle/operators/math/matrix_bit_code.h" + +namespace paddle { +namespace operators { +template + +class HierarchicalSigmoidOpKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override {} +}; + +template +class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override {} +}; + +} // namespace operators +} // namespace paddle diff --git a/paddle/operators/math/CMakeLists.txt b/paddle/operators/math/CMakeLists.txt index ab7f23f5704..cc96b27c25e 100644 --- a/paddle/operators/math/CMakeLists.txt +++ b/paddle/operators/math/CMakeLists.txt @@ -26,6 +26,7 @@ else() cc_library(sequence2batch SRCS sequence2batch.cc DEPS device_context) cc_library(lstm_compute SRCS lstm_compute.cc DEPS device_context activation_functions) cc_library(gru_compute SRCS gru_compute.cc DEPS device_context activation_functions math_function) + cc_library(matrix_bit_code SRCS matrix_bit_code.cc) endif() cc_test(math_function_test SRCS math_function_test.cc DEPS math_function tensor) diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc new file mode 100644 index 00000000000..3f1dbbf3994 --- /dev/null +++ b/paddle/operators/math/matrix_bit_code.cc @@ -0,0 +1,84 @@ +/* Copyright (c) 2017 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 "matrix_bit_code.h" + +namespace paddle { +namespace operators { +namespace math { + +/** + * CodeTable class should support 3 functions: + * + * size_t size() + * return the number of codes + * + * int getMaxCodeLength() + * return the maximal code length + * + * Code operator()(size_t i) + * return the i-th code. Code class is descriebed below. + * + * Code class should support 3 functions: + * + * int getLength() + * return the length of the code + * + * bool calcIndex(int bit) + * bit ranges from 0 to getLength() - 1 + * return the index for the (1+bit) level parent + * + * bool calcBit(int bit) + * return true if the bit level parent is the right child of (1+bit) level + * parent + * + */ + +/* + for i: + for j < codeLength: + op(a(i, j), b(0, index(i, j))) +*/ +template +static void AddByBitCodeT(Op op, CodeTable code_table, + const framework::Tensor& codes, framework::Tensor& a, + framework::Tensor& b) { + size_t num_classes = code_table.size(); + size_t max_code_length = code_table.get_max_code_length(); + size_t num_sample = a.dims()[0].size(); + size_t width = a.dims()[1].size(); + + for (size_t i = 0; i < num_sample; ++i) { + auto code = code_table(codes.data()[i]) int code_length = + code.get_length(); + for (int j = 0; j < code_length; + j) { + size_t index = code.calc_index(j); + op(a.data()[i * width + j], b.data()[index]); + } + } +} + +/* For j < codeLength: + a(i, j) += b(0, index(i, j)) +*/ +template +void AddByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& a, const framework::Tensor& b) { + auto op = [](T& t, T& v) { t += v; }; + AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, a, b); +} + +} // namespace math +} // namespace operators +} // namespace paddle diff --git a/paddle/operators/math/matrix_bit_code.h b/paddle/operators/math/matrix_bit_code.h new file mode 100644 index 00000000000..a0dd89ebe01 --- /dev/null +++ b/paddle/operators/math/matrix_bit_code.h @@ -0,0 +1,64 @@ +/* Copyright (c) 2017 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/framework/eigen.h" +#include "paddle/framework/tensor.h" + +namespace paddle { +namespace operators { +namespace math { + +/** + * return the 1-based index of the highest bit set + * + * for x > 0: + * \f[ + * findLastSet(x) = 1 + \floor*{\log_{2}x} + * \f] + */ +inline constexpr size_t FindLastSet(size_t x) { + return std::is_same::value + ? (x ? 8 * sizeof(x) - __builtin_clz(x) : 0) + : (std::is_same::value // NOLINT + ? (x ? 8 * sizeof(x) - __builtin_clzl(x) : 0) + : (x ? 8 * sizeof(x) - __builtin_clzll(x) : 0)); +} + +struct SimpleCode { + SimpleCode(size_t code, size_t num_classes) : c_(code + num_classes) {} + inline size_t calc_index(int bit) const { return (c_ >> (bit + 1)) - 1; } + inline bool calc_bit(int bit) const { return c_ & (1 << bit); } + inline int get_length() const { return FindLastSet(c_) - 1; } + + private: + size_t c_; +}; + +struct SimpleCodeTable { + explicit SimpleCodeTable(size_t num_classes) : num_classes_(num_classes) {} + SimpleCode operator()(size_t code) const { + return SimpleCode(code, num_classes_); + } + size_t size() const { return num_classes_; } + int get_max_code_length() const { return FindLastSet(num_classes_ - 1); } + + private: + size_t num_classes_; + int max_code_length_; +}; + +} // namespace math +} // namespace operators +} // namespace paddle -- GitLab From a25c3aeba6d1a370e4b361f26f0e112fd00e7c4e Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 17 Nov 2017 10:31:44 +0800 Subject: [PATCH 0002/1416] add forward --- paddle/operators/hierarchical_sigmoid_op.cc | 13 ++++++------- paddle/operators/hierarchical_sigmoid_op.h | 16 +++++++++++++++- paddle/operators/math/matrix_bit_code.cc | 6 +++--- paddle/operators/math/matrix_bit_code.h | 4 ++++ 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/paddle/operators/hierarchical_sigmoid_op.cc b/paddle/operators/hierarchical_sigmoid_op.cc index 1f77ff1268a..9b7af92662e 100644 --- a/paddle/operators/hierarchical_sigmoid_op.cc +++ b/paddle/operators/hierarchical_sigmoid_op.cc @@ -83,19 +83,18 @@ class HierarchicalSigmoidOpMaker : public framework::OpProtoAndCheckerMaker { : OpProtoAndCheckerMaker(proto, op_checker) { AddInput("X", "(TensorArray, required) The input array. Each Tensor has the " - "same shape with [N * D]." - .AsDuplicable(); + "same shape with [N * D].") + .AsDuplicable(); AddInput("Label", "(Tensor, required), The labels of training data. It's a" "1-D tensor."); AddInput("Bias", "(Tensor, optional), The bias is a 1-D tensor, " "which is applied to the output"); - AddOutput("Out", - "(Tensor, required) The output of hierarchical sigmoid operator."); - AddAttr("num_classes", - "(int, required)", - "The number of classes"); + AddOutput( + "Out", + "(Tensor, required) The output of hierarchical sigmoid operator."); + AddAttr("num_classes", "(int, required)", "The number of classes"); AddComment(R"DOC( The hierarchical sigmoid operator organize the classes into a binary tree. At each node, a sigmoid function is used to caculate the probability of diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h index 8a753605d6e..11a553a4039 100644 --- a/paddle/operators/hierarchical_sigmoid_op.h +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -22,7 +22,21 @@ template class HierarchicalSigmoidOpKernel : public framework::OpKernel { public: - void Compute(const framework::ExecutionContext& ctx) const override {} + void Compute(const framework::ExecutionContext& ctx) const override { + auto ins = ctx.MultiInput("X"); + auto* label = ctx.Input("Label"); + auto* bias = ctx.Input("Bias"); + size_t num_classes = static_cast(ctx.Attr("num_classes")); + int64_t batch_size = ins[0]->dims()[0]; + int64_t size = ins.size(); + framework::Tensor pre_out; + std::vector pre_out_dims({batch_size, size}); + pre_out.mutable_data(framework::make_ddim(pre_out_dims), ctx.GetPlace()); + + if (bias != NULL) { + math::AddByBitCode(num_classes, *label, pre_out, *bias); + } + } }; template diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc index 3f1dbbf3994..30c2ffc2cfd 100644 --- a/paddle/operators/math/matrix_bit_code.cc +++ b/paddle/operators/math/matrix_bit_code.cc @@ -50,7 +50,7 @@ namespace math { for j < codeLength: op(a(i, j), b(0, index(i, j))) */ -template +template static void AddByBitCodeT(Op op, CodeTable code_table, const framework::Tensor& codes, framework::Tensor& a, framework::Tensor& b) { @@ -72,11 +72,11 @@ static void AddByBitCodeT(Op op, CodeTable code_table, /* For j < codeLength: a(i, j) += b(0, index(i, j)) */ -template +template void AddByBitCode(size_t num_classes, const framework::Tensor& codes, framework::Tensor& a, const framework::Tensor& b) { auto op = [](T& t, T& v) { t += v; }; - AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, a, b); + AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, a, b); } } // namespace math diff --git a/paddle/operators/math/matrix_bit_code.h b/paddle/operators/math/matrix_bit_code.h index a0dd89ebe01..bb0599aa177 100644 --- a/paddle/operators/math/matrix_bit_code.h +++ b/paddle/operators/math/matrix_bit_code.h @@ -59,6 +59,10 @@ struct SimpleCodeTable { int max_code_length_; }; +template +void AddByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& a, const framework::Tensor& b); + } // namespace math } // namespace operators } // namespace paddle -- GitLab From 1abd3b3a29b6964323d679d47dea31830f5b5e6a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 27 Nov 2017 19:28:57 +0800 Subject: [PATCH 0003/1416] implement forward --- paddle/operators/CMakeLists.txt | 4 +- paddle/operators/hierarchical_sigmoid_op.cc | 6 +- paddle/operators/hierarchical_sigmoid_op.h | 39 ++++++++++- paddle/operators/math/math_function.cc | 2 + paddle/operators/math/math_function.cu | 2 + paddle/operators/math/math_function.h | 6 ++ paddle/operators/math/math_function_impl.h | 14 ++++ paddle/operators/math/matrix_bit_code.cc | 77 +++++++++++++++++++-- paddle/operators/math/matrix_bit_code.h | 19 ++++- 9 files changed, 157 insertions(+), 12 deletions(-) diff --git a/paddle/operators/CMakeLists.txt b/paddle/operators/CMakeLists.txt index a719da25602..93ec763424d 100644 --- a/paddle/operators/CMakeLists.txt +++ b/paddle/operators/CMakeLists.txt @@ -185,7 +185,8 @@ set(DEPS_OPS tensor_array_read_write_op gru_op adagrad_op - sgd_op) + sgd_op + hierarchical_sigmoid_op) op_library(cond_op SRCS cond_op.cc DEPS framework_proto tensor operator net_op) @@ -203,6 +204,7 @@ op_library(lod_rank_table_op SRCS lod_rank_table_op.cc DEPS lod_rank_table) op_library(lod_tensor_to_array_op SRCS lod_tensor_to_array_op.cc DEPS lod_rank_table_op) op_library(array_to_lod_tensor_op SRCS array_to_lod_tensor_op.cc DEPS lod_rank_table_op) op_library(tensor_array_read_write_op SRCS tensor_array_read_write_op.cc) +op_library(hierarchical_sigmoid_op DEPS matrix_bit_code) if(WITH_GPU) op_library(nccl_op DEPS nccl_common) endif() diff --git a/paddle/operators/hierarchical_sigmoid_op.cc b/paddle/operators/hierarchical_sigmoid_op.cc index 9b7af92662e..f81f3d34d19 100644 --- a/paddle/operators/hierarchical_sigmoid_op.cc +++ b/paddle/operators/hierarchical_sigmoid_op.cc @@ -85,12 +85,16 @@ class HierarchicalSigmoidOpMaker : public framework::OpProtoAndCheckerMaker { "(TensorArray, required) The input array. Each Tensor has the " "same shape with [N * D].") .AsDuplicable(); + AddInput("Parameters", + "(Tensor, required), The parameters of hierarchical " + "sigmoid operator, each of them is s a 2-D tensor.") + .AsDuplicable(); AddInput("Label", "(Tensor, required), The labels of training data. It's a" "1-D tensor."); AddInput("Bias", "(Tensor, optional), The bias is a 1-D tensor, " - "which is applied to the output"); + "which is applied to the output."); AddOutput( "Out", "(Tensor, required) The output of hierarchical sigmoid operator."); diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h index 11a553a4039..baf655f2141 100644 --- a/paddle/operators/hierarchical_sigmoid_op.h +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -14,28 +14,61 @@ limitations under the License. */ #pragma once #include "paddle/framework/op_registry.h" +#include "paddle/operators/math/math_function.h" #include "paddle/operators/math/matrix_bit_code.h" namespace paddle { namespace operators { -template +template +using EigenMatrix = framework::EigenMatrix; + +template class HierarchicalSigmoidOpKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { auto ins = ctx.MultiInput("X"); + auto params = ctx.MultiInput("Parameters"); auto* label = ctx.Input("Label"); auto* bias = ctx.Input("Bias"); + auto* out = ctx.Output("Out"); size_t num_classes = static_cast(ctx.Attr("num_classes")); + + framework::Tensor sum; + framework::Tensor pre_out; + auto place = ctx.GetEigenDevice(); + auto& device_ctx = ctx.device_context(); + math::ColwiseSum col_sum; + math::RowwiseSum row_sum; + + auto pre_out_mat = EigenMatrix::From(pre_out); int64_t batch_size = ins[0]->dims()[0]; int64_t size = ins.size(); - framework::Tensor pre_out; + std::vector pre_out_dims({batch_size, size}); pre_out.mutable_data(framework::make_ddim(pre_out_dims), ctx.GetPlace()); + std::vector sum_dims({batch_size, 1UL}); + sum.mutable_data(framework::make_ddim(sum_dims), ctx.GetPlace()); + out->mutable_data(ctx.GetPlace()); - if (bias != NULL) { + if (bias) { math::AddByBitCode(num_classes, *label, pre_out, *bias); } + + for (size_t i = 0; i < ins.size(); ++i) { + math::MulByBitCode(num_classes, *label, pre_out, *params[i], *ins[i]); + } + // clip the matrix with (-40, 40) + pre_out_mat.device(place) = + pre_out_mat.abs().cwiseMax(static_cast(40.0)); + math::SumByBitCode(num_classes, *label, *out, pre_out, + static_cast(-1)); + // softrelu + pre_out_mat.device(place) = (static_cast(1) + pre_out_mat.exp()).log(); + + row_sum(device_ctx, pre_out, &sum); + col_sum(device_ctx, *out, &sum); } }; diff --git a/paddle/operators/math/math_function.cc b/paddle/operators/math/math_function.cc index 2e333a8cde7..3bc0945fe3a 100644 --- a/paddle/operators/math/math_function.cc +++ b/paddle/operators/math/math_function.cc @@ -314,6 +314,8 @@ template struct RowwiseAdd; template struct RowwiseAdd; template struct ColwiseSum; template struct ColwiseSum; +template struct RowwiseSum; +template struct RowwiseSum; } // namespace math } // namespace operators diff --git a/paddle/operators/math/math_function.cu b/paddle/operators/math/math_function.cu index 58356a4b778..1a226821f71 100644 --- a/paddle/operators/math/math_function.cu +++ b/paddle/operators/math/math_function.cu @@ -298,6 +298,8 @@ template struct RowwiseAdd; template struct RowwiseAdd; template struct ColwiseSum; template struct ColwiseSum; +template struct RowwiseSum; +template struct RowwiseSum; } // namespace math } // namespace operators diff --git a/paddle/operators/math/math_function.h b/paddle/operators/math/math_function.h index ffb99f53808..c21a20fc326 100644 --- a/paddle/operators/math/math_function.h +++ b/paddle/operators/math/math_function.h @@ -130,6 +130,12 @@ struct ColwiseSum { const framework::Tensor& input, framework::Tensor* vec); }; +template +struct RowwiseSum { + void operator()(const platform::DeviceContext& context, + const framework::Tensor& input, framework::Tensor* vec); +}; + } // namespace math } // namespace operators } // namespace paddle diff --git a/paddle/operators/math/math_function_impl.h b/paddle/operators/math/math_function_impl.h index 4dc17a4e525..8c1971fc611 100644 --- a/paddle/operators/math/math_function_impl.h +++ b/paddle/operators/math/math_function_impl.h @@ -78,6 +78,20 @@ void ColwiseSum::operator()(const platform::DeviceContext& context, in.sum(Eigen::array({{0}})).reshape(shape); } +template +void RowwiseSum::operator()(const platform::DeviceContext& context, + const framework::Tensor& input, + framework::Tensor* vector) { + auto in_dims = input.dims(); + auto size = input.numel() / in_dims[1]; + PADDLE_ENFORCE_EQ(vector->numel(), size); + + auto in = framework::EigenMatrix::From(input); + auto vec = framework::EigenMatrix::From(*vector); + Eigen::array shape({{static_cast(size), 1}}); + vec.reshape(shape).device(*context.GetEigenDevice()) = + in.sum(Eigen::array({{0}})).reshape(shape); +} } // namespace math } // namespace operators } // namespace paddle diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc index 30c2ffc2cfd..8f68e2f79dd 100644 --- a/paddle/operators/math/matrix_bit_code.cc +++ b/paddle/operators/math/matrix_bit_code.cc @@ -53,18 +53,18 @@ namespace math { template static void AddByBitCodeT(Op op, CodeTable code_table, const framework::Tensor& codes, framework::Tensor& a, - framework::Tensor& b) { + const framework::Tensor& b) { size_t num_classes = code_table.size(); size_t max_code_length = code_table.get_max_code_length(); - size_t num_sample = a.dims()[0].size(); - size_t width = a.dims()[1].size(); + size_t num_sample = a.dims()[0]; + size_t width = a.dims()[1]; for (size_t i = 0; i < num_sample; ++i) { - auto code = code_table(codes.data()[i]) int code_length = - code.get_length(); + auto code = code_table(codes.data()[i]); + int code_length = code.get_length(); for (int j = 0; j < code_length; + j) { size_t index = code.calc_index(j); - op(a.data()[i * width + j], b.data()[index]); + op(a.data()[i * width + j], b.data()[index]); } } } @@ -79,6 +79,71 @@ void AddByBitCode(size_t num_classes, const framework::Tensor& codes, AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, a, b); } +template +void SumByBitCodeT(CodeTable code_table, const framework::Tensor& codes, + framework::Tensor& tmat, framework::Tensor& sum, + const T& scale_sum) { + size_t max_code_length = code_table.get_max_code_length(); + size_t num_samples = tmat.dims()[0]; + size_t o_width = tmat.dims()[1]; + for (size_t i = 0; i < num_samples; ++i) { + T sm = 0; + auto code = code_table(codes.data()[i]); + int code_length = code.get_length(); + for (int j = 0; j < code_length; ++j) { + if (code.calc_bit(j)) { + sm += tmat.data()[i * o_width + j]; + } + } + sum.data()[i] = scale_sum * sm; + } +} +/* For j < codeLength: + sum(i, 0) = \sum_j bit(i, j) * input(i, j) +*/ +template +void SumByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& tmat, framework::Tensor& sum, + T scale_sum) { + SumByBitCodeT(SimpleCodeTable(num_classes), codes, tmat, scale_sum); +} + +template +void MulByBitCodeT(Op op, CodeTable code_table, const framework::Tensor& codes, + framework::Tensor& tmat, framework::Tensor& weight, + framework::Tensor& input) { + size_t num_classes = code_table.size(); + size_t max_code_length = code_table.get_max_code_length(); + size_t num_samples = tmat.dims()[0]; + size_t input_dim = input.dims()[1]; + size_t o_width = tmat.dims()[1]; + + for (size_t i = 0; i < num_samples; ++i) { + auto code = code_table(codes.data()[i]); + int code_length = code.get_length(); + for (int j = 0; j < code_length; ++j) { + size_t index = code.calc_index(j); + op(tmat.data()[i * o_width + j], + weight.data() + index * weight.dims()[1], + input.data() + i * input.dims()[1], input_dim); + } + } +} + +template +void MulByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& tmat, const framework::Tensor& weight, + const framework::Tensor& input) { + auto op = [](T& t, const T* weight_row, const T* input_row, + size_t input_dim) { + T sum = 0; + for (size_t k = 0; k < input_dim; ++k) { + sum += weight_row[k] * input_row[k]; + } + t += sum; + }; + MulByBitCode(op, SimpleCodeTable(num_classes), codes, tmat, weight, input); +} } // namespace math } // namespace operators } // namespace paddle diff --git a/paddle/operators/math/matrix_bit_code.h b/paddle/operators/math/matrix_bit_code.h index bb0599aa177..7bef5077b9b 100644 --- a/paddle/operators/math/matrix_bit_code.h +++ b/paddle/operators/math/matrix_bit_code.h @@ -59,10 +59,27 @@ struct SimpleCodeTable { int max_code_length_; }; +/* For j < codeLength + tmat(i, j) += vec(0, index(i, j)) +*/ template void AddByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& a, const framework::Tensor& b); + framework::Tensor& tmat, const framework::Tensor& vec); +/* For j < codeLength + sum(i, 0) = \sum_j bit(i, j) * tmat(i, j) +*/ +template +void SumByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& tmat, framework::Tensor& sum, T scale_sum); + +/* For j < codeLength + input.row(i) += tmat(i, j) * weight.row(index(i, j)) +*/ +template +void MulByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& tmat, const framework::Tensor& weight, + const framework::Tensor& input); } // namespace math } // namespace operators } // namespace paddle -- GitLab From 1f9426fd47d4cc3911e9f0a2f23274d69dd104e8 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 29 Nov 2017 20:17:22 +0800 Subject: [PATCH 0004/1416] add backward --- paddle/operators/hierarchical_sigmoid_op.h | 52 ++++++++++++++-- paddle/operators/math/matrix_bit_code.cc | 71 +++++++++++++++++++--- paddle/operators/math/matrix_bit_code.h | 36 ++++++++++- 3 files changed, 144 insertions(+), 15 deletions(-) diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h index baf655f2141..186c7679323 100644 --- a/paddle/operators/hierarchical_sigmoid_op.h +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -44,9 +44,9 @@ class HierarchicalSigmoidOpKernel : public framework::OpKernel { auto pre_out_mat = EigenMatrix::From(pre_out); int64_t batch_size = ins[0]->dims()[0]; - int64_t size = ins.size(); + int64_t code_length = math::FindLastSet(num_classes - 1); - std::vector pre_out_dims({batch_size, size}); + std::vector pre_out_dims({batch_size, code_length}); pre_out.mutable_data(framework::make_ddim(pre_out_dims), ctx.GetPlace()); std::vector sum_dims({batch_size, 1UL}); sum.mutable_data(framework::make_ddim(sum_dims), ctx.GetPlace()); @@ -64,8 +64,11 @@ class HierarchicalSigmoidOpKernel : public framework::OpKernel { pre_out_mat.abs().cwiseMax(static_cast(40.0)); math::SumByBitCode(num_classes, *label, *out, pre_out, static_cast(-1)); - // softrelu - pre_out_mat.device(place) = (static_cast(1) + pre_out_mat.exp()).log(); + + // softrelu with threshold is 40.0 + pre_out_mat.device(place) = + pre_out_mat.abs().cwiseMax(static_cast(40.0)); + pre_out_mat.device(place) = (static_cast(1.0) + pre_out_mat.exp()).log(); row_sum(device_ctx, pre_out, &sum); col_sum(device_ctx, *out, &sum); @@ -75,7 +78,46 @@ class HierarchicalSigmoidOpKernel : public framework::OpKernel { template class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { public: - void Compute(const framework::ExecutionContext& ctx) const override {} + void Compute(const framework::ExecutionContext& ctx) const override { + auto ins = ctx.MultiInput("X"); + auto ins_grad = + ctx.MultiOutput(framework::GradVarName("X")); + auto params = ctx.MultiOutput( + framework::GradVarName("Parameters")); + auto* bias = ctx.Output(framework::GradVarName("Bias")); + auto* label = + ctx.Output(framework::GradVarName("Label")); + size_t num_classes = static_cast(ctx.Attr("num_classes")); + + framework::Tensor pre_out; + auto place = ctx.GetEigenDevice(); + auto& dev_ctx = ctx.device_context(); + int64_t batch_size = ins_grad.size(); + int64_t code_length = math::FindLastSet(num_classes - 1); + auto pre_out_mat = EigenMatrix::From(pre_out); + + // init pre_out matrix with {1.0} + std::vector pre_out_dims({batch_size, code_length}); + pre_out.mutable_data(framework::make_ddim(pre_out_dims), ctx.GetPlace()); + math::SetConstant set; + set(dev_ctx, &pre_out, static_cast(1.0)); + // softrelu derivative + pre_out_mat.device(place) = + pre_out_mat * (static_cast(1.0) - static_cast(1.0) / pre_out_mat); + + math::SubByBitCode(num_classes, *label, pre_out); + + if (bias) { + math::AddByBitCodeGrad(num_classes, *label, pre_out, *bias); + } + + for (size_t i = 0; i < ins_grad.size(); ++i) { + math::MulByBitCodeGradWeight(num_classes, *label, pre_out, *params[i], + *ins[i]); + math::MulByBitCodeGradError(num_classes, *label, pre_out, *params[i], + *ins_grad[i]); + } + } }; } // namespace operators diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc index 8f68e2f79dd..996e0b819f6 100644 --- a/paddle/operators/math/matrix_bit_code.cc +++ b/paddle/operators/math/matrix_bit_code.cc @@ -69,19 +69,23 @@ static void AddByBitCodeT(Op op, CodeTable code_table, } } -/* For j < codeLength: - a(i, j) += b(0, index(i, j)) -*/ template void AddByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& a, const framework::Tensor& b) { + framework::Tensor& tmat, const framework::Tensor& vec) { auto op = [](T& t, T& v) { t += v; }; - AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, a, b); + AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, vec); +} + +template +void AddByBitCodeGrad(size_t num_classes, const framework::Tensor& codes, + const framework::Tensor& tmat, framework::Tensor& vec) { + auto op = [](T& t, T& v) { v += t; }; + AddByBitCode(op, SimpleCodeTable(num_classes), codes, tmat, vec); } template void SumByBitCodeT(CodeTable code_table, const framework::Tensor& codes, - framework::Tensor& tmat, framework::Tensor& sum, + framework::Tensor& tmat, const framework::Tensor& sum, const T& scale_sum) { size_t max_code_length = code_table.get_max_code_length(); size_t num_samples = tmat.dims()[0]; @@ -142,8 +146,61 @@ void MulByBitCode(size_t num_classes, const framework::Tensor& codes, } t += sum; }; - MulByBitCode(op, SimpleCodeTable(num_classes), codes, tmat, weight, input); + MulByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, weight, + input); +} + +template +void MulByBitCodeGradWeight(size_t num_classes, const framework::Tensor& codes, + const framework::Tensor& tmat, + framework::Tensor& weight, + const framework::Tensor& input) { + auto op = [](const T t, T* weight_row, const T* input_row, size_t input_dim) { + for (size_t k = 0; k < input_dim; ++k) { + weight_row[k] += t * input_row[k]; + } + }; + MulByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, weight, + input); } + +template +void MulByBitCodeGradError(size_t num_classes, const framework::Tensor& codes, + const framework::Tensor& tmat, + const framework::Tensor& weight, + framework::Tensor& input) { + auto op = [](const T t, const T* weight_row, T* input_row, size_t input_dim) { + for (size_t k = 0; k < input_dim; ++k) { + input_row[k] += t * weight_row[k]; + } + }; + MulByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, weight, + input); +} + +template +void SubByBitCodeT(CodeTable code_table, const framework::Tensor& codes, + framework::Tensor& tmat) { + size_t max_code_length = code_table.get_max_code_length(); + size_t num_samples = tmat.dims()[0]; + size_t o_width = tmat.dims()[1]; + for (size_t i = 0; i < num_samples; ++i) { + auto code = code_table(codes.data()[i]); + int code_length = code.get_length(); + for (int j = 0; j < code_length; ++j) { + if (code.calc_bit(j)) { + tmat.data()[i * o_width + j] -= 1; + } + } + } +} + +template +void SubByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& tmat) { + SubByBitCodeT(SimpleCodeTable(num_classes), codes, tmat); +} + } // namespace math } // namespace operators } // namespace paddle diff --git a/paddle/operators/math/matrix_bit_code.h b/paddle/operators/math/matrix_bit_code.h index 7bef5077b9b..43c9d43d89d 100644 --- a/paddle/operators/math/matrix_bit_code.h +++ b/paddle/operators/math/matrix_bit_code.h @@ -59,27 +59,57 @@ struct SimpleCodeTable { int max_code_length_; }; -/* For j < codeLength +/* For j < code_length tmat(i, j) += vec(0, index(i, j)) */ template void AddByBitCode(size_t num_classes, const framework::Tensor& codes, framework::Tensor& tmat, const framework::Tensor& vec); -/* For j < codeLength +/* For j < code_length + vec(0, index(i, j)) += tmat(i, j) +*/ +template +void AddByBitCodeGrad(size_t num_classes, const framework::Tensor& codes, + const framework::Tensor& tmat, framework::Tensor& vec); +/* For j < code_length sum(i, 0) = \sum_j bit(i, j) * tmat(i, j) */ template void SumByBitCode(size_t num_classes, const framework::Tensor& codes, framework::Tensor& tmat, framework::Tensor& sum, T scale_sum); -/* For j < codeLength +/* For j < code_length input.row(i) += tmat(i, j) * weight.row(index(i, j)) */ template void MulByBitCode(size_t num_classes, const framework::Tensor& codes, framework::Tensor& tmat, const framework::Tensor& weight, const framework::Tensor& input); + +/* For index(i, j) >= 0: + weight.row(index(i, j)) += tmat(i, j) * input.row(i) +*/ +template +void MulByBitCodeGradWeight(size_t num_classes, const framework::Tensor& codes, + const framework::Tensor& tmat, + framework::Tensor& weight, + const framework::Tensor& input); +/* For j < code_length + input.row(i) += tmat(i, j) * weight.row(index(i, j)) +*/ +template +void MulByBitCodeGradError(size_t num_classes, const framework::Tensor& codes, + const framework::Tensor& tmat, + const framework::Tensor& weight, + framework::Tensor& input); + +/* For j < code_length + tmat(i, j) -= bit(i, j) +*/ +template +void SubByBitCode(size_t num_classes, const framework::Tensor& codes, + framework::Tensor& tmat); } // namespace math } // namespace operators } // namespace paddle -- GitLab From f8395631e12e19d433ce4d5b6ddcefc0b04db6e1 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 14 Dec 2017 13:12:00 +0800 Subject: [PATCH 0005/1416] fix invalid dims --- paddle/operators/hierarchical_sigmoid_op.cc | 28 +++++++-------- paddle/operators/hierarchical_sigmoid_op.h | 26 +++++++------- paddle/operators/math/matrix_bit_code.cc | 11 +++--- .../paddle/v2/fluid/tests/test_hsigmoid_op.py | 34 +++++++++++++++++++ 4 files changed, 67 insertions(+), 32 deletions(-) create mode 100644 python/paddle/v2/fluid/tests/test_hsigmoid_op.py diff --git a/paddle/operators/hierarchical_sigmoid_op.cc b/paddle/operators/hierarchical_sigmoid_op.cc index f81f3d34d19..063f8576e66 100644 --- a/paddle/operators/hierarchical_sigmoid_op.cc +++ b/paddle/operators/hierarchical_sigmoid_op.cc @@ -60,12 +60,11 @@ class HierarchicalSigmoidOp : public framework::OperatorWithKernel { public: using framework::OperatorWithKernel::OperatorWithKernel; void InferShape(framework::InferShapeContext* ctx) const override { - PADDLE_ENFORCE(ctx->HasInputs("X"), "Inputs(X) should not be null."); + PADDLE_ENFORCE(ctx->hasInput("X"), "Input(X) should not be null."); PADDLE_ENFORCE(ctx->HasInput("Label"), "Input(Label) should not be null."); PADDLE_ENFORCE(ctx->HasOutput("Out"), "Output(Out) should not be null."); - const int64_t batch_size = ctx->GetInputsDim("X")[0][0]; - const int64_t size = ctx->GetInputsDim("X").size(); - std::vector output_shape({batch_size, size}); + const int64_t batch_size = ctx->GetInputDim("X")[0]; + std::vector output_shape({batch_size, num_classes_ - 1}); ctx->SetOutputDim("Out", framework::make_ddim(output_shape)); } }; @@ -82,22 +81,23 @@ class HierarchicalSigmoidOpMaker : public framework::OpProtoAndCheckerMaker { framework::OpAttrChecker* op_checker) : OpProtoAndCheckerMaker(proto, op_checker) { AddInput("X", - "(TensorArray, required) The input array. Each Tensor has the " - "same shape with [N * D].") - .AsDuplicable(); + "(Tensor, required) The input Tensor, which the shape is" + "[N * D], which N is the size of mini-batch," + "D is the embded size"); AddInput("Parameters", "(Tensor, required), The parameters of hierarchical " - "sigmoid operator, each of them is s a 2-D tensor.") - .AsDuplicable(); + "sigmoid operator, each of them is s a 3-D tensor, the shape is" + "[N, num_classes - 1, D]"); AddInput("Label", "(Tensor, required), The labels of training data. It's a" - "1-D tensor."); + "1-D tensor, which the shape is [1, N]"); AddInput("Bias", "(Tensor, optional), The bias is a 1-D tensor, " - "which is applied to the output."); - AddOutput( - "Out", - "(Tensor, required) The output of hierarchical sigmoid operator."); + "which is applied to the output, the shape is" + "[1, num_classes -1]"); + AddOutput("Out", + "(Tensor, required) The output of hierarchical sigmoid operator." + "the shape is [N, 1]"); AddAttr("num_classes", "(int, required)", "The number of classes"); AddComment(R"DOC( The hierarchical sigmoid operator organize the classes into a binary tree. diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h index 186c7679323..e3f0bcacd8b 100644 --- a/paddle/operators/hierarchical_sigmoid_op.h +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -28,8 +28,8 @@ template class HierarchicalSigmoidOpKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - auto ins = ctx.MultiInput("X"); - auto params = ctx.MultiInput("Parameters"); + auto* in = ctx.Input("X"); + auto* param = ctx.Input("Parameter"); auto* label = ctx.Input("Label"); auto* bias = ctx.Input("Bias"); auto* out = ctx.Output("Out"); @@ -56,8 +56,9 @@ class HierarchicalSigmoidOpKernel : public framework::OpKernel { math::AddByBitCode(num_classes, *label, pre_out, *bias); } - for (size_t i = 0; i < ins.size(); ++i) { - math::MulByBitCode(num_classes, *label, pre_out, *params[i], *ins[i]); + for (size_t i = 0; i < in.dims()[0]; ++i) { + math::MulByBitCode(num_classes, *label, pre_out, + *params->Slice(i, i + 1), *in->Slice(i, i + 1)); } // clip the matrix with (-40, 40) pre_out_mat.device(place) = @@ -79,11 +80,10 @@ template class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - auto ins = ctx.MultiInput("X"); - auto ins_grad = - ctx.MultiOutput(framework::GradVarName("X")); - auto params = ctx.MultiOutput( - framework::GradVarName("Parameters")); + auto* in = ctx.Input("X"); + auto* in_grad = ctx.Output(framework::GradVarName("X")); + auto* params = + ctx.Output(framework::GradVarName("Parameters")); auto* bias = ctx.Output(framework::GradVarName("Bias")); auto* label = ctx.Output(framework::GradVarName("Label")); @@ -92,7 +92,7 @@ class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { framework::Tensor pre_out; auto place = ctx.GetEigenDevice(); auto& dev_ctx = ctx.device_context(); - int64_t batch_size = ins_grad.size(); + int64_t batch_size = in_grad.dims()[0]; int64_t code_length = math::FindLastSet(num_classes - 1); auto pre_out_mat = EigenMatrix::From(pre_out); @@ -111,11 +111,11 @@ class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { math::AddByBitCodeGrad(num_classes, *label, pre_out, *bias); } - for (size_t i = 0; i < ins_grad.size(); ++i) { + for (size_t i = 0; i < in_grad.dims()[0]; ++i) { math::MulByBitCodeGradWeight(num_classes, *label, pre_out, *params[i], - *ins[i]); + *in[i]->Slice(i, i + 1)); math::MulByBitCodeGradError(num_classes, *label, pre_out, *params[i], - *ins_grad[i]); + *ins_grad[i]->Slice(i, i + 1)); } } }; diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc index 996e0b819f6..df988510547 100644 --- a/paddle/operators/math/matrix_bit_code.cc +++ b/paddle/operators/math/matrix_bit_code.cc @@ -52,19 +52,20 @@ namespace math { */ template static void AddByBitCodeT(Op op, CodeTable code_table, - const framework::Tensor& codes, framework::Tensor& a, - const framework::Tensor& b) { + const framework::Tensor& codes, + framework::Tensor& tmat, + const framework::Tensor& vec) { size_t num_classes = code_table.size(); size_t max_code_length = code_table.get_max_code_length(); - size_t num_sample = a.dims()[0]; - size_t width = a.dims()[1]; + size_t num_sample = tmat.dims()[0]; + size_t width = vec.dims()[1]; for (size_t i = 0; i < num_sample; ++i) { auto code = code_table(codes.data()[i]); int code_length = code.get_length(); for (int j = 0; j < code_length; + j) { size_t index = code.calc_index(j); - op(a.data()[i * width + j], b.data()[index]); + op(tmat.data()[i * width + j], vec.data()[index]); } } } diff --git a/python/paddle/v2/fluid/tests/test_hsigmoid_op.py b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py new file mode 100644 index 00000000000..25c13aabe97 --- /dev/null +++ b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py @@ -0,0 +1,34 @@ +import unittest +import numpy as np +from op_test import OpTest + + +class TestHSigmoidOp(OpTest): + def setUp(self): + self.op_type = "hierarchical_sigmoid_op" + num_classes = 6 + embded_size = 10 + batch_size = 5 + x = np.random.random((batch_size, embded_size)).astype("float32") + parameter = np.random.random( + (batch_size, num_classes - 1, embded_size)).astype("float32") + label = np.random.randint(0, num_classes, batch_size).astype("int64") + bias = np.random.random((1, num_classes - 1)) + self.inputs = { + 'X': x, + 'Parameters': parameter, + 'Label': label, + 'Bias': bias + } + self.attrs = {'num_classes': num_classes} + self.outputs = {'Out': label} + + def test_check_output(self): + self.check_output() + + def test_check_grad(self): + self.check_grad(['x0'], 'Out') + + +if __name__ == '__main__': + unittest.main() -- GitLab From fb9c08f0438fe0a25d0d2517e5e770ea5a22555d Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 25 Dec 2017 08:51:04 +0800 Subject: [PATCH 0006/1416] make forward work --- paddle/operators/CMakeLists.txt | 2 +- paddle/operators/hierarchical_sigmoid_op.cc | 50 ++++- paddle/operators/hierarchical_sigmoid_op.h | 95 ++++---- paddle/operators/math/CMakeLists.txt | 2 +- paddle/operators/math/math_function.cc | 12 +- paddle/operators/math/math_function.h | 6 +- paddle/operators/math/math_function_impl.h | 16 +- paddle/operators/math/matrix_bit_code.cc | 211 ++++++++++-------- paddle/operators/math/matrix_bit_code.h | 86 ++++--- paddle/pybind/pybind.cc | 2 + python/paddle/v2/fluid/tests/op_test.py | 11 +- .../paddle/v2/fluid/tests/test_hsigmoid_op.py | 15 +- 12 files changed, 285 insertions(+), 223 deletions(-) diff --git a/paddle/operators/CMakeLists.txt b/paddle/operators/CMakeLists.txt index d79f19e670d..5fb14cc6d4a 100644 --- a/paddle/operators/CMakeLists.txt +++ b/paddle/operators/CMakeLists.txt @@ -207,7 +207,7 @@ set(DEPS_OPS gru_op adagrad_op sgd_op - hierarchical_sigmoid_op) + hierarchical_sigmoid_op save_op load_op send_op diff --git a/paddle/operators/hierarchical_sigmoid_op.cc b/paddle/operators/hierarchical_sigmoid_op.cc index 063f8576e66..fa816d9215d 100644 --- a/paddle/operators/hierarchical_sigmoid_op.cc +++ b/paddle/operators/hierarchical_sigmoid_op.cc @@ -60,19 +60,48 @@ class HierarchicalSigmoidOp : public framework::OperatorWithKernel { public: using framework::OperatorWithKernel::OperatorWithKernel; void InferShape(framework::InferShapeContext* ctx) const override { - PADDLE_ENFORCE(ctx->hasInput("X"), "Input(X) should not be null."); + PADDLE_ENFORCE(ctx->HasInput("X"), "Input(X) should not be null."); PADDLE_ENFORCE(ctx->HasInput("Label"), "Input(Label) should not be null."); + PADDLE_ENFORCE(ctx->HasInput("Parameters"), + "Input(Parameters)" + "should not be null."); PADDLE_ENFORCE(ctx->HasOutput("Out"), "Output(Out) should not be null."); const int64_t batch_size = ctx->GetInputDim("X")[0]; - std::vector output_shape({batch_size, num_classes_ - 1}); + std::vector output_shape({batch_size, 1}); ctx->SetOutputDim("Out", framework::make_ddim(output_shape)); } + + protected: + framework::OpKernelType GetKernelType( + const framework::ExecutionContext& ctx) const override { + return framework::OpKernelType( + framework::ToDataType(ctx.Input("X")->type()), + ctx.GetPlace()); + } }; class HierarchicalSigmoidGradOp : public framework::OperatorWithKernel { public: using framework::OperatorWithKernel::OperatorWithKernel; - void InferShape(framework::InferShapeContext* ctx) const override {} + void InferShape(framework::InferShapeContext* ctx) const override { + PADDLE_ENFORCE(ctx->HasInput("Parameters"), + "Input(Parameters)" + "should not be null."); + PADDLE_ENFORCE(ctx->HasInput("Label"), + "Input(Label)" + "should not be null."); + PADDLE_ENFORCE(ctx->HasOutput(framework::GradVarName("Parameters")), + "Input(Parameters@Grad should not be null.)"); + PADDLE_ENFORCE(ctx->HasOutput(framework::GradVarName("X"))); + } + + protected: + framework::OpKernelType GetKernelType( + const framework::ExecutionContext& ctx) const override { + return framework::OpKernelType( + framework::ToDataType(ctx.Input("X")->type()), + ctx.GetPlace()); + } }; class HierarchicalSigmoidOpMaker : public framework::OpProtoAndCheckerMaker { @@ -98,7 +127,8 @@ class HierarchicalSigmoidOpMaker : public framework::OpProtoAndCheckerMaker { AddOutput("Out", "(Tensor, required) The output of hierarchical sigmoid operator." "the shape is [N, 1]"); - AddAttr("num_classes", "(int, required)", "The number of classes"); + AddAttr("num_classes", "(int, required)", "The number of classes") + .SetDefault(2); AddComment(R"DOC( The hierarchical sigmoid operator organize the classes into a binary tree. At each node, a sigmoid function is used to caculate the probability of @@ -116,9 +146,9 @@ namespace ops = paddle::operators; REGISTER_OP(hierarchical_sigmoid, ops::HierarchicalSigmoidOp, ops::HierarchicalSigmoidOpMaker, hierarchical_sigmoid_grad, ops::HierarchicalSigmoidGradOp); -REGISTER_OP_CPU_KERNEL( - hierarchical_sigmoid, - ops::HierarchicalSigmoidOpKernel); -REGISTER_OP_CPU_KERNEL( - hierarchical_sigmoid_grad, - ops::HierarchicalSigmoidGradOpKernel); +REGISTER_OP_CPU_KERNEL(hierarchical_sigmoid, + ops::HierarchicalSigmoidOpKernel< + paddle::platform::CPUDeviceContext, float>); +REGISTER_OP_CPU_KERNEL(hierarchical_sigmoid_grad, + ops::HierarchicalSigmoidGradOpKernel< + paddle::platform::CPUDeviceContext, float>); diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h index e3f0bcacd8b..531fd9f7fc0 100644 --- a/paddle/operators/hierarchical_sigmoid_op.h +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -14,8 +14,10 @@ limitations under the License. */ #pragma once #include "paddle/framework/op_registry.h" +#include "paddle/operators/clip_op.h" #include "paddle/operators/math/math_function.h" #include "paddle/operators/math/matrix_bit_code.h" +#include "paddle/platform/transform.h" namespace paddle { namespace operators { @@ -23,60 +25,64 @@ namespace operators { template using EigenMatrix = framework::EigenMatrix; +using platform::Transform; -template +template class HierarchicalSigmoidOpKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { auto* in = ctx.Input("X"); - auto* param = ctx.Input("Parameter"); + auto* params = ctx.Input("Parameters"); auto* label = ctx.Input("Label"); auto* bias = ctx.Input("Bias"); auto* out = ctx.Output("Out"); size_t num_classes = static_cast(ctx.Attr("num_classes")); - framework::Tensor sum; + int64_t code_length = math::FindLastSet(num_classes - 1); + int64_t batch_size = in->dims()[0]; + auto* ids = label->data(); framework::Tensor pre_out; - auto place = ctx.GetEigenDevice(); - auto& device_ctx = ctx.device_context(); - math::ColwiseSum col_sum; - math::RowwiseSum row_sum; - + framework::Tensor sum; + auto pre_out_data = pre_out.mutable_data( + framework::make_ddim({batch_size, code_length}), ctx.GetPlace()); auto pre_out_mat = EigenMatrix::From(pre_out); - int64_t batch_size = ins[0]->dims()[0]; - int64_t code_length = math::FindLastSet(num_classes - 1); - std::vector pre_out_dims({batch_size, code_length}); - pre_out.mutable_data(framework::make_ddim(pre_out_dims), ctx.GetPlace()); + auto& place = *ctx.template device_context().eigen_device(); + auto& device_ctx = ctx.template device_context(); + math::RowwiseSum row_sum; + math::MatrixBitCodeFunctor bit_code; + std::vector sum_dims({batch_size, 1UL}); sum.mutable_data(framework::make_ddim(sum_dims), ctx.GetPlace()); + auto sum_mat = EigenMatrix::From(sum); out->mutable_data(ctx.GetPlace()); + auto out_mat = framework::EigenVector::Flatten(*out); if (bias) { - math::AddByBitCode(num_classes, *label, pre_out, *bias); + bit_code.Add(num_classes, ids, pre_out, *bias); } - - for (size_t i = 0; i < in.dims()[0]; ++i) { - math::MulByBitCode(num_classes, *label, pre_out, - *params->Slice(i, i + 1), *in->Slice(i, i + 1)); + for (int i = 0; i < in->dims()[0]; ++i) { + bit_code.Mul(num_classes, ids, pre_out, params->Slice(i, i + 1), + in->Slice(i, i + 1)); } // clip the matrix with (-40, 40) - pre_out_mat.device(place) = - pre_out_mat.abs().cwiseMax(static_cast(40.0)); - math::SumByBitCode(num_classes, *label, *out, pre_out, - static_cast(-1)); - + Transform trans; + trans(ctx.template device_context(), pre_out_data, + pre_out_data + pre_out.numel(), pre_out_data, + ClipFunctor(static_cast(-40.0), static_cast(40.0))); + bit_code.Sum(num_classes, ids, pre_out, *out, static_cast(-1)); // softrelu with threshold is 40.0 - pre_out_mat.device(place) = - pre_out_mat.abs().cwiseMax(static_cast(40.0)); + trans(ctx.template device_context(), pre_out_data, + pre_out_data + pre_out.numel(), pre_out_data, + ClipFunctor(static_cast(-40.0), static_cast(40.0))); pre_out_mat.device(place) = (static_cast(1.0) + pre_out_mat.exp()).log(); row_sum(device_ctx, pre_out, &sum); - col_sum(device_ctx, *out, &sum); + out_mat.device(place) = sum_mat + out_mat; } }; -template +template class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { @@ -85,37 +91,40 @@ class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { auto* params = ctx.Output(framework::GradVarName("Parameters")); auto* bias = ctx.Output(framework::GradVarName("Bias")); - auto* label = - ctx.Output(framework::GradVarName("Label")); + auto* label = ctx.Input("Label"); size_t num_classes = static_cast(ctx.Attr("num_classes")); + int64_t code_length = math::FindLastSet(num_classes - 1); + int64_t batch_size = in->dims()[0]; framework::Tensor pre_out; - auto place = ctx.GetEigenDevice(); - auto& dev_ctx = ctx.device_context(); - int64_t batch_size = in_grad.dims()[0]; - int64_t code_length = math::FindLastSet(num_classes - 1); + pre_out.mutable_data(framework::make_ddim({batch_size, code_length}), + ctx.GetPlace()); + auto& place = *ctx.template device_context().eigen_device(); + auto& device_ctx = ctx.template device_context(); auto pre_out_mat = EigenMatrix::From(pre_out); + auto* ids = label->data(); // init pre_out matrix with {1.0} - std::vector pre_out_dims({batch_size, code_length}); - pre_out.mutable_data(framework::make_ddim(pre_out_dims), ctx.GetPlace()); - math::SetConstant set; - set(dev_ctx, &pre_out, static_cast(1.0)); + math::SetConstant one; + math::MatrixBitCodeFunctor bit_code; + one(device_ctx, &pre_out, static_cast(1.0)); // softrelu derivative pre_out_mat.device(place) = pre_out_mat * (static_cast(1.0) - static_cast(1.0) / pre_out_mat); - math::SubByBitCode(num_classes, *label, pre_out); + bit_code.Sub(num_classes, ids, pre_out); if (bias) { - math::AddByBitCodeGrad(num_classes, *label, pre_out, *bias); + bit_code.AddGrad(num_classes, ids, pre_out, *bias); } - for (size_t i = 0; i < in_grad.dims()[0]; ++i) { - math::MulByBitCodeGradWeight(num_classes, *label, pre_out, *params[i], - *in[i]->Slice(i, i + 1)); - math::MulByBitCodeGradError(num_classes, *label, pre_out, *params[i], - *ins_grad[i]->Slice(i, i + 1)); + for (int i = 0; i < in_grad->dims()[0]; ++i) { + auto p_sliced = params->Slice(i, i + 1); + auto in_sliced = in->Slice(i, i + 1); + auto in_grad_sliced = in_grad->Slice(i, i + 1); + bit_code.MulGradWeight(num_classes, ids, pre_out, p_sliced, in_sliced); + bit_code.MulGradError(num_classes, ids, pre_out, p_sliced, + in_grad_sliced); } } }; diff --git a/paddle/operators/math/CMakeLists.txt b/paddle/operators/math/CMakeLists.txt index 6467d8ddb33..82ba24f35b9 100644 --- a/paddle/operators/math/CMakeLists.txt +++ b/paddle/operators/math/CMakeLists.txt @@ -27,7 +27,7 @@ else() cc_library(context_project SRCS context_project.cc DEPS device_context math_function) cc_library(sequence2batch SRCS sequence2batch.cc DEPS device_context) cc_library(lstm_compute SRCS lstm_compute.cc DEPS device_context activation_functions) - cc_library(matrix_bit_code SRCS matrix_bit_code.cc) + cc_library(matrix_bit_code SRCS matrix_bit_code.cc DEPS device_context) cc_library(maxouting SRCS maxouting.cc DEPS device_context) cc_library(unpooling SRCS unpooling.cc DEPS device_context) cc_library(gru_compute SRCS gru_compute.cc DEPS device_context activation_functions math_function) diff --git a/paddle/operators/math/math_function.cc b/paddle/operators/math/math_function.cc index ead0fe19713..474fd0b0a94 100644 --- a/paddle/operators/math/math_function.cc +++ b/paddle/operators/math/math_function.cc @@ -302,12 +302,12 @@ void set_constant(const platform::DeviceContext& context, #endif } -template struct RowwiseAdd; -template struct RowwiseAdd; -template struct ColwiseSum; -template struct ColwiseSum; -template struct RowwiseSum; -template struct RowwiseSum; +template struct RowwiseAdd; +template struct RowwiseAdd; +template struct ColwiseSum; +template struct ColwiseSum; +template struct RowwiseSum; +template struct RowwiseSum; } // namespace math } // namespace operators diff --git a/paddle/operators/math/math_function.h b/paddle/operators/math/math_function.h index 51e0fd9ad77..b49294e6216 100644 --- a/paddle/operators/math/math_function.h +++ b/paddle/operators/math/math_function.h @@ -128,10 +128,10 @@ struct ColwiseSum { framework::Tensor* vec); }; -template +template struct RowwiseSum { - void operator()(const platform::DeviceContext& context, - const framework::Tensor& input, framework::Tensor* vec); + void operator()(const DeviceContext& context, const framework::Tensor& input, + framework::Tensor* vec); }; } // namespace math diff --git a/paddle/operators/math/math_function_impl.h b/paddle/operators/math/math_function_impl.h index 4d5e8481018..2b3b6c335b3 100644 --- a/paddle/operators/math/math_function_impl.h +++ b/paddle/operators/math/math_function_impl.h @@ -79,19 +79,19 @@ void ColwiseSum::operator()(const DeviceContext& context, in.sum(Eigen::array({{0}})).reshape(shape); } -template -void RowwiseSum::operator()(const platform::DeviceContext& context, - const framework::Tensor& input, - framework::Tensor* vector) { +template +void RowwiseSum::operator()(const DeviceContext& context, + const framework::Tensor& input, + framework::Tensor* vector) { auto in_dims = input.dims(); auto size = input.numel() / in_dims[1]; PADDLE_ENFORCE_EQ(vector->numel(), size); - auto in = framework::EigenMatrix::From(input); - auto vec = framework::EigenMatrix::From(*vector); + auto in = framework::EigenMatrix::From(input); + auto vec = framework::EigenMatrix::From(*vector); Eigen::array shape({{static_cast(size), 1}}); - vec.reshape(shape).device(*context.GetEigenDevice()) = - in.sum(Eigen::array({{0}})).reshape(shape); + vec.reshape(shape).device(*context.eigen_device()) = + in.sum(Eigen::array({{1}})).reshape(shape); } } // namespace math } // namespace operators diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc index df988510547..9e3836b06dc 100644 --- a/paddle/operators/math/matrix_bit_code.cc +++ b/paddle/operators/math/matrix_bit_code.cc @@ -50,50 +50,52 @@ namespace math { for j < codeLength: op(a(i, j), b(0, index(i, j))) */ -template -static void AddByBitCodeT(Op op, CodeTable code_table, - const framework::Tensor& codes, - framework::Tensor& tmat, +template +static void AddByBitCodeT(Op op, CodeTable code_table, const int64_t* codes, + const framework::Tensor& tmat, const framework::Tensor& vec) { - size_t num_classes = code_table.size(); - size_t max_code_length = code_table.get_max_code_length(); size_t num_sample = tmat.dims()[0]; size_t width = vec.dims()[1]; for (size_t i = 0; i < num_sample; ++i) { - auto code = code_table(codes.data()[i]); + auto code = code_table(static_cast(codes[i])); int code_length = code.get_length(); - for (int j = 0; j < code_length; + j) { + for (int j = 0; j < code_length; ++j) { size_t index = code.calc_index(j); - op(tmat.data()[i * width + j], vec.data()[index]); + auto t = tmat.data()[i * width + j]; + auto v = vec.data()[index]; + op(t, v); } } } -template -void AddByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat, const framework::Tensor& vec) { - auto op = [](T& t, T& v) { t += v; }; - AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, vec); -} - -template -void AddByBitCodeGrad(size_t num_classes, const framework::Tensor& codes, - const framework::Tensor& tmat, framework::Tensor& vec) { - auto op = [](T& t, T& v) { v += t; }; - AddByBitCode(op, SimpleCodeTable(num_classes), codes, tmat, vec); +template +void SubByBitCodeT(CodeTable code_table, const int64_t* codes, + framework::Tensor& tmat) { + // size_t max_code_length = code_table.get_max_code_length(); + size_t num_samples = tmat.dims()[0]; + size_t o_width = tmat.dims()[1]; + for (size_t i = 0; i < num_samples; ++i) { + auto code = code_table(static_cast(codes[i])); + int code_length = code.get_length(); + for (int j = 0; j < code_length; ++j) { + if (code.calc_bit(j)) { + tmat.data()[i * o_width + j] -= 1; + } + } + } } -template -void SumByBitCodeT(CodeTable code_table, const framework::Tensor& codes, - framework::Tensor& tmat, const framework::Tensor& sum, +template +void SumByBitCodeT(CodeTable code_table, const int64_t* codes, + framework::Tensor& tmat, framework::Tensor& sum, const T& scale_sum) { - size_t max_code_length = code_table.get_max_code_length(); + // size_t max_code_length = code_table.get_max_code_length(); size_t num_samples = tmat.dims()[0]; size_t o_width = tmat.dims()[1]; for (size_t i = 0; i < num_samples; ++i) { - T sm = 0; - auto code = code_table(codes.data()[i]); + T sm = static_cast(0.0); + auto code = code_table(static_cast(codes[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { if (code.calc_bit(j)) { @@ -103,105 +105,124 @@ void SumByBitCodeT(CodeTable code_table, const framework::Tensor& codes, sum.data()[i] = scale_sum * sm; } } -/* For j < codeLength: - sum(i, 0) = \sum_j bit(i, j) * input(i, j) -*/ + template -void SumByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat, framework::Tensor& sum, - T scale_sum) { - SumByBitCodeT(SimpleCodeTable(num_classes), codes, tmat, scale_sum); +void MatrixBitCodeFunctor::Add(size_t num_classes, const int64_t* codes, + framework::Tensor& tmat, + const framework::Tensor& vec) { + auto op = [](T& t, const T& v) { t += v; }; + AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, vec); } -template -void MulByBitCodeT(Op op, CodeTable code_table, const framework::Tensor& codes, - framework::Tensor& tmat, framework::Tensor& weight, - framework::Tensor& input) { - size_t num_classes = code_table.size(); - size_t max_code_length = code_table.get_max_code_length(); - size_t num_samples = tmat.dims()[0]; - size_t input_dim = input.dims()[1]; - size_t o_width = tmat.dims()[1]; +template +void MatrixBitCodeFunctor::AddGrad(size_t num_classes, const int64_t* codes, + framework::Tensor& tmat, + framework::Tensor& vec) { + auto op = [](T& t, T& v) { v += t; }; + AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, vec); +} +template +void MatrixBitCodeFunctor::Sum(size_t num_classes, const int64_t* codes, + framework::Tensor& tmat, + framework::Tensor& sum, T scale_sum) { + SumByBitCodeT(SimpleCodeTable(num_classes), codes, tmat, sum, scale_sum); +} + +template +void MatrixBitCodeFunctor::Mul(size_t num_classes, const int64_t* codes, + framework::Tensor& tmat, + const framework::Tensor& weight, + const framework::Tensor& input) { + size_t num_samples = tmat.dims()[0]; + size_t tmat_width = tmat.dims()[1]; + size_t input_width = input.dims()[1]; + size_t weight_width = weight.dims()[1]; + auto tmat_p = tmat.data(); + auto weight_p = weight.data(); + auto input_p = input.data(); + auto code_table = SimpleCodeTable(num_classes); for (size_t i = 0; i < num_samples; ++i) { - auto code = code_table(codes.data()[i]); + auto code = code_table(static_cast(codes[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { size_t index = code.calc_index(j); - op(tmat.data()[i * o_width + j], - weight.data() + index * weight.dims()[1], - input.data() + i * input.dims()[1], input_dim); + + T sum = static_cast(0.0); + for (size_t k = 0; k < input_width; ++k) { + sum += + weight_p[weight_width * index + k] * input_p[input_width * i + k]; + } + std::cout << sum << std::endl; + tmat_p[i * tmat_width + j] += sum; } } } template -void MulByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat, const framework::Tensor& weight, - const framework::Tensor& input) { - auto op = [](T& t, const T* weight_row, const T* input_row, - size_t input_dim) { - T sum = 0; - for (size_t k = 0; k < input_dim; ++k) { - sum += weight_row[k] * input_row[k]; - } - t += sum; - }; - MulByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, weight, - input); -} +void MatrixBitCodeFunctor::MulGradWeight(size_t num_classes, + const int64_t* codes, + const framework::Tensor& tmat, + framework::Tensor& weight, + const framework::Tensor& input) { + size_t num_samples = tmat.dims()[0]; + size_t input_width = input.dims()[1]; + size_t weight_width = weight.dims()[1]; + auto tmat_p = tmat.data(); + auto weight_p = weight.data(); + auto input_p = input.data(); + auto code_table = SimpleCodeTable(num_classes); + for (size_t i = 0; i < num_samples; ++i) { + auto code = code_table(static_cast(codes[i])); + int code_length = code.get_length(); + for (int j = 0; j < code_length; ++j) { + size_t index = code.calc_index(j); -template -void MulByBitCodeGradWeight(size_t num_classes, const framework::Tensor& codes, - const framework::Tensor& tmat, - framework::Tensor& weight, - const framework::Tensor& input) { - auto op = [](const T t, T* weight_row, const T* input_row, size_t input_dim) { - for (size_t k = 0; k < input_dim; ++k) { - weight_row[k] += t * input_row[k]; + for (size_t k = 0; k < input_width; ++k) { + weight_p[weight_width * index * k] += + tmat_p[i * weight_width * j] * input_p[input_width * i + k]; + } } - }; - MulByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, weight, - input); + } } template -void MulByBitCodeGradError(size_t num_classes, const framework::Tensor& codes, - const framework::Tensor& tmat, - const framework::Tensor& weight, - framework::Tensor& input) { - auto op = [](const T t, const T* weight_row, T* input_row, size_t input_dim) { - for (size_t k = 0; k < input_dim; ++k) { - input_row[k] += t * weight_row[k]; - } - }; - MulByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, weight, - input); -} - -template -void SubByBitCodeT(CodeTable code_table, const framework::Tensor& codes, - framework::Tensor& tmat) { - size_t max_code_length = code_table.get_max_code_length(); +void MatrixBitCodeFunctor::MulGradError(size_t num_classes, + const int64_t* codes, + const framework::Tensor& tmat, + const framework::Tensor& weight, + framework::Tensor& input) { size_t num_samples = tmat.dims()[0]; - size_t o_width = tmat.dims()[1]; + size_t input_width = input.dims()[1]; + size_t weight_width = weight.dims()[1]; + auto tmat_p = tmat.data(); + auto weight_p = weight.data(); + auto input_p = input.data(); + auto code_table = SimpleCodeTable(num_classes); + for (size_t i = 0; i < num_samples; ++i) { - auto code = code_table(codes.data()[i]); + auto code = code_table(static_cast(codes[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { - if (code.calc_bit(j)) { - tmat.data()[i * o_width + j] -= 1; + size_t index = code.calc_index(j); + + for (size_t k = 0; k < input_width; ++k) { + input_p[weight_width * index * k] += + tmat_p[i * weight_width * j] * weight_p[weight_width * i + k]; } } } } template -void SubByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat) { +void MatrixBitCodeFunctor::Sub(size_t num_classes, const int64_t* codes, + framework::Tensor& tmat) { SubByBitCodeT(SimpleCodeTable(num_classes), codes, tmat); } +template class MatrixBitCodeFunctor; +template class MatrixBitCodeFunctor; + } // namespace math } // namespace operators } // namespace paddle diff --git a/paddle/operators/math/matrix_bit_code.h b/paddle/operators/math/matrix_bit_code.h index 43c9d43d89d..d2ebf182c86 100644 --- a/paddle/operators/math/matrix_bit_code.h +++ b/paddle/operators/math/matrix_bit_code.h @@ -15,6 +15,7 @@ limitations under the License. */ #pragma once #include "paddle/framework/eigen.h" #include "paddle/framework/tensor.h" +#include "paddle/platform/device_context.h" namespace paddle { namespace operators { @@ -59,57 +60,50 @@ struct SimpleCodeTable { int max_code_length_; }; -/* For j < code_length - tmat(i, j) += vec(0, index(i, j)) -*/ template -void AddByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat, const framework::Tensor& vec); +class MatrixBitCodeFunctor { + public: + /* For j < code_length + tmat(i, j) += vec(0, index(i, j)) + */ + void Add(size_t num_classes, const int64_t* codes, framework::Tensor& tmat, + const framework::Tensor& vec); -/* For j < code_length - vec(0, index(i, j)) += tmat(i, j) -*/ -template -void AddByBitCodeGrad(size_t num_classes, const framework::Tensor& codes, - const framework::Tensor& tmat, framework::Tensor& vec); -/* For j < code_length + /* For j < code_length + vec(0, index(i, j)) += tmat(i, j) + */ + void AddGrad(size_t num_classes, const int64_t* codes, + framework::Tensor& tmat, framework::Tensor& vec); + + /* For j < code_length sum(i, 0) = \sum_j bit(i, j) * tmat(i, j) -*/ -template -void SumByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat, framework::Tensor& sum, T scale_sum); + */ + void Sum(size_t num_classes, const int64_t* codes, framework::Tensor& tmat, + framework::Tensor& sum, T scale_sum); -/* For j < code_length - input.row(i) += tmat(i, j) * weight.row(index(i, j)) -*/ -template -void MulByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat, const framework::Tensor& weight, - const framework::Tensor& input); + /* For j < code_length + tmat(i, j) -= bit(i, j) + */ + void Sub(size_t num_classes, const int64_t* codes, framework::Tensor& tmat); + /* For j < code_length + input.row(i) += tmat(i, j) * weight.row(index(i, j)) + */ + void Mul(size_t num_classes, const int64_t* codes, framework::Tensor& tmat, + const framework::Tensor& weight, const framework::Tensor& input); -/* For index(i, j) >= 0: - weight.row(index(i, j)) += tmat(i, j) * input.row(i) -*/ -template -void MulByBitCodeGradWeight(size_t num_classes, const framework::Tensor& codes, - const framework::Tensor& tmat, - framework::Tensor& weight, - const framework::Tensor& input); -/* For j < code_length - input.row(i) += tmat(i, j) * weight.row(index(i, j)) -*/ -template -void MulByBitCodeGradError(size_t num_classes, const framework::Tensor& codes, - const framework::Tensor& tmat, - const framework::Tensor& weight, - framework::Tensor& input); - -/* For j < code_length - tmat(i, j) -= bit(i, j) -*/ -template -void SubByBitCode(size_t num_classes, const framework::Tensor& codes, - framework::Tensor& tmat); + /* For index(i, j) >= 0: + weight.row(index(i, j)) += tmat(i, j) * input.row(i) + */ + void MulGradWeight(size_t num_classes, const int64_t* codes, + const framework::Tensor& tmat, framework::Tensor& weight, + const framework::Tensor& input); + /* For j < code_length + input.row(i) += tmat(i, j) * weight.row(index(i, j)) + */ + void MulGradError(size_t num_classes, const int64_t* codes, + const framework::Tensor& tmat, + const framework::Tensor& weight, framework::Tensor& input); +}; } // namespace math } // namespace operators } // namespace paddle diff --git a/paddle/pybind/pybind.cc b/paddle/pybind/pybind.cc index c16d3e0cbe0..a05fcd0451c 100644 --- a/paddle/pybind/pybind.cc +++ b/paddle/pybind/pybind.cc @@ -126,6 +126,8 @@ PYBIND11_PLUGIN(core) { .def("shape", [](Tensor &self) { return vectorize(self.dims()); }) .def("set_float_element", TensorSetElement) .def("get_float_element", TensorGetElement) + .def("set_int64_element", TensorSetElement) + .def("get_int64_element", TensorGetElement) .def("set_double_element", TensorSetElement) .def("get_double_element", TensorGetElement) .def("dtype", [](Tensor &self) { return ToDataType(self.type()); }); diff --git a/python/paddle/v2/fluid/tests/op_test.py b/python/paddle/v2/fluid/tests/op_test.py index e83c4a06220..edf68075bec 100644 --- a/python/paddle/v2/fluid/tests/op_test.py +++ b/python/paddle/v2/fluid/tests/op_test.py @@ -49,7 +49,6 @@ def create_op(scope, op_type, inputs, outputs, attrs): for attr_name in Operator.get_op_attr_names(op_type): if attr_name in attrs: kwargs[attr_name] = attrs[attr_name] - return Operator(op_type, **kwargs) @@ -107,6 +106,8 @@ def get_numeric_gradient(scope, tensor_to_check_dtype = np.float32 elif tensor_to_check_dtype == core.DataType.FP64: tensor_to_check_dtype = np.float64 + elif tensor_to_check_dtype == core.DataType.INT64: + tensor_to_check_dtype = np.int64 else: raise ValueError("Not supported data type " + str( tensor_to_check_dtype)) @@ -116,12 +117,16 @@ def get_numeric_gradient(scope, def __get_elem__(tensor, i): if tensor_to_check_dtype == np.float32: return tensor.get_float_element(i) + elif tensor_to_check_dtype == np.int64: + return tensor.get_int64_element(i) else: return tensor.get_double_element(i) def __set_elem__(tensor, i, e): if tensor_to_check_dtype == np.float32: tensor.set_float_element(i, e) + elif tensor_to_check_dtype == np.int64: + tensor.set_int64_element(i, e) else: tensor.set_double_element(i, e) @@ -355,13 +360,11 @@ class OpTest(unittest.TestCase): op_attrs = self.attrs if hasattr(self, "attrs") else dict() self.op = create_op(self.scope, self.op_type, op_inputs, op_outputs, op_attrs) - if no_grad_set is None: no_grad_set = set() if not type(output_names) is list: output_names = [output_names] - numeric_grads = user_defined_grads or [ get_numeric_gradient( self.scope, @@ -457,9 +460,7 @@ class OpTest(unittest.TestCase): # infer variable type and infer shape in compile-time op.desc.infer_var_type(block.desc) op.desc.infer_shape(block.desc) - mean_inputs = map(block.var, output_names) - if len(mean_inputs) == 1: loss = block.create_var(dtype=mean_inputs[0].dtype, shape=[1]) op = block.append_op( diff --git a/python/paddle/v2/fluid/tests/test_hsigmoid_op.py b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py index 25c13aabe97..194d5e315fc 100644 --- a/python/paddle/v2/fluid/tests/test_hsigmoid_op.py +++ b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py @@ -5,15 +5,15 @@ from op_test import OpTest class TestHSigmoidOp(OpTest): def setUp(self): - self.op_type = "hierarchical_sigmoid_op" + self.op_type = "hierarchical_sigmoid" num_classes = 6 embded_size = 10 batch_size = 5 x = np.random.random((batch_size, embded_size)).astype("float32") parameter = np.random.random( (batch_size, num_classes - 1, embded_size)).astype("float32") - label = np.random.randint(0, num_classes, batch_size).astype("int64") - bias = np.random.random((1, num_classes - 1)) + label = np.random.randint(0, num_classes, batch_size) + bias = np.random.random((1, num_classes - 1)).astype("float32") self.inputs = { 'X': x, 'Parameters': parameter, @@ -21,13 +21,18 @@ class TestHSigmoidOp(OpTest): 'Bias': bias } self.attrs = {'num_classes': num_classes} - self.outputs = {'Out': label} + self.outputs = { + 'Out': np.random.random((batch_size, 1)).astype("float32") + } def test_check_output(self): self.check_output() def test_check_grad(self): - self.check_grad(['x0'], 'Out') + self.check_grad( + ['X', 'Parameters', 'Label', 'Bias'], + 'Out', + no_grad_set=set(['Label'])) if __name__ == '__main__': -- GitLab From f07164912bca60a36a72dc6ce22f8e00caa99301 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 3 Jan 2018 20:00:07 +0800 Subject: [PATCH 0007/1416] fix backward --- paddle/operators/hierarchical_sigmoid_op.cc | 28 +++++++------- paddle/operators/hierarchical_sigmoid_op.h | 38 +++++++++---------- paddle/operators/math/matrix_bit_code.cc | 1 - paddle/pybind/pybind.cc | 2 - python/paddle/v2/fluid/executor.py | 1 - python/paddle/v2/fluid/tests/op_test.py | 2 - .../paddle/v2/fluid/tests/test_hsigmoid_op.py | 16 ++------ 7 files changed, 37 insertions(+), 51 deletions(-) diff --git a/paddle/operators/hierarchical_sigmoid_op.cc b/paddle/operators/hierarchical_sigmoid_op.cc index 4b3487f8b96..bc6ceb98747 100644 --- a/paddle/operators/hierarchical_sigmoid_op.cc +++ b/paddle/operators/hierarchical_sigmoid_op.cc @@ -61,10 +61,8 @@ class HierarchicalSigmoidOp : public framework::OperatorWithKernel { using framework::OperatorWithKernel::OperatorWithKernel; void InferShape(framework::InferShapeContext* ctx) const override { PADDLE_ENFORCE(ctx->HasInput("X"), "Input(X) should not be null."); - PADDLE_ENFORCE(ctx->HasInput("Label"), "Input(Label) should not be null."); - PADDLE_ENFORCE(ctx->HasInput("Parameters"), - "Input(Parameters)" - "should not be null."); + PADDLE_ENFORCE(ctx->HasInput("Ids"), "Input(Ids) should not be null."); + PADDLE_ENFORCE(ctx->HasInput("W"), "Input(W) should not be null."); PADDLE_ENFORCE(ctx->HasOutput("Out"), "Output(Out) should not be null."); const int64_t batch_size = ctx->GetInputDim("X")[0]; std::vector output_shape({batch_size, 1}); @@ -84,15 +82,17 @@ class HierarchicalSigmoidGradOp : public framework::OperatorWithKernel { public: using framework::OperatorWithKernel::OperatorWithKernel; void InferShape(framework::InferShapeContext* ctx) const override { - PADDLE_ENFORCE(ctx->HasInput("Parameters"), - "Input(Parameters)" - "should not be null."); - PADDLE_ENFORCE(ctx->HasInput("Label"), - "Input(Label)" - "should not be null."); - PADDLE_ENFORCE(ctx->HasOutput(framework::GradVarName("Parameters")), - "Input(Parameters@Grad should not be null.)"); + PADDLE_ENFORCE(ctx->HasInput("W"), "Input(W) should not be null."); + PADDLE_ENFORCE(ctx->HasInput("Ids"), "Input(Ids) should not be null."); + PADDLE_ENFORCE(ctx->HasOutput(framework::GradVarName("W")), + "Input(W@Grad should not be null.)"); PADDLE_ENFORCE(ctx->HasOutput(framework::GradVarName("X"))); + if (ctx->HasOutput(framework::GradVarName("Bias"))) { + ctx->SetOutputDim(framework::GradVarName("Bias"), + ctx->GetInputDim("Bias")); + } + ctx->SetOutputDim(framework::GradVarName("W"), ctx->GetInputDim("W")); + ctx->SetOutputDim(framework::GradVarName("X"), ctx->GetInputDim("X")); } protected: @@ -112,11 +112,11 @@ class HierarchicalSigmoidOpMaker : public framework::OpProtoAndCheckerMaker { "(Tensor, required) The input Tensor, which the shape is" "[N * D], which N is the size of mini-batch," "D is the embded size"); - AddInput("Parameters", + AddInput("W", "(Tensor, required), The parameters of hierarchical " "sigmoid operator, each of them is s a 3-D tensor, the shape is" "[N, num_classes - 1, D]"); - AddInput("Label", + AddInput("Ids", "(Tensor, required), The labels of training data. It's a" "1-D tensor, which the shape is [1, N]"); AddInput("Bias", diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h index 531fd9f7fc0..1b8d21c095e 100644 --- a/paddle/operators/hierarchical_sigmoid_op.h +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -32,15 +32,14 @@ class HierarchicalSigmoidOpKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { auto* in = ctx.Input("X"); - auto* params = ctx.Input("Parameters"); - auto* label = ctx.Input("Label"); + auto* w = ctx.Input("W"); + auto* ids = ctx.Input("Ids"); auto* bias = ctx.Input("Bias"); auto* out = ctx.Output("Out"); size_t num_classes = static_cast(ctx.Attr("num_classes")); int64_t code_length = math::FindLastSet(num_classes - 1); int64_t batch_size = in->dims()[0]; - auto* ids = label->data(); framework::Tensor pre_out; framework::Tensor sum; auto pre_out_data = pre_out.mutable_data( @@ -59,18 +58,19 @@ class HierarchicalSigmoidOpKernel : public framework::OpKernel { auto out_mat = framework::EigenVector::Flatten(*out); if (bias) { - bit_code.Add(num_classes, ids, pre_out, *bias); + bit_code.Add(num_classes, ids->data(), pre_out, *bias); } for (int i = 0; i < in->dims()[0]; ++i) { - bit_code.Mul(num_classes, ids, pre_out, params->Slice(i, i + 1), - in->Slice(i, i + 1)); + bit_code.Mul(num_classes, ids->data(), pre_out, + w->Slice(i, i + 1), in->Slice(i, i + 1)); } // clip the matrix with (-40, 40) Transform trans; trans(ctx.template device_context(), pre_out_data, pre_out_data + pre_out.numel(), pre_out_data, ClipFunctor(static_cast(-40.0), static_cast(40.0))); - bit_code.Sum(num_classes, ids, pre_out, *out, static_cast(-1)); + bit_code.Sum(num_classes, ids->data(), pre_out, *out, + static_cast(-1)); // softrelu with threshold is 40.0 trans(ctx.template device_context(), pre_out_data, pre_out_data + pre_out.numel(), pre_out_data, @@ -88,10 +88,9 @@ class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& ctx) const override { auto* in = ctx.Input("X"); auto* in_grad = ctx.Output(framework::GradVarName("X")); - auto* params = - ctx.Output(framework::GradVarName("Parameters")); + auto* w = ctx.Output(framework::GradVarName("W")); auto* bias = ctx.Output(framework::GradVarName("Bias")); - auto* label = ctx.Input("Label"); + auto* ids = ctx.Input("Ids"); size_t num_classes = static_cast(ctx.Attr("num_classes")); int64_t code_length = math::FindLastSet(num_classes - 1); int64_t batch_size = in->dims()[0]; @@ -102,8 +101,6 @@ class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { auto& place = *ctx.template device_context().eigen_device(); auto& device_ctx = ctx.template device_context(); auto pre_out_mat = EigenMatrix::From(pre_out); - auto* ids = label->data(); - // init pre_out matrix with {1.0} math::SetConstant one; math::MatrixBitCodeFunctor bit_code; @@ -112,19 +109,22 @@ class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { pre_out_mat.device(place) = pre_out_mat * (static_cast(1.0) - static_cast(1.0) / pre_out_mat); - bit_code.Sub(num_classes, ids, pre_out); + bit_code.Sub(num_classes, ids->data(), pre_out); if (bias) { - bit_code.AddGrad(num_classes, ids, pre_out, *bias); + bias->mutable_data(ctx.GetPlace()); + bit_code.AddGrad(num_classes, ids->data(), pre_out, *bias); } - + in_grad->mutable_data(ctx.GetPlace()); + w->mutable_data(ctx.GetPlace()); for (int i = 0; i < in_grad->dims()[0]; ++i) { - auto p_sliced = params->Slice(i, i + 1); + auto p_sliced = w->Slice(i, i + 1); auto in_sliced = in->Slice(i, i + 1); auto in_grad_sliced = in_grad->Slice(i, i + 1); - bit_code.MulGradWeight(num_classes, ids, pre_out, p_sliced, in_sliced); - bit_code.MulGradError(num_classes, ids, pre_out, p_sliced, - in_grad_sliced); + bit_code.MulGradWeight(num_classes, ids->data(), pre_out, + p_sliced, in_sliced); + bit_code.MulGradError(num_classes, ids->data(), pre_out, + p_sliced, in_grad_sliced); } } }; diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc index 4ad0a000083..b192183b101 100644 --- a/paddle/operators/math/matrix_bit_code.cc +++ b/paddle/operators/math/matrix_bit_code.cc @@ -56,7 +56,6 @@ static void AddByBitCodeT(Op op, CodeTable code_table, const int64_t* codes, const framework::Tensor& vec) { size_t num_sample = tmat.dims()[0]; size_t width = vec.dims()[1]; - for (size_t i = 0; i < num_sample; ++i) { auto code = code_table(static_cast(codes[i])); int code_length = code.get_length(); diff --git a/paddle/pybind/pybind.cc b/paddle/pybind/pybind.cc index 921b316a695..de6b24f70d8 100644 --- a/paddle/pybind/pybind.cc +++ b/paddle/pybind/pybind.cc @@ -109,8 +109,6 @@ PYBIND11_PLUGIN(core) { .def("shape", [](Tensor &self) { return vectorize(self.dims()); }) .def("set_float_element", TensorSetElement) .def("get_float_element", TensorGetElement) - .def("set_int64_element", TensorSetElement) - .def("get_int64_element", TensorGetElement) .def("set_double_element", TensorSetElement) .def("get_double_element", TensorGetElement) .def("dtype", [](Tensor &self) { return ToDataType(self.type()); }); diff --git a/python/paddle/v2/fluid/executor.py b/python/paddle/v2/fluid/executor.py index cdd576294f4..a054d5eafb2 100644 --- a/python/paddle/v2/fluid/executor.py +++ b/python/paddle/v2/fluid/executor.py @@ -148,7 +148,6 @@ class Executor(object): inputs={'X': [var]}, outputs={'Out': [fetch_var]}, attrs={'col': i}) - self.executor.run(program.desc, scope, 0, True, True) outs = [ core.get_fetch_variable(scope, fetch_var_name, i) diff --git a/python/paddle/v2/fluid/tests/op_test.py b/python/paddle/v2/fluid/tests/op_test.py index 287dc298048..0493a0c2061 100644 --- a/python/paddle/v2/fluid/tests/op_test.py +++ b/python/paddle/v2/fluid/tests/op_test.py @@ -123,8 +123,6 @@ def get_numeric_gradient(scope, def __set_elem__(tensor, i, e): if tensor_to_check_dtype == np.float32: tensor.set_float_element(i, e) - elif tensor_to_check_dtype == np.int64: - tensor.set_int64_element(i, e) else: tensor.set_double_element(i, e) diff --git a/python/paddle/v2/fluid/tests/test_hsigmoid_op.py b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py index 194d5e315fc..b6d961b6318 100644 --- a/python/paddle/v2/fluid/tests/test_hsigmoid_op.py +++ b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py @@ -10,16 +10,11 @@ class TestHSigmoidOp(OpTest): embded_size = 10 batch_size = 5 x = np.random.random((batch_size, embded_size)).astype("float32") - parameter = np.random.random( + w = np.random.random( (batch_size, num_classes - 1, embded_size)).astype("float32") - label = np.random.randint(0, num_classes, batch_size) + ids = np.random.randint(0, num_classes, batch_size) bias = np.random.random((1, num_classes - 1)).astype("float32") - self.inputs = { - 'X': x, - 'Parameters': parameter, - 'Label': label, - 'Bias': bias - } + self.inputs = {'X': x, 'W': w, 'Ids': ids, 'Bias': bias} self.attrs = {'num_classes': num_classes} self.outputs = { 'Out': np.random.random((batch_size, 1)).astype("float32") @@ -29,10 +24,7 @@ class TestHSigmoidOp(OpTest): self.check_output() def test_check_grad(self): - self.check_grad( - ['X', 'Parameters', 'Label', 'Bias'], - 'Out', - no_grad_set=set(['Label'])) + self.check_grad(['X', 'W', 'Bias'], 'Out', no_grad_set=set('Ids')) if __name__ == '__main__': -- GitLab From 80ce7edbb79244f6946cf38e233d3914ef40ddf5 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 9 Jan 2018 20:26:37 +0800 Subject: [PATCH 0008/1416] make farward correct --- paddle/operators/hierarchical_sigmoid_op.cc | 4 +- paddle/operators/hierarchical_sigmoid_op.h | 35 ++-- paddle/operators/math/math_function_impl.h | 8 +- paddle/operators/math/matrix_bit_code.cc | 156 ++++++++---------- paddle/operators/math/matrix_bit_code.h | 25 ++- python/paddle/v2/fluid/tests/op_test.py | 9 +- .../paddle/v2/fluid/tests/test_hsigmoid_op.py | 70 +++++++- 7 files changed, 170 insertions(+), 137 deletions(-) diff --git a/paddle/operators/hierarchical_sigmoid_op.cc b/paddle/operators/hierarchical_sigmoid_op.cc index bc6ceb98747..e2ba65d6f9c 100644 --- a/paddle/operators/hierarchical_sigmoid_op.cc +++ b/paddle/operators/hierarchical_sigmoid_op.cc @@ -70,7 +70,7 @@ class HierarchicalSigmoidOp : public framework::OperatorWithKernel { } protected: - framework::OpKernelType GetKernelType( + framework::OpKernelType GetActualKernelType( const framework::ExecutionContext& ctx) const override { return framework::OpKernelType( framework::ToDataType(ctx.Input("X")->type()), @@ -96,7 +96,7 @@ class HierarchicalSigmoidGradOp : public framework::OperatorWithKernel { } protected: - framework::OpKernelType GetKernelType( + framework::OpKernelType GetActualKernelType( const framework::ExecutionContext& ctx) const override { return framework::OpKernelType( framework::ToDataType(ctx.Input("X")->type()), diff --git a/paddle/operators/hierarchical_sigmoid_op.h b/paddle/operators/hierarchical_sigmoid_op.h index 1b8d21c095e..f5b1b97169c 100644 --- a/paddle/operators/hierarchical_sigmoid_op.h +++ b/paddle/operators/hierarchical_sigmoid_op.h @@ -49,34 +49,31 @@ class HierarchicalSigmoidOpKernel : public framework::OpKernel { auto& place = *ctx.template device_context().eigen_device(); auto& device_ctx = ctx.template device_context(); math::RowwiseSum row_sum; - math::MatrixBitCodeFunctor bit_code; + math::MatrixBitCodeFunctor bit_code(num_classes, ids->data()); std::vector sum_dims({batch_size, 1UL}); sum.mutable_data(framework::make_ddim(sum_dims), ctx.GetPlace()); auto sum_mat = EigenMatrix::From(sum); out->mutable_data(ctx.GetPlace()); auto out_mat = framework::EigenVector::Flatten(*out); - if (bias) { - bit_code.Add(num_classes, ids->data(), pre_out, *bias); + bit_code.Add(pre_out, *bias); } - for (int i = 0; i < in->dims()[0]; ++i) { - bit_code.Mul(num_classes, ids->data(), pre_out, - w->Slice(i, i + 1), in->Slice(i, i + 1)); + for (int64_t i = 0; i < batch_size; ++i) { + auto w_i = w->Slice(i, i + 1); + bit_code.Mul(pre_out, w_i, *in); } // clip the matrix with (-40, 40) Transform trans; trans(ctx.template device_context(), pre_out_data, pre_out_data + pre_out.numel(), pre_out_data, ClipFunctor(static_cast(-40.0), static_cast(40.0))); - bit_code.Sum(num_classes, ids->data(), pre_out, *out, - static_cast(-1)); + bit_code.Sum(pre_out, *out, static_cast(-1)); // softrelu with threshold is 40.0 trans(ctx.template device_context(), pre_out_data, pre_out_data + pre_out.numel(), pre_out_data, ClipFunctor(static_cast(-40.0), static_cast(40.0))); pre_out_mat.device(place) = (static_cast(1.0) + pre_out_mat.exp()).log(); - row_sum(device_ctx, pre_out, &sum); out_mat.device(place) = sum_mat + out_mat; } @@ -103,28 +100,26 @@ class HierarchicalSigmoidGradOpKernel : public framework::OpKernel { auto pre_out_mat = EigenMatrix::From(pre_out); // init pre_out matrix with {1.0} math::SetConstant one; - math::MatrixBitCodeFunctor bit_code; + math::MatrixBitCodeFunctor bit_code(num_classes, ids->data()); one(device_ctx, &pre_out, static_cast(1.0)); // softrelu derivative pre_out_mat.device(place) = pre_out_mat * (static_cast(1.0) - static_cast(1.0) / pre_out_mat); - bit_code.Sub(num_classes, ids->data(), pre_out); + bit_code.Sub(pre_out); if (bias) { bias->mutable_data(ctx.GetPlace()); - bit_code.AddGrad(num_classes, ids->data(), pre_out, *bias); + bit_code.AddGrad(pre_out, *bias); } in_grad->mutable_data(ctx.GetPlace()); w->mutable_data(ctx.GetPlace()); - for (int i = 0; i < in_grad->dims()[0]; ++i) { - auto p_sliced = w->Slice(i, i + 1); - auto in_sliced = in->Slice(i, i + 1); - auto in_grad_sliced = in_grad->Slice(i, i + 1); - bit_code.MulGradWeight(num_classes, ids->data(), pre_out, - p_sliced, in_sliced); - bit_code.MulGradError(num_classes, ids->data(), pre_out, - p_sliced, in_grad_sliced); + for (int i = 0; i < batch_size; ++i) { + auto w_i = w->Slice(i, i + 1); + // auto in_i = in->Slice(i, i + 1); + // auto in_grad_i = in_grad->Slice(i, i + 1); + bit_code.MulGradWeight(pre_out, w_i, *in); + bit_code.MulGradError(pre_out, w_i, *in_grad); } } }; diff --git a/paddle/operators/math/math_function_impl.h b/paddle/operators/math/math_function_impl.h index 98722ff5d29..63fb7182dfd 100644 --- a/paddle/operators/math/math_function_impl.h +++ b/paddle/operators/math/math_function_impl.h @@ -62,13 +62,13 @@ void ColwiseSum::operator()(const DeviceContext& context, template void RowwiseSum::operator()(const DeviceContext& context, const framework::Tensor& input, - framework::Tensor* vector) { + framework::Tensor* out) { auto in_dims = input.dims(); auto size = input.numel() / in_dims[1]; - PADDLE_ENFORCE_EQ(vector->numel(), size); + PADDLE_ENFORCE_EQ(out->numel(), size); - auto in = framework::EigenMatrix::From(input); - auto vec = framework::EigenMatrix::From(*vector); + auto in = framework::EigenMatrix::From(input); + auto vec = framework::EigenVector::Flatten(*out); vec.device(*context.eigen_device()) = in.sum(Eigen::array({{1}})); } diff --git a/paddle/operators/math/matrix_bit_code.cc b/paddle/operators/math/matrix_bit_code.cc index b192183b101..34f5f6ef61b 100644 --- a/paddle/operators/math/matrix_bit_code.cc +++ b/paddle/operators/math/matrix_bit_code.cc @@ -22,7 +22,7 @@ namespace math { * CodeTable class should support 3 functions: * * size_t size() - * return the number of codes + * return the number of ids * * int getMaxCodeLength() * return the maximal code length @@ -45,56 +45,47 @@ namespace math { * */ -/* - for i: - for j < codeLength: - op(a(i, j), b(0, index(i, j))) -*/ -template -static void AddByBitCodeT(Op op, CodeTable code_table, const int64_t* codes, - const framework::Tensor& tmat, - const framework::Tensor& vec) { - size_t num_sample = tmat.dims()[0]; - size_t width = vec.dims()[1]; - for (size_t i = 0; i < num_sample; ++i) { - auto code = code_table(static_cast(codes[i])); +template +void MatrixBitCodeFunctor::Add(framework::Tensor& tmat, + const framework::Tensor& vec) { + SimpleCodeTable code_table(num_classes_); + size_t batch_size = tmat.dims()[0]; + size_t width = tmat.dims()[1]; + for (size_t i = 0; i < batch_size; ++i) { + auto code = code_table(static_cast(ids_[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { size_t index = code.calc_index(j); - auto t = tmat.data()[i * width + j]; - auto v = vec.data()[index]; - op(t, v); + tmat.data()[i * width + j] += vec.data()[index]; } } } -template -void SubByBitCodeT(CodeTable code_table, const int64_t* codes, - framework::Tensor& tmat) { - // size_t max_code_length = code_table.get_max_code_length(); - size_t num_samples = tmat.dims()[0]; - size_t o_width = tmat.dims()[1]; - for (size_t i = 0; i < num_samples; ++i) { - auto code = code_table(static_cast(codes[i])); +template +void MatrixBitCodeFunctor::AddGrad(framework::Tensor& tmat, + framework::Tensor& vec) { + SimpleCodeTable code_table(num_classes_); + size_t batch_size = tmat.dims()[0]; + size_t width = tmat.dims()[1]; + for (size_t i = 0; i < batch_size; ++i) { + auto code = code_table(static_cast(ids_[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { - if (code.calc_bit(j)) { - tmat.data()[i * o_width + j] -= 1; - } + size_t index = code.calc_index(j); + vec.data()[index] += tmat.data()[i * width + j]; } } } -template -void SumByBitCodeT(CodeTable code_table, const int64_t* codes, - framework::Tensor& tmat, framework::Tensor& sum, - const T& scale_sum) { - // size_t max_code_length = code_table.get_max_code_length(); +template +void MatrixBitCodeFunctor::Sum(framework::Tensor& tmat, + framework::Tensor& sum, T scale_sum) { + SimpleCodeTable code_table(num_classes_); size_t num_samples = tmat.dims()[0]; size_t o_width = tmat.dims()[1]; for (size_t i = 0; i < num_samples; ++i) { T sm = static_cast(0.0); - auto code = code_table(static_cast(codes[i])); + auto code = code_table(static_cast(ids_[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { if (code.calc_bit(j)) { @@ -106,116 +97,99 @@ void SumByBitCodeT(CodeTable code_table, const int64_t* codes, } template -void MatrixBitCodeFunctor::Add(size_t num_classes, const int64_t* codes, - framework::Tensor& tmat, - const framework::Tensor& vec) { - auto op = [](T& t, const T& v) { t += v; }; - AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, vec); -} - -template -void MatrixBitCodeFunctor::AddGrad(size_t num_classes, const int64_t* codes, - framework::Tensor& tmat, - framework::Tensor& vec) { - auto op = [](T& t, T& v) { v += t; }; - AddByBitCodeT(op, SimpleCodeTable(num_classes), codes, tmat, vec); -} - -template -void MatrixBitCodeFunctor::Sum(size_t num_classes, const int64_t* codes, - framework::Tensor& tmat, - framework::Tensor& sum, T scale_sum) { - SumByBitCodeT(SimpleCodeTable(num_classes), codes, tmat, sum, scale_sum); -} - -template -void MatrixBitCodeFunctor::Mul(size_t num_classes, const int64_t* codes, - framework::Tensor& tmat, +void MatrixBitCodeFunctor::Mul(framework::Tensor& tmat, const framework::Tensor& weight, const framework::Tensor& input) { + SimpleCodeTable code_table(num_classes_); size_t num_samples = tmat.dims()[0]; size_t tmat_width = tmat.dims()[1]; size_t input_width = input.dims()[1]; - size_t weight_width = weight.dims()[1]; - auto tmat_p = tmat.data(); - auto weight_p = weight.data(); - auto input_p = input.data(); - auto code_table = SimpleCodeTable(num_classes); + size_t weight_width = weight.dims()[2]; + auto tmat_value = tmat.data(); + auto weight_value = weight.data(); + auto input_value = input.data(); for (size_t i = 0; i < num_samples; ++i) { - auto code = code_table(static_cast(codes[i])); + auto code = code_table(static_cast(ids_[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { size_t index = code.calc_index(j); T sum = static_cast(0.0); for (size_t k = 0; k < input_width; ++k) { - sum += - weight_p[weight_width * index + k] * input_p[input_width * i + k]; + sum += weight_value[weight_width * index + k] * + input_value[input_width * i + k]; } - tmat_p[i * tmat_width + j] += sum; + tmat_value[i * tmat_width + j] += sum; } } } template -void MatrixBitCodeFunctor::MulGradWeight(size_t num_classes, - const int64_t* codes, - const framework::Tensor& tmat, +void MatrixBitCodeFunctor::MulGradWeight(const framework::Tensor& tmat, framework::Tensor& weight, const framework::Tensor& input) { + SimpleCodeTable code_table(num_classes_); size_t num_samples = tmat.dims()[0]; size_t input_width = input.dims()[1]; size_t weight_width = weight.dims()[1]; - auto tmat_p = tmat.data(); - auto weight_p = weight.data(); - auto input_p = input.data(); - auto code_table = SimpleCodeTable(num_classes); + auto tmat_value = tmat.data(); + auto weight_value = weight.data(); + auto input_value = input.data(); for (size_t i = 0; i < num_samples; ++i) { - auto code = code_table(static_cast(codes[i])); + auto code = code_table(static_cast(ids_[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { size_t index = code.calc_index(j); for (size_t k = 0; k < input_width; ++k) { - weight_p[weight_width * index * k] += - tmat_p[i * weight_width * j] * input_p[input_width * i + k]; + weight_value[weight_width * index * k] += + tmat_value[i * weight_width * j] * input_value[input_width * i + k]; } } } } template -void MatrixBitCodeFunctor::MulGradError(size_t num_classes, - const int64_t* codes, - const framework::Tensor& tmat, +void MatrixBitCodeFunctor::MulGradError(const framework::Tensor& tmat, const framework::Tensor& weight, framework::Tensor& input) { + SimpleCodeTable code_table(num_classes_); size_t num_samples = tmat.dims()[0]; size_t input_width = input.dims()[1]; size_t weight_width = weight.dims()[1]; - auto tmat_p = tmat.data(); - auto weight_p = weight.data(); - auto input_p = input.data(); - auto code_table = SimpleCodeTable(num_classes); + auto tmat_value = tmat.data(); + auto weight_value = weight.data(); + auto input_value = input.data(); for (size_t i = 0; i < num_samples; ++i) { - auto code = code_table(static_cast(codes[i])); + auto code = code_table(static_cast(ids_[i])); int code_length = code.get_length(); for (int j = 0; j < code_length; ++j) { size_t index = code.calc_index(j); for (size_t k = 0; k < input_width; ++k) { - input_p[weight_width * index * k] += - tmat_p[i * weight_width * j] * weight_p[weight_width * i + k]; + input_value[weight_width * index * k] += + tmat_value[i * weight_width * j] * + weight_value[weight_width * i + k]; } } } } template -void MatrixBitCodeFunctor::Sub(size_t num_classes, const int64_t* codes, - framework::Tensor& tmat) { - SubByBitCodeT(SimpleCodeTable(num_classes), codes, tmat); +void MatrixBitCodeFunctor::Sub(framework::Tensor& tmat) { + SimpleCodeTable code_table(num_classes_); + size_t num_samples = tmat.dims()[0]; + size_t o_width = tmat.dims()[1]; + for (size_t i = 0; i < num_samples; ++i) { + auto code = code_table(static_cast(ids_[i])); + int code_length = code.get_length(); + for (int j = 0; j < code_length; ++j) { + if (code.calc_bit(j)) { + tmat.data()[i * o_width + j] -= 1; + } + } + } } template class MatrixBitCodeFunctor; diff --git a/paddle/operators/math/matrix_bit_code.h b/paddle/operators/math/matrix_bit_code.h index d2ebf182c86..43c676f5cc5 100644 --- a/paddle/operators/math/matrix_bit_code.h +++ b/paddle/operators/math/matrix_bit_code.h @@ -63,46 +63,45 @@ struct SimpleCodeTable { template class MatrixBitCodeFunctor { public: + explicit MatrixBitCodeFunctor(size_t num_classes, const int64_t* ids) + : num_classes_(num_classes), ids_(ids) {} /* For j < code_length tmat(i, j) += vec(0, index(i, j)) */ - void Add(size_t num_classes, const int64_t* codes, framework::Tensor& tmat, - const framework::Tensor& vec); + void Add(framework::Tensor& tmat, const framework::Tensor& vec); /* For j < code_length vec(0, index(i, j)) += tmat(i, j) */ - void AddGrad(size_t num_classes, const int64_t* codes, - framework::Tensor& tmat, framework::Tensor& vec); + void AddGrad(framework::Tensor& tmat, framework::Tensor& vec); /* For j < code_length sum(i, 0) = \sum_j bit(i, j) * tmat(i, j) */ - void Sum(size_t num_classes, const int64_t* codes, framework::Tensor& tmat, - framework::Tensor& sum, T scale_sum); + void Sum(framework::Tensor& tmat, framework::Tensor& sum, T scale_sum); /* For j < code_length tmat(i, j) -= bit(i, j) */ - void Sub(size_t num_classes, const int64_t* codes, framework::Tensor& tmat); + void Sub(framework::Tensor& tmat); /* For j < code_length input.row(i) += tmat(i, j) * weight.row(index(i, j)) */ - void Mul(size_t num_classes, const int64_t* codes, framework::Tensor& tmat, - const framework::Tensor& weight, const framework::Tensor& input); + void Mul(framework::Tensor& tmat, const framework::Tensor& weight, + const framework::Tensor& input); /* For index(i, j) >= 0: weight.row(index(i, j)) += tmat(i, j) * input.row(i) */ - void MulGradWeight(size_t num_classes, const int64_t* codes, - const framework::Tensor& tmat, framework::Tensor& weight, + void MulGradWeight(const framework::Tensor& tmat, framework::Tensor& weight, const framework::Tensor& input); /* For j < code_length input.row(i) += tmat(i, j) * weight.row(index(i, j)) */ - void MulGradError(size_t num_classes, const int64_t* codes, - const framework::Tensor& tmat, + void MulGradError(const framework::Tensor& tmat, const framework::Tensor& weight, framework::Tensor& input); + size_t num_classes_; + const int64_t* ids_; }; } // namespace math } // namespace operators diff --git a/python/paddle/v2/fluid/tests/op_test.py b/python/paddle/v2/fluid/tests/op_test.py index acc42fd3b3d..b77d2b1268f 100644 --- a/python/paddle/v2/fluid/tests/op_test.py +++ b/python/paddle/v2/fluid/tests/op_test.py @@ -49,6 +49,7 @@ def create_op(scope, op_type, inputs, outputs, attrs): for attr_name in Operator.get_op_attr_names(op_type): if attr_name in attrs: kwargs[attr_name] = attrs[attr_name] + return Operator(op_type, **kwargs) @@ -104,8 +105,6 @@ def get_numeric_gradient(scope, tensor_to_check_dtype = np.float32 elif tensor_to_check_dtype == core.DataType.FP64: tensor_to_check_dtype = np.float64 - elif tensor_to_check_dtype == core.DataType.INT64: - tensor_to_check_dtype = np.int64 else: raise ValueError("Not supported data type " + str( tensor_to_check_dtype)) @@ -115,8 +114,6 @@ def get_numeric_gradient(scope, def __get_elem__(tensor, i): if tensor_to_check_dtype == np.float32: return tensor.get_float_element(i) - elif tensor_to_check_dtype == np.int64: - return tensor.get_int64_element(i) else: return tensor.get_double_element(i) @@ -356,11 +353,13 @@ class OpTest(unittest.TestCase): op_attrs = self.attrs if hasattr(self, "attrs") else dict() self.op = create_op(self.scope, self.op_type, op_inputs, op_outputs, op_attrs) + if no_grad_set is None: no_grad_set = set() if not type(output_names) is list: output_names = [output_names] + numeric_grads = user_defined_grads or [ get_numeric_gradient( self.scope, @@ -456,7 +455,9 @@ class OpTest(unittest.TestCase): # infer variable type and infer shape in compile-time op.desc.infer_var_type(block.desc) op.desc.infer_shape(block.desc) + mean_inputs = map(block.var, output_names) + if len(mean_inputs) == 1: loss = block.create_var(dtype=mean_inputs[0].dtype, shape=[1]) op = block.append_op( diff --git a/python/paddle/v2/fluid/tests/test_hsigmoid_op.py b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py index b6d961b6318..41e95e43639 100644 --- a/python/paddle/v2/fluid/tests/test_hsigmoid_op.py +++ b/python/paddle/v2/fluid/tests/test_hsigmoid_op.py @@ -1,6 +1,71 @@ import unittest import numpy as np from op_test import OpTest +import math + + +def find_latest_set(num): + return 1 + int(math.floor(math.log(num, 2))) + + +class CodeTable(object): + def __init__(self, num_classes, code): + self.c = num_classes + code + + def cal_index(self, bit): + return (self.c >> (bit + 1)) - 1 + + def get_length(self): + return find_latest_set(self.c) - 1 + + def cal_bit(self, bit): + return self.c & (1 << bit) + + +def hsigmoid(x, w, ids, bias, num_classes): + # code length = + # initialize pre out with dims={batch_size, code_length} + batch_size = x.shape[0] + code_length = find_latest_set(num_classes - 1) + code_table = [0 for _ in range(code_length)] + pre_output = np.zeros((batch_size, code_length)) + pre_sum = np.zeros((batch_size, 1)) + out = np.zeros((batch_size, 1)).astype("float32") + # pre_out += code(bias) + for i in xrange(batch_size): + code_table = CodeTable(num_classes, ids[i]) + length = code_table.get_length() + for j in xrange(length): + idx = code_table.cal_index(j) + pre_output[i][j] += bias[0][idx] + # pre_out += code(w) * x + for i in xrange(batch_size): + for j in xrange(batch_size): + code_table = CodeTable(num_classes, ids[j]) + length = code_table.get_length() + for k in xrange(length): + idx = code_table.cal_index(k) + sum = 0.0 + for l in xrange(x.shape[1]): + sum += w[i][idx][l] * x[j][l] + pre_output[j][k] += sum + # clip[-40.0, 40.0] + np.clip(pre_output, -40.0, 40.0) + # out(i, 0) = \sum_j bit(i, j) * preout(i, j) + for i in xrange(batch_size): + code_table = CodeTable(num_classes, ids[i]) + length = code_table.get_length() + sum = 0.0 + for j in xrange(length): + if code_table.cal_bit(j): + sum += pre_output[i][j] + out[i] = -1.0 * sum + # soft relu + np.clip(pre_output, -40.0, 40.0) + pre_output = np.log(1 + np.exp(pre_output)) + pre_sum = pre_output.sum(1).reshape((batch_size, 1)) + out += pre_sum + return out class TestHSigmoidOp(OpTest): @@ -16,9 +81,8 @@ class TestHSigmoidOp(OpTest): bias = np.random.random((1, num_classes - 1)).astype("float32") self.inputs = {'X': x, 'W': w, 'Ids': ids, 'Bias': bias} self.attrs = {'num_classes': num_classes} - self.outputs = { - 'Out': np.random.random((batch_size, 1)).astype("float32") - } + out = hsigmoid(x, w, ids, bias, num_classes) + self.outputs = {'Out': out} def test_check_output(self): self.check_output() -- GitLab From cb7891a45868c450cbdd4c85d7325c1702107f9a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 14 Mar 2018 17:27:24 +0800 Subject: [PATCH 0009/1416] Add large model design doc --- doc/fluid/design/dist_train/large_model.md | 40 ++++++++++++++++++ .../src/prefetch_parameters.graffle | Bin 0 -> 10073 bytes .../dist_train/src/prefetch_parameters.png | Bin 0 -> 180176 bytes .../dist_train/src/split_parameter.graffle | Bin 0 -> 7812 bytes .../design/dist_train/src/split_parameter.png | Bin 0 -> 69134 bytes 5 files changed, 40 insertions(+) create mode 100644 doc/fluid/design/dist_train/large_model.md create mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.graffle create mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.png create mode 100644 doc/fluid/design/dist_train/src/split_parameter.graffle create mode 100644 doc/fluid/design/dist_train/src/split_parameter.png diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/large_model.md new file mode 100644 index 00000000000..f82fa6f81e5 --- /dev/null +++ b/doc/fluid/design/dist_train/large_model.md @@ -0,0 +1,40 @@ +# Design Doc: Large Model + +## Abstract + +We propose an approach to support the large parameter. +For embedding layer, the parameter may very large and could +not be stored in one trainer's memory. In this approach, a Trainer would +prefetch a sliced parameter from different Parameter Server instances +according to the input `Ids`, and then run forward, backward and send +the gradient to Parameter Server to execute the optimize program. + +## Design + +Fluid large model distributed training use +[Distributed Transpiler](./parameter_server.md#distributed-transpiler) to split +a large parameter into multiple parameters which stored on Parameter Server, and +the Trainer would prefetch them by `RPC` interface. + +### Split Large Parameter + + + +**Distributed Transpiler** would split the large parameter +(weight) into some sliced parameters (weight_0, weight_1, weight_2) as the +figure above. + +### Prefetch Parameters from Parameter Servers + + + +- `PrefetchRpc` operator would send the rows index the multiple Parameter Servers, + and then receive the SelctedRows. +- The different with normal Fluid distributed training, we only prefetch the rows + +## TODO + +- Async Update + + To avoid slow-node, Async update is important for distributed training, + we need an design doc and implement it in future. diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle new file mode 100644 index 0000000000000000000000000000000000000000..067178972219e99add6db5a82db0f104d3517862 GIT binary patch literal 10073 zcmaLdRZtw<@*r^BEfCyo2u^SvEI5O^ySvK(!6CQ@CundD&fxCu?(Qzx@7CS_*4Ea& z+tppw=e(SkemTEt@+c&ze+4Ymxu11fxn$zQ;X`$Eb!U6j8KX#E(cn7AFa)WOO5|wG z^`HhBD-%vy`egU-2TXpMntItyhk?bK5bY{$Djj?9SOgsvN9|2XfN;@pNr7Rqa?bm? z?-R$}JDsqrE9*#5r(ZSeF?q@6-`CB~*W-W$R1@prxe|TslzBSs!9$Yk<5%)<@tRfI z4<~7sVa1!Q+0@(&_AqhTmyg*;WA*b7ev$?E_hkp=+;u_wz z>Klk-Sxf4NeD*;Ze#`tn4~#0-27LJH>hGs`p8;7jsEccOGW&AhIL|0~th`VHB#G7Im(4iSHz@pxfXQptB6~6hoR~F{ z*q!aF-qq)ZRaTQ#XNXF^^?c{CP*C}j*&Yh~w7(DfzJ477d1*vCjdI>V<>o`deMjtq z$)9=SDw1P7RJl?CWuT5r&7voo(t<*HuTH2108nb4OCzF|KW8J0`y8L{d?0VX7m$Q~ z&l9Gz4Hu%FYflb_Z0>tTH71Bl-NTpN2-aoGPrav(tJ-9mxpnP(6lnd>!%sD;+VJKz z(-Gyt%%n6a=gw>}sJb_xk}1TQv_~UNo{C zMNfHZH)1r5Rv**2uZs|t&wH)=YDk^qSS%!uyEC})z0Q5VlcT5qLv=;A7$r!cIuhJe=`7wf3^*zd$PdSWx7$fSj%jOJ2j zt9y2xzY>YPFKbVqg8Cn1&tE1*r@FYO4Q~Q@UZACPNMA=sv!h`$a>$4@Q;r8d0O*8U z&Af;rF7;cYv5;DAJsLFBqioD(VzfXU+xt0yi1%b1T+8c7;rh#3ud%@)0kQ|jKcnDC zK#Bz&4_yT%2@Rz9M!{K(Aν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 Lz57)N1@*rGWhS<+ literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.png b/doc/fluid/design/dist_train/src/prefetch_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..ee54c35272898e0487c1193a85b204774811874b GIT binary patch literal 180176 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�AbxHKZxMCo&&Ojg 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 Y@u9GY^6=g-i}2r`T^cH>J50R(7s7Yq&;S4c literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/split_parameter.graffle b/doc/fluid/design/dist_train/src/split_parameter.graffle new file mode 100644 index 0000000000000000000000000000000000000000..6e2f13727d082dea7d3deaf99a43189dfaf29f3a GIT binary patch literal 7812 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 W^`*A*;iCELkN+QyFaDe9fdBw2K%Nr- literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/split_parameter.png b/doc/fluid/design/dist_train/src/split_parameter.png new file mode 100644 index 0000000000000000000000000000000000000000..1776fb8c4eb0f86aed1cdd67f54d8a08a4e479ce GIT binary patch literal 69134 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%0Au}eVk~{6{Key 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 Date: Wed, 14 Mar 2018 17:30:05 +0800 Subject: [PATCH 0010/1416] update png --- .../src/prefetch_parameters.graffle | Bin 10073 -> 10058 bytes .../dist_train/src/prefetch_parameters.png | Bin 180176 -> 167376 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle index 067178972219e99add6db5a82db0f104d3517862..c1a59b901745d81add42328b9995408d32d8127b 100644 GIT binary patch literal 10058 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ν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 Lz57)N1@*rGWhS<+ diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.png b/doc/fluid/design/dist_train/src/prefetch_parameters.png index ee54c35272898e0487c1193a85b204774811874b..433ea3d612b51f325c8f87a58bb35216667910d0 100644 GIT binary patch literal 167376 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 h^E{{WRP9UTAw literal 180176 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�AbxHKZxMCo&&Ojg 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 Y@u9GY^6=g-i}2r`T^cH>J50R(7s7Yq&;S4c -- GitLab From b382747396e11bae1b38f7624550e98e7d58d39a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 14 Mar 2018 17:42:46 +0800 Subject: [PATCH 0011/1416] add note message --- doc/fluid/design/dist_train/large_model.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/large_model.md index f82fa6f81e5..96895821307 100644 --- a/doc/fluid/design/dist_train/large_model.md +++ b/doc/fluid/design/dist_train/large_model.md @@ -11,6 +11,10 @@ the gradient to Parameter Server to execute the optimize program. ## Design +**NOTE**: this approach is a feature of Fluid distributed trianing, maybe you want +to know [Distributed Architecture](./distributed_architecture.md) and +[Parameter Server](./parameter_server.md) before reading the following content. + Fluid large model distributed training use [Distributed Transpiler](./parameter_server.md#distributed-transpiler) to split a large parameter into multiple parameters which stored on Parameter Server, and -- GitLab From f839e91b04105565789fc5fb28b5934c2c79de89 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 14 Mar 2018 23:54:38 +0800 Subject: [PATCH 0012/1416] update by comment --- doc/fluid/design/dist_train/large_model.md | 52 ++++++++++-------- .../src/prefetch_parameters.graffle | Bin 10058 -> 7340 bytes .../dist_train/src/split_parameter.graffle | Bin 7812 -> 7054 bytes .../design/dist_train/src/split_parameter.png | Bin 69134 -> 78741 bytes 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/large_model.md index 96895821307..92daa2b52ea 100644 --- a/doc/fluid/design/dist_train/large_model.md +++ b/doc/fluid/design/dist_train/large_model.md @@ -1,44 +1,48 @@ -# Design Doc: Large Model +# Design Doc: Prefecting Parameter From Parameter Server ## Abstract -We propose an approach to support the large parameter. -For embedding layer, the parameter may very large and could -not be stored in one trainer's memory. In this approach, a Trainer would -prefetch a sliced parameter from different Parameter Server instances -according to the input `Ids`, and then run forward, backward and send -the gradient to Parameter Server to execute the optimize program. +We propose an approach to prefetch parameter from Parameter +Server while distributed training so that Fluid would training +a model including the large parameter which could not be stored in one +trainer's memory. + +## Background + +For an embedding layer, the trainable parameter may be very large and could +not be stored in one trainer's memory. In Fluid distributed training, +[Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small +parameters and stored in Parameter Server, so we could prefetch the parameter +from the specified Parameter Server according to the input `Ids`. ## Design -**NOTE**: this approach is a feature of Fluid distributed trianing, maybe you want +This is a feature of Fluid distributed training, maybe you want to know [Distributed Architecture](./distributed_architecture.md) and [Parameter Server](./parameter_server.md) before reading the following content. -Fluid large model distributed training use -[Distributed Transpiler](./parameter_server.md#distributed-transpiler) to split -a large parameter into multiple parameters which stored on Parameter Server, and -the Trainer would prefetch them by `RPC` interface. - -### Split Large Parameter +### Partationed Parameter -**Distributed Transpiler** would split the large parameter -(weight) into some sliced parameters (weight_0, weight_1, weight_2) as the +- **Distributed Transpiler** would split the large parameter +(weight) into some partitioned parameters (weight_0, weight_1, weight_2) as the figure above. +- We could use `round-robin` to distribute the partitioned parameter. -### Prefetch Parameters from Parameter Servers +### Prefetching Parameter -- `PrefetchRpc` operator would send the rows index the multiple Parameter Servers, - and then receive the SelctedRows. -- The different with normal Fluid distributed training, we only prefetch the rows +- `prefetch_rpc` operator would prefetch the parameter from different Parameter + Server according with the input `Ids`, we use [SelectedRows](../../../design/selected_rows.md) + as the received variable type. +- `merge_selected_rows` operator would merge the received parameters into one + `SelectedRows` variable. ## TODO -- Async Update - - To avoid slow-node, Async update is important for distributed training, - we need an design doc and implement it in future. +- `prefetch_rpc` operator to send rows index and receive SelectedRows variables. +- `lookup_table` need to support `SelectedRows` variable type as input `Weight`. +- Async Update, To avoid slow-node, Async update is important for distributed training, + we need a design doc and implement it in future. diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle index c1a59b901745d81add42328b9995408d32d8127b..abbb7089829709cb5fdc337b7f9521a34f7d131a 100644 GIT binary patch literal 7340 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 SIAQ+w>Hh()#a3&Un*abY(xtKh literal 10058 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 W^`*A*;iCELkN+QyFaDe9fdBw2K%Nr- diff --git a/doc/fluid/design/dist_train/src/split_parameter.png b/doc/fluid/design/dist_train/src/split_parameter.png index 1776fb8c4eb0f86aed1cdd67f54d8a08a4e479ce..d311c414a72517205545649a239882bdce3480c0 100644 GIT binary patch literal 78741 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

o0oqNL~|h~I|13=pNSSXi%P6wpE5H;Bsa40dA? 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 literal 69134 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%0Au}eVk~{6{Key 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 Date: Wed, 14 Mar 2018 23:57:31 +0800 Subject: [PATCH 0013/1416] update by comment --- .../design/dist_train/{large_model.md => prefetch_parameter.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename doc/fluid/design/dist_train/{large_model.md => prefetch_parameter.md} (97%) diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/prefetch_parameter.md similarity index 97% rename from doc/fluid/design/dist_train/large_model.md rename to doc/fluid/design/dist_train/prefetch_parameter.md index 92daa2b52ea..ac56502c280 100644 --- a/doc/fluid/design/dist_train/large_model.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -1,4 +1,4 @@ -# Design Doc: Prefecting Parameter From Parameter Server +# Design Doc: Prefetching Parameter From Parameter Server ## Abstract -- GitLab From 5948fd27170d91e2728e9366e9852f32dc17fd2f Mon Sep 17 00:00:00 2001 From: Abhinav Arora Date: Wed, 14 Mar 2018 11:21:56 -0700 Subject: [PATCH 0014/1416] Refine the prefetch parameter document --- .../design/dist_train/prefetch_parameter.md | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index ac56502c280..e8ea7fe67b9 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -2,40 +2,33 @@ ## Abstract -We propose an approach to prefetch parameter from Parameter -Server while distributed training so that Fluid would training -a model including the large parameter which could not be stored in one -trainer's memory. +We propose an approach to pre-fetch the parameters from a Parameter Server while distributed training so that Fluid is able to train a model with a large number of parameters that cannot be stored in one trainer's memory. ## Background -For an embedding layer, the trainable parameter may be very large and could -not be stored in one trainer's memory. In Fluid distributed training, -[Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small -parameters and stored in Parameter Server, so we could prefetch the parameter -from the specified Parameter Server according to the input `Ids`. +For an embedding layer, the number of trainable parameters may be very large and it is likely that they may not be able to be stored in one trainer's memory. In Fluid distributed training, +the [Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small parameters that are stored on the Parameter Server. Hence, we can pre-fetch the parameters from the specified Parameter Server using the input `Ids`. ## Design -This is a feature of Fluid distributed training, maybe you want -to know [Distributed Architecture](./distributed_architecture.md) and -[Parameter Server](./parameter_server.md) before reading the following content. +Prior to reading this design, it would be useful for the reader to make themselves familiar with Fluid [Distributed Training Architecture](./distributed_architecture.md) and +[Parameter Server](./parameter_server.md). ### Partationed Parameter -- **Distributed Transpiler** would split the large parameter -(weight) into some partitioned parameters (weight_0, weight_1, weight_2) as the +- **Distributed Transpiler** would split the large parameters +(`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the figure above. -- We could use `round-robin` to distribute the partitioned parameter. +- We can use `round-robin` to distribute the partitioned parameter. -### Prefetching Parameter +### Pre-fetching Parameters - `prefetch_rpc` operator would prefetch the parameter from different Parameter - Server according with the input `Ids`, we use [SelectedRows](../../../design/selected_rows.md) + Servers using the input `Ids`. We use [SelectedRows](../../../design/selected_rows.md) as the received variable type. - `merge_selected_rows` operator would merge the received parameters into one `SelectedRows` variable. -- GitLab From 1b4db80b10056be045702fd4a6078bbcc5a36db2 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 15 Mar 2018 18:48:23 +0800 Subject: [PATCH 0015/1416] update by lookup remote table --- .../design/dist_train/prefetch_parameter.md | 37 +++++++++++------- .../dist_train/src/lookup_local_table.graffle | Bin 0 -> 11311 bytes .../dist_train/src/lookup_local_table.png | Bin 0 -> 303842 bytes .../src/lookup_remote_table.graffle | Bin 0 -> 10636 bytes .../dist_train/src/lookup_remote_table.png | Bin 0 -> 290825 bytes .../src/prefetch_parameters.graffle | Bin 7340 -> 0 bytes .../dist_train/src/prefetch_parameters.png | Bin 167376 -> 0 bytes 7 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 doc/fluid/design/dist_train/src/lookup_local_table.graffle create mode 100644 doc/fluid/design/dist_train/src/lookup_local_table.png create mode 100644 doc/fluid/design/dist_train/src/lookup_remote_table.graffle create mode 100644 doc/fluid/design/dist_train/src/lookup_remote_table.png delete mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.graffle delete mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.png diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index e8ea7fe67b9..952d2bada92 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -1,36 +1,45 @@ -# Design Doc: Prefetching Parameter From Parameter Server +# Design Doc: Lookup Remote Table while Distributed training ## Abstract -We propose an approach to pre-fetch the parameters from a Parameter Server while distributed training so that Fluid is able to train a model with a large number of parameters that cannot be stored in one trainer's memory. +We propose an approach to pre-fetch the parameters from a Parameter Server while distributed training so that Fluid can train a model with the very large parameter that cannot be stored in one trainer's memory. ## Background -For an embedding layer, the number of trainable parameters may be very large and it is likely that they may not be able to be stored in one trainer's memory. In Fluid distributed training, -the [Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small parameters that are stored on the Parameter Server. Hence, we can pre-fetch the parameters from the specified Parameter Server using the input `Ids`. +For an embedding layer, the trainable parameter may be very large, and it is likely that it may not be able to be stored in one trainer's memory. In Fluid distributed training, +the [Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into some small parameters that stored on the Parameter Server. Hence, we can pre-fetch the parameter from the specified Parameter Server using the input `Ids`. ## Design Prior to reading this design, it would be useful for the reader to make themselves familiar with Fluid [Distributed Training Architecture](./distributed_architecture.md) and [Parameter Server](./parameter_server.md). -### Partationed Parameter +The execution of `lookup local table` is as follows: - + -- **Distributed Transpiler** would split the large parameters -(`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the -figure above. -- We can use `round-robin` to distribute the partitioned parameter. +For some cases, the parameter(`weight`) may be very large, such as 10 billion features, the entire +data could not be stored in one trainer's memory, so we need to partition this parameter and +pre-fetch it at the beginning of each mini-batch, and we call it `lookup remote table`: -### Pre-fetching Parameters + - +The processing flow of `lookup remote table` is as follows: -- `prefetch_rpc` operator would prefetch the parameter from different Parameter +1. partitioned parameter + + + + - **Distributed Transpiler** would split the large parameters + (`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the figure above. + - We can use `round-robin` to distribute the partitioned parameter. + +1. pre-fetching parameter at the beginning of each mini-batch + + - `prefetch_rpc` operator would prefetch the parameter from different Parameter Servers using the input `Ids`. We use [SelectedRows](../../../design/selected_rows.md) as the received variable type. -- `merge_selected_rows` operator would merge the received parameters into one + - `merge_selected_rows` operator would merge the received parameters into one `SelectedRows` variable. ## TODO diff --git a/doc/fluid/design/dist_train/src/lookup_local_table.graffle b/doc/fluid/design/dist_train/src/lookup_local_table.graffle new file mode 100644 index 0000000000000000000000000000000000000000..180004cec944783468158ebcacd430e14a4fb2bb GIT binary patch literal 11311 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 DP$N6u literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/lookup_local_table.png b/doc/fluid/design/dist_train/src/lookup_local_table.png new file mode 100644 index 0000000000000000000000000000000000000000..e5719f39e5f33fa0dca8d42c9765b3b5b0dd77eb GIT binary patch literal 303842 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

?G?HtU@uzoMnK{Ea` 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%0Dyg%uTGWzXP{sYxt8{&2c6X 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

7L z)XNqA_DXcV%NyIDJtTsKXDR#nHG~u)jaybPC~$Z|5hd#5s{K|q_ns1^Hc=Xk^q!|I z+`sEE<(`!0k~P&=_dcY`z(;l5Fdw(OTF9Z`hw-SOZ`Nop2hi~Ye|qwd1JqElvsY_O zf#SfwnK)USDwh7tjRb!|G)jeaNS#5V`zHgOc^L)Yo`A167zADuTzRE!#onT>MMY|j zZ5d#u*5-Ytpmx_$V)~JJ3is`@&|iCJ19D7Om#i|J1(jHtEfry|!gc)h=d73A_p0C+ zcZSa~RN3&Zo8FNcfMW3n z6`ab>W&^>q25Q;;*4fQrNQFCBaZn*>yW^n`nuo}I{bz3Ts-^qh=nmiU04MnR3GJcp z=D>_&tU#mvg8otJ-LG<#H1>z7y{@Bp#pq*9f6WAqTj%nhX@y&nhPet4Ctbt6J!+-A z^7U7Jl}&Z4tprp@L*MG@F~|6a7#x0f#&~^>O9sq6IpiR{Lh5Lj#aWP5mP^TXMKxM( zz&)(pg$C8ZU2crD2`;8!9(|z4 z%0A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%0D6iTUEKD86mD}1 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

wOI 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

_%yJS$tS}dIX!2ejp_5^2&Juge13htAlIzz|C zPn5%(VNVy@bG-!Zw79Wew&jAG`s`~ZnS^s6d#Ks6Uo}ZfN_DvV=ahK*D8$)4z6ZdD zcy=XXG(Q1r?x2Ny_L;yy_*YWj*16jyfH%+S#2v8Kk=4hDzX2GGKqdNsmHGS;U&tlK4U|J^|tnz(GP`5g^b(m+9Qu$&1hA3T_eTOzl*S zf)n_7TWJ#6vJQ{oc0Riudro>Vmp60wP^2!8K~}*mMS5{IC*83r>ztE%6>&9Uu$9lUSMc2U z(DL4q1rNV9y)H52!{wSAMr3;Qs};`!)>@%Q#}G_78n;r1ZwpKQgBmo2;w&;6TQ=f{ z3{d4~bo_|)aY4!YA5LXm`mHDtoUhDF#vCN*`g2VCgk`ecZV$i#9n4Rh0fEub0B6v5H6y(wG}@E-yj;>!x6iinCKXVg6pQG5af=26oY%F`a(xhey{hGF zSTGmswW;rJ0-+_lU`d$11l_M4hW~XEg-L@wyOdH-GhT` zK1SITDfr*1mdPqXqaHTmv%C5D z{+7zbv07_!F8*msRN0ncj@>mB6|-xyn)Rt7^5(}9_?jTjJ{%CwI&rEqpwRo-AuD#l z{+J|AFl-uGPm)qDbX3yw0q=`bT?eA?+L7O)R8mrku_{O$eJ*|#Y`uLe@l`-0t8wEl z`xYqRn-AF@=GlAIxt~HSV{cf$;ELf^s_)P+P|Jl9}*)`BcGMk@r>u&Q4Ne}Ia0 z_h%0Vrd)YODfZ$a2wF|bLHsobZOd8CaQ`Wqb=CIi>;^Y(Uy5Wyb^Sm#<;>S{%`rr^ zr#nAf{4kfID=ROQ0n6wk>^g?Z0nt+%gB%%e*WYgikeM~`Y8<$;c4FOe$$UZi(DCN< zY~ay{t~XlC4&h%nB%3fw__*P8K9O1=QXIAy{IG0W2OO}p(jiSF#Xtq)`IKCcIi#dt zQh^}=9UMd_3LGaoOA^+{!d;7{B-mb3sPI@DB1$^^>fwEhkc8yzC_7H$JxZOv4Pgu0 zd~~n1y<*)}+bsP?rE)&v=Pi&P^-evjH|((ghx9$9@}rnMU_r{#3g~TLQwsP13^7xR zHz~m83I!KIqGq0L$Wxkv+6co{wCT>)!nF#0oxExlo=RE=*!jb+i2xq8kd%>!_;m}9 zdiS{#>&e8)EvE05l!xJ+nn;--!R#Zn4qMbzT>Bmi1}+*^9%H> z*B<^VR|ro1eKNv0S%J})X$H(!!3mL@?ieIiyS9>b{HTRUH+K7LAeaDFULV#T zZe!<<6m%v5sQfZn-;l~Rp!SIMG7$XE6B-U_fN1g$KC&;=ybuvtcb8kd=h z_`WcR6&kyL-UE7s_&6WmLf78iw;E*S>_rNoA81mQ5JPSU7<-91&_Ksy*SvrZ)J*fy zy1P=&aPz*87N;~eCx9}?4nm&B_5SG7e`#U~zuvuE@kbiSJSU4%s_Q)I2D%898~Y5r znGsjO>h3$unlHdK#lpBW3KY6L~4%n=sq!PMcw?eg^ zsml;1D}5(1r2psRC^71z&^-V-y@kgTnKmDwZ`0G@_+7pz$4kJp+`)*~_ zBp4E0tD4Iq)bif}-u~3LBmg+ia&sdfMN$`1pXU4(d2_A z1b)snQOZLB(-u#aVym_bO`Z&m&7u3~P8`)o6kQWrKOaMkP6%uc|UmjYb@-{5Jho)YXy zlCm@BbWmaRxnM*FPa2pF?MDV6=@Z5|VEsVtI?i!dEG~@maaZB{Ufdra@PO}I33&kMMA5%^ zU|2Yg;2zipFz%7tt=C_kNFdkP&jA*V&*TxUf;sSPNjZx1ckM<>Lon!c92N=$iVP9H zzLaSld{ge?FIn9rAZn$ynu_7WSBwP=e^ULFlFV&=zXR?UfG@11PeC5LhKpiAyt&l| zR5S1{YUIgHGc4Jseg*`E*mKOdtOV$7wyzEDN|q)i1Nq~p|80l8r zC%b0WY&d^*C5e-oI=N_5RRRA`DU(FC#y^6%XQ@`*`AiNv_bMOhy_Z90%2jjY);uEN zgPtKVr32E5agAU?mHnEOzI!auUuM!n3|G33vi_={t;n`s)84R@_Ub8i8YBzQwBL=G zge1QhRI(NUJNIOkPm9f9C+5N3$p6WzncPA168-_%oU$8$pulE*cx)Z9xe56ZKS0I{ zXss;di!}=B5DxMS6<#JwE+XM>diD8|sE+JeK|}b%YY?EBrO7^_<|RJy1?oqueb51_ zWL1fzG8itP98$(5ma|v#3Phiq<%A?oB1f4K#l+H4F#~Zcv0KQEjjW#kA*~g`d{1aL z|1fB`|)LKax=J$whF?L!$!L7 zz(yDAQ`dF(Vs5xV|-J3t9nOyU|$LFZ=o#*fOIDz4JK$f)2KI+=9 z<@j`JU?~ql;czor-jHkAZbXJ_C8eNCO2D&5YTm8iJ z;xI}qxXD$?Y6*H;(x}Az5BZu2s?%@>sR#IjL;Mu&B}drY7NF>=olIy@kP@aD_fj{= zopZhnOi_w@e*U-Em1Ur7)0O!~?kVL`N?2Qm`>d_h!OiQo#T9rx*xbH1{OK7=FgdW` zHgg9=q*l_>O!JwJib|!)+q9L=ZV7f$Vg$c1xcea7fvLnq4Fwdqr%vS^X2Xu zJWNF88d*6p=%5A-A>jQ0Mrvo>EVxze^L)zy;6m`Vhej_#aSR&1McY-y^%xu2?x9s< zp>xHp_mFOM`cs<_@EY^19>D9c73j_~kNJk{=XSJO2@N>Zd~R9kOL#zu!m}?;`+I)> z^=qQ=pDkQoZvp4unfp4trRAd1=}e|hx!DZSt?E(@S7NZOq>NYr-(qdF|B1RbvND_g z)JlMRl_IP$Qi|b3JN@dnVz4%t?K%I?rRm@Vx5@W|^UY2x;PhSOy&0KLKGfb}4c?bp zmLNp{GVw8o@(slG40SsW<9gxJwk{4=7Wpo_NyAg}q37s5F$1rAgy)vd%`ucUA~*ro zfWU(c(xz%Cu3dTleeHs=Onf4X>X|^T`5i4I(GOv8f<@Hfp5Y)!r~WSr2D^ZUw<3H^ zYgQ@@+8CmmGu>~t-z=@r&eBIQ=6R4 z^TCP4NPFb#ftdLchTkM2%hlK3aCP`H0W&RmZbqd59yH7oWhP;<%Ph#MHqwA;*WB2& zUyS~Up(r2^pO`TidX`-A>E*PT_4{xAo4?an6NltTHD*;@9aOz2L1>1`hg{TJT^G)NS5Az3r z29$iZ7w((~p=4K)h8QuDcG;H)XHR?3^#)~2q2}YU2+(;ID6+(DGiys4oGtFHkzZxJ zR^nT*GLSyoG5N_M3t`Zf@g~z_sqK>!j@SA&6NQ=(Sf;ToBuEov9XNrQjamr?3IZ3O$DsH{%7~ zH50hsWkg}Cgc73?I)h>t%xaSD32=0%CA~Q7>yC5u3I9%7k0D^Oq=ZE|nqA~G*mPRs zcwxV`fiSL)Tg#@XHqYL2@t>$NO9g2XcCh(|Y-{DXx-%a0EL`kwOU00tq-?ttKto0d ze}4HF6`@Fl`RAvL1vl(s*b0DWJuKnpI`@F)iQk3|5kkjp3nXza=W!{B=V+qOXxoGU zG(KA_1sI2FMBr*+#Mjf`kZA#fk6Y%HL`AJn#h~hcjI?)(drb`@!y)7j9H;LqGs+SW z7yAR!&2ITX7yll16>LD&zK-%~@wysySCEc`Cm4nrq0oq<9nj~9-}&C~@F~7f=*js^ zD(UEY*T)salJM3m_86-|x%+!BBLj*y3i2pehxR}*dj!3xzo{um$RN(FK*r+s2XFf9 z29RbGbD`j_%@wddk)jM*jFk;M&!8w>Ans0f*W`ZVj=_o(&`RBkRVtsCwk{b~&PW97 z-B}vZK?&9=D1;zPq~J2>Du$+0Cdfg=1&z#EKHGC39Y(y;S*7Hn8&P?^cgZi`;+RTI zDmtn@*jDnbLhjo^;yLZ)?I{(X{lmxBE=K1=Gn(IxIYg4LIZd44&mBY+dLjqWuU5to+~;#(2OLK&|2LpdQ>533t|W$7I4}=AFiP2Gv+WDBxlP zhk$Qm^GVFx_??iRp?uvk0e*NEVf<`rjt{12Xl@l^SvqPx9z$@%yes*aH8Z6}8pO?J z+%{eDXQV9(!I98b)3OZ61w7f=epf;Y%uaUM*#!_j1gKIB7HOB`F}HFdV}+3r10ca2 zKnLMgep${-_^kTkU#J+mXqH8ImYsNZKu!(|@fS8hO#l@n`$B&GHCt$0IGM45tKgm? z&iw&RNaOS%yW>;?*CTf*(NFF}Z!${I;Pf{7O)u?!-N40cxx0a&6AKL_JYetueQd>W zSbT%|5FqLB+j~UO3p*rM0%G{|LsbYSEWQJndtaEL=q0@(%R68f*5SA&-#Jb_Mz8YM zNuioJ*O%c^SBX~1MrI9x-)#vArx-h9J!4@*R}*Q0ABzFPwwxkxfh;q4qKnIo5Tnz% z;&Z?c6u({7>4T@BfpfNN6=Qy@ln8w%rt>|*keX=+F>oMWySuq8$&a=kOa5J$MQns3 zQi6!H)9vAlZ_tf&l%gp&_+|Ev zZoVqbHGT@G7=A+JarmM^@iZ6uA)sKH3KO$tAu&OLy!cVOT> zk~V=U83_W<0Y?LnV&7egHApi78SNTkM~{JHeQWHMo(b|%7|qa>xcRUo&yylI za3od{g0P>1)Be5rZSy9{qCL1zlwvy|?Knbr4TR5#nSPo;#rONc7hOX2tHmLhk{lee zJn|FoqDbCv!=59OyVIYy;J?oWY8*0KJ0}fnNz~|ZX$MjX#C=z-ENcM1nWNP1c0kj2 zKK#)T>A%bSbjB*6n55*}?iZLI;dF&4%t3Rba$}j#7ww~PB)tK>+RNApQ06+oY164p}m`d`!SJ)B~F7_K~3aEH=(X=WWk3&yHW z)j5uzi{M+l=rgbo42V$>-!ex{%6_;xB2)AHyA#wQ*Em9Wxbhs>^Q_PB1iatS*)IRtymq3 zx9I(?51NAboz2s|=i#*S20qevO_gL&LYnX=ZjnoIjk*B|hI8RQ)2>g!?-ZZ-p(Gx9 z-f9`@zW_ul0i3mENDP?qab#-U2bOi?LpU{AQ1B?MObkWwAC{E#JFvo~L0yye9d18} zw-Uz+X=bV0N5@i}nURb@u1}@N4kRvV$^;cSrKJg7l%jw4Hwmx+lB}ibfcbImB1-&1 zA|?HZM0J<|x02}`1cXeO(_L~`VhqR3?Zk?3D)vUe?AMsK&0OcMnI!UDF)dOD|&7nB4IYqqTL0XRB1%A+Tn5>PGkzbP4gE1G+j)=;H)4s zm{uD;X6q06i9atNTIoH5jja*#Y`h;f8=7Ej9SU_~qA9-aKkXKbedvr(WQ{cvwYoJ4 z=5V7@8n>nw?*OBMHv?4XjI4gUjaVaq z=SYDkJ_*%cY%2<&Va4-xJuB*QChLl4WlBDGrbQ9zplpt81LwgxmFeuTu3m(M%}Ecs z!1X4$($beL7kyw!R~iM4~X14 zD&D`q-atxN8Z_SvN|WyQnbY{pUa@0|63la;WN0`EjNm^FCh~w}aoO1q*4{b;(5KYO z|895h3q)Skfa+_5hVN90LQoJV7#tfyG2nPH1H+ranS#d0Dsxb>*)V_XQrB6d?t*a% z!eD8fZ}roYL<-}Uqg=m(*3G3gKbPt%L5UV)3St<1RxjBeg8>dOY%&aT73OV6Zk;+S z)UX1h^&~a$L+WUc>r2a_oiliRT3_1| z&cy1_a(GZreZCLDpz3ww=w=#z-BN(&v!p5BreDj|<%U|R&Q`XMRM>xh#8Cn zJX}oZCPJ4$-nQIM7a288^w#>?>Q9i6r}JLDHQ$M^`r$V@6{Z3NWT4jnUHjq;?&ql_Uv@&v5*iIi+z42! zET{KfN(#Dd@ba$jg;DHvSz_tF;Xpw71|nO&B3iZSCnDTk9JqPE0!UR7=r@f}+{Os-96eG7?WT!u1YwG;ED6x11kU7`TgeL zhseK$)v3f-q+_+7By6Fx&Od7)4LNgt?fTG`F^QM|79D;FqgueuD~eLARA!fN=GVl4 z@yKR-amc;EJ8)2F?Up#7`9(hHhZeN06|A?LqE^0)VXFy9wkxsO-C6_+4gr9i1s;8( zXp!<2CZ;|`&S~jv6v==BZ4)akBE(i-aDHfKfMSS3^qk1Sfcfid2ayR`PYyH=_qKG0gWx+$}qlx(SJ<#@oYlI|%(`wcxUjAp?)5P2|J8-AccpCEm8K4A9GuMMm;}UXVuuDx|Fr(XwdBwZ+OlNp32x?y2n-? zV&311}!FC2Ajo*><^+S=CQUn9i-cfc&^iWj3kQyM*c=< zVGX;CqzAb^9LXL$DH%MB5=iX#pODJ%4@5$R2(L0=5df{6iLBnfH|1@CLZ{hT8=7_>h8ewsXrzkjvw zc8by$fW_iSXayC~3R+m*8e+V6^MCK;zYQU?c2Iu0()4Wm-S*GD0KutOsMuOZf3@}e zazqtsS>OTiK$Eu6W!&^spk%&(xyV8Rqv3hQXd=Nf^^|ZD!thg`%?QN-p>sfdF5bQE z8s~(1TW!Lj@)6t|E;qtPvc=BYuR@29EV0#hO_$6kMX@HpK8oi_`BcSbkov#0lDhr1 zo-d`(<4*U7S{RWb)T4y0u(|JzP6nA3X@kq8L0ue!pZ>Eb_jj-XdaQ-CW@u#PGLw%oaQgGMX^eG6Vy6nhug1&BMy-Op$ z0G-fXC?P-h#*F{7f~>OFLNNz1IpUDac(FYM_cXb$)Uz4~PXFKVou@GPfm&@iWvTyu z%-o}4>I6Y~i#|R#?wY0rLc38G%c~L6%oo5z$9UeqT50wNK%{y8TN0$Ntv&$5vDLJA z#;KQp!oRy8Qf`UQXH?LD47iAm5chFY)N%gmHK#;U6uQFfUM9I?J)O#6pZ{xsB2yEq{lM9^LCzOx(*+BGPvQ9|T@4<_^ERxKg_G*9B zCPz8iPCiqGb+1=k^HH#C`uUbqkhPeTC2Y$sy~DibQe21WI)|H+or!X|Z&xgqeIW3g z_Hbch12&YulWM(dHN}kzCIfO#{K6AZ4Mg&x;P#=B3zU9&-lw4}{Zri^H;q*!jwErV z7*$OdJG&qY;le{o#r?iiOHxyiN5E}9WP?v;7dN>RizmoqTC8$9r#c|d1qhAak;923 zU-ER-fU+c+?QRxso?`k9s~pBVTh;wAw(QFDPh`72i<)R3RIn^)0zNUI;!(@iGgCps zMplhEctBv5f6*S7hMorIUA78aKTyq<%3NjVR$>XBNk7jlnmN2jJNeAJTE94I zDlVt{^ywalv#;Z?U6F-!x2w98^v}uP>1LIm&3hf)YjspXY>ifXfvvzPpVgA)wjx4X zv42?!kdI9lN*0p)nu_Hhc5`Au^)W)zNj2IK19jevxFbJ`$$IyxdT@NqIxn(U%qj_I zifLyn_IR*k7#tB%(X=t){bh{AU{9R^VN3LJtYRNPelCRS-9Kgn_OwG<1kbGQ38UYa z=8bN>8=E}C(&+r&4Vd)kiRF~54~%!!JM2*=(q()bvu!kw!wTnt-Ig@oyl*~>h9`MX z=;F696fDXRtSkT+g53+P$J~rAvEyLGtrGgRn&S*@9(332s>rz58%zAGe!Z88EojE> zlRYpEYj4++ROyp??A0>Y=SY}>61CDUpZC9Y%`oYmbgJkcO;2NCkk`;LhY)`MI}5nz zOOp1lrP6dV8@%|0CcdveJ?Q`B=HwISbl)zHDc_*~$XW}Sq8a=*1oC@Cg0XF?0^4_x2seY1q2aQ(jcgx~cBJI#l3bzK@;l_89}lCi zjKVzjYnIty{>dMls`Uw^-1I(kxCtk&oIZ;io(-#oUI-U}Dubl5v&5fORf=E=DqGz9 z2O(r(D+=fX9<6OFoeAJVdx-Gp`}?=)%vvS0vI(}&>#vPlN%fKULH=2>x|FSB=l;Zr zMl7kB-KV+z5OR5L)~ZEzuK)2nuo zR%>+AL^Rdi20DW^S&SX%Mf!Q6M}uddJ%+6ebrN=js@2GtcViV=hh+M3TH=v*`}{j; zU7JlOPP9!+7W|pPqC4PUUYO^O^Ha5*`^i+%0X@At+R^G+Mw9F^AFlZZ=jFMRMw%qs z>>j&I>UNqLpFkkUezQI)hs(zXdocU{^2^sbBiv_(c#Ll>M`YB;^~1>`;b3I=2T=Jl z$^O9}deN9LSbK7;2WAoGBZ=Ms>n)Ek0U&%h>;ycSm=-6(P@8S%u7{3L${y61U2(x{ zy`;t-x1lXYz_eSSiDJQ%>V+=&eK`C9{@&np$TzMk$eUK01OAL_>RB{Y_OkO z2!r5PFuiWayt-z#1ZcY{$PL9G%ghc!Fxegm`B3?FM*`>5gQ}^)RS}-y8ny{Q4_=+S1CGvOe1IO>7udwYl`V20V9P#JH3b%Xm_Co zea*AI3xYH0m4G@BdW=AMj5$A65Um($D@;RI_xi6p_q=W++vs=)1 z?Zp2CwZhKk%eR8d592T3W$qi*T$AZueVnCt5>H|q02YJ##d@7o^5rvB zat{GctAaEOfRbUw1!i_!-`=RqR35dmpxTx;8ZH6_=Or}l@E(H z-=8}#hrj+>i{?ux>yz-N$>tlMZajM>#b$re%iwGUGRThsUg-7pn$$Pg68b;&XYMX0 zvHyM9YyiY6d|TYVyXx?Y5BH5#z#L{sL)=)&!TxH)OAx9sDo9;$g#>~=@fdzHoebNn zj)bu>u*xhi*jwegw5X#2W}#K%M-iDL}wU z4gfu{0(Ld_30Tv;kKtnvHfUN&QNgvvf33FM2BIL~x%jhB-`>vNq*ovtGHi5R83aFA7D zk3$ka{r*nzQh+Bs%yVF_CXS(3k31&D5Uiiz?;pwljaJ)ep+2Gd^3=_>h=rd#rrsY|N9*neaRGE83O~zbbmr(NnbeRxF02#kMW)eLIJAoq6dat) z&dV^8^(m%s@EjSArZ7)aO0*BANW3l;!T?vE&zNWSe|}T46Jht3r)<#Tcl?`K z)v`8;kb^STx5PgqZ~I>`sb9M(Z=l_fw`aw3>Ok0V`*6KH?<4u~*IErBDfYf-OA(a> z4)>=c{GS_1H!tsn!9njKfj+>4N`Emn>6km-*V*>Z6^qshy6x~n8BF$?-Z$^ z6qLU{*lZUq)58%u2QJxjMP#3Aw>UaBXsB|FiL-UqKi0n~~r`?%-3_8Ks zSQ?4U#~e0Mz-ngOb@}(KyiE0c#R+Ldu)8_>)JdlFz9f}9@H+JV8mLG+xPFOD4!vPd zngoyc{*JW|(N(7!E>Y6KW+;_V2$i&6l1%2jU%WX(FJcC}B8!JF ztKO0&f2pQSPjEcy?E!y(#@4|*2 zicjC3MEW5n=m0XBQw9Gc-g6-fC-0t0AXu#Rpz&SIQl6n1!JOJVh*NCUrCfb6d(9Z2 zs_y_vLVY~|L$m2qJkkvBjR_LhsDc8O;N_q$riKW%%k+d^5Z;}ECx4^GosZYWj0hgoXx9ou7`$15VfX97X#Cr;jC2AxYUSu4pDAXpe4vRin!jumw zSyS&b@*iA3j{1l#brr^lIIIKZO;h{*{G_($#n zK~1uwJKk-!5213vMdq-li^6a{xd(jAOz9j zt%(c)ejkC+uC<+I?q$jXS^MelhvgI|S9eM{_@&rETb&kl#?#h6mTEva1X{@~%yHMW z<#4o>e)s}u#N^2-$4&t3eUj#8-7fSEU`1~axz}Tpjex(x|6&L041jI)gNL8oQ1eH+ zf~_Fn-+9CR?wD{pGTYVUCmL)ft5s2N=+t`M?6usd_AYt?kb9-{a?Sa|=UbA`;p6yV zdQbj;6!9o2mXx0ZfHD<_k&@ybNnD#nm?cg+uw{{(50aorf z>OwBCH`v|G#+baBZP1Y}W8i0j5u!*18nLMydss#Tf}TwnB_t>mZY^`lZX>ND1+sq} zI%9}%Fo%Zv?)T3e!k;-swaouB&rgjRLB`Q#%YTc&-(R;_f+#H|y#a%KR&#qT3Hc1i zQfmItkmJffk~avCQ8OazO=dgwdA4{8?JetpdT(}f2y$p(E0Kzq+szNKencELlR@GT zMD18u*lQws@Mqu>^CbHXD2^6e3JN$O&xRGaRX_MF#x<7ys|Nl3?RT(nu}hoTPX5Q% zUICpsAlkbXjDjh}E-gdTt;8D)7ee-P;P=^`;`Dly8FdH>#2|XcA4EoQM1(Mbz#S&j z8tQgCq)#{zd2&!8kM9#K!XS-vA(E9t3&B zuT=9*|HnU5!PpFCy*0f7tplZiIuZiaMH>v{C{^|b?}cTpRC#9NMKlB&Jq2mi|D)?Y zz_INAH(>7Wib`2Ulx`!VR76%*wj!&cj3S}zl@X#z*;EKABa+Ne63I?Rlv!D2gsen~ z_q=$XUp@c#eUIOLboA@!$#q}X_xglO6_ zgb9M}i%E9&7o^V500FzeTER-_i_+h$_}=~9R+KHrGjec3^2B&7qllOBt~d9#@t?Xu ziE@_45F>)*42`0U2Hj& z`;*O>gy!69ezxCrr2RWqDV=cteDh0RSwe+KWJ4z;3v29L6}-g+ZQ8Q8vP}Z)4VbPK zfMdZ7sNzJUF1Fjf>eoG{KW{sZ=Q2FAM*Ex1s(A%}yz$?O0tY{4YV%~#4W(4G zek|Hu)5_2Er$)v+o+zE|-G?my zzMr9-+K>`D^`Oqhowyr1c)4!T+xrC#aIf>IF0A*(K0KC_oWc9hiNTks_WT3wtzo2EUqzFnQAp+516kJ*6vNb38+4hvRe~766hu_o*2E^3cxxkB~4{t0z>V=<2!4Ss+pmqN6;$zsZ zt45rQ5<2oT*Kgj_!^b>yVLrgKN!(f8YfLL1%3VY(zTcC8O^1q;@~+D(kOAa(U0OFk z_G%sY#m6xb)f6#x7J1d(_lP`T|-=NS$~3$C*qQq z_C-69bx+Ky!(Pf}2C=x3X9Qia9rM%8=XWF39Vz;#uP`u+`jm;5rGT4@*jMtux1i@L zo@2q&=G_Dn%%9A<#q4pu3T?Qb<{RQ~QA){}H9Q5@^46cw@WJagtAN{6#@U0x&yFB$ zyMxAB8%U#^1OJTiH;V6XfVp2V^e}D3+D!$xYxq-w$EV$u2in!4Fh#_bo8q^s9ICqe9C!zQiXqFx}Urt1Lgw|Lmf{hQLJ zX<}f8ykgy)(g?eeR^Ztvz_7XEW0p)+Ibm}EW4M?U)Fjj#QtmQq`i-gCdUDzj<7biY zpy}Jfi}sh3-wNeW>Qq}~jeYz2I;X8>cEj%ygq~P7n&Om1-U2Ngi^j_00<+a{PwYub zXE~Ltpko_-@yj-+1vz}YW_yOvH+Sg3JFhL1JCu2xOA@xWuQfh=ZOh@?$7W55I=T5o z<=?DgKMT_B?}JU1t+0~(=C*?KujC5k{%Q#nGD28lQ_C4q4yE@fJY*t;ceGulh(YW( zhK|pH;~x0neNsgP`Rk^DVDIblT{n00PItt$F}ij-5DjTlqWY=rHk>i%u1p%fFLC3a8tG`6ulaK0>N;m>{T=Me6s!tS zd2?_02fx1RxmONuo1DMC59I%yCj#k^j9vsW!M9iG?pf|XT$i_w80(|VA9?tnGKLES zs0rVLv@#>0x%^8y;ObH#p+HH4Q;p0ofXS$Mrx9!mvu<+^FmW6LV^!L|%jZYdx596- zef=X^G=qa-^UiSOKzg_^vzbn>{3&`c1ml#>~{V6ebpK8H*bwBApa`?sa zBVy;jL|O32RZf4t<-!$mhy>cv-gQ^N0)i*X@avpA@xQ?|`3ikSm`AQze!sifbP_x2 z_qe`(v+(AiKi?8N0BO3G*=$g_eCF?mPw(4Gu}7o^6}avBJlB)QP|S%9@2^_bC)2l+ zd{9G0d&+XUoaF>7Gg4sY9sWBtpqaGRM6mb?T+b|W`Ff;pVg2?ak$PRrMi#27znVz= znD}%-&H#n3LHKtjhM!~Iue^`9Yj)>uU(?T(y?x6v!x8m2^XT{V;p#K?-oP%(kc!n9 z&;=lzip(q>8@BvZ%z$@5;QTP%?_J%3Mdm}TM{JhETr97k5~69a;kf-}SI$6z8{uG zv4Ga;V)Nn7r#ZOsiRXAv3dB7@`Mx!?e?e@P#e;Q^o8cbpNwdALL6>Hpmab(&{oo@A zGjMq=+h*^(NoetH_SNssp}T!4^f%5jeC&1uK9KEjJ9M?_u~5tnt>Z8ejf|Ej9g<~D ze0gp~-1khG6-OAt(Q;R2lJX8cHr%+S5|o~DA0y#23g``H<-*lBMZBr!uhI;)Ox3kg-&Ced%j&RQlm5d>g>u;2qB=NaYyOL1y_F zi%;r4GK{#RvuTbeNqx0>1E%8ZQI0#MPotl6Ty@GYYa&)&YF>YX!L1SIV!oUB@Gkco zYOLgxcs^Ue39W6bD)Ntc^U8M;h zR^^sF@{Zh75X0_d=p(+%APcEM~ZpPqa06|ibIMnvkjK7)^-*Mj8&Z`FH_UKhEW z&)x*u>^SMcF&LK4JNYau*qv>~NML8MX1AfH@w!(}k7l32sPKlDj=^~8x-kk4cuaq3 zQ&1HB%;de~_$OojpPg>=!U$L)7L*AdP7vRmtO0s0^Il8Oj6P=+k34z>r|NFq7cq)tIuQg{pA=@ zuu{?ZBJBn|Zq$zm15e{4s=%2cbRM63;*DWGQ zqxI*f%U9nGh|}EG#d*(VFArYvZ`>yH`|UXDLMfih{Rwrr4ng5!IzRa^P&TG02ax$OIvl}&|zYciyEuJHHgX<~?j|MR_p;S?xB?nrt z!Q?JZ@wZ!#(>bFRz#xufxfr}Rwy#4Jd>djX>&jQI>9phTg=HtpLWI`-&^UNJ+svOU zsj|a@@@zQ$MDaZ8hd{-gYCeVj>eD4om-%S)zQ*K*cza{OKG4(|TE%B0#_;}5GZoKZ z75bK(EMn67=R>~&r|1>cu?PR_c<~!QY3f{qsdT^%Y?UW+Ejs#13 zM`&V4!-uJ+0E7Ap+~d$PF;)goF**5k6Xt4(m7&3z$Ytd+$(nch3fgE={>3) z!*5Mvss`EBuYe(Ene1QiFl{JcYspkBVgB?>ZV$Rg@CwB4`Hvh~uT=7xOvBb#blx@Q zj(?KLrMX@DnLex^{N8xx`SY1*$R~}qWNc{{`6gx_9r{{R@5ldI8zLCrL}1o0%FaH3 zx;=@k_P&a<_EQAMfnQ6lVu8Or2rKpqgrEM#DCJx7w688WAlKRsC0m@RI&?NnUZlqm z*FsQ#uwakat@`n~B&U>&!QS^+9di2p!8qx`lzG?2_pDpr{{2eTvJ346jMdUh@PkG7 zDD_XbGA|w)E8gk{*cnm5ys9}A^T^N-b1;P|+p%720G^Vq=A(i_X+9mxpQbtZh{=@s zPorex(JZ{!`D`+*&6t=DJg~?iR?njjYSo0kCYN5`i1*ftpt@k`3BT%X3S%~JsUzo^ zbYEa&fMq>kkuq%G4bYYQyW{&m_XOIb9HiL!^*sbAIz+**$b=Rw~C$9n^<+kmzU{5C4=?w z3CHv2t+Orie`moW?EmNQho@)R4D%YC>S)zuwr{k0_i(*;{pHX~?qc-7sGD}`)?hYb zV)Qd+iJ z07uK!oGv?%qVoU_%O09~_5Znh{=|uT7M%?fbV?-IulNm3>V5l_;i*BeUZ9Y6a{Ekv z2J8<2(^O`k&N=iZ!Bz~uJB{8Ss~<(d>5k14egm)+6Jj_mH`^DE#*|apphcr_SzWTy zpqUFGpuD%t8k#tCwgufQf;H<7_jm)QS#iNC$9`x3`-t0%QTubQusvJXGxUCKw$5g~&l zKz-A?j3rTJ9|^kV!D~B*GoSVGlqju~9@eDG|AEn*R6Zm4c974G!DYsBgGj{N6vAuy}o`o4&D82f;@Z3lzTZH3;2Wwr?qbT1d3e7`@CrWGN&plC%7lM){XGp}! z9_`+%r<97aweu4$Fb%GTMj~pKVTW+Y;0~j$QY4R@r)G(Un?=mmOayE4eS4n0tuT

DoUb$;_{O>rWM6so%r(+e@?6(q6z1@NSn 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 x{iZbQFiK-SqE@e!lA# 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≫P@ciP{~0@#0F98f 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 literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle deleted file mode 100644 index abbb7089829709cb5fdc337b7f9521a34f7d131a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7340 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 SIAQ+w>Hh()#a3&Un*abY(xtKh diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.png b/doc/fluid/design/dist_train/src/prefetch_parameters.png deleted file mode 100644 index 433ea3d612b51f325c8f87a58bb35216667910d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167376 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 h^E{{WRP9UTAw -- GitLab From 282aa96731d2a23f93f8f0f26a5215fbe809a1a5 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 15 Mar 2018 18:53:39 +0800 Subject: [PATCH 0016/1416] modify the picture size --- doc/fluid/design/dist_train/prefetch_parameter.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index 952d2bada92..b3e2210fdff 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -16,13 +16,13 @@ Prior to reading this design, it would be useful for the reader to make themselv The execution of `lookup local table` is as follows: - + For some cases, the parameter(`weight`) may be very large, such as 10 billion features, the entire data could not be stored in one trainer's memory, so we need to partition this parameter and pre-fetch it at the beginning of each mini-batch, and we call it `lookup remote table`: - + The processing flow of `lookup remote table` is as follows: -- GitLab From cc1e94931e1b4ca18219df2af7e5743882d41f07 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 16 Mar 2018 18:56:02 +0800 Subject: [PATCH 0017/1416] update figure --- .../design/dist_train/prefetch_parameter.md | 2 +- .../dist_train/src/split_parameter.graffle | Bin 7054 -> 7065 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index b3e2210fdff..7cea942279d 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -32,7 +32,7 @@ The processing flow of `lookup remote table` is as follows: - **Distributed Transpiler** would split the large parameters (`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the figure above. - - We can use `round-robin` to distribute the partitioned parameter. + - We can use some algorithms to distribute the partitioned parameters, such as `round-robin` or `hash-name`. 1. pre-fetching parameter at the beginning of each mini-batch diff --git a/doc/fluid/design/dist_train/src/split_parameter.graffle b/doc/fluid/design/dist_train/src/split_parameter.graffle index f020c0291e99f758f532d2611e72003478656750..db1f8dc2c7888d0f71337142bcccd0faeb09efe8 100644 GIT binary patch literal 7065 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 Date: Mon, 21 May 2018 02:38:37 +0000 Subject: [PATCH 0018/1416] Add an interface to set the number of threads for math function, and set the default value to 1 for inference. --- cmake/external/openblas.cmake | 2 ++ paddle/fluid/inference/io.cc | 4 ++++ paddle/fluid/operators/math/blas.h | 15 +++++++++++++++ paddle/fluid/operators/math/math_function.h | 2 ++ paddle/math/MathFunctions.h | 9 ++++----- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/cmake/external/openblas.cmake b/cmake/external/openblas.cmake index 8af2765f587..4a49a92f2b1 100644 --- a/cmake/external/openblas.cmake +++ b/cmake/external/openblas.cmake @@ -29,6 +29,8 @@ IF(NOT ${CBLAS_FOUND}) "${CBLAS_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}openblas${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE FILEPATH "openblas library." FORCE) + ADD_DEFINITIONS(-DPADDLE_USE_OPENBLAS) + SET(OPENBLAS_CC "${CMAKE_C_COMPILER} -Wno-unused-but-set-variable -Wno-unused-variable") SET(OPENBLAS_COMMIT "v0.2.20") diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index 65db7c7b500..6b03ac7119b 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -20,16 +20,20 @@ limitations under the License. */ #include "paddle/fluid/framework/block_desc.h" #include "paddle/fluid/framework/feed_fetch_type.h" #include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/operators/math/blas.h" #include "paddle/fluid/pybind/pybind.h" DEFINE_string(devices, "", "The devices to be used which is joined by comma."); DEFINE_bool(init_p2p, false, "Whether to init p2p."); +DEFINE_int32(math_num_threads, 1, + "Number of threads used to run math functions."); namespace paddle { namespace inference { void Init(const std::vector argv) { framework::InitGflags(argv); + operators::math::SetNumThreads(FLAGS_math_num_threads); // init devices std::vector devices; std::string token; diff --git a/paddle/fluid/operators/math/blas.h b/paddle/fluid/operators/math/blas.h index dabde43850d..b393139acd0 100644 --- a/paddle/fluid/operators/math/blas.h +++ b/paddle/fluid/operators/math/blas.h @@ -20,13 +20,16 @@ #ifdef PADDLE_WITH_MKLML #include #include +#include #include #endif #ifdef PADDLE_USE_OPENBLAS #include +#ifdef LAPACK_FOUND #include #endif +#endif #ifndef LAPACK_FOUND extern "C" { @@ -46,6 +49,18 @@ namespace paddle { namespace operators { namespace math { +static void SetNumThreads(int num_threads) { +#ifdef PADDLE_USE_OPENBLAS + int real_num_threads = num_threads > 1 ? num_threads : 1; + openblas_set_num_threads(real_num_threads); +#elif defined(PADDLE_WITH_MKLML) + int real_num_threads = num_threads > 1 ? num_threads : 1; + mkl_set_num_threads(real_num_threads); +#else + PADDLE_ENFORCE(false, "To be implemented."); +#endif +} + /** * Matrix Descriptor of a memory buffer. * diff --git a/paddle/fluid/operators/math/math_function.h b/paddle/fluid/operators/math/math_function.h index d4b0e17ed44..8b296b6a07c 100644 --- a/paddle/fluid/operators/math/math_function.h +++ b/paddle/fluid/operators/math/math_function.h @@ -21,8 +21,10 @@ limitations under the License. */ #ifdef PADDLE_USE_OPENBLAS #include +#ifdef LAPACK_FOUND #include #endif +#endif #ifndef LAPACK_FOUND extern "C" { diff --git a/paddle/math/MathFunctions.h b/paddle/math/MathFunctions.h index f3d8b1a39e8..854e4baa398 100644 --- a/paddle/math/MathFunctions.h +++ b/paddle/math/MathFunctions.h @@ -12,8 +12,7 @@ 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. */ -#ifndef MATHFUNCTIONS_H_ -#define MATHFUNCTIONS_H_ +#pragma once #ifdef PADDLE_WITH_MKLML #include @@ -21,7 +20,7 @@ limitations under the License. */ #include #endif -#if defined(PADDLE_USE_VECLIB) +#ifdef PADDLE_USE_VECLIB extern "C" { #include #include @@ -30,8 +29,10 @@ extern "C" { #ifdef PADDLE_USE_OPENBLAS #include +#ifdef LAPACK_FOUND #include #endif +#endif #ifndef LAPACK_FOUND extern "C" { @@ -126,5 +127,3 @@ template void vTanh(const int n, const T* a, T* r); } // namespace paddle - -#endif // MATHFUNCTIONS_H_ -- GitLab From b044724db710dabf5bea23195b599eab3ba46bb3 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 22 May 2018 14:35:02 +0800 Subject: [PATCH 0019/1416] update fluid Train API param_path to checkpoint_config --- python/paddle/fluid/trainer.py | 50 +++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 7da123dd92e..01c40bb90e4 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -27,11 +27,8 @@ import parallel_executor from transpiler import distribute_transpiler __all__ = [ - 'Trainer', - 'BeginEpochEvent', - 'EndEpochEvent', - 'BeginStepEvent', - 'EndStepEvent', + 'Trainer', 'BeginEpochEvent', 'EndEpochEvent', 'BeginStepEvent', + 'EndStepEvent', 'CheckpointConfig' ] @@ -59,6 +56,17 @@ class EndStepEvent(object): self.metrics = metrics +class CheckpointConfig(object): + def __init__(self, + checkpoint_dir=None, + max_num_checkpoints=3, + save_interval_secs=600): + if checkpoint_dir is None: + self.checkpoint_dir = os.getcwd() + self.max_num_checkpoints = max_num_checkpoints + self.save_interval_secs = save_interval_secs + + def check_and_get_place(place): """ Check the type of place or get the default place @@ -97,9 +105,9 @@ class Trainer(object): def __init__(self, train_func, optimizer, - param_path=None, place=None, - parallel=False): + parallel=False, + checkpoint_config=None): self.__stop = False self.parallel = parallel # 1. we need to generate a framework.Program by calling @@ -108,6 +116,16 @@ class Trainer(object): if not isinstance(optimizer, opt_module.Optimizer): raise TypeError("The optimizer should be an instance of Optimizer") + # config for checkpoint + # only chief worker will save variables + self.chief = True + self.checkpoint = checkpoint_config + if self.checkpoint and not isinstance(self.checkpoint, + CheckpointConfig): + raise TypeError( + "The checkpoint_config shoule be an instance of CheckpointConfig" + ) + self.scope = core.Scope() self.startup_program = framework.Program() @@ -136,9 +154,10 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if param_path: - # load params from param_path into scope - io.load_persistables(exe, dirname=param_path) + if self.checkpoint: + exe = executor.Executor(place) + io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.startup_program) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS @@ -146,6 +165,7 @@ class Trainer(object): self.nccl_id_var = None else: self.trainer_id = int(os.getenv("PADDLE_TRAINER_ID")) + self.chief = self.trainer_id == 0 port = os.getenv("PADDLE_PSERVER_PORT") worker_ips = os.getenv("PADDLE_TRAINER_IPS") worker_endpoints = [] @@ -194,6 +214,7 @@ class Trainer(object): # the unique trainer id, starting from 0, needed by trainer # only trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + self.chief = self.trainer_id == 0 # the role, should be either PSERVER or TRAINER training_role = os.getenv("PADDLE_TRAINING_ROLE") with self._prog_and_scope_guard(): @@ -263,6 +284,14 @@ class Trainer(object): exe = executor.Executor(self.place) io.save_persistables(exe, dirname=param_path) + def _save_checkpoint(self): + if self.checkpoint and self.chief: + exe = executor.Executor(self.place) + io.save_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.checkpoint.max_num_checkpoints, + self.checkpoint.save_interval_secs, + self.train_program) + @contextlib.contextmanager def _prog_and_scope_guard(self): with framework.program_guard( @@ -309,6 +338,7 @@ class Trainer(object): else: metrics = exe.run(feed=data, fetch_list=[]) event_handler(EndStepEvent(epoch_id, step_id, metrics)) + self._save_checkpoint() event_handler(EndEpochEvent(epoch_id)) def _test_by_executor(self, reader, feed_order, fetch_list): -- GitLab From dca0b6d9ccc5b770e78a0903839f2ed89d79be58 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 23 May 2018 19:50:25 +0800 Subject: [PATCH 0020/1416] restore param_path --- python/paddle/fluid/trainer.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 01c40bb90e4..24254b4980c 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -105,6 +105,7 @@ class Trainer(object): def __init__(self, train_func, optimizer, + param_path=None, place=None, parallel=False, checkpoint_config=None): @@ -120,8 +121,8 @@ class Trainer(object): # only chief worker will save variables self.chief = True self.checkpoint = checkpoint_config - if self.checkpoint and not isinstance(self.checkpoint, - CheckpointConfig): + if self.checkpoint and \ + not isinstance(self.checkpoint, CheckpointConfig): raise TypeError( "The checkpoint_config shoule be an instance of CheckpointConfig" ) @@ -159,6 +160,10 @@ class Trainer(object): io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, self.startup_program) + if param_path: + # load params from param_path into scope + io.load_persistables(exe, dirname=param_path) + def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS if "PADDLE_TRAINER_IPS" not in os.environ: -- GitLab From 98fb8e58fd4fb91423d414d67f2a2684b6841020 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 11:57:44 +0800 Subject: [PATCH 0021/1416] test infer nlp --- paddle/fluid/inference/io.cc | 2 +- .../fluid/inference/tests/book/CMakeLists.txt | 1 + .../tests/book/test_inference_nlp.cc | 85 +++++++++++++++++++ paddle/fluid/inference/tests/test_helper.h | 3 + 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 paddle/fluid/inference/tests/book/test_inference_nlp.cc diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index 65db7c7b500..98780b6881c 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -117,7 +117,7 @@ std::unique_ptr Load(framework::Executor* executor, std::string program_desc_str; VLOG(3) << "loading model from " << model_filename; ReadBinaryFile(model_filename, &program_desc_str); - + // LOG(INFO) << program_desc_str; std::unique_ptr main_program( new framework::ProgramDesc(program_desc_str)); diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index dbb81462b82..90357f99d1d 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -35,6 +35,7 @@ inference_test(image_classification ARGS vgg resnet) inference_test(label_semantic_roles) inference_test(recognize_digits ARGS mlp conv) inference_test(recommender_system) +inference_test(nlp) #inference_test(rnn_encoder_decoder) #inference_test(understand_sentiment ARGS conv) inference_test(word2vec) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc new file mode 100644 index 00000000000..0d6d0adfb23 --- /dev/null +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -0,0 +1,85 @@ +/* Copyright (c) 2018 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. */ + +#include "gflags/gflags.h" +#include "gtest/gtest.h" +#include "paddle/fluid/inference/tests/test_helper.h" + +DEFINE_string(dirname, "", "Directory of the inference model."); + +TEST(inference, understand_sentiment) { + if (FLAGS_dirname.empty()) { + LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; + } + + LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; + std::string dirname = FLAGS_dirname; + + // 0. Call `paddle::framework::InitDevices()` initialize all the devices + // In unittests, this is done in paddle/testing/paddle_gtest_main.cc + paddle::framework::LoDTensor words; + + paddle::framework::LoD lod{{0, 83}}; + int64_t word_dict_len = 198392; + SetupLoDTensor(&words, lod, static_cast(0), + static_cast(word_dict_len - 1)); + /* + std::vector srcdata{ + 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, + 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, + 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, + 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, + 198391, + 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, + 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, + 198391, + 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, + 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, + 42468, + 4376, 10251, 10760}; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = + words.mutable_data({static_cast(srcdata.size()), 1}, + paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); + */ + LOG(INFO) << "number of input size:" << words.numel(); + std::vector cpu_feeds; + cpu_feeds.push_back(&words); + + paddle::framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); + + int repeat = 100; + // Run inference on CPU + TestInference(dirname, cpu_feeds, + cpu_fetchs1, repeat); + LOG(INFO) << output1.lod(); + LOG(INFO) << output1.dims(); + +#ifdef PADDLE_WITH_CUDA + paddle::framework::LoDTensor output2; + std::vector cpu_fetchs2; + cpu_fetchs2.push_back(&output2); + + // Run inference on CUDA GPU + TestInference(dirname, cpu_feeds, cpu_fetchs2); + LOG(INFO) << output2.lod(); + LOG(INFO) << output2.dims(); + + CheckError(output1, output2); +#endif +} diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 01b8dc0be66..1f5551567c6 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -182,6 +182,9 @@ void TestInference(const std::string& dirname, "init_program", paddle::platform::DeviceContextPool::Instance().Get(place)); inference_program = InitProgram(&executor, scope, dirname, is_combined); + // std::string binary_str; + // inference_program->Proto()->SerializeToString(&binary_str); + // LOG(INFO) << binary_str; if (use_mkldnn) { EnableMKLDNN(inference_program); } -- GitLab From 602e28bf1c30cd72e7378d6dc1071423086bdc73 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 14:38:01 +0800 Subject: [PATCH 0022/1416] use the actual data --- .../tests/book/test_inference_nlp.cc | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 0d6d0adfb23..27bdd5528ef 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -12,6 +12,8 @@ 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 #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -29,32 +31,28 @@ TEST(inference, understand_sentiment) { // 0. Call `paddle::framework::InitDevices()` initialize all the devices // In unittests, this is done in paddle/testing/paddle_gtest_main.cc paddle::framework::LoDTensor words; - - paddle::framework::LoD lod{{0, 83}}; - int64_t word_dict_len = 198392; - SetupLoDTensor(&words, lod, static_cast(0), - static_cast(word_dict_len - 1)); /* - std::vector srcdata{ - 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, - 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, - 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, - 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, - 198391, - 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, - 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, - 198391, - 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, - 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, - 42468, - 4376, 10251, 10760}; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = - words.mutable_data({static_cast(srcdata.size()), 1}, - paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - */ + paddle::framework::LoD lod{{0, 83}}; + int64_t word_dict_len = 198392; + SetupLoDTensor(&words, lod, static_cast(0), + static_cast(word_dict_len - 1)); + */ + std::vector srcdata{ + 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, + 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, + 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, + 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, 198391, + 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, + 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, 198391, + 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, + 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, + 4376, 10251, 10760}; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(srcdata.size()), 1}, paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); + LOG(INFO) << "number of input size:" << words.numel(); std::vector cpu_feeds; cpu_feeds.push_back(&words); -- GitLab From ce20dfa236a0bf874d8580a7861b7a85dffdf74c Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 15:17:06 +0800 Subject: [PATCH 0023/1416] enable more choices --- .../tests/book/test_inference_nlp.cc | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 27bdd5528ef..c942b43f174 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -19,6 +19,10 @@ limitations under the License. */ #include "paddle/fluid/inference/tests/test_helper.h" DEFINE_string(dirname, "", "Directory of the inference model."); +DEFINE_int32(repeat, 100, "Running the inference program repeat times"); +DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); +DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); +DEFINE_bool(prepare_context, true, "Prepare Context before executor"); TEST(inference, understand_sentiment) { if (FLAGS_dirname.empty()) { @@ -61,10 +65,29 @@ TEST(inference, understand_sentiment) { std::vector cpu_fetchs1; cpu_fetchs1.push_back(&output1); - int repeat = 100; // Run inference on CPU - TestInference(dirname, cpu_feeds, - cpu_fetchs1, repeat); + const bool model_combined = false; + if (FLAGS_prepare_vars) { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } else { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } LOG(INFO) << output1.lod(); LOG(INFO) << output1.dims(); -- GitLab From 400f5e7c3ce21ba63bee62a599a82c4a0bbc299d Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 21:08:49 +0800 Subject: [PATCH 0024/1416] add threads test --- .../tests/book/test_inference_nlp.cc | 135 +++++++++--------- 1 file changed, 67 insertions(+), 68 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index c942b43f174..ca02e38ede7 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -14,6 +14,7 @@ limitations under the License. */ #include #include +#include // NOLINT #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -31,76 +32,74 @@ TEST(inference, understand_sentiment) { LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; std::string dirname = FLAGS_dirname; - - // 0. Call `paddle::framework::InitDevices()` initialize all the devices - // In unittests, this is done in paddle/testing/paddle_gtest_main.cc - paddle::framework::LoDTensor words; - /* - paddle::framework::LoD lod{{0, 83}}; - int64_t word_dict_len = 198392; - SetupLoDTensor(&words, lod, static_cast(0), - static_cast(word_dict_len - 1)); - */ - std::vector srcdata{ - 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, - 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, - 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, - 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, 198391, - 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, - 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, 198391, - 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, - 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, - 4376, 10251, 10760}; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = words.mutable_data( - {static_cast(srcdata.size()), 1}, paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - - LOG(INFO) << "number of input size:" << words.numel(); - std::vector cpu_feeds; - cpu_feeds.push_back(&words); - - paddle::framework::LoDTensor output1; - std::vector cpu_fetchs1; - cpu_fetchs1.push_back(&output1); - - // Run inference on CPU const bool model_combined = false; - if (FLAGS_prepare_vars) { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } else { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } - LOG(INFO) << output1.lod(); - LOG(INFO) << output1.dims(); + int total_work = 100; + int num_threads = 10; + int work_per_thread = total_work / num_threads; + std::vector> infer_threads; + for (int i = 0; i < num_threads; ++i) { + infer_threads.emplace_back(new std::thread([&, i]() { + for (int j = 0; j < work_per_thread; ++j) { + // 0. Call `paddle::framework::InitDevices()` initialize all the devices + // In unittests, this is done in paddle/testing/paddle_gtest_main.cc + paddle::framework::LoDTensor words; + /* + paddle::framework::LoD lod{{0, 83}}; + int64_t word_dict_len = 198392; + SetupLoDTensor(&words, lod, static_cast(0), + static_cast(word_dict_len - 1)); + */ + std::vector srcdata{ + 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, + 1550, 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, + 396, 6463, 6463, 1550, 198391, 6463, 22564, 1612, 291, + 68, 164, 784, 784, 1550, 198391, 6463, 13659, 3362, + 42468, 6189, 2209, 198391, 6463, 2209, 2209, 198391, 6463, + 2209, 1062, 3029, 1831, 3029, 1065, 2281, 100, 11216, + 1110, 56, 10869, 9811, 100, 198391, 6463, 100, 9280, + 100, 288, 40031, 1680, 1335, 100, 1550, 9280, 7265, + 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, 4376, + 10251, 10760}; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(srcdata.size()), 1}, + paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); -#ifdef PADDLE_WITH_CUDA - paddle::framework::LoDTensor output2; - std::vector cpu_fetchs2; - cpu_fetchs2.push_back(&output2); + LOG(INFO) << "number of input size:" << words.numel(); + std::vector cpu_feeds; + cpu_feeds.push_back(&words); - // Run inference on CUDA GPU - TestInference(dirname, cpu_feeds, cpu_fetchs2); - LOG(INFO) << output2.lod(); - LOG(INFO) << output2.dims(); + paddle::framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); - CheckError(output1, output2); -#endif + // Run inference on CPU + if (FLAGS_prepare_vars) { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } else { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } + LOG(INFO) << output1.lod(); + LOG(INFO) << output1.dims(); + } + })); + } } -- GitLab From 514b2427edbd30013ca1783769af18fb96ffb626 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 28 May 2018 20:08:23 +0800 Subject: [PATCH 0025/1416] add save/load persist_vars_without_grad --- python/paddle/fluid/io.py | 46 +++++++++++++++++++++++----------- python/paddle/fluid/trainer.py | 3 ++- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 8e58e5eb794..f626039363a 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -24,7 +24,8 @@ __all__ = [ 'save_vars', 'save_params', 'save_persistables', 'load_vars', 'load_params', 'load_persistables', 'save_inference_model', 'load_inference_model', 'get_inference_program', 'save_checkpoint', 'load_checkpoint', - 'clean_checkpoint' + 'clean_checkpoint', 'load_persist_vars_without_grad', + 'save_persist_vars_without_grad' ] @@ -455,6 +456,33 @@ def get_parameter_value_by_name(name, executor, program=None): return get_parameter_value(var, executor) +def load_persist_vars_without_grad(executor, dirname, program): + """ + load_persist_vars_without_grad will load variables from a directory by an executor, + the variable named end with "@GRAD" will not be loaded. + """ + load_vars( + executor, + dirname=dirname, + main_program=program, + predicate=_is_checkpoint_var, + filename=None) + + +def save_persist_vars_without_grad(executor, dirname, program): + """ + save_persist_vars_without_grad will save variables to a directory by an executor, + the variable named end with "@GRAD" will not be saved. + """ + save_vars( + executor, + dirname=dirname, + main_program=program, + vars=None, + predicate=_is_checkpoint_var, + filename=None) + + SUCCESS_MARK_FILENAME = "_SUCCESS" CHECKPOINT_PREFIX = "checkpoint" CHECKPOINT_SEPARATOR = "_" @@ -491,13 +519,7 @@ def save_checkpoint(executor, serial += 1 cur_dir = _get_serial_dir(serial, checkpoint_dir) - save_vars( - executor, - dirname=cur_dir, - main_program=main_program, - vars=None, - predicate=_is_checkpoint_var, - filename=None) + load_persist_vars_without_grad(executor, cur_dir, main_program) _write_success(cur_dir) _lru_delete(checkpoint_dir, max_num_checkpoints) @@ -521,13 +543,7 @@ def load_checkpoint(executor, checkpoint_dir=None, main_program=None): return cur_dir = _get_serial_dir(serial, checkpoint_dir) - - load_vars( - executor, - dirname=cur_dir, - main_program=main_program, - predicate=_is_checkpoint_var, - filename=None) + load_persist_vars_without_grad(executor, cur_dir, main_program) def clean_checkpoint(checkpoint_dir, delete_dir=False): diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 24254b4980c..b4b7b75b96e 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -162,7 +162,8 @@ class Trainer(object): if param_path: # load params from param_path into scope - io.load_persistables(exe, dirname=param_path) + io.load_persist_vars_without_grad( + exe, dirname=param_path, program=self.startup_program) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS -- GitLab From 5eea5db95fb6eaca2db9a0af63e871a9fc29c6bf Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 14:37:59 +0800 Subject: [PATCH 0026/1416] optimized checkpoint and save_model --- python/paddle/fluid/__init__.py | 1 + python/paddle/fluid/io.py | 61 +++++++++++++++------------------ python/paddle/fluid/trainer.py | 40 +++++++++++++++------ 3 files changed, 58 insertions(+), 44 deletions(-) diff --git a/python/paddle/fluid/__init__.py b/python/paddle/fluid/__init__.py index 859605d0053..aece8fc1490 100644 --- a/python/paddle/fluid/__init__.py +++ b/python/paddle/fluid/__init__.py @@ -26,6 +26,7 @@ from trainer import BeginEpochEvent from trainer import EndEpochEvent from trainer import BeginStepEvent from trainer import EndStepEvent +from trainer import CheckpointConfig import inferencer from inferencer import Inferencer diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index f626039363a..aa039bdfaa4 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -491,7 +491,6 @@ CHECKPOINT_SEPARATOR = "_" def save_checkpoint(executor, checkpoint_dir=None, max_num_checkpoints=3, - save_interval_secs=600, main_program=None): """ Save Checkpoint will save persistable LodTensor variables from main_program in checkpoint directory, @@ -511,15 +510,10 @@ def save_checkpoint(executor, if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) - serial = _get_lastest_checkpoint_dir(checkpoint_dir) - if serial >= 0 and not _interval_secs_exceed( - _get_serial_dir(serial, checkpoint_dir), save_interval_secs): - return - - serial += 1 - cur_dir = _get_serial_dir(serial, checkpoint_dir) + serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 + cur_dir = _get_serial_dir(checkpoint_dir, serial) - load_persist_vars_without_grad(executor, cur_dir, main_program) + save_persist_vars_without_grad(executor, cur_dir, main_program) _write_success(cur_dir) _lru_delete(checkpoint_dir, max_num_checkpoints) @@ -542,7 +536,7 @@ def load_checkpoint(executor, checkpoint_dir=None, main_program=None): if serial < 0: return - cur_dir = _get_serial_dir(serial, checkpoint_dir) + cur_dir = _get_serial_dir(checkpoint_dir, serial) load_persist_vars_without_grad(executor, cur_dir, main_program) @@ -559,11 +553,6 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): os.rmdir(checkpoint_dir) -def _get_serial_dir(serial, checkpoint_dir): - serial_folder = CHECKPOINT_PREFIX + CHECKPOINT_SEPARATOR + str(serial) - return os.path.join(checkpoint_dir, serial_folder) - - def _is_checkpoint_var(var): """ the checkpoint will not save or load all the variables. @@ -582,29 +571,37 @@ def _is_checkpoint_var(var): return var.persistable -def _interval_secs_exceed(dirname, save_interval_secs): - dir_time = os.path.getmtime(dirname) - if save_interval_secs > (time.time() - dir_time): - return False - return True +def _get_dir_serial(dirname): + _, serial = dirname.split(CHECKPOINT_SEPARATOR) + + serial_num = -1 + try: + serial_num = int(serial) + except ValueError: + serial_num = -1 + return serial_num + + +def _get_serial_dir(dirname, serial): + serial_folder = CHECKPOINT_PREFIX + CHECKPOINT_SEPARATOR + str(serial) + return os.path.join(dirname, serial_folder) def _lru_delete(dirname, max_num_checkpoints=3): dirs = os.listdir(dirname) - serials = [] + serial_map = {} for serial in dirs: - try: - serials.append(int(serial)) - except ValueError: - continue + serial_num = _get_dir_serial(serial) + serial_map[serial_num] = serial - if len(serials) <= max_num_checkpoints: + if len(serial_map.keys()) <= max_num_checkpoints: return + serials = serial_map.keys() serials.sort(reverse=True) serials = serials[max_num_checkpoints:] for serial in serials: - cur_dir = os.path.join(dirname, str(serial)) + cur_dir = _get_serial_dir(dirname, serial) shutil.rmtree(cur_dir) @@ -633,20 +630,18 @@ def _get_lastest_checkpoint_dir(checkpoint_dir): """ is _SUCCESS in this dir """ - _, serial = cur_dir.split(CHECKPOINT_SEPARATOR) - try: - int(serial) - except ValueError: + serial = _get_dir_serial(cur_dir) + if serial == -1: return -1 if not os.path.isdir(os.path.join(checkpoint_dir, cur_dir)): return -1 success_path = os.path.join( - _get_serial_dir(serial, checkpoint_dir), SUCCESS_MARK_FILENAME) + _get_serial_dir(checkpoint_dir, serial), SUCCESS_MARK_FILENAME) if os.path.isfile(success_path): - return int(serial) + return serial if not os.path.isdir(checkpoint_dir): return -1 diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index b4b7b75b96e..3cf96ac2511 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -60,11 +60,24 @@ class CheckpointConfig(object): def __init__(self, checkpoint_dir=None, max_num_checkpoints=3, - save_interval_secs=600): + epoch_interval=1, + step_interval=10): if checkpoint_dir is None: self.checkpoint_dir = os.getcwd() + else: + self.checkpoint_dir = checkpoint_dir + self.max_num_checkpoints = max_num_checkpoints - self.save_interval_secs = save_interval_secs + + if epoch_interval < 1: + self.epoch_interval = 1 + else: + self.epoch_interval = epoch_interval + + if step_interval < 1: + self.step_interval = 10 + else: + self.step_interval = step_interval def check_and_get_place(place): @@ -290,14 +303,6 @@ class Trainer(object): exe = executor.Executor(self.place) io.save_persistables(exe, dirname=param_path) - def _save_checkpoint(self): - if self.checkpoint and self.chief: - exe = executor.Executor(self.place) - io.save_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.checkpoint.max_num_checkpoints, - self.checkpoint.save_interval_secs, - self.train_program) - @contextlib.contextmanager def _prog_and_scope_guard(self): with framework.program_guard( @@ -343,8 +348,9 @@ class Trainer(object): ]) else: metrics = exe.run(feed=data, fetch_list=[]) + event_handler(EndStepEvent(epoch_id, step_id, metrics)) - self._save_checkpoint() + self._save_checkpoint(epoch_id, step_id) event_handler(EndEpochEvent(epoch_id)) def _test_by_executor(self, reader, feed_order, fetch_list): @@ -384,6 +390,18 @@ class Trainer(object): loss_name=self.train_func_outputs[0].name) return self._get_parallel_executor() + def _save_checkpoint(self, epoch_id, step_id): + if not self.checkpoint or not self.chief: + return + + if epoch_id % self.checkpoint.epoch_interval == 0 and step_id % self.checkpoint.step_interval == 0: + exe = executor.Executor(self.place) + io.save_checkpoint( + executor=exe, + checkpoint_dir=self.checkpoint.checkpoint_dir, + max_num_checkpoints=self.checkpoint.max_num_checkpoints, + main_program=self.train_program) + def build_feed_var_list(program, feed_order): if not isinstance(program, framework.Program): -- GitLab From 5f5d6a9dc7eaf2e1c5b069454497d11a28701ddb Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 16:01:26 +0800 Subject: [PATCH 0027/1416] optimized checkpoint and save_model --- python/paddle/fluid/io.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index aa039bdfaa4..bd3c2e3d9a3 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -489,9 +489,9 @@ CHECKPOINT_SEPARATOR = "_" def save_checkpoint(executor, - checkpoint_dir=None, - max_num_checkpoints=3, - main_program=None): + checkpoint_dir, + main_program=None, + max_num_checkpoints=3): """ Save Checkpoint will save persistable LodTensor variables from main_program in checkpoint directory, the directory named by serial number from 0 to (n -1), save_checkpoint use LRU strategy @@ -500,12 +500,11 @@ def save_checkpoint(executor, :param executor :param checkpoint_dir - :param max_num_checkpoints - :param save_interval_secs :param main_program + :param max_num_checkpoints """ if checkpoint_dir is None: - checkpoint_dir = os.getcwd() + raise ValueError("The values of 'checkpoint_dir' should not be None") if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) @@ -518,7 +517,7 @@ def save_checkpoint(executor, _lru_delete(checkpoint_dir, max_num_checkpoints) -def load_checkpoint(executor, checkpoint_dir=None, main_program=None): +def load_checkpoint(executor, checkpoint_dir, main_program=None): """ Load checkpoint from a directory by executor, it will find the most recent saved checkpoint file and load it auto. @@ -529,7 +528,7 @@ def load_checkpoint(executor, checkpoint_dir=None, main_program=None): """ if checkpoint_dir is None: - checkpoint_dir = os.getcwd() + raise ValueError("The values of 'checkpoint_dir' should not be None") serial = _get_lastest_checkpoint_dir(checkpoint_dir) @@ -546,7 +545,7 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): delete_dir only works when the directory is empty, otherwise, OSError is raised. """ if checkpoint_dir is None: - checkpoint_dir = os.getcwd() + raise ValueError("The values of 'checkpoint_dir' should not be None") _lru_delete(checkpoint_dir, max_num_checkpoints=0) if delete_dir and not os.listdir(checkpoint_dir): -- GitLab From c00843f4e8860d7abff0077168942fa99ef37154 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Tue, 29 May 2018 17:43:01 +0800 Subject: [PATCH 0028/1416] enable multi-threads --- .../tests/book/test_inference_nlp.cc | 12 ++++++++ paddle/fluid/inference/tests/test_helper.h | 29 ------------------- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index ca02e38ede7..6ff8a18cdb1 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -25,6 +25,12 @@ DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); DEFINE_bool(prepare_context, true, "Prepare Context before executor"); +inline double get_current_ms() { + struct timeval time; + gettimeofday(&time, NULL); + return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; +} + TEST(inference, understand_sentiment) { if (FLAGS_dirname.empty()) { LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; @@ -102,4 +108,10 @@ TEST(inference, understand_sentiment) { } })); } + auto start_ms = get_current_ms(); + for (int i = 0; i < num_threads; ++i) { + infer_threads[i]->join(); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "total: " << stop_ms - start_ms << " ms"; } diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 1f5551567c6..dd3a7a584ad 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -156,27 +156,10 @@ void TestInference(const std::string& dirname, auto executor = paddle::framework::Executor(place); auto* scope = new paddle::framework::Scope(); - // Profile the performance - paddle::platform::ProfilerState state; - if (paddle::platform::is_cpu_place(place)) { - state = paddle::platform::ProfilerState::kCPU; - } else { -#ifdef PADDLE_WITH_CUDA - state = paddle::platform::ProfilerState::kAll; - // The default device_id of paddle::platform::CUDAPlace is 0. - // Users can get the device_id using: - // int device_id = place.GetDeviceId(); - paddle::platform::SetDeviceId(0); -#else - PADDLE_THROW("'CUDAPlace' is not supported in CPU only device."); -#endif - } - // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; // Enable the profiler - paddle::platform::EnableProfiler(state); { paddle::platform::RecordEvent record_event( "init_program", @@ -189,10 +172,6 @@ void TestInference(const std::string& dirname, EnableMKLDNN(inference_program); } } - // Disable the profiler and print the timing information - paddle::platform::DisableProfiler(paddle::platform::EventSortingKey::kDefault, - "load_program_profiler"); - paddle::platform::ResetProfiler(); // 3. Get the feed_target_names and fetch_target_names const std::vector& feed_target_names = @@ -233,9 +212,6 @@ void TestInference(const std::string& dirname, true, CreateVars); } - // Enable the profiler - paddle::platform::EnableProfiler(state); - // Run repeat times to profile the performance for (int i = 0; i < repeat; ++i) { paddle::platform::RecordEvent record_event( @@ -252,11 +228,6 @@ void TestInference(const std::string& dirname, CreateVars); } } - - // Disable the profiler and print the timing information - paddle::platform::DisableProfiler( - paddle::platform::EventSortingKey::kDefault, "run_inference_profiler"); - paddle::platform::ResetProfiler(); } delete scope; -- GitLab From ad9dfeb0180b40905d245354e733e750009cc173 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 20:28:40 +0800 Subject: [PATCH 0029/1416] bug fix and optimize --- python/paddle/fluid/io.py | 153 +++++++++++++++++++++++++-------- python/paddle/fluid/trainer.py | 52 +++++++++-- 2 files changed, 162 insertions(+), 43 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index bd3c2e3d9a3..ed560304e25 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -456,40 +456,18 @@ def get_parameter_value_by_name(name, executor, program=None): return get_parameter_value(var, executor) -def load_persist_vars_without_grad(executor, dirname, program): - """ - load_persist_vars_without_grad will load variables from a directory by an executor, - the variable named end with "@GRAD" will not be loaded. - """ - load_vars( - executor, - dirname=dirname, - main_program=program, - predicate=_is_checkpoint_var, - filename=None) - - -def save_persist_vars_without_grad(executor, dirname, program): - """ - save_persist_vars_without_grad will save variables to a directory by an executor, - the variable named end with "@GRAD" will not be saved. - """ - save_vars( - executor, - dirname=dirname, - main_program=program, - vars=None, - predicate=_is_checkpoint_var, - filename=None) - - SUCCESS_MARK_FILENAME = "_SUCCESS" CHECKPOINT_PREFIX = "checkpoint" +MODEL_DIR = "__model__" +TRAINER_PREFIX = "trainer" CHECKPOINT_SEPARATOR = "_" def save_checkpoint(executor, checkpoint_dir, + trainer_id, + is_chief=False, + trainer_args=None, main_program=None, max_num_checkpoints=3): """ @@ -502,22 +480,35 @@ def save_checkpoint(executor, :param checkpoint_dir :param main_program :param max_num_checkpoints + :param is_chief """ if checkpoint_dir is None: raise ValueError("The values of 'checkpoint_dir' should not be None") + if trainer_args and not isinstance(trainer_args, dict): + raise TypeError("The type of 'trainer_args' should be dict") + if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) - save_persist_vars_without_grad(executor, cur_dir, main_program) - _write_success(cur_dir) + if is_chief: + save_persist_vars_without_grad(executor, cur_dir, main_program) + + save_trainer_args(cur_dir, trainer_id, trainer_args) _lru_delete(checkpoint_dir, max_num_checkpoints) -def load_checkpoint(executor, checkpoint_dir, main_program=None): +def need_load_checkpoint(checkpoint_dir): + serial = _get_lastest_checkpoint_dir(checkpoint_dir) + if serial < 0: + return None + return serial + + +def load_checkpoint(executor, checkpoint_dir, serial, main_program): """ Load checkpoint from a directory by executor, it will find the most recent saved checkpoint file and load it auto. @@ -528,14 +519,17 @@ def load_checkpoint(executor, checkpoint_dir, main_program=None): """ if checkpoint_dir is None: - raise ValueError("The values of 'checkpoint_dir' should not be None") + raise ValueError( + "The values of 'checkpoint_dir' or 'serial' should not be None") - serial = _get_lastest_checkpoint_dir(checkpoint_dir) + if serial is None or serial < 0: + raise ValueError("The values of 'serial' should not be None or <0 ") - if serial < 0: - return + if main_program is None: + raise ValueError("The values of 'main_program'should not be None") cur_dir = _get_serial_dir(checkpoint_dir, serial) + cur_dir = _get_model_dir(cur_dir) load_persist_vars_without_grad(executor, cur_dir, main_program) @@ -552,6 +546,68 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): os.rmdir(checkpoint_dir) +def load_persist_vars_without_grad(executor, dirname, program, nest=True): + """ + load_persist_vars_without_grad will load variables from a directory by an executor, + the variable named end with "@GRAD" will not be loaded. + """ + + if nest: + dirname = _get_model_dir(dirname) + + load_vars( + executor, + dirname=dirname, + main_program=program, + predicate=_is_checkpoint_var, + filename=None) + + +def save_persist_vars_without_grad(executor, dirname, program): + """ + save_persist_vars_without_grad will save variables to a directory by an executor, + the variable named end with "@GRAD" will not be saved. + """ + cur_dir = _get_model_dir(dirname) + save_vars( + executor, + dirname=cur_dir, + main_program=program, + vars=None, + predicate=_is_checkpoint_var, + filename=None) + _write_success(cur_dir) + + +def save_trainer_args(dirname, trainer_id, trainer_args): + if not isinstance(trainer_args, dict): + raise TypeError("The type of 'trainer_args' should be dict") + cur_dir = _get_trainer_dir(dirname, trainer_id) + + for name, value in trainer_args.iteritems(): + args_file = os.path.join(cur_dir, name) + with open(args_file, 'w') as f: + f.write(str(value)) + _write_success(cur_dir) + + +def load_trainer_args(checkpoint_dir, serial, trainer_id, trainer_args): + cur_dir = _get_serial_dir(checkpoint_dir, serial) + cur_dir = _get_trainer_dir(cur_dir, trainer_id) + + if not isinstance(trainer_args, list): + raise TypeError("The type of 'trainer_args' should be list") + + ret_values = [] + + for arg in trainer_args: + cur_file = os.path.join(cur_dir, arg) + with open(cur_file, 'r') as f: + contents = f.read() + ret_values.append(contents.strip()) + return ret_values + + def _is_checkpoint_var(var): """ the checkpoint will not save or load all the variables. @@ -583,7 +639,31 @@ def _get_dir_serial(dirname): def _get_serial_dir(dirname, serial): serial_folder = CHECKPOINT_PREFIX + CHECKPOINT_SEPARATOR + str(serial) - return os.path.join(dirname, serial_folder) + serial_dir = os.path.join(dirname, serial_folder) + + if not os.path.isdir(serial_dir): + os.makedirs(serial_dir) + + return serial_dir + + +def _get_model_dir(dirname): + model_dir = os.path.join(dirname, MODEL_DIR) + + if not os.path.isdir(model_dir): + os.makedirs(model_dir) + + return model_dir + + +def _get_trainer_dir(dirname, trainer_id): + trainer_folder = TRAINER_PREFIX + CHECKPOINT_SEPARATOR + str(trainer_id) + trainer_dir = os.path.join(dirname, trainer_folder) + + if not os.path.isdir(trainer_dir): + os.makedirs(trainer_dir) + + return trainer_dir def _lru_delete(dirname, max_num_checkpoints=3): @@ -638,7 +718,8 @@ def _get_lastest_checkpoint_dir(checkpoint_dir): return -1 success_path = os.path.join( - _get_serial_dir(checkpoint_dir, serial), SUCCESS_MARK_FILENAME) + _get_serial_dir(checkpoint_dir, serial), MODEL_DIR, + SUCCESS_MARK_FILENAME) if os.path.isfile(success_path): return serial diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 3cf96ac2511..206d582cdca 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -79,6 +79,9 @@ class CheckpointConfig(object): else: self.step_interval = step_interval + self.epoch_id = 0 + self.step_id = 0 + def check_and_get_place(place): """ @@ -132,6 +135,7 @@ class Trainer(object): # config for checkpoint # only chief worker will save variables + self.trainer_id = 0 self.chief = True self.checkpoint = checkpoint_config if self.checkpoint and \ @@ -139,6 +143,8 @@ class Trainer(object): raise TypeError( "The checkpoint_config shoule be an instance of CheckpointConfig" ) + self.load_checkpoint_serial = io.need_load_checkpoint( + self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -168,15 +174,25 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.checkpoint: + if self.load_checkpoint_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.load_checkpoint_serial, self.startup_program) - if param_path: + epoch_id, step_id = io.load_trainer_args( + self.checkpoint.checkpoint_dir, self.load_checkpoint_serial, + self.trainer_id, ["epoch_id", "step_id"]) + self.checkpoint.epoch_id = int(epoch_id) + self.checkpoint.step_id = int(step_id) + + if param_path and os.path.isdir(param_path): # load params from param_path into scope io.load_persist_vars_without_grad( - exe, dirname=param_path, program=self.startup_program) + exe, + dirname=param_path, + program=self.startup_program, + nest=False) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS @@ -333,11 +349,20 @@ class Trainer(object): self._train_by_any_executor(event_handler, exe, num_epochs, reader) def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): - for epoch_id in range(num_epochs): + epochs = [ + epoch_id for epoch_id in range(num_epochs) + if epoch_id >= self.checkpoint.epoch_id + ] + for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) for step_id, data in enumerate(reader()): if self.__stop: + self._clean_checkpoint() return + + if self.checkpoint and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: + continue + begin_event = BeginStepEvent(epoch_id, step_id) event_handler(begin_event) if begin_event.fetch_metrics: @@ -352,6 +377,7 @@ class Trainer(object): event_handler(EndStepEvent(epoch_id, step_id, metrics)) self._save_checkpoint(epoch_id, step_id) event_handler(EndEpochEvent(epoch_id)) + self._clean_checkpoint() def _test_by_executor(self, reader, feed_order, fetch_list): with executor.scope_guard(self.scope): @@ -390,17 +416,29 @@ class Trainer(object): loss_name=self.train_func_outputs[0].name) return self._get_parallel_executor() + def _clean_checkpoint(self): + if not self.checkpoint: + return + io.clean_checkpoint(checkpoint_dir=self.checkpoint.checkpoint_dir) + def _save_checkpoint(self, epoch_id, step_id): - if not self.checkpoint or not self.chief: + if not self.checkpoint: return if epoch_id % self.checkpoint.epoch_interval == 0 and step_id % self.checkpoint.step_interval == 0: + trainer_args = {} + trainer_args["epoch_id"] = epoch_id + trainer_args["step_id"] = step_id + exe = executor.Executor(self.place) io.save_checkpoint( executor=exe, checkpoint_dir=self.checkpoint.checkpoint_dir, - max_num_checkpoints=self.checkpoint.max_num_checkpoints, - main_program=self.train_program) + trainer_id=self.trainer_id, + is_chief=self.chief, + trainer_args=trainer_args, + main_program=self.train_program, + max_num_checkpoints=self.checkpoint.max_num_checkpoints) def build_feed_var_list(program, feed_order): -- GitLab From 486e1e337d05679a22b389840136b9f07714646b Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 20:36:45 +0800 Subject: [PATCH 0030/1416] bug fix and optimize --- python/paddle/fluid/trainer.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 206d582cdca..35bb8ded5d9 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -79,8 +79,9 @@ class CheckpointConfig(object): else: self.step_interval = step_interval - self.epoch_id = 0 - self.step_id = 0 + self._epoch_id = 0 + self._step_id = 0 + self._load_serial = None def check_and_get_place(place): @@ -174,17 +175,17 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.load_checkpoint_serial: + if self.checkpoint._load_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.load_checkpoint_serial, + self.checkpoint._load_serial, self.startup_program) epoch_id, step_id = io.load_trainer_args( self.checkpoint.checkpoint_dir, self.load_checkpoint_serial, self.trainer_id, ["epoch_id", "step_id"]) - self.checkpoint.epoch_id = int(epoch_id) - self.checkpoint.step_id = int(step_id) + self.checkpoint._epoch_id = int(epoch_id) + self.checkpoint._step_id = int(step_id) if param_path and os.path.isdir(param_path): # load params from param_path into scope @@ -351,7 +352,7 @@ class Trainer(object): def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): epochs = [ epoch_id for epoch_id in range(num_epochs) - if epoch_id >= self.checkpoint.epoch_id + if epoch_id >= self.checkpoint._epoch_id ] for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) @@ -360,7 +361,8 @@ class Trainer(object): self._clean_checkpoint() return - if self.checkpoint and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: + if self.checkpoint and self.checkpoint._load_serial \ + and self.checkpoint._step_id >= step_id and self.checkpoint._epoch_id == epoch_id: continue begin_event = BeginStepEvent(epoch_id, step_id) -- GitLab From 9086043090f80ee7695d043e84fbe8068b2f76e7 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 20:52:01 +0800 Subject: [PATCH 0031/1416] bug fix and optimize --- python/paddle/fluid/io.py | 1 - python/paddle/fluid/trainer.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index ed560304e25..2925e8eb289 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -529,7 +529,6 @@ def load_checkpoint(executor, checkpoint_dir, serial, main_program): raise ValueError("The values of 'main_program'should not be None") cur_dir = _get_serial_dir(checkpoint_dir, serial) - cur_dir = _get_model_dir(cur_dir) load_persist_vars_without_grad(executor, cur_dir, main_program) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 35bb8ded5d9..5ca93821e22 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -144,7 +144,7 @@ class Trainer(object): raise TypeError( "The checkpoint_config shoule be an instance of CheckpointConfig" ) - self.load_checkpoint_serial = io.need_load_checkpoint( + self.checkpoint._load_serial = io.need_load_checkpoint( self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -182,7 +182,7 @@ class Trainer(object): self.startup_program) epoch_id, step_id = io.load_trainer_args( - self.checkpoint.checkpoint_dir, self.load_checkpoint_serial, + self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, self.trainer_id, ["epoch_id", "step_id"]) self.checkpoint._epoch_id = int(epoch_id) self.checkpoint._step_id = int(step_id) -- GitLab From 0211c5df0a12de2647b339dc0a8c36d35209a1a3 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 11:45:25 +0800 Subject: [PATCH 0032/1416] bug fix --- python/paddle/fluid/trainer.py | 17 +++++++++-------- tools/codestyle/docstring_checker.pyc | Bin 0 -> 12561 bytes 2 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 5ca93821e22..34db9b39b77 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -139,13 +139,14 @@ class Trainer(object): self.trainer_id = 0 self.chief = True self.checkpoint = checkpoint_config - if self.checkpoint and \ - not isinstance(self.checkpoint, CheckpointConfig): - raise TypeError( - "The checkpoint_config shoule be an instance of CheckpointConfig" - ) - self.checkpoint._load_serial = io.need_load_checkpoint( - self.checkpoint.checkpoint_dir) + if self.checkpoint: + if not isinstance(self.checkpoint, CheckpointConfig): + raise TypeError( + "The checkpoint_config shoule be an instance of CheckpointConfig" + ) + else: + self.checkpoint._load_serial = io.need_load_checkpoint( + self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -175,7 +176,7 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.checkpoint._load_serial: + if self.checkpoint and self.checkpoint._load_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f0255b763c8d154b7cc17d2d525148dfea3b42d GIT binary patch literal 12561 zcmdT~Npl;=7488*kbt;or54N9SSu6>B(+$!8Cn)4%CZuRQVr#(M2iK3m?1gT00T}B zEYg-Lm69vVF}LI&q$*W8rE*K<5Z`=Een4`}DTh=}i7WZO*Mk8_(T-GhiZsb-cE9fF z<@MX&WdAWx{QTCy2Q`)aWbywB9{o!cu2QooE#+oZV5wPDOg*D!Gg8m0Agk&*HJelQ z9yQyeERM*jAg}7ZYPQ$3dsNV;>IF4hFm23MRI^3p=GCWIVux~jmDjHp@M<3+PnEhq zJD}Wx@^S(#rqDs|Wu~-)Tbw{K71ned`HjVEOJ41v7umkHTiSE&IJ9d7+0C_hDQwto zShLN@QyP`Ez#H-ZgP-YA2Ghix@M=|i$uw~f+O60Rbjf1(5Q>|Vct7;rWQghDd#<-o zZ3VIG*WwyS^C2Fu;nDk1JXUHMlUS@gwfILg&B)4nHwHM~qOW7@UbgH-dL-G_PIN{| zXC>*33EX&Yvzt760>6QoN~kF*^a^UD?`zCD8dn>Ok34_$uK9oN{FV8t@3uy2VSRMb zk4G27Q61G-U24q>^iI`v1J9JB$-g)Z13g*`T~F{h3e+0Rws$xJocCeX_RbHXu8C%q zi3=#x&DRLy4?C~o(f3h!pb3xyN+B|mNS4>mN=~_`=hUYl#~$VO2r%EKq+U`IhxH|t z1d0O{5mHpnOsU8v#!;j@uxmk8YkMgSTy4iop53fQBp;k9As5>Vyt>zj^+?giPkO`L zvfS{?sKj!;xLDk9B_kJ}B^g_;!ab89rb{`LPL_jN3vl6}2vCpES}pLZk-0?nYA;yW z7FSrQ_zgdM)5vr;vfYiGn(*bFirn^0iA*;w z*qMwLwUE&D)oQ&NfY5r;=Xh}|YUr3`?o@s4X<;FU*D9}7@tPpf=?7@55$I4joWi5I zL1hgjzk)}hCE|~VPHBmF1p1z2Nl}k86ctZ$YPF;ugS2wW2Iyf%MH5N;$P<8tH(tjp zEBn+vv}Q`2b{eQv$|r>xvLZ0>8iHg&kD$>ou2lVo3o;jK47`uLKv=cK+t>cb-c}=1 zcC+Zk71`Se4x@R;%F0{))*h>94Q6UYBk6>6Dr9*c$2Y?FDMkW^%aFcGJ%L;qAd**m zEMRnM?h9fW_+19Z(cPosta{u->_gf-v{ZCUtsGMgGntI!#pF3=8B!?6k3+Jfpw@%uNM1ZL)!~cSf_XtX-F!bY1NkO zsTrtUs?oQ01Dd8wAR9T%x01Ei zPjxqHdA7eGFJPiXp6gbv=4rjq3WBxH1VZ;A){3+k1Hv_KCHP0N)UrNL|1KI%hkQcAqYsJ#c+ow1^x`)DN2ZFw|eT8<`MRC)1}k;k^> z$;f9snU@$Y^Bc}a79?d~Bb?Um>g_I?oSM6$pwq#IP(?6#p|YMrouC4(KgeBo6eSTv*7Q;$I8;7hp|KN3eJ8(`Do^qhi0$Z57&JGv{_J>+@ipC00yTXumQjZ z1vUiOPJ!(LY`4Jn0Jc|P`v4mj*nYqc2<#wWhXnQ#V21_vGGMO=>`TCW6OezQ^9G42B2PdR5q}-EI*{R%9$}NdMxl6gH1-M(e-;v55<(`qsUge&Z z%0A_mr7}!^a+Jusj$$g*#(GJD12kcpYjnliES4hA39*MPP7f! z?S^O52H^(V{x5kYhGC_m2-Fnkp)4+6Y@!gMgQ!_4#$E z;33e(>CJti2CK9oc5T;Q(;Z#VXE4DnUu(p&h{1$B!lM&+a{ zVTzmHnT6>DxHpmUTr9Y@C{>r9a zmXVs)A#Qz>!Rbnu^l=QjAGWyJR^ZwQBiSD&R`iEN1VT*TlbkCA5{JP-rnT5s7_^|E7biXNHq`AvTMhT8KTmH-ENLPPDT+l4`&*vH* z{Ua2{=A{I%(g2XluNNLJ-cuaGGf0)j2 z<^;ViJT|;VJZG#1aNFDV(?qB_7qOslQ<5WScqQ)8p}FEPanX@qGGZDRAVDG#Pf)Uz zI-*=vIG{B2MQ(04)L+HMev2mwic=UJw~kmoNv%dbMc<2$+`!LJF*g9019*=1q^O5> z1WvQOgQut?Og_sP?$n$k5nNzef}p^Y3B+O$Zsq{Pw)o4aVO~;JMWbJGNxgDOP$n}g zqv{?nyd?hb-?61`+HPym)M!J3(exYR{u|Vt40b4eNdb8W%@a z&TA|v>YaB`OqUq-G^+FlYob}1>N5mMTm@9fP3K(#g?ewI)`>@&$@a0=X7MVEV<<$N z)LIdgF>TNiKwGI=9J+YF$CIegAyJDZH(s zknceuUs!tpC2|50{80nVsh_}Bf%M3zALET3Y6?R*Dlb`|_YLVoR3qmA*Sn7kFmC{f z!X!h+qBs#kr7qNeM9~(|Z6Y;+@x-<(As=K<*cZo6(_e+7hSB1qb*!})u=m6eY#V)@ z8D5C`HZ}Kn{WY2$L@<$i0gq;E2Wo3>F9T-4rV-M>)(@-|k;?77E8i4hxd3VsX$TZ4 zH8Lju8i5HT+5mAOwKZm&xVICFUc*~$MwkD}eHe1m+Xlsz;T*IFJgeT#@0^rB}dT=mSrI5kXLTSu_MV4s<07oQXa#9dmbJ zI;6~m>8P~yA5e4*p)R&-^Ol51+Hnl~)W|8j!z<6pZ3tBuHw|3-|6n-b7#1TA!y4UG zMsLap>-E&+h~R$-z2bf0d?ruzF2{F7|7OI65nIG`&J>pZ8<%HVPxVr+zl7%iWIAYy z97QvVGMyBte~2O$vtxBk2*851ae}4??jNQHh>K*EVYX^zC-cQH!(gP`L4%ojeT{$_ zgwg5L!@fuf5Yhclgvby}-C!#g43WVBC=_7I#rduFY^w7rCBf z_qT;yC$QOJsFD9ouGE}-M9S{QD~m?TA~gy%3snp=7@2~(%bUpBe#E2s=?-jS_;V1X zQ)*>czSV&=hNP7)XmJbBdyof^!)QUuGVt1vug=9Zx6NdU2JZQd`jt} z`tsH=KByZ)rhG4LY=nxBTLrO*_}vYC-oA`ch5WYJ8DYVcjWfoA7M}SUsp9j?O-b?~ zqfRgX&h43-cW>UFo_w!z>-x;h|9;Nfr!$I#*fHeHR}>3_gcy)S+;4c=C=`m)aJ2 zIJ7fEJo#ZM!5`O6_cMHX{Us#ev|_;P?ADOdgWvC1*8PExmkWfRSSb4`5I8Z xXLe5WP2PmumofcJdWFZ@76=ydnJ|fg%Y)ce@_|IZ)sK7#^C11%LeKD>{{o7gqwN3y literal 0 HcmV?d00001 -- GitLab From 77599415ba1b93715fa0626e147865c088970ee6 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Wed, 30 May 2018 12:15:10 +0800 Subject: [PATCH 0033/1416] enable read dataset --- .../tests/book/test_inference_nlp.cc | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 6ff8a18cdb1..95cdeb4ad1f 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -14,7 +14,12 @@ limitations under the License. */ #include #include +#include +#include +#include +#include #include // NOLINT +#include #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -31,16 +36,37 @@ inline double get_current_ms() { return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } +void read_data( + std::vector>* out, + const std::string& filename = "/home/tangjian/paddle-tj/out.ids.txt") { + using namespace std; // NOLINT + fstream fin(filename); + string line; + out->clear(); + while (getline(fin, line)) { + istringstream iss(line); + vector ids; + string field; + while (getline(iss, field, ' ')) { + ids.push_back(stoi(field)); + } + out->push_back(ids); + } +} + TEST(inference, understand_sentiment) { if (FLAGS_dirname.empty()) { LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; } - + std::vector> inputdatas; + read_data(&inputdatas); + LOG(INFO) << "---------- dataset size: " << inputdatas.size(); LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; std::string dirname = FLAGS_dirname; + const bool model_combined = false; - int total_work = 100; - int num_threads = 10; + int total_work = 10; + int num_threads = 2; int work_per_thread = total_work / num_threads; std::vector> infer_threads; for (int i = 0; i < num_threads; ++i) { -- GitLab From 0deb6f90baa5dab02b5ff1cbc98dcaf7fae9b80b Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 14:20:51 +0800 Subject: [PATCH 0034/1416] annotation optimized and code style optimized --- python/paddle/fluid/io.py | 22 +++++++++++++++++++++- python/paddle/fluid/trainer.py | 12 ++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 2925e8eb289..d52c9a88236 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -478,9 +478,10 @@ def save_checkpoint(executor, :param executor :param checkpoint_dir + :param trainer_id + :param is_chief :param main_program :param max_num_checkpoints - :param is_chief """ if checkpoint_dir is None: raise ValueError("The values of 'checkpoint_dir' should not be None") @@ -502,6 +503,11 @@ def save_checkpoint(executor, def need_load_checkpoint(checkpoint_dir): + """ + If the directory have checkpoint files, it will return lastest checkpoint directory serial number + + :param checkpoint_dir + """ serial = _get_lastest_checkpoint_dir(checkpoint_dir) if serial < 0: return None @@ -515,6 +521,7 @@ def load_checkpoint(executor, checkpoint_dir, serial, main_program): :param executor :param checkpoint_dir + :param serial :param main_program """ @@ -536,7 +543,11 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): """ clean the checkpoint dir, when the train exits normally, the trainer will call clean_checkpoint to delete checkpoint directory saved before. delete_dir only works when the directory is empty, otherwise, OSError is raised. + + :param checkpoint_dir + :param delete_dir """ + if checkpoint_dir is None: raise ValueError("The values of 'checkpoint_dir' should not be None") _lru_delete(checkpoint_dir, max_num_checkpoints=0) @@ -549,6 +560,11 @@ def load_persist_vars_without_grad(executor, dirname, program, nest=True): """ load_persist_vars_without_grad will load variables from a directory by an executor, the variable named end with "@GRAD" will not be loaded. + + :param executor + :param dirname + :param program + :param nest """ if nest: @@ -566,6 +582,10 @@ def save_persist_vars_without_grad(executor, dirname, program): """ save_persist_vars_without_grad will save variables to a directory by an executor, the variable named end with "@GRAD" will not be saved. + + :param executor + :param dirname + :param program """ cur_dir = _get_model_dir(dirname) save_vars( diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 34db9b39b77..6d8d4a3e43b 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -79,8 +79,8 @@ class CheckpointConfig(object): else: self.step_interval = step_interval - self._epoch_id = 0 - self._step_id = 0 + self.epoch_id = 0 + self.step_id = 0 self._load_serial = None @@ -185,8 +185,8 @@ class Trainer(object): epoch_id, step_id = io.load_trainer_args( self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, self.trainer_id, ["epoch_id", "step_id"]) - self.checkpoint._epoch_id = int(epoch_id) - self.checkpoint._step_id = int(step_id) + self.checkpoint.epoch_id = int(epoch_id) + self.checkpoint.step_id = int(step_id) if param_path and os.path.isdir(param_path): # load params from param_path into scope @@ -353,7 +353,7 @@ class Trainer(object): def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): epochs = [ epoch_id for epoch_id in range(num_epochs) - if epoch_id >= self.checkpoint._epoch_id + if epoch_id >= self.checkpoint.epoch_id ] for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) @@ -363,7 +363,7 @@ class Trainer(object): return if self.checkpoint and self.checkpoint._load_serial \ - and self.checkpoint._step_id >= step_id and self.checkpoint._epoch_id == epoch_id: + and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: continue begin_event = BeginStepEvent(epoch_id, step_id) -- GitLab From d712af25dcee298a1bd1fda1bba6a1f0ed001ab0 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 16:29:05 +0800 Subject: [PATCH 0035/1416] add distribute config --- python/paddle/fluid/trainer.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 6d8d4a3e43b..e98672f3187 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -81,7 +81,8 @@ class CheckpointConfig(object): self.epoch_id = 0 self.step_id = 0 - self._load_serial = None + self.load_serial = None + self.is_pserver = False def check_and_get_place(place): @@ -145,7 +146,7 @@ class Trainer(object): "The checkpoint_config shoule be an instance of CheckpointConfig" ) else: - self.checkpoint._load_serial = io.need_load_checkpoint( + self.checkpoint.load_serial = io.need_load_checkpoint( self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -176,17 +177,18 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.checkpoint and self.checkpoint._load_serial: + if self.checkpoint and self.checkpoint.load_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.checkpoint._load_serial, + self.checkpoint.load_serial, self.startup_program) - epoch_id, step_id = io.load_trainer_args( - self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, - self.trainer_id, ["epoch_id", "step_id"]) - self.checkpoint.epoch_id = int(epoch_id) - self.checkpoint.step_id = int(step_id) + if not self.checkpoint.is_pserver: + epoch_id, step_id = io.load_trainer_args( + self.checkpoint.checkpoint_dir, self.checkpoint.load_serial, + self.trainer_id, ["epoch_id", "step_id"]) + self.checkpoint.epoch_id = int(epoch_id) + self.checkpoint.step_id = int(step_id) if param_path and os.path.isdir(param_path): # load params from param_path into scope @@ -259,6 +261,9 @@ class Trainer(object): t.transpile( trainer_id, pservers=pserver_endpoints, trainers=trainers) if training_role == "PSERVER": + if self.checkpoint: + self.is_pserver = True + self.train_program = t.get_pserver_program(current_endpoint) self.startup_program = t.get_startup_program(current_endpoint, self.train_program) @@ -362,7 +367,7 @@ class Trainer(object): self._clean_checkpoint() return - if self.checkpoint and self.checkpoint._load_serial \ + if self.checkpoint and self.checkpoint.load_serial \ and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: continue -- GitLab From b44ede803387c0e292322ba140468599a9136352 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 19:26:12 +0800 Subject: [PATCH 0036/1416] bug fix --- python/paddle/fluid/trainer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index e98672f3187..b4f719855f4 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -252,14 +252,14 @@ class Trainer(object): current_endpoint = os.getenv("PADDLE_CURRENT_IP", "") + ":" + port # the unique trainer id, starting from 0, needed by trainer # only - trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + self.trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) self.chief = self.trainer_id == 0 # the role, should be either PSERVER or TRAINER training_role = os.getenv("PADDLE_TRAINING_ROLE") with self._prog_and_scope_guard(): t = distribute_transpiler.DistributeTranspiler() t.transpile( - trainer_id, pservers=pserver_endpoints, trainers=trainers) + self.trainer_id, pservers=pserver_endpoints, trainers=trainers) if training_role == "PSERVER": if self.checkpoint: self.is_pserver = True -- GitLab From 94eaf94cf57ec2cc951d046e847b69c348b8f9c9 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 21:51:16 +0800 Subject: [PATCH 0037/1416] bug fix about lru and save --- python/paddle/fluid/io.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index d52c9a88236..8e10b01a4ab 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -495,11 +495,11 @@ def save_checkpoint(executor, serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) + save_trainer_args(cur_dir, trainer_id, trainer_args) + if is_chief: save_persist_vars_without_grad(executor, cur_dir, main_program) - - save_trainer_args(cur_dir, trainer_id, trainer_args) - _lru_delete(checkpoint_dir, max_num_checkpoints) + _lru_delete(checkpoint_dir, max_num_checkpoints) def need_load_checkpoint(checkpoint_dir): @@ -639,7 +639,13 @@ def _is_checkpoint_var(var): var.desc.type() == core.VarDesc.VarType.RAW: return False - if var.name.endswith("@GRAD"): + if "@GRAD" in var.name: + return False + + if ".trainer_" in var.name: + return False + + if ".block" in var.name: return False return var.persistable -- GitLab From e44c278e60603c37640a0a352f4bbb7f8363bebc Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 21:55:12 +0800 Subject: [PATCH 0038/1416] bug fix about clean --- python/paddle/fluid/trainer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index b4f719855f4..69577a98fbd 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -425,7 +425,7 @@ class Trainer(object): return self._get_parallel_executor() def _clean_checkpoint(self): - if not self.checkpoint: + if not self.checkpoint and not self.chief: return io.clean_checkpoint(checkpoint_dir=self.checkpoint.checkpoint_dir) -- GitLab From bca4da422582990b4308932d2c20274cdb6c5a60 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 21:56:54 +0800 Subject: [PATCH 0039/1416] cancle only chief delete files --- python/paddle/fluid/io.py | 3 ++- python/paddle/fluid/trainer.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 8e10b01a4ab..62e3046db64 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -499,7 +499,8 @@ def save_checkpoint(executor, if is_chief: save_persist_vars_without_grad(executor, cur_dir, main_program) - _lru_delete(checkpoint_dir, max_num_checkpoints) + + _lru_delete(checkpoint_dir, max_num_checkpoints) def need_load_checkpoint(checkpoint_dir): diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 69577a98fbd..b4f719855f4 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -425,7 +425,7 @@ class Trainer(object): return self._get_parallel_executor() def _clean_checkpoint(self): - if not self.checkpoint and not self.chief: + if not self.checkpoint: return io.clean_checkpoint(checkpoint_dir=self.checkpoint.checkpoint_dir) -- GitLab From a2c017da9b77ac76359dcb3dc24fccde6d71f32b Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 01:58:00 +0800 Subject: [PATCH 0040/1416] 1. merge simple_dist_transpiler to distribute_transpiler 2. add align_var_to_block argument to func transpile 3. remove concat and spilt if align_var_to_block is False 4. unittests for simple_dist_transpiler --- .../unittests/test_simple_dist_transpiler.py | 120 +++++++++ .../fluid/transpiler/distribute_transpiler.py | 45 +++- .../distribute_transpiler_simple.py | 254 ------------------ 3 files changed, 156 insertions(+), 263 deletions(-) create mode 100644 python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py delete mode 100644 python/paddle/fluid/transpiler/distribute_transpiler_simple.py diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py new file mode 100644 index 00000000000..d51e356a536 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -0,0 +1,120 @@ +# Copyright (c) 2018 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. + +import unittest + +import paddle.fluid as fluid +import paddle.fluid.core as core +import paddle.fluid.layers as layers +from paddle.fluid.transpiler.distribute_transpiler import delete_ops +import numpy as np + + +class TestSimpleDistTranspiler(unittest.TestCase): + def setUp(self): + self.trainer_id = 0 + self.trainers = 2 + self.pservers = 2 + self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" + self.current_pserver_ep = "127.0.0.1:6175" + + def net_conf(self): + x = fluid.layers.data(name='x', shape=[1000], dtype='float32') + + y_predict = fluid.layers.fc(input=x, + size=1000, + act=None, + param_attr=fluid.ParamAttr(name='fc_w')) + + y = fluid.layers.data(name='y', shape=[1], dtype='float32') + + cost = fluid.layers.square_error_cost(input=y_predict, label=y) + avg_cost = fluid.layers.mean(cost) + sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) + + optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) + return optimize_ops, params_grads + + def test_simple_transpiler(self): + np.random.seed(1) + + trainer = self.get_trainer() + pserver, startup = self.get_pserver(self.current_pserver_ep) + self.assertEqual([op.type for op in trainer.global_block().ops], + self.get_expect_trainer_ops()) + + self.assertEqual(len(pserver.blocks), 2) + # block0: listen_and_serv + self.assertEqual([op.type for op in pserver.blocks[0].ops], + ["listen_and_serv"]) + # block1: optimize pass + self.assertEqual([op.type for op in pserver.blocks[1].ops], + ["sum", "scale", "sgd"]) + + print("xxx", [op.output_arg_names for op in startup.global_block().ops]) + # confirm startup program + self.assertEqual([op.type for op in startup.global_block().ops], + ["fill_constant", "uniform_random", "uniform_random"]) + + # the variable #fc_w will NOT be splited + fc_w_var = startup.global_block().var("fc_w@GRAD") + self.assertEqual(fc_w_var.shape, (1000, 1000)) + + fc_w_var = startup.global_block().var("fc_w@GRAD.trainer_0") + self.assertEqual(fc_w_var.shape, (1000, 1000)) + + def get_main_program(self): + main = fluid.Program() + + with fluid.program_guard(main): + self.net_conf() + + return main + + def get_expect_trainer_ops(self): + trainer = fluid.Program() + + with fluid.program_guard(trainer): + optimize_ops, params_grads = self.net_conf() + + delete_ops(trainer.global_block(), optimize_ops) + ops = [op.type for op in trainer.global_block().ops] + [ + "send_vars", "send_barrier", "recv", "recv", "fetch_barrier" + ] + ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars") + return ops + + def get_trainer(self): + return self._transpiler_instance().get_trainer_program() + + def get_pserver(self, ep): + t = self._transpiler_instance() + pserver = t.get_pserver_program(ep) + startup = t.get_startup_program(ep, pserver) + return pserver, startup + + def _transpiler_instance(self): + main = self.get_main_program() + t = fluid.DistributeTranspiler() + t.transpile( + self.trainer_id, + program=main, + pservers=self.pserver_eps, + trainers=self.trainers, + align_var_to_block=False) + return t + + +if __name__ == "__main__": + unittest.main() diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index e9b7d9e9d2d..eb7daeffb9e 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -15,6 +15,7 @@ from __future__ import print_function import math +import numpy as np from ps_dispatcher import RoundRobin, HashName, PSDispatcher from .. import core, framework @@ -103,7 +104,7 @@ def split_dense_variable(var_list, service_count, min_block_size=8192): We need to have a minimal block size so that the calculations in the parameter server side can gain better performance. By default - minimum block size 8K elements (maybe 16bit or 32bit or 64bit). + minimum block size 8K elements (maybe 16bit or 32bit or 64bit). Args: var_list (list): List of variables. @@ -111,7 +112,7 @@ def split_dense_variable(var_list, service_count, min_block_size=8192): or more listening ports. min_block_size (int): Minimum splitted block size. Returns: - blocks (list[(varname, block_id, current_block_size)]): A list + blocks (list[(varname, block_id, current_block_size)]): A list of VarBlocks. Each VarBlock specifies a shard of the var. """ blocks = [] @@ -171,6 +172,7 @@ class DistributeTranspiler: program=None, pservers="127.0.0.1:6174", trainers=1, + align_var_to_block=True, split_method=RoundRobin, sync_mode=True): """ @@ -183,7 +185,8 @@ class DistributeTranspiler: parameter servers. Steps to transpile trainer: - 1. split variable to multiple blocks, aligned by product(dim[1:]) (width). + 1. split variable to multiple blocks, aligned by product(dim[1:]) (width) + if align_var_to_block is True 2. rename splited grad variables to add trainer_id suffix ".trainer_%d". 3. modify trainer program add split_op to each grad variable. 4. append send_op to send splited variables to server and fetch @@ -293,9 +296,18 @@ class DistributeTranspiler: for index in range(len(self.pserver_endpoints)) ] - grad_blocks = split_dense_variable(grad_list, len(pserver_endpoints)) - param_blocks = split_dense_variable(param_list, len(pserver_endpoints)) + if align_var_to_block: + grad_blocks = split_dense_variable(grad_list, + len(pserver_endpoints)) + param_blocks = split_dense_variable(param_list, + len(pserver_endpoints)) + else: + # when we do NOT align var to block, we will always split params + # grads into one block. + grad_blocks = split_dense_variable(grad_list, 1) + param_blocks = split_dense_variable(param_list, 1) assert (len(grad_blocks) == len(param_blocks)) + # step2: Create new vars for the parameters and gradients blocks and # add ops to do the split. param_var_mapping = self._create_vars_from_blocklist(program, @@ -325,8 +337,22 @@ class DistributeTranspiler: # step 3.1: insert send op to send gradient vars to parameter servers ps_dispatcher.reset() send_vars = [] - for orig_varname, splited_vars in grad_var_mapping.items(): + + # in general cases, the number of pservers is times of 2, and this + # will lead to uneven distribution among weights and bias: + # fc_w@GRAD_trainer_0, fc_w@GRAD_trainer_1 --> pserver1 + # fc_b@GRAD_trainer_0, fc_b@GRAD_trainer_1 --> pserver2 + # shuffle the map will avoid the uneven distribution above + grad_var_mapping_items = grad_var_mapping.items() + if not align_var_to_block: + np.random.shuffle(grad_var_mapping_items) + + for orig_varname, splited_vars in grad_var_mapping_items: eplist = ps_dispatcher.dispatch(splited_vars) + + if not align_var_to_block: + assert (len(splited_vars) == 1) + if len(splited_vars) == 1: orig_varname = splited_vars[0].name index = find_op_by_output_arg(program.global_block(), @@ -374,7 +400,7 @@ class DistributeTranspiler: for i, ep in enumerate(eplist): self.param_grad_ep_mapping[ep]["params"].append(recv_vars[i]) self.param_grad_ep_mapping[ep]["grads"].append(send_vars[i]) - # step4: Concat the parameters splits together after recv. + for varname, splited_var in param_var_mapping.iteritems(): eps = [] for var in splited_var: @@ -399,6 +425,7 @@ class DistributeTranspiler: RPC_OP_ROLE_ATTR_NAME: RPC_OP_ROLE_ATTR_VALUE }) + # step4: Concat the parameters splits together after recv. for varname, splited_var in param_var_mapping.iteritems(): if len(splited_var) <= 1: continue @@ -849,8 +876,8 @@ class DistributeTranspiler: program (ProgramDesc): ProgramDesc which gradients blong. block_list (list[(varname, block_id, block_size)]): List of gradient blocks. add_trainer_suffix (Bool): Add trainer suffix to new variable's name if set True. - Returns: - var_mapping (dict(varname->[new_varname_variable])):A dict mapping + Returns: + var_mapping (dict(varname->[new_varname_variable])):A dict mapping from original var name to each var split. """ diff --git a/python/paddle/fluid/transpiler/distribute_transpiler_simple.py b/python/paddle/fluid/transpiler/distribute_transpiler_simple.py deleted file mode 100644 index ea8c27cdca8..00000000000 --- a/python/paddle/fluid/transpiler/distribute_transpiler_simple.py +++ /dev/null @@ -1,254 +0,0 @@ -# Copyright (c) 2018 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 ..framework import Program, default_main_program, Parameter, Variable -from ..layer_helper import LayerHelper - - -def hash_name_to_server(params_grads, pserver_endpoints): - """ - :param param_grads: - :return: a map of pserver endpoint -> - params -> [param list] - grads -> [grad list] - """ - - def _hash_param(param_name, total): - return hash(param_name) % total - - param_grad_map = dict() - for param, grad in params_grads: - if param.trainable is True and grad is not None: - server_id = _hash_param(param.name, len(pserver_endpoints)) - server_for_param = pserver_endpoints[server_id] - if not param_grad_map.has_key(server_for_param): - param_grad_map[server_for_param] = {"params": [], "grads": []} - param_grad_map[server_for_param]["params"].append(param) - param_grad_map[server_for_param]["grads"].append(grad) - - return param_grad_map - - -def round_robin(params_grads, pserver_endpoints): - assert (len(params_grads) > len(pserver_endpoints)) - - param_grad_map = dict() - pserver_idx = 0 - for param, grad in params_grads: - if param.trainable is True: - server_for_param = pserver_endpoints[pserver_idx] - if not param_grad_map.has_key(server_for_param): - param_grad_map[server_for_param] = {"params": [], "grads": []} - - param_grad_map[server_for_param]["params"].append(param) - param_grad_map[server_for_param]["grads"].append(grad) - - pserver_idx += 1 - if pserver_idx >= len(pserver_endpoints): - pserver_idx = 0 - return param_grad_map - - -class SimpleDistributeTranspiler: - def transpile(self, - optimize_ops, - params_grads, - program=None, - pservers="127.0.0.1:6174", - trainers=1, - split_method=round_robin): - """ - Transpile the program to a distributed data-parallelism programs. - - The main_program will be transform to use a remote parameter server - to do parameter optimization. And the optimization graph will be put - in to a parameter server program. - - Use different methods to split trainable varialbles to different - parameter servers. - - Example to run: - - exe = fluid.Executor(place) - t = fluid.DistributeTranspiler() - t.transpile(optimize_ops, params_grads, pservers="127.0.0.1:6174", trainers=1) - - pserver_endpoint = os.getenv("PSERVER") - if pserver_endpoint: - pserver_prog = t.get_pserver_program(pserver_endpoint, optimize_ops) - exe.run(fluid.default_startup_program()) - exe.run(pserver_prog) - else: - feeder = fluid.DataFeeder(feed_list=[images, label], place=place) - exe.run(fluid.default_startup_program()) - - for pass_id in range(PASS_NUM): - ... - - :param optimize_ops: op list of optimization, should be the - return value of Optimizer.minimize - :type optimize_ops: list - :param program: program to optimize, default default_main_program - :param pservers: parameter server endpoints like "m1:6174,m2:6174" - :type pservers: string - - :return: return a list of programs - """ - if program is None: - program = default_main_program() - self.program = program - self.trainers = trainers - self.optimize_ops = optimize_ops - self._optimize_distributed( - optimize_ops, - program, - params_grads, - pservers=pservers, - trainers=trainers, - split_method=split_method) - - def _clone_param(self, block, v): - assert isinstance(v, Parameter) - new_p = Parameter( - block=block, - shape=v.shape, - dtype=v.dtype, - type=v.type, - lod_level=v.lod_level, - stop_gradient=v.stop_gradient, - trainable=v.trainable, - optimize_attr=v.optimize_attr, - regularizer=v.regularizer, - name=v.name) - block.vars[new_p.name] = new_p - - def _clone_var(self, block, var): - assert isinstance(var, Variable) - return block.create_var( - name=var.name, - shape=var.shape, - dtype=var.dtype, - type=var.type, - lod_level=var.lod_level, - persistable=var.persistable) - - def _optimize_distributed(self, optimize_ops, program, params_and_grads, - **kwargs): - if kwargs.has_key("split_method"): - split_method = kwargs["split_method"] - else: - split_method = round_robin - - assert (callable(split_method)) - pserver_endpoints = kwargs["pservers"].split(",") - self.param_grad_map = split_method(params_and_grads, pserver_endpoints) - - send_op_ordered_inputs = [] - send_op_ordered_outputs = [] - epmap = [] - for ep, v in self.param_grad_map.iteritems(): - send_op_ordered_inputs.extend(v["grads"]) - send_op_ordered_outputs.extend(v["params"]) - for i in v["grads"]: - epmap.append(ep) - send_op = program.global_block().append_op( - type="send", - inputs={"X": send_op_ordered_inputs - }, # inputs is a list of tensors to be send - outputs={"Out": send_op_ordered_outputs}, - attrs={"endpoints": pserver_endpoints, - "epmap": epmap}) - - def get_trainer_program(self): - # remove optimize ops and add a send op to main_program - self.program.global_block().delete_ops(self.optimize_ops) - return self.program - - def _create_var_for_trainers(self, block, var, trainers): - var_list = [] - for i in xrange(trainers): - var_each = block.create_var( - name="%s.trainer_%d" % (var.name, i), - psersistable=var.persistable, - dtype=var.dtype, - shape=var.shape) - var_list.append(var_each) - return var_list - - def get_pserver_program(self, endpoint, optimize_ops): - pserver_program = Program() - for v in self.param_grad_map[endpoint]["params"]: - self._clone_param(pserver_program.global_block(), v) - - optimize_sub_program = Program() - grad_var_names = [ - var.name for var in self.param_grad_map[endpoint]["grads"] - ] - for opt_op in optimize_ops: - for _, var in opt_op.inputs.iteritems(): - # NOTE: append operators to merge gradients from multiple - # trainers. If trainers == 1, this is not needed. - if self.trainers > 1 and var.name in grad_var_names: - vars2merge = self._create_var_for_trainers( - optimize_sub_program.global_block(), var, self.trainers) - merged_var = optimize_sub_program.global_block().create_var( - name=var.name, - persistable=var.persistable, - dtype=var.dtype, - shape=var.shape) - optimize_sub_program.global_block().append_op( - type="sum", - inputs={"X": vars2merge}, - outputs={"Out": merged_var}) - optimize_sub_program.global_block().append_op( - type="scale", - inputs={"X": merged_var}, - outputs={"Out": merged_var}, - attrs={"scale": 1.0 / float(self.trainers)}) - else: - optimize_sub_program.global_block().create_var( - name=var.name, - persistable=var.persistable, - dtype=var.dtype, - shape=var.shape) - - if opt_op.inputs.has_key("Grad"): - if opt_op.inputs["Grad"].name in grad_var_names: - optimize_sub_program.global_block().append_op( - type=opt_op.type, - inputs=opt_op.inputs, - outputs=opt_op.outputs, - attrs=opt_op.attrs) - else: - optimize_sub_program.global_block().append_op( - type=opt_op.type, - inputs=opt_op.inputs, - outputs=opt_op.outputs, - attrs=opt_op.attrs) - pserver_program.global_block().append_op( - type="recv", - inputs={"RX": - self.param_grad_map[endpoint]["grads"]}, # grads to recv - outputs={}, - attrs={ - "OptimizeBlock": optimize_sub_program.global_block(), - "endpoint": endpoint, - "ParamList": - [p.name for p in self.param_grad_map[endpoint]["params"]], - "GradList": - [p.name for p in self.param_grad_map[endpoint]["grads"]], - "Trainers": self.trainers - }) - pserver_program.sync_with_cpp() - return pserver_program -- GitLab From 46f2688f3051b0bbeb070d05159922e8b689720e Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Thu, 31 May 2018 09:53:41 +0800 Subject: [PATCH 0041/1416] bug fix --- python/paddle/fluid/trainer.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index b4f719855f4..3354d77acec 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -356,10 +356,14 @@ class Trainer(object): self._train_by_any_executor(event_handler, exe, num_epochs, reader) def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): - epochs = [ - epoch_id for epoch_id in range(num_epochs) - if epoch_id >= self.checkpoint.epoch_id - ] + if self.checkpoint: + epochs = [ + epoch_id for epoch_id in range(num_epochs) + if epoch_id >= self.checkpoint.epoch_id + ] + else: + epochs = [epoch_id for epoch_id in range(num_epochs)] + for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) for step_id, data in enumerate(reader()): -- GitLab From 8248333ad2adcb3b3cdcb353cff4025092f8dcdb Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 10:53:45 +0800 Subject: [PATCH 0042/1416] remove simple distranspiler in transpiler/ repo --- python/paddle/fluid/transpiler/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/transpiler/__init__.py b/python/paddle/fluid/transpiler/__init__.py index 045ca537b2e..cf18090f71f 100644 --- a/python/paddle/fluid/transpiler/__init__.py +++ b/python/paddle/fluid/transpiler/__init__.py @@ -15,10 +15,9 @@ from distribute_transpiler import DistributeTranspiler from inference_transpiler import InferenceTranspiler from memory_optimization_transpiler import memory_optimize, release_memory -from distribute_transpiler_simple import SimpleDistributeTranspiler from ps_dispatcher import HashName, RoundRobin __all__ = [ - "DistributeTranspiler", "InferenceTranspiler", "SimpleDistributeTranspiler", - "memory_optimize", "release_memory", "HashName", "RoundRobin" + "DistributeTranspiler", "InferenceTranspiler", "memory_optimize", + "release_memory", "HashName", "RoundRobin" ] -- GitLab From 164692da9a75744db770836111ae4c63ac6ed7c3 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Thu, 31 May 2018 11:00:40 +0800 Subject: [PATCH 0043/1416] drop the last batch, if the size of last batch is not equal to batch_size --- python/paddle/batch.py | 6 ++++-- python/paddle/v2/minibatch.py | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/python/paddle/batch.py b/python/paddle/batch.py index 317cf037c69..d48c54fcbb6 100644 --- a/python/paddle/batch.py +++ b/python/paddle/batch.py @@ -15,7 +15,7 @@ __all__ = ['batch'] -def batch(reader, batch_size): +def batch(reader, batch_size, drop_last=False): """ Create a batched reader. @@ -23,6 +23,8 @@ def batch(reader, batch_size): :type reader: callable :param batch_size: size of each mini-batch :type batch_size: int + :param drop_last: drop the last batch, if the size of last batch is not equal to batch_size. + :type drop_last: bool :return: the batched reader. :rtype: callable """ @@ -35,7 +37,7 @@ def batch(reader, batch_size): if len(b) == batch_size: yield b b = [] - if b: + if drop_last == False and len(b) != 0: yield b return batch_reader diff --git a/python/paddle/v2/minibatch.py b/python/paddle/v2/minibatch.py index 317cf037c69..d48c54fcbb6 100644 --- a/python/paddle/v2/minibatch.py +++ b/python/paddle/v2/minibatch.py @@ -15,7 +15,7 @@ __all__ = ['batch'] -def batch(reader, batch_size): +def batch(reader, batch_size, drop_last=False): """ Create a batched reader. @@ -23,6 +23,8 @@ def batch(reader, batch_size): :type reader: callable :param batch_size: size of each mini-batch :type batch_size: int + :param drop_last: drop the last batch, if the size of last batch is not equal to batch_size. + :type drop_last: bool :return: the batched reader. :rtype: callable """ @@ -35,7 +37,7 @@ def batch(reader, batch_size): if len(b) == batch_size: yield b b = [] - if b: + if drop_last == False and len(b) != 0: yield b return batch_reader -- GitLab From b3f9e5e0079f22cdab7fa60025ab04bbee1e7827 Mon Sep 17 00:00:00 2001 From: weixing02 Date: Thu, 31 May 2018 11:21:15 +0800 Subject: [PATCH 0044/1416] make test_hsigmoid_op.py right --- .../fluid/tests/unittests/test_hsigmoid_op.py | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_hsigmoid_op.py b/python/paddle/fluid/tests/unittests/test_hsigmoid_op.py index 178f56aeb81..226ce8b9042 100644 --- a/python/paddle/fluid/tests/unittests/test_hsigmoid_op.py +++ b/python/paddle/fluid/tests/unittests/test_hsigmoid_op.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2018 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. @@ -14,8 +14,8 @@ import unittest import numpy as np -from op_test import OpTest import math +from op_test import OpTest def find_latest_set(num): @@ -37,40 +37,36 @@ class CodeTable(object): def hsigmoid(x, w, ids, bias, num_classes): - # code length = - # initialize pre out with dims={batch_size, code_length} + global pre_output batch_size = x.shape[0] code_length = find_latest_set(num_classes - 1) code_table = [0 for _ in range(code_length)] pre_output = np.zeros((batch_size, code_length)) pre_sum = np.zeros((batch_size, 1)) out = np.zeros((batch_size, 1)).astype("float32") - # pre_out += code(bias) - for i in xrange(batch_size): + for i in range(batch_size): code_table = CodeTable(num_classes, ids[i]) length = code_table.get_length() - for j in xrange(length): + for j in range(length): idx = code_table.cal_index(j) pre_output[i][j] += bias[0][idx] - # pre_out += code(w) * x - for i in xrange(batch_size): - for j in xrange(batch_size): - code_table = CodeTable(num_classes, ids[j]) - length = code_table.get_length() - for k in xrange(length): - idx = code_table.cal_index(k) - sum = 0.0 - for l in xrange(x.shape[1]): - sum += w[i][idx][l] * x[j][l] - pre_output[j][k] += sum + for j in range(batch_size): + code_table = CodeTable(num_classes, ids[j]) + length = code_table.get_length() + for k in range(length): + idx = code_table.cal_index(k) + sum = 0.0 + for l in range(x.shape[1]): + sum += w[idx][l] * x[j][l] + pre_output[j][k] += sum # clip[-40.0, 40.0] np.clip(pre_output, -40.0, 40.0) # out(i, 0) = \sum_j bit(i, j) * preout(i, j) - for i in xrange(batch_size): + for i in range(batch_size): code_table = CodeTable(num_classes, ids[i]) length = code_table.get_length() sum = 0.0 - for j in xrange(length): + for j in range(length): if code_table.cal_bit(j): sum += pre_output[i][j] out[i] = -1.0 * sum @@ -85,24 +81,23 @@ def hsigmoid(x, w, ids, bias, num_classes): class TestHSigmoidOp(OpTest): def setUp(self): self.op_type = "hierarchical_sigmoid" - num_classes = 6 - embded_size = 10 - batch_size = 5 + num_classes = 4 + embded_size = 1 + batch_size = 1 x = np.random.random((batch_size, embded_size)).astype("float32") - w = np.random.random( - (batch_size, num_classes - 1, embded_size)).astype("float32") + w = np.random.random((num_classes - 1, embded_size)).astype("float32") ids = np.random.randint(0, num_classes, batch_size) bias = np.random.random((1, num_classes - 1)).astype("float32") - self.inputs = {'X': x, 'W': w, 'Ids': ids, 'Bias': bias} self.attrs = {'num_classes': num_classes} + self.inputs = {'X': x, 'W': w, 'Ids': ids, 'Bias': bias} out = hsigmoid(x, w, ids, bias, num_classes) - self.outputs = {'Out': out} + self.outputs = {'PreOut': pre_output, 'Out': out} def test_check_output(self): self.check_output() def test_check_grad(self): - self.check_grad(['X', 'W', 'Bias'], 'Out', no_grad_set=set('Ids')) + self.check_grad(['Bias', 'X', 'W'], 'Out', no_grad_set=set('Ids')) if __name__ == '__main__': -- GitLab From a4d88fb6420cba41c701378b1ed56fe4f9ec45f1 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 11:41:08 +0800 Subject: [PATCH 0045/1416] 1. remove simple distranspiler from transpiler/ repo 2. remvoe comment line --- python/paddle/fluid/__init__.py | 4 ++-- .../fluid/tests/unittests/test_simple_dist_transpiler.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/__init__.py b/python/paddle/fluid/__init__.py index 859605d0053..d53a96a7a79 100644 --- a/python/paddle/fluid/__init__.py +++ b/python/paddle/fluid/__init__.py @@ -44,8 +44,8 @@ import transpiler from param_attr import ParamAttr, WeightNormParamAttr from data_feeder import DataFeeder from core import LoDTensor, CPUPlace, CUDAPlace, CUDAPinnedPlace -from transpiler import DistributeTranspiler, SimpleDistributeTranspiler, \ - InferenceTranspiler, memory_optimize, release_memory +from transpiler import DistributeTranspiler, InferenceTranspiler, \ + memory_optimize, release_memory from concurrency import (Go, make_channel, channel_send, channel_recv, channel_close, Select) from lod_tensor import create_lod_tensor, create_random_int_lodtensor diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py index d51e356a536..60f99f412cd 100644 --- a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -62,7 +62,6 @@ class TestSimpleDistTranspiler(unittest.TestCase): self.assertEqual([op.type for op in pserver.blocks[1].ops], ["sum", "scale", "sgd"]) - print("xxx", [op.output_arg_names for op in startup.global_block().ops]) # confirm startup program self.assertEqual([op.type for op in startup.global_block().ops], ["fill_constant", "uniform_random", "uniform_random"]) -- GitLab From e05abab60923c819c16980bdd53bdd684518f75b Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 31 May 2018 11:56:59 +0800 Subject: [PATCH 0046/1416] use recordio in dist train --- doc/v2/howto/recordio/README.md | 122 ++++++++++++++++++ .../details/threaded_ssa_graph_executor.cc | 6 +- .../reader/create_recordio_file_reader_op.cc | 12 +- python/paddle/fluid/layers/io.py | 20 +-- python/paddle/fluid/recordio_writer.py | 35 ++++- tools/codestyle/docstring_checker.pyc | Bin 11769 -> 11769 bytes 6 files changed, 178 insertions(+), 17 deletions(-) create mode 100644 doc/v2/howto/recordio/README.md diff --git a/doc/v2/howto/recordio/README.md b/doc/v2/howto/recordio/README.md new file mode 100644 index 00000000000..3f81d54b8e1 --- /dev/null +++ b/doc/v2/howto/recordio/README.md @@ -0,0 +1,122 @@ +# How to use RecordIO in Fluid + +If you want to use RecordIO as your training data format, you need to convert to your training data +to RecordIO files and reading them in the process of training, PaddlePaddle Fluid provides some +interface to deal with the RecordIO files. + +## Generate RecordIO File + +Before start training with RecordIO files, you need to convert your training data +to RecordIO format by `fluid.recordio_writer.convert_reader_to_recordio_file`, the sample codes +as follows: + +```python + reader = paddle.batch(mnist.train(), batch_size=1) + feeder = fluid.DataFeeder( + feed_list=[ # order is image and label + fluid.layers.data( + name='image', shape=[784]), + fluid.layers.data( + name='label', shape=[1], dtype='int64'), + ], + place=fluid.CPUPlace()) + fluid.recordio_writer.convert_reader_to_recordio_file('./mnist.recordio', reader, feeder) +``` + +The above codes would generate a RecordIO `./mnist.recordio` on your host. + +## Use the RecordIO file in a Local Training Job + +PaddlePaddle Fluid provides an interface `fluid.layers.io.open_recordio_file` to load your RecordIO file +and then you can use them as a Layer in your network configuration, the sample codes as follows: + +```python + data_file = fluid.layers.io.open_recordio_file( + filename="./mnist.recordio", + shapes=[(-1, 784),(-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int32"]) + data_file = fluid.layers.io.batch(data_file, batch_size=4) + + img, label = fluid.layers.io.read_file(data_file) + hidden = fluid.layers.fc(input=img, size=100, act='tanh') + prediction = fluid.layers.fc(input=hidden, size=10, act='softmax') + loss = fluid.layers.cross_entropy(input=prediction, label=label) + avg_loss = fluid.layers.mean(loss) + + fluid.optimizer.Adam(learning_rate=1e-3).minimize(avg_loss) + + place = fluid.CPUPlace() + + exe = fluid.Executor(place) + exe.run(fluid.default_startup_program()) + avg_loss_np = [] + + # train a pass + batch_id = 0 + while True: + tmp, = exe.run(fetch_list=[avg_loss]) + + avg_loss_np.append(tmp) + print(batch_id) + batch_id += 1 +``` + +## Use the RecordIO files in Distributed Training + +1. generate multiple RecordIO files + +For a distributed training job, you may have multiple trainer nodes, +and one or more RecordIO files for one trainer node, you can use the interface +`fluid.recordio_writer.convert_reader_to_recordio_files` to convert your training data +into multiple RecordIO files, the sample codes as follows: + +```python + reader = paddle.batch(mnist.train(), batch_size=1) + feeder = fluid.DataFeeder( + feed_list=[ # order is image and label + fluid.layers.data( + name='image', shape=[784]), + fluid.layers.data( + name='label', shape=[1], dtype='int64'), + ], + place=fluid.CPUPlace()) + fluid.recordio_writer.convert_reader_to_recordio_files( + filename_suffix='./mnist.recordio', batch_per_file=100, reader, feeder) +``` + +The above codes would generate multiple RecordIO files on your host like: + +```bash +. + \_mnist.recordio-00000 + |-mnist.recordio-00001 + |-mnist.recordio-00002 + |-mnist.recordio-00003 + |-mnist.recordio-00004 +``` + +1. read these RecordIO files with `fluid.layers.io.open_recordio_file` + +For a distributed training job, the distributed operator system will schedule trainer process on multiple nodes, +each trainer process reads parts of the whole training data, we usually take the following approach to make the training +data allocated by each trainer process as uniform as possiable: + +```python +def gen_train_list(file_pattern, trainers, trainer_id): + file_list = glob.glob(file_pattern) + ret_list = [] + for idx, f in enumerate(file_list): + if (idx + trainers) % trainers == trainer_id: + ret_list.append(f) + return ret_list + +trainers = int(os.getenv("TRAINERS")) +trainer_id = int(os.getenv("PADDLE_INIT_TRAINER_ID")) +data_file = fluid.layers.io.open_recordio_file( + filename=gen_train_list("./mnist.recordio*", trainers, trainer_id), + shapes=[(-1, 784),(-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int32"]) +data_file = fluid.layers.io.batch(data_file, batch_size=4) +``` diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 815f739371e..335c067dd73 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -189,9 +189,11 @@ void ThreadedSSAGraphExecutor::RunOp( BlockingQueue *ready_var_q, details::OpHandleBase *op) { auto op_run = [ready_var_q, op, this] { try { - VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); + VLOG(10) << "PE start " + << " " << op->Name() << " : " << op->DebugString(); op->Run(strategy_.use_event_); - VLOG(10) << op << " " << op->Name() << " Done "; + VLOG(10) << "PE end " + << " " << op->Name() << " Done "; running_ops_--; ready_var_q->Extend(op->Outputs()); VLOG(10) << op << " " << op->Name() << "Signal posted"; diff --git a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc index 282ec3f36b9..6b6d4470268 100644 --- a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc +++ b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc @@ -65,20 +65,22 @@ class CreateRecordIOReaderOp : public framework::OperatorBase { static_cast(shape_concat.size()), "The accumulate of all ranks should be equal to the " "shape concat's length."); - std::string filename = Attr("filename"); + auto filenames = Attr>("filenames"); auto* out = scope.FindVar(Output("Out")) ->template GetMutable(); - - out->Reset(new RecordIOFileReader( - filename, RestoreShapes(shape_concat, ranks))); + for (auto& fn : filenames) { + out->Reset( + new RecordIOFileReader(fn, RestoreShapes(shape_concat, ranks))); + } } }; class CreateRecordIOReaderOpMaker : public FileReaderMakerBase { protected: void Apply() override { - AddAttr("filename", "The filename of record io reader"); + AddAttr>("filenames", + "The filenames of record io reader"); AddComment(R"DOC( CreateRecordIOReader Operator diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index 8758ac9f94a..b9d55827304 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -21,7 +21,7 @@ from ..layer_helper import LayerHelper from ..executor import global_scope __all__ = [ - 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_file', + 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_files', 'open_files', 'read_file', 'shuffle', 'batch', 'double_buffer', 'random_data_generator', 'Preprocessor' ] @@ -291,12 +291,12 @@ def _copy_reader_create_op_(block, op): return new_op -def open_recordio_file(filename, - shapes, - lod_levels, - dtypes, - pass_num=1, - for_parallel=True): +def open_recordio_files(filenames, + shapes, + lod_levels, + dtypes, + pass_num=1, + for_parallel=True): """ Open a RecordIO file @@ -304,7 +304,7 @@ def open_recordio_file(filename, Via the Reader Variable, we can get data from the given RecordIO file. Args: - filename(str): The RecordIO file's name. + filename(str) or list(str): The RecordIO file's name. shapes(list): List of tuples which declaring data shapes. lod_levels(list): List of ints which declaring data lod_level. dtypes(list): List of strs which declaring data type. @@ -336,6 +336,8 @@ def open_recordio_file(filename, ranks.append(len(shape)) var_name = unique_name('open_recordio_file') + if isinstance(filenames, str): + filenames = [filenames] startup_blk = default_startup_program().current_block() startup_var = startup_blk.create_var(name=var_name) @@ -345,7 +347,7 @@ def open_recordio_file(filename, attrs={ 'shape_concat': shape_concat, 'lod_levels': lod_levels, - 'filename': filename, + 'filenames': filenames, 'ranks': ranks }) diff --git a/python/paddle/fluid/recordio_writer.py b/python/paddle/fluid/recordio_writer.py index 5accaacd536..7c966cba74a 100644 --- a/python/paddle/fluid/recordio_writer.py +++ b/python/paddle/fluid/recordio_writer.py @@ -14,7 +14,7 @@ import core import contextlib - +from ..batch import batch __all__ = ['convert_reader_to_recordio_file'] @@ -46,3 +46,36 @@ def convert_reader_to_recordio_file( writer.complete_append_tensor() counter += 1 return counter + + +import paddle + + +def convert_reader_to_recordio_files( + filename_suffix, + batch_per_file, + reader_creator, + feeder, + compressor=core.RecordIOWriter.Compressor.Snappy, + max_num_records=1000, + feed_order=None): + if feed_order is None: + feed_order = feeder.feed_names + lines = [] + f_idx = 0 + counter = 0 + for idx, batch in enumerate(reader_creator()): + lines.append(batch) + if idx >= batch_per_file and idx % batch_per_file == 0: + filename = "%s-%05d" % (filename_suffix, f_idx) + with create_recordio_writer(filename, compressor, + max_num_records) as writer: + for l in lines: + res = feeder.feed(l) + for each in feed_order: + writer.append_tensor(res[each]) + writer.complete_append_tensor() + counter += 1 + lines = [] + f_idx += 1 + return counter diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc index 1ce612ca2318ccb9b9f28d51cb93ce8e5e1d0680..07e875aec6c9bae8002bde4223348c6a29647b03 100644 GIT binary patch delta 939 zcmewv{WF@K`72B7N6d=Nrn_Hwj znTRk=T=oZH({v_B$ZsaXuuz4!1Pt38uT)5kv!qmAh*7pe-Ij1_)ZMJFElI##!0e@OH)lM*viO7&gxlS^|`^Gb^K(=$ur%kzt}iwhEyQzyqO z>1?)OiX=kW Date: Thu, 31 May 2018 12:21:13 +0800 Subject: [PATCH 0047/1416] clean up code --- python/paddle/fluid/recordio_writer.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/python/paddle/fluid/recordio_writer.py b/python/paddle/fluid/recordio_writer.py index 7c966cba74a..9557f91bb36 100644 --- a/python/paddle/fluid/recordio_writer.py +++ b/python/paddle/fluid/recordio_writer.py @@ -14,7 +14,6 @@ import core import contextlib -from ..batch import batch __all__ = ['convert_reader_to_recordio_file'] @@ -48,9 +47,6 @@ def convert_reader_to_recordio_file( return counter -import paddle - - def convert_reader_to_recordio_files( filename_suffix, batch_per_file, -- GitLab From a6a7b6f180ec7fe08a3bd41902e88f3fd5caa17a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 31 May 2018 12:23:57 +0800 Subject: [PATCH 0048/1416] code cleanup --- .../details/threaded_ssa_graph_executor.cc | 6 ++---- tools/codestyle/docstring_checker.pyc | Bin 11769 -> 0 bytes 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 335c067dd73..815f739371e 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -189,11 +189,9 @@ void ThreadedSSAGraphExecutor::RunOp( BlockingQueue *ready_var_q, details::OpHandleBase *op) { auto op_run = [ready_var_q, op, this] { try { - VLOG(10) << "PE start " - << " " << op->Name() << " : " << op->DebugString(); + VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); op->Run(strategy_.use_event_); - VLOG(10) << "PE end " - << " " << op->Name() << " Done "; + VLOG(10) << op << " " << op->Name() << " Done "; running_ops_--; ready_var_q->Extend(op->Outputs()); VLOG(10) << op << " " << op->Name() << "Signal posted"; diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index 07e875aec6c9bae8002bde4223348c6a29647b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11769 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 QVT9NjS|84r2F9-c7hLv=%K!iX -- GitLab From 2f49432538fd0d2d95e897ab37e7609acb145fe1 Mon Sep 17 00:00:00 2001 From: weixing02 Date: Thu, 31 May 2018 14:07:26 +0800 Subject: [PATCH 0049/1416] adjust --- python/paddle/fluid/layers/nn.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index f41a1f11955..bc3a7708363 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3028,9 +3028,9 @@ def hsigmoid(input, label, num_classes=2, param_attr=None, bias_attr=None): pre_out = helper.create_tmp_variable(dtype) dim = input.shape[1] if num_classes < 2: - raise valueError("num_classes must be lager or equal than 2.") - if x.shape[0] != y.shape[1]: - raise valueError( + raise ValueError("num_classes must be lager or equal than 2.") + if input.shape[0] != label.shape[1]: + raise ValueError( "input's 1-st dimension and label's 2-nd dimension must be equal they both equal to batch size." ) weights = helper.create_parameter( -- GitLab From 4bd08e3408aa50cc1d762a01eded1f6464291327 Mon Sep 17 00:00:00 2001 From: weixing02 Date: Thu, 31 May 2018 15:00:36 +0800 Subject: [PATCH 0050/1416] make test_layers right --- python/paddle/fluid/layers/nn.py | 2 +- python/paddle/fluid/tests/unittests/test_layers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index bc3a7708363..072679696b1 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3031,7 +3031,7 @@ def hsigmoid(input, label, num_classes=2, param_attr=None, bias_attr=None): raise ValueError("num_classes must be lager or equal than 2.") if input.shape[0] != label.shape[1]: raise ValueError( - "input's 1-st dimension and label's 2-nd dimension must be equal they both equal to batch size." + "input's 1-st dimension and label's 2-nd dimension must be equal, they both equal to batch size." ) weights = helper.create_parameter( attr=helper.param_attr, diff --git a/python/paddle/fluid/tests/unittests/test_layers.py b/python/paddle/fluid/tests/unittests/test_layers.py index 5ac51847880..63ae51c4f42 100644 --- a/python/paddle/fluid/tests/unittests/test_layers.py +++ b/python/paddle/fluid/tests/unittests/test_layers.py @@ -177,7 +177,7 @@ class TestBook(unittest.TestCase): program = Program() with program_guard(program): x = layers.data(name='x', shape=[2, 2], dtype='float32') - y = layers.data(name='y', shape=[1, 3], dtype='int64') + y = layers.data(name='y', shape=[1, 2], dtype='int64') self.assertIsNotNone( layers.hsigmoid( input=x, label=y, num_classes=2)) -- GitLab From 2a1fc03e8ef65cceb8ad7e47d2609896a1911a8b Mon Sep 17 00:00:00 2001 From: weixing02 Date: Thu, 31 May 2018 15:53:14 +0800 Subject: [PATCH 0051/1416] Add hsigmoid --- python/paddle/fluid/layers/nn.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 072679696b1..004dcf7382a 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3029,10 +3029,6 @@ def hsigmoid(input, label, num_classes=2, param_attr=None, bias_attr=None): dim = input.shape[1] if num_classes < 2: raise ValueError("num_classes must be lager or equal than 2.") - if input.shape[0] != label.shape[1]: - raise ValueError( - "input's 1-st dimension and label's 2-nd dimension must be equal, they both equal to batch size." - ) weights = helper.create_parameter( attr=helper.param_attr, shape=[num_classes - 1, dim], -- GitLab From 75ea577fd31a7ead1cbec6aa6b21338040ea585d Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Thu, 31 May 2018 16:01:16 +0800 Subject: [PATCH 0052/1416] allow profiler and timeline to work when dev_ctx is nullptr. Sometimes dev_ctx is not available when RecordEvent. --- paddle/fluid/platform/profiler.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/paddle/fluid/platform/profiler.cc b/paddle/fluid/platform/profiler.cc index 3d8d64e4c27..01de9d7041b 100644 --- a/paddle/fluid/platform/profiler.cc +++ b/paddle/fluid/platform/profiler.cc @@ -127,6 +127,7 @@ double Event::CpuElapsedMs(const Event& e) const { double Event::CudaElapsedMs(const Event& e) const { #ifdef PADDLE_WITH_CUDA + if (!has_cuda_) return 0.0; PADDLE_ENFORCE(e.has_cuda() && has_cuda()); PADDLE_ENFORCE(e.device() == device()); PADDLE_ENFORCE(cudaEventSynchronize(event_)); -- GitLab From 4d11c8e9c64f65b6701edb1ba44cefdff0423acb Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 15:11:46 +0800 Subject: [PATCH 0053/1416] retest single thread --- .../tests/book/test_inference_nlp.cc | 224 +++++++++++------- 1 file changed, 143 insertions(+), 81 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 95cdeb4ad1f..e216e9dbe6f 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -30,16 +30,19 @@ DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); DEFINE_bool(prepare_context, true, "Prepare Context before executor"); +DEFINE_int32(num_threads, 1, "Number of threads should be used"); + inline double get_current_ms() { struct timeval time; gettimeofday(&time, NULL); return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } -void read_data( - std::vector>* out, - const std::string& filename = "/home/tangjian/paddle-tj/out.ids.txt") { +// return size of total words +size_t read_datasets(std::vector* out, + const std::string& filename) { using namespace std; // NOLINT + size_t sz = 0; fstream fin(filename); string line; out->clear(); @@ -50,94 +53,153 @@ void read_data( while (getline(iss, field, ' ')) { ids.push_back(stoi(field)); } - out->push_back(ids); + if (ids.size() >= 1024 || out->size() >= 100) { + continue; + } + + paddle::framework::LoDTensor words; + paddle::framework::LoD lod{{0, ids.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(ids.size()), 1}, paddle::platform::CPUPlace()); + memcpy(pdata, ids.data(), words.numel() * sizeof(int64_t)); + out->emplace_back(words); + sz += ids.size(); } + return sz; +} + +void test_multi_threads() { + /* + size_t jobs_per_thread = std::min(inputdatas.size() / FLAGS_num_threads, + inputdatas.size()); + std::vector workers(FLAGS_num_threads, jobs_per_thread); + workers[FLAGS_num_threads - 1] += inputdatas.size() % FLAGS_num_threads; + + std::vector> infer_threads; + + for (size_t i = 0; i < workers.size(); ++i) { + infer_threads.emplace_back(new std::thread([&, i]() { + size_t start = i * jobs_per_thread; + for (size_t j = start; j < start + workers[i]; ++j ) { + // 0. Call `paddle::framework::InitDevices()` initialize all the + devices + // In unittests, this is done in paddle/testing/paddle_gtest_main.cc + paddle::framework::LoDTensor words; + auto& srcdata = inputdatas[j]; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(srcdata.size()), 1}, + paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); + + LOG(INFO) << "thread id: " << i << ", words size:" << words.numel(); + std::vector cpu_feeds; + cpu_feeds.push_back(&words); + + paddle::framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); + + // Run inference on CPU + if (FLAGS_prepare_vars) { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } else { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } + //LOG(INFO) << output1.lod(); + //LOG(INFO) << output1.dims(); + } + })); + } + auto start_ms = get_current_ms(); + for (int i = 0; i < FLAGS_num_threads; ++i) { + infer_threads[i]->join(); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "total: " << stop_ms - start_ms << " ms";*/ } -TEST(inference, understand_sentiment) { +TEST(inference, nlp) { if (FLAGS_dirname.empty()) { LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; } - std::vector> inputdatas; - read_data(&inputdatas); - LOG(INFO) << "---------- dataset size: " << inputdatas.size(); LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; std::string dirname = FLAGS_dirname; + std::vector datasets; + size_t num_total_words = + read_datasets(&datasets, "/home/tangjian/paddle-tj/out.ids.txt"); + LOG(INFO) << "Number of dataset samples(seq len<1024): " << datasets.size(); + LOG(INFO) << "Total number of words: " << num_total_words; + const bool model_combined = false; - int total_work = 10; - int num_threads = 2; - int work_per_thread = total_work / num_threads; - std::vector> infer_threads; - for (int i = 0; i < num_threads; ++i) { - infer_threads.emplace_back(new std::thread([&, i]() { - for (int j = 0; j < work_per_thread; ++j) { - // 0. Call `paddle::framework::InitDevices()` initialize all the devices - // In unittests, this is done in paddle/testing/paddle_gtest_main.cc - paddle::framework::LoDTensor words; - /* - paddle::framework::LoD lod{{0, 83}}; - int64_t word_dict_len = 198392; - SetupLoDTensor(&words, lod, static_cast(0), - static_cast(word_dict_len - 1)); - */ - std::vector srcdata{ - 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, - 1550, 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, - 396, 6463, 6463, 1550, 198391, 6463, 22564, 1612, 291, - 68, 164, 784, 784, 1550, 198391, 6463, 13659, 3362, - 42468, 6189, 2209, 198391, 6463, 2209, 2209, 198391, 6463, - 2209, 1062, 3029, 1831, 3029, 1065, 2281, 100, 11216, - 1110, 56, 10869, 9811, 100, 198391, 6463, 100, 9280, - 100, 288, 40031, 1680, 1335, 100, 1550, 9280, 7265, - 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, 4376, - 10251, 10760}; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = words.mutable_data( - {static_cast(srcdata.size()), 1}, - paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - - LOG(INFO) << "number of input size:" << words.numel(); - std::vector cpu_feeds; - cpu_feeds.push_back(&words); - - paddle::framework::LoDTensor output1; - std::vector cpu_fetchs1; - cpu_fetchs1.push_back(&output1); - - // Run inference on CPU - if (FLAGS_prepare_vars) { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } else { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } - LOG(INFO) << output1.lod(); - LOG(INFO) << output1.dims(); - } - })); + + // 0. Call `paddle::framework::InitDevices()` initialize all the devices + // 1. Define place, executor, scope + auto place = paddle::platform::CPUPlace(); + auto executor = paddle::framework::Executor(place); + auto* scope = new paddle::framework::Scope(); + + // 2. Initialize the inference_program and load parameters + std::unique_ptr inference_program; + inference_program = InitProgram(&executor, scope, dirname, model_combined); + if (FLAGS_use_mkldnn) { + EnableMKLDNN(inference_program); } - auto start_ms = get_current_ms(); - for (int i = 0; i < num_threads; ++i) { - infer_threads[i]->join(); + + if (FLAGS_num_threads > 1) { + test_multi_threads(); + } else { + if (FLAGS_prepare_vars) { + executor.CreateVariables(*inference_program, scope, 0); + } + // always prepare context and burning first time + std::unique_ptr ctx; + ctx = executor.Prepare(*inference_program, 0); + + // preapre fetch + const std::vector& fetch_target_names = + inference_program->GetFetchTargetNames(); + PADDLE_ENFORCE_EQ(fetch_target_names.size(), 1UL); + std::map fetch_targets; + paddle::framework::LoDTensor outtensor; + fetch_targets[fetch_target_names[0]] = &outtensor; + + // prepare feed + const std::vector& feed_target_names = + inference_program->GetFeedTargetNames(); + PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); + std::map feed_targets; + + // for data and run + auto start_ms = get_current_ms(); + for (size_t i = 0; i < datasets.size(); ++i) { + feed_targets[feed_target_names[0]] = &(datasets[i]); + executor.RunPreparedContext(ctx.get(), scope, &feed_targets, + &fetch_targets, !FLAGS_prepare_vars); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 + << " min, avg time per seq: " + << (stop_ms - start_ms) / datasets.size() << " ms"; } - auto stop_ms = get_current_ms(); - LOG(INFO) << "total: " << stop_ms - start_ms << " ms"; + delete scope; } -- GitLab From d13dd3b6a7ee81d4c106035ec0bad2c581ea795c Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 16:04:47 +0800 Subject: [PATCH 0054/1416] revert profiling --- paddle/fluid/inference/tests/test_helper.h | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index dd3a7a584ad..1f5551567c6 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -156,10 +156,27 @@ void TestInference(const std::string& dirname, auto executor = paddle::framework::Executor(place); auto* scope = new paddle::framework::Scope(); + // Profile the performance + paddle::platform::ProfilerState state; + if (paddle::platform::is_cpu_place(place)) { + state = paddle::platform::ProfilerState::kCPU; + } else { +#ifdef PADDLE_WITH_CUDA + state = paddle::platform::ProfilerState::kAll; + // The default device_id of paddle::platform::CUDAPlace is 0. + // Users can get the device_id using: + // int device_id = place.GetDeviceId(); + paddle::platform::SetDeviceId(0); +#else + PADDLE_THROW("'CUDAPlace' is not supported in CPU only device."); +#endif + } + // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; // Enable the profiler + paddle::platform::EnableProfiler(state); { paddle::platform::RecordEvent record_event( "init_program", @@ -172,6 +189,10 @@ void TestInference(const std::string& dirname, EnableMKLDNN(inference_program); } } + // Disable the profiler and print the timing information + paddle::platform::DisableProfiler(paddle::platform::EventSortingKey::kDefault, + "load_program_profiler"); + paddle::platform::ResetProfiler(); // 3. Get the feed_target_names and fetch_target_names const std::vector& feed_target_names = @@ -212,6 +233,9 @@ void TestInference(const std::string& dirname, true, CreateVars); } + // Enable the profiler + paddle::platform::EnableProfiler(state); + // Run repeat times to profile the performance for (int i = 0; i < repeat; ++i) { paddle::platform::RecordEvent record_event( @@ -228,6 +252,11 @@ void TestInference(const std::string& dirname, CreateVars); } } + + // Disable the profiler and print the timing information + paddle::platform::DisableProfiler( + paddle::platform::EventSortingKey::kDefault, "run_inference_profiler"); + paddle::platform::ResetProfiler(); } delete scope; -- GitLab From 708bec2e56c6a856f628ad8b650b0bf04a3df975 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 16:33:54 +0800 Subject: [PATCH 0055/1416] add test --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index e216e9dbe6f..990d45964e3 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -200,6 +200,14 @@ TEST(inference, nlp) { LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 << " min, avg time per seq: " << (stop_ms - start_ms) / datasets.size() << " ms"; + { // just for test + auto* scope = new paddle::framework::Scope(); + paddle::framework::LoDTensor outtensor; + TestInference( + dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, + false); + delete scope; + } } delete scope; } -- GitLab From f9d93bfde1bd69d84a10cb676f0aba52b1596edd Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 16:42:00 +0800 Subject: [PATCH 0056/1416] Add document to random crop operator --- paddle/fluid/operators/random_crop_op.cc | 6 +-- .../fluid/layers/layer_function_generator.py | 53 ++++++++++++++++--- python/paddle/fluid/layers/nn.py | 29 +++++++++- 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/paddle/fluid/operators/random_crop_op.cc b/paddle/fluid/operators/random_crop_op.cc index b14b559e31d..371cdb5b858 100644 --- a/paddle/fluid/operators/random_crop_op.cc +++ b/paddle/fluid/operators/random_crop_op.cc @@ -36,11 +36,11 @@ class RandomCropOpMaker : public framework::OpProtoAndCheckerMaker { AddInput("Seed", "The random seed."); AddOutput("Out", "The cropped instance batch."); AddOutput("SeedOut", "The random seed after random cropping.") - .AsDispensable(); + .AsIntermediate(); AddAttr>("shape", "The shape of a cropped instance."); AddComment(R"DOC( - This operator takes a batch of instance, and do random cropping on each instance. - It means that cropping positions differs on each instance, which is determined + This operator takes a batch of instance, and do random cropping on each instance. + It means that cropping positions differs on each instance, which is determined by an uniform random generator. All cropped instances have the same shape, which is determined by the operator's attribute 'shape'. )DOC"); diff --git a/python/paddle/fluid/layers/layer_function_generator.py b/python/paddle/fluid/layers/layer_function_generator.py index 295d1b7190e..6026237d0b6 100644 --- a/python/paddle/fluid/layers/layer_function_generator.py +++ b/python/paddle/fluid/layers/layer_function_generator.py @@ -15,16 +15,13 @@ import re import cStringIO import functools import warnings +import string from ..proto import framework_pb2 from ..framework import OpProtoHolder, Variable from ..layer_helper import LayerHelper -__all__ = [ - 'deprecated', - 'generate_layer_fn', - 'autodoc', -] +__all__ = ['deprecated', 'generate_layer_fn', 'autodoc', 'templatedoc'] def _convert_(name): @@ -43,6 +40,10 @@ def _convert_(name): return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() +def _type_to_str_(tp): + return framework_pb2.AttrType.Name(tp) + + def _generate_doc_string_(op_proto): """ Generate docstring by OpProto @@ -54,9 +55,6 @@ def _generate_doc_string_(op_proto): str: the document string """ - def _type_to_str_(tp): - return framework_pb2.AttrType.Name(tp) - if not isinstance(op_proto, framework_pb2.OpProto): raise TypeError("OpProto should be `framework_pb2.OpProto`") @@ -220,3 +218,42 @@ def autodoc(comment=""): return func return __impl__ + + +def templatedoc(): + """ + Decorator of layer function. It will use the docstring from the layer + function as the template. The template arguments are: + + * ${comment}: The operator comment written in CPP. + * ${{name}_comment}: The comment of ${name} written with AddAttr, AddOutput, + and AddInput. The ${name} is Python snake style. i.e., xxx_xxx. + * ${{name}_type}: The type of ${name}. + + + Returns: + Decorated funciton. + """ + + def __impl__(func): + op_proto = OpProtoHolder.instance().get_op_proto(func.__name__) + tmpl = string.Template(func.__doc__) + args = {"comment": " ".join(op_proto.comment.split())} + for each_input in op_proto.inputs: + input_name = _convert_(each_input.name) + args["{0}_comment".format(input_name)] = each_input.comment + args["{0}_type".format(input_name)] = "Variable" + for each_attr in op_proto.attrs: + input_name = _convert_(each_attr.name) + args["{0}_comment".format(input_name)] = each_attr.comment + args["{0}_type".format(input_name)] = _type_to_str_(each_attr.type) + + for each_opt in op_proto.outputs: + output_name = _convert_(each_opt.name) + args["{0}_comment".format(output_name)] = each_opt.comment + args["{0}_type".format(output_name)] = "Variable" + + func.__doc__ = tmpl.substitute(args) + return func + + return __impl__ diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 63ec8315147..acebeaebbb6 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -19,9 +19,10 @@ from ..layer_helper import LayerHelper from ..initializer import Normal, Constant from ..framework import Variable from ..param_attr import ParamAttr -from layer_function_generator import autodoc +from layer_function_generator import autodoc, templatedoc from tensor import concat import utils +import random __all__ = [ 'fc', @@ -3992,10 +3993,34 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): return out -def random_crop(input, shape, seed=1): +@templatedoc() +def random_crop(x, shape, seed=None): + """ + **Random crop operator** + + ${comment} + + Examples: + >>> img = fluid.layers.data("img", [3, 256, 256]) + >>> cropped_img = fluid.layers.random_crop(img, shape=[3, 224, 224]) + + Args: + x(${x_type}): ${x_comment} + shape(${shape_type}): ${shape_comment} + seed(int|${seed_type}|None): ${seed_comment} By default, the seed will + get from `random.randint(-65536, 65535)`. + + Returns: + ${out_comment} + + """ + helper = LayerHelper("random_crop", **locals()) dtype = helper.input_dtype() out = helper.create_tmp_variable(dtype) + if seed is None: + seed = random.randint(-65536, 65535) + if isinstance(seed, int): seed_value = seed seed = helper.create_tmp_variable(dtype="int64") -- GitLab From e330cd032e9a92e2a5851506c35c2ef31e02e01a Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Thu, 31 May 2018 16:34:08 +0800 Subject: [PATCH 0057/1416] balance parameter update --- .../details/multi_devices_graph_builder.cc | 41 +++++++++++++------ .../details/multi_devices_graph_builder.h | 2 +- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.cc b/paddle/fluid/framework/details/multi_devices_graph_builder.cc index d8e711994c5..17baacd13ee 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.cc +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.cc @@ -11,11 +11,15 @@ // 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/fluid/framework/details/multi_devices_graph_builder.h" +#include #include +#include #include +#include + #include "paddle/fluid/framework/details/broadcast_op_handle.h" #include "paddle/fluid/framework/details/computation_op_handle.h" +#include "paddle/fluid/framework/details/multi_devices_graph_builder.h" #include "paddle/fluid/framework/details/reduce_op_handle.h" #include "paddle/fluid/framework/details/rpc_op_handle.h" #include "paddle/fluid/framework/details/scale_loss_grad_op_handle.h" @@ -26,9 +30,6 @@ #include "paddle/fluid/framework/details/nccl_all_reduce_op_handle.h" #endif -#include -#include - DEFINE_string(ssa_graph_path, "/tmp/ssa_graph.dot", "the ssa graph path only print with GLOG_v=10," "default /tmp/graph.dot"); @@ -148,9 +149,9 @@ bool MultiDevSSAGraphBuilder::IsDistTrainOp( std::unique_ptr MultiDevSSAGraphBuilder::Build( const ProgramDesc &program) const { - std::unordered_map var_types; + std::unordered_map all_vars; for (auto *var : program.Block(0).AllVars()) { - var_types[var->Name()] = var->GetType(); + all_vars[var->Name()] = var; } auto graph = new SSAGraph(); @@ -167,12 +168,28 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( auto send_vars = FindDistTrainSendVars(program); auto recv_vars = FindDistTrainRecvVars(program); - size_t cur_device_id = 0; std::vector> var_name_on_devices; std::vector> bcast_var_name_set; var_name_on_devices.resize(places_.size()); bcast_var_name_set.resize(places_.size()); + size_t cur_device_id = 0; + std::vector balance_grads(places_.size(), 0); + + auto get_appropriate_dev = [&](std::string &g_name) -> size_t { + auto var_desc = all_vars.at(g_name); + PADDLE_ENFORCE_NOT_NULL(var_desc); + auto dim = framework::make_ddim(var_desc->GetShape()); + int64_t numel = framework::product(dim); + PADDLE_ENFORCE_GE(numel, 0); + auto smallest = + std::min_element(std::begin(balance_grads), std::end(balance_grads)); + size_t dev_id = + static_cast(std::distance(std::begin(balance_grads), smallest)); + balance_grads[dev_id] += numel; + return dev_id; + }; + bool is_forwarding = true; for (auto *op : program.Block(0).AllOps()) { if (boost::get( @@ -220,13 +237,13 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( switch (strategy_.reduce_) { case BuildStrategy::ReduceStrategy::kReduce: + cur_device_id = get_appropriate_dev(g_name); CreateReduceOp(&result, g_name, cur_device_id); var_name_on_devices[cur_device_id].emplace(g_name); bcast_var_name_set[cur_device_id].emplace(p_name); - cur_device_id = (cur_device_id + 1) % places_.size(); break; case BuildStrategy::ReduceStrategy::kAllReduce: - if (IsSparseGradient(var_types, g_name)) { + if (IsSparseGradient(all_vars, g_name)) { CreateReduceOp(&result, g_name, 0); CreateBroadcastOp(&result, g_name, 0); } else { @@ -269,10 +286,10 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( } bool MultiDevSSAGraphBuilder::IsSparseGradient( - const std::unordered_map &var_types, + const std::unordered_map &all_vars, const std::string &og) const { - PADDLE_ENFORCE(var_types.count(og) != 0); - if (var_types.at(og) == proto::VarType::SELECTED_ROWS) { + PADDLE_ENFORCE(all_vars.count(og) != 0); + if (all_vars.at(og)->GetType() == proto::VarType::SELECTED_ROWS) { return true; } return false; diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.h b/paddle/fluid/framework/details/multi_devices_graph_builder.h index e07597dbd80..544cbe585c7 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.h +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.h @@ -106,7 +106,7 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { size_t src_dev_id) const; bool IsSparseGradient( - const std::unordered_map &var_types, + const std::unordered_map &all_vars, const std::string &og) const; private: -- GitLab From 2a3c58d3fecab43a753bd8c47e327ceae9f0f467 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Thu, 31 May 2018 16:56:43 +0800 Subject: [PATCH 0058/1416] refine programdesc copy --- paddle/fluid/framework/block_desc.cc | 2 +- paddle/fluid/framework/block_desc.h | 2 +- paddle/fluid/framework/program_desc.cc | 15 +++++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/paddle/fluid/framework/block_desc.cc b/paddle/fluid/framework/block_desc.cc index fd409ed4c0f..b15aba91069 100644 --- a/paddle/fluid/framework/block_desc.cc +++ b/paddle/fluid/framework/block_desc.cc @@ -209,7 +209,7 @@ BlockDesc::BlockDesc(const BlockDesc &other, proto::BlockDesc *desc, : prog_(prog), desc_(desc) { need_update_ = true; for (auto &op : other.ops_) { - ops_.emplace_back(new OpDesc(*op->Proto(), prog, this)); + ops_.emplace_back(new OpDesc(*op, this)); } for (auto &it : other.vars_) { auto *var = new VarDesc(*it.second); diff --git a/paddle/fluid/framework/block_desc.h b/paddle/fluid/framework/block_desc.h index 600601669c5..189dd6c52f8 100644 --- a/paddle/fluid/framework/block_desc.h +++ b/paddle/fluid/framework/block_desc.h @@ -105,7 +105,7 @@ class BlockDesc { size_t OpSize() const { return ops_.size(); } - OpDesc *Op(int idx) { return ops_.at(idx).get(); } + OpDesc *Op(int idx) const { return ops_.at(idx).get(); } void Flush(); diff --git a/paddle/fluid/framework/program_desc.cc b/paddle/fluid/framework/program_desc.cc index 64fb028f83a..aa01f9928cf 100644 --- a/paddle/fluid/framework/program_desc.cc +++ b/paddle/fluid/framework/program_desc.cc @@ -51,12 +51,15 @@ ProgramDesc::ProgramDesc(const ProgramDesc &o) { auto *block = desc_.mutable_blocks(i); blocks_.emplace_back(new BlockDesc(*o.blocks_[i], block, this)); } - for (auto &block : blocks_) { - for (auto *op : block->AllOps()) { - for (const auto &attr : op->Proto()->attrs()) { - if (attr.type() == proto::AttrType::BLOCK) { - size_t blk_idx = attr.block_idx(); - op->SetBlockAttr(attr.name(), this->MutableBlock(blk_idx)); + for (size_t block_id = 0; block_id < blocks_.size(); ++block_id) { + auto all_ops = blocks_[block_id]->AllOps(); + for (size_t op_id = 0; op_id < all_ops.size(); ++op_id) { + auto &op = all_ops[op_id]; + for (const std::string &attr_name : op->AttrNames()) { + if (op->GetAttrType(attr_name) == proto::AttrType::BLOCK) { + int sub_block_id = + o.Block(block_id).Op(op_id)->GetBlockAttr(attr_name); + op->SetBlockAttr(attr_name, MutableBlock(sub_block_id)); } } } -- GitLab From 7c00e164e5886bb430ff945f2de091a2d45ff811 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 17:07:42 +0800 Subject: [PATCH 0059/1416] Add More comments --- .../fluid/layers/layer_function_generator.py | 13 ++++++--- python/paddle/fluid/layers/nn.py | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/layers/layer_function_generator.py b/python/paddle/fluid/layers/layer_function_generator.py index 6026237d0b6..fb5e454e94f 100644 --- a/python/paddle/fluid/layers/layer_function_generator.py +++ b/python/paddle/fluid/layers/layer_function_generator.py @@ -230,15 +230,22 @@ def templatedoc(): and AddInput. The ${name} is Python snake style. i.e., xxx_xxx. * ${{name}_type}: The type of ${name}. - Returns: - Decorated funciton. + Decorated function. """ def __impl__(func): op_proto = OpProtoHolder.instance().get_op_proto(func.__name__) tmpl = string.Template(func.__doc__) - args = {"comment": " ".join(op_proto.comment.split())} + + comment_lines = op_proto.comment.split("\n") + comment = "" + for line in comment_lines: + line = line.lstrip() + comment += line + comment += "\n" + + args = {"comment": comment} for each_input in op_proto.inputs: input_name = _convert_(each_input.name) args["{0}_comment".format(input_name)] = each_input.comment diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index acebeaebbb6..970a186fac5 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -799,7 +799,22 @@ def gru_unit(input, return updated_hidden, reset_hidden_pre, gate +@templatedoc() def linear_chain_crf(input, label, param_attr=None): + """ + Linear Chain CRF. + + ${comment} + + Args: + input(${emission_type}): ${emission_comment} + label(${label_type}): ${label_comment} + param_attr(ParamAttr): The attribute of the learnable parameter. + + Returns: + ${log_likelihood_comment} + + """ helper = LayerHelper('linear_chain_crf', **locals()) size = input.shape[1] transition = helper.create_parameter( @@ -825,7 +840,19 @@ def linear_chain_crf(input, label, param_attr=None): return log_likelihood +@templatedoc() def crf_decoding(input, param_attr, label=None): + """ + ${comment} + + Args: + input(${emission_type}): ${emission_comment} + param_attr(ParamAttr): The parameter attribute for training. + label(${label_type}): ${label_comment} + + Returns: + ${viterbi_path_comment} + """ helper = LayerHelper('crf_decoding', **locals()) transition = helper.get_parameter(param_attr.name) viterbi_path = helper.create_tmp_variable(dtype=helper.input_dtype()) -- GitLab From 018d411075d40070b1efbae0f86185a819d35586 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 17:09:26 +0800 Subject: [PATCH 0060/1416] Remove unnecessary func name --- python/paddle/fluid/layers/nn.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 970a186fac5..5e139a26538 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -4023,8 +4023,6 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): @templatedoc() def random_crop(x, shape, seed=None): """ - **Random crop operator** - ${comment} Examples: -- GitLab From e90bfd562b4738ead125a126124bbd8d526cb7a6 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 18:07:06 +0800 Subject: [PATCH 0061/1416] 1. Make a base unittest class for dist transpiler unittest 2. Merge the develop repo --- .../tests/unittests/test_dist_transpiler.py | 58 +-------------- .../unittests/test_simple_dist_transpiler.py | 47 +----------- .../fluid/tests/unittests/transpiler_test.py | 73 +++++++++++++++++++ .../fluid/transpiler/distribute_transpiler.py | 15 ++-- 4 files changed, 87 insertions(+), 106 deletions(-) create mode 100644 python/paddle/fluid/tests/unittests/transpiler_test.py diff --git a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py index fa49bd41a58..a24f2aeecda 100644 --- a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py @@ -12,40 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest - -import paddle.fluid as fluid -import paddle.fluid.core as core -import paddle.fluid.layers as layers from paddle.fluid.transpiler.distribute_transpiler import delete_ops -import numpy + +from transpiler_test import TranspilerTest -class TestDistTranspiler(unittest.TestCase): +class TestDistTranspiler(TranspilerTest): def setUp(self): - self.trainer_id = 0 - self.trainers = 2 - self.pservers = 2 - self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" self.current_pserver_ep = "127.0.0.1:6174" - def net_conf(self): - x = fluid.layers.data(name='x', shape=[1000], dtype='float32') - - y_predict = fluid.layers.fc(input=x, - size=1000, - act=None, - param_attr=fluid.ParamAttr(name='fc_w')) - - y = fluid.layers.data(name='y', shape=[1], dtype='float32') - - cost = fluid.layers.square_error_cost(input=y_predict, label=y) - avg_cost = fluid.layers.mean(cost) - sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) - - optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) - return optimize_ops, params_grads - def test_transpiler(self): trainer = self.get_trainer() pserver, startup = self.get_pserver(self.current_pserver_ep) @@ -70,14 +45,6 @@ class TestDistTranspiler(unittest.TestCase): fc_w_var = startup.global_block().var("fc_w.block1") self.assertEqual(fc_w_var.shape, (500, 1000)) - def get_main_program(self): - main = fluid.Program() - - with fluid.program_guard(main): - self.net_conf() - - return main - def get_expect_trainer_ops(self): trainer = fluid.Program() @@ -92,25 +59,6 @@ class TestDistTranspiler(unittest.TestCase): ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars") return ops - def get_trainer(self): - return self._transpiler_instance().get_trainer_program() - - def get_pserver(self, ep): - t = self._transpiler_instance() - pserver = t.get_pserver_program(ep) - startup = t.get_startup_program(ep, pserver) - return pserver, startup - - def _transpiler_instance(self): - main = self.get_main_program() - t = fluid.DistributeTranspiler() - t.transpile( - self.trainer_id, - program=main, - pservers=self.pserver_eps, - trainers=self.trainers) - return t - if __name__ == "__main__": unittest.main() diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py index 60f99f412cd..25d79b51f99 100644 --- a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -12,40 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest +import numpy as np import paddle.fluid as fluid -import paddle.fluid.core as core -import paddle.fluid.layers as layers from paddle.fluid.transpiler.distribute_transpiler import delete_ops -import numpy as np +from transpiler_test import TranspilerTest -class TestSimpleDistTranspiler(unittest.TestCase): + +class TestSimpleDistTranspiler(TranspilerTest): def setUp(self): - self.trainer_id = 0 - self.trainers = 2 - self.pservers = 2 - self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" self.current_pserver_ep = "127.0.0.1:6175" - def net_conf(self): - x = fluid.layers.data(name='x', shape=[1000], dtype='float32') - - y_predict = fluid.layers.fc(input=x, - size=1000, - act=None, - param_attr=fluid.ParamAttr(name='fc_w')) - - y = fluid.layers.data(name='y', shape=[1], dtype='float32') - - cost = fluid.layers.square_error_cost(input=y_predict, label=y) - avg_cost = fluid.layers.mean(cost) - sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) - - optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) - return optimize_ops, params_grads - def test_simple_transpiler(self): np.random.seed(1) @@ -73,14 +51,6 @@ class TestSimpleDistTranspiler(unittest.TestCase): fc_w_var = startup.global_block().var("fc_w@GRAD.trainer_0") self.assertEqual(fc_w_var.shape, (1000, 1000)) - def get_main_program(self): - main = fluid.Program() - - with fluid.program_guard(main): - self.net_conf() - - return main - def get_expect_trainer_ops(self): trainer = fluid.Program() @@ -94,15 +64,6 @@ class TestSimpleDistTranspiler(unittest.TestCase): ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars") return ops - def get_trainer(self): - return self._transpiler_instance().get_trainer_program() - - def get_pserver(self, ep): - t = self._transpiler_instance() - pserver = t.get_pserver_program(ep) - startup = t.get_startup_program(ep, pserver) - return pserver, startup - def _transpiler_instance(self): main = self.get_main_program() t = fluid.DistributeTranspiler() diff --git a/python/paddle/fluid/tests/unittests/transpiler_test.py b/python/paddle/fluid/tests/unittests/transpiler_test.py new file mode 100644 index 00000000000..d84c5d9c41c --- /dev/null +++ b/python/paddle/fluid/tests/unittests/transpiler_test.py @@ -0,0 +1,73 @@ +# Copyright (c) 2018 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. + +import unittest +import numpy as np + +import paddle.fluid as fluid +import paddle.fluid.core as core +import paddle.fluid.layers as layers + + +class TranspilerTest(unittest.TestCase): + @classmethod + def setUpClass(self): + self.trainer_id = 0 + self.trainers = 2 + self.pservers = 2 + self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" + + def net_conf(self): + x = fluid.layers.data(name='x', shape=[1000], dtype='float32') + + y_predict = fluid.layers.fc(input=x, + size=1000, + act=None, + param_attr=fluid.ParamAttr(name='fc_w')) + + y = fluid.layers.data(name='y', shape=[1], dtype='float32') + + cost = fluid.layers.square_error_cost(input=y_predict, label=y) + avg_cost = fluid.layers.mean(cost) + sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) + + optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) + return optimize_ops, params_grads + + def get_main_program(self): + main = fluid.Program() + + with fluid.program_guard(main): + self.net_conf() + + return main + + def get_trainer(self): + return self._transpiler_instance().get_trainer_program() + + def get_pserver(self, ep): + t = self._transpiler_instance() + pserver = t.get_pserver_program(ep) + startup = t.get_startup_program(ep, pserver) + return pserver, startup + + def _transpiler_instance(self): + main = self.get_main_program() + t = fluid.DistributeTranspiler() + t.transpile( + self.trainer_id, + program=main, + pservers=self.pserver_eps, + trainers=self.trainers) + return t diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index 04d47fb82e9..a116671c1b1 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -178,7 +178,7 @@ class DistributeTranspiler: for index in range(len(self.pserver_endpoints)) ] - def _init_splited_vars(self, split_method): + def _init_splited_vars(self, split_method, align_var_to_block=True): # update these mappings for further transpile: # 1. param_var_mapping: param var name -> [splited params vars] # 2. grad_var_mapping: grad var name -> [splited grads vars] @@ -198,15 +198,14 @@ class DistributeTranspiler: self.params_grads) if align_var_to_block: - grad_blocks = split_dense_variable(grad_list, - len(pserver_endpoints)) - param_blocks = split_dense_variable(param_list, - len(pserver_endpoints)) + grad_blocks = split_variable(grad_list, len(self.pserver_endpoints)) + param_blocks = split_variable(param_list, + len(self.pserver_endpoints)) else: # when we do NOT align var to block, we will always split params # grads into one block. - grad_blocks = split_dense_variable(grad_list, 1) - param_blocks = split_dense_variable(param_list, 1) + grad_blocks = split_variable(grad_list, 1) + param_blocks = split_variable(param_list, 1) assert (len(grad_blocks) == len(param_blocks)) # origin_varname -> [splited_var] self.param_var_mapping = self._create_vars_from_blocklist( @@ -272,7 +271,7 @@ class DistributeTranspiler: self.has_distributed_lookup_table = self._has_distributed_lookup_table() # split and create vars, then put splited vars in dicts for later use. - self._init_splited_vars(split_method) + self._init_splited_vars(split_method, align_var_to_block) # step 3.1: insert send op to send gradient vars to parameter servers ps_dispatcher.reset() -- GitLab From 733718c3e724fdd84355010e76ddd17e5b60ef2c Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 19:12:23 +0800 Subject: [PATCH 0062/1416] remove the ugly test --- .../inference/tests/book/test_inference_nlp.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 990d45964e3..5241661fb31 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -53,7 +53,7 @@ size_t read_datasets(std::vector* out, while (getline(iss, field, ' ')) { ids.push_back(stoi(field)); } - if (ids.size() >= 1024 || out->size() >= 100) { + if (ids.size() >= 1024 ) { continue; } @@ -200,14 +200,14 @@ TEST(inference, nlp) { LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 << " min, avg time per seq: " << (stop_ms - start_ms) / datasets.size() << " ms"; - { // just for test - auto* scope = new paddle::framework::Scope(); - paddle::framework::LoDTensor outtensor; - TestInference( - dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, - false); - delete scope; - } +// { // just for test +// auto* scope = new paddle::framework::Scope(); +// paddle::framework::LoDTensor outtensor; +// TestInference( +// dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, +// false); +// delete scope; +// } } delete scope; } -- GitLab From 2007f630b47d52738b3896ec7d6af90c50b129d2 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Thu, 31 May 2018 19:23:24 +0800 Subject: [PATCH 0063/1416] add build and install document of fluid inference library --- doc/fluid/howto/index_cn.rst | 2 +- doc/fluid/howto/index_en.rst | 1 - .../inference/build_and_install_lib_cn.rst | 96 +++++++++++++++++++ doc/fluid/howto/inference/index_cn.rst | 8 ++ ...id.md => inference_support_in_fluid_cn.md} | 59 +----------- 5 files changed, 106 insertions(+), 60 deletions(-) create mode 100644 doc/fluid/howto/inference/build_and_install_lib_cn.rst create mode 100644 doc/fluid/howto/inference/index_cn.rst rename doc/fluid/howto/inference/{inference_support_in_fluid.md => inference_support_in_fluid_cn.md} (90%) diff --git a/doc/fluid/howto/index_cn.rst b/doc/fluid/howto/index_cn.rst index b7c62017972..b57af64f44d 100644 --- a/doc/fluid/howto/index_cn.rst +++ b/doc/fluid/howto/index_cn.rst @@ -4,5 +4,5 @@ .. toctree:: :maxdepth: 1 + inference/index_cn.rst optimization/index_cn.rst - inference/inference_support_in_fluid.md diff --git a/doc/fluid/howto/index_en.rst b/doc/fluid/howto/index_en.rst index f3ca41cdbf1..fd21e167ce3 100644 --- a/doc/fluid/howto/index_en.rst +++ b/doc/fluid/howto/index_en.rst @@ -5,4 +5,3 @@ HOW TO :maxdepth: 1 optimization/index_en.rst - inference/inference_support_in_fluid.md diff --git a/doc/fluid/howto/inference/build_and_install_lib_cn.rst b/doc/fluid/howto/inference/build_and_install_lib_cn.rst new file mode 100644 index 00000000000..c8d9992fcc9 --- /dev/null +++ b/doc/fluid/howto/inference/build_and_install_lib_cn.rst @@ -0,0 +1,96 @@ +安装与编译C++预测库 +=========================== + +直接下载安装 +------------- + +====================== ======================================== +版本说明 C++预测库 +====================== ======================================== +cpu_avx_mkl `fluid.tgz `_ +cpu_avx_openblas `fluid.tgz `_ +cpu_noavx_openblas `fluid.tgz `_ +cuda7.5_cudnn5_avx_mkl `fluid.tgz `_ +cuda8.0_cudnn5_avx_mkl `fluid.tgz `_ +cuda8.0_cudnn7_avx_mkl `fluid.tgz `_ +====================== ======================================== + +从源码编译 +---------- +用户也可以从 PaddlePaddle 核心代码编译C++预测库,只需在编译时配制下面这些编译选项: + +================= ========= +选项 值 +================= ========= +CMAKE_BUILD_TYPE Release +FLUID_INSTALL_DIR 安装路径 +WITH_FLUID_ONLY ON(推荐) +WITH_SWIG_PY OFF(推荐 +WITH_PYTHON OFF(推荐) +WITH_GPU ON/OFF +WITH_MKL ON/OFF +================= ========= + +建议按照推荐值设置,以避免链接不必要的库。其它可选编译选项按需进行设定。 + +下面的代码片段从github拉取最新代码,配制编译选项(需要将PADDLE_ROOT替换为PaddlePaddle预测库的安装路径): + + .. code-block:: bash + + pip install paddlepaddle-gpu + PADDLE_ROOT=/path/of/capi + git clone https://github.com/PaddlePaddle/Paddle.git + cd Paddle + mkdir build + cd build + cmake -DFLUID_INSTALL_DIR=$PADDLE_ROOT \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_FLUID_ONLY=ON \ + -DWITH_SWIG_PY=OFF \ + -DWITH_PYTHON=OFF \ + -DWITH_MKL=OFF \ + -DWITH_GPU=OFF \ + .. + make + make inference_lib_dist + +成功编译后,使用C++预测库所需的依赖(包括:(1)编译出的PaddlePaddle预测库和头文件;(2)第三方链接库和头文件;(3)版本信息与编译选项信息) +均会存放于PADDLE_ROOT目录中。目录结构如下: + + .. code-block:: text + + PaddleRoot/ + ├── CMakeCache.txt + ├── paddle + │   └── fluid + │   ├── framework + │   ├── inference + │   ├── memory + │   ├── platform + │   ├── pybind + │   └── string + ├── third_party + │   ├── boost + │   │   └── boost + │   ├── eigen3 + │   │   ├── Eigen + │   │   └── unsupported + │   └── install + │   ├── gflags + │   ├── glog + │   ├── mklml + │   ├── protobuf + │   ├── snappy + │   ├── snappystream + │   └── zlib + └── version.txt + +version.txt 中记录了该预测库的版本信息,包括Git Commit ID、使用OpenBlas或MKL数学库、CUDA/CUDNN版本号,如: + + .. code-block:: text + + GIT COMMIT ID: c95cd4742f02bb009e651a00b07b21c979637dc8 + WITH_MKL: ON + WITH_GPU: ON + CUDA version: 8.0 + CUDNN version: v5 diff --git a/doc/fluid/howto/inference/index_cn.rst b/doc/fluid/howto/inference/index_cn.rst new file mode 100644 index 00000000000..a903423548d --- /dev/null +++ b/doc/fluid/howto/inference/index_cn.rst @@ -0,0 +1,8 @@ +预测库 +------------ + +.. toctree:: + :maxdepth: 1 + + build_and_install_lib_cn.rst + inference_support_in_fluid_cn.md diff --git a/doc/fluid/howto/inference/inference_support_in_fluid.md b/doc/fluid/howto/inference/inference_support_in_fluid_cn.md similarity index 90% rename from doc/fluid/howto/inference/inference_support_in_fluid.md rename to doc/fluid/howto/inference/inference_support_in_fluid_cn.md index d272cd3e3bd..309b17fccd5 100644 --- a/doc/fluid/howto/inference/inference_support_in_fluid.md +++ b/doc/fluid/howto/inference/inference_support_in_fluid_cn.md @@ -1,9 +1,8 @@ -# Fluid Inference使用指南 +# 使用指南 ## 目录: - Python Inference API -- 编译Fluid Inference库 - Inference C++ API - Inference实例 - Inference计算优化 @@ -55,62 +54,6 @@ return [program, feed_target_names, fetch_targets] ``` - -## 编译Fluid Inference库 - - - **不需要额外的CMake选项** - - 1、 配置CMake命令,更多配置请参考[源码编译PaddlePaddle](http://www.paddlepaddle.org/docs/develop/documentation/zh/build_and_install/build_from_source_cn.html) - ```bash - $ git clone https://github.com/PaddlePaddle/Paddle.git - $ cd Paddle - $ mkdir build - $ cd build - $ cmake -DCMAKE_INSTALL_PREFIX=your/path/to/paddle_inference_lib \ - -DCMAKE_BUILD_TYPE=Release \ - -DWITH_PYTHON=ON \ - -DWITH_MKL=OFF \ - -DWITH_GPU=OFF \ - .. - ``` - - - 2、 编译PaddlePaddle - ```bash - $ make - ``` - - - 3、 部署。执行如下命令将PaddlePaddle Fluid Inference库部署到`your/path/to/paddle_inference_lib`目录。 - ```bash - $ make inference_lib_dist - ``` - -- 目录结构 - - ```bash - $ cd your/path/to/paddle_inference_lib - $ tree - . - |-- paddle - | `-- fluid - | |-- framework - | |-- inference - | | |-- io.h - | | `-- libpaddle_fluid.so - | |-- memory - | |-- platform - | `-- string - |-- third_party - | |-- eigen3 - | `-- install - | |-- gflags - | |-- glog - | `-- protobuf - `-- ... - ``` - - 假设`PADDLE_ROOT=your/path/to/paddle_inference_lib`。 - - - ## 链接Fluid Inference库 - 示例项目([链接](https://github.com/luotao1/fluid_inference_example.git)) -- GitLab From 9d92dcea0a41093ad782561a0ade4095afbefcfa Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 20:34:23 +0800 Subject: [PATCH 0064/1416] 1. import fluid to dist transpiler test --- python/paddle/fluid/tests/unittests/test_dist_transpiler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py index a24f2aeecda..32647f9aa81 100644 --- a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import paddle.fluid as fluid from paddle.fluid.transpiler.distribute_transpiler import delete_ops from transpiler_test import TranspilerTest -- GitLab From a3aca2a3cfeb6ab246ff95987374809be1a3c863 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Thu, 31 May 2018 20:58:26 +0800 Subject: [PATCH 0065/1416] fix bugs --- paddle/fluid/framework/block_desc.cc | 2 +- paddle/fluid/framework/op_desc.cc | 2 +- paddle/fluid/framework/op_desc.h | 3 ++- paddle/fluid/framework/program_desc.cc | 10 ++++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/framework/block_desc.cc b/paddle/fluid/framework/block_desc.cc index b15aba91069..e7842e9b813 100644 --- a/paddle/fluid/framework/block_desc.cc +++ b/paddle/fluid/framework/block_desc.cc @@ -200,7 +200,7 @@ BlockDesc::BlockDesc(ProgramDesc *prog, proto::BlockDesc *desc) vars_[var_desc.name()].reset(new VarDesc(var_desc)); } for (const proto::OpDesc &op_desc : desc_->ops()) { - ops_.emplace_back(new OpDesc(op_desc, prog, this)); + ops_.emplace_back(new OpDesc(op_desc, this)); } } diff --git a/paddle/fluid/framework/op_desc.cc b/paddle/fluid/framework/op_desc.cc index 09b67e5a174..f92769192c2 100644 --- a/paddle/fluid/framework/op_desc.cc +++ b/paddle/fluid/framework/op_desc.cc @@ -103,7 +103,7 @@ void OpDesc::CopyFrom(const OpDesc &op_desc) { need_update_ = true; } -OpDesc::OpDesc(const proto::OpDesc &desc, ProgramDesc *prog, BlockDesc *block) +OpDesc::OpDesc(const proto::OpDesc &desc, BlockDesc *block) : desc_(desc), need_update_(false) { // restore inputs_ int input_size = desc_.inputs_size(); diff --git a/paddle/fluid/framework/op_desc.h b/paddle/fluid/framework/op_desc.h index 1a330db7cc5..a02d3e26912 100644 --- a/paddle/fluid/framework/op_desc.h +++ b/paddle/fluid/framework/op_desc.h @@ -33,13 +33,14 @@ class OpDesc { OpDesc(const std::string &type, const VariableNameMap &inputs, const VariableNameMap &outputs, const AttributeMap &attrs); - OpDesc(const proto::OpDesc &desc, ProgramDesc *prog, BlockDesc *block); + OpDesc(const proto::OpDesc &desc, BlockDesc *block); explicit OpDesc(BlockDesc *block) : block_(block) {} OpDesc(const OpDesc &other, BlockDesc *block) { *this = other; block_ = block; + need_update_ = true; } void CopyFrom(const OpDesc &op_desc); diff --git a/paddle/fluid/framework/program_desc.cc b/paddle/fluid/framework/program_desc.cc index aa01f9928cf..1e01a6e9004 100644 --- a/paddle/fluid/framework/program_desc.cc +++ b/paddle/fluid/framework/program_desc.cc @@ -89,6 +89,16 @@ ProgramDesc::ProgramDesc(const std::string &binary_str) { for (auto &block_desc : *desc_.mutable_blocks()) { blocks_.emplace_back(new BlockDesc(this, &block_desc)); } + for (auto &block : blocks_) { + for (auto *op : block->AllOps()) { + for (const auto &attr : op->Proto()->attrs()) { + if (attr.type() == proto::AttrType::BLOCK) { + size_t blk_idx = attr.block_idx(); + op->SetBlockAttr(attr.name(), this->MutableBlock(blk_idx)); + } + } + } + } } const std::vector ProgramDesc::GetFeedTargetNames() { -- GitLab From 04ccbed5b8539bd3fb97df5169ff9103edac3d60 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Fri, 1 Jun 2018 10:04:59 +0800 Subject: [PATCH 0066/1416] fix a compile error --- paddle/fluid/inference/tensorrt/convert/ut_helper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/inference/tensorrt/convert/ut_helper.h b/paddle/fluid/inference/tensorrt/convert/ut_helper.h index 37fcb5c5030..dd481fa234e 100644 --- a/paddle/fluid/inference/tensorrt/convert/ut_helper.h +++ b/paddle/fluid/inference/tensorrt/convert/ut_helper.h @@ -101,7 +101,7 @@ class TRTConvertValidation { engine_->FreezeNetwork(); // Declare outputs. - op_desc_.reset(new framework::OpDesc(desc, nullptr, nullptr)); + op_desc_.reset(new framework::OpDesc(desc, nullptr)); // Set Inputs. for (const auto& input : op_desc_->InputArgumentNames()) { -- GitLab From 7973d9b4b5b3ef032c13410401b8c368220cd21d Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Fri, 1 Jun 2018 10:09:31 +0800 Subject: [PATCH 0067/1416] bug fix --- python/paddle/fluid/trainer.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 3354d77acec..72168886fdb 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -178,10 +178,11 @@ class Trainer(object): exe.run(self.startup_program) if self.checkpoint and self.checkpoint.load_serial: - exe = executor.Executor(place) - io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.checkpoint.load_serial, - self.startup_program) + with self._prog_and_scope_guard(): + exe = executor.Executor(place) + io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.checkpoint.load_serial, + self.startup_program) if not self.checkpoint.is_pserver: epoch_id, step_id = io.load_trainer_args( -- GitLab From 31f0533c5ddce9d3db8dbabb8a581f3694f0a7e1 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Fri, 1 Jun 2018 10:54:19 +0800 Subject: [PATCH 0068/1416] fix compile errors --- paddle/fluid/inference/tensorrt/convert/activation_op.cc | 2 +- paddle/fluid/inference/tensorrt/convert/mul_op.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tensorrt/convert/activation_op.cc b/paddle/fluid/inference/tensorrt/convert/activation_op.cc index 6297051e5a3..79d01b640a2 100644 --- a/paddle/fluid/inference/tensorrt/convert/activation_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/activation_op.cc @@ -24,7 +24,7 @@ class ReluOpConverter : public OpConverter { void operator()(const framework::proto::OpDesc& op) override { // Here the two nullptr looks strange, that's because the // framework::OpDesc's constructor is strange. - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); LOG(INFO) << "convert a fluid relu op to tensorrt activation layer whose " "type is Relu"; const nvinfer1::ITensor* input_tensor = diff --git a/paddle/fluid/inference/tensorrt/convert/mul_op.cc b/paddle/fluid/inference/tensorrt/convert/mul_op.cc index ed09f54bde0..aa8e66490f7 100644 --- a/paddle/fluid/inference/tensorrt/convert/mul_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/mul_op.cc @@ -27,7 +27,7 @@ class MulOpConverter : public OpConverter { void operator()(const framework::proto::OpDesc& op) override { VLOG(4) << "convert a fluid mul op to tensorrt fc layer without bias"; - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); // Declare inputs auto* input1 = engine_->GetITensor(op_desc.Input("X")[0]); auto* input2 = engine_->GetITensor(op_desc.Input("Y")[0]); -- GitLab From f9556dca51484c270284c181337fc041964f2db0 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 1 Jun 2018 10:59:42 +0800 Subject: [PATCH 0069/1416] use open_files reader to read multiple files --- .../howto/cluster/fluid_recordio.md} | 26 ++++++++++-------- .../reader/create_recordio_file_reader_op.cc | 12 ++++---- python/paddle/fluid/layers/io.py | 20 ++++++-------- python/paddle/fluid/recordio_writer.py | 12 ++++++-- tools/codestyle/docstring_checker.pyc | Bin 0 -> 11769 bytes 5 files changed, 37 insertions(+), 33 deletions(-) rename doc/{v2/howto/recordio/README.md => fluid/howto/cluster/fluid_recordio.md} (88%) create mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/doc/v2/howto/recordio/README.md b/doc/fluid/howto/cluster/fluid_recordio.md similarity index 88% rename from doc/v2/howto/recordio/README.md rename to doc/fluid/howto/cluster/fluid_recordio.md index 3f81d54b8e1..0e8b98542d1 100644 --- a/doc/v2/howto/recordio/README.md +++ b/doc/fluid/howto/cluster/fluid_recordio.md @@ -89,14 +89,14 @@ The above codes would generate multiple RecordIO files on your host like: ```bash . - \_mnist.recordio-00000 - |-mnist.recordio-00001 - |-mnist.recordio-00002 - |-mnist.recordio-00003 - |-mnist.recordio-00004 + \_mnist-00000.recordio + |-mnist-00001.recordio + |-mnist-00002.recordio + |-mnist-00003.recordio + |-mnist-00004.recordio ``` -1. read these RecordIO files with `fluid.layers.io.open_recordio_file` +1. open multiple RecordIO files by `fluid.layers.io.open_files` For a distributed training job, the distributed operator system will schedule trainer process on multiple nodes, each trainer process reads parts of the whole training data, we usually take the following approach to make the training @@ -113,10 +113,12 @@ def gen_train_list(file_pattern, trainers, trainer_id): trainers = int(os.getenv("TRAINERS")) trainer_id = int(os.getenv("PADDLE_INIT_TRAINER_ID")) -data_file = fluid.layers.io.open_recordio_file( - filename=gen_train_list("./mnist.recordio*", trainers, trainer_id), - shapes=[(-1, 784),(-1, 1)], - lod_levels=[0, 0], - dtypes=["float32", "int32"]) -data_file = fluid.layers.io.batch(data_file, batch_size=4) +data_file = fluid.layers.io.open_files( + filenames=gen_train_list("./mnist-[0-9]*.recordio", 2, 0), + thread_num=1, + shapes=[(-1, 784),(-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int32"]) +img, label = fluid.layers.io.read_file(data_files) +... ``` diff --git a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc index 6b6d4470268..282ec3f36b9 100644 --- a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc +++ b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc @@ -65,22 +65,20 @@ class CreateRecordIOReaderOp : public framework::OperatorBase { static_cast(shape_concat.size()), "The accumulate of all ranks should be equal to the " "shape concat's length."); - auto filenames = Attr>("filenames"); + std::string filename = Attr("filename"); auto* out = scope.FindVar(Output("Out")) ->template GetMutable(); - for (auto& fn : filenames) { - out->Reset( - new RecordIOFileReader(fn, RestoreShapes(shape_concat, ranks))); - } + + out->Reset(new RecordIOFileReader( + filename, RestoreShapes(shape_concat, ranks))); } }; class CreateRecordIOReaderOpMaker : public FileReaderMakerBase { protected: void Apply() override { - AddAttr>("filenames", - "The filenames of record io reader"); + AddAttr("filename", "The filename of record io reader"); AddComment(R"DOC( CreateRecordIOReader Operator diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index b9d55827304..8758ac9f94a 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -21,7 +21,7 @@ from ..layer_helper import LayerHelper from ..executor import global_scope __all__ = [ - 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_files', + 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_file', 'open_files', 'read_file', 'shuffle', 'batch', 'double_buffer', 'random_data_generator', 'Preprocessor' ] @@ -291,12 +291,12 @@ def _copy_reader_create_op_(block, op): return new_op -def open_recordio_files(filenames, - shapes, - lod_levels, - dtypes, - pass_num=1, - for_parallel=True): +def open_recordio_file(filename, + shapes, + lod_levels, + dtypes, + pass_num=1, + for_parallel=True): """ Open a RecordIO file @@ -304,7 +304,7 @@ def open_recordio_files(filenames, Via the Reader Variable, we can get data from the given RecordIO file. Args: - filename(str) or list(str): The RecordIO file's name. + filename(str): The RecordIO file's name. shapes(list): List of tuples which declaring data shapes. lod_levels(list): List of ints which declaring data lod_level. dtypes(list): List of strs which declaring data type. @@ -336,8 +336,6 @@ def open_recordio_files(filenames, ranks.append(len(shape)) var_name = unique_name('open_recordio_file') - if isinstance(filenames, str): - filenames = [filenames] startup_blk = default_startup_program().current_block() startup_var = startup_blk.create_var(name=var_name) @@ -347,7 +345,7 @@ def open_recordio_files(filenames, attrs={ 'shape_concat': shape_concat, 'lod_levels': lod_levels, - 'filenames': filenames, + 'filename': filename, 'ranks': ranks }) diff --git a/python/paddle/fluid/recordio_writer.py b/python/paddle/fluid/recordio_writer.py index 9557f91bb36..8d48e9abef0 100644 --- a/python/paddle/fluid/recordio_writer.py +++ b/python/paddle/fluid/recordio_writer.py @@ -12,9 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import core import contextlib -__all__ = ['convert_reader_to_recordio_file'] +__all__ = [ + 'convert_reader_to_recordio_file', 'convert_reader_to_recordio_files' +] @contextlib.contextmanager @@ -48,7 +51,7 @@ def convert_reader_to_recordio_file( def convert_reader_to_recordio_files( - filename_suffix, + filename, batch_per_file, reader_creator, feeder, @@ -57,13 +60,16 @@ def convert_reader_to_recordio_files( feed_order=None): if feed_order is None: feed_order = feeder.feed_names + f_name, f_ext = os.path.splitext(filename) + assert (f_ext == ".recordio") + lines = [] f_idx = 0 counter = 0 for idx, batch in enumerate(reader_creator()): lines.append(batch) if idx >= batch_per_file and idx % batch_per_file == 0: - filename = "%s-%05d" % (filename_suffix, f_idx) + filename = "%s-%05d%s" % (f_name, f_idx, f_ext) with create_recordio_writer(filename, compressor, max_num_records) as writer: for l in lines: diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07e875aec6c9bae8002bde4223348c6a29647b03 GIT binary patch literal 11769 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 QVT9NjS|84r2F9-c7hLv=%K!iX literal 0 HcmV?d00001 -- GitLab From 85c203b117797d9bf67a96b47006d3473862fcb5 Mon Sep 17 00:00:00 2001 From: whs Date: Fri, 1 Jun 2018 13:14:23 +0800 Subject: [PATCH 0070/1416] Make bilinear_interp_op support attrs from input. (#11041) * Make bilinear_interp_op support attrs from input. * Fix python api. --- paddle/fluid/operators/bilinear_interp_op.cc | 23 ++++++++++++ paddle/fluid/operators/bilinear_interp_op.cu | 25 ++++++++++++- paddle/fluid/operators/bilinear_interp_op.h | 22 +++++++++-- python/paddle/fluid/layers/nn.py | 19 +++++++--- .../unittests/test_bilinear_interp_op.py | 37 +++++++++++++++++-- 5 files changed, 111 insertions(+), 15 deletions(-) diff --git a/paddle/fluid/operators/bilinear_interp_op.cc b/paddle/fluid/operators/bilinear_interp_op.cc index d46fda54e7a..3321adf2743 100644 --- a/paddle/fluid/operators/bilinear_interp_op.cc +++ b/paddle/fluid/operators/bilinear_interp_op.cc @@ -34,9 +34,22 @@ class BilinearInterpOp : public framework::OperatorWithKernel { int out_w = ctx->Attrs().Get("out_w"); PADDLE_ENFORCE_EQ(dim_x.size(), 4, "X's dimension must be 4"); + if (ctx->HasInput("OutSize")) { + auto out_size_dim = ctx->GetInputDim("OutSize"); + PADDLE_ENFORCE_EQ(out_size_dim.size(), 1, + "OutSize's dimension size must be 1"); + PADDLE_ENFORCE_EQ(out_size_dim[0], 2, "OutSize's dim[0] must be 2"); + } std::vector dim_out({dim_x[0], dim_x[1], out_h, out_w}); ctx->SetOutputDim("Out", framework::make_ddim(dim_out)); } + + protected: + framework::OpKernelType GetExpectedKernelType( + const framework::ExecutionContext& ctx) const override { + return framework::OpKernelType( + framework::ToDataType(ctx.Input("X")->type()), ctx.GetPlace()); + } }; class BilinearInterpOpMaker : public framework::OpProtoAndCheckerMaker { @@ -45,6 +58,10 @@ class BilinearInterpOpMaker : public framework::OpProtoAndCheckerMaker { AddInput("X", "(Tensor) The input tensor of bilinear interpolation, " "This is a 4-D tensor with shape of (N x C x h x w)"); + AddInput("OutSize", + "(Tensor) This is a 1-D tensor with two number. " + "The first number is height and the second number is width.") + .AsDispensable(); AddOutput("Out", "(Tensor) The dimension of output is (N x C x out_h x out_w]"); @@ -78,6 +95,12 @@ class BilinearInterpOpGrad : public framework::OperatorWithKernel { ctx->SetOutputDim(framework::GradVarName("X"), dim_x); } } + + framework::OpKernelType GetExpectedKernelType( + const framework::ExecutionContext& ctx) const override { + return framework::OpKernelType( + framework::ToDataType(ctx.Input("X")->type()), ctx.GetPlace()); + } }; } // namespace operators diff --git a/paddle/fluid/operators/bilinear_interp_op.cu b/paddle/fluid/operators/bilinear_interp_op.cu index 510190f1aaf..4c197153849 100644 --- a/paddle/fluid/operators/bilinear_interp_op.cu +++ b/paddle/fluid/operators/bilinear_interp_op.cu @@ -102,10 +102,21 @@ class BilinearInterpOpCUDAKernel : public framework::OpKernel { auto* input_t = ctx.Input("X"); // float tensor auto* output_t = ctx.Output("Out"); // float tensor auto* input = input_t->data(); - auto* output = output_t->mutable_data(ctx.GetPlace()); int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + auto out_dims = output_t->dims(); + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + Tensor sizes; + framework::TensorCopy(*out_size_t, platform::CPUPlace(), &sizes); + auto size_data = sizes.data(); + out_h = size_data[0]; + out_w = size_data[1]; + } + auto* output = output_t->mutable_data( + {out_dims[0], out_dims[1], out_h, out_w}, ctx.GetPlace()); + int batch_size = input_t->dims()[0]; int channels = input_t->dims()[1]; int in_h = input_t->dims()[2]; @@ -139,8 +150,8 @@ class BilinearInterpGradOpCUDAKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& ctx) const override { auto* d_input_t = ctx.Output(framework::GradVarName("X")); auto* d_output_t = ctx.Input(framework::GradVarName("Out")); - auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto* d_output = d_output_t->data(); + auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto& device_ctx = ctx.template device_context(); @@ -149,6 +160,16 @@ class BilinearInterpGradOpCUDAKernel : public framework::OpKernel { int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + Tensor sizes; + framework::TensorCopy(*out_size_t, platform::CPUPlace(), &sizes); + auto size_data = sizes.data(); + out_h = size_data[0]; + out_w = size_data[1]; + } + int batch_size = d_input_t->dims()[0]; int channels = d_input_t->dims()[1]; int in_h = d_input_t->dims()[2]; diff --git a/paddle/fluid/operators/bilinear_interp_op.h b/paddle/fluid/operators/bilinear_interp_op.h index f6cd77e4d49..8b03cd5a063 100644 --- a/paddle/fluid/operators/bilinear_interp_op.h +++ b/paddle/fluid/operators/bilinear_interp_op.h @@ -24,11 +24,18 @@ class BilinearInterpKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& ctx) const override { auto* input_t = ctx.Input("X"); // float tensor auto* output_t = ctx.Output("Out"); // float tensor + auto out_dims = output_t->dims(); auto* input = input_t->data(); - auto* output = output_t->mutable_data(ctx.GetPlace()); - int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + auto out_size_data = out_size_t->data(); + out_h = out_size_data[0]; + out_w = out_size_data[1]; + } + auto* output = output_t->mutable_data( + {out_dims[0], out_dims[1], out_h, out_w}, ctx.GetPlace()); int batch_size = input_t->dims()[0]; int channels = input_t->dims()[1]; int in_h = input_t->dims()[2]; @@ -83,9 +90,8 @@ class BilinearInterpGradKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& ctx) const override { auto* d_input_t = ctx.Output(framework::GradVarName("X")); auto* d_output_t = ctx.Input(framework::GradVarName("Out")); - auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto* d_output = d_output_t->data(); - + auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto& device_ctx = ctx.template device_context(); math::SetConstant zero; @@ -93,6 +99,14 @@ class BilinearInterpGradKernel : public framework::OpKernel { int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + auto out_size_data = out_size_t->data(); + out_h = out_size_data[0]; + out_w = out_size_data[1]; + } + int batch_size = d_input_t->dims()[0]; int channels = d_input_t->dims()[1]; int in_h = d_input_t->dims()[2]; diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 63ec8315147..cb87653c477 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3944,7 +3944,7 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): input (Variable): The input tensor of bilinear interpolation, This is a 4-D tensor of the shape (num_batches, channels, in_h, in_w). - out_shape(list|tuple|None): Output shape of bilinear interpolation + out_shape(list|tuple|Variable|None): Output shape of bilinear interpolation layer, the shape is (out_h, out_w). Default: None scale(int|None): The multiplier for the input height or width. @@ -3971,13 +3971,20 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): def _is_list_or_turple_(data): return (isinstance(data, list) or isinstance(data, tuple)) + out_h = 0 + out_w = 0 + inputs = {"X": input} if out_shape is not None: - if not (_is_list_or_turple_(out_shape) and len(out_shape) == 2): + if not (_is_list_or_turple_(out_shape) and len(out_shape) == 2) and ( + out_shape is not Variable): raise ValueError('out_shape should be a list or tuple ', 'with length 2, (out_h, out_w).') - out_shape = list(map(int, out_shape)) - out_h = out_shape[0] - out_w = out_shape[1] + if _is_list_or_turple_(out_shape): + out_shape = list(map(int, out_shape)) + out_h = out_shape[0] + out_w = out_shape[1] + else: + inputs['OutSize'] = out_shape else: out_h = int(input.shape[2] * scale) out_w = int(input.shape[3] * scale) @@ -3985,7 +3992,7 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): out = helper.create_tmp_variable(dtype) helper.append_op( type="bilinear_interp", - inputs={"X": input}, + inputs=inputs, outputs={"Out": out}, attrs={"out_h": out_h, "out_w": out_w}) diff --git a/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py b/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py index bffb4f3b666..87c11e7880e 100644 --- a/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py +++ b/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py @@ -17,7 +17,10 @@ import numpy as np from op_test import OpTest -def bilinear_interp_np(input, out_h, out_w): +def bilinear_interp_np(input, out_h, out_w, out_size): + if out_size is not None: + out_h = out_size[0] + out_w = out_size[1] batch_size, channel, in_h, in_w = input.shape if out_h > 1: ratio_h = (in_h - 1.0) / (out_h - 1.0) @@ -49,12 +52,15 @@ def bilinear_interp_np(input, out_h, out_w): class TestBilinearInterpOp(OpTest): def setUp(self): + self.out_size = None self.init_test_case() self.op_type = "bilinear_interp" input_np = np.random.random(self.input_shape).astype("float32") - output_np = bilinear_interp_np(input_np, self.out_h, self.out_w) - + output_np = bilinear_interp_np(input_np, self.out_h, self.out_w, + self.out_size) self.inputs = {'X': input_np} + if self.out_size is not None: + self.inputs['OutSize'] = self.out_size self.attrs = {'out_h': self.out_h, 'out_w': self.out_w} self.outputs = {'Out': output_np} @@ -68,6 +74,7 @@ class TestBilinearInterpOp(OpTest): self.input_shape = [2, 3, 4, 4] self.out_h = 2 self.out_w = 2 + self.out_size = np.array([3, 3]).astype("int32") class TestCase1(TestBilinearInterpOp): @@ -91,5 +98,29 @@ class TestCase3(TestBilinearInterpOp): self.out_w = 128 +class TestCase4(TestBilinearInterpOp): + def init_test_case(self): + self.input_shape = [4, 1, 7, 8] + self.out_h = 1 + self.out_w = 1 + self.out_size = np.array([2, 2]).astype("int32") + + +class TestCase5(TestBilinearInterpOp): + def init_test_case(self): + self.input_shape = [3, 3, 9, 6] + self.out_h = 12 + self.out_w = 12 + self.out_size = np.array([11, 11]).astype("int32") + + +class TestCase6(TestBilinearInterpOp): + def init_test_case(self): + self.input_shape = [1, 1, 128, 64] + self.out_h = 64 + self.out_w = 128 + self.out_size = np.array([65, 129]).astype("int32") + + if __name__ == "__main__": unittest.main() -- GitLab From b33ea7be2d68e64c4a3844b7fbfa01f2697a7839 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Fri, 1 Jun 2018 13:35:20 +0800 Subject: [PATCH 0071/1416] 1. change the variable name from align_var_to_block to slice_var_up 2. replace split_method with slice_var_up in func init_splited_variables --- .../unittests/test_simple_dist_transpiler.py | 2 +- .../fluid/transpiler/distribute_transpiler.py | 35 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py index 25d79b51f99..5ae2844e295 100644 --- a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -72,7 +72,7 @@ class TestSimpleDistTranspiler(TranspilerTest): program=main, pservers=self.pserver_eps, trainers=self.trainers, - align_var_to_block=False) + slice_var_up=False) return t diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index a116671c1b1..da001add8e1 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -71,7 +71,7 @@ def same_or_split_var(p_name, var_name): return p_name == var_name or p_name.startswith(var_name + ".block") -def split_variable(var_list, service_count, min_block_size=8192): +def slice_variable(var_list, slice_count, min_block_size=8192): """ We may need to split dense tensor to one or more blocks and put them equally onto parameter server. One block is a sub-tensor @@ -83,8 +83,8 @@ def split_variable(var_list, service_count, min_block_size=8192): Args: var_list (list): List of variables. - service_count (int): Numel of pserver services. A pserver may have two - or more listening ports. + slice_count (int): Numel of count that variables will be sliced, which + could be the pserver services' count. min_block_size (int): Minimum splitted block size. Returns: blocks (list[(varname, block_id, current_block_size)]): A list @@ -92,12 +92,12 @@ def split_variable(var_list, service_count, min_block_size=8192): """ blocks = [] for var in var_list: - split_count = service_count + split_count = slice_count var_numel = reduce(lambda x, y: x * y, var.shape) max_pserver_count = int(math.floor(var_numel / float(min_block_size))) if max_pserver_count == 0: max_pserver_count = 1 - if max_pserver_count < service_count: + if max_pserver_count < slice_count: split_count = max_pserver_count block_size = int(math.ceil(var_numel / float(split_count))) @@ -178,7 +178,7 @@ class DistributeTranspiler: for index in range(len(self.pserver_endpoints)) ] - def _init_splited_vars(self, split_method, align_var_to_block=True): + def _init_splited_vars(self, slice_var_up): # update these mappings for further transpile: # 1. param_var_mapping: param var name -> [splited params vars] # 2. grad_var_mapping: grad var name -> [splited grads vars] @@ -197,16 +197,19 @@ class DistributeTranspiler: self._update_dist_lookup_table_vars(param_list, grad_list, self.params_grads) - if align_var_to_block: - grad_blocks = split_variable(grad_list, len(self.pserver_endpoints)) - param_blocks = split_variable(param_list, + if slice_var_up: + # when we slice var up into blocks, we will slice the var according to + # pserver services' count. A pserver may have two or more listening ports. + grad_blocks = slice_variable(grad_list, len(self.pserver_endpoints)) + param_blocks = slice_variable(param_list, len(self.pserver_endpoints)) else: - # when we do NOT align var to block, we will always split params + # when we do NOT slice var up into blocks, we will always slice params # grads into one block. - grad_blocks = split_variable(grad_list, 1) - param_blocks = split_variable(param_list, 1) + grad_blocks = slice_variable(grad_list, 1) + param_blocks = slice_variable(param_list, 1) assert (len(grad_blocks) == len(param_blocks)) + # origin_varname -> [splited_var] self.param_var_mapping = self._create_vars_from_blocklist( self.origin_program, param_blocks) @@ -237,7 +240,7 @@ class DistributeTranspiler: program=None, pservers="127.0.0.1:6174", trainers=1, - align_var_to_block=True, + slice_var_up=True, split_method=RoundRobin, sync_mode=True): """ @@ -271,7 +274,7 @@ class DistributeTranspiler: self.has_distributed_lookup_table = self._has_distributed_lookup_table() # split and create vars, then put splited vars in dicts for later use. - self._init_splited_vars(split_method, align_var_to_block) + self._init_splited_vars(slice_var_up) # step 3.1: insert send op to send gradient vars to parameter servers ps_dispatcher.reset() @@ -283,13 +286,13 @@ class DistributeTranspiler: # fc_b@GRAD_trainer_0, fc_b@GRAD_trainer_1 --> pserver2 # shuffle the map will avoid the uneven distribution above grad_var_mapping_items = self.grad_var_mapping.items() - if not align_var_to_block: + if not slice_var_up: np.random.shuffle(grad_var_mapping_items) for orig_varname, splited_vars in grad_var_mapping_items: eplist = ps_dispatcher.dispatch(splited_vars) - if not align_var_to_block: + if not slice_var_up: assert (len(splited_vars) == 1) if len(splited_vars) == 1: -- GitLab From 5387562576de020a35f864a07f14802b68ee398d Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 14:07:41 +0800 Subject: [PATCH 0072/1416] add multi-thread test --- .../tests/book/test_inference_nlp.cc | 157 ++++++++---------- 1 file changed, 72 insertions(+), 85 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 5241661fb31..4e92d6a17b0 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -15,11 +15,7 @@ limitations under the License. */ #include #include #include -#include -#include -#include #include // NOLINT -#include #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -41,19 +37,18 @@ inline double get_current_ms() { // return size of total words size_t read_datasets(std::vector* out, const std::string& filename) { - using namespace std; // NOLINT size_t sz = 0; - fstream fin(filename); - string line; + std::fstream fin(filename); + std::string line; out->clear(); while (getline(fin, line)) { - istringstream iss(line); - vector ids; - string field; + std::istringstream iss(line); + std::vector ids; + std::string field; while (getline(iss, field, ' ')) { ids.push_back(stoi(field)); } - if (ids.size() >= 1024 ) { + if (ids.size() >= 1024) { continue; } @@ -69,72 +64,61 @@ size_t read_datasets(std::vector* out, return sz; } -void test_multi_threads() { - /* - size_t jobs_per_thread = std::min(inputdatas.size() / FLAGS_num_threads, - inputdatas.size()); - std::vector workers(FLAGS_num_threads, jobs_per_thread); - workers[FLAGS_num_threads - 1] += inputdatas.size() % FLAGS_num_threads; - - std::vector> infer_threads; - - for (size_t i = 0; i < workers.size(); ++i) { - infer_threads.emplace_back(new std::thread([&, i]() { - size_t start = i * jobs_per_thread; - for (size_t j = start; j < start + workers[i]; ++j ) { - // 0. Call `paddle::framework::InitDevices()` initialize all the - devices - // In unittests, this is done in paddle/testing/paddle_gtest_main.cc - paddle::framework::LoDTensor words; - auto& srcdata = inputdatas[j]; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = words.mutable_data( - {static_cast(srcdata.size()), 1}, - paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - - LOG(INFO) << "thread id: " << i << ", words size:" << words.numel(); - std::vector cpu_feeds; - cpu_feeds.push_back(&words); - - paddle::framework::LoDTensor output1; - std::vector cpu_fetchs1; - cpu_fetchs1.push_back(&output1); - - // Run inference on CPU - if (FLAGS_prepare_vars) { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } else { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } - //LOG(INFO) << output1.lod(); - //LOG(INFO) << output1.dims(); - } - })); - } - auto start_ms = get_current_ms(); - for (int i = 0; i < FLAGS_num_threads; ++i) { - infer_threads[i]->join(); +void ThreadRunInfer( + const int tid, paddle::framework::Executor* executor, + paddle::framework::Scope* scope, + const std::unique_ptr& inference_program, + const std::vector>& jobs) { + auto copy_program = std::unique_ptr( + new paddle::framework::ProgramDesc(*inference_program)); + std::string feed_holder_name = "feed_" + paddle::string::to_string(tid); + std::string fetch_holder_name = "fetch_" + paddle::string::to_string(tid); + copy_program->SetFeedHolderName(feed_holder_name); + copy_program->SetFetchHolderName(fetch_holder_name); + + // 3. Get the feed_target_names and fetch_target_names + const std::vector& feed_target_names = + copy_program->GetFeedTargetNames(); + const std::vector& fetch_target_names = + copy_program->GetFetchTargetNames(); + + PADDLE_ENFORCE_EQ(fetch_target_names.size(), 1UL); + std::map fetch_targets; + paddle::framework::LoDTensor outtensor; + fetch_targets[fetch_target_names[0]] = &outtensor; + + std::map feed_targets; + PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); + + auto& inputs = jobs[tid]; + auto start_ms = get_current_ms(); + for (size_t i = 0; i < inputs.size(); ++i) { + feed_targets[feed_target_names[0]] = inputs[i]; + executor->Run(*copy_program, scope, &feed_targets, &fetch_targets, true, + true, feed_holder_name, fetch_holder_name); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "Tid: " << tid << ", process " << inputs.size() + << " samples, avg time per sample: " + + << (stop_ms - start_ms) / inputs.size() << " ms"; +} + +void bcast_datasets( + const std::vector& datasets, + std::vector>* jobs, + const int num_threads) { + size_t s = 0; + jobs->resize(num_threads); + while (s < datasets.size()) { + for (auto it = jobs->begin(); it != jobs->end(); it++) { + it->emplace_back(&datasets[s]); + s++; + if (s >= datasets.size()) { + break; + } } - auto stop_ms = get_current_ms(); - LOG(INFO) << "total: " << stop_ms - start_ms << " ms";*/ + } } TEST(inference, nlp) { @@ -166,7 +150,18 @@ TEST(inference, nlp) { } if (FLAGS_num_threads > 1) { - test_multi_threads(); + std::vector> jobs; + bcast_datasets(datasets, &jobs, FLAGS_num_threads); + std::vector> threads; + for (int i = 0; i < FLAGS_num_threads; ++i) { + threads.emplace_back(new std::thread(ThreadRunInfer, i, &executor, scope, + std::ref(inference_program), + std::ref(jobs))); + } + for (int i = 0; i < FLAGS_num_threads; ++i) { + threads[i]->join(); + } + } else { if (FLAGS_prepare_vars) { executor.CreateVariables(*inference_program, scope, 0); @@ -200,14 +195,6 @@ TEST(inference, nlp) { LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 << " min, avg time per seq: " << (stop_ms - start_ms) / datasets.size() << " ms"; -// { // just for test -// auto* scope = new paddle::framework::Scope(); -// paddle::framework::LoDTensor outtensor; -// TestInference( -// dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, -// false); -// delete scope; -// } } delete scope; } -- GitLab From a4822ed897cebe6a27bd61d82c5a1b43022d3760 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 14:37:35 +0800 Subject: [PATCH 0073/1416] add thread setting --- .../tests/book/test_inference_nlp.cc | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 4e92d6a17b0..fba64efece8 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -19,6 +19,10 @@ limitations under the License. */ #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" +#ifdef PADDLE_WITH_MKLML +#include +#include +#endif DEFINE_string(dirname, "", "Directory of the inference model."); DEFINE_int32(repeat, 100, "Running the inference program repeat times"); @@ -149,6 +153,14 @@ TEST(inference, nlp) { EnableMKLDNN(inference_program); } +#ifdef PADDLE_WITH_MKLML + // only use 1 core per thread + omp_set_dynamic(0); + omp_set_num_threads(1); + mkl_set_num_threads(1); +#endif + + double start_ms = 0, stop_ms = 0; if (FLAGS_num_threads > 1) { std::vector> jobs; bcast_datasets(datasets, &jobs, FLAGS_num_threads); @@ -158,9 +170,11 @@ TEST(inference, nlp) { std::ref(inference_program), std::ref(jobs))); } + start_ms = get_current_ms(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads[i]->join(); } + stop_ms = get_current_ms(); } else { if (FLAGS_prepare_vars) { @@ -185,16 +199,18 @@ TEST(inference, nlp) { std::map feed_targets; // for data and run - auto start_ms = get_current_ms(); + start_ms = get_current_ms(); for (size_t i = 0; i < datasets.size(); ++i) { feed_targets[feed_target_names[0]] = &(datasets[i]); executor.RunPreparedContext(ctx.get(), scope, &feed_targets, &fetch_targets, !FLAGS_prepare_vars); } - auto stop_ms = get_current_ms(); - LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 - << " min, avg time per seq: " - << (stop_ms - start_ms) / datasets.size() << " ms"; + stop_ms = get_current_ms(); } + + LOG(INFO) << "Total inference time with " << FLAGS_num_threads + << " threads : " << (stop_ms - start_ms) / 1000.0 + << " sec, avg time per seq: " + << (stop_ms - start_ms) / datasets.size() << " ms"; delete scope; } -- GitLab From ed365919b409749d903a2a5b4fbc4d3b00bb6f7c Mon Sep 17 00:00:00 2001 From: Wu Yi Date: Fri, 1 Jun 2018 14:46:19 +0800 Subject: [PATCH 0074/1416] Add fluid benchmark Dockerfile (#11095) * add fluid benchmark Dockerfile * add_fluid_benchmark_dockerfile --- benchmark/fluid/Dockerfile | 22 ++++++++++++++++++++++ benchmark/fluid/README.md | 16 +++++++++++++++- benchmark/fluid/run.sh | 26 ++++++++++++++------------ 3 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 benchmark/fluid/Dockerfile diff --git a/benchmark/fluid/Dockerfile b/benchmark/fluid/Dockerfile new file mode 100644 index 00000000000..46140a9d1be --- /dev/null +++ b/benchmark/fluid/Dockerfile @@ -0,0 +1,22 @@ +FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 +RUN apt-get update && apt-get install -y python python-pip iputils-ping libgtk2.0-dev wget vim net-tools iftop +RUN ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.7 /usr/lib/libcudnn.so && ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 /usr/lib/libnccl.so +RUN pip install -U pip +RUN pip install -U kubernetes opencv-python paddlepaddle + +# IMPORTANT: +# Add "ENV http_proxy=http://ip:port" if your download is slow, and don't forget to unset it at runtime. + +RUN sh -c 'echo "import paddle.v2 as paddle\npaddle.dataset.cifar.train10()\npaddle.dataset.flowers.fetch()" | python' +RUN sh -c 'echo "import paddle.v2 as paddle\npaddle.dataset.mnist.train()\npaddle.dataset.mnist.test()\npaddle.dataset.imdb.fetch()" | python' +RUN sh -c 'echo "import paddle.v2 as paddle\npaddle.dataset.imikolov.fetch()" | python' +RUN pip uninstall -y paddlepaddle && mkdir /workspace + +ADD https://raw.githubusercontent.com/PaddlePaddle/cloud/develop/docker/paddle_k8s /usr/bin +ADD https://raw.githubusercontent.com/PaddlePaddle/cloud/develop/docker/k8s_tools.py /root + +ADD *.whl / +RUN pip install /*.whl && rm -f /*.whl && chmod +x /usr/bin/paddle_k8s + +ENV LD_LIBRARY_PATH=/usr/local/lib +ADD fluid_benchmark.py dataset.py models/ /workspace/ diff --git a/benchmark/fluid/README.md b/benchmark/fluid/README.md index 7071e9fdcd3..1b0c7dce8bd 100644 --- a/benchmark/fluid/README.md +++ b/benchmark/fluid/README.md @@ -44,11 +44,25 @@ Currently supported `--model` argument include: ## Run Distributed Benchmark on Kubernetes Cluster +You may need to build a Docker image before submitting a cluster job onto Kubernetes, or you will +have to start all those processes mannually on each node, which is not recommended. + +To build the Docker image, you need to choose a paddle "whl" package to run with, you may either +download it from +http://www.paddlepaddle.org/docs/develop/documentation/zh/build_and_install/pip_install_en.html or +build it by your own. Once you've got the "whl" package, put it under the current directory and run: + +```bash +docker build -t [your docker image name]:[your docker image tag] . +``` + +Then push the image to a Docker registry that your Kubernetes cluster can reach. + We provide a script `kube_gen_job.py` to generate Kubernetes yaml files to submit distributed benchmark jobs to your cluster. To generate a job yaml, just run: ```bash -python kube_gen_job.py --jobname myjob --pscpu 4 --cpu 8 --gpu 8 --psmemory 20 --memory 40 --pservers 4 --trainers 4 --entry "python fluid_benchmark.py --model mnist --parallel 1 --device GPU --update_method pserver " --disttype pserver +python kube_gen_job.py --jobname myjob --pscpu 4 --cpu 8 --gpu 8 --psmemory 20 --memory 40 --pservers 4 --trainers 4 --entry "python fluid_benchmark.py --model mnist --gpus 8 --device GPU --update_method pserver " --disttype pserver ``` Then the yaml files are generated under directory `myjob`, you can run: diff --git a/benchmark/fluid/run.sh b/benchmark/fluid/run.sh index f6dfd20bf2e..afaab5f4de4 100644 --- a/benchmark/fluid/run.sh +++ b/benchmark/fluid/run.sh @@ -37,7 +37,8 @@ nohup stdbuf -oL nvidia-smi \ -l 1 & # mnist # mnist gpu mnist 128 -FLAGS_benchmark=true stdbuf -oL python fluid/mnist.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=mnist \ --device=GPU \ --batch_size=128 \ --skip_batch_num=5 \ @@ -46,7 +47,8 @@ FLAGS_benchmark=true stdbuf -oL python fluid/mnist.py \ # vgg16 # gpu cifar10 128 -FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=vgg16 \ --device=GPU \ --batch_size=128 \ --skip_batch_num=5 \ @@ -54,7 +56,8 @@ FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ 2>&1 | tee -a vgg16_gpu_128.log # flowers gpu 128 -FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=vgg16 \ --device=GPU \ --batch_size=32 \ --data_set=flowers \ @@ -64,40 +67,39 @@ FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ # resnet50 # resnet50 gpu cifar10 128 -FLAGS_benchmark=true stdbuf -oL python fluid/resnet50.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=resnet50 \ --device=GPU \ --batch_size=128 \ --data_set=cifar10 \ - --model=resnet_cifar10 \ --skip_batch_num=5 \ --iterations=30 \ 2>&1 | tee -a resnet50_gpu_128.log # resnet50 gpu flowers 64 -FLAGS_benchmark=true stdbuf -oL python fluid/resnet50.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=resnet50 \ --device=GPU \ --batch_size=64 \ --data_set=flowers \ - --model=resnet_imagenet \ --skip_batch_num=5 \ --iterations=30 \ 2>&1 | tee -a resnet50_gpu_flowers_64.log # lstm # lstm gpu imdb 32 # tensorflow only support batch=32 -FLAGS_benchmark=true stdbuf -oL python fluid/stacked_dynamic_lstm.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=stacked_dynamic_lstm \ --device=GPU \ --batch_size=32 \ --skip_batch_num=5 \ --iterations=30 \ - --hidden_dim=512 \ - --emb_dim=512 \ - --crop_size=1500 \ 2>&1 | tee -a lstm_gpu_32.log # seq2seq # seq2seq gpu wmb 128 -FLAGS_benchmark=true stdbuf -oL python fluid/machine_translation.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=machine_translation \ --device=GPU \ --batch_size=128 \ --skip_batch_num=5 \ -- GitLab From 15193c9e936270de7f39b1d738bbb3571adcd737 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Fri, 1 Jun 2018 14:48:24 +0800 Subject: [PATCH 0075/1416] Faster RecordIO Scanner --- paddle/fluid/recordio/chunk.cc | 58 ++++++++++++++++++++------------ paddle/fluid/recordio/chunk.h | 16 +++++++-- paddle/fluid/recordio/scanner.cc | 26 +++++++------- paddle/fluid/recordio/scanner.h | 6 +--- 4 files changed, 64 insertions(+), 42 deletions(-) diff --git a/paddle/fluid/recordio/chunk.cc b/paddle/fluid/recordio/chunk.cc index 82d9aa601cf..6c65d9160c0 100644 --- a/paddle/fluid/recordio/chunk.cc +++ b/paddle/fluid/recordio/chunk.cc @@ -119,40 +119,56 @@ bool Chunk::Write(std::ostream& os, Compressor ct) const { } bool Chunk::Parse(std::istream& sin) { - Header hdr; - bool ok = hdr.Parse(sin); + ChunkParser parser(sin); + if (!parser.Init()) { + return false; + } + Clear(); + while (parser.HasNext()) { + Add(parser.Next()); + } + return true; +} + +ChunkParser::ChunkParser(std::istream& sin) : in_(sin) {} +bool ChunkParser::Init() { + pos_ = 0; + bool ok = header_.Parse(in_); if (!ok) { return ok; } - auto beg_pos = sin.tellg(); - uint32_t crc = Crc32Stream(sin, hdr.CompressSize()); - PADDLE_ENFORCE_EQ(hdr.Checksum(), crc); - Clear(); - sin.seekg(beg_pos, sin.beg); - std::unique_ptr compressed_stream; - switch (hdr.CompressType()) { + auto beg_pos = in_.tellg(); + uint32_t crc = Crc32Stream(in_, header_.CompressSize()); + PADDLE_ENFORCE_EQ(header_.Checksum(), crc); + in_.seekg(beg_pos, in_.beg); + + switch (header_.CompressType()) { case Compressor::kNoCompress: break; case Compressor::kSnappy: - compressed_stream.reset(new snappy::iSnappyStream(sin)); + compressed_stream_.reset(new snappy::iSnappyStream(in_)); break; default: PADDLE_THROW("Not implemented"); } + return true; +} - std::istream& stream = compressed_stream ? *compressed_stream : sin; +bool ChunkParser::HasNext() const { return pos_ < header_.NumRecords(); } - for (uint32_t i = 0; i < hdr.NumRecords(); ++i) { - uint32_t rec_len; - stream.read(reinterpret_cast(&rec_len), sizeof(uint32_t)); - std::string buf; - buf.resize(rec_len); - stream.read(&buf[0], rec_len); - PADDLE_ENFORCE_EQ(rec_len, stream.gcount()); - Add(buf); +std::string ChunkParser::Next() { + if (!HasNext()) { + return ""; } - return true; + ++pos_; + std::istream& stream = compressed_stream_ ? *compressed_stream_ : in_; + uint32_t rec_len; + stream.read(reinterpret_cast(&rec_len), sizeof(uint32_t)); + std::string buf; + buf.resize(rec_len); + stream.read(&buf[0], rec_len); + PADDLE_ENFORCE_EQ(rec_len, stream.gcount()); + return buf; } - } // namespace recordio } // namespace paddle diff --git a/paddle/fluid/recordio/chunk.h b/paddle/fluid/recordio/chunk.h index 71a1556a33b..cfb954a5916 100644 --- a/paddle/fluid/recordio/chunk.h +++ b/paddle/fluid/recordio/chunk.h @@ -13,6 +13,7 @@ // limitations under the License. #pragma once +#include #include #include @@ -53,9 +54,20 @@ class Chunk { DISABLE_COPY_AND_ASSIGN(Chunk); }; -size_t CompressData(const char* in, size_t in_length, Compressor ct, char* out); +class ChunkParser { + public: + explicit ChunkParser(std::istream& sin); + + bool Init(); + std::string Next(); + bool HasNext() const; -void DeflateData(const char* in, size_t in_length, Compressor ct, char* out); + private: + Header header_; + uint32_t pos_{0}; + std::istream& in_; + std::unique_ptr compressed_stream_; +}; } // namespace recordio } // namespace paddle diff --git a/paddle/fluid/recordio/scanner.cc b/paddle/fluid/recordio/scanner.cc index 88b4d4001bc..06a13e6c5b6 100644 --- a/paddle/fluid/recordio/scanner.cc +++ b/paddle/fluid/recordio/scanner.cc @@ -22,35 +22,33 @@ namespace paddle { namespace recordio { Scanner::Scanner(std::unique_ptr &&stream) - : stream_(std::move(stream)) { + : stream_(std::move(stream)), parser_(*stream_) { Reset(); } -Scanner::Scanner(const std::string &filename) { - stream_.reset(new std::ifstream(filename)); +Scanner::Scanner(const std::string &filename) + : stream_(new std::ifstream(filename)), parser_(*stream_) { Reset(); } void Scanner::Reset() { stream_->clear(); stream_->seekg(0, std::ios::beg); - ParseNextChunk(); + parser_.Init(); } std::string Scanner::Next() { - PADDLE_ENFORCE(!eof_, "StopIteration"); - auto rec = cur_chunk_.Record(offset_++); - if (offset_ == cur_chunk_.NumRecords()) { - ParseNextChunk(); + if (stream_->eof()) { + return ""; } - return rec; -} -void Scanner::ParseNextChunk() { - eof_ = !cur_chunk_.Parse(*stream_); - offset_ = 0; + auto res = parser_.Next(); + if (!parser_.HasNext() && HasNext()) { + parser_.Init(); + } + return res; } -bool Scanner::HasNext() const { return !eof_; } +bool Scanner::HasNext() const { return !stream_->eof(); } } // namespace recordio } // namespace paddle diff --git a/paddle/fluid/recordio/scanner.h b/paddle/fluid/recordio/scanner.h index 34f1b0c78d6..0d885dd87a2 100644 --- a/paddle/fluid/recordio/scanner.h +++ b/paddle/fluid/recordio/scanner.h @@ -37,11 +37,7 @@ class Scanner { private: std::unique_ptr stream_; - Chunk cur_chunk_; - size_t offset_; - bool eof_; - - void ParseNextChunk(); + ChunkParser parser_; }; } // namespace recordio } // namespace paddle -- GitLab From 28dc9ba3c14edb2b3d8389080ba3ea06f60684c2 Mon Sep 17 00:00:00 2001 From: whs Date: Fri, 1 Jun 2018 15:13:48 +0800 Subject: [PATCH 0076/1416] Add shape op to get the shape of variable. (#11048) * Add shape op to get the shape of variable. * Rename get_shape to shape. * Add checker for output and fix comments. --- paddle/fluid/operators/shape_op.cc | 54 +++++++++++++++++++ paddle/fluid/operators/shape_op.cu | 20 +++++++ paddle/fluid/operators/shape_op.h | 38 +++++++++++++ python/paddle/fluid/layers/ops.py | 1 + .../fluid/tests/unittests/test_shape_op.py | 47 ++++++++++++++++ 5 files changed, 160 insertions(+) create mode 100644 paddle/fluid/operators/shape_op.cc create mode 100644 paddle/fluid/operators/shape_op.cu create mode 100644 paddle/fluid/operators/shape_op.h create mode 100644 python/paddle/fluid/tests/unittests/test_shape_op.py diff --git a/paddle/fluid/operators/shape_op.cc b/paddle/fluid/operators/shape_op.cc new file mode 100644 index 00000000000..c75fce7959d --- /dev/null +++ b/paddle/fluid/operators/shape_op.cc @@ -0,0 +1,54 @@ +/* Copyright (c) 2018 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. */ + +#include "paddle/fluid/operators/shape_op.h" +#include "paddle/fluid/framework/op_registry.h" + +namespace paddle { +namespace operators { + +class ShapeOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + + void InferShape(framework::InferShapeContext *ctx) const override { + PADDLE_ENFORCE(ctx->HasInput("Input"), + "Input (Input) of get_shape op should not be null."); + PADDLE_ENFORCE(ctx->HasOutput("Out"), + "Output (Out) of get_shape op should not be null."); + auto in_dim = ctx->GetInputDim("Input"); + ctx->SetOutputDim("Out", {in_dim.size()}); + } +}; + +class ShapeOpMaker : public framework::OpProtoAndCheckerMaker { + public: + void Make() override { + AddInput("Input", "(Tensor), The input tensor."); + AddOutput("Out", "(Tensor), The shape of input tensor."); + AddComment(R"DOC( +Shape Operator. +Get the shape of input tensor. +)DOC"); + } +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +REGISTER_OPERATOR(shape, ops::ShapeOp, ops::ShapeOpMaker, + paddle::framework::EmptyGradOpMaker); +REGISTER_OP_CPU_KERNEL(shape, ops::ShapeKernel, ops::ShapeKernel, + ops::ShapeKernel, ops::ShapeKernel); diff --git a/paddle/fluid/operators/shape_op.cu b/paddle/fluid/operators/shape_op.cu new file mode 100644 index 00000000000..7736a2a1e13 --- /dev/null +++ b/paddle/fluid/operators/shape_op.cu @@ -0,0 +1,20 @@ +/* Copyright (c) 2018 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. */ + +#include "paddle/fluid/operators/shape_op.h" + +REGISTER_OP_CUDA_KERNEL(shape, paddle::operators::ShapeKernel, + paddle::operators::ShapeKernel, + paddle::operators::ShapeKernel, + paddle::operators::ShapeKernel); diff --git a/paddle/fluid/operators/shape_op.h b/paddle/fluid/operators/shape_op.h new file mode 100644 index 00000000000..3be86b66a53 --- /dev/null +++ b/paddle/fluid/operators/shape_op.h @@ -0,0 +1,38 @@ +/* Copyright (c) 2016 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. */ + +#pragma once +#include +#include "paddle/fluid/framework/op_registry.h" + +namespace paddle { +namespace operators { + +using Tensor = framework::Tensor; + +template +class ShapeKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override { + auto* in_t = ctx.Input("Input"); + auto* out_t = ctx.Output("Out"); + auto out_data = out_t->mutable_data(platform::CPUPlace()); + auto in_dims = in_t->dims(); + for (int i = 0; i < in_dims.size(); ++i) { + out_data[i] = in_dims[i]; + } + } +}; +} // namespace operators +} // namespace paddle diff --git a/python/paddle/fluid/layers/ops.py b/python/paddle/fluid/layers/ops.py index a9fe25744cc..60f8cbbfa71 100644 --- a/python/paddle/fluid/layers/ops.py +++ b/python/paddle/fluid/layers/ops.py @@ -71,6 +71,7 @@ __all__ = [ 'cumsum', 'scatter', 'sum', + 'shape', ] + __activations__ for _OP in set(__all__): diff --git a/python/paddle/fluid/tests/unittests/test_shape_op.py b/python/paddle/fluid/tests/unittests/test_shape_op.py new file mode 100644 index 00000000000..a62ee050075 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_shape_op.py @@ -0,0 +1,47 @@ +# Copyright (c) 2018 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. + +import unittest +import numpy as np +from op_test import OpTest + + +class TestShapeOp(OpTest): + def setUp(self): + self.op_type = "shape" + self.config() + self.shape = [2, 3] + input = np.zeros(self.shape) + self.inputs = {'Input': input} + self.outputs = {'Out': np.array(self.shape)} + + def config(self): + self.shape = [2, 3] + + def test_check_output(self): + self.check_output() + + +class case1(TestShapeOp): + def config(self): + self.shape = [2] + + +class case2(TestShapeOp): + def config(self): + self.shape = [1, 2, 3] + + +if __name__ == '__main__': + unittest.main() -- GitLab From 86d8659c8de7e91c066935e723da29f31ffd6364 Mon Sep 17 00:00:00 2001 From: whs Date: Fri, 1 Jun 2018 15:14:08 +0800 Subject: [PATCH 0077/1416] Add python wrapper for gather op. (#11033) * Add python wrapper for gather op. * Add unitest for 'rank==1' and fix comments. * Fix comments. --- doc/fluid/api/layers.rst | 6 +++ paddle/fluid/operators/gather_op.cc | 1 - python/paddle/fluid/layers/nn.py | 51 ++++++++++++++++++- .../fluid/tests/unittests/test_gather_op.py | 15 +++++- 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/doc/fluid/api/layers.rst b/doc/fluid/api/layers.rst index f53da4d194f..dbb99d3c03f 100644 --- a/doc/fluid/api/layers.rst +++ b/doc/fluid/api/layers.rst @@ -1009,3 +1009,9 @@ ____ .. autofunction:: paddle.fluid.layers.upsampling_bilinear2d :noindex: +gather +____ + +.. autofunction:: paddle.fluid.layers.gather + :noindex: + diff --git a/paddle/fluid/operators/gather_op.cc b/paddle/fluid/operators/gather_op.cc index e21b5725892..aa3e05b83b2 100644 --- a/paddle/fluid/operators/gather_op.cc +++ b/paddle/fluid/operators/gather_op.cc @@ -33,7 +33,6 @@ class GatherOp : public framework::OperatorWithKernel { auto index_dims = ctx->GetInputDim("Index"); PADDLE_ENFORCE(index_dims.size() == 1); int batch_size = ctx->GetInputDim("Index")[0]; - PADDLE_ENFORCE_GE(batch_size, 0, "Batch size must be >0"); framework::DDim output_dims(ctx->GetInputDim("X")); output_dims[0] = batch_size; ctx->SetOutputDim("Out", output_dims); diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index cb87653c477..56f5c6b4bed 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -82,6 +82,7 @@ __all__ = [ 'roi_pool', 'dice_loss', 'upsampling_bilinear2d', + 'gather', 'random_crop', ] @@ -3889,7 +3890,6 @@ def roi_pool(input, rois, pooled_height=1, pooled_width=1, spatial_scale=1.0): def dice_loss(input, label, epsilon=0.00001): """ - **Dice loss Layer** Dice loss for comparing the similarity of two batch of data, usually is used for binary image segmentation i.e. labels are binary. The dice loss can be defined as below equation: @@ -3999,6 +3999,55 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): return out +def gather(input, index): + """ + Output is obtained by gathering entries of the outer-most dimension + of X indexed by `index` and concatenate them together. + + .. math:: + + Out = X[Index] + + + .. code-block:: text + + + Given: + + X = [[1, 2], + [3, 4], + [5, 6]] + + Index = [1, 2] + + Then: + + Out = [[3, 4], + [5, 6]] + + Args: + input (Variable): The source input with rank>=1. + index (Variable): The index input with rank=1. + + Returns: + output (Variable): The output is a tensor with the same rank as input. + + Examples: + .. code-block:: python + + output = fluid.layers.gather(x, index) + """ + helper = LayerHelper('gather', **locals()) + dtype = helper.input_dtype() + out = helper.create_tmp_variable(dtype) + helper.append_op( + type="gather", + inputs={"X": input, + "Index": index}, + outputs={"Out": out}) + return out + + def random_crop(input, shape, seed=1): helper = LayerHelper("random_crop", **locals()) dtype = helper.input_dtype() diff --git a/python/paddle/fluid/tests/unittests/test_gather_op.py b/python/paddle/fluid/tests/unittests/test_gather_op.py index 6fd043c27e2..4ae90864806 100644 --- a/python/paddle/fluid/tests/unittests/test_gather_op.py +++ b/python/paddle/fluid/tests/unittests/test_gather_op.py @@ -20,8 +20,9 @@ from op_test import OpTest class TestGatherOp(OpTest): def setUp(self): self.op_type = "gather" - xnp = np.random.random((10, 20)).astype("float32") - self.inputs = {'X': xnp, 'Index': np.array([1, 3, 5]).astype("int32")} + self.config() + xnp = np.random.random(self.x_shape).astype("float32") + self.inputs = {'X': xnp, 'Index': np.array(self.index).astype("int32")} self.outputs = {'Out': self.inputs["X"][self.inputs["Index"]]} def test_check_output(self): @@ -30,6 +31,16 @@ class TestGatherOp(OpTest): def test_check_grad(self): self.check_grad(['X'], 'Out') + def config(self): + self.x_shape = (10, 20) + self.index = [1, 3, 5] + + +class TestCase1(TestGatherOp): + def config(self): + self.x_shape = (10) + self.index = [1, 3, 5] + if __name__ == "__main__": unittest.main() -- GitLab From eacac49bcdd281f68d9fac2cba9dee2b245d0d17 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Fri, 1 Jun 2018 15:15:26 +0800 Subject: [PATCH 0078/1416] 1. update test_split_var: replace split with slice --- .../{test_split_var.py => test_slice_var.py} | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename python/paddle/fluid/tests/unittests/{test_split_var.py => test_slice_var.py} (85%) diff --git a/python/paddle/fluid/tests/unittests/test_split_var.py b/python/paddle/fluid/tests/unittests/test_slice_var.py similarity index 85% rename from python/paddle/fluid/tests/unittests/test_split_var.py rename to python/paddle/fluid/tests/unittests/test_slice_var.py index 157def9b56e..82305b23a1a 100644 --- a/python/paddle/fluid/tests/unittests/test_split_var.py +++ b/python/paddle/fluid/tests/unittests/test_slice_var.py @@ -14,14 +14,14 @@ import math import unittest -from paddle.fluid.transpiler.distribute_transpiler import split_variable +from paddle.fluid.transpiler.distribute_transpiler import slice_variable import paddle.fluid as fluid import paddle.fluid.core as core import random -class TestSplitVar(unittest.TestCase): - def check_split_output(self, shapes, expected_sizes, min_size): +class TestSliceVar(unittest.TestCase): + def check_slice_output(self, shapes, expected_sizes, min_size): var_list = [] program = fluid.Program() for shape in shapes: @@ -31,7 +31,7 @@ class TestSplitVar(unittest.TestCase): # dtype=core.VarDesc.VarType.LOD_TENSOR, shape=shape) var_list.append(var) - blocks = split_variable(var_list, 10, min_size) + blocks = slice_variable(var_list, 10, min_size) all_sizes = [] for s in expected_sizes: for s2 in s: @@ -49,7 +49,7 @@ class TestSplitVar(unittest.TestCase): [1150, 1150, 1150, 1150, 1150, 1150, 1100] ] - self.check_split_output(shapes, expected_sizes, 1024) + self.check_slice_output(shapes, expected_sizes, 1024) def test_check_output_8k(self): shapes = [[3, 5], [1024], [28, 784], [8, 1020], [800, 10], @@ -57,7 +57,7 @@ class TestSplitVar(unittest.TestCase): expected_sizes = [[15], [1024], [10976, 10976], [8160], [8000], [35937, 35937, 35937, 35937, 35937, 35937]] - self.check_split_output(shapes, expected_sizes, 8192) + self.check_slice_output(shapes, expected_sizes, 8192) if __name__ == '__main__': -- GitLab From 18d640255efb6807a360c29d6e1c672aa679818a Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 15:38:45 +0800 Subject: [PATCH 0079/1416] simplify inference api (#11104) --- .../contrib/inference/paddle_inference_api.h | 40 +++++++++++-------- .../inference/paddle_inference_api_impl.cc | 22 +++++----- .../test_paddle_inference_api_impl.cc | 1 - 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api.h b/paddle/contrib/inference/paddle_inference_api.h index b4c7f9bef4d..5fe8399762b 100644 --- a/paddle/contrib/inference/paddle_inference_api.h +++ b/paddle/contrib/inference/paddle_inference_api.h @@ -40,14 +40,23 @@ struct PaddleBuf { struct PaddleTensor { std::string name; // variable name. std::vector shape; + // TODO(Superjomn) for LoD support, add a vector> field if needed. PaddleBuf data; // blob of data. PaddleDType dtype; }; +enum class PaddleEngineKind { + kNative = 0, // Use the native Fluid facility. + // TODO(Superjomn) support following engines latter. + // kAnakin, // Use Anakin for inference. + // kTensorRT, // Use TensorRT for inference. + // kAutoMixedAnakin, // Automatically mix Fluid with Anakin. + // kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. +}; + /* * A simple Inference API for Paddle. Currently this API can be used by * non-sequence scenerios. - * TODO(Superjomn) Support another API for NLP-related usages. */ class PaddlePredictor { public: @@ -69,15 +78,6 @@ class PaddlePredictor { // Destroy the Predictor. virtual ~PaddlePredictor() {} - enum class EngineKind { - kNative = -1, // Use the native Fluid facility. - // TODO(Superjomn) support latter. - // kAnakin, // Use Anakin for inference. - // kTensorRT, // Use TensorRT for inference. - // kAutoMixedAnakin, // Automatically mix Fluid with Anakin. - // kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. - }; - // The common configs for all the predictors. struct Config { std::string model_dir; // path to the model directory. @@ -86,18 +86,24 @@ class PaddlePredictor { }; struct NativeConfig : public PaddlePredictor::Config { + // GPU related fields. bool use_gpu{false}; - int device; - float fraction_of_gpu_memory; + int device{0}; + float fraction_of_gpu_memory{-1.f}; // Negative to notify initialization. + std::string prog_file; std::string param_file; - bool share_variables; }; -// A factory to help create difference predictor. -template < - typename ConfigT, - PaddlePredictor::EngineKind engine = PaddlePredictor::EngineKind::kNative> +// A factory to help create different predictors. +// +// FOR EXTENSION DEVELOPER: +// Different predictors are designated by config type and engine kind. Similar +// configs can be merged, but there shouldn't be a huge config containing +// different fields for more than one kind of predictors. +// +// Similarly, each engine kind should map to a unique predictor implementation. +template std::unique_ptr CreatePaddlePredictor(const ConfigT& config); } // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 989252f69e4..99a64662d4d 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -57,8 +57,7 @@ std::string num2str(T a) { bool NativePaddlePredictor::Init() { VLOG(3) << "Predictor::init()"; - // TODO(panyx0718): Should CPU vs GPU device be decided by id? - if (config_.device >= 0) { + if (config_.use_gpu) { place_ = paddle::platform::CUDAPlace(config_.device); } else { place_ = paddle::platform::CPUPlace(); @@ -85,11 +84,13 @@ bool NativePaddlePredictor::Init() { } ctx_ = executor_->Prepare(*inference_program_, 0); - // Create variables - // TODO(panyx0718): Why need to test share_variables here? - if (config_.share_variables) { - executor_->CreateVariables(*inference_program_, scope_.get(), 0); - } + // Create temporary variables first, so that the first batch do not need to + // create variables in the runtime. This is the logics of the old inference + // API. + // TODO(Superjomn) this should be modified when `Clone` is valid for + // multi-thread application. + executor_->CreateVariables(*inference_program_, scope_.get(), 0); + // Get the feed_target_names and fetch_target_names feed_target_names_ = inference_program_->GetFeedTargetNames(); fetch_target_names_ = inference_program_->GetFetchTargetNames(); @@ -124,7 +125,7 @@ bool NativePaddlePredictor::Run(const std::vector &inputs, scope_.get(), &feed_targets, &fetch_targets, - !config_.share_variables); + false /* don't create variable eatch time */); if (!GetFetch(fetchs, output_data)) { LOG(ERROR) << "fail to get fetchs"; return false; @@ -242,11 +243,14 @@ bool NativePaddlePredictor::GetFetch( template <> std::unique_ptr -CreatePaddlePredictor( +CreatePaddlePredictor( const NativeConfig &config) { VLOG(3) << "create NativePaddlePredictor"; if (config.use_gpu) { // 1. GPU memeroy + PADDLE_ENFORCE( + config.fraction_of_gpu_memory > 0.f, + "fraction_of_gpu_memory in the config should be set to range (0., 1.]"); std::vector flags; if (config.fraction_of_gpu_memory >= 0.0f || config.fraction_of_gpu_memory <= 0.95f) { diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 5240fc2f202..07b17acd484 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -47,7 +47,6 @@ NativeConfig GetConfig() { config.fraction_of_gpu_memory = 0.15; config.use_gpu = true; config.device = 0; - config.share_variables = true; return config; } -- GitLab From 0c0c5df4cbed8a9c947fd2819640e9d402555ed1 Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 15:39:30 +0800 Subject: [PATCH 0080/1416] feature/add TRT fc converter (#11043) --- .../inference/tensorrt/convert/CMakeLists.txt | 2 + .../inference/tensorrt/convert/conv2d_op.cc | 3 +- .../fluid/inference/tensorrt/convert/fc_op.cc | 119 ++++++++++++++++++ .../inference/tensorrt/convert/mul_op.cc | 5 +- .../inference/tensorrt/convert/op_converter.h | 41 ++++-- .../inference/tensorrt/convert/test_fc_op.cc | 46 +++++++ .../inference/tensorrt/convert/test_mul_op.cc | 4 +- .../tensorrt/convert/test_op_converter.cc | 7 +- .../inference/tensorrt/convert/ut_helper.h | 40 +++--- paddle/fluid/inference/tensorrt/engine.cc | 1 + paddle/fluid/inference/tensorrt/engine.h | 4 +- paddle/fluid/operators/tensorrt_engine_op.cc | 3 +- 12 files changed, 240 insertions(+), 35 deletions(-) create mode 100644 paddle/fluid/inference/tensorrt/convert/fc_op.cc create mode 100644 paddle/fluid/inference/tensorrt/convert/test_fc_op.cc diff --git a/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt b/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt index 5ada1d63126..23ca8bfac84 100644 --- a/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt +++ b/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt @@ -8,3 +8,5 @@ nv_test(test_op_converter SRCS test_op_converter.cc mul_op.cc conv2d_op.cc DEPS nv_test(test_io_converter SRCS test_io_converter.cc io_converter.cc DEPS dynload_cuda dynamic_loader lod_tensor) nv_test(test_trt_mul_op SRCS test_mul_op.cc mul_op.cc DEPS ${FLUID_CORE_MODULES} tensorrt_engine mul_op SERIAL) +nv_test(test_trt_fc_op SRCS test_fc_op.cc fc_op.cc + DEPS ${FLUID_CORE_MODULES} tensorrt_engine mul_op SERIAL) diff --git a/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc b/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc index 209936c3baf..668d344f1bb 100644 --- a/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc @@ -21,7 +21,8 @@ namespace tensorrt { class Conv2dOpConverter : public OpConverter { public: Conv2dOpConverter() {} - void operator()(const framework::proto::OpDesc& op) override { + void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) override { LOG(INFO) << "convert a fluid conv2d op to tensorrt conv layer without bias"; } diff --git a/paddle/fluid/inference/tensorrt/convert/fc_op.cc b/paddle/fluid/inference/tensorrt/convert/fc_op.cc new file mode 100644 index 00000000000..bd05608d762 --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/fc_op.cc @@ -0,0 +1,119 @@ +/* Copyright (c) 2018 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. */ + +#include "paddle/fluid/framework/eigen.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" +#include "paddle/fluid/inference/tensorrt/engine.h" +#include "paddle/fluid/platform/place.h" + +namespace paddle { +namespace inference { +namespace tensorrt { + +// Reorder the elements from istrides to ostrides, borrowed from TRT convert in +// tensorflow. +// https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/tensorrt/convert/convert_nodes.cc#L318 +template +void Reorder2(nvinfer1::DimsHW shape, const T* idata, nvinfer1::DimsHW istrides, + T* odata, nvinfer1::DimsHW ostrides) { + for (int h = 0; h < shape.h(); ++h) { + for (int w = 0; w < shape.w(); ++w) { + odata[h * ostrides.h() + w * ostrides.w()] = + idata[h * ostrides.h() + w * ostrides.w()]; + } + } +} + +// Reorder the data layout from CK to KC. +void ReorderCKtoKC(TensorRTEngine::Weight& iweights, + TensorRTEngine::Weight* oweights) { + int c = iweights.dims[0]; + int k = iweights.dims[1]; + oweights->dims.assign({k, c}); + nvinfer1::DimsHW istrides = {1, k}; + nvinfer1::DimsHW ostrides = {c, 1}; + Reorder2({k, c}, static_cast(iweights.get().values), istrides, + static_cast(const_cast(oweights->get().values)), + ostrides); +} + +/* + * FC converter convert a MUL op in Fluid to a FC layer in TRT. + */ +class FcOpConverter : public OpConverter { + public: + void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) override { + VLOG(4) << "convert a fluid fc op to tensorrt fc layer without bias"; + + framework::OpDesc op_desc(op, nullptr, nullptr); + PADDLE_ENFORCE_EQ(op_desc.Input("X").size(), 1); + PADDLE_ENFORCE_EQ(op_desc.Input("Y").size(), 1); // Y is a weight + PADDLE_ENFORCE_EQ(op_desc.Output("Out").size(), 1); + + // Declare inputs + auto* X = engine_->GetITensor(op_desc.Input("X").front()); + + // Declare weights + auto* Y_v = scope.FindVar(op_desc.Input("Y").front()); + PADDLE_ENFORCE_NOT_NULL(Y_v); + auto* Y_t = Y_v->GetMutable(); + // This may trigger a GPU->CPU copy, because TRT's weight can only be + // assigned from CPU memory, that can't be avoided. + auto* weight_data = Y_t->mutable_data(platform::CPUPlace()); + PADDLE_ENFORCE_EQ(Y_t->dims().size(), 2UL); // a matrix + size_t n_output = Y_t->dims()[1]; + + framework::LoDTensor tmp; + tmp.Resize(Y_t->dims()); + memcpy(tmp.mutable_data(platform::CPUPlace()), Y_t->data(), + Y_t->dims()[0] * Y_t->dims()[1]); + + TensorRTEngine::Weight weight{nvinfer1::DataType::kFLOAT, + static_cast(weight_data), + Y_t->memory_size() / sizeof(float)}; + TensorRTEngine::Weight tmp_weight(nvinfer1::DataType::kFLOAT, + static_cast(tmp.data()), + Y_t->memory_size() / sizeof(float)); + weight.dims.assign({Y_t->dims()[0], Y_t->dims()[1]}); + tmp_weight.dims = weight.dims; + + // The data layout of TRT FC layer's weight is different from fluid's FC, + // need to reorder the elements. + ReorderCKtoKC(tmp_weight, &weight); + + // Currently, the framework can only handle one fluid op -> one TRT layer, + // but fc fuses `mul` and `bias` (2 fluid ops), so here is a trick, just + // handle `mul`, leave `add` as another layer. + // DEBUG + TensorRTEngine::Weight bias{nvinfer1::DataType::kFLOAT, nullptr, 0}; + + auto* layer = TRT_ENGINE_ADD_LAYER(engine_, FullyConnected, + *const_cast(X), + n_output, weight.get(), bias.get()); + + auto output_name = op_desc.Output("Out").front(); + engine_->DeclareOutput(layer, 0, output_name); + } +}; + +REGISTER_TRT_OP_CONVERTER(fc, FcOpConverter); + +} // namespace tensorrt +} // namespace inference +} // namespace paddle + +USE_OP(mul); diff --git a/paddle/fluid/inference/tensorrt/convert/mul_op.cc b/paddle/fluid/inference/tensorrt/convert/mul_op.cc index aa8e66490f7..6bb07709c7e 100644 --- a/paddle/fluid/inference/tensorrt/convert/mul_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/mul_op.cc @@ -24,8 +24,9 @@ namespace tensorrt { class MulOpConverter : public OpConverter { public: MulOpConverter() {} - void operator()(const framework::proto::OpDesc& op) override { - VLOG(4) << "convert a fluid mul op to tensorrt fc layer without bias"; + void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) override { + VLOG(4) << "convert a fluid mul op to tensorrt mul layer without bias"; framework::OpDesc op_desc(op, nullptr); // Declare inputs diff --git a/paddle/fluid/inference/tensorrt/convert/op_converter.h b/paddle/fluid/inference/tensorrt/convert/op_converter.h index 1cd3ed9a00a..4d21e241c0f 100644 --- a/paddle/fluid/inference/tensorrt/convert/op_converter.h +++ b/paddle/fluid/inference/tensorrt/convert/op_converter.h @@ -31,27 +31,42 @@ namespace tensorrt { class OpConverter { public: OpConverter() {} - virtual void operator()(const framework::proto::OpDesc& op) {} - void Run(const framework::proto::OpDesc& op, TensorRTEngine* engine) { - std::string type = op.type(); - auto* it = Registry::Lookup(type); - PADDLE_ENFORCE_NOT_NULL(it, "no OpConverter for optype [%s]", type); - it->SetEngine(engine); - (*it)(op); - } + // Converter logic for an op. + virtual void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) {} + + // Convert a single fluid operaotr and add the corresponding layer to TRT. + void ConvertOp(const framework::proto::OpDesc& op, + const std::unordered_set& parameters, + const framework::Scope& scope, TensorRTEngine* engine) { + framework::OpDesc op_desc(op, nullptr, nullptr); + + OpConverter* it{nullptr}; - // convert fluid op to tensorrt layer - void ConvertOp(const framework::proto::OpDesc& op, TensorRTEngine* engine) { - OpConverter::Run(op, engine); + if (op_desc.Type() == "mul") { + PADDLE_ENFORCE_EQ(op_desc.Input("Y").size(), 1UL); + std::string Y = op_desc.Input("Y")[0]; + if (parameters.count(Y)) { + it = Registry::Lookup("fc"); + } + } + if (!it) { + it = Registry::Lookup(op_desc.Type()); + } + PADDLE_ENFORCE_NOT_NULL(it, "no OpConverter for optype [%s]", + op_desc.Type()); + it->SetEngine(engine); + (*it)(op, scope); } // convert fluid block to tensorrt network void ConvertBlock(const framework::proto::BlockDesc& block, - TensorRTEngine* engine) { + const std::unordered_set& parameters, + const framework::Scope& scope, TensorRTEngine* engine) { for (int i = 0; i < block.ops_size(); i++) { const auto& op = block.ops(i); - OpConverter::Run(op, engine); + ConvertOp(op, parameters, scope, engine); } } diff --git a/paddle/fluid/inference/tensorrt/convert/test_fc_op.cc b/paddle/fluid/inference/tensorrt/convert/test_fc_op.cc new file mode 100644 index 00000000000..a30253072ac --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/test_fc_op.cc @@ -0,0 +1,46 @@ +/* Copyright (c) 2018 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. */ + +#include +#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" +#include "paddle/fluid/inference/tensorrt/convert/ut_helper.h" + +namespace paddle { +namespace inference { +namespace tensorrt { + +TEST(fc_op, test) { + std::unordered_set parameters({"mul-Y"}); + framework::Scope scope; + TRTConvertValidation validator(20, parameters, scope, 1000); + + validator.DeclInputVar("mul-X", nvinfer1::Dims4(8, 3, 1, 1)); + validator.DeclParamVar("mul-Y", nvinfer1::Dims2(3, 2)); + validator.DeclOutputVar("mul-Out", nvinfer1::Dims2(8, 2)); + + // Prepare Op description + framework::OpDesc desc; + desc.SetType("mul"); + desc.SetInput("X", {"mul-X"}); + desc.SetInput("Y", {"mul-Y"}); + desc.SetOutput("Out", {"mul-Out"}); + + validator.SetOp(*desc.Proto()); + + validator.Execute(10); +} + +} // namespace tensorrt +} // namespace inference +} // namespace paddle diff --git a/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc b/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc index d8b61d5f08f..1ce1130e5d6 100644 --- a/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc @@ -21,7 +21,9 @@ namespace inference { namespace tensorrt { TEST(MulOpConverter, main) { - TRTConvertValidation validator(10, 1000); + framework::Scope scope; + std::unordered_set parameters; + TRTConvertValidation validator(10, parameters, scope, 1000); validator.DeclInputVar("mul-X", nvinfer1::Dims2(10, 6)); validator.DeclInputVar("mul-Y", nvinfer1::Dims2(6, 10)); validator.DeclOutputVar("mul-Out", nvinfer1::Dims2(10, 10)); diff --git a/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc b/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc index 9ae7de9cbfa..1d3f5eabb2f 100644 --- a/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc +++ b/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc @@ -12,9 +12,10 @@ 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/fluid/inference/tensorrt/convert/op_converter.h" + #include #include "paddle/fluid/framework/program_desc.h" -#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" namespace paddle { namespace inference { @@ -27,7 +28,9 @@ TEST(OpConverter, ConvertBlock) { conv2d_op->SetType("conv2d"); OpConverter converter; - converter.ConvertBlock(*block->Proto(), nullptr /*TensorRTEngine*/); + framework::Scope scope; + converter.ConvertBlock(*block->Proto(), {}, scope, + nullptr /*TensorRTEngine*/); } } // namespace tensorrt diff --git a/paddle/fluid/inference/tensorrt/convert/ut_helper.h b/paddle/fluid/inference/tensorrt/convert/ut_helper.h index 684bbc208fc..d7e05dd5b5b 100644 --- a/paddle/fluid/inference/tensorrt/convert/ut_helper.h +++ b/paddle/fluid/inference/tensorrt/convert/ut_helper.h @@ -61,7 +61,10 @@ class TRTConvertValidation { public: TRTConvertValidation() = delete; - explicit TRTConvertValidation(int batch_size, int workspace_size = 1024) { + TRTConvertValidation(int batch_size, + const std::unordered_set& parameters, + framework::Scope& scope, int workspace_size = 1 << 10) + : parameters_(parameters), scope_(scope) { // create engine. engine_.reset(new TensorRTEngine(10, 1 << 10, &stream_)); engine_->InitNetwork(); @@ -76,19 +79,22 @@ class TRTConvertValidation { engine_->DeclareInput(name, nvinfer1::DataType::kFLOAT, dims); } + // Declare a parameter varaible in the scope. + void DeclParamVar(const std::string& name, const nvinfer1::Dims& dims) { + DeclVar(name, dims); + } + void DeclOutputVar(const std::string& name, const nvinfer1::Dims& dims) { DeclVar(name, dims); } + // Declare a variable in a fluid Scope. void DeclVar(const std::string& name, const nvinfer1::Dims& dims) { platform::CPUPlace place; platform::CPUDeviceContext ctx(place); // Init Fluid tensor. - std::vector dim_vec(dims.nbDims); - for (int i = 0; i < dims.nbDims; i++) { - dim_vec[i] = dims.d[i]; - } + std::vector dim_vec(dims.d, dims.d + dims.nbDims); auto* x = scope_.Var(name); auto* x_tensor = x->GetMutable(); x_tensor->Resize(framework::make_ddim(dim_vec)); @@ -99,7 +105,7 @@ class TRTConvertValidation { op_ = framework::OpRegistry::CreateOp(desc); OpConverter op_converter; - op_converter.ConvertOp(desc, engine_.get()); + op_converter.ConvertOp(desc, parameters_, scope_, engine_.get()); engine_->FreezeNetwork(); @@ -108,11 +114,13 @@ class TRTConvertValidation { // Set Inputs. for (const auto& input : op_desc_->InputArgumentNames()) { + if (parameters_.count(input)) continue; auto* var = scope_.FindVar(input); PADDLE_ENFORCE(var); auto tensor = var->GetMutable(); + engine_->SetInputFromCPU( - input, static_cast(tensor->data()), + input, static_cast(tensor->data()), sizeof(float) * analysis::AccuDims(tensor->dims(), tensor->dims().size())); } @@ -120,18 +128,21 @@ class TRTConvertValidation { void Execute(int batch_size) { // Execute Fluid Op - // Execute TRT platform::CPUPlace place; platform::CPUDeviceContext ctx(place); - engine_->Execute(batch_size); - op_->Run(scope_, place); + // Execute TRT. + engine_->Execute(batch_size); + cudaStreamSynchronize(*engine_->stream()); ASSERT_FALSE(op_desc_->OutputArgumentNames().empty()); + const size_t output_space_size = 200; for (const auto& output : op_desc_->OutputArgumentNames()) { std::vector fluid_out; - std::vector trt_out(200); - engine_->GetOutputInCPU(output, &trt_out[0], 200 * sizeof(float)); + std::vector trt_out(output_space_size); + engine_->GetOutputInCPU(output, &trt_out[0], + output_space_size * sizeof(float)); + cudaStreamSynchronize(*engine_->stream()); auto* var = scope_.FindVar(output); auto tensor = var->GetMutable(); @@ -139,7 +150,7 @@ class TRTConvertValidation { // Compare two output ASSERT_FALSE(fluid_out.empty()); for (size_t i = 0; i < fluid_out.size(); i++) { - EXPECT_LT(std::abs(fluid_out[i] - trt_out[i]), 0.001); + EXPECT_LT(std::abs(fluid_out[i] - trt_out[i]), 1e-6); } } } @@ -149,9 +160,10 @@ class TRTConvertValidation { private: std::unique_ptr engine_; cudaStream_t stream_; - framework::Scope scope_; std::unique_ptr op_; std::unique_ptr op_desc_; + const std::unordered_set& parameters_; + framework::Scope& scope_; }; } // namespace tensorrt diff --git a/paddle/fluid/inference/tensorrt/engine.cc b/paddle/fluid/inference/tensorrt/engine.cc index a88236ae98e..3d75fefc1a7 100644 --- a/paddle/fluid/inference/tensorrt/engine.cc +++ b/paddle/fluid/inference/tensorrt/engine.cc @@ -106,6 +106,7 @@ void TensorRTEngine::DeclareOutput(const nvinfer1::ILayer* layer, int offset, name); auto* output = layer->getOutput(offset); + SetITensor(name, output); PADDLE_ENFORCE(output != nullptr); output->setName(name.c_str()); infer_network_->markOutput(*output); diff --git a/paddle/fluid/inference/tensorrt/engine.h b/paddle/fluid/inference/tensorrt/engine.h index d9d3163b66d..fabcfd9e80c 100644 --- a/paddle/fluid/inference/tensorrt/engine.h +++ b/paddle/fluid/inference/tensorrt/engine.h @@ -37,13 +37,15 @@ class TensorRTEngine : public EngineBase { // Weight is model parameter. class Weight { public: - Weight(nvinfer1::DataType dtype, void* value, int num_elem) { + Weight(nvinfer1::DataType dtype, void* value, size_t num_elem) { w_.type = dtype; w_.values = value; w_.count = num_elem; } const nvinfer1::Weights& get() { return w_; } + std::vector dims; + private: nvinfer1::Weights w_; }; diff --git a/paddle/fluid/operators/tensorrt_engine_op.cc b/paddle/fluid/operators/tensorrt_engine_op.cc index 83e768b4dc9..855157e7c4c 100644 --- a/paddle/fluid/operators/tensorrt_engine_op.cc +++ b/paddle/fluid/operators/tensorrt_engine_op.cc @@ -31,8 +31,9 @@ void paddle::operators::TensorRTEngineKernel::Prepare( auto max_workspace = context.Attr("max_workspace"); engine_.reset(new inference::tensorrt::TensorRTEngine( max_batch_, max_workspace, nullptr)); + // TODO(Superjomn) parameters should be passed after analysised from outside. inference::Singleton::Global().ConvertBlock( - block, engine_.get()); + block, {}, context.scope(), engine_.get()); engine_->FreezeNetwork(); } -- GitLab From 4a24c238c15212dd921bd0199beca6fc145cd62a Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 15:43:34 +0800 Subject: [PATCH 0081/1416] refine code --- paddle/fluid/inference/io.cc | 2 +- .../tests/book/test_inference_nlp.cc | 86 +++++++++---------- paddle/fluid/inference/tests/test_helper.h | 3 - 3 files changed, 42 insertions(+), 49 deletions(-) diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index 98780b6881c..65db7c7b500 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -117,7 +117,7 @@ std::unique_ptr Load(framework::Executor* executor, std::string program_desc_str; VLOG(3) << "loading model from " << model_filename; ReadBinaryFile(model_filename, &program_desc_str); - // LOG(INFO) << program_desc_str; + std::unique_ptr main_program( new framework::ProgramDesc(program_desc_str)); diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index fba64efece8..962358d761c 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -24,23 +24,22 @@ limitations under the License. */ #include #endif -DEFINE_string(dirname, "", "Directory of the inference model."); +DEFINE_string(modelpath, "", "Directory of the inference model."); +DEFINE_string(datafile, "", "File of input index data."); DEFINE_int32(repeat, 100, "Running the inference program repeat times"); DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); -DEFINE_bool(prepare_context, true, "Prepare Context before executor"); - DEFINE_int32(num_threads, 1, "Number of threads should be used"); -inline double get_current_ms() { +inline double GetCurrentMs() { struct timeval time; gettimeofday(&time, NULL); return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } // return size of total words -size_t read_datasets(std::vector* out, - const std::string& filename) { +size_t LoadData(std::vector* out, + const std::string& filename) { size_t sz = 0; std::fstream fin(filename); std::string line; @@ -68,6 +67,23 @@ size_t read_datasets(std::vector* out, return sz; } +void SplitData( + const std::vector& datasets, + std::vector>* jobs, + const int num_threads) { + size_t s = 0; + jobs->resize(num_threads); + while (s < datasets.size()) { + for (auto it = jobs->begin(); it != jobs->end(); it++) { + it->emplace_back(&datasets[s]); + s++; + if (s >= datasets.size()) { + break; + } + } + } +} + void ThreadRunInfer( const int tid, paddle::framework::Executor* executor, paddle::framework::Scope* scope, @@ -80,7 +96,6 @@ void ThreadRunInfer( copy_program->SetFeedHolderName(feed_holder_name); copy_program->SetFetchHolderName(fetch_holder_name); - // 3. Get the feed_target_names and fetch_target_names const std::vector& feed_target_names = copy_program->GetFeedTargetNames(); const std::vector& fetch_target_names = @@ -95,51 +110,32 @@ void ThreadRunInfer( PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); auto& inputs = jobs[tid]; - auto start_ms = get_current_ms(); + auto start_ms = GetCurrentMs(); for (size_t i = 0; i < inputs.size(); ++i) { feed_targets[feed_target_names[0]] = inputs[i]; executor->Run(*copy_program, scope, &feed_targets, &fetch_targets, true, true, feed_holder_name, fetch_holder_name); } - auto stop_ms = get_current_ms(); + auto stop_ms = GetCurrentMs(); LOG(INFO) << "Tid: " << tid << ", process " << inputs.size() << " samples, avg time per sample: " - << (stop_ms - start_ms) / inputs.size() << " ms"; } -void bcast_datasets( - const std::vector& datasets, - std::vector>* jobs, - const int num_threads) { - size_t s = 0; - jobs->resize(num_threads); - while (s < datasets.size()) { - for (auto it = jobs->begin(); it != jobs->end(); it++) { - it->emplace_back(&datasets[s]); - s++; - if (s >= datasets.size()) { - break; - } - } - } -} - TEST(inference, nlp) { - if (FLAGS_dirname.empty()) { - LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; + if (FLAGS_modelpath.empty() || FLAGS_datafile.empty()) { + LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model " + << "--datafile=path/to/your/data"; } - LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; - std::string dirname = FLAGS_dirname; + LOG(INFO) << "Model Path: " << FLAGS_modelpath; + LOG(INFO) << "Data File: " << FLAGS_datafile; std::vector datasets; - size_t num_total_words = - read_datasets(&datasets, "/home/tangjian/paddle-tj/out.ids.txt"); - LOG(INFO) << "Number of dataset samples(seq len<1024): " << datasets.size(); + size_t num_total_words = LoadData(&datasets, FLAGS_datafile); + LOG(INFO) << "Number of samples (seq_len<1024): " << datasets.size(); LOG(INFO) << "Total number of words: " << num_total_words; const bool model_combined = false; - // 0. Call `paddle::framework::InitDevices()` initialize all the devices // 1. Define place, executor, scope auto place = paddle::platform::CPUPlace(); @@ -148,13 +144,14 @@ TEST(inference, nlp) { // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; - inference_program = InitProgram(&executor, scope, dirname, model_combined); + inference_program = + InitProgram(&executor, scope, FLAGS_modelpath, model_combined); if (FLAGS_use_mkldnn) { EnableMKLDNN(inference_program); } #ifdef PADDLE_WITH_MKLML - // only use 1 core per thread + // only use 1 thread number per std::thread omp_set_dynamic(0); omp_set_num_threads(1); mkl_set_num_threads(1); @@ -163,24 +160,23 @@ TEST(inference, nlp) { double start_ms = 0, stop_ms = 0; if (FLAGS_num_threads > 1) { std::vector> jobs; - bcast_datasets(datasets, &jobs, FLAGS_num_threads); + SplitData(datasets, &jobs, FLAGS_num_threads); std::vector> threads; for (int i = 0; i < FLAGS_num_threads; ++i) { threads.emplace_back(new std::thread(ThreadRunInfer, i, &executor, scope, std::ref(inference_program), std::ref(jobs))); } - start_ms = get_current_ms(); + start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads[i]->join(); } - stop_ms = get_current_ms(); - + stop_ms = GetCurrentMs(); } else { if (FLAGS_prepare_vars) { executor.CreateVariables(*inference_program, scope, 0); } - // always prepare context and burning first time + // always prepare context std::unique_ptr ctx; ctx = executor.Prepare(*inference_program, 0); @@ -198,14 +194,14 @@ TEST(inference, nlp) { PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); std::map feed_targets; - // for data and run - start_ms = get_current_ms(); + // feed data and run + start_ms = GetCurrentMs(); for (size_t i = 0; i < datasets.size(); ++i) { feed_targets[feed_target_names[0]] = &(datasets[i]); executor.RunPreparedContext(ctx.get(), scope, &feed_targets, &fetch_targets, !FLAGS_prepare_vars); } - stop_ms = get_current_ms(); + stop_ms = GetCurrentMs(); } LOG(INFO) << "Total inference time with " << FLAGS_num_threads diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 1f5551567c6..01b8dc0be66 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -182,9 +182,6 @@ void TestInference(const std::string& dirname, "init_program", paddle::platform::DeviceContextPool::Instance().Get(place)); inference_program = InitProgram(&executor, scope, dirname, is_combined); - // std::string binary_str; - // inference_program->Proto()->SerializeToString(&binary_str); - // LOG(INFO) << binary_str; if (use_mkldnn) { EnableMKLDNN(inference_program); } -- GitLab From 3206bcd9291833518289e73e37513cdbc29e96c7 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 16:24:55 +0800 Subject: [PATCH 0082/1416] refine log and add QPS --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 962358d761c..378e1620a09 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -202,11 +202,13 @@ TEST(inference, nlp) { &fetch_targets, !FLAGS_prepare_vars); } stop_ms = GetCurrentMs(); + LOG(INFO) << "Tid: 0, process " << datasets.size() + << " samples, avg time per sample: " + << (stop_ms - start_ms) / datasets.size() << " ms"; } LOG(INFO) << "Total inference time with " << FLAGS_num_threads << " threads : " << (stop_ms - start_ms) / 1000.0 - << " sec, avg time per seq: " - << (stop_ms - start_ms) / datasets.size() << " ms"; + << " sec, QPS: " << datasets.size() / ((stop_ms - start_ms) / 1000); delete scope; } -- GitLab From 9503dbb173f76f7b68d4a6edc18ce31cf7865c30 Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 17:14:18 +0800 Subject: [PATCH 0083/1416] fix compile error (#11119) --- paddle/fluid/inference/tensorrt/convert/fc_op.cc | 2 +- paddle/fluid/inference/tensorrt/convert/op_converter.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tensorrt/convert/fc_op.cc b/paddle/fluid/inference/tensorrt/convert/fc_op.cc index bd05608d762..45b07955975 100644 --- a/paddle/fluid/inference/tensorrt/convert/fc_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/fc_op.cc @@ -59,7 +59,7 @@ class FcOpConverter : public OpConverter { const framework::Scope& scope) override { VLOG(4) << "convert a fluid fc op to tensorrt fc layer without bias"; - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); PADDLE_ENFORCE_EQ(op_desc.Input("X").size(), 1); PADDLE_ENFORCE_EQ(op_desc.Input("Y").size(), 1); // Y is a weight PADDLE_ENFORCE_EQ(op_desc.Output("Out").size(), 1); diff --git a/paddle/fluid/inference/tensorrt/convert/op_converter.h b/paddle/fluid/inference/tensorrt/convert/op_converter.h index 4d21e241c0f..3beafeefd06 100644 --- a/paddle/fluid/inference/tensorrt/convert/op_converter.h +++ b/paddle/fluid/inference/tensorrt/convert/op_converter.h @@ -40,7 +40,7 @@ class OpConverter { void ConvertOp(const framework::proto::OpDesc& op, const std::unordered_set& parameters, const framework::Scope& scope, TensorRTEngine* engine) { - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); OpConverter* it{nullptr}; -- GitLab From 7e9f0790e0366ef8db3f48f83635400d4742ad71 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 17:24:54 +0800 Subject: [PATCH 0084/1416] fix scope in thread --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 378e1620a09..f7788ccbf40 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -91,6 +91,8 @@ void ThreadRunInfer( const std::vector>& jobs) { auto copy_program = std::unique_ptr( new paddle::framework::ProgramDesc(*inference_program)); + auto& sub_scope = scope->NewScope(); + std::string feed_holder_name = "feed_" + paddle::string::to_string(tid); std::string fetch_holder_name = "fetch_" + paddle::string::to_string(tid); copy_program->SetFeedHolderName(feed_holder_name); @@ -113,10 +115,11 @@ void ThreadRunInfer( auto start_ms = GetCurrentMs(); for (size_t i = 0; i < inputs.size(); ++i) { feed_targets[feed_target_names[0]] = inputs[i]; - executor->Run(*copy_program, scope, &feed_targets, &fetch_targets, true, - true, feed_holder_name, fetch_holder_name); + executor->Run(*copy_program, &sub_scope, &feed_targets, &fetch_targets, + true, true, feed_holder_name, fetch_holder_name); } auto stop_ms = GetCurrentMs(); + scope->DeleteScope(&sub_scope); LOG(INFO) << "Tid: " << tid << ", process " << inputs.size() << " samples, avg time per sample: " << (stop_ms - start_ms) / inputs.size() << " ms"; -- GitLab From 47630a4a9e8b54dc27184586d22559b427525785 Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Fri, 1 Jun 2018 17:28:24 +0800 Subject: [PATCH 0085/1416] fluid benchmark support recordio reader --- benchmark/fluid/Dockerfile | 2 +- benchmark/fluid/README.md | 9 ++ benchmark/fluid/fluid_benchmark.py | 55 +++++--- benchmark/fluid/models/machine_translation.py | 2 + benchmark/fluid/models/mnist.py | 21 ++- benchmark/fluid/models/resnet.py | 20 ++- .../fluid/models/stacked_dynamic_lstm.py | 3 + benchmark/fluid/models/vgg.py | 21 ++- benchmark/fluid/recordio_converter.py | 133 ++++++++++++++++++ python/paddle/fluid/layers/io.py | 2 +- 10 files changed, 241 insertions(+), 27 deletions(-) create mode 100644 benchmark/fluid/recordio_converter.py diff --git a/benchmark/fluid/Dockerfile b/benchmark/fluid/Dockerfile index 46140a9d1be..5d98a9b3c42 100644 --- a/benchmark/fluid/Dockerfile +++ b/benchmark/fluid/Dockerfile @@ -19,4 +19,4 @@ ADD *.whl / RUN pip install /*.whl && rm -f /*.whl && chmod +x /usr/bin/paddle_k8s ENV LD_LIBRARY_PATH=/usr/local/lib -ADD fluid_benchmark.py dataset.py models/ /workspace/ +ADD fluid_benchmark.py recordio_converter.py models/ /workspace/ diff --git a/benchmark/fluid/README.md b/benchmark/fluid/README.md index 1b0c7dce8bd..c17cab999b5 100644 --- a/benchmark/fluid/README.md +++ b/benchmark/fluid/README.md @@ -42,6 +42,15 @@ Currently supported `--model` argument include: PADDLE_PSERVER_PORT=7164 PADDLE_TRAINER_IPS=192.168.0.2,192.168.0.3 PADDLE_CURRENT_IP=127.0.0.1 PADDLE_TRAINER_ID=0 python fluid_benchmark.py --model mnist --device GPU --update_method nccl2 ``` +## Prepare the RecordIO file to Achieve Better Performance + +Run the following command will generate RecordIO files like "mnist.recordio" under the path +and batch_size you choose: + +```bash +python -c 'from recordio_converter import *; prepare_mnist("data", 32)' +``` + ## Run Distributed Benchmark on Kubernetes Cluster You may need to build a Docker image before submitting a cluster job onto Kubernetes, or you will diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index c1d458970a5..9dce7d56478 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -44,7 +44,6 @@ def parse_args(): type=float, default=0.001, help='The minibatch size.') - # TODO(wuyi): add "--use_fake_data" option back. parser.add_argument( '--skip_batch_num', type=int, @@ -106,6 +105,16 @@ def parse_args(): default='local', choices=['local', 'pserver', 'nccl2'], help='Choose parameter update method, can be local, pserver, nccl2.') + parser.add_argument( + '--use_reader_op', + action='store_true', + help='Whether to use reader op, and must specify the data path if set this to true.' + ) + parser.add_argument( + '--data_path', + type=str, + default="", + help='Directory that contains all the training recordio files.') args = parser.parse_args() return args @@ -208,11 +217,13 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, place = core.CPUPlace() if args.device == 'CPU' else core.CUDAPlace(0) exe = fluid.Executor(place) exe.run(startup_prog) - feed_var_list = [ - var for var in train_prog.global_block().vars.itervalues() - if var.is_data - ] - feeder = fluid.DataFeeder(feed_var_list, place) + + if not args.use_reader_op: + feed_var_list = [ + var for var in train_prog.global_block().vars.itervalues() + if var.is_data + ] + feeder = fluid.DataFeeder(feed_var_list, place) iters, num_samples, start_time = 0, 0, time.time() for pass_id in range(args.pass_num): @@ -223,9 +234,12 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, num_samples = 0 if iters == args.iterations: break - loss = exe.run(train_prog, - feed=feeder.feed(data), - fetch_list=[avg_loss]) + if args.use_reader_op: + loss = exe.run(train_prog, fetch_list=[avg_loss]) + else: + loss = exe.run(train_prog, + feed=feeder.feed(data), + fetch_list=[avg_loss]) iters += 1 num_samples += len(data) train_losses.append(loss) @@ -251,10 +265,14 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, args, train_prog, startup_prog, nccl_id_var, num_trainers, trainer_id): - feed_var_list = [ - var for var in train_prog.global_block().vars.itervalues() - if var.is_data - ] + place = core.CPUPlace() if args.device == 'CPU' else core.CUDAPlace(0) + if not args.use_reader_op: + feed_var_list = [ + var for var in train_prog.global_block().vars.itervalues() + if var.is_data + ] + feeder = fluid.DataFeeder(feed_var_list, place) + # generate fake: if args.use_fake_data: for var in feed_var_list: @@ -271,7 +289,6 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, "value": 1.0, "dtype": var.dtype}) - place = core.CPUPlace() if args.device == 'CPU' else core.CUDAPlace(0) if nccl_id_var and trainer_id == 0: #FIXME(wuyi): wait other trainer to start listening time.sleep(30) @@ -288,7 +305,6 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, num_trainers=num_trainers, trainer_id=trainer_id) - feeder = fluid.DataFeeder(feed_var_list, place) for pass_id in range(args.pass_num): num_samples = 0 iters = 0 @@ -304,7 +320,10 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, num_samples = 0 if iters == args.iterations: break - if args.use_fake_data: + # NOTE: if use reader ops, the input data is not splited to multiple cards + if args.use_reader_op and iters >= args.iterations / args.gpus: + break + if args.use_fake_data or args.use_reader_op: loss, = exe.run([avg_loss.name]) else: loss, = exe.run([avg_loss.name], feed=feeder.feed(data)) @@ -316,6 +335,8 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, print("Pass %d, batch %d, loss %s" % (pass_id, batch_id, np.array(loss))) train_elapsed = time.time() - start_time + if args.use_reader_op: + num_samples = num_samples * args.gpus examples_per_sec = num_samples / train_elapsed print('\nTotal examples: %d, total time: %.5f, %.5f examples/sed\n' % (num_samples, train_elapsed, examples_per_sec)) @@ -342,7 +363,7 @@ def main(): # the unique trainer id, starting from 0, needed by trainer # only nccl_id_var, num_trainers, trainer_id = ( - None, 1, int(os.getenv("PADDLE_TRAINER_ID", "-1"))) + None, 1, int(os.getenv("PADDLE_TRAINER_ID", "0"))) if args.use_cprof: pr = cProfile.Profile() diff --git a/benchmark/fluid/models/machine_translation.py b/benchmark/fluid/models/machine_translation.py index 635b3373dd2..3024882725d 100644 --- a/benchmark/fluid/models/machine_translation.py +++ b/benchmark/fluid/models/machine_translation.py @@ -197,6 +197,8 @@ def lodtensor_to_ndarray(lod_tensor): def get_model(args): + if args.use_reader_op: + raise Exception("machine_translation do not support reader op for now.") embedding_dim = 512 encoder_size = 512 decoder_size = 512 diff --git a/benchmark/fluid/models/mnist.py b/benchmark/fluid/models/mnist.py index d264bfc12bd..5d3da68dafa 100644 --- a/benchmark/fluid/models/mnist.py +++ b/benchmark/fluid/models/mnist.py @@ -20,6 +20,7 @@ import numpy as np import argparse import time import cProfile +import os import paddle import paddle.fluid as fluid @@ -65,9 +66,23 @@ def cnn_model(data): def get_model(args): - # Input data - images = fluid.layers.data(name='pixel', shape=[1, 28, 28], dtype=DTYPE) - label = fluid.layers.data(name='label', shape=[1], dtype='int64') + if args.use_reader_op: + filelist = [ + os.path.join(args.data_path, f) for f in os.listdir(args.data_path) + ] + data_file = fluid.layers.open_files( + filenames=filelist, + shapes=[[-1, 1, 28, 28], (-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int64"], + thread_num=args.gpus) + data_file = fluid.layers.double_buffer( + fluid.layers.batch( + data_file, batch_size=args.batch_size)) + images, label = fluid.layers.read_file(data_file) + else: + images = fluid.layers.data(name='pixel', shape=[1, 28, 28], dtype=DTYPE) + label = fluid.layers.data(name='label', shape=[1], dtype='int64') # Train program predict = cnn_model(images) diff --git a/benchmark/fluid/models/resnet.py b/benchmark/fluid/models/resnet.py index 9dec8911ed6..35daad6664b 100644 --- a/benchmark/fluid/models/resnet.py +++ b/benchmark/fluid/models/resnet.py @@ -19,6 +19,7 @@ from __future__ import print_function import functools import numpy as np import time +import os import cProfile, pstats, StringIO @@ -129,9 +130,24 @@ def get_model(args): else: dshape = [224, 224, 3] model = resnet_imagenet + if args.use_reader_op: + filelist = [ + os.path.join(args.data_path, f) for f in os.listdir(args.data_path) + ] + data_file = fluid.layers.open_files( + filenames=filelist, + shapes=[[-1] + dshape, (-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int64"], + thread_num=args.gpus) + data_file = fluid.layers.double_buffer( + fluid.layers.batch( + data_file, batch_size=args.batch_size)) + input, label = fluid.layers.read_file(data_file) + else: + input = fluid.layers.data(name='data', shape=dshape, dtype='float32') + label = fluid.layers.data(name='label', shape=[1], dtype='int64') - input = fluid.layers.data(name='data', shape=dshape, dtype='float32') - label = fluid.layers.data(name='label', shape=[1], dtype='int64') predict = model(input, class_dim) cost = fluid.layers.cross_entropy(input=predict, label=label) avg_cost = fluid.layers.mean(x=cost) diff --git a/benchmark/fluid/models/stacked_dynamic_lstm.py b/benchmark/fluid/models/stacked_dynamic_lstm.py index 81a28b5f3ae..e2a8cf45ac3 100644 --- a/benchmark/fluid/models/stacked_dynamic_lstm.py +++ b/benchmark/fluid/models/stacked_dynamic_lstm.py @@ -44,6 +44,9 @@ def crop_sentence(reader, crop_size): def get_model(args): + if args.use_reader_op: + raise Exception( + "stacked_dynamic_lstm do not support reader op for now.") lstm_size = 512 emb_dim = 512 crop_size = 1500 diff --git a/benchmark/fluid/models/vgg.py b/benchmark/fluid/models/vgg.py index 53856c5f7ac..b84e118a88e 100644 --- a/benchmark/fluid/models/vgg.py +++ b/benchmark/fluid/models/vgg.py @@ -22,6 +22,7 @@ import paddle.fluid as fluid import paddle.fluid.core as core import argparse import functools +import os def vgg16_bn_drop(input): @@ -65,9 +66,23 @@ def get_model(args): else: data_shape = [224, 224, 3] - # Input data - images = fluid.layers.data(name='pixel', shape=data_shape, dtype='float32') - label = fluid.layers.data(name='label', shape=[1], dtype='int64') + if args.use_reader_op: + filelist = [ + os.path.join(args.data_path, f) for f in os.listdir(args.data_path) + ] + data_file = fluid.layers.open_files( + filenames=filelist, + shapes=[[-1] + data_shape, (-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int64"], + thread_num=args.gpus) + data_file = fluid.layers.double_buffer( + fluid.layers.batch( + data_file, batch_size=args.batch_size)) + images, label = fluid.layers.read_file(data_file) + else: + images = fluid.layers.data(name='data', shape=dshape, dtype='float32') + label = fluid.layers.data(name='label', shape=[1], dtype='int64') # Train program net = vgg16_bn_drop(images) diff --git a/benchmark/fluid/recordio_converter.py b/benchmark/fluid/recordio_converter.py new file mode 100644 index 00000000000..c69062c4a1f --- /dev/null +++ b/benchmark/fluid/recordio_converter.py @@ -0,0 +1,133 @@ +# Copyright (c) 2018 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. + +import os +import paddle +import paddle.fluid as fluid +import paddle.fluid.core as core +from paddle.dataset import mnist, cifar, flowers, image + + +def convert_2_recordio(py_reader, outfilepath, batch_size, shape_data, + shape_label): + num_batches = 0 + with fluid.program_guard(fluid.Program(), fluid.Program()): + reader = paddle.batch(py_reader(), batch_size=batch_size) + feeder = fluid.DataFeeder( + feed_list=[ # order is image and label + fluid.layers.data( + name='image', shape=shape_data), + fluid.layers.data( + name='label', shape=shape_label, dtype='int64'), + ], + place=fluid.CPUPlace()) + num_batches = fluid.recordio_writer.convert_reader_to_recordio_file( + outfilepath, reader, feeder) + return num_batches + + +def prepare_mnist(outpath, batch_size): + outfilepath = os.path.join(outpath, "mnist.recordio") + convert_2_recordio(mnist.train, outfilepath, batch_size, [784], [1]) + + +def prepare_cifar10(outpath, batch_size): + outfilepath = os.path.join(outpath, "cifar.recordio") + convert_2_recordio(cifar.train10, outfilepath, batch_size, [3, 32, 32], [1]) + + +def prepare_flowers(outpath, batch_size): + outfilepath = os.path.join(outpath, "flowers.recordio") + convert_2_recordio(flowers.train, outfilepath, batch_size, [3, 224, 224], + [1]) + + +def imagenet_train(data_dir): + contents = os.listdir(data_dir) + if set(contents) != set( + ["train", "train.txt", "val", "val_set", "val.txt", "unzip.sh"]): + raise Exception("Imagenet data contents error!") + img2label = dict() + imgfilelist = [] + with open(os.path.join(data_dir, "train.txt")) as fn: + while 1: + l = fn.readline() + if not l: + break + img, lbl = l[:-1].split(" ") + img2label[img] = int(lbl) + imgfilelist.append(img) + + def train_reader(): + for idx, imgfile in enumerate(imgfilelist): + data = image.load_image( + os.path.join(data_dir, "train", imgfile.lower())) + label = [img2label[imgfile], ] + yield [data, label] + + def default_mapper(sample): + img, label = sample + img = image.simple_transform( + img, 256, 224, True, mean=[103.94, 116.78, 123.68]) + return img.flatten().astype('float32'), label + + return paddle.reader.map_readers(default_mapper, train_reader) + + +# FIXME(wuyi): delete this when https://github.com/PaddlePaddle/Paddle/pull/11066 is merged +def convert_reader_to_recordio_files( + filename, + batch_per_file, + reader_creator, + feeder, + compressor=core.RecordIOWriter.Compressor.Snappy, + max_num_records=1000, + feed_order=None): + if feed_order is None: + feed_order = feeder.feed_names + f_name, f_ext = os.path.splitext(filename) + assert (f_ext == ".recordio") + + lines = [] + f_idx = 0 + counter = 0 + for idx, batch in enumerate(reader_creator()): + lines.append(batch) + if idx >= batch_per_file and idx % batch_per_file == 0: + filename = "%s-%05d%s" % (f_name, f_idx, f_ext) + with fluid.recordio_writer.create_recordio_writer( + filename, compressor, max_num_records) as writer: + for l in lines: + res = feeder.feed(l) + for each in feed_order: + writer.append_tensor(res[each]) + writer.complete_append_tensor() + counter += 1 + lines = [] + f_idx += 1 + print("written file: ", filename) + return counter + + +def prepare_imagenet(inpath, outpath, batch_size): + r = paddle.batch(imagenet_train(inpath), batch_size=batch_size) + feeder = fluid.DataFeeder( + feed_list=[ + fluid.layers.data( + name="image", shape=[3, 224, 224]), fluid.layers.data( + name="label", shape=[1], dtype='int64') + ], + place=fluid.CPUPlace()) + outpath = os.path.join(outpath, "imagenet.recordio") + convert_reader_to_recordio_files(outpath, 10000, r, feeder) diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index 8758ac9f94a..a56f3ea9db6 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -434,7 +434,7 @@ def open_files(filenames, shapes, lod_levels, dtypes, - thread_num, + thread_num=1, buffer_size=None, pass_num=1, for_parallel=True): -- GitLab From 86a61c177f484f3f073449cbe2bbc581cc170650 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 19:37:32 +0800 Subject: [PATCH 0086/1416] Add ScopeBufferedSSAGraphExecutor --- paddle/fluid/framework/CMakeLists.txt | 2 +- paddle/fluid/framework/details/CMakeLists.txt | 1 + .../framework/details/execution_strategy.h | 1 + .../scope_buffered_ssa_graph_executor.cc | 76 +++++++++++++++++++ .../scope_buffered_ssa_graph_executor.h | 53 +++++++++++++ .../framework/details/ssa_graph_executor.cc | 4 - .../framework/details/ssa_graph_executor.h | 6 +- .../details/threaded_ssa_graph_executor.cc | 6 +- .../details/threaded_ssa_graph_executor.h | 1 + paddle/fluid/framework/parallel_executor.cc | 58 ++++---------- paddle/fluid/pybind/pybind.cc | 8 ++ 11 files changed, 162 insertions(+), 54 deletions(-) create mode 100644 paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc create mode 100644 paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h diff --git a/paddle/fluid/framework/CMakeLists.txt b/paddle/fluid/framework/CMakeLists.txt index ed1e70c6460..dbd375aa31b 100644 --- a/paddle/fluid/framework/CMakeLists.txt +++ b/paddle/fluid/framework/CMakeLists.txt @@ -87,7 +87,7 @@ cc_library(executor SRCS executor.cc DEPS op_registry device_context scope framework_proto glog lod_rank_table feed_fetch_method) -cc_library(parallel_executor SRCS parallel_executor.cc DEPS multi_devices_graph_builder threaded_ssa_graph_executor) +cc_library(parallel_executor SRCS parallel_executor.cc DEPS multi_devices_graph_builder threaded_ssa_graph_executor scope_buffered_ssa_graph_executor) cc_library(prune SRCS prune.cc DEPS framework_proto) cc_test(prune_test SRCS prune_test.cc DEPS op_info prune recurrent_op device_context) diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index 1bcd8412eb2..c026e6c100a 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -36,5 +36,6 @@ cc_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_ha device_context broadcast_op_handle) cc_test(gather_op_test SRCS gather_op_handle_test.cc DEPS var_handle op_handle_base scope ddim memory device_context gather_op_handle) +cc_library(scope_buffered_ssa_graph_executor SRCS scope_buffered_ssa_graph_executor.cc DEPS ssa_graph_executor) #cc_test(reduce_op_handle_test SRCS reduce_op_handle_test.cc DEPS var_handle op_handle_base scope ddim memory # device_context reduce_op_handle ) diff --git a/paddle/fluid/framework/details/execution_strategy.h b/paddle/fluid/framework/details/execution_strategy.h index e8d510ec955..e7aa74742f8 100644 --- a/paddle/fluid/framework/details/execution_strategy.h +++ b/paddle/fluid/framework/details/execution_strategy.h @@ -22,6 +22,7 @@ struct ExecutionStrategy { size_t num_threads_{0}; bool use_event_{true}; bool allow_op_delay_{false}; + size_t num_iteration_per_drop_scope_{100}; }; } // namespace details diff --git a/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc new file mode 100644 index 00000000000..eb4e7ec52f9 --- /dev/null +++ b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc @@ -0,0 +1,76 @@ +// Copyright (c) 2018 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. + +#include "paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h" +#include +#include +#include "paddle/fluid/framework/executor.h" + +namespace paddle { +namespace framework { +namespace details { +ScopeBufferedSSAGraphExecutor::ScopeBufferedSSAGraphExecutor( + ExecutionStrategy strategy, std::vector local_scopes, + std::vector var_infos, std::vector places, + std::unique_ptr &&underlying_executor) + : strategy_(std::move(strategy)), + underlying_executor_(std::move(underlying_executor)), + local_scopes_(std::move(local_scopes)), + var_infos_(std::move(var_infos)), + places_(std::move(places)) {} + +FeedFetchList ScopeBufferedSSAGraphExecutor::Run( + const std::vector &fetch_tensors) { + if (drop_scope_counter_ == 0) { + // Create local scopes. + for (auto it = local_scopes_.rbegin(); it != local_scopes_.rend(); ++it) { + auto &scope = *it; + Scope &local_scope = scope->NewScope(); + *scope->Var(details::kLocalExecScopeName)->GetMutable() = + &local_scope; + + for (auto &info : var_infos_) { + if (scope->FindVar(info.name_) != nullptr) { + continue; + } + + if (info.persistable_) { // Persistable + InitializeVariable(scope->Var(info.name_), info.type_); + } else { + InitializeVariable(local_scope.Var(info.name_), info.type_); + } + } + } + } + + auto fetch_data = underlying_executor_->Run(fetch_tensors); + drop_scope_counter_ += 1; + if (!fetch_tensors.empty() || + drop_scope_counter_ == strategy_.num_iteration_per_drop_scope_) { + drop_scope_counter_ = 0; + // Wait All computational streams + for (auto p : places_) { + platform::DeviceContextPool::Instance().Get(p)->Wait(); + } + for (auto &scope : local_scopes_) { + auto &local_scope = + *scope->Var(details::kLocalExecScopeName)->GetMutable(); + scope->DeleteScope(local_scope); + } + } + return fetch_data; +} +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h new file mode 100644 index 00000000000..20df7a4722d --- /dev/null +++ b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h @@ -0,0 +1,53 @@ +// Copyright (c) 2018 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. + +#pragma once + +#include +#include +#include +#include "paddle/fluid/framework/details/execution_strategy.h" +#include "paddle/fluid/framework/details/ssa_graph_executor.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/platform/place.h" +namespace paddle { +namespace framework { +namespace details { + +struct VariableInfo { + std::string name_; + proto::VarType::Type type_; + bool persistable_; +}; + +class ScopeBufferedSSAGraphExecutor : public SSAGraphExecutor { + public: + ScopeBufferedSSAGraphExecutor( + ExecutionStrategy strategy, std::vector local_scopes, + std::vector var_infos, std::vector places, + std::unique_ptr&& underlying_executor); + FeedFetchList Run(const std::vector& fetch_tensors) override; + + private: + size_t drop_scope_counter_{0}; + + ExecutionStrategy strategy_; + std::unique_ptr underlying_executor_; + std::vector local_scopes_; + std::vector var_infos_; + std::vector places_; +}; +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/ssa_graph_executor.cc b/paddle/fluid/framework/details/ssa_graph_executor.cc index 8da6ca889b8..09b97bd0d98 100644 --- a/paddle/fluid/framework/details/ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/ssa_graph_executor.cc @@ -17,10 +17,6 @@ namespace paddle { namespace framework { namespace details { - -SSAGraphExecutor::SSAGraphExecutor(std::unique_ptr &&graph) - : graph_(std::move(graph)) {} - SSAGraphExecutor::~SSAGraphExecutor() {} } // namespace details diff --git a/paddle/fluid/framework/details/ssa_graph_executor.h b/paddle/fluid/framework/details/ssa_graph_executor.h index a8833b7388a..95808603360 100644 --- a/paddle/fluid/framework/details/ssa_graph_executor.h +++ b/paddle/fluid/framework/details/ssa_graph_executor.h @@ -28,15 +28,11 @@ class SSAGraphExecutor { DISABLE_COPY_AND_ASSIGN(SSAGraphExecutor); public: - // Steal graph inside - explicit SSAGraphExecutor(std::unique_ptr &&graph); + SSAGraphExecutor() {} virtual ~SSAGraphExecutor(); virtual FeedFetchList Run(const std::vector &fetch_tensors) = 0; - - protected: - std::unique_ptr graph_; }; } // namespace details } // namespace framework diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 815f739371e..496fadd04da 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -21,7 +21,7 @@ ThreadedSSAGraphExecutor::ThreadedSSAGraphExecutor( const ExecutionStrategy &strategy, const std::vector &local_scopes, const std::vector &places, std::unique_ptr &&graph) - : SSAGraphExecutor(std::move(graph)), + : graph_(std::move(graph)), pool_(strategy.num_threads_ >= 2 ? new ::ThreadPool(strategy.num_threads_) : nullptr), local_scopes_(local_scopes), @@ -189,7 +189,9 @@ void ThreadedSSAGraphExecutor::RunOp( BlockingQueue *ready_var_q, details::OpHandleBase *op) { auto op_run = [ready_var_q, op, this] { try { - VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); + if (VLOG_IS_ON(10)) { + VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); + } op->Run(strategy_.use_event_); VLOG(10) << op << " " << op->Name() << " Done "; running_ops_--; diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.h b/paddle/fluid/framework/details/threaded_ssa_graph_executor.h index 1f7f88d7521..4a2075f1ccc 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.h +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.h @@ -51,6 +51,7 @@ class ThreadedSSAGraphExecutor : public SSAGraphExecutor { details::OpHandleBase *op); private: + std::unique_ptr graph_; std::unique_ptr<::ThreadPool> pool_; std::vector local_scopes_; std::vector places_; diff --git a/paddle/fluid/framework/parallel_executor.cc b/paddle/fluid/framework/parallel_executor.cc index 50c3468d556..003304b85af 100644 --- a/paddle/fluid/framework/parallel_executor.cc +++ b/paddle/fluid/framework/parallel_executor.cc @@ -23,6 +23,7 @@ limitations under the License. */ #endif #include "paddle/fluid/framework/details/multi_devices_graph_builder.h" +#include "paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h" #include "paddle/fluid/framework/details/threaded_ssa_graph_executor.h" #include "paddle/fluid/platform/profiler.h" @@ -42,8 +43,6 @@ class ParallelExecutorPrivate { #ifdef PADDLE_WITH_CUDA std::unique_ptr nccl_ctxs_; #endif - - std::vector> var_types_; bool own_local_scope; }; @@ -92,9 +91,18 @@ ParallelExecutor::ParallelExecutor( local_scopes.empty()) { // Is CUDA BCastParamsToGPUs(bcast_vars); } -// Startup Program has been run. All local scopes has correct parameters. + // Startup Program has been run. All local scopes has correct parameters. + + // Step 2. Create vars in each scope; + std::vector var_infos; + for (auto *var : main_program.Block(0).AllVars()) { + var_infos.emplace_back(); + var_infos.back().name_ = var->Name(); + var_infos.back().type_ = var->GetType(); + var_infos.back().persistable_ = var->Persistable(); + } -// Step 2. Convert main_program to SSA form and dependency graph. Also, insert +// Step 3. Convert main_program to SSA form and dependency graph. Also, insert // ncclOp #ifdef PADDLE_WITH_CUDA details::MultiDevSSAGraphBuilder builder( @@ -105,16 +113,15 @@ ParallelExecutor::ParallelExecutor( params, member_->local_scopes_, build_strategy); #endif + auto graph = builder.Build(main_program); member_->executor_.reset(new details::ThreadedSSAGraphExecutor( exec_strategy, member_->local_scopes_, places, std::move(graph))); - // Step 3. Create vars in each scope; - for (auto *var : main_program.Block(0).AllVars()) { - member_->var_types_.emplace_back(var->Name(), var->GetType(), - var->Persistable()); - } + member_->executor_.reset(new details::ScopeBufferedSSAGraphExecutor( + exec_strategy, member_->local_scopes_, std::move(var_infos), + member_->places_, std::move(member_->executor_))); } void ParallelExecutor::BCastParamsToGPUs( @@ -169,42 +176,9 @@ void ParallelExecutor::BCastParamsToGPUs( void ParallelExecutor::Run(const std::vector &fetch_tensors, const std::string &fetched_var_name) { platform::RecordBlock b(0); - // Create local scopes. - for (auto it = member_->local_scopes_.rbegin(); - it != member_->local_scopes_.rend(); ++it) { - auto &scope = *it; - Scope &local_scope = scope->NewScope(); - *scope->Var(details::kLocalExecScopeName)->GetMutable() = - &local_scope; - - for (auto &name_type_pair : member_->var_types_) { - if (scope->FindVar(std::get<0>(name_type_pair)) != nullptr) { - continue; - } - - if (std::get<2>(name_type_pair)) { // Persistable - InitializeVariable(scope->Var(std::get<0>(name_type_pair)), - std::get<1>(name_type_pair)); - } else { - InitializeVariable(local_scope.Var(std::get<0>(name_type_pair)), - std::get<1>(name_type_pair)); - } - } - } - auto fetch_data = member_->executor_->Run(fetch_tensors); *member_->global_scope_->Var(fetched_var_name)->GetMutable() = fetch_data; - - // Wait All computational streams - for (auto p : member_->places_) { - platform::DeviceContextPool::Instance().Get(p)->Wait(); - } - for (auto &scope : member_->local_scopes_) { - auto &local_scope = - *scope->Var(details::kLocalExecScopeName)->GetMutable(); - scope->DeleteScope(local_scope); - } } void ParallelExecutor::FeedTensorsIntoLocalScopes( diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index 3af8941be69..03cf417b62f 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -519,6 +519,14 @@ All parameter, weight, gradient are variables in Paddle. [](const ExecutionStrategy &self) { return self.allow_op_delay_; }, [](ExecutionStrategy &self, bool allow_op_delay) { self.allow_op_delay_ = allow_op_delay; + }) + .def_property( + "num_iteration_per_drop_scope", + [](const ExecutionStrategy &self) { + return self.num_iteration_per_drop_scope_; + }, + [](ExecutionStrategy &self, size_t num_iteration_per_drop_scope) { + self.num_iteration_per_drop_scope_ = num_iteration_per_drop_scope; }); py::class_ build_strategy(pe, "BuildStrategy"); -- GitLab From 7cf8b656a20578443694e4118464e06fb13f8539 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 20:10:09 +0800 Subject: [PATCH 0087/1416] Remove lock in device context --- paddle/fluid/platform/device_context.cc | 1 - paddle/fluid/platform/device_context.h | 3 --- 2 files changed, 4 deletions(-) diff --git a/paddle/fluid/platform/device_context.cc b/paddle/fluid/platform/device_context.cc index 1f733d71bdf..6c50ab2685c 100644 --- a/paddle/fluid/platform/device_context.cc +++ b/paddle/fluid/platform/device_context.cc @@ -175,7 +175,6 @@ CUDADeviceContext::~CUDADeviceContext() { Place CUDADeviceContext::GetPlace() const { return place_; } void CUDADeviceContext::Wait() const { - std::lock_guard guard(mutex_); PADDLE_ENFORCE(cudaStreamSynchronize(stream_)); PADDLE_ENFORCE(cudaGetLastError()); } diff --git a/paddle/fluid/platform/device_context.h b/paddle/fluid/platform/device_context.h index a9c1984616b..6b82d93237b 100644 --- a/paddle/fluid/platform/device_context.h +++ b/paddle/fluid/platform/device_context.h @@ -100,7 +100,6 @@ class CUDADeviceContext : public DeviceContext { template void RecordEvent(cudaEvent_t ev, Callback callback) { - std::lock_guard guard(mutex_); callback(); PADDLE_ENFORCE(cudaEventRecord(ev, stream_)); } @@ -110,8 +109,6 @@ class CUDADeviceContext : public DeviceContext { std::unique_ptr eigen_device_; std::unique_ptr eigen_stream_; - - mutable std::recursive_mutex mutex_; cudaStream_t stream_; cudnnHandle_t cudnn_handle_; cublasHandle_t cublas_handle_; -- GitLab From c5115950a87df858f963a06b71282bcda2cce920 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Fri, 1 Jun 2018 11:17:50 +0800 Subject: [PATCH 0088/1416] Use static for dlsym --- paddle/fluid/platform/dynload/cublas.h | 2 +- paddle/fluid/platform/dynload/cudnn.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/platform/dynload/cublas.h b/paddle/fluid/platform/dynload/cublas.h index 81acaff87d3..25bcda7eedc 100644 --- a/paddle/fluid/platform/dynload/cublas.h +++ b/paddle/fluid/platform/dynload/cublas.h @@ -45,7 +45,7 @@ extern void *cublas_dso_handle; std::call_once(cublas_dso_flag, []() { \ cublas_dso_handle = paddle::platform::dynload::GetCublasDsoHandle(); \ }); \ - void *p_##__name = dlsym(cublas_dso_handle, #__name); \ + static void *p_##__name = dlsym(cublas_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/cudnn.h b/paddle/fluid/platform/dynload/cudnn.h index 34d83e39569..77e46fa768b 100644 --- a/paddle/fluid/platform/dynload/cudnn.h +++ b/paddle/fluid/platform/dynload/cudnn.h @@ -39,7 +39,7 @@ extern void EnforceCUDNNLoaded(const char* fn_name); cudnn_dso_handle = paddle::platform::dynload::GetCUDNNDsoHandle(); \ }); \ EnforceCUDNNLoaded(#__name); \ - void* p_##__name = dlsym(cudnn_dso_handle, #__name); \ + static void* p_##__name = dlsym(cudnn_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ -- GitLab From 53dab95b7599e8cea50a886cf8bafd0e55beec36 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Fri, 1 Jun 2018 12:26:57 +0800 Subject: [PATCH 0089/1416] Static DSO handle --- paddle/fluid/platform/dynload/cupti.h | 2 +- paddle/fluid/platform/dynload/curand.h | 2 +- paddle/fluid/platform/dynload/nccl.h | 2 +- paddle/fluid/platform/dynload/tensorrt.h | 2 +- paddle/fluid/platform/dynload/warpctc.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/platform/dynload/cupti.h b/paddle/fluid/platform/dynload/cupti.h index e64de7c20fc..2ad52bc7d32 100644 --- a/paddle/fluid/platform/dynload/cupti.h +++ b/paddle/fluid/platform/dynload/cupti.h @@ -45,7 +45,7 @@ extern void *cupti_dso_handle; std::call_once(cupti_dso_flag, []() { \ cupti_dso_handle = paddle::platform::dynload::GetCUPTIDsoHandle(); \ }); \ - void *p_##__name = dlsym(cupti_dso_handle, #__name); \ + static void *p_##__name = dlsym(cupti_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/curand.h b/paddle/fluid/platform/dynload/curand.h index 46ad4379d5f..5b9e0820e0b 100644 --- a/paddle/fluid/platform/dynload/curand.h +++ b/paddle/fluid/platform/dynload/curand.h @@ -34,7 +34,7 @@ extern void *curand_dso_handle; std::call_once(curand_dso_flag, []() { \ curand_dso_handle = paddle::platform::dynload::GetCurandDsoHandle(); \ }); \ - void *p_##__name = dlsym(curand_dso_handle, #__name); \ + static void *p_##__name = dlsym(curand_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/nccl.h b/paddle/fluid/platform/dynload/nccl.h index 37902ae20c5..575516f8187 100644 --- a/paddle/fluid/platform/dynload/nccl.h +++ b/paddle/fluid/platform/dynload/nccl.h @@ -37,7 +37,7 @@ extern void* nccl_dso_handle; std::call_once(nccl_dso_flag, []() { \ nccl_dso_handle = paddle::platform::dynload::GetNCCLDsoHandle(); \ }); \ - void* p_##__name = dlsym(nccl_dso_handle, #__name); \ + static void* p_##__name = dlsym(nccl_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/tensorrt.h b/paddle/fluid/platform/dynload/tensorrt.h index f584a49da0f..5d67658b94a 100644 --- a/paddle/fluid/platform/dynload/tensorrt.h +++ b/paddle/fluid/platform/dynload/tensorrt.h @@ -40,7 +40,7 @@ extern void* tensorrt_dso_handle; paddle::platform::dynload::GetTensorRtDsoHandle(); \ PADDLE_ENFORCE(tensorrt_dso_handle, "load tensorrt so failed"); \ }); \ - void* p_##__name = dlsym(tensorrt_dso_handle, #__name); \ + static void* p_##__name = dlsym(tensorrt_dso_handle, #__name); \ PADDLE_ENFORCE(p_##__name, "load %s failed", #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ diff --git a/paddle/fluid/platform/dynload/warpctc.h b/paddle/fluid/platform/dynload/warpctc.h index 7c70649d21c..d157c1fda78 100644 --- a/paddle/fluid/platform/dynload/warpctc.h +++ b/paddle/fluid/platform/dynload/warpctc.h @@ -40,7 +40,7 @@ extern void* warpctc_dso_handle; std::call_once(warpctc_dso_flag, []() { \ warpctc_dso_handle = paddle::platform::dynload::GetWarpCTCDsoHandle(); \ }); \ - void* p_##_name = dlsym(warpctc_dso_handle, #__name); \ + static void* p_##_name = dlsym(warpctc_dso_handle, #__name); \ return reinterpret_cast(p_##_name)(args...); \ } \ }; \ -- GitLab From 663f4e6168ef9852991dc1ccfea462307d19a5d0 Mon Sep 17 00:00:00 2001 From: baiyf Date: Fri, 1 Jun 2018 19:30:59 +0800 Subject: [PATCH 0090/1416] Fix bilinear_op Python API (#11117) * fix conflict * code clean --- doc/fluid/api/layers.rst | 4 ++-- python/paddle/fluid/layers/nn.py | 21 +++++++++---------- .../fluid/tests/unittests/test_layers.py | 6 +++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/doc/fluid/api/layers.rst b/doc/fluid/api/layers.rst index dbb99d3c03f..5329adaa18b 100644 --- a/doc/fluid/api/layers.rst +++ b/doc/fluid/api/layers.rst @@ -1003,10 +1003,10 @@ dice_loss .. autofunction:: paddle.fluid.layers.dice_loss :noindex: -upsampling_bilinear2d +resize_bilinear ____ -.. autofunction:: paddle.fluid.layers.upsampling_bilinear2d +.. autofunction:: paddle.fluid.layers.resize_bilinear :noindex: gather diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 56f5c6b4bed..bd6ed0f30e4 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -81,7 +81,7 @@ __all__ = [ 'label_smooth', 'roi_pool', 'dice_loss', - 'upsampling_bilinear2d', + 'resize_bilinear', 'gather', 'random_crop', ] @@ -3929,9 +3929,9 @@ def dice_loss(input, label, epsilon=0.00001): return reduce_mean(dice_score) -def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): +def resize_bilinear(input, out_shape=None, scale=None, name=None): """ - The mathematical meaning of upsampling_bilinear2d is also called + The mathematical meaning of resize bilinear layer is Bilinear interpolation. Bilinear interpolation is an extension of linear interpolation for interpolating functions of two variables (e.g. H-direction and @@ -3941,13 +3941,13 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): https://en.wikipedia.org/wiki/Bilinear_interpolation Args: - input (Variable): The input tensor of bilinear interpolation, + input (Variable): The input tensor of resize bilinear layer, This is a 4-D tensor of the shape (num_batches, channels, in_h, in_w). - out_shape(list|tuple|Variable|None): Output shape of bilinear interpolation + out_shape(list|tuple|Variable|None): Output shape of resize bilinear layer, the shape is (out_h, out_w). Default: None - scale(int|None): The multiplier for the input height or width. + scale(float|None): The multiplier for the input height or width. At least one of out_shape or scale must be set. And out_shape has a higher priority than scale. Default: None @@ -3961,7 +3961,7 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): Examples: .. code-block:: python - out = fluid.layers.bilinear_interp(input, out_shape=[12, 12]) + out = fluid.layers.resize_bilinear(input, out_shape=[12, 12]) """ if out_shape is None and scale is None: raise ValueError("One of out_shape and scale must not be None") @@ -3975,10 +3975,9 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): out_w = 0 inputs = {"X": input} if out_shape is not None: - if not (_is_list_or_turple_(out_shape) and len(out_shape) == 2) and ( - out_shape is not Variable): - raise ValueError('out_shape should be a list or tuple ', - 'with length 2, (out_h, out_w).') + if not (_is_list_or_turple_(out_shape) and + len(out_shape) == 2) and not isinstance(out_shape, Variable): + raise ValueError('out_shape should be a list or tuple or variable') if _is_list_or_turple_(out_shape): out_shape = list(map(int, out_shape)) out_h = out_shape[0] diff --git a/python/paddle/fluid/tests/unittests/test_layers.py b/python/paddle/fluid/tests/unittests/test_layers.py index 60dc1f83fc3..ca08fd7fc8e 100644 --- a/python/paddle/fluid/tests/unittests/test_layers.py +++ b/python/paddle/fluid/tests/unittests/test_layers.py @@ -369,13 +369,13 @@ class TestBook(unittest.TestCase): self.assertIsNotNone(output) print(str(program)) - def test_upsampling_bilinear2d(self): + def test_resize_bilinear(self): program = Program() with program_guard(program): x = layers.data(name='x', shape=[3, 9, 6], dtype="float32") - output = layers.upsampling_bilinear2d(x, out_shape=[12, 12]) + output = layers.resize_bilinear(x, out_shape=[12, 12]) self.assertIsNotNone(output) - output = layers.upsampling_bilinear2d(x, scale=3) + output = layers.resize_bilinear(x, scale=3) self.assertIsNotNone(output) print(str(program)) -- GitLab From eaeb76c419fbad9b7d3dd083666f80d84f89f55f Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 19:35:49 +0800 Subject: [PATCH 0091/1416] add some comments --- .../tests/book/test_inference_nlp.cc | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index f7788ccbf40..c4d7b0bbf01 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -37,7 +37,8 @@ inline double GetCurrentMs() { return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } -// return size of total words +// Load the input word index data from file and save into LodTensor. +// Return the size of words. size_t LoadData(std::vector* out, const std::string& filename) { size_t sz = 0; @@ -67,6 +68,8 @@ size_t LoadData(std::vector* out, return sz; } +// Split input data samples into small pieces jobs as balanced as possible, +// according to the number of threads. void SplitData( const std::vector& datasets, std::vector>* jobs, @@ -116,7 +119,8 @@ void ThreadRunInfer( for (size_t i = 0; i < inputs.size(); ++i) { feed_targets[feed_target_names[0]] = inputs[i]; executor->Run(*copy_program, &sub_scope, &feed_targets, &fetch_targets, - true, true, feed_holder_name, fetch_holder_name); + true /*create_local_scope*/, true /*create_vars*/, + feed_holder_name, fetch_holder_name); } auto stop_ms = GetCurrentMs(); scope->DeleteScope(&sub_scope); @@ -143,12 +147,13 @@ TEST(inference, nlp) { // 1. Define place, executor, scope auto place = paddle::platform::CPUPlace(); auto executor = paddle::framework::Executor(place); - auto* scope = new paddle::framework::Scope(); + std::unique_ptr scope( + new paddle::framework::Scope()); // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; inference_program = - InitProgram(&executor, scope, FLAGS_modelpath, model_combined); + InitProgram(&executor, scope.get(), FLAGS_modelpath, model_combined); if (FLAGS_use_mkldnn) { EnableMKLDNN(inference_program); } @@ -166,9 +171,9 @@ TEST(inference, nlp) { SplitData(datasets, &jobs, FLAGS_num_threads); std::vector> threads; for (int i = 0; i < FLAGS_num_threads; ++i) { - threads.emplace_back(new std::thread(ThreadRunInfer, i, &executor, scope, - std::ref(inference_program), - std::ref(jobs))); + threads.emplace_back( + new std::thread(ThreadRunInfer, i, &executor, scope.get(), + std::ref(inference_program), std::ref(jobs))); } start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { @@ -177,7 +182,7 @@ TEST(inference, nlp) { stop_ms = GetCurrentMs(); } else { if (FLAGS_prepare_vars) { - executor.CreateVariables(*inference_program, scope, 0); + executor.CreateVariables(*inference_program, scope.get(), 0); } // always prepare context std::unique_ptr ctx; @@ -201,7 +206,7 @@ TEST(inference, nlp) { start_ms = GetCurrentMs(); for (size_t i = 0; i < datasets.size(); ++i) { feed_targets[feed_target_names[0]] = &(datasets[i]); - executor.RunPreparedContext(ctx.get(), scope, &feed_targets, + executor.RunPreparedContext(ctx.get(), scope.get(), &feed_targets, &fetch_targets, !FLAGS_prepare_vars); } stop_ms = GetCurrentMs(); @@ -209,9 +214,7 @@ TEST(inference, nlp) { << " samples, avg time per sample: " << (stop_ms - start_ms) / datasets.size() << " ms"; } - LOG(INFO) << "Total inference time with " << FLAGS_num_threads << " threads : " << (stop_ms - start_ms) / 1000.0 << " sec, QPS: " << datasets.size() / ((stop_ms - start_ms) / 1000); - delete scope; } -- GitLab From 8939f17d304dd407efef3466a7bc96c6bb8747fe Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 1 Jun 2018 19:48:57 +0800 Subject: [PATCH 0092/1416] sppedup test_listen_and_serv_op --- .../fluid/tests/unittests/CMakeLists.txt | 6 +- .../unittests/test_listen_and_serv_op.py | 59 ++++++++----------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/CMakeLists.txt b/python/paddle/fluid/tests/unittests/CMakeLists.txt index fead95ffdab..c33539f6b50 100644 --- a/python/paddle/fluid/tests/unittests/CMakeLists.txt +++ b/python/paddle/fluid/tests/unittests/CMakeLists.txt @@ -48,5 +48,7 @@ foreach(TEST_OP ${TEST_OPS}) endforeach(TEST_OP) py_test_modules(test_warpctc_op MODULES test_warpctc_op ENVS FLAGS_warpctc_dir=${WARPCTC_LIB_DIR} SERIAL) py_test_modules(test_dist_train MODULES test_dist_train SERIAL) -# tests that need to be done in fixed timeout -set_tests_properties(test_listen_and_serv_op PROPERTIES TIMEOUT 20) +# FIXME(Yancey1989): this test would cost much more time on CUDAPlace +# since load cudnn libraries, so we use a longer timeout to make this +# unit test stability. +set_tests_properties(test_listen_and_serv_op PROPERTIES TIMEOUT 30) diff --git a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py index cf89f9d0ebf..ad479657cc2 100644 --- a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py +++ b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py @@ -23,7 +23,7 @@ from multiprocessing import Process from op_test import OpTest -def run_pserver(use_cuda, sync_mode, ip, port, trainer_count, trainer_id): +def run_pserver(use_cuda, sync_mode, ip, port, trainers, trainer_id): x = fluid.layers.data(name='x', shape=[1], dtype='float32') y_predict = fluid.layers.fc(input=x, size=1, act=None) y = fluid.layers.data(name='y', shape=[1], dtype='float32') @@ -39,15 +39,8 @@ def run_pserver(use_cuda, sync_mode, ip, port, trainer_count, trainer_id): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() exe = fluid.Executor(place) - port = os.getenv("PADDLE_INIT_PORT", port) - pserver_ips = os.getenv("PADDLE_INIT_PSERVERS", ip) # ip,ip... - eplist = [] - for ip in pserver_ips.split(","): - eplist.append(':'.join([ip, port])) - pserver_endpoints = ",".join(eplist) # ip:port,ip:port... - trainers = int(os.getenv("TRAINERS", trainer_count)) - current_endpoint = os.getenv("POD_IP", ip) + ":" + port - trainer_id = int(os.getenv("PADDLE_INIT_TRAINER_ID", trainer_id)) + pserver_endpoints = ip + ":" + port + current_endpoint = ip + ":" + port t = fluid.DistributeTranspiler() t.transpile( trainer_id, @@ -62,47 +55,47 @@ def run_pserver(use_cuda, sync_mode, ip, port, trainer_count, trainer_id): class TestListenAndServOp(OpTest): def setUp(self): - self.sleep_time = 5 + self.ps_timeout = 5 self.ip = "127.0.0.1" self.port = "6173" - self.trainer_count = 1 + self.trainers = 1 self.trainer_id = 1 - def _raise_signal(self, parent_pid, raised_signal): - time.sleep(self.sleep_time) - ps_command = subprocess.Popen( - "ps -o pid --ppid %d --noheaders" % parent_pid, - shell=True, - stdout=subprocess.PIPE) - ps_output = ps_command.stdout.read() - retcode = ps_command.wait() - assert retcode == 0, "ps command returned %d" % retcode - - for pid_str in ps_output.split("\n")[:-1]: - try: - os.kill(int(pid_str), raised_signal) - except Exception: - continue - def _start_pserver(self, use_cuda, sync_mode): p = Process( target=run_pserver, - args=(use_cuda, sync_mode, self.ip, self.port, self.trainer_count, + args=(use_cuda, sync_mode, self.ip, self.port, self.trainers, self.trainer_id)) p.start() + return p.pid + + def _wait_ps_ready(self, pid): + retry_times = self.ps_timeout + while True: + time.sleep(1) + assert retry_times >= 0, "wait ps ready failed" + try: + # the listen_and_serv_op would touch a file which contains the listen port + # on the /tmp directory until it was ready to process all the RPC call. + os.stat("/tmp/paddle.%d.port" % pid) + return + except os.error: + retry_times -= 1 def test_handle_signal_in_serv_op(self): # run pserver on CPU in sync mode - self._start_pserver(False, True) + pid = self._start_pserver(False, True) + self._wait_ps_ready(pid) # raise SIGINT to pserver - self._raise_signal(os.getpid(), signal.SIGINT) + os.kill(pid, signal.SIGINT) # run pserver on CPU in async mode - self._start_pserver(False, False) + pid = self._start_pserver(False, False) + self._wait_ps_ready(pid) # raise SIGTERM to pserver - self._raise_signal(os.getpid(), signal.SIGTERM) + os.kill(pid, signal.SIGINT) if __name__ == '__main__': -- GitLab From b5b666185720c241aad2421ffb2497dd92d159e5 Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 20:36:34 +0800 Subject: [PATCH 0093/1416] feature/simple inference demo (#11105) --- paddle/contrib/inference/CMakeLists.txt | 43 +++++------ paddle/contrib/inference/demo/CMakeLists.txt | 16 +++++ .../inference/demo/simple_on_word2vec.cc | 71 +++++++++++++++++++ .../inference/paddle_inference_api_impl.cc | 6 +- .../test_paddle_inference_api_impl.cc | 4 +- 5 files changed, 116 insertions(+), 24 deletions(-) create mode 100644 paddle/contrib/inference/demo/CMakeLists.txt create mode 100644 paddle/contrib/inference/demo/simple_on_word2vec.cc diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index 6847f7db7fc..8ca34465395 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -18,32 +18,35 @@ if(APPLE) endif(APPLE) function(inference_api_test TARGET_NAME) - set(options "") - set(oneValueArgs "") - set(multiValueArgs ARGS) - cmake_parse_arguments(inference_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if (WITH_TESTING) + set(options "") + set(oneValueArgs "") + set(multiValueArgs ARGS) + cmake_parse_arguments(inference_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - set(PYTHON_TESTS_DIR ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests) - cc_test(test_paddle_inference_${TARGET_NAME} - SRCS test_paddle_inference_${TARGET_NAME}.cc - DEPS paddle_fluid_api paddle_inference_api - ARGS --dirname=${PYTHON_TESTS_DIR}/book/) - if(inference_test_ARGS) - set_tests_properties(test_paddle_inference_${TARGET_NAME} - PROPERTIES DEPENDS "${inference_test_ARGS}") - endif() + set(PYTHON_TESTS_DIR ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests) + cc_test(${TARGET_NAME} + SRCS ${TARGET_NAME}.cc + DEPS paddle_fluid paddle_inference_api + ARGS --dirname=${PYTHON_TESTS_DIR}/book/) + if(inference_test_ARGS) + set_tests_properties(${TARGET_NAME} + PROPERTIES DEPENDS "${inference_test_ARGS}") + endif() + endif(WITH_TESTING) endfunction(inference_api_test) - cc_library(paddle_inference_api SRCS paddle_inference_api.cc paddle_inference_api_impl.cc DEPS ${FLUID_CORE_MODULES} ${GLOB_OP_LIB}) -if(WITH_TESTING) - cc_test(test_paddle_inference_api - SRCS test_paddle_inference_api.cc - DEPS paddle_inference_api) +cc_test(test_paddle_inference_api + SRCS test_paddle_inference_api.cc + DEPS paddle_inference_api) - inference_api_test(api_impl - ARGS test_word2vec test_image_classification) +inference_api_test(test_paddle_inference_api_impl + ARGS test_word2vec test_image_classification) + +if(WITH_TESTING) + add_subdirectory(demo) endif() diff --git a/paddle/contrib/inference/demo/CMakeLists.txt b/paddle/contrib/inference/demo/CMakeLists.txt new file mode 100644 index 00000000000..7b0fa77ad13 --- /dev/null +++ b/paddle/contrib/inference/demo/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016 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. +# + +inference_api_test(simple_on_word2vec ARGS test_word2vec) diff --git a/paddle/contrib/inference/demo/simple_on_word2vec.cc b/paddle/contrib/inference/demo/simple_on_word2vec.cc new file mode 100644 index 00000000000..165d2e196b3 --- /dev/null +++ b/paddle/contrib/inference/demo/simple_on_word2vec.cc @@ -0,0 +1,71 @@ +/* Copyright (c) 2018 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. */ + +/* + * This file contains a simple demo for how to take a model for inference. + */ + +#include +#include +#include +#include "paddle/contrib/inference/paddle_inference_api.h" + +namespace paddle { +namespace demo { + +DEFINE_string(dirname, "", "Directory of the inference model."); + +void Main(bool use_gpu) { + //# 1. Create PaddlePredictor with a config. + NativeConfig config; + config.model_dir = FLAGS_dirname + "word2vec.inference.model"; + config.use_gpu = use_gpu; + config.fraction_of_gpu_memory = 0.15; + config.device = 0; + auto predictor = + CreatePaddlePredictor(config); + + for (int batch_id = 0; batch_id < 3; batch_id++) { + //# 2. Prepare input. + int64_t data[4] = {1, 2, 3, 4}; + + PaddleBuf buf{.data = data, .length = sizeof(data)}; + PaddleTensor tensor{.name = "", + .shape = std::vector({4, 1}), + .data = buf, + .dtype = PaddleDType::INT64}; + + // For simplicity, we set all the slots with the same data. + std::vector slots(4, tensor); + + //# 3. Run + std::vector outputs; + CHECK(predictor->Run(slots, &outputs)); + + //# 4. Get output. + ASSERT_EQ(outputs.size(), 1); + LOG(INFO) << "output buffer size: " << outputs.front().data.length; + const size_t num_elements = outputs.front().data.length / sizeof(float); + // The outputs' buffers are in CPU memory. + for (size_t i = 0; i < std::min(5UL, num_elements); i++) { + LOG(INFO) << static_cast(outputs.front().data.data)[i]; + } + } +} + +TEST(demo, word2vec_cpu) { Main(false /*use_gpu*/); } +TEST(demo, word2vec_gpu) { Main(true /*use_gpu*/); } + +} // namespace demo +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 99a64662d4d..e7a8fa68b7f 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -248,9 +248,11 @@ CreatePaddlePredictor( VLOG(3) << "create NativePaddlePredictor"; if (config.use_gpu) { // 1. GPU memeroy - PADDLE_ENFORCE( - config.fraction_of_gpu_memory > 0.f, + PADDLE_ENFORCE_GT( + config.fraction_of_gpu_memory, + 0.f, "fraction_of_gpu_memory in the config should be set to range (0., 1.]"); + PADDLE_ENFORCE_GE(config.device, 0, "Invalid device id %d", config.device); std::vector flags; if (config.fraction_of_gpu_memory >= 0.0f || config.fraction_of_gpu_memory <= 0.95f) { diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 07b17acd484..1f960677163 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -74,7 +74,7 @@ TEST(paddle_inference_api_impl, word2vec) { ASSERT_EQ(outputs.size(), 1UL); size_t len = outputs[0].data.length; float* data = static_cast(outputs[0].data.data); - for (int j = 0; j < len / sizeof(float); ++j) { + for (size_t j = 0; j < len / sizeof(float); ++j) { ASSERT_LT(data[j], 1.0); ASSERT_GT(data[j], -1.0); } @@ -92,7 +92,7 @@ TEST(paddle_inference_api_impl, word2vec) { TestInference(config.model_dir, cpu_feeds, cpu_fetchs1); float* lod_data = output1.data(); - for (size_t i = 0; i < output1.numel(); ++i) { + for (int i = 0; i < output1.numel(); ++i) { EXPECT_LT(lod_data[i] - data[i], 1e-3); EXPECT_GT(lod_data[i] - data[i], -1e-3); } -- GitLab From 38f8182df63d33ff619297d95f5a4431bf8d5362 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 20:41:18 +0800 Subject: [PATCH 0094/1416] work around with dummy test --- .../fluid/inference/tests/book/CMakeLists.txt | 8 ++++++- .../tests/book/test_inference_nlp.cc | 21 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index 90357f99d1d..b33df2942a8 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -35,7 +35,13 @@ inference_test(image_classification ARGS vgg resnet) inference_test(label_semantic_roles) inference_test(recognize_digits ARGS mlp conv) inference_test(recommender_system) -inference_test(nlp) #inference_test(rnn_encoder_decoder) #inference_test(understand_sentiment ARGS conv) inference_test(word2vec) + +# This is an unly work around to make this test run +cc_test(test_inference_nlp + SRCS test_inference_nlp.cc + DEPS paddle_fluid + ARGS + --modelpath=${PADDLE_BINARY_DIR}/python/paddle/fluid/tests/book/recognize_digits_mlp.inference.model) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index c4d7b0bbf01..5ece6084df2 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -37,10 +37,22 @@ inline double GetCurrentMs() { return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } +// This function just give dummy data for recognize_digits model. +size_t DummyData(std::vector* out) { + paddle::framework::LoDTensor input; + SetupTensor(&input, {1, 1, 28, 28}, -1.f, 1.f); + out->emplace_back(input); + return 1; +} + // Load the input word index data from file and save into LodTensor. // Return the size of words. size_t LoadData(std::vector* out, const std::string& filename) { + if (filename.empty()) { + return DummyData(out); + } + size_t sz = 0; std::fstream fin(filename); std::string line; @@ -130,9 +142,12 @@ void ThreadRunInfer( } TEST(inference, nlp) { - if (FLAGS_modelpath.empty() || FLAGS_datafile.empty()) { - LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model " - << "--datafile=path/to/your/data"; + if (FLAGS_modelpath.empty()) { + LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model"; + } + if (FLAGS_datafile.empty()) { + LOG(WARNING) << " Not data file provided, will use dummy data!" + << "Note: if you use nlp model, please provide data file."; } LOG(INFO) << "Model Path: " << FLAGS_modelpath; LOG(INFO) << "Data File: " << FLAGS_datafile; -- GitLab From 99d00cce9330dac56aac52788d7fba76d0137430 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 21:04:51 +0800 Subject: [PATCH 0095/1416] follow comment: refine where time started --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 5ece6084df2..c3bec279252 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -185,12 +185,12 @@ TEST(inference, nlp) { std::vector> jobs; SplitData(datasets, &jobs, FLAGS_num_threads); std::vector> threads; + start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads.emplace_back( new std::thread(ThreadRunInfer, i, &executor, scope.get(), std::ref(inference_program), std::ref(jobs))); } - start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads[i]->join(); } -- GitLab From e0a8c584701299017dda12214fed1bb108d8a9e9 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Fri, 1 Jun 2018 15:55:21 -0700 Subject: [PATCH 0096/1416] Doc: fix typo in var_desc.md. (#11130) --- doc/fluid/design/concepts/var_desc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fluid/design/concepts/var_desc.md b/doc/fluid/design/concepts/var_desc.md index 6750323c016..8db67f6703d 100644 --- a/doc/fluid/design/concepts/var_desc.md +++ b/doc/fluid/design/concepts/var_desc.md @@ -35,7 +35,7 @@ The computation `Program` consists of nested `Blocks`. Each `Block` will consist ## Definition of VarType -A VarDesc should have a name, type and whether or not it is persistable. The are different kinds of variable types supported in PaddlePaddle, apart from the POD_Types like: `LOD_TENSOR`, `SELECTED_ROWS`, `FEED_MINIBATCH`, `FETCH_LIST`, `STEP_SCOPES`, `LOD_RANK_TABLE`, `LOD_TENSOR_ARRAY`, `PLACE_LIST`, `READER` and `CHANNEL`. These are declared inside `VarType`. A `VarDesc` then looks as the following: +A VarDesc should have a name, type and whether or not it is persistable. There are different kinds of variable types supported in PaddlePaddle, apart from the POD_Types like: `LOD_TENSOR`, `SELECTED_ROWS`, `FEED_MINIBATCH`, `FETCH_LIST`, `STEP_SCOPES`, `LOD_RANK_TABLE`, `LOD_TENSOR_ARRAY`, `PLACE_LIST`, `READER` and `CHANNEL`. These are declared inside `VarType`. A `VarDesc` then looks as the following: ```proto message VarDesc { -- GitLab From 906334a6a493b5f47cdb52fc93688ee945f96f27 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Sun, 3 Jun 2018 16:12:38 +0800 Subject: [PATCH 0097/1416] fix build error on mac --- paddle/fluid/operators/detail/grpc_server.h | 4 ++-- paddle/fluid/operators/listen_and_serv_op.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/operators/detail/grpc_server.h b/paddle/fluid/operators/detail/grpc_server.h index d1fcbc414f1..eae87de4201 100644 --- a/paddle/fluid/operators/detail/grpc_server.h +++ b/paddle/fluid/operators/detail/grpc_server.h @@ -71,8 +71,8 @@ class AsyncGRPCServer final : public RPCServer { std::unique_ptr<::grpc::Server> server_; // condition of the sub program - std::mutex barrier_mutex_; - mutable int barrier_cond_step_; + // std::mutex barrier_mutex_; + // mutable int barrier_cond_step_; std::condition_variable barrier_condition_; std::mutex mutex_ready_; diff --git a/paddle/fluid/operators/listen_and_serv_op.cc b/paddle/fluid/operators/listen_and_serv_op.cc index 71e75c25321..66a0f87b46c 100644 --- a/paddle/fluid/operators/listen_and_serv_op.cc +++ b/paddle/fluid/operators/listen_and_serv_op.cc @@ -222,8 +222,8 @@ static void FillRequestCtx(detail::RequestHandler *h, framework::Scope *scope, h->SetDevCtx(dev_ctx); h->SetExecutor(executor); h->SetProgram(program); - h->SetPrefetchPreparedCtx(std::move( - std::unique_ptr(prefetch_ctx))); + h->SetPrefetchPreparedCtx( + std::unique_ptr(prefetch_ctx)); h->SetRPCServer(rpc_server); } -- GitLab From d3e99aeec33475cdb4a06bb0867f28503e91b3c7 Mon Sep 17 00:00:00 2001 From: Yuan Gao Date: Mon, 4 Jun 2018 09:46:49 +0800 Subject: [PATCH 0098/1416] add normalize switch to box_coder_op (#11129) --- .../fluid/operators/detection/box_coder_op.cc | 4 ++ .../fluid/operators/detection/box_coder_op.cu | 42 ++++++++++-------- .../fluid/operators/detection/box_coder_op.h | 44 +++++++++++-------- .../tests/unittests/test_box_coder_op.py | 32 ++++++++++---- 4 files changed, 78 insertions(+), 44 deletions(-) diff --git a/paddle/fluid/operators/detection/box_coder_op.cc b/paddle/fluid/operators/detection/box_coder_op.cc index 74848005d0b..76ef08cb9ad 100644 --- a/paddle/fluid/operators/detection/box_coder_op.cc +++ b/paddle/fluid/operators/detection/box_coder_op.cc @@ -91,6 +91,10 @@ class BoxCoderOpMaker : public framework::OpProtoAndCheckerMaker { "the code type used with the target box") .SetDefault("encode_center_size") .InEnum({"encode_center_size", "decode_center_size"}); + AddAttr("box_normalized", + "(bool, default true) " + "whether treat the priorbox as a noramlized box") + .SetDefault(true); AddOutput("OutputBox", "(LoDTensor or Tensor) " "When code_type is 'encode_center_size', the output tensor of " diff --git a/paddle/fluid/operators/detection/box_coder_op.cu b/paddle/fluid/operators/detection/box_coder_op.cu index 8cef8e03439..fc7eb5d1ed7 100644 --- a/paddle/fluid/operators/detection/box_coder_op.cu +++ b/paddle/fluid/operators/detection/box_coder_op.cu @@ -20,15 +20,16 @@ __global__ void EncodeCenterSizeKernel(const T* prior_box_data, const T* prior_box_var_data, const T* target_box_data, const int row, const int col, const int len, - T* output) { + const bool normalized, T* output) { const int idx = threadIdx.x + blockIdx.x * blockDim.x; if (idx < row * col) { const int row_idx = idx / col; const int col_idx = idx % col; - T prior_box_width = - prior_box_data[col_idx * len + 2] - prior_box_data[col_idx * len]; - T prior_box_height = - prior_box_data[col_idx * len + 3] - prior_box_data[col_idx * len + 1]; + T prior_box_width = prior_box_data[col_idx * len + 2] - + prior_box_data[col_idx * len] + (normalized == false); + T prior_box_height = prior_box_data[col_idx * len + 3] - + prior_box_data[col_idx * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[col_idx * len + 2] + prior_box_data[col_idx * len]) / 2; T prior_box_center_y = (prior_box_data[col_idx * len + 3] + @@ -41,10 +42,11 @@ __global__ void EncodeCenterSizeKernel(const T* prior_box_data, T target_box_center_y = (target_box_data[row_idx * len + 3] + target_box_data[row_idx * len + 1]) / 2; - T target_box_width = - target_box_data[row_idx * len + 2] - target_box_data[row_idx * len]; - T target_box_height = - target_box_data[row_idx * len + 3] - target_box_data[row_idx * len + 1]; + T target_box_width = target_box_data[row_idx * len + 2] - + target_box_data[row_idx * len] + (normalized == false); + T target_box_height = target_box_data[row_idx * len + 3] - + target_box_data[row_idx * len + 1] + + (normalized == false); output[idx * len] = (target_box_center_x - prior_box_center_x) / prior_box_width / prior_box_var_data[col_idx * len]; @@ -63,14 +65,15 @@ __global__ void DecodeCenterSizeKernel(const T* prior_box_data, const T* prior_box_var_data, const T* target_box_data, const int row, const int col, const int len, - T* output) { + const bool normalized, T* output) { const int idx = threadIdx.x + blockIdx.x * blockDim.x; if (idx < row * col) { const int col_idx = idx % col; - T prior_box_width = - prior_box_data[col_idx * len + 2] - prior_box_data[col_idx * len]; - T prior_box_height = - prior_box_data[col_idx * len + 3] - prior_box_data[col_idx * len + 1]; + T prior_box_width = prior_box_data[col_idx * len + 2] - + prior_box_data[col_idx * len] + (normalized == false); + T prior_box_height = prior_box_data[col_idx * len + 3] - + prior_box_data[col_idx * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[col_idx * len + 2] + prior_box_data[col_idx * len]) / 2; T prior_box_center_y = (prior_box_data[col_idx * len + 3] + @@ -93,8 +96,10 @@ __global__ void DecodeCenterSizeKernel(const T* prior_box_data, output[idx * len] = target_box_center_x - target_box_width / 2; output[idx * len + 1] = target_box_center_y - target_box_height / 2; - output[idx * len + 2] = target_box_center_x + target_box_width / 2; - output[idx * len + 3] = target_box_center_y + target_box_height / 2; + output[idx * len + 2] = + target_box_center_x + target_box_width / 2 - (normalized == false); + output[idx * len + 3] = + target_box_center_y + target_box_height / 2 - (normalized == false); } } @@ -128,14 +133,15 @@ class BoxCoderCUDAKernel : public framework::OpKernel { T* output = output_box->data(); auto code_type = GetBoxCodeType(context.Attr("code_type")); + bool normalized = context.Attr("box_normalized"); if (code_type == BoxCodeType::kEncodeCenterSize) { EncodeCenterSizeKernel<<>>( prior_box_data, prior_box_var_data, target_box_data, row, col, len, - output); + normalized, output); } else if (code_type == BoxCodeType::kDecodeCenterSize) { DecodeCenterSizeKernel<<>>( prior_box_data, prior_box_var_data, target_box_data, row, col, len, - output); + normalized, output); } } }; diff --git a/paddle/fluid/operators/detection/box_coder_op.h b/paddle/fluid/operators/detection/box_coder_op.h index 77fc6c2b62a..3dc68935ac1 100644 --- a/paddle/fluid/operators/detection/box_coder_op.h +++ b/paddle/fluid/operators/detection/box_coder_op.h @@ -34,7 +34,7 @@ class BoxCoderKernel : public framework::OpKernel { void EncodeCenterSize(const framework::Tensor& target_box, const framework::Tensor& prior_box, const framework::Tensor& prior_box_var, - T* output) const { + const bool normalized, T* output) const { int64_t row = target_box.dims()[0]; int64_t col = prior_box.dims()[0]; int64_t len = prior_box.dims()[1]; @@ -44,10 +44,11 @@ class BoxCoderKernel : public framework::OpKernel { for (int64_t i = 0; i < row; ++i) { for (int64_t j = 0; j < col; ++j) { - T prior_box_width = - prior_box_data[j * len + 2] - prior_box_data[j * len]; - T prior_box_height = - prior_box_data[j * len + 3] - prior_box_data[j * len + 1]; + T prior_box_width = prior_box_data[j * len + 2] - + prior_box_data[j * len] + (normalized == false); + T prior_box_height = prior_box_data[j * len + 3] - + prior_box_data[j * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[j * len + 2] + prior_box_data[j * len]) / 2; T prior_box_center_y = @@ -57,10 +58,11 @@ class BoxCoderKernel : public framework::OpKernel { (target_box_data[i * len + 2] + target_box_data[i * len]) / 2; T target_box_center_y = (target_box_data[i * len + 3] + target_box_data[i * len + 1]) / 2; - T target_box_width = - target_box_data[i * len + 2] - target_box_data[i * len]; - T target_box_height = - target_box_data[i * len + 3] - target_box_data[i * len + 1]; + T target_box_width = target_box_data[i * len + 2] - + target_box_data[i * len] + (normalized == false); + T target_box_height = target_box_data[i * len + 3] - + target_box_data[i * len + 1] + + (normalized == false); size_t offset = i * col * len + j * len; output[offset] = (target_box_center_x - prior_box_center_x) / @@ -79,7 +81,7 @@ class BoxCoderKernel : public framework::OpKernel { void DecodeCenterSize(const framework::Tensor& target_box, const framework::Tensor& prior_box, const framework::Tensor& prior_box_var, - T* output) const { + const bool normalized, T* output) const { int64_t row = target_box.dims()[0]; int64_t col = prior_box.dims()[0]; int64_t len = prior_box.dims()[1]; @@ -91,10 +93,11 @@ class BoxCoderKernel : public framework::OpKernel { for (int64_t i = 0; i < row; ++i) { for (int64_t j = 0; j < col; ++j) { size_t offset = i * col * len + j * len; - T prior_box_width = - prior_box_data[j * len + 2] - prior_box_data[j * len]; - T prior_box_height = - prior_box_data[j * len + 3] - prior_box_data[j * len + 1]; + T prior_box_width = prior_box_data[j * len + 2] - + prior_box_data[j * len] + (normalized == false); + T prior_box_height = prior_box_data[j * len + 3] - + prior_box_data[j * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[j * len + 2] + prior_box_data[j * len]) / 2; T prior_box_center_y = @@ -116,8 +119,10 @@ class BoxCoderKernel : public framework::OpKernel { output[offset] = target_box_center_x - target_box_width / 2; output[offset + 1] = target_box_center_y - target_box_height / 2; - output[offset + 2] = target_box_center_x + target_box_width / 2; - output[offset + 3] = target_box_center_y + target_box_height / 2; + output[offset + 2] = + target_box_center_x + target_box_width / 2 - (normalized == false); + output[offset + 3] = + target_box_center_y + target_box_height / 2 - (normalized == false); } } } @@ -139,11 +144,14 @@ class BoxCoderKernel : public framework::OpKernel { output_box->mutable_data({row, col, len}, context.GetPlace()); auto code_type = GetBoxCodeType(context.Attr("code_type")); + bool normalized = context.Attr("box_normalized"); T* output = output_box->data(); if (code_type == BoxCodeType::kEncodeCenterSize) { - EncodeCenterSize(*target_box, *prior_box, *prior_box_var, output); + EncodeCenterSize(*target_box, *prior_box, *prior_box_var, normalized, + output); } else if (code_type == BoxCodeType::kDecodeCenterSize) { - DecodeCenterSize(*target_box, *prior_box, *prior_box_var, output); + DecodeCenterSize(*target_box, *prior_box, *prior_box_var, normalized, + output); } } }; diff --git a/python/paddle/fluid/tests/unittests/test_box_coder_op.py b/python/paddle/fluid/tests/unittests/test_box_coder_op.py index 56f5af91d8e..a31b7ea322f 100644 --- a/python/paddle/fluid/tests/unittests/test_box_coder_op.py +++ b/python/paddle/fluid/tests/unittests/test_box_coder_op.py @@ -19,7 +19,8 @@ import math from op_test import OpTest -def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): +def box_coder(target_box, prior_box, prior_box_var, output_box, code_type, + box_normalized): prior_box_x = ( (prior_box[:, 2] + prior_box[:, 0]) / 2).reshape(1, prior_box.shape[0]) prior_box_y = ( @@ -30,6 +31,9 @@ def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): (prior_box[:, 3] - prior_box[:, 1])).reshape(1, prior_box.shape[0]) prior_box_var = prior_box_var.reshape(1, prior_box_var.shape[0], prior_box_var.shape[1]) + if not box_normalized: + prior_box_height = prior_box_height + 1 + prior_box_width = prior_box_width + 1 if (code_type == "EncodeCenterSize"): target_box_x = ((target_box[:, 2] + target_box[:, 0]) / 2).reshape( @@ -40,6 +44,9 @@ def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): target_box.shape[0], 1) target_box_height = ((target_box[:, 3] - target_box[:, 1])).reshape( target_box.shape[0], 1) + if not box_normalized: + target_box_height = target_box_height + 1 + target_box_width = target_box_width + 1 output_box[:,:,0] = (target_box_x - prior_box_x) / prior_box_width / \ prior_box_var[:,:,0] @@ -64,9 +71,13 @@ def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): output_box[:, :, 1] = target_box_y - target_box_height / 2 output_box[:, :, 2] = target_box_x + target_box_width / 2 output_box[:, :, 3] = target_box_y + target_box_height / 2 + if not box_normalized: + output_box[:, :, 2] = output_box[:, :, 2] - 1 + output_box[:, :, 3] = output_box[:, :, 3] - 1 -def batch_box_coder(prior_box, prior_box_var, target_box, lod, code_type): +def batch_box_coder(prior_box, prior_box_var, target_box, lod, code_type, + box_normalized): n = target_box.shape[0] m = prior_box.shape[0] output_box = np.zeros((n, m, 4), dtype=np.float32) @@ -74,11 +85,11 @@ def batch_box_coder(prior_box, prior_box_var, target_box, lod, code_type): if (code_type == "EncodeCenterSize"): box_coder(target_box[lod[i]:lod[i + 1], :], prior_box, prior_box_var, output_box[lod[i]:lod[i + 1], :, :], - code_type) + code_type, box_normalized) elif (code_type == "DecodeCenterSize"): box_coder(target_box[lod[i]:lod[i + 1], :, :], prior_box, prior_box_var, output_box[lod[i]:lod[i + 1], :, :], - code_type) + code_type, box_normalized) return output_box @@ -93,15 +104,19 @@ class TestBoxCoderOp(OpTest): prior_box_var = np.random.random((10, 4)).astype('float32') target_box = np.random.random((5, 10, 4)).astype('float32') code_type = "DecodeCenterSize" + box_normalized = False output_box = batch_box_coder(prior_box, prior_box_var, target_box, - lod[0], code_type) + lod[0], code_type, box_normalized) self.inputs = { 'PriorBox': prior_box, 'PriorBoxVar': prior_box_var, 'TargetBox': target_box, } - self.attrs = {'code_type': 'decode_center_size'} + self.attrs = { + 'code_type': 'decode_center_size', + 'box_normalized': False + } self.outputs = {'OutputBox': output_box} @@ -116,15 +131,16 @@ class TestBoxCoderOpWithLoD(OpTest): prior_box_var = np.random.random((10, 4)).astype('float32') target_box = np.random.random((20, 4)).astype('float32') code_type = "EncodeCenterSize" + box_normalized = True output_box = batch_box_coder(prior_box, prior_box_var, target_box, - lod[0], code_type) + lod[0], code_type, box_normalized) self.inputs = { 'PriorBox': prior_box, 'PriorBoxVar': prior_box_var, 'TargetBox': (target_box, lod), } - self.attrs = {'code_type': 'encode_center_size'} + self.attrs = {'code_type': 'encode_center_size', 'box_normalized': True} self.outputs = {'OutputBox': output_box} -- GitLab From 7218f4feb28e295b55e0eedd1d0e437e190c4de8 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 10:42:26 +0800 Subject: [PATCH 0099/1416] update by comment --- .../fluid/tests/unittests/test_listen_and_serv_op.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py index ad479657cc2..6be24b09447 100644 --- a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py +++ b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py @@ -72,8 +72,8 @@ class TestListenAndServOp(OpTest): def _wait_ps_ready(self, pid): retry_times = self.ps_timeout while True: - time.sleep(1) assert retry_times >= 0, "wait ps ready failed" + time.sleep(0.5) try: # the listen_and_serv_op would touch a file which contains the listen port # on the /tmp directory until it was ready to process all the RPC call. @@ -87,15 +87,15 @@ class TestListenAndServOp(OpTest): pid = self._start_pserver(False, True) self._wait_ps_ready(pid) - # raise SIGINT to pserver - os.kill(pid, signal.SIGINT) + # raise SIGTERM to pserver + os.kill(pid, signal.SIGTERM) # run pserver on CPU in async mode pid = self._start_pserver(False, False) self._wait_ps_ready(pid) # raise SIGTERM to pserver - os.kill(pid, signal.SIGINT) + os.kill(pid, signal.SIGTERM) if __name__ == '__main__': -- GitLab From ee4e567dea8074245c89be79b0267a515a84c6b6 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 4 Jun 2018 10:45:59 +0800 Subject: [PATCH 0100/1416] Creating readers before training begining --- .../fluid/operators/reader/open_files_op.cc | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index 8c0dac65dd6..c0526e45f4d 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -26,7 +26,11 @@ class MultiFileReader : public framework::ReaderBase { MultiFileReader(const std::vector& file_names, const std::vector& dims, size_t thread_num, size_t buffer_size) - : file_names_(file_names), dims_(dims), buffer_size_(buffer_size) { + : buffer_size_(buffer_size) { + readers_.resize(file_names.size()); + for (const std::string& f_name : file_names) { + readers_.emplace_back(CreateReaderByFileName(f_name, dims)); + } prefetchers_.resize(thread_num); StartNewScheduler(); } @@ -40,14 +44,13 @@ class MultiFileReader : public framework::ReaderBase { void StartNewScheduler(); void EndScheduler(); void ScheduleThreadFunc(); - void PrefetchThreadFunc(std::string file_name, size_t thread_idx); + void PrefetchThreadFunc(size_t reader_idx, size_t thread_idx); - std::vector file_names_; - std::vector dims_; + std::vector> readers_; std::thread scheduler_; std::vector prefetchers_; size_t buffer_size_; - reader::BlockingQueue* waiting_file_idx_; + reader::BlockingQueue* waiting_reader_idx_; reader::BlockingQueue* available_thread_idx_; reader::BlockingQueue>* buffer_; }; @@ -60,20 +63,23 @@ void MultiFileReader::ReadNext(std::vector* out) { void MultiFileReader::ReInit() { EndScheduler(); + for (auto& reader : readers_) { + reader->ReInit(); + } StartNewScheduler(); } void MultiFileReader::StartNewScheduler() { size_t thread_num = prefetchers_.size(); - waiting_file_idx_ = new reader::BlockingQueue(file_names_.size()); + waiting_reader_idx_ = new reader::BlockingQueue(readers_.size()); available_thread_idx_ = new reader::BlockingQueue(thread_num); buffer_ = new reader::BlockingQueue>( buffer_size_); - for (size_t i = 0; i < file_names_.size(); ++i) { - waiting_file_idx_->Send(i); + for (size_t i = 0; i < readers_.size(); ++i) { + waiting_reader_idx_->Send(i); } - waiting_file_idx_->Close(); + waiting_reader_idx_->Close(); for (size_t i = 0; i < thread_num; ++i) { available_thread_idx_->Send(i); } @@ -84,13 +90,13 @@ void MultiFileReader::StartNewScheduler() { void MultiFileReader::EndScheduler() { available_thread_idx_->Close(); buffer_->Close(); - waiting_file_idx_->Close(); + waiting_reader_idx_->Close(); if (scheduler_.joinable()) { scheduler_.join(); } delete buffer_; delete available_thread_idx_; - delete waiting_file_idx_; + delete waiting_reader_idx_; } void MultiFileReader::ScheduleThreadFunc() { @@ -102,12 +108,11 @@ void MultiFileReader::ScheduleThreadFunc() { if (prefetcher.joinable()) { prefetcher.join(); } - size_t file_idx; - if (waiting_file_idx_->Receive(&file_idx)) { + size_t reader_idx; + if (waiting_reader_idx_->Receive(&reader_idx)) { // Still have files to read. Start a new prefetch thread. - std::string file_name = file_names_[file_idx]; - prefetcher = std::thread([this, file_name, thread_idx] { - PrefetchThreadFunc(file_name, thread_idx); + prefetcher = std::thread([this, reader_idx, thread_idx] { + PrefetchThreadFunc(reader_idx, thread_idx); }); } else { // No more file to read. @@ -129,11 +134,9 @@ void MultiFileReader::ScheduleThreadFunc() { VLOG(5) << "MultiFileReader schedule thread terminates."; } -void MultiFileReader::PrefetchThreadFunc(std::string file_name, - size_t thread_idx) { - VLOG(5) << "The prefetch thread of file '" << file_name << "' starts."; - std::unique_ptr reader = - CreateReaderByFileName(file_name, dims_); +void MultiFileReader::PrefetchThreadFunc(size_t reader_idx, size_t thread_idx) { + VLOG(5) << "The prefetch thread of file idx '" << reader_idx << "' starts."; + std::unique_ptr& reader = readers_[reader_idx]; while (true) { std::vector ins; reader->ReadNext(&ins); @@ -144,8 +147,8 @@ void MultiFileReader::PrefetchThreadFunc(std::string file_name, buffer_->Send(std::move(ins)); } catch (paddle::platform::EnforceNotMet e) { VLOG(5) << "WARNING: The buffer channel has been closed. The prefetch " - "thread of file '" - << file_name << "' will terminate."; + "thread of file idx '" + << reader_idx << "' will terminate."; break; } } @@ -154,7 +157,8 @@ void MultiFileReader::PrefetchThreadFunc(std::string file_name, VLOG(5) << "WARNING: The available_thread_idx_ channel has been closed. " "Fail to send thread_idx."; } - VLOG(5) << "The prefetch thread of file '" << file_name << "' terminates."; + VLOG(5) << "The prefetch thread of file idx '" << reader_idx + << "' terminates."; } class OpenFilesOp : public framework::OperatorBase { -- GitLab From 7f5eb9f68743093ed14d5c35ebd0d266800ac939 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 10:46:02 +0800 Subject: [PATCH 0101/1416] update by comment --- .../paddle/fluid/tests/unittests/test_listen_and_serv_op.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py index 6be24b09447..1226027ddc9 100644 --- a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py +++ b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py @@ -82,6 +82,10 @@ class TestListenAndServOp(OpTest): except os.error: retry_times -= 1 + def test_rpc_interfaces(self): + # TODO(Yancey1989): need to make sure the rpc interface correctly. + pass + def test_handle_signal_in_serv_op(self): # run pserver on CPU in sync mode pid = self._start_pserver(False, True) -- GitLab From 6ae7cbe252178e7bd3e5c3b7cde21581948b478f Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Mon, 4 Jun 2018 11:08:08 +0800 Subject: [PATCH 0102/1416] follow comments --- .../fluid/inference/tests/book/CMakeLists.txt | 3 ++- .../tests/book/test_inference_nlp.cc | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index b33df2942a8..2fa5a9540ba 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -40,8 +40,9 @@ inference_test(recommender_system) inference_test(word2vec) # This is an unly work around to make this test run +# TODO(TJ): clean me up cc_test(test_inference_nlp SRCS test_inference_nlp.cc DEPS paddle_fluid ARGS - --modelpath=${PADDLE_BINARY_DIR}/python/paddle/fluid/tests/book/recognize_digits_mlp.inference.model) + --model_path=${PADDLE_BINARY_DIR}/python/paddle/fluid/tests/book/recognize_digits_mlp.inference.model) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index c3bec279252..70aa42ac411 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -24,8 +24,8 @@ limitations under the License. */ #include #endif -DEFINE_string(modelpath, "", "Directory of the inference model."); -DEFINE_string(datafile, "", "File of input index data."); +DEFINE_string(model_path, "", "Directory of the inference model."); +DEFINE_string(data_file, "", "File of input index data."); DEFINE_int32(repeat, 100, "Running the inference program repeat times"); DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); @@ -65,6 +65,7 @@ size_t LoadData(std::vector* out, ids.push_back(stoi(field)); } if (ids.size() >= 1024) { + // Synced with NLP guys, they will ignore input larger then 1024 continue; } @@ -142,18 +143,18 @@ void ThreadRunInfer( } TEST(inference, nlp) { - if (FLAGS_modelpath.empty()) { - LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model"; + if (FLAGS_model_path.empty()) { + LOG(FATAL) << "Usage: ./example --model_path=path/to/your/model"; } - if (FLAGS_datafile.empty()) { - LOG(WARNING) << " Not data file provided, will use dummy data!" + if (FLAGS_data_file.empty()) { + LOG(WARNING) << "No data file provided, will use dummy data!" << "Note: if you use nlp model, please provide data file."; } - LOG(INFO) << "Model Path: " << FLAGS_modelpath; - LOG(INFO) << "Data File: " << FLAGS_datafile; + LOG(INFO) << "Model Path: " << FLAGS_model_path; + LOG(INFO) << "Data File: " << FLAGS_data_file; std::vector datasets; - size_t num_total_words = LoadData(&datasets, FLAGS_datafile); + size_t num_total_words = LoadData(&datasets, FLAGS_data_file); LOG(INFO) << "Number of samples (seq_len<1024): " << datasets.size(); LOG(INFO) << "Total number of words: " << num_total_words; @@ -168,7 +169,7 @@ TEST(inference, nlp) { // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; inference_program = - InitProgram(&executor, scope.get(), FLAGS_modelpath, model_combined); + InitProgram(&executor, scope.get(), FLAGS_model_path, model_combined); if (FLAGS_use_mkldnn) { EnableMKLDNN(inference_program); } -- GitLab From f1facb7a3c8b61d9231d27408b173e388818f44b Mon Sep 17 00:00:00 2001 From: weixing02 Date: Mon, 4 Jun 2018 11:33:35 +0800 Subject: [PATCH 0103/1416] Fix links --- doc/v2/build_and_install/build_from_source_cn.rst | 12 ++++++------ doc/v2/build_and_install/build_from_source_en.rst | 12 +++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/v2/build_and_install/build_from_source_cn.rst b/doc/v2/build_and_install/build_from_source_cn.rst index 741c01ce542..de7e9eb75c3 100644 --- a/doc/v2/build_and_install/build_from_source_cn.rst +++ b/doc/v2/build_and_install/build_from_source_cn.rst @@ -23,7 +23,7 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 在 `这里 `__ 找到 paddle_manylinux_devel 镜像的编译以及使用方法。或者参考下述可选步骤,从源码中构建用于编译PaddlePaddle的Docker镜像。 -如果您选择不使用Docker镜像,则需要在本机安装下面章节列出的 `编译依赖`_ 之后才能开始编译的步骤。 +如果您选择不使用Docker镜像,则需要在本机安装下面章节列出的 :ref:`编译依赖 <_compile_deps>` 之后才能开始编译的步骤。 编译PaddlePaddle,需要执行: @@ -106,7 +106,7 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 - 学习 Docker 有多难? - 理解 Docker 并不难,大概花十分钟看一下[这篇文章](https://zhuanlan.zhihu.com/p/19902938)。这可以帮您省掉花一小时安装和配置各种开发工具,以及切换机器时需要新安装的辛苦。别忘了 PaddlePaddle 更新可能导致需要新的开发工具。更别提简化问题复现带来的好处了。 + 理解 Docker 并不难,大概花十分钟看一下 `这篇文章 `_ 。这可以帮您省掉花一小时安装和配置各种开发工具,以及切换机器时需要新安装的辛苦。别忘了 PaddlePaddle 更新可能导致需要新的开发工具。更别提简化问题复现带来的好处了。 - 我可以用 IDE 吗? @@ -123,7 +123,7 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 - 可以并行编译吗? - 是的。我们的 Docker image 运行一个 [Bash 脚本](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build.sh)。这个脚本调用 `make -j$(nproc)` 来启动和 CPU 核一样多的进程来并行编译。 + 是的。我们的 Docker image 运行一个 `Bash脚本 `_ 。这个脚本调用 `make -j$(nproc)` 来启动和 CPU 核一样多的进程来并行编译。 - Docker 需要 sudo @@ -131,11 +131,11 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 - 在 Windows/MacOS 上编译很慢 - Docker 在 Windows 和 MacOS 都可以运行。不过实际上是运行在一个 Linux 虚拟机上。可能需要注意给这个虚拟机多分配一些 CPU 和内存,以保证编译高效。具体做法请参考[这个issue](https://github.com/PaddlePaddle/Paddle/issues/627)。 + Docker 在 Windows 和 MacOS 都可以运行。不过实际上是运行在一个 Linux 虚拟机上。可能需要注意给这个虚拟机多分配一些 CPU 和内存,以保证编译高效。具体做法请参考 `这个issue `_ 。 - 磁盘不够 - 本文中的例子里,`docker run` 命令里都用了 `--rm` 参数,这样保证运行结束之后的 containers 不会保留在磁盘上。可以用 `docker ps -a` 命令看到停止后但是没有删除的 containers。`docker build` 命令有时候会产生一些中间结果,是没有名字的 images,也会占用磁盘。可以参考[这篇文章](https://zaiste.net/posts/removing_docker_containers/)来清理这些内容。 + 本文中的例子里,`docker run` 命令里都用了 `--rm` 参数,这样保证运行结束之后的 containers 不会保留在磁盘上。可以用 `docker ps -a` 命令看到停止后但是没有删除的 containers。`docker build` 命令有时候会产生一些中间结果,是没有名字的 images,也会占用磁盘。可以参考 `这篇文章 `_ 来清理这些内容。 .. _compile_deps: @@ -211,7 +211,7 @@ PaddlePaddle可以使用cuDNN v5.1之后的任何一个版本来编译运行, 编译选项的设置 ++++++++++++++ -PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。cmake编译时,首先在系统路径( :code:`/usr/lib:/usr/local/lib` )中搜索这几个库,同时也会读取相关路径变量来进行搜索。 通过使用 ``-D`` 命令可以设置,例如 +PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。cmake编译时,首先在系统路径( :code:`/usr/lib:/usr/local/lib` )中搜索这几个库,同时也会读取相关路径变量来进行搜索。 通过使用 ``-D`` 命令可以设置,例如 .. code-block:: bash diff --git a/doc/v2/build_and_install/build_from_source_en.rst b/doc/v2/build_and_install/build_from_source_en.rst index b06c43e19dc..b08b45d43ec 100644 --- a/doc/v2/build_and_install/build_from_source_en.rst +++ b/doc/v2/build_and_install/build_from_source_en.rst @@ -11,7 +11,7 @@ To build PaddlePaddle, you need 1. A computer -- Linux, Windows, MacOS. 2. Docker. -Nothing else. Not even Python and GCC, because you can install all build tools into a Docker image. +Nothing else. Not even Python and GCC, because you can install all build tools into a Docker image. We run all the tools by running this image. .. _build_step: @@ -26,6 +26,8 @@ you can also find how to build and use paddle_manylinux_devel Docker image from `here `__ Or you can build your own image from source as the optional step below: +If you don't wish to use docker,you need to install several compile dependencies manually as :ref:`Compile Dependencies <_compile_deps>` shows to start compilation. + .. code-block:: bash # 1. clone the source code @@ -108,7 +110,7 @@ Frequently Asked Questions - How difficult is it to learn Docker? - It takes you ten minutes to read [an introductory article](https://docs.docker.com/get-started) and saves you more than one hour to install all required build tools, configure them, especially when new versions of PaddlePaddle require some new tools. Not even to mention the time saved when other people trying to reproduce the issue you have. + It takes you ten minutes to read `an introductory article `_ and saves you more than one hour to install all required build tools, configure them, especially when new versions of PaddlePaddle require some new tools. Not even to mention the time saved when other people trying to reproduce the issue you have. - Can I use my favorite IDE? @@ -125,7 +127,7 @@ Frequently Asked Questions - Does Docker do parallel building? - Our building Docker image runs a [Bash script](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build.sh), which calls `make -j$(nproc)` to starts as many processes as the number of your CPU cores. + Our building Docker image runs a `Bash script `_ , which calls `make -j$(nproc)` to starts as many processes as the number of your CPU cores. - Docker requires sudo @@ -133,11 +135,11 @@ Frequently Asked Questions - Docker on Windows/MacOS builds slowly - On Windows and MacOS, Docker containers run in a Linux VM. You might want to give this VM some more memory and CPUs so to make the building efficient. Please refer to [this issue](https://github.com/PaddlePaddle/Paddle/issues/627) for details. + On Windows and MacOS, Docker containers run in a Linux VM. You might want to give this VM some more memory and CPUs so to make the building efficient. Please refer to `this issue `_ for details. - Not enough disk space - Examples in this article use option `--rm` with the `docker run` command. This option ensures that stopped containers do not exist on hard disks. We can use `docker ps -a` to list all containers, including stopped. Sometimes `docker build` generates some intermediate dangling images, which also take disk space. To clean them, please refer to [this article](https://zaiste.net/posts/removing_docker_containers/). + Examples in this article use option `--rm` with the `docker run` command. This option ensures that stopped containers do not exist on hard disks. We can use `docker ps -a` to list all containers, including stopped. Sometimes `docker build` generates some intermediate dangling images, which also take disk space. To clean them, please refer to `this article `_ . .. _compile_deps: -- GitLab From 05a2a1a9064cdd1bf02f46603b2ee814bee4031d Mon Sep 17 00:00:00 2001 From: weixing02 Date: Mon, 4 Jun 2018 05:24:31 +0000 Subject: [PATCH 0104/1416] update apis --- doc/fluid/api/io.rst | 18 ++++++++++ doc/fluid/api/layers.rst | 72 ++++++++++++++++++++++++------------- doc/fluid/api/optimizer.rst | 44 ++++++++--------------- doc/fluid/api/profiler.rst | 12 +++++++ 4 files changed, 92 insertions(+), 54 deletions(-) diff --git a/doc/fluid/api/io.rst b/doc/fluid/api/io.rst index dd9d88b6699..3e956f8302d 100644 --- a/doc/fluid/api/io.rst +++ b/doc/fluid/api/io.rst @@ -59,3 +59,21 @@ get_inference_program .. autofunction:: paddle.fluid.io.get_inference_program :noindex: +save_checkpoint +--------------- + +.. autofunction:: paddle.fluid.io.save_checkpoint + :noindex: + +load_checkpoint +--------------- + +.. autofunction:: paddle.fluid.io.load_checkpoint + :noindex: + +clean_checkpoint +---------------- + +.. autofunction:: paddle.fluid.io.clean_checkpoint + :noindex: + diff --git a/doc/fluid/api/layers.rst b/doc/fluid/api/layers.rst index 5329adaa18b..f78e6db3268 100644 --- a/doc/fluid/api/layers.rst +++ b/doc/fluid/api/layers.rst @@ -181,6 +181,12 @@ Print .. autofunction:: paddle.fluid.layers.Print :noindex: +is_empty +-------- + +.. autofunction:: paddle.fluid.layers.is_empty + :noindex: + device ====== @@ -255,6 +261,19 @@ double_buffer .. autofunction:: paddle.fluid.layers.double_buffer :noindex: +random_data_generator +--------------------- + +.. autofunction:: paddle.fluid.layers.random_data_generator + :noindex: + +Preprocessor +------------ + +.. autoclass:: paddle.fluid.layers.Preprocessor + :members: + :noindex: + nn == @@ -594,6 +613,29 @@ roi_pool .. autofunction:: paddle.fluid.layers.roi_pool :noindex: +dice_loss +--------- + +.. autofunction:: paddle.fluid.layers.dice_loss + :noindex: + +resize_bilinear +--------------- + +.. autofunction:: paddle.fluid.layers.resize_bilinear + :noindex: + +gather +------ + +.. autofunction:: paddle.fluid.layers.gather + :noindex: + +random_crop +----------- + +.. autofunction:: paddle.fluid.layers.random_crop + :noindex: ops === @@ -742,6 +784,12 @@ sum .. autofunction:: paddle.fluid.layers.sum :noindex: +shape +----- + +.. autofunction:: paddle.fluid.layers.shape + :noindex: + sigmoid ------- @@ -991,27 +1039,3 @@ zeros .. autofunction:: paddle.fluid.layers.zeros :noindex: -topk ----- - -.. autofunction:: paddle.fluid.layers.topk - :noindex: - -dice_loss ----- - -.. autofunction:: paddle.fluid.layers.dice_loss - :noindex: - -resize_bilinear -____ - -.. autofunction:: paddle.fluid.layers.resize_bilinear - :noindex: - -gather -____ - -.. autofunction:: paddle.fluid.layers.gather - :noindex: - diff --git a/doc/fluid/api/optimizer.rst b/doc/fluid/api/optimizer.rst index df2bd2eace5..6ad44bb6905 100644 --- a/doc/fluid/api/optimizer.rst +++ b/doc/fluid/api/optimizer.rst @@ -47,28 +47,6 @@ DecayedAdagrad :members: :noindex: -Adadelta ------------------ - -.. autoclass:: paddle.fluid.optimizer.Adadelta - :members: - :noindex: - -RMSProp ------------------ - -.. autoclass:: paddle.fluid.optimizer.RMSProp - :members: - :noindex: - -ModelAverage ------------------ - -.. autoclass:: paddle.fluid.optimizer.ModelAverage - :members: - :noindex: - - SGDOptimizer ------------ @@ -111,25 +89,31 @@ DecayedAdagradOptimizer :members: :noindex: +RMSPropOptimizer +---------------- -AdadeltaOptimizer ------------------ - -.. autoclass:: paddle.fluid.optimizer.AdadeltaOptimizer +.. autoclass:: paddle.fluid.optimizer.RMSPropOptimizer :members: :noindex: +Adadelta +-------- -RMSPropOptimizer ------------------ +.. autoclass:: paddle.fluid.optimizer.Adadelta + :members: + :noindex: -.. autoclass:: paddle.fluid.optimizer.RMSPropOptimizer +ModelAverage +------------ + +.. autoclass:: paddle.fluid.optimizer.ModelAverage :members: :noindex: - + Optimizer --------- .. autoclass:: paddle.fluid.optimizer.Optimizer :members: :noindex: + diff --git a/doc/fluid/api/profiler.rst b/doc/fluid/api/profiler.rst index 74d102dcb0d..39fda658634 100644 --- a/doc/fluid/api/profiler.rst +++ b/doc/fluid/api/profiler.rst @@ -23,3 +23,15 @@ profiler .. autofunction:: paddle.fluid.profiler.profiler :noindex: +start_profiler +-------------- + +.. autofunction:: paddle.fluid.profiler.start_profiler + :noindex: + +stop_profiler +------------- + +.. autofunction:: paddle.fluid.profiler.stop_profiler + :noindex: + -- GitLab From 744cc412b779333f2869653d9c6d462fba3521eb Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 4 Jun 2018 14:11:25 +0800 Subject: [PATCH 0105/1416] fix a bug --- paddle/fluid/operators/reader/open_files_op.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index c0526e45f4d..2cbae8a90a9 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -27,7 +27,7 @@ class MultiFileReader : public framework::ReaderBase { const std::vector& dims, size_t thread_num, size_t buffer_size) : buffer_size_(buffer_size) { - readers_.resize(file_names.size()); + readers_.reserve(file_names.size()); for (const std::string& f_name : file_names) { readers_.emplace_back(CreateReaderByFileName(f_name, dims)); } -- GitLab From 6ac47a3d90c64f283fb4b5ab30acac46efb2fe91 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Mon, 4 Jun 2018 14:48:02 +0800 Subject: [PATCH 0106/1416] rename Mkldnn to MKLDNN --- .../fluid/operators/activation_mkldnn_op.cc | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/paddle/fluid/operators/activation_mkldnn_op.cc b/paddle/fluid/operators/activation_mkldnn_op.cc index b892ac77d9e..46ed99bcf22 100644 --- a/paddle/fluid/operators/activation_mkldnn_op.cc +++ b/paddle/fluid/operators/activation_mkldnn_op.cc @@ -222,35 +222,35 @@ struct MKLDNNActivationGradFunc : public BaseActivationFunctor { }; template -using ReluMkldnnFunctor = +using ReluMKLDNNFunctor = MKLDNNActivationFunc; template -using TanhMkldnnFunctor = +using TanhMKLDNNFunctor = MKLDNNActivationFunc; template -using SqrtMkldnnFunctor = +using SqrtMKLDNNFunctor = MKLDNNActivationFunc; template -using AbsMkldnnFunctor = +using AbsMKLDNNFunctor = MKLDNNActivationFunc; template -using ReluMkldnnGradFunctor = +using ReluMKLDNNGradFunctor = MKLDNNActivationGradFunc; template -using TanhMkldnnGradFunctor = +using TanhMKLDNNGradFunctor = MKLDNNActivationGradFunc; template -using SqrtMkldnnGradFunctor = +using SqrtMKLDNNGradFunctor = MKLDNNActivationGradFunc; template -using AbsMkldnnGradFunctor = +using AbsMKLDNNGradFunctor = MKLDNNActivationGradFunc; } // namespace operators } // namespace paddle @@ -265,9 +265,9 @@ namespace ops = paddle::operators; ops::MKLDNNActivationGradKernel>); #define FOR_EACH_MKLDNN_KERNEL_FUNCTOR(__macro) \ - __macro(relu, ReluMkldnnFunctor, ReluMkldnnGradFunctor); \ - __macro(tanh, TanhMkldnnFunctor, TanhMkldnnGradFunctor); \ - __macro(sqrt, SqrtMkldnnFunctor, SqrtMkldnnGradFunctor); \ - __macro(abs, AbsMkldnnFunctor, AbsMkldnnGradFunctor); + __macro(relu, ReluMKLDNNFunctor, ReluMKLDNNGradFunctor); \ + __macro(tanh, TanhMKLDNNFunctor, TanhMKLDNNGradFunctor); \ + __macro(sqrt, SqrtMKLDNNFunctor, SqrtMKLDNNGradFunctor); \ + __macro(abs, AbsMKLDNNFunctor, AbsMKLDNNGradFunctor); FOR_EACH_MKLDNN_KERNEL_FUNCTOR(REGISTER_ACTIVATION_MKLDNN_KERNEL); -- GitLab From 1666cf96bfed426be8debdefa9a8a561f5a8a13f Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 14:53:24 +0800 Subject: [PATCH 0107/1416] update by comment --- doc/fluid/howto/cluster/fluid_recordio.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/fluid/howto/cluster/fluid_recordio.md b/doc/fluid/howto/cluster/fluid_recordio.md index 0e8b98542d1..55ce63ec193 100644 --- a/doc/fluid/howto/cluster/fluid_recordio.md +++ b/doc/fluid/howto/cluster/fluid_recordio.md @@ -23,7 +23,10 @@ as follows: fluid.recordio_writer.convert_reader_to_recordio_file('./mnist.recordio', reader, feeder) ``` -The above codes would generate a RecordIO `./mnist.recordio` on your host. +The above code snippet would generate a RecordIO `./mnist.recordio` on your host. + +**NOTE**: we recommend users to set `batch_size=1` when generating the recordio files so that users can +adjust it flexibly while reading it. ## Use the RecordIO file in a Local Training Job @@ -96,7 +99,7 @@ The above codes would generate multiple RecordIO files on your host like: |-mnist-00004.recordio ``` -1. open multiple RecordIO files by `fluid.layers.io.open_files` +2. open multiple RecordIO files by `fluid.layers.io.open_files` For a distributed training job, the distributed operator system will schedule trainer process on multiple nodes, each trainer process reads parts of the whole training data, we usually take the following approach to make the training -- GitLab From c06f43bbb6aec4ae12d514ca92a77aed0d473882 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 4 Jun 2018 15:20:06 +0800 Subject: [PATCH 0108/1416] add annotation about _is_checkpoint_var --- python/paddle/fluid/io.py | 5 +++-- tools/codestyle/docstring_checker.pyc | Bin 12561 -> 12561 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 62e3046db64..75146fe3269 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -639,13 +639,14 @@ def _is_checkpoint_var(var): var.desc.type() == core.VarDesc.VarType.FETCH_LIST or \ var.desc.type() == core.VarDesc.VarType.RAW: return False - + # @GRAD are named for gradient varibales, checkpoint will not save it. if "@GRAD" in var.name: return False - + # .trainer_ are named for distribute trian variables, checkpoint will not save it. if ".trainer_" in var.name: return False + # .block is named for distribute trian variables, checkpoint will not save it. if ".block" in var.name: return False diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc index 1f0255b763c8d154b7cc17d2d525148dfea3b42d..a27d3c9a8cccab8552d510578debb2df04eb53bb 100644 GIT binary patch delta 16 XcmbQ3G%<;t`7|BNbF9rm> delta 16 XcmbQ3G%<;t`7|BNbF*pSi -- GitLab From 3526ac1136eb51decb567b4cd0230ac9bae5c244 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 4 Jun 2018 15:35:06 +0800 Subject: [PATCH 0109/1416] refine code --- paddle/fluid/operators/reader/open_files_op.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index 2cbae8a90a9..31e5d81e55e 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -63,9 +63,6 @@ void MultiFileReader::ReadNext(std::vector* out) { void MultiFileReader::ReInit() { EndScheduler(); - for (auto& reader : readers_) { - reader->ReInit(); - } StartNewScheduler(); } @@ -141,6 +138,7 @@ void MultiFileReader::PrefetchThreadFunc(size_t reader_idx, size_t thread_idx) { std::vector ins; reader->ReadNext(&ins); if (ins.empty()) { + reader->ReInit(); break; } try { -- GitLab From 08e5f0ae482c1e70dc74c4677e5cb699b38c433e Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 4 Jun 2018 16:10:11 +0800 Subject: [PATCH 0110/1416] rename need_load_checkpoint to get_latest_checkpoint_serial --- python/paddle/fluid/io.py | 4 ++-- python/paddle/fluid/trainer.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 75146fe3269..111907b5751 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -25,7 +25,7 @@ __all__ = [ 'load_persistables', 'save_inference_model', 'load_inference_model', 'get_inference_program', 'save_checkpoint', 'load_checkpoint', 'clean_checkpoint', 'load_persist_vars_without_grad', - 'save_persist_vars_without_grad' + 'save_persist_vars_without_grad', 'get_latest_checkpoint_serial' ] @@ -503,7 +503,7 @@ def save_checkpoint(executor, _lru_delete(checkpoint_dir, max_num_checkpoints) -def need_load_checkpoint(checkpoint_dir): +def get_latest_checkpoint_serial(checkpoint_dir): """ If the directory have checkpoint files, it will return lastest checkpoint directory serial number diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 72168886fdb..3c32ec1de8a 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -146,7 +146,7 @@ class Trainer(object): "The checkpoint_config shoule be an instance of CheckpointConfig" ) else: - self.checkpoint.load_serial = io.need_load_checkpoint( + self.checkpoint.load_serial = io.get_latest_checkpoint_serial( self.checkpoint.checkpoint_dir) self.scope = core.Scope() -- GitLab From 97b2f6f5f961575633b3ba0e8ea7b5c2fd5d4396 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 17:02:37 +0800 Subject: [PATCH 0111/1416] ignore pyc files --- tools/codestyle/.gitignore | 1 + tools/codestyle/docstring_checker.pyc | Bin 11769 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 tools/codestyle/.gitignore delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/tools/codestyle/.gitignore b/tools/codestyle/.gitignore new file mode 100644 index 00000000000..0d20b6487c6 --- /dev/null +++ b/tools/codestyle/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index 07e875aec6c9bae8002bde4223348c6a29647b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11769 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 QVT9NjS|84r2F9-c7hLv=%K!iX -- GitLab From 9d3114c8c99b46a90b76811b3a2b19b1c1e31919 Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Mon, 4 Jun 2018 18:42:44 +0800 Subject: [PATCH 0112/1416] fix transpiler error --- .../paddle/fluid/transpiler/distribute_transpiler.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index da001add8e1..27992df462f 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -187,12 +187,17 @@ class DistributeTranspiler: param_list = [] grad_list = [] + param_grad_set = set() for p, g in self.params_grads: # skip parameter marked not trainable if type(p) == Parameter and p.trainable == False: continue - param_list.append(p) - grad_list.append(g) + if p.name not in param_grad_set: + param_list.append(p) + param_grad_set.add(p.name) + if g.name not in param_grad_set: + grad_list.append(g) + param_grad_set.add(g.name) self._update_dist_lookup_table_vars(param_list, grad_list, self.params_grads) @@ -829,6 +834,9 @@ class DistributeTranspiler: if not block_map.has_key(varname): block_map[varname] = [] block_map[varname].append((long(offset), long(size))) + # Do not remove this important debug message: + print("block map: %s" % block_map) + for varname, splited in block_map.iteritems(): orig_var = program.global_block().var(varname) if len(splited) == 1: -- GitLab From 1766406f76ebf93f3ff1acc57c15019c4a2dacdd Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Mon, 4 Jun 2018 19:47:16 +0800 Subject: [PATCH 0113/1416] delete unused code --- paddle/fluid/operators/detail/grpc_server.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/paddle/fluid/operators/detail/grpc_server.h b/paddle/fluid/operators/detail/grpc_server.h index eae87de4201..e6ffc7066f2 100644 --- a/paddle/fluid/operators/detail/grpc_server.h +++ b/paddle/fluid/operators/detail/grpc_server.h @@ -71,8 +71,6 @@ class AsyncGRPCServer final : public RPCServer { std::unique_ptr<::grpc::Server> server_; // condition of the sub program - // std::mutex barrier_mutex_; - // mutable int barrier_cond_step_; std::condition_variable barrier_condition_; std::mutex mutex_ready_; -- GitLab From dcf40fd0bc5a7ed48e954feb591c63defd689f45 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Mon, 4 Jun 2018 20:39:34 +0800 Subject: [PATCH 0114/1416] refine benchmark --- benchmark/.gitignore | 3 +++ benchmark/fluid/fluid_benchmark.py | 31 ++++++++++++++++-------------- benchmark/fluid/run.sh | 20 ++++++++++--------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/benchmark/.gitignore b/benchmark/.gitignore index 7b66e8a5b50..fb4114356d4 100644 --- a/benchmark/.gitignore +++ b/benchmark/.gitignore @@ -7,3 +7,6 @@ paddle/rnn/imdb.pkl caffe/image/logs tensorflow/image/logs tensorflow/rnn/logs +fluid/models/*.pyc +fluid/logs +fluid/nohup.out diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index c1d458970a5..cac1b0fad00 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -40,10 +40,7 @@ def parse_args(): parser.add_argument( '--batch_size', type=int, default=32, help='The minibatch size.') parser.add_argument( - '--learning_rate', - type=float, - default=0.001, - help='The minibatch size.') + '--learning_rate', type=float, default=0.001, help='The learning rate.') # TODO(wuyi): add "--use_fake_data" option back. parser.add_argument( '--skip_batch_num', @@ -72,6 +69,11 @@ def parse_args(): type=int, default=1, help='If gpus > 1, will use ParallelExecutor to run, else use Executor.') + parser.add_argument( + '--cpus', + type=int, + default=1, + help='If cpus > 1, will use ParallelDo to run, else use Executor.') parser.add_argument( '--data_set', type=str, @@ -231,10 +233,7 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, train_losses.append(loss) print("Pass: %d, Iter: %d, Loss: %f\n" % (pass_id, iters, np.mean(train_losses))) - train_elapsed = time.time() - start_time - examples_per_sec = num_samples / train_elapsed - print('\nTotal examples: %d, total time: %.5f, %.5f examples/sec\n' % - (num_samples, train_elapsed, examples_per_sec)) + print_train_time(start_time, time.time(), num_samples) print("Pass: %d, Loss: %f" % (pass_id, np.mean(train_losses))) # evaluation if not args.no_test and batch_acc != None: @@ -315,10 +314,7 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, if batch_id % 1 == 0: print("Pass %d, batch %d, loss %s" % (pass_id, batch_id, np.array(loss))) - train_elapsed = time.time() - start_time - examples_per_sec = num_samples / train_elapsed - print('\nTotal examples: %d, total time: %.5f, %.5f examples/sed\n' % - (num_samples, train_elapsed, examples_per_sec)) + print_train_time(start_time, time.time(), num_samples) if not args.no_test and batch_acc != None: test_acc = test(startup_exe, infer_prog, test_reader, feeder, batch_acc) @@ -329,12 +325,19 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, def print_arguments(args): vars(args)['use_nvprof'] = (vars(args)['use_nvprof'] and vars(args)['device'] == 'GPU') - print('----------- resnet Configuration Arguments -----------') + print('----------- Configuration Arguments -----------') for arg, value in sorted(vars(args).iteritems()): print('%s: %s' % (arg, value)) print('------------------------------------------------') +def print_train_time(start_time, end_time, num_samples): + train_elapsed = end_time - start_time + examples_per_sec = num_samples / train_elapsed + print('\nTotal examples: %d, total time: %.5f, %.5f examples/sed\n' % + (num_samples, train_elapsed, examples_per_sec)) + + def main(): args = parse_args() print_arguments(args) @@ -342,7 +345,7 @@ def main(): # the unique trainer id, starting from 0, needed by trainer # only nccl_id_var, num_trainers, trainer_id = ( - None, 1, int(os.getenv("PADDLE_TRAINER_ID", "-1"))) + None, 1, int(os.getenv("PADDLE_TRAINER_ID", "0"))) if args.use_cprof: pr = cProfile.Profile() diff --git a/benchmark/fluid/run.sh b/benchmark/fluid/run.sh index afaab5f4de4..5d9b2db8713 100644 --- a/benchmark/fluid/run.sh +++ b/benchmark/fluid/run.sh @@ -2,6 +2,7 @@ # This script benchmarking the PaddlePaddle Fluid on # single thread single GPU. +mkdir -p logs #export FLAGS_fraction_of_gpu_memory_to_use=0.0 export CUDNN_PATH=/paddle/cudnn_v5 @@ -35,6 +36,7 @@ nohup stdbuf -oL nvidia-smi \ --format=csv \ --filename=mem.log \ -l 1 & + # mnist # mnist gpu mnist 128 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ @@ -43,7 +45,7 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=128 \ --skip_batch_num=5 \ --iterations=500 \ - 2>&1 | tee -a mnist_gpu_128.log + 2>&1 | tee -a logs/mnist_gpu_128.log # vgg16 # gpu cifar10 128 @@ -53,7 +55,7 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=128 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a vgg16_gpu_128.log + 2>&1 | tee -a logs/vgg16_gpu_128.log # flowers gpu 128 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ @@ -63,28 +65,28 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --data_set=flowers \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a vgg16_gpu_flowers_32.log + 2>&1 | tee -a logs/vgg16_gpu_flowers_32.log # resnet50 # resnet50 gpu cifar10 128 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ - --model=resnet50 \ + --model=resnet \ --device=GPU \ --batch_size=128 \ --data_set=cifar10 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a resnet50_gpu_128.log + 2>&1 | tee -a logs/resnet50_gpu_128.log # resnet50 gpu flowers 64 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ - --model=resnet50 \ + --model=resnet \ --device=GPU \ --batch_size=64 \ --data_set=flowers \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a resnet50_gpu_flowers_64.log + 2>&1 | tee -a logs/resnet50_gpu_flowers_64.log # lstm # lstm gpu imdb 32 # tensorflow only support batch=32 @@ -94,7 +96,7 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=32 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a lstm_gpu_32.log + 2>&1 | tee -a logs/lstm_gpu_32.log # seq2seq # seq2seq gpu wmb 128 @@ -104,4 +106,4 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=128 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a lstm_gpu_128.log + 2>&1 | tee -a logs/lstm_gpu_128.log -- GitLab From d58955997e946f1d2c91849a935917e2643f4374 Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Mon, 4 Jun 2018 20:50:22 +0800 Subject: [PATCH 0115/1416] fix term core only --- cmake/external/grpc.cmake | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake index 9459f1ddfe8..4b6840578fd 100644 --- a/cmake/external/grpc.cmake +++ b/cmake/external/grpc.cmake @@ -33,10 +33,18 @@ ELSE() SET(BUILD_CMD make HAS_SYSTEM_PROTOBUF=false -s -j ${NUM_OF_PROCESSOR} static grpc_cpp_plugin) ENDIF() +# FIXME(wuyi): do not build zlib cares protobuf twice, find a way to build grpc with them ExternalProject_Add( extern_grpc DEPENDS protobuf zlib - URL "http://paddlepaddledeps.bj.bcebos.com/grpc.tar.xz" + # NOTE(wuyi): + # this package is generated by following steps: + # 1. git clone -b v1.8.x https://github.com/grpc/grpc.git + # 2. submodule update --init + # 3. keep only zlib, cares, protobuf, boringssl under "third_party", + # checkout and clean other dirs under third_party + # 4. remove .git, and package the directory. + URL "http://paddlepaddledeps.bj.bcebos.com/grpc-v1.8.x.tar.gz" PREFIX ${GRPC_SOURCES_DIR} UPDATE_COMMAND "" CONFIGURE_COMMAND "" @@ -49,7 +57,6 @@ ExternalProject_Add( INSTALL_COMMAND make prefix=${GRPC_INSTALL_DIR} install ) -# FIXME(typhoonzero): hack to get static lib path, try a better way like merge them. ADD_LIBRARY(grpc++_unsecure STATIC IMPORTED GLOBAL) SET_PROPERTY(TARGET grpc++_unsecure PROPERTY IMPORTED_LOCATION "${GRPC_INSTALL_DIR}/lib/libgrpc++_unsecure.a") -- GitLab From bfdcf18707c79f2cc29b0903cb9f4fab2e907490 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 4 Jun 2018 21:10:38 +0800 Subject: [PATCH 0116/1416] grammar optimized. --- python/paddle/fluid/io.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 111907b5751..b5d96441bcf 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -492,7 +492,7 @@ def save_checkpoint(executor, if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) - serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 + serial = _get_latest_checkpoint_dir(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) save_trainer_args(cur_dir, trainer_id, trainer_args) @@ -505,11 +505,11 @@ def save_checkpoint(executor, def get_latest_checkpoint_serial(checkpoint_dir): """ - If the directory have checkpoint files, it will return lastest checkpoint directory serial number + If the directory have checkpoint files, it will return latest checkpoint directory serial number :param checkpoint_dir """ - serial = _get_lastest_checkpoint_dir(checkpoint_dir) + serial = _get_latest_checkpoint_dir(checkpoint_dir) if serial < 0: return None return serial @@ -639,14 +639,14 @@ def _is_checkpoint_var(var): var.desc.type() == core.VarDesc.VarType.FETCH_LIST or \ var.desc.type() == core.VarDesc.VarType.RAW: return False - # @GRAD are named for gradient varibales, checkpoint will not save it. + # @GRAD are named for gradient variables, checkpoint will not save it. if "@GRAD" in var.name: return False - # .trainer_ are named for distribute trian variables, checkpoint will not save it. + # .trainer_ are named for distribute train variables, checkpoint will not save it. if ".trainer_" in var.name: return False - # .block is named for distribute trian variables, checkpoint will not save it. + # .block is named for distribute train variables, checkpoint will not save it. if ".block" in var.name: return False @@ -656,7 +656,6 @@ def _is_checkpoint_var(var): def _get_dir_serial(dirname): _, serial = dirname.split(CHECKPOINT_SEPARATOR) - serial_num = -1 try: serial_num = int(serial) except ValueError: @@ -723,7 +722,7 @@ def _write_success(dirname): f.write(now) -def _get_lastest_checkpoint_dir(checkpoint_dir): +def _get_latest_checkpoint_dir(checkpoint_dir): """ get the latest file in checkpoint directory, the _SUCCESS file must exist in the directory -- GitLab From 418c41d8fb4a9dd0f221e7c3e3b94d5433493ded Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Mon, 4 Jun 2018 22:01:14 +0800 Subject: [PATCH 0117/1416] Feature/anakin embed (#11135) --- paddle/contrib/inference/CMakeLists.txt | 43 +++++++++- .../inference/demo/simple_on_word2vec.cc | 2 +- .../contrib/inference/paddle_inference_api.h | 27 +++--- .../paddle_inference_api_anakin_engine.cc | 82 +++++++++++++++++++ .../paddle_inference_api_anakin_engine.h | 51 ++++++++++++ ...ddle_inference_api_anakin_engine_tester.cc | 27 ++++++ .../inference/paddle_inference_api_impl.cc | 18 ++-- 7 files changed, 229 insertions(+), 21 deletions(-) create mode 100644 paddle/contrib/inference/paddle_inference_api_anakin_engine.cc create mode 100644 paddle/contrib/inference/paddle_inference_api_anakin_engine.h create mode 100644 paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index 8ca34465395..1e3bb7bf16f 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -17,6 +17,42 @@ if(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pessimizing-move") endif(APPLE) +set(ANAKIN_INCLUDE "" CACHE STRING "root of Anakin header files") +set(ANAKIN_LIBRARY "" CACHE STRING "path of Anakin library") + + +set(inference_deps paddle_inference_api paddle_fluid_api) + +# if anakin is set enable anakin api implementation +if(ANAKIN_INCLUDE_DIR AND ANAKIN_LIBRARY) + set(ANAKIN_FOUND ON) +else() + set(ANAKIN_FOUND OFF) +endif() + +if (ANAKIN_FOUND) + # Anakin's code style doesn't follow google c style. + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=comment + -Wno-error=reorder + -Wno-error=format + -Wno-error=switch + -Wno-error=return-type + -Wno-error=non-virtual-dtor + -Wno-error=cpp") + + message(STATUS "Anakin for inference is enabled") + message(STATUS "Anakin is set INCLUDE:${ANAKIN_INCLUDE} LIBRARY:${ANAKIN_LIBRARY}") + include_directories("${ANAKIN_INCLUDE}") + # Anakin's source path is a mass, need to set sub-directories trivially. + include_directories("${ANAKIN_INCLUDE}/saber") + link_directories("${ANAKIN_LIBRARY}") + + nv_library(inference_anakin_api SRCS paddle_inference_api_anakin_engine.cc) + target_link_libraries(inference_anakin_api anakin) + list(APPEND inference_deps inference_anakin_api) +endif() + + function(inference_api_test TARGET_NAME) if (WITH_TESTING) set(options "") @@ -27,7 +63,7 @@ function(inference_api_test TARGET_NAME) set(PYTHON_TESTS_DIR ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests) cc_test(${TARGET_NAME} SRCS ${TARGET_NAME}.cc - DEPS paddle_fluid paddle_inference_api + DEPS "${inference_deps}" ARGS --dirname=${PYTHON_TESTS_DIR}/book/) if(inference_test_ARGS) set_tests_properties(${TARGET_NAME} @@ -47,6 +83,11 @@ cc_test(test_paddle_inference_api inference_api_test(test_paddle_inference_api_impl ARGS test_word2vec test_image_classification) +if (ANAKIN_FOUND) + nv_test(inference_anakin_test SRCS paddle_inference_api_anakin_engine_tester.cc + DEPS ${inference_deps} protobuf) +endif() + if(WITH_TESTING) add_subdirectory(demo) endif() diff --git a/paddle/contrib/inference/demo/simple_on_word2vec.cc b/paddle/contrib/inference/demo/simple_on_word2vec.cc index 165d2e196b3..ee865f37900 100644 --- a/paddle/contrib/inference/demo/simple_on_word2vec.cc +++ b/paddle/contrib/inference/demo/simple_on_word2vec.cc @@ -54,7 +54,7 @@ void Main(bool use_gpu) { CHECK(predictor->Run(slots, &outputs)); //# 4. Get output. - ASSERT_EQ(outputs.size(), 1); + ASSERT_EQ(outputs.size(), 1UL); LOG(INFO) << "output buffer size: " << outputs.front().data.length; const size_t num_elements = outputs.front().data.length / sizeof(float); // The outputs' buffers are in CPU memory. diff --git a/paddle/contrib/inference/paddle_inference_api.h b/paddle/contrib/inference/paddle_inference_api.h index 5fe8399762b..b5cd0d603f1 100644 --- a/paddle/contrib/inference/paddle_inference_api.h +++ b/paddle/contrib/inference/paddle_inference_api.h @@ -1,16 +1,16 @@ /* Copyright (c) 2018 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 +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 +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. */ +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. */ /* * This file contains the definition of a simple Inference API for Paddle. @@ -47,8 +47,8 @@ struct PaddleTensor { enum class PaddleEngineKind { kNative = 0, // Use the native Fluid facility. + kAnakin, // Use Anakin for inference. // TODO(Superjomn) support following engines latter. - // kAnakin, // Use Anakin for inference. // kTensorRT, // Use TensorRT for inference. // kAutoMixedAnakin, // Automatically mix Fluid with Anakin. // kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. @@ -95,6 +95,13 @@ struct NativeConfig : public PaddlePredictor::Config { std::string param_file; }; +// Configurations for Anakin engine. +struct AnakinConfig : public PaddlePredictor::Config { + int device; + std::string model_file; + int max_batch_size{-1}; +}; + // A factory to help create different predictors. // // FOR EXTENSION DEVELOPER: diff --git a/paddle/contrib/inference/paddle_inference_api_anakin_engine.cc b/paddle/contrib/inference/paddle_inference_api_anakin_engine.cc new file mode 100644 index 00000000000..865d7ac10db --- /dev/null +++ b/paddle/contrib/inference/paddle_inference_api_anakin_engine.cc @@ -0,0 +1,82 @@ +// Copyright (c) 2018 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. + +#include + +#include "paddle/contrib/inference/paddle_inference_api_anakin_engine.h" + +namespace paddle { + +PaddleInferenceAnakinPredictor::PaddleInferenceAnakinPredictor( + const AnakinConfig &config) { + CHECK(Init(config)); +} + +bool PaddleInferenceAnakinPredictor::Init(const AnakinConfig &config) { + // TODO(Superjomn) Tell anakin to support return code. + engine_.Build(config.model_file, config.max_batch_size); + return true; +} + +bool PaddleInferenceAnakinPredictor::Run( + const std::vector &inputs, + std::vector *output_data) { + for (const auto &input : inputs) { + if (input.dtype != PaddleDType::FLOAT32) { + LOG(ERROR) << "Only support float type inputs. " << input.name + << "'s type is not float"; + return false; + } + engine_.SetInputFromCPU( + input.name, static_cast(input.data.data), input.data.length); + } + + // TODO(Superjomn) Tell anakin to support return code. + engine_.Execute(); + + if (output_data->empty()) { + LOG(ERROR) << "At least one output should be set with tensors' names."; + return false; + } + for (auto &output : *output_data) { + auto *tensor = engine_.GetOutputInGPU(output.name); + output.shape = tensor->shape(); + // Copy data from GPU -> CPU + if (cudaMemcpy(output.data.data, + tensor->data(), + tensor->size(), + cudaMemcpyDeviceToHost) != 0) { + LOG(ERROR) << "copy data from GPU to CPU error"; + return false; + } + } + return true; +} + +// TODO(Superjomn) To implement latter. +std::unique_ptr PaddleInferenceAnakinPredictor::Clone() { + return nullptr; +} + +// A factory to help create difference predictor. +template <> +std::unique_ptr +CreatePaddlePredictor( + const AnakinConfig &config) { + std::unique_ptr x( + new PaddleInferenceAnakinPredictor(config)); + return x; +}; + +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_anakin_engine.h b/paddle/contrib/inference/paddle_inference_api_anakin_engine.h new file mode 100644 index 00000000000..fe9f562e9d1 --- /dev/null +++ b/paddle/contrib/inference/paddle_inference_api_anakin_engine.h @@ -0,0 +1,51 @@ +/* Copyright (c) 2018 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. */ + +/* + * This file contains the implementation of inference API with Anakin engine + * embeded, this API can only support Anakin models. + */ + +#pragma once + +// NOTE This header file do not have namespace. +// TODO(Superjomn) Tell Anakin to provide better APIs. +#include +#include "paddle/contrib/inference/paddle_inference_api.h" + +namespace paddle { + +class PaddleInferenceAnakinPredictor : public PaddlePredictor { + public: + PaddleInferenceAnakinPredictor(const AnakinConfig& config); + + // NOTE Unlike the native engine, the buffers of anakin engine's output_data + // should be allocated first. + // TODO(Superjomn) should unify all the behaviors of output_data accross all + // the engines. + bool Run(const std::vector& inputs, + std::vector* output_data) override; + + std::unique_ptr Clone() override; + + private: + bool Init(const AnakinConfig& config); + + anakin::AnakinEngine + engine_; +}; + +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc b/paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc new file mode 100644 index 00000000000..43324bc67cb --- /dev/null +++ b/paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc @@ -0,0 +1,27 @@ +/* Copyright (c) 2018 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. */ + +#include "paddle/contrib/inference/paddle_inference_api.h" +#include + +namespace paddle { + +TEST(inference, anakin) { + AnakinConfig config; + + auto engine = + CreatePaddlePredictor(config); +} + +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index e7a8fa68b7f..b52a43a463d 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -1,16 +1,16 @@ /* Copyright (c) 2018 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 +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 +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. */ +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 -- GitLab From 79bda2c46d265f6d064d7e176535d1fdcbb055c6 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Mon, 4 Jun 2018 22:11:08 +0800 Subject: [PATCH 0118/1416] enable infer api with multi-threads --- .../contrib/inference/paddle_inference_api.h | 3 +- .../inference/paddle_inference_api_impl.cc | 41 +++++++++++-------- .../inference/paddle_inference_api_impl.h | 9 ++-- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api.h b/paddle/contrib/inference/paddle_inference_api.h index b5cd0d603f1..c4588cf0403 100644 --- a/paddle/contrib/inference/paddle_inference_api.h +++ b/paddle/contrib/inference/paddle_inference_api.h @@ -63,6 +63,7 @@ class PaddlePredictor { struct Config; PaddlePredictor() = default; PaddlePredictor(const PaddlePredictor&) = delete; + PaddlePredictor& operator=(const PaddlePredictor&) = delete; // Predict an record. // The caller should be responsible for allocating and releasing the memory of @@ -76,7 +77,7 @@ class PaddlePredictor { virtual std::unique_ptr Clone() = 0; // Destroy the Predictor. - virtual ~PaddlePredictor() {} + virtual ~PaddlePredictor() = default; // The common configs for all the predictors. struct Config { diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index b52a43a463d..2d710727e23 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -54,7 +54,7 @@ std::string num2str(T a) { } } // namespace -bool NativePaddlePredictor::Init() { +bool NativePaddlePredictor::Init(std::shared_ptr scope) { VLOG(3) << "Predictor::init()"; if (config_.use_gpu) { @@ -62,9 +62,15 @@ bool NativePaddlePredictor::Init() { } else { place_ = paddle::platform::CPUPlace(); } - paddle::framework::InitDevices(false); + if (scope) { + scope_ = scope; + sub_scope_ = &(scope->NewScope()); + } else { + paddle::framework::InitDevices(false); + scope_.reset(new paddle::framework::Scope()); + } + executor_.reset(new paddle::framework::Executor(place_)); - scope_.reset(new paddle::framework::Scope()); // Initialize the inference program if (!config_.model_dir.empty()) { @@ -83,13 +89,8 @@ bool NativePaddlePredictor::Init() { return false; } ctx_ = executor_->Prepare(*inference_program_, 0); - - // Create temporary variables first, so that the first batch do not need to - // create variables in the runtime. This is the logics of the old inference - // API. - // TODO(Superjomn) this should be modified when `Clone` is valid for - // multi-thread application. - executor_->CreateVariables(*inference_program_, scope_.get(), 0); + executor_->CreateVariables( + *inference_program_, sub_scope_ ? sub_scope_ : scope_.get(), 0); // Get the feed_target_names and fetch_target_names feed_target_names_ = inference_program_->GetFeedTargetNames(); @@ -97,6 +98,13 @@ bool NativePaddlePredictor::Init() { return true; } +NativePaddlePredictor::~NativePaddlePredictor() { + if (sub_scope_) { + PADDLE_ENFORCE_NOT_NULL(scope_, "Should have parent scope!"); + scope_->DeleteScope(sub_scope_); + } +}; + bool NativePaddlePredictor::Run(const std::vector &inputs, std::vector *output_data) { VLOG(3) << "Predictor::predict"; @@ -121,11 +129,12 @@ bool NativePaddlePredictor::Run(const std::vector &inputs, } // Run the inference program // if share variables, we need not create variables - executor_->RunPreparedContext(ctx_.get(), - scope_.get(), - &feed_targets, - &fetch_targets, - false /* don't create variable eatch time */); + executor_->RunPreparedContext( + ctx_.get(), + sub_scope_ != nullptr ? sub_scope_ : scope_.get(), + &feed_targets, + &fetch_targets, + false /* don't create variable eatch time */); if (!GetFetch(fetchs, output_data)) { LOG(ERROR) << "fail to get fetchs"; return false; @@ -138,7 +147,7 @@ std::unique_ptr NativePaddlePredictor::Clone() { VLOG(3) << "Predictor::clone"; std::unique_ptr cls(new NativePaddlePredictor(config_)); - if (!dynamic_cast(cls.get())->Init()) { + if (!dynamic_cast(cls.get())->Init(scope_)) { LOG(ERROR) << "fail to call Init"; return nullptr; } diff --git a/paddle/contrib/inference/paddle_inference_api_impl.h b/paddle/contrib/inference/paddle_inference_api_impl.h index 84707e223d7..dfb34a8631e 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.h +++ b/paddle/contrib/inference/paddle_inference_api_impl.h @@ -34,14 +34,15 @@ class NativePaddlePredictor : public PaddlePredictor { explicit NativePaddlePredictor(const NativeConfig &config) : config_(config) {} - bool Init(); + // will only create sub scope if have global scope + bool Init(std::shared_ptr scope = nullptr); bool Run(const std::vector &inputs, std::vector *output_data) override; std::unique_ptr Clone() override; - ~NativePaddlePredictor() override{}; + ~NativePaddlePredictor() override; private: bool SetFeed(const std::vector &input_datas, @@ -52,11 +53,13 @@ class NativePaddlePredictor : public PaddlePredictor { NativeConfig config_; platform::Place place_; std::unique_ptr executor_; - std::unique_ptr scope_; + std::shared_ptr scope_; std::unique_ptr ctx_; std::unique_ptr inference_program_; std::vector feed_target_names_; std::vector fetch_target_names_; + // Do not use unique_ptr, use parent scope to delete + framework::Scope *sub_scope_{nullptr}; }; } // namespace paddle -- GitLab From 4760f2851ef37186c836a1cf46fea87f5a806fb2 Mon Sep 17 00:00:00 2001 From: Yibing Liu Date: Mon, 4 Jun 2018 10:31:32 -0700 Subject: [PATCH 0119/1416] Add the argsort operator --- paddle/fluid/operators/argsort_op.cc | 83 ++++++++++++++++++ paddle/fluid/operators/argsort_op.h | 86 +++++++++++++++++++ .../fluid/tests/unittests/test_argsort_op.py | 49 +++++++++++ 3 files changed, 218 insertions(+) create mode 100644 paddle/fluid/operators/argsort_op.cc create mode 100644 paddle/fluid/operators/argsort_op.h create mode 100644 python/paddle/fluid/tests/unittests/test_argsort_op.py diff --git a/paddle/fluid/operators/argsort_op.cc b/paddle/fluid/operators/argsort_op.cc new file mode 100644 index 00000000000..aead4e2e00f --- /dev/null +++ b/paddle/fluid/operators/argsort_op.cc @@ -0,0 +1,83 @@ +/* Copyright (c) 2016 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. */ + +#include "paddle/fluid/operators/argsort_op.h" + +namespace paddle { +namespace operators { + +class ArgsortOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + + void InferShape(framework::InferShapeContext *ctx) const override { + PADDLE_ENFORCE(ctx->HasInput("X"), + "Input(X) of ArgsortOp should not be null."); + PADDLE_ENFORCE(ctx->HasOutput("Out"), + "Output(Out) of ArgsortOp should not be null."); + PADDLE_ENFORCE(ctx->HasOutput("Indices"), + "Output(Indices) of ArgsortOp should not be null."); + + auto in_dims = ctx->GetInputDim("X"); + int axis = static_cast(ctx->Attrs().Get("axis")); + + auto num_dims = in_dims.size(); + PADDLE_ENFORCE(axis < num_dims, + "Attr(axis) %d of ArgsortOp is out of bounds for Input(X) " + "dimension %d.", + axis, num_dims); + PADDLE_ENFORCE(axis >= 0 || axis == -1, + "Attr(axis) %d of ArgsortOp must be nonnegative or equal to " + "-1.", + axis); + + ctx->SetOutputDim("Out", in_dims); + ctx->SetOutputDim("Indices", in_dims); + ctx->ShareLoD("X", "Out"); + ctx->ShareLoD("X", "Indices"); + } +}; + +class ArgsortOpMaker : public framework::OpProtoAndCheckerMaker { + public: + void Make() override { + AddInput("X", "(Tensor) The input of Argsort op."); + AddOutput("Out", "(Tensor) The sorted tensor of Argsort op."); + AddOutput("Indices", + "(Tensor) The indices of a tensor giving the sorted order."); + AddComment(R"DOC( +Argsort operator + +Performs sorting on the input tensor along the given axis and outputs two +tensors, Output(Out) and Output(Indices). They reserve the same shape +with Input(X), and Output(Out) represents the sorted tensor while +Output(Indices) gives the sorted order along the given axis Attr(axis). + + )DOC"); + AddAttr("axis", + "(int, default -1) The axis along which to sort the tensor, " + "default -1, the last dimension.") + .SetDefault(-1); + } +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +REGISTER_OPERATOR(argsort, ops::ArgsortOp, ops::ArgsortOpMaker, + paddle::framework::EmptyGradOpMaker); +REGISTER_OP_CPU_KERNEL(argsort, + ops::ArgsortKernel, + ops::ArgsortKernel); diff --git a/paddle/fluid/operators/argsort_op.h b/paddle/fluid/operators/argsort_op.h new file mode 100644 index 00000000000..a9fe22c4ce1 --- /dev/null +++ b/paddle/fluid/operators/argsort_op.h @@ -0,0 +1,86 @@ +/* Copyright (c) 2016 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. */ + +#pragma once +#include +#include +#include +#include +#include "paddle/fluid/framework/eigen.h" +#include "paddle/fluid/framework/op_registry.h" + +namespace paddle { +namespace operators { + +using Tensor = framework::Tensor; + +template +using EigenMatrix = framework::EigenMatrix; + +template +class ArgsortKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override { + auto* input = ctx.Input("X"); + auto* output = ctx.Output("Out"); + auto* indices = ctx.Output("Indices"); + int axis = static_cast(ctx.Attr("axis")); + + auto in_dims = input->dims(); + axis = (axis == -1) ? (in_dims.size() - 1) : axis; + + const T* in_data = input->data(); + T* out_data = output->mutable_data(ctx.GetPlace()); + int64_t* idx_data = indices->mutable_data(ctx.GetPlace()); + + int64_t part_dims_prod = input->numel() / in_dims[axis]; + for (int64_t i = 0; i < part_dims_prod; ++i) { + int64_t idx = i; + std::vector idx_vec(in_dims.size(), 0); + for (int64_t dim = in_dims.size() - 1; dim >= 0; --dim) { + if (dim != axis) { + idx_vec[dim] = idx % in_dims[dim]; + idx /= in_dims[dim]; + } + } + std::vector> in_vec; + std::vector org_index_vec(in_dims[axis], 0); + for (int64_t j = 0; j < in_dims[axis]; ++j) { + idx_vec[axis] = j; + int64_t index = idx_vec[0]; + for (int64_t dim = 0; dim < in_dims.size() - 1; ++dim) { + index = index * in_dims[dim + 1] + idx_vec[dim + 1]; + } + in_vec.push_back(std::pair(in_data[index], j)); + org_index_vec[j] = index; + } + + std::sort( + in_vec.begin(), in_vec.end(), + [](const std::pair& v1, const std::pair& v2) { + return v1.first < v2.first; + }); + + for (size_t j = 0; j < org_index_vec.size(); ++j) { + int64_t index = org_index_vec[j]; + out_data[index] = in_vec[j].first; + idx_data[index] = in_vec[j].second; + } + } + } +}; + +} // namespace operators +} // namespace paddle diff --git a/python/paddle/fluid/tests/unittests/test_argsort_op.py b/python/paddle/fluid/tests/unittests/test_argsort_op.py new file mode 100644 index 00000000000..6995621ba8c --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_argsort_op.py @@ -0,0 +1,49 @@ +# Copyright (c) 2018 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. + +import unittest +import numpy as np +from op_test import OpTest + + +class TestArgsortOp(OpTest): + def setUp(self): + self.init_axis() + x = np.random.random((2, 3, 4, 5)).astype("float32") + self.indices = np.argsort(x, kind='quicksort', axis=self.axis) + self.out = np.sort(x, kind='quicksort', axis=self.axis) + self.op_type = "argsort" + self.inputs = {'X': x} + self.attrs = {'axis': self.axis} + self.outputs = {'Indices': self.indices, 'Out': self.out} + + def init_axis(self): + self.axis = -1 + + def test_check_output(self): + self.check_output() + + +class TestArgsortOpAxis0(TestArgsortOp): + def init_axis(self): + self.axis = 0 + + +class TestArgsortOpAxis1(TestArgsortOp): + def init_axis(self): + self.axis = 1 + + +if __name__ == "__main__": + unittest.main() -- GitLab From 71b6bdb5d4dc090f8746845bf7bba9f62415e9f3 Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Mon, 4 Jun 2018 13:15:05 -0700 Subject: [PATCH 0120/1416] Fix signed-unsigned comparison warning (#11167) --- paddle/fluid/operators/sgd_op.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/operators/sgd_op.h b/paddle/fluid/operators/sgd_op.h index f9e0596191d..2685ce217ee 100644 --- a/paddle/fluid/operators/sgd_op.h +++ b/paddle/fluid/operators/sgd_op.h @@ -114,7 +114,7 @@ class SGDOpKernel : public framework::OpKernel { int64_t id_index = param.Index(grad.rows()[i]); PADDLE_ENFORCE_GE(id_index, static_cast(0), "id should be in the table"); - for (size_t j = 0; j < grad_row_width; j++) { + for (int64_t j = 0; j < grad_row_width; j++) { out_data[id_index * grad_row_width + j] -= lr[0] * grad_data[i * grad_row_width + j]; } -- GitLab From 95ba67a30cfe7395d2ed2f1e8193a88a4569fb22 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Mon, 4 Jun 2018 14:28:47 -0700 Subject: [PATCH 0121/1416] Build: fix go package installation path. (#11166) --- paddle/scripts/paddle_build.sh | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/paddle/scripts/paddle_build.sh b/paddle/scripts/paddle_build.sh index 8eeea1805d8..113d02ce486 100755 --- a/paddle/scripts/paddle_build.sh +++ b/paddle/scripts/paddle_build.sh @@ -145,19 +145,17 @@ function check_style() { trap 'abort' 0 set -e - # install glide - curl https://glide.sh/get | bash - eval "$(GIMME_GO_VERSION=1.8.3 gimme)" + if [ -x "$(command -v gimme)" ]; then + eval "$(GIMME_GO_VERSION=1.8.3 gimme)" + fi # set up go environment for running gometalinter mkdir -p $GOPATH/src/github.com/PaddlePaddle/ ln -sf ${PADDLE_ROOT} $GOPATH/src/github.com/PaddlePaddle/Paddle - cd $GOPATH/src/github.com/PaddlePaddle/Paddle/go; glide install; cd - - - go get github.com/alecthomas/gometalinter - gometalinter --install + mkdir -p ./build/go + cp go/glide.* build/go + cd build/go; glide install; cd - - cd ${PADDLE_ROOT} export PATH=/usr/bin:$PATH pre-commit install clang-format --version -- GitLab From a4237171a5f647f5c841e61d5d61f2ff8f8e80f7 Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Mon, 4 Jun 2018 14:29:19 -0700 Subject: [PATCH 0122/1416] Modify optimizer in new API to support more usecases (#11168) * Modify optimizer in new API to support more usecase * Modify CMake to include only modified examples --- .../fluid/tests/book/high-level-api/CMakeLists.txt | 12 ++++++------ .../high-level-api/fit_a_line/test_fit_a_line.py | 8 +++++--- .../test_label_semantic_roles_newapi.py | 10 +++++++--- python/paddle/fluid/trainer.py | 13 +++++++------ 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt index efa5ee2d06a..07da382867e 100644 --- a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt +++ b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt @@ -7,10 +7,10 @@ foreach(src ${TEST_OPS}) endforeach() add_subdirectory(fit_a_line) -add_subdirectory(recognize_digits) -add_subdirectory(image_classification) -add_subdirectory(understand_sentiment) +#add_subdirectory(recognize_digits) +#add_subdirectory(image_classification) +#add_subdirectory(understand_sentiment) add_subdirectory(label_semantic_roles) -add_subdirectory(word2vec) -add_subdirectory(recommender_system) -add_subdirectory(machine_translation) +#add_subdirectory(word2vec) +#add_subdirectory(recommender_system) +#add_subdirectory(machine_translation) diff --git a/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py b/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py index de3906fc6a0..b3117cf2e5e 100644 --- a/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py +++ b/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py @@ -48,13 +48,15 @@ def linear(): return avg_loss +def optimizer_func(): + return fluid.optimizer.SGD(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() trainer = fluid.Trainer( - train_func=train_program, - place=place, - optimizer=fluid.optimizer.SGD(learning_rate=0.001)) + train_func=train_program, place=place, optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndStepEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py b/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py index 8cce398ff33..0ccb3a39e02 100755 --- a/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py +++ b/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py @@ -141,12 +141,16 @@ def train_program(): return [avg_cost] +def optimize_func(): + return fluid.optimizer.SGD(learning_rate=fluid.layers.exponential_decay( + learning_rate=0.01, decay_steps=100000, decay_rate=0.5, staircase=True)) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.SGD(learning_rate=0.01) trainer = fluid.Trainer( - train_func=train_program, place=place, optimizer=optimizer) + train_func=train_program, place=place, optimizer_func=optimize_func) feed_order = [ 'word_data', 'ctx_n2_data', 'ctx_n1_data', 'ctx_0_data', 'ctx_p1_data', @@ -245,7 +249,7 @@ def infer(use_cuda, inference_program, params_dirname): }, return_numpy=False) - print("infer results: ", np.array(results[0])) + print("infer results: ", np.array(results[0]).shape) def main(use_cuda): diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 7da123dd92e..cdacb419863 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -90,13 +90,13 @@ class Trainer(object): Args: train_func(callable): A function which will return loss. The loss must be a scalar. - optimizer(optimizer.Optimizer): The optimizer should be an instance of Optimizer + optimizer_func(callable): A function that returns an Optimizer object. place: The device place of this trainer. """ def __init__(self, train_func, - optimizer, + optimizer_func, param_path=None, place=None, parallel=False): @@ -105,8 +105,6 @@ class Trainer(object): # 1. we need to generate a framework.Program by calling # program_func. Reference: fluid.program_guard in # test_word2vec.py - if not isinstance(optimizer, opt_module.Optimizer): - raise TypeError("The optimizer should be an instance of Optimizer") self.scope = core.Scope() @@ -118,11 +116,14 @@ class Trainer(object): self.train_func_outputs = program_func_outs if isinstance( program_func_outs, list) else [program_func_outs] self.test_program = self.train_program.clone() + + # The fisrt element of program_func_outs is loss. + loss = self.train_func_outputs[0] + + optimizer = optimizer_func() if not isinstance(optimizer, opt_module.Optimizer): raise TypeError( "The optimizer should be an instance of Optimizer") - # The fisrt element of program_func_outs is loss. - loss = self.train_func_outputs[0] optimize_ops, params_grads = optimizer.minimize(loss) self.place = check_and_get_place(place) -- GitLab From f3d14c3bed9cc783fa6089819ddb54236e6e67f2 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Mon, 4 Jun 2018 15:04:21 -0700 Subject: [PATCH 0123/1416] Doc: fix android cross_compiling documents. (#11169) --- doc/mobile/cross_compiling_for_android_cn.md | 6 +++--- doc/mobile/cross_compiling_for_android_en.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/mobile/cross_compiling_for_android_cn.md b/doc/mobile/cross_compiling_for_android_cn.md index cdd69172393..0607748b751 100644 --- a/doc/mobile/cross_compiling_for_android_cn.md +++ b/doc/mobile/cross_compiling_for_android_cn.md @@ -63,16 +63,16 @@ Android的Docker开发镜像向用户提供两个可配置的参数: - 编译`armeabi-v7a`,`Android API 21`的PaddlePaddle库 ```bash -$ docker run -it --rm -v $PWD:/paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" username/paddle-android:dev +$ docker run -it --rm -v $PWD:/paddle -w /paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" username/paddle-android:dev ./paddle/scripts/paddle_build.sh build_android ``` - 编译`arm64-v8a`,`Android API 21`的PaddlePaddle库 ```bash -$ docker run -it --rm -v $PWD:/paddle -e "ANDROID_ABI=arm64-v8a" -e "ANDROID_API=21" username/paddle-android:dev +$ docker run -it --rm -v $PWD:/paddle -w /paddle -e "ANDROID_ABI=arm64-v8a" -e "ANDROID_API=21" username/paddle-android:dev ./paddle/scripts/paddle_build.sh build_android ``` -执行上述`docker run`命令时,容器默认执行[paddle/scripts/docker/build_android.sh](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build_android.sh)脚本。该脚本中记录了交叉编译Android版PaddlePaddle库常用的CMake配置,并且会根据`ANDROID_ABI`和`ANDROID_API`自动构建独立工具链、进行编译和安装。由于arm64架构要求Android API不小于21。因此当`ANDROID_ABI=arm64-v8a`,`ANDROID_API<21`时,Docker容器中将默认使用`Android API 21`的编译工具链。用户可以参考下文[配置交叉编译参数](#配置交叉编译参数)章节,根据个人的需求修改定制Docker容器所执行的脚本。编译安装结束之后,PaddlePaddle的C-API库将被安装到`$PWD/install_android`目录,所依赖的第三方库同时也被安装到`$PWD/install_android/third_party`目录。 +执行上述`docker run`命令时,容器执行[paddle/scripts/paddle_build.sh build_android](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/paddle_build.sh)脚本。该脚本中记录了交叉编译Android版PaddlePaddle库常用的CMake配置,并且会根据`ANDROID_ABI`和`ANDROID_API`自动构建独立工具链、进行编译和安装。由于arm64架构要求Android API不小于21。因此当`ANDROID_ABI=arm64-v8a`,`ANDROID_API<21`时,Docker容器中将默认使用`Android API 21`的编译工具链。用户可以参考下文[配置交叉编译参数](#配置交叉编译参数)章节,根据个人的需求修改定制Docker容器所执行的脚本。编译安装结束之后,PaddlePaddle的C-API库将被安装到`$PWD/install_android`目录,所依赖的第三方库同时也被安装到`$PWD/install_android/third_party`目录。 ## 基于Linux交叉编译环境的编译方式 本文档将以Linux x86-64平台为例,介绍交叉编译Android平台上适用的PaddlePaddle库的方法和步骤。 diff --git a/doc/mobile/cross_compiling_for_android_en.md b/doc/mobile/cross_compiling_for_android_en.md index 6af16fc114a..572063e8012 100644 --- a/doc/mobile/cross_compiling_for_android_en.md +++ b/doc/mobile/cross_compiling_for_android_en.md @@ -36,7 +36,7 @@ $ docker pull docker.paddlepaddlehub.com/paddle:latest-dev-android We can run the Docker image we just created to build the inference library of PaddlePaddle for Android using the command below: ```bash -$ docker run -it --rm -v $PWD:/paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" paddle:dev-android +$ docker run -it --rm -v $PWD:/paddle -w /paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" paddle:dev-android ./paddle/scripts/paddle_build.sh build_android ``` The Docker image accepts two arguments `ANDROID_ABI` and `ANDROID_API`: @@ -70,7 +70,7 @@ The Docker image accepts two arguments `ANDROID_ABI` and `ANDROID_API`: The ARM-64 architecture (`arm64-v8a`) requires at least level 21 of Android API. -The default entry-point of the Docker image, [`paddle/scripts/docker/build_android.sh`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build_android.sh) generates the [Android cross-compiling standalone toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html) based on the argument: `ANDROID_ABI` or `ANDROID_API`. For information about other configuration arguments, please continue reading. +The build command, [`paddle/scripts/paddle_build.sh build_android`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/paddle_build.sh) generates the [Android cross-compiling standalone toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html) based on the argument: `ANDROID_ABI` or `ANDROID_API`. For information about other configuration arguments, please continue reading. The above command generates and outputs the inference library in `$PWD/install_android` and puts third-party libraries in `$PWD/install_android/third_party`. -- GitLab From c9067bef99acf7b4903de86470437b39e55d4d53 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Mon, 4 Jun 2018 16:37:27 -0700 Subject: [PATCH 0124/1416] Doc: remove broken symbol links. (#11170) --- doc/fluid/howto/optimization/benchmark/README.md | 1 - doc/fluid/howto/optimization/benchmark/vgg16/README.md | 1 - 2 files changed, 2 deletions(-) delete mode 120000 doc/fluid/howto/optimization/benchmark/README.md delete mode 120000 doc/fluid/howto/optimization/benchmark/vgg16/README.md diff --git a/doc/fluid/howto/optimization/benchmark/README.md b/doc/fluid/howto/optimization/benchmark/README.md deleted file mode 120000 index db30af7f532..00000000000 --- a/doc/fluid/howto/optimization/benchmark/README.md +++ /dev/null @@ -1 +0,0 @@ -../../../../../benchmark/cluster/README.md \ No newline at end of file diff --git a/doc/fluid/howto/optimization/benchmark/vgg16/README.md b/doc/fluid/howto/optimization/benchmark/vgg16/README.md deleted file mode 120000 index ca963ef5f06..00000000000 --- a/doc/fluid/howto/optimization/benchmark/vgg16/README.md +++ /dev/null @@ -1 +0,0 @@ -../../../../../../benchmark/cluster/vgg16/README.md \ No newline at end of file -- GitLab From 99a5a3d8d3f1f2ab08b2e04828b812890bb29a73 Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Mon, 4 Jun 2018 17:17:57 -0700 Subject: [PATCH 0125/1416] Fix optimizer in remaining chapters with high level API (#11172) --- .../fluid/tests/book/high-level-api/CMakeLists.txt | 12 ++++++------ .../test_image_classification_resnet.py | 8 +++++--- .../test_image_classification_vgg.py | 8 +++++--- .../test_machine_translation.py | 14 +++++++++----- .../recognize_digits/test_recognize_digits_conv.py | 7 +++++-- .../recognize_digits/test_recognize_digits_mlp.py | 7 +++++-- .../test_recommender_system_newapi.py | 7 +++++-- .../test_understand_sentiment_conv.py | 7 +++++-- .../test_understand_sentiment_dynamic_rnn.py | 7 +++++-- .../test_understand_sentiment_stacked_lstm.py | 7 +++++-- .../word2vec/test_word2vec_new_api.py | 8 +++++--- 11 files changed, 60 insertions(+), 32 deletions(-) diff --git a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt index 07da382867e..efa5ee2d06a 100644 --- a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt +++ b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt @@ -7,10 +7,10 @@ foreach(src ${TEST_OPS}) endforeach() add_subdirectory(fit_a_line) -#add_subdirectory(recognize_digits) -#add_subdirectory(image_classification) -#add_subdirectory(understand_sentiment) +add_subdirectory(recognize_digits) +add_subdirectory(image_classification) +add_subdirectory(understand_sentiment) add_subdirectory(label_semantic_roles) -#add_subdirectory(word2vec) -#add_subdirectory(recommender_system) -#add_subdirectory(machine_translation) +add_subdirectory(word2vec) +add_subdirectory(recommender_system) +add_subdirectory(machine_translation) diff --git a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py index 63dc1b6ce30..2df3da9cca7 100644 --- a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py +++ b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py @@ -85,6 +85,10 @@ def train_network(): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): BATCH_SIZE = 128 EPOCH_NUM = 1 @@ -111,9 +115,7 @@ def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() trainer = fluid.Trainer( - train_func=train_program, - optimizer=fluid.optimizer.Adam(learning_rate=0.001), - place=place) + train_func=train_program, optimizer_func=optimizer_func, place=place) trainer.train( reader=train_reader, diff --git a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py index 0bf8f265a1c..224cca417e7 100644 --- a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py +++ b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py @@ -64,6 +64,10 @@ def train_network(): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): BATCH_SIZE = 128 train_reader = paddle.batch( @@ -88,9 +92,7 @@ def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() trainer = fluid.Trainer( - train_func=train_program, - place=place, - optimizer=fluid.optimizer.Adam(learning_rate=0.001)) + train_func=train_program, place=place, optimizer_func=optimizer_func) trainer.train( reader=train_reader, diff --git a/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py b/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py index d4b723d3e6b..c4b37df3a09 100644 --- a/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py +++ b/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py @@ -158,6 +158,13 @@ def train_program(is_sparse): return avg_cost +def optimizer_func(): + return fluid.optimizer.Adagrad( + learning_rate=1e-4, + regularization=fluid.regularizer.L2DecayRegularizer( + regularization_coeff=0.1)) + + def train(use_cuda, is_sparse, is_local=True): EPOCH_NUM = 1 @@ -182,11 +189,8 @@ def train(use_cuda, is_sparse, is_local=True): trainer = fluid.Trainer( train_func=partial(train_program, is_sparse), - optimizer=fluid.optimizer.Adagrad( - learning_rate=1e-4, - regularization=fluid.regularizer.L2DecayRegularizer( - regularization_coeff=0.1)), - place=place) + place=place, + optimizer_func=optimizer_func) trainer.train( reader=train_reader, diff --git a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py index 03439cbd376..9a09db25dc0 100644 --- a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py +++ b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py @@ -57,14 +57,17 @@ def train_program(): return [avg_cost, acc] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adam(learning_rate=0.001) trainer = fluid.Trainer( train_func=train_program, place=place, - optimizer=optimizer, + optimizer_func=optimizer_func, parallel=True) def event_handler(event): diff --git a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py index 89bbd21bea7..b2b544e791d 100644 --- a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py +++ b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py @@ -44,12 +44,15 @@ def train_program(): return [avg_cost, acc] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adam(learning_rate=0.001) trainer = fluid.Trainer( - train_func=train_program, place=place, optimizer=optimizer) + train_func=train_program, place=place, optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py b/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py index dfc7325acf2..090c11ce1e7 100644 --- a/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py +++ b/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py @@ -155,12 +155,15 @@ def train_program(): return [avg_cost, scale_infer] +def optimizer_func(): + return fluid.optimizer.SGD(learning_rate=0.2) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.SGD(learning_rate=0.2) trainer = fluid.Trainer( - train_func=train_program, place=place, optimizer=optimizer) + train_func=train_program, place=place, optimizer_func=optimizer_func) feed_order = [ 'user_id', 'gender_id', 'age_id', 'job_id', 'movie_id', 'category_id', diff --git a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py index 11e9fd1bec1..9b61f7a00ce 100644 --- a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py +++ b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py @@ -64,15 +64,18 @@ def train_program(word_dict): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adagrad(learning_rate=0.002) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adagrad(learning_rate=0.002) word_dict = paddle.dataset.imdb.word_dict() trainer = fluid.Trainer( train_func=partial(train_program, word_dict), place=place, - optimizer=optimizer) + optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py index 90757d54f99..aa7c567b4d6 100644 --- a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py +++ b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py @@ -79,15 +79,18 @@ def train_program(word_dict): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adagrad(learning_rate=0.002) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adagrad(learning_rate=0.002) word_dict = paddle.dataset.imdb.word_dict() trainer = fluid.Trainer( train_func=partial(train_program, word_dict), place=place, - optimizer=optimizer) + optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py index 52b7d4a8377..113dda88ca9 100644 --- a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py +++ b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py @@ -71,15 +71,18 @@ def train_program(word_dict): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adagrad(learning_rate=0.002) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adagrad(learning_rate=0.002) word_dict = paddle.dataset.imdb.word_dict() trainer = fluid.Trainer( train_func=partial(train_program, word_dict), place=place, - optimizer=optimizer) + optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py b/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py index eeb8e670873..ba44f72d9b0 100644 --- a/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py +++ b/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py @@ -80,6 +80,10 @@ def train_program(is_sparse): return avg_cost +def optimizer_func(): + return fluid.optimizer.SGD(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): train_reader = paddle.batch( paddle.dataset.imikolov.train(word_dict, N), BATCH_SIZE) @@ -104,9 +108,7 @@ def train(use_cuda, train_program, params_dirname): sys.exit("got NaN loss, training failed.") trainer = fluid.Trainer( - train_func=train_program, - optimizer=fluid.optimizer.SGD(learning_rate=0.001), - place=place) + train_func=train_program, optimizer_func=optimizer_func, place=place) trainer.train( reader=train_reader, -- GitLab From 5713a0bf5eef095ee2e1d6006add1574fca8de63 Mon Sep 17 00:00:00 2001 From: Kexin Zhao Date: Mon, 4 Jun 2018 17:46:12 -0700 Subject: [PATCH 0126/1416] fix lodtensor api in memory opt machine trans (#11171) --- .../test_memopt_machine_translation.py | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py b/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py index a1ca6d981fa..fa696acdfa9 100644 --- a/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py +++ b/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py @@ -80,21 +80,6 @@ def encoder_decoder(): return rnn() -def to_lodtensor(data, place): - seq_lens = [len(seq) for seq in data] - cur_len = 0 - lod = [cur_len] - for l in seq_lens: - cur_len += l - lod.append(cur_len) - flattened_data = np.concatenate(data, axis=0).astype("int64") - flattened_data = flattened_data.reshape([len(flattened_data), 1]) - res = core.LoDTensor() - res.set(flattened_data, place) - res.set_lod([lod]) - return res - - def main(): rnn_out = encoder_decoder() label = layers.data( @@ -122,18 +107,21 @@ def main(): exe.run(framework.default_startup_program()) + feed_order = [ + 'src_word_id', 'target_language_word', 'target_language_next_word' + ] + + feed_list = [ + fluid.default_main_program().global_block().var(var_name) + for var_name in feed_order + ] + feeder = fluid.DataFeeder(feed_list, place) + batch_id = 0 for pass_id in xrange(10): for data in train_data(): - word_data = to_lodtensor(map(lambda x: x[0], data), place) - trg_word = to_lodtensor(map(lambda x: x[1], data), place) - trg_word_next = to_lodtensor(map(lambda x: x[2], data), place) outs = exe.run(fluid.default_main_program(), - feed={ - 'src_word_id': word_data, - 'target_language_word': trg_word, - 'target_language_next_word': trg_word_next - }, + feed=feeder.feed(data), fetch_list=[avg_cost]) avg_cost_val = np.array(outs[0]) print('pass_id=' + str(pass_id) + ' batch=' + str(batch_id) + -- GitLab From c8d6c1d09c46457bbb68665108b3468de5a064fa Mon Sep 17 00:00:00 2001 From: whs Date: Tue, 5 Jun 2018 10:09:22 +0800 Subject: [PATCH 0127/1416] Auto generate python api for polygon_box_transform op. (#11074) * Auto generate python api for polygon_box_transform op. * Add unitest. --- python/paddle/fluid/layers/ops.py | 1 + python/paddle/fluid/tests/unittests/test_layers.py | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/python/paddle/fluid/layers/ops.py b/python/paddle/fluid/layers/ops.py index 60f8cbbfa71..69cfde852dd 100644 --- a/python/paddle/fluid/layers/ops.py +++ b/python/paddle/fluid/layers/ops.py @@ -71,6 +71,7 @@ __all__ = [ 'cumsum', 'scatter', 'sum', + 'polygon_box_transform', 'shape', ] + __activations__ diff --git a/python/paddle/fluid/tests/unittests/test_layers.py b/python/paddle/fluid/tests/unittests/test_layers.py index ca08fd7fc8e..621a450fa6a 100644 --- a/python/paddle/fluid/tests/unittests/test_layers.py +++ b/python/paddle/fluid/tests/unittests/test_layers.py @@ -379,6 +379,14 @@ class TestBook(unittest.TestCase): self.assertIsNotNone(output) print(str(program)) + def test_polygon_box_transform(self): + program = Program() + with program_guard(program): + x = layers.data(name='x', shape=[8, 4, 4], dtype="float32") + output = layers.polygon_box_transform(input=x) + self.assertIsNotNone(output) + print(str(program)) + if __name__ == '__main__': unittest.main() -- GitLab From 9d1dae3987abcef8a77f07e9e86e96de27b1cd46 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Tue, 5 Jun 2018 10:20:40 +0800 Subject: [PATCH 0128/1416] remove argument cpus, and will add in next PR --- benchmark/fluid/fluid_benchmark.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index cac1b0fad00..9d33a841cdd 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -69,11 +69,6 @@ def parse_args(): type=int, default=1, help='If gpus > 1, will use ParallelExecutor to run, else use Executor.') - parser.add_argument( - '--cpus', - type=int, - default=1, - help='If cpus > 1, will use ParallelDo to run, else use Executor.') parser.add_argument( '--data_set', type=str, -- GitLab From 02cc80b30d5b5d6152171427ed8be8c8f91616e6 Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Tue, 5 Jun 2018 10:33:20 +0800 Subject: [PATCH 0129/1416] Fix dangling pointer bug --- paddle/fluid/framework/executor.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/framework/executor.cc b/paddle/fluid/framework/executor.cc index 863053c32b1..3d68c5fb870 100644 --- a/paddle/fluid/framework/executor.cc +++ b/paddle/fluid/framework/executor.cc @@ -220,8 +220,10 @@ void Executor::Run(const ProgramDesc& program, Scope* scope, has_fetch_operators(program.Block(0), *fetch_targets, fetch_holder_name); ProgramDesc* copy_program = const_cast(&program); + std::unique_ptr unique_ptr_of_copy_program; if (!has_feed_ops || !has_fetch_ops) { - copy_program = std::unique_ptr(new ProgramDesc(program)).get(); + unique_ptr_of_copy_program.reset(new ProgramDesc(program)); + copy_program = unique_ptr_of_copy_program.get(); } auto* global_block = copy_program->MutableBlock(0); -- GitLab From 211b707b30929ebd8a1e3fb5fabfb848f0617095 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Tue, 5 Jun 2018 11:19:30 +0800 Subject: [PATCH 0130/1416] fix unknown gpu flag when cpu only --- paddle/contrib/inference/demo/simple_on_word2vec.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/paddle/contrib/inference/demo/simple_on_word2vec.cc b/paddle/contrib/inference/demo/simple_on_word2vec.cc index ee865f37900..9b4843f714f 100644 --- a/paddle/contrib/inference/demo/simple_on_word2vec.cc +++ b/paddle/contrib/inference/demo/simple_on_word2vec.cc @@ -65,7 +65,10 @@ void Main(bool use_gpu) { } TEST(demo, word2vec_cpu) { Main(false /*use_gpu*/); } + +#ifdef PADDLE_WITH_CUDA TEST(demo, word2vec_gpu) { Main(true /*use_gpu*/); } +#endif } // namespace demo } // namespace paddle -- GitLab From 2c2120c8a269080a883ad4b1eb8022d71f3d2cf8 Mon Sep 17 00:00:00 2001 From: Yibing Liu Date: Mon, 4 Jun 2018 20:25:25 -0700 Subject: [PATCH 0131/1416] Remove redundant code --- paddle/fluid/operators/argsort_op.h | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/operators/argsort_op.h b/paddle/fluid/operators/argsort_op.h index a9fe22c4ce1..51d2b89f94d 100644 --- a/paddle/fluid/operators/argsort_op.h +++ b/paddle/fluid/operators/argsort_op.h @@ -14,28 +14,20 @@ limitations under the License. */ #pragma once #include -#include #include #include -#include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" namespace paddle { namespace operators { -using Tensor = framework::Tensor; - -template -using EigenMatrix = framework::EigenMatrix; - template class ArgsortKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - auto* input = ctx.Input("X"); - auto* output = ctx.Output("Out"); - auto* indices = ctx.Output("Indices"); + auto* input = ctx.Input("X"); + auto* output = ctx.Output("Out"); + auto* indices = ctx.Output("Indices"); int axis = static_cast(ctx.Attr("axis")); auto in_dims = input->dims(); -- GitLab From 238124909e978b3e581c214859cf7aea5df57b31 Mon Sep 17 00:00:00 2001 From: Qiao Longfei Date: Tue, 5 Jun 2018 13:01:21 +0800 Subject: [PATCH 0132/1416] fix protobuf memory leak (#11177) fix protobuf memory leak --- paddle/fluid/framework/block_desc.cc | 28 ++++------------------------ paddle/fluid/framework/block_desc.h | 9 --------- 2 files changed, 4 insertions(+), 33 deletions(-) diff --git a/paddle/fluid/framework/block_desc.cc b/paddle/fluid/framework/block_desc.cc index e7842e9b813..f537e4b9e56 100644 --- a/paddle/fluid/framework/block_desc.cc +++ b/paddle/fluid/framework/block_desc.cc @@ -169,17 +169,13 @@ void BlockDesc::Flush() { } if (need_update_) { - auto &op_field = *this->desc_->mutable_ops(); - this->ClearPBOps(); - op_field.Reserve(static_cast(ops_.size())); + this->desc_->mutable_ops()->Clear(); for (auto &op_desc : ops_) { - op_field.AddAllocated(op_desc->Proto()); + this->desc_->mutable_ops()->Add()->CopyFrom(*op_desc->Proto()); } - auto &var_field = *this->desc_->mutable_vars(); - this->ClearPBVars(); - var_field.Reserve(static_cast(vars_.size())); + this->desc_->mutable_vars()->Clear(); for (auto &var_desc : vars_) { - var_field.AddAllocated(var_desc.second->Proto()); + this->desc_->mutable_vars()->Add()->CopyFrom(*var_desc.second->Proto()); } need_update_ = false; } @@ -217,22 +213,6 @@ BlockDesc::BlockDesc(const BlockDesc &other, proto::BlockDesc *desc, } } -void BlockDesc::ClearPBOps() { - auto ops = this->desc_->mutable_ops(); - while (!ops->empty()) { - // we do not own the OpDesc, so release the ownership. - ops->ReleaseLast(); - } -} - -void BlockDesc::ClearPBVars() { - auto vars = this->desc_->mutable_vars(); - while (!vars->empty()) { - // we do not own the VarDesc, so release the ownership. - vars->ReleaseLast(); - } -} - void BlockDesc::SetForwardBlockID(int32_t forward_block_id) { PADDLE_ENFORCE(!desc_->has_forward_block_idx(), "Parent block ID has been set to %d. Cannot set to %d", diff --git a/paddle/fluid/framework/block_desc.h b/paddle/fluid/framework/block_desc.h index 189dd6c52f8..ce485484184 100644 --- a/paddle/fluid/framework/block_desc.h +++ b/paddle/fluid/framework/block_desc.h @@ -41,11 +41,6 @@ class BlockDesc { BlockDesc(const BlockDesc &other, proto::BlockDesc *desc, ProgramDesc *prog); - ~BlockDesc() { - this->ClearPBVars(); - this->ClearPBOps(); - } - int32_t ID() const { return desc_->idx(); } int32_t Parent() const { return desc_->parent_idx(); } @@ -113,10 +108,6 @@ class BlockDesc { ProgramDesc *Program() const { return this->prog_; } - private: - void ClearPBOps(); - void ClearPBVars(); - private: ProgramDesc *prog_; // not_own proto::BlockDesc *desc_; // not_own -- GitLab From 9630aa0e525c9a60790b22b3dffe0b90e8bb02c2 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Tue, 5 Jun 2018 13:45:29 +0800 Subject: [PATCH 0133/1416] fix test error in fluid_benchmark.py --- benchmark/fluid/fluid_benchmark.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index 9d33a841cdd..8e6bfcbd301 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -85,8 +85,8 @@ def parse_args(): help='If set, use nvprof for CUDA.') parser.add_argument( '--no_test', - action='store_false', - help='If set, test the testset during training.') + action='store_true', + help='If set, do not test the testset during training.') parser.add_argument( '--memory_optimize', action='store_true', @@ -229,9 +229,9 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, print("Pass: %d, Iter: %d, Loss: %f\n" % (pass_id, iters, np.mean(train_losses))) print_train_time(start_time, time.time(), num_samples) - print("Pass: %d, Loss: %f" % (pass_id, np.mean(train_losses))) + print("Pass: %d, Loss: %f" % (pass_id, np.mean(train_losses))), # evaluation - if not args.no_test and batch_acc != None: + if not args.no_test and batch_acc: pass_test_acc = test(exe, infer_prog, test_reader, feeder, batch_acc) print(", Test Accuracy: %f" % pass_test_acc) @@ -310,7 +310,7 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, print("Pass %d, batch %d, loss %s" % (pass_id, batch_id, np.array(loss))) print_train_time(start_time, time.time(), num_samples) - if not args.no_test and batch_acc != None: + if not args.no_test and batch_acc: test_acc = test(startup_exe, infer_prog, test_reader, feeder, batch_acc) print("Pass: %d, Test Accuracy: %f\n" % (pass_id, test_acc)) -- GitLab From 36594017dd8d6654221c109c4637dd7189b176cf Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Tue, 5 Jun 2018 14:32:01 +0800 Subject: [PATCH 0134/1416] make infer init explicit --- paddle/contrib/inference/paddle_inference_api_impl.cc | 11 ++++++----- paddle/contrib/inference/paddle_inference_api_impl.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 2d710727e23..bda2981a144 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -54,7 +54,8 @@ std::string num2str(T a) { } } // namespace -bool NativePaddlePredictor::Init(std::shared_ptr scope) { +bool NativePaddlePredictor::Init( + std::shared_ptr parent_scope) { VLOG(3) << "Predictor::init()"; if (config_.use_gpu) { @@ -62,9 +63,9 @@ bool NativePaddlePredictor::Init(std::shared_ptr scope) { } else { place_ = paddle::platform::CPUPlace(); } - if (scope) { - scope_ = scope; - sub_scope_ = &(scope->NewScope()); + if (parent_scope) { + scope_ = parent_scope; + sub_scope_ = &(parent_scope->NewScope()); } else { paddle::framework::InitDevices(false); scope_.reset(new paddle::framework::Scope()); @@ -275,7 +276,7 @@ CreatePaddlePredictor( } std::unique_ptr predictor(new NativePaddlePredictor(config)); - if (!dynamic_cast(predictor.get())->Init()) { + if (!dynamic_cast(predictor.get())->Init(nullptr)) { return nullptr; } return std::move(predictor); diff --git a/paddle/contrib/inference/paddle_inference_api_impl.h b/paddle/contrib/inference/paddle_inference_api_impl.h index dfb34a8631e..86d1db7bcc7 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.h +++ b/paddle/contrib/inference/paddle_inference_api_impl.h @@ -35,7 +35,7 @@ class NativePaddlePredictor : public PaddlePredictor { : config_(config) {} // will only create sub scope if have global scope - bool Init(std::shared_ptr scope = nullptr); + bool Init(std::shared_ptr parent_scope); bool Run(const std::vector &inputs, std::vector *output_data) override; -- GitLab From 9735f25011b04116d271861fde8df05def81c3ce Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 5 Jun 2018 14:47:13 +0800 Subject: [PATCH 0135/1416] optimized --- python/paddle/fluid/io.py | 44 +++++++++++++--------------------- python/paddle/fluid/trainer.py | 8 +++---- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index b5d96441bcf..5abadc73f76 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -492,7 +492,7 @@ def save_checkpoint(executor, if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) - serial = _get_latest_checkpoint_dir(checkpoint_dir) + 1 + serial = get_latest_checkpoint_serial(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) save_trainer_args(cur_dir, trainer_id, trainer_args) @@ -503,18 +503,6 @@ def save_checkpoint(executor, _lru_delete(checkpoint_dir, max_num_checkpoints) -def get_latest_checkpoint_serial(checkpoint_dir): - """ - If the directory have checkpoint files, it will return latest checkpoint directory serial number - - :param checkpoint_dir - """ - serial = _get_latest_checkpoint_dir(checkpoint_dir) - if serial < 0: - return None - return serial - - def load_checkpoint(executor, checkpoint_dir, serial, main_program): """ Load checkpoint from a directory by executor, @@ -527,17 +515,16 @@ def load_checkpoint(executor, checkpoint_dir, serial, main_program): """ if checkpoint_dir is None: - raise ValueError( - "The values of 'checkpoint_dir' or 'serial' should not be None") + raise ValueError("The values of 'checkpoint_dir' should not be None") if serial is None or serial < 0: raise ValueError("The values of 'serial' should not be None or <0 ") if main_program is None: - raise ValueError("The values of 'main_program'should not be None") + raise ValueError('main_program should not be None.') cur_dir = _get_serial_dir(checkpoint_dir, serial) - load_persist_vars_without_grad(executor, cur_dir, main_program) + load_persist_vars_without_grad(executor, cur_dir, main_program, True) def clean_checkpoint(checkpoint_dir, delete_dir=False): @@ -557,18 +544,21 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): os.rmdir(checkpoint_dir) -def load_persist_vars_without_grad(executor, dirname, program, nest=True): +def load_persist_vars_without_grad(executor, + dirname, + program, + has_model_dir=False): """ load_persist_vars_without_grad will load variables from a directory by an executor, the variable named end with "@GRAD" will not be loaded. - :param executor - :param dirname - :param program - :param nest + :param executor executor for load the value + :param dirname the checkpoint directory + :param program will load all variables in program + :param has_model_dir if has_model_dir is True, will load variables from sub directory named __model__ """ - if nest: + if has_model_dir: dirname = _get_model_dir(dirname) load_vars( @@ -584,9 +574,9 @@ def save_persist_vars_without_grad(executor, dirname, program): save_persist_vars_without_grad will save variables to a directory by an executor, the variable named end with "@GRAD" will not be saved. - :param executor - :param dirname - :param program + :param executor executor for load the value + :param dirname the checkpoint directory + :param program will load all variables in program """ cur_dir = _get_model_dir(dirname) save_vars( @@ -722,7 +712,7 @@ def _write_success(dirname): f.write(now) -def _get_latest_checkpoint_dir(checkpoint_dir): +def get_latest_checkpoint_serial(checkpoint_dir): """ get the latest file in checkpoint directory, the _SUCCESS file must exist in the directory diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 3c32ec1de8a..fbdd28f53ef 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -146,8 +146,9 @@ class Trainer(object): "The checkpoint_config shoule be an instance of CheckpointConfig" ) else: - self.checkpoint.load_serial = io.get_latest_checkpoint_serial( + serial = io.get_latest_checkpoint_serial( self.checkpoint.checkpoint_dir) + self.checkpoint.load_serial = serial if serial >= 0 else None self.scope = core.Scope() @@ -194,10 +195,7 @@ class Trainer(object): if param_path and os.path.isdir(param_path): # load params from param_path into scope io.load_persist_vars_without_grad( - exe, - dirname=param_path, - program=self.startup_program, - nest=False) + exe, dirname=param_path, program=self.startup_program) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS -- GitLab From be16af3b04b3052e35e6d9157cec302274a629a4 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 5 Jun 2018 14:48:15 +0800 Subject: [PATCH 0136/1416] delete pyc --- tools/codestyle/docstring_checker.pyc | Bin 12561 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index a27d3c9a8cccab8552d510578debb2df04eb53bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12561 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 -- GitLab From d74838bda08f4331eba4d84c70e5cdbbf3a32868 Mon Sep 17 00:00:00 2001 From: whs Date: Tue, 5 Jun 2018 15:22:30 +0800 Subject: [PATCH 0137/1416] Prune dims supported by reduce op. (#11113) --- paddle/fluid/operators/reduce_op.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/paddle/fluid/operators/reduce_op.h b/paddle/fluid/operators/reduce_op.h index cd19cc1460a..7df47f316c3 100644 --- a/paddle/fluid/operators/reduce_op.h +++ b/paddle/fluid/operators/reduce_op.h @@ -135,15 +135,16 @@ class ReduceKernel : public framework::OpKernel { } else { int ndim = context.Input("X")->dims().size(); int rdim = context.Attr>("dim").size(); - HANDLE_DIM(6, 5); - HANDLE_DIM(6, 4); - HANDLE_DIM(6, 3); - HANDLE_DIM(6, 2); - HANDLE_DIM(6, 1); - HANDLE_DIM(5, 4); - HANDLE_DIM(5, 3); - HANDLE_DIM(5, 2); - HANDLE_DIM(5, 1); + // comments for accelerating compiling temporarily. + // HANDLE_DIM(6, 5); + // HANDLE_DIM(6, 4); + // HANDLE_DIM(6, 3); + // HANDLE_DIM(6, 2); + // HANDLE_DIM(6, 1); + // HANDLE_DIM(5, 4); + // HANDLE_DIM(5, 3); + // HANDLE_DIM(5, 2); + // HANDLE_DIM(5, 1); HANDLE_DIM(4, 3); HANDLE_DIM(4, 2); HANDLE_DIM(4, 1); -- GitLab From 2e0d851685402e4e9d1835824f956326e9f2b0fd Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Tue, 5 Jun 2018 15:39:49 +0800 Subject: [PATCH 0138/1416] update readme --- benchmark/fluid/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/benchmark/fluid/README.md b/benchmark/fluid/README.md index c17cab999b5..48280a5621b 100644 --- a/benchmark/fluid/README.md +++ b/benchmark/fluid/README.md @@ -45,10 +45,11 @@ Currently supported `--model` argument include: ## Prepare the RecordIO file to Achieve Better Performance Run the following command will generate RecordIO files like "mnist.recordio" under the path -and batch_size you choose: +and batch_size you choose, you can use batch_size=1 so that later reader can change the batch_size +at any time using `fluid.batch`. ```bash -python -c 'from recordio_converter import *; prepare_mnist("data", 32)' +python -c 'from recordio_converter import *; prepare_mnist("data", 1)' ``` ## Run Distributed Benchmark on Kubernetes Cluster -- GitLab From e896926b9c3c8bed544f92ad82d42daac9fac0c0 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 5 Jun 2018 15:42:29 +0800 Subject: [PATCH 0139/1416] add unit test for dist mnist --- .../fluid/tests/unittests/CMakeLists.txt | 1 + .../fluid/tests/unittests/test_dist_mnist.py | 208 ++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 python/paddle/fluid/tests/unittests/test_dist_mnist.py diff --git a/python/paddle/fluid/tests/unittests/CMakeLists.txt b/python/paddle/fluid/tests/unittests/CMakeLists.txt index c33539f6b50..2f2e9c96c1b 100644 --- a/python/paddle/fluid/tests/unittests/CMakeLists.txt +++ b/python/paddle/fluid/tests/unittests/CMakeLists.txt @@ -52,3 +52,4 @@ py_test_modules(test_dist_train MODULES test_dist_train SERIAL) # since load cudnn libraries, so we use a longer timeout to make this # unit test stability. set_tests_properties(test_listen_and_serv_op PROPERTIES TIMEOUT 30) +set_tests_properties(test_dist_mnist PROPERTIES TIMEOUT 60) diff --git a/python/paddle/fluid/tests/unittests/test_dist_mnist.py b/python/paddle/fluid/tests/unittests/test_dist_mnist.py new file mode 100644 index 00000000000..e6bc56cce10 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_dist_mnist.py @@ -0,0 +1,208 @@ +# Copyright (c) 2018 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. + +import numpy as np +import argparse +import time + +import paddle +import paddle.fluid as fluid +import paddle.fluid.profiler as profiler +from paddle.fluid import core +import unittest +from multiprocessing import Process +import os +import signal + +SEED = 1 +DTYPE = "float32" + + +# random seed must set before configuring the network. +# fluid.default_startup_program().random_seed = SEED +def cnn_model(data): + conv_pool_1 = fluid.nets.simple_img_conv_pool( + input=data, + filter_size=5, + num_filters=20, + pool_size=2, + pool_stride=2, + act="relu") + conv_pool_2 = fluid.nets.simple_img_conv_pool( + input=conv_pool_1, + filter_size=5, + num_filters=50, + pool_size=2, + pool_stride=2, + act="relu") + + # TODO(dzhwinter) : refine the initializer and random seed settting + SIZE = 10 + input_shape = conv_pool_2.shape + param_shape = [reduce(lambda a, b: a * b, input_shape[1:], 1)] + [SIZE] + scale = (2.0 / (param_shape[0]**2 * SIZE))**0.5 + + predict = fluid.layers.fc( + input=conv_pool_2, + size=SIZE, + act="softmax", + param_attr=fluid.param_attr.ParamAttr( + initializer=fluid.initializer.NormalInitializer( + loc=0.0, scale=scale))) + return predict + + +def get_model(batch_size): + # Input data + images = fluid.layers.data(name='pixel', shape=[1, 28, 28], dtype=DTYPE) + label = fluid.layers.data(name='label', shape=[1], dtype='int64') + + # Train program + predict = cnn_model(images) + cost = fluid.layers.cross_entropy(input=predict, label=label) + avg_cost = fluid.layers.mean(x=cost) + + # Evaluator + batch_size_tensor = fluid.layers.create_tensor(dtype='int64') + batch_acc = fluid.layers.accuracy( + input=predict, label=label, total=batch_size_tensor) + + inference_program = fluid.default_main_program().clone() + # Optimization + opt = fluid.optimizer.AdamOptimizer( + learning_rate=0.001, beta1=0.9, beta2=0.999) + + # Reader + train_reader = paddle.batch( + paddle.dataset.mnist.train(), batch_size=batch_size) + test_reader = paddle.batch( + paddle.dataset.mnist.test(), batch_size=batch_size) + opt.minimize(avg_cost) + return inference_program, avg_cost, train_reader, test_reader, batch_acc, predict + + +def get_transpiler(trainer_id, main_program, pserver_endpoints, trainers): + t = fluid.DistributeTranspiler() + t.transpile( + trainer_id=trainer_id, + program=main_program, + pservers=pserver_endpoints, + trainers=trainers) + return t + + +def run_pserver(pserver_endpoints, trainers, current_endpoint): + get_model(batch_size=20) + t = get_transpiler(0, + fluid.default_main_program(), pserver_endpoints, + trainers) + pserver_prog = t.get_pserver_program(current_endpoint) + startup_prog = t.get_startup_program(current_endpoint, pserver_prog) + + place = fluid.CPUPlace() + exe = fluid.Executor(place) + exe.run(startup_prog) + + exe.run(pserver_prog) + + +class TestDistMnist(unittest.TestCase): + def setUp(self): + self._trainers = 1 + self._pservers = 1 + self._ps_endpoints = "127.0.0.1:9123" + + def start_pserver(self, endpoint): + p = Process( + target=run_pserver, + args=(self._ps_endpoints, self._trainers, endpoint)) + p.start() + return p.pid + + def _wait_ps_ready(self, pid): + retry_times = 5 + while True: + assert retry_times >= 0, "wait ps ready failed" + time.sleep(1) + try: + # the listen_and_serv_op would touch a file which contains the listen port + # on the /tmp directory until it was ready to process all the RPC call. + os.stat("/tmp/paddle.%d.port" % pid) + return + except os.error: + retry_times -= 1 + + def stop_pserver(self, pid): + os.kill(pid, signal.SIGTERM) + + def test_with_place(self): + p = fluid.CUDAPlace() if core.is_compiled_with_cuda( + ) else fluid.CPUPlace() + + pserver_pid = self.start_pserver(self._ps_endpoints) + self._wait_ps_ready(pserver_pid) + + self.run_trainer(p, 0) + + self.stop_pserver(pserver_pid) + + def run_trainer(self, place, trainer_id): + test_program, avg_cost, train_reader, test_reader, batch_acc, predict = get_model( + batch_size=20) + t = get_transpiler(trainer_id, + fluid.default_main_program(), self._ps_endpoints, + self._trainers) + + trainer_prog = t.get_trainer_program() + + exe = fluid.Executor(place) + exe.run(fluid.default_startup_program()) + + feed_var_list = [ + var for var in trainer_prog.global_block().vars.itervalues() + if var.is_data + ] + + feeder = fluid.DataFeeder(feed_var_list, place) + for pass_id in xrange(10): + for batch_id, data in enumerate(train_reader()): + exe.run(trainer_prog, feed=feeder.feed(data)) + + if (batch_id + 1) % 10 == 0: + acc_set = [] + avg_loss_set = [] + for test_data in test_reader(): + acc_np, avg_loss_np = exe.run( + program=test_program, + feed=feeder.feed(test_data), + fetch_list=[batch_acc, avg_cost]) + acc_set.append(float(acc_np)) + avg_loss_set.append(float(avg_loss_np)) + # get test acc and loss + acc_val = np.array(acc_set).mean() + avg_loss_val = np.array(avg_loss_set).mean() + if float(acc_val + ) > 0.2: # Smaller value to increase CI speed + return + else: + print( + 'PassID {0:1}, BatchID {1:04}, Test Loss {2:2.2}, Acc {3:2.2}'. + format(pass_id, batch_id + 1, + float(avg_loss_val), float(acc_val))) + if math.isnan(float(avg_loss_val)): + assert ("got Nan loss, training failed.") + + +if __name__ == "__main__": + unittest.main() -- GitLab From bd2ea0e1f84bb6522a66d44a072598153634cade Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 5 Jun 2018 15:48:25 +0800 Subject: [PATCH 0140/1416] add host_memory_profiling_cn.md --- .../optimization/host_memory_profiling_cn.md | 89 ++++++++++++++++++ .../optimization/memory_cpu_allocator.jpg | Bin 0 -> 77570 bytes .../optimization/memory_cpu_allocator.pdf | Bin 0 -> 26831 bytes .../optimization/memory_leak_protobuf.pdf | Bin 0 -> 40244 bytes .../optimization/memory_program_desc.png | Bin 0 -> 30768 bytes .../optimization/memory_protobuf_arena.png | Bin 0 -> 32597 bytes 6 files changed, 89 insertions(+) create mode 100644 doc/fluid/howto/optimization/host_memory_profiling_cn.md create mode 100644 doc/fluid/howto/optimization/memory_cpu_allocator.jpg create mode 100644 doc/fluid/howto/optimization/memory_cpu_allocator.pdf create mode 100644 doc/fluid/howto/optimization/memory_leak_protobuf.pdf create mode 100644 doc/fluid/howto/optimization/memory_program_desc.png create mode 100644 doc/fluid/howto/optimization/memory_protobuf_arena.png diff --git a/doc/fluid/howto/optimization/host_memory_profiling_cn.md b/doc/fluid/howto/optimization/host_memory_profiling_cn.md new file mode 100644 index 00000000000..464368ec028 --- /dev/null +++ b/doc/fluid/howto/optimization/host_memory_profiling_cn.md @@ -0,0 +1,89 @@ +## 堆内存分析和优化 + +计算机程序都可能有内存泄露的风险。**内存泄露**一般是由于程序在堆(heap)上分配了内存而没有释放,随着程序的运行占用的内存越来越大,一方面会影响程序的稳定性,可能让运行速度越来越慢,或者造成oom,甚至会影响运行程序的机器的稳定性,造成宕机。 + + +目前有很多内存泄露分析工具,比较经典的有[valgrind](http://valgrind.org/docs/manual/quick-start.html#quick-start.intro), [gperftools](https://gperftools.github.io/gperftools/)。 + +因为Fluid是用Python驱动C++ core来运行,valgrind直接分析非常困难,需要自己编译debug版本的、带valgrind支持的专用版本,而且输出的信息中大部分是Python自己的符号和调用信息,分析起来很困难,所以不建议使用。 + +本教程主要介绍[gperftools](https://gperftools.github.io/gperftools/)的使用。 + +gperftool主要支持以下四个功能: + +- thread-caching malloc +- heap-checking using tcmalloc +- heap-profiling using tcmalloc +- CPU profiler + +Paddle也提供了基于gperftool的[CPU性能分析教程](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/fluid/howto/optimization/cpu_profiling_cn.md)。 + +对于堆内存的分析,主要用到thread-caching malloc和heap-profiling using tcmalloc。 + +## 使用流程 +#### 环境 +本教程基于paddle提供的Docker开发环境paddlepaddle/paddle:latest-dev,基于Ubuntu 16.04.4 LTS环境。 + +#### 使用流程 + +- 安装google-perftools + +``` +apt-get install libunwind-dev +apt-get install google-perftools +``` + +- 安装pprof + +``` +go get -u github.com/google/pprof +``` + +- 设置运行环境 + +``` +export PPROF_PATH=/root/gopath/bin/pprof +export PPROF_BINARY_PATH=/root/gopath/bin/pprof +export LD_PRELOAD=/usr/lib/libtcmalloc.so.4 +``` + +- 使用heap profile来运行python程序。本质上是周期性的对堆的分配情况做一次快照。 + +``` +# HEAPPROFILE 设置生成的堆分析文件的目录和文件前缀 +# HEAP_PROFILE_ALLOCATION_INTERVAL 设置每分配多少存储dump一次dump,默认1GB +env HEAPPROFILE="./perf_log/test.log" HEAP_PROFILE_ALLOCATION_INTERVAL=209715200 python trainer.py +``` + +随着程序的运行,会在perf_log这个文件夹下生成很多文件,如下: + +``` +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0001.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0002.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0003.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0004.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0005.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0006.heap +``` + +- 使用pprof对heap文件进行分析。分析有两种模式: + - 完整模式。会对当前heap做一个分析,显示目前分配内存一些调用路径。 + + ``` + pprof --pdf python test.log.0012.heap + ``` + 上述命令会生成一个profile00x.pdf的文件,可以直接打开,例如:[allocator](./memory_cpu_allocator.pdf)。从下图可以看出,在CPU版本fluid的运行过程中,分配存储最多的模块式CPUAllocator. 而别的模块相对而言分配内存较少,所以被忽略了,这对于分配内存泄露是很不方便的,因为泄露是一个缓慢的过程,在这种图中是无法看到的。 + + ![result](memory_cpu_allocator.jpg) + + - Diff模式。可以对两个时刻的heap做diff,把一些内存分配没有发生变化的模块去掉,而把增量部分显示出来。 + ``` + pprof --pdf --base test.log.0010.heap python test.log.1045.heap + ``` + 生成的结果为:[`memory_leak_protobuf`](./memory_leak_protobuf.pdf) + + 从图中可以看出:ProgramDesc这个结构,在两个版本之间增长了200MB+,所以这里有很大的内存泄露的可能性,最终结果也确实证明是这里造成了泄露。 + + ![result](memory_program_desc.png) + ![result](memory_protobuf_arena.png) + diff --git a/doc/fluid/howto/optimization/memory_cpu_allocator.jpg b/doc/fluid/howto/optimization/memory_cpu_allocator.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29658b596b8ee77dcfd85faa0479ebdd063a183b GIT binary patch literal 77570 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⁡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

=~Sx7i67%0`{sQ#2Ny=_GIQ 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 j#_B&|1pN6Y{Od;Dzv46bes*(ceW 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 literal 0 HcmV?d00001 diff --git a/doc/fluid/howto/optimization/memory_leak_protobuf.pdf b/doc/fluid/howto/optimization/memory_leak_protobuf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40a8090ba22108666a9076aa72d9f6af90a4d484 GIT binary patch literal 40244 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