From 4ee1c9e60d278a5172c18549bfebbbe533fdfade Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Mon, 19 Mar 2018 19:07:57 -0700 Subject: [PATCH 001/164] "add sequence expand kernel" --- paddle/fluid/operators/sequence_expand_op.cu | 52 +++++++++++++++++++ paddle/fluid/operators/sequence_expand_op.h | 53 +++++++++++++------- 2 files changed, 86 insertions(+), 19 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 26622d23af..6477af89f1 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -15,6 +15,58 @@ limitations under the License. */ #define EIGEN_USE_GPU #include "paddle/fluid/operators/sequence_expand_op.h" +namespace paddle { +namespace operators { + +using LoDTensor = framework::LoDTensor; + +template +__global__ sequence_expand_kernel(const T* x_data, T* out_data, size_t* lod, + size_t element_len) { + int BLOCK_SIZE = 1024; + __shared__ T shm_lod[BLOCK_SIZE]; + for (int idx = threadIdx.x; idx < BLOCK_SIZE; ++idx) { + shm_lod[idx] = lod[idx]; + } + for (int idx = threadIdx.x + blockIdx.x * blockDim.x; idx < lod.size(); + idx += blockDim.x * gridDim.x) { + int scale = lod[i] + } +} + +template +void SequenceExpandFunctor::operator()( + const platform::CPUDeviceContext& context, const LoDTensor& x, + LoDTensor* out) { + x_dims = x.dims(); + size_t element_len = framework::product(x_dims) / x_dims[0]; + T* out_data = out->mutable_data(context.GetPlace()); + auto out_starts = out->lod().back(); + + const int kThreadsPerBlock = 1024; + int block_cols = kThreadsPerBlock; + if (out_cols < kThreadsPerBlock) { // block_cols is aligned by 32. + block_cols = ((out_cols + 31) >> 5) << 5; + } + int block_rows = kThreadsPerBlock / block_cols; + dim3 block_size = dim3(block_cols, block_rows, 1); + + int max_threads = context.GetMaxPhysicalThreadCount(); + int max_blocks = std::max(max_threads / kThreadsPerBlock, 1); + + int grid_cols = + std::min((out_cols + block_cols - 1) / block_cols, max_blocks); + int grid_rows = + std::min(max_blocks / grid_cols, std::max(out_rows / block_rows, 1)); + dim3 grid_size = dim3(grid_cols, grid_rows, 1); + sequence_expand_kernel<<>>( + x.data(), out->mutable_data(context.GetPlace()), + out_starts.CUDAData(context.GetPlace()), element_len); +} + +} // namespace operators +} // namespace paddle + namespace ops = paddle::operators; REGISTER_OP_CUDA_KERNEL( sequence_expand, diff --git a/paddle/fluid/operators/sequence_expand_op.h b/paddle/fluid/operators/sequence_expand_op.h index 76dde976db..12e4018b95 100644 --- a/paddle/fluid/operators/sequence_expand_op.h +++ b/paddle/fluid/operators/sequence_expand_op.h @@ -16,13 +16,44 @@ limitations under the License. */ #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/memory/memcpy.h" -#include "unsupported/Eigen/CXX11/Tensor" +#include "paddle/fluid/platform/device_context.h" namespace paddle { namespace operators { using LoDTensor = framework::LoDTensor; +template +struct SequenceExpandFunctor { + void operator()(const DeviceContext& ctx, const LoDTensor& x, LoDTensor* out); +}; + +// template +// struct SequenceExpandGradFunctor {}; + +template +void SequenceExpandFunctor::operator()( + const platform::CPUDeviceContext& context, const LoDTensor& x, + LoDTensor* out) { + x_dims = x.dims(); + size_t element_len = framework::product(x_dims) / x_dims[0]; + T* out_data = out->mutable_data(context.GetPlace()); + auto out_starts = out->lod().back(); + + for (size_t i = 0; i < out_starts.size() - 1; i++) { + int scale = out_starts[i + 1] - out_starts[i]; + Eigen::TensorMap< + Eigen::Tensor> + x_t(x_data, 1, element_len); + Eigen::TensorMap> + out_t(out_data, scale, element_len); + Eigen::array cast({{scale, 1}}); + out_t.device(*context.eigen_device()) = x_t.broadcast(cast); + x_data += element_len; + out_data += element_len * scale; + } +} + template class SequenceExpandKernel : public framework::OpKernel { public: @@ -38,24 +69,8 @@ class SequenceExpandKernel : public framework::OpKernel { "The size of last lod level in Input(Y)" "must be equal to dims[0] of Input(X)."); out->set_lod(y->lod()); - auto* place = - context.template device_context().eigen_device(); - size_t element_len = framework::product(x_dims) / x_dims[0]; - T* out_data = out->mutable_data(context.GetPlace()); - auto out_starts = out->lod().back(); - - for (size_t i = 0; i < out_starts.size() - 1; i++) { - int scale = out_starts[i + 1] - out_starts[i]; - Eigen::TensorMap< - Eigen::Tensor> - x_t(x_data, 1, element_len); - Eigen::TensorMap> - out_t(out_data, scale, element_len); - Eigen::array cast({{scale, 1}}); - out_t.device(*place) = x_t.broadcast(cast); - x_data += element_len; - out_data += element_len * scale; - } + SequenceExpandFunctor functor; + functor(context.template device_context(), *x, out); } }; From 26822bd774a99d19d5bb37f4890e82aacd57c391 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Tue, 20 Mar 2018 04:04:58 -0700 Subject: [PATCH 002/164] "add sequence kernel" --- paddle/fluid/operators/sequence_expand_op.cu | 107 +++++++++++++------ paddle/fluid/operators/sequence_expand_op.h | 86 ++++++++------- 2 files changed, 123 insertions(+), 70 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 6477af89f1..9cdb89f8fd 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -21,48 +21,89 @@ namespace operators { using LoDTensor = framework::LoDTensor; template -__global__ sequence_expand_kernel(const T* x_data, T* out_data, size_t* lod, - size_t element_len) { - int BLOCK_SIZE = 1024; - __shared__ T shm_lod[BLOCK_SIZE]; - for (int idx = threadIdx.x; idx < BLOCK_SIZE; ++idx) { - shm_lod[idx] = lod[idx]; +__global__ void sequence_expand_kernel(const T* x_data, T* out_data, + const size_t* lod, size_t lod_size, + size_t element_len) { + int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + for (; tid_x < static_cast(lod_size - 1); + tid_x += blockDim.x * gridDim.x) { + int scale = lod[tid_x + 1] - lod[tid_x]; + int tid_y = blockIdx.y * blockDim.y + threadIdx.y; + for (; tid_y < scale; tid_y += blockDim.y * gridDim.y) { + int tid_z = blockIdx.z * blockDim.z + threadIdx.z; + int item_start = tid_x / element_len; + for (; tid_z < element_len; tid_z += blockDim.z * gridDim.z) { + out_data[item_start * scale + tid_z] = x_data[item_start + tid_z]; + } + } } - for (int idx = threadIdx.x + blockIdx.x * blockDim.x; idx < lod.size(); - idx += blockDim.x * gridDim.x) { - int scale = lod[i] +} + +template +__global__ void sequence_expand_grad_kernel(const T* dout_data, T* dx_data, + const size_t* lod, size_t lod_size, + size_t element_len, + size_t dout_size) { + extern __shared__ T shm[]; + int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + for (; tid_x < static_cast(lod_size - 1); + tid_x += blockDim.x * gridDim.x) { + int scale = lod[tid_x + 1] - lod[tid_x]; + int tid_y = blockIdx.y * blockDim.y + threadIdx.y; + for (; tid_y < scale; tid_y += blockDim.y * gridDim.y) { + int tid_z = blockIdx.z * blockDim.z + threadIdx.z; + int item_start = tid_x / element_len; + for (; tid_z < element_len; tid_z += blockDim.z * gridDim.z) { + shm[item_start + tid_z] += doutx_data[item_start * scale + tid_z]; + } + } + } + // synchronize before write to dx + __syncthreads(); + for (int idx = blockDimx * blockIdx.x + threadIdx.x; + idx < static_cast(dout_size); idx += blockDim.x * gridDim.x) { + dx_data[idx] = shm[idx;] } } template -void SequenceExpandFunctor::operator()( - const platform::CPUDeviceContext& context, const LoDTensor& x, - LoDTensor* out) { - x_dims = x.dims(); - size_t element_len = framework::product(x_dims) / x_dims[0]; - T* out_data = out->mutable_data(context.GetPlace()); - auto out_starts = out->lod().back(); +struct SequenceExpandFunctor { + void operator()(const platform::CUDADeviceContext& context, + const LoDTensor& x, LoDTensor* out) { + auto x_dims = x.dims(); + size_t element_len = framework::product(x_dims) / x_dims[0]; + T* out_data = out->mutable_data(context.GetPlace()); + auto out_starts = out->lod().back(); - const int kThreadsPerBlock = 1024; - int block_cols = kThreadsPerBlock; - if (out_cols < kThreadsPerBlock) { // block_cols is aligned by 32. - block_cols = ((out_cols + 31) >> 5) << 5; + dim3 block_size(16, 32, element_len); + dim3 grid_size(10, 10); + sequence_expand_kernel<<>>( + x.data(), out->mutable_data(context.GetPlace()), + out_starts.CUDAData(context.GetPlace()), out_starts.size(), + element_len); } - int block_rows = kThreadsPerBlock / block_cols; - dim3 block_size = dim3(block_cols, block_rows, 1); +}; - int max_threads = context.GetMaxPhysicalThreadCount(); - int max_blocks = std::max(max_threads / kThreadsPerBlock, 1); +template +struct SequenceExpandGradFunctor { + void operator()(const platform::CUDADeviceContext& ctx, const LoDTensor& x, + const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx) { + auto x_dims = x.dims(); + size_t element_len = framework::product(x_dims) / x_dims[0]; + const T* x_data = x->data(); + T* out_data = out->mutable_data(context.GetPlace()); + auto out_starts = out->lod().back(); - int grid_cols = - std::min((out_cols + block_cols - 1) / block_cols, max_blocks); - int grid_rows = - std::min(max_blocks / grid_cols, std::max(out_rows / block_rows, 1)); - dim3 grid_size = dim3(grid_cols, grid_rows, 1); - sequence_expand_kernel<<>>( - x.data(), out->mutable_data(context.GetPlace()), - out_starts.CUDAData(context.GetPlace()), element_len); -} + dim3 block_size(16, 32, element_len); + dim3 grid_size(10, 10); + size_t out_size = framework::product(dx->dims()); + sequence_expand_kernel<<>>( + dout.data(), dx->mutable_data(context.GetPlace()), + out_starts.CUDAData(context.GetPlace()), out_starts.size(), element_len, + out_size); + } +}; } // namespace operators } // namespace paddle diff --git a/paddle/fluid/operators/sequence_expand_op.h b/paddle/fluid/operators/sequence_expand_op.h index 12e4018b95..3b66bf3d8c 100644 --- a/paddle/fluid/operators/sequence_expand_op.h +++ b/paddle/fluid/operators/sequence_expand_op.h @@ -28,31 +28,36 @@ struct SequenceExpandFunctor { void operator()(const DeviceContext& ctx, const LoDTensor& x, LoDTensor* out); }; -// template -// struct SequenceExpandGradFunctor {}; +template +struct SequenceExpandGradFunctor { + void operator()(const DeviceContext& ctx, const LoDTensor& x, + const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx); +}; template -void SequenceExpandFunctor::operator()( - const platform::CPUDeviceContext& context, const LoDTensor& x, - LoDTensor* out) { - x_dims = x.dims(); - size_t element_len = framework::product(x_dims) / x_dims[0]; - T* out_data = out->mutable_data(context.GetPlace()); - auto out_starts = out->lod().back(); +struct SequenceExpandFunctor { + void operator()(const platform::CPUDeviceContext& context, const LoDTensor& x, + LoDTensor* out) { + auto x_dims = x.dims(); + size_t element_len = framework::product(x_dims) / x_dims[0]; + const T* x_data = x->data(); + T* out_data = out->mutable_data(context.GetPlace()); + auto out_starts = out->lod().back(); - for (size_t i = 0; i < out_starts.size() - 1; i++) { - int scale = out_starts[i + 1] - out_starts[i]; - Eigen::TensorMap< - Eigen::Tensor> - x_t(x_data, 1, element_len); - Eigen::TensorMap> - out_t(out_data, scale, element_len); - Eigen::array cast({{scale, 1}}); - out_t.device(*context.eigen_device()) = x_t.broadcast(cast); - x_data += element_len; - out_data += element_len * scale; + for (size_t i = 0; i < out_starts.size() - 1; i++) { + int scale = out_starts[i + 1] - out_starts[i]; + Eigen::TensorMap< + Eigen::Tensor> + x_t(x_data, 1, element_len); + Eigen::TensorMap> + out_t(out_data, scale, element_len); + Eigen::array cast({{scale, 1}}); + out_t.device(*context.eigen_device()) = x_t.broadcast(cast); + x_data += element_len; + out_data += element_len * scale; + } } -} +}; template class SequenceExpandKernel : public framework::OpKernel { @@ -60,7 +65,6 @@ class SequenceExpandKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& context) const override { auto* x = context.Input("X"); auto* out = context.Output("Out"); - const T* x_data = x->data(); auto x_dims = x->dims(); auto* y = context.Input("Y"); PADDLE_ENFORCE(!y->lod().empty(), "y should have lod"); @@ -86,19 +90,14 @@ class SequenceExpandKernel : public framework::OpKernel { * Grad(X).lod = Input(X).lod * * */ -template -class SequenceExpandGradKernel : public framework::OpKernel { - public: - void Compute(const framework::ExecutionContext& context) const override { - auto* d_out = context.Input(framework::GradVarName("Out")); - auto* x = context.Input("X"); - auto* out = context.Input("Out"); - auto* d_x = context.Output(framework::GradVarName("X")); - auto out_last_level = out->lod().back(); - d_x->set_lod(x->lod()); - const T* d_out_data = d_out->data(); +template +struct SequenceExpandGradFunctor { + void operator()(const platform::CPUDeviceContext& ctx, const LoDTensor& x, + const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx) { + auto out_last_level = out.lod().back(); + const T* d_out_data = d_out.data(); T* d_x_data = d_x->mutable_data(context.GetPlace()); - size_t element_len = d_out->numel() / d_out->dims()[0]; + size_t element_len = d_out.numel() / d_out.dims()[0]; for (size_t i = 0; i < out_last_level.size() - 1; ++i) { size_t repeat = out_last_level[i + 1] - out_last_level[i]; Eigen::TensorMap< @@ -106,14 +105,27 @@ class SequenceExpandGradKernel : public framework::OpKernel { d_out_t(d_out_data, static_cast(repeat), element_len); Eigen::TensorMap> d_x_t(d_x_data, static_cast(element_len)); - auto place = - context.template device_context().eigen_device(); - d_x_t.device(*place) = d_out_t.sum(Eigen::array({{0}})); + d_x_t.device(*context.eigen_device()) = + d_out_t.sum(Eigen::array({{0}})); d_out_data += (repeat * element_len); d_x_data += element_len; } } }; +template +class SequenceExpandGradKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& context) const override { + auto* d_out = context.Input(framework::GradVarName("Out")); + auto* x = context.Input("X"); + auto* out = context.Input("Out"); + auto* d_x = context.Output(framework::GradVarName("X")); + d_x->set_lod(x->lod()); + SequenceExpandGradFunctor(context.template device_context(), *x, *out, + d_out, d_x); + } +}; + } // namespace operators } // namespace paddle From e4c35d837d79c4b1a4f30e42efe143f64ec10e71 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Tue, 20 Mar 2018 04:43:00 -0700 Subject: [PATCH 003/164] "add details" --- paddle/fluid/operators/sequence_expand_op.cu | 19 +++++++++---------- paddle/fluid/operators/sequence_expand_op.h | 18 ++++++++++-------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 9cdb89f8fd..cae0a69284 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -54,15 +54,15 @@ __global__ void sequence_expand_grad_kernel(const T* dout_data, T* dx_data, int tid_z = blockIdx.z * blockDim.z + threadIdx.z; int item_start = tid_x / element_len; for (; tid_z < element_len; tid_z += blockDim.z * gridDim.z) { - shm[item_start + tid_z] += doutx_data[item_start * scale + tid_z]; + shm[item_start + tid_z] += dout_data[item_start * scale + tid_z]; } } } // synchronize before write to dx __syncthreads(); - for (int idx = blockDimx * blockIdx.x + threadIdx.x; + for (int idx = blockDim.x * blockIdx.x + threadIdx.x; idx < static_cast(dout_size); idx += blockDim.x * gridDim.x) { - dx_data[idx] = shm[idx;] + dx_data[idx] = shm[idx]; } } @@ -86,19 +86,18 @@ struct SequenceExpandFunctor { template struct SequenceExpandGradFunctor { - void operator()(const platform::CUDADeviceContext& ctx, const LoDTensor& x, - const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx) { + void operator()(const platform::CUDADeviceContext& context, + const LoDTensor& x, const LoDTensor& out, + const LoDTensor& dout, LoDTensor* dx) { auto x_dims = x.dims(); size_t element_len = framework::product(x_dims) / x_dims[0]; - const T* x_data = x->data(); - T* out_data = out->mutable_data(context.GetPlace()); - auto out_starts = out->lod().back(); + auto out_starts = out.lod().back(); dim3 block_size(16, 32, element_len); dim3 grid_size(10, 10); size_t out_size = framework::product(dx->dims()); - sequence_expand_kernel<<>>( + sequence_expand_grad_kernel<<>>( dout.data(), dx->mutable_data(context.GetPlace()), out_starts.CUDAData(context.GetPlace()), out_starts.size(), element_len, out_size); diff --git a/paddle/fluid/operators/sequence_expand_op.h b/paddle/fluid/operators/sequence_expand_op.h index 3b66bf3d8c..11890b30ae 100644 --- a/paddle/fluid/operators/sequence_expand_op.h +++ b/paddle/fluid/operators/sequence_expand_op.h @@ -40,7 +40,7 @@ struct SequenceExpandFunctor { LoDTensor* out) { auto x_dims = x.dims(); size_t element_len = framework::product(x_dims) / x_dims[0]; - const T* x_data = x->data(); + const T* x_data = x.data(); T* out_data = out->mutable_data(context.GetPlace()); auto out_starts = out->lod().back(); @@ -92,12 +92,12 @@ class SequenceExpandKernel : public framework::OpKernel { * */ template struct SequenceExpandGradFunctor { - void operator()(const platform::CPUDeviceContext& ctx, const LoDTensor& x, + void operator()(const platform::CPUDeviceContext& context, const LoDTensor& x, const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx) { auto out_last_level = out.lod().back(); - const T* d_out_data = d_out.data(); - T* d_x_data = d_x->mutable_data(context.GetPlace()); - size_t element_len = d_out.numel() / d_out.dims()[0]; + const T* d_out_data = dout.data(); + T* d_x_data = dx->mutable_data(context.GetPlace()); + size_t element_len = dout.numel() / dout.dims()[0]; for (size_t i = 0; i < out_last_level.size() - 1; ++i) { size_t repeat = out_last_level[i + 1] - out_last_level[i]; Eigen::TensorMap< @@ -117,13 +117,15 @@ template class SequenceExpandGradKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { - auto* d_out = context.Input(framework::GradVarName("Out")); auto* x = context.Input("X"); auto* out = context.Input("Out"); + auto* d_out = context.Input(framework::GradVarName("Out")); + auto* d_x = context.Output(framework::GradVarName("X")); d_x->set_lod(x->lod()); - SequenceExpandGradFunctor(context.template device_context(), *x, *out, - d_out, d_x); + SequenceExpandGradFunctor functor; + functor(context.template device_context(), *x, *out, *d_out, + d_x); } }; From 35bed7ce1cb48bd8e35e0a76fbcf7359eabc37ef Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Wed, 21 Mar 2018 19:10:52 +0800 Subject: [PATCH 004/164] Add contents for manully build documentation(cn version) --- doc/v2/dev/write_docs_cn.rst | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/doc/v2/dev/write_docs_cn.rst b/doc/v2/dev/write_docs_cn.rst index a055bb04c0..674efabcef 100644 --- a/doc/v2/dev/write_docs_cn.rst +++ b/doc/v2/dev/write_docs_cn.rst @@ -64,9 +64,31 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D 不使用PaddlePaddle.org工具 -------------------------- -使用Docker构建PaddlePaddle的文档,需要在系统里先安装好Docker工具包。Docker安装请参考 `Docker的官网 `_ 。安装好Docker之后可以使用源码目录下的脚本构建文档,即 +使用Docker构建PaddlePaddle的文档,需要在系统里先安装好Docker工具包。Docker安装请参考 `Docker的官网 `_ 。该方法与 `从源码编译PaddlePaddle `_ 相似,通过从源码中构建可用于编译PaddlePaddle文档的Docker镜像并运行,在进入Docker容器后使用源码中的脚本构建PaddlePaddle文档,具体步骤如下: -[TBD] +.. code-block:: bash + + mkdir paddle + cd paddle + git clone https://github.com/PaddlePaddle/Paddle.git + cd Paddle + + # 从源码中构建可用于编译PaddlePaddle文档的Docker镜像 + docker build -t paddle:dev . + docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_TESTING=OFF" paddle:dev /bin/bash + + # 进入Docker容器后使用build.sh脚本构建PaddlePaddle文档 + bash -x /paddle/paddle/scripts/docker/build.sh + +注:上述命令把当前目录(源码根目录)映射为 container 里的 :code:`/paddle` 目录。 + +编译完成后,进入 ``paddle/build/doc/v2`` 目录,该目录下生成了 ``cn/html/`` 、 ``en/html`` 以及 ``api/en/html`` 共三个子目录,分别进入这些目录下,执行以下命令: + +.. code-block:: bash + + python -m SimpleHTTPServer 8088 + +在浏览器中输入http://localhost:8088就可以看到编译生成的中/英文的文档页面和英文的API页面。 如果不想使用Docker,也可以使用以下命令直接构建PaddlePaddle文档,即 @@ -75,6 +97,7 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D mkdir paddle cd paddle git clone https://github.com/PaddlePaddle/Paddle.git + cd Paddle mkdir -p build cd build cmake .. -DCMAKE_BUILD_TYPE=Release -DWITH_GPU=OFF -DWITH_MKL=OFF -DWITH_DOC=ON @@ -96,7 +119,9 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D python -m SimpleHTTPServer 8088 -在浏览器中输入http://localhost:8088就可以看到编译生成的中/英文的文档页面和英文的API页面,下图为生成的英文文档首页示例。注意,示例中由于使用了sphinx的原始主题,所以页面的风格与官网并不一致,但这并不影响开发者进行调试。 +在浏览器中输入http://localhost:8088就可以看到编译生成的中/英文的文档页面和英文的API页面。 + +下图为生成的英文文档首页示例。注意,示例中由于使用了sphinx的原始主题,所以页面的风格与官网并不一致,但这并不影响开发者进行调试。 .. image:: src/doc_en.png :align: center From 53c8c36a04f92685f3fc380cbc41b9af1031de67 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Wed, 21 Mar 2018 05:49:53 -0700 Subject: [PATCH 005/164] "debug the process" --- paddle/fluid/framework/executor.cc | 2 +- paddle/fluid/operators/sequence_expand_op.cu | 128 ++++++++++++------ .../paddle/fluid/tests/unittests/op_test.py | 3 + .../tests/unittests/test_sequence_expand.py | 88 ++++++------ 4 files changed, 133 insertions(+), 88 deletions(-) diff --git a/paddle/fluid/framework/executor.cc b/paddle/fluid/framework/executor.cc index 7155d5ef2f..5125072ddd 100644 --- a/paddle/fluid/framework/executor.cc +++ b/paddle/fluid/framework/executor.cc @@ -44,7 +44,7 @@ struct ExecutorPrepareContext { ExecutorPrepareContext(const framework::ProgramDesc& prog, size_t block_id) : prog_(prog), block_id_(block_id) {} - const framework::ProgramDesc& prog_; + const framework::ProgramDesc prog_; size_t block_id_; std::vector> ops_; }; diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index cae0a69284..bf453ca7e8 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -13,7 +13,10 @@ See the License for the specific language governing permissions and limitations under the License. */ #define EIGEN_USE_GPU +#include +#include #include "paddle/fluid/operators/sequence_expand_op.h" +#include "paddle/fluid/platform/cuda_helper.h" namespace paddle { namespace operators { @@ -22,47 +25,71 @@ using LoDTensor = framework::LoDTensor; template __global__ void sequence_expand_kernel(const T* x_data, T* out_data, - const size_t* lod, size_t lod_size, - size_t element_len) { - int tid_x = blockIdx.x * blockDim.x + threadIdx.x; - for (; tid_x < static_cast(lod_size - 1); - tid_x += blockDim.x * gridDim.x) { - int scale = lod[tid_x + 1] - lod[tid_x]; - int tid_y = blockIdx.y * blockDim.y + threadIdx.y; - for (; tid_y < scale; tid_y += blockDim.y * gridDim.y) { - int tid_z = blockIdx.z * blockDim.z + threadIdx.z; - int item_start = tid_x / element_len; - for (; tid_z < element_len; tid_z += blockDim.z * gridDim.z) { - out_data[item_start * scale + tid_z] = x_data[item_start + tid_z]; - } + const size_t* lod, + const size_t* out_offset, + size_t lod_size, size_t element_len, + size_t x_size) { + int bid_x = blockIdx.x; + if (bid_x > lod_size) return; + int repeats = lod[bid_x]; + int offset = out_offset[bid_x]; + for (int tid_y = threadIdx.y; tid_y < repeats; tid_y += blockDim.y) { + for (int tid_x = threadIdx.x; tid_x < element_len; tid_x += blockDim.x) { + out_data[(offset + tid_y) * element_len + tid_x] = + x_data[bid_x * element_len + tid_x]; } } } template __global__ void sequence_expand_grad_kernel(const T* dout_data, T* dx_data, - const size_t* lod, size_t lod_size, - size_t element_len, - size_t dout_size) { + const size_t* lod, + const size_t* out_offset, + size_t lod_size, size_t element_len, + size_t dout_size, size_t dx_size) { + // reduce visit memory time. + // dout_shm = [0 - dout_size-1], dx_shm = [dout_size-1, dout_size + dx_size-1] + if (blockIdx.x == 0 && blockIdx.y == 0 && threadIdx.x == 0 && + threadIdx.y == 0) { + printf("lod_size=%ld, element_size=%ld, dout_size=%ld, dx_size=%ld\n", + lod_size, element_len, dout_size, dx_size); + } extern __shared__ T shm[]; - int tid_x = blockIdx.x * blockDim.x + threadIdx.x; - for (; tid_x < static_cast(lod_size - 1); - tid_x += blockDim.x * gridDim.x) { - int scale = lod[tid_x + 1] - lod[tid_x]; - int tid_y = blockIdx.y * blockDim.y + threadIdx.y; - for (; tid_y < scale; tid_y += blockDim.y * gridDim.y) { - int tid_z = blockIdx.z * blockDim.z + threadIdx.z; - int item_start = tid_x / element_len; - for (; tid_z < element_len; tid_z += blockDim.z * gridDim.z) { - shm[item_start + tid_z] += dout_data[item_start * scale + tid_z]; - } + T* dout_shm = shm; + T* dx_shm = &shm[dout_size]; + + // int idx = threadIdx.x + blockIdx.x * blockDim.x; + for (int idx = 0; idx < dout_size; ++idx) { + if (idx < dx_size) { + dx_shm[idx] = 0.0; + } + if (idx < dout_size) { + dout_shm[idx] = dout_data[idx]; + } + } + + int bid_x = blockIdx.x; + if (bid_x > lod_size) return; + int repeats = lod[bid_x]; + int offset = out_offset[bid_x]; + if (threadIdx.x == 0) { + printf("repeats=%d, offset=%ld\n", repeats, offset); + } + for (int tid_y = threadIdx.y; tid_y < repeats; tid_y += blockDim.y) { + for (int tid_x = threadIdx.x; tid_x < element_len; tid_x += blockDim.x) { + T val = dout_shm[(offset + tid_y) * element_len + tid_x]; + platform::CudaAtomicAdd(&dx_shm[bid_x * element_len + tid_x], val); + int dx_idx = bid_x * element_len + tid_x; + int dout_idx = (offset + tid_y) * element_len + tid_x; + printf("dx_idx=%d, dout_idx=%d, dx_data=%f, dout_data=%f, val=%f \n", + dx_idx, dout_idx, dx_shm[dx_idx], dout_shm[dout_idx], val); } } - // synchronize before write to dx __syncthreads(); - for (int idx = blockDim.x * blockIdx.x + threadIdx.x; - idx < static_cast(dout_size); idx += blockDim.x * gridDim.x) { - dx_data[idx] = shm[idx]; + // copy shared memory back to dx + for (int idx = threadIdx.x + blockIdx.x * blockDim.x; idx < dx_size; + idx += blockDim.x * gridDim.x) { + dx_data[idx] = dx_shm[idx]; } } @@ -72,15 +99,20 @@ struct SequenceExpandFunctor { const LoDTensor& x, LoDTensor* out) { auto x_dims = x.dims(); size_t element_len = framework::product(x_dims) / x_dims[0]; - T* out_data = out->mutable_data(context.GetPlace()); - auto out_starts = out->lod().back(); + auto lod = out->lod().back(); + framework::Vector out_lod; + for (size_t i = 0; i < lod.size() - 1; ++i) { + out_lod.push_back(lod[i + 1] - lod[i]); + } - dim3 block_size(16, 32, element_len); - dim3 grid_size(10, 10); + int thread_x = std::max(static_cast(element_len), 32); + int block_x = static_cast(out_lod.size()); + dim3 block_size(thread_x, 1024 / thread_x); + dim3 grid_size(block_x, 1); sequence_expand_kernel<<>>( x.data(), out->mutable_data(context.GetPlace()), - out_starts.CUDAData(context.GetPlace()), out_starts.size(), - element_len); + out_lod.CUDAData(context.GetPlace()), lod.CUDAData(context.GetPlace()), + out_lod.size(), element_len, framework::product(x_dims)); } }; @@ -91,16 +123,24 @@ struct SequenceExpandGradFunctor { const LoDTensor& dout, LoDTensor* dx) { auto x_dims = x.dims(); size_t element_len = framework::product(x_dims) / x_dims[0]; - auto out_starts = out.lod().back(); + auto lod = out.lod().back(); + framework::Vector out_lod; + for (size_t i = 0; i < lod.size() - 1; ++i) { + out_lod.push_back(lod[i + 1] - lod[i]); + } + size_t dout_size = framework::product(dout.dims()); + size_t dx_size = framework::product(dx->dims()); - dim3 block_size(16, 32, element_len); - dim3 grid_size(10, 10); - size_t out_size = framework::product(dx->dims()); - sequence_expand_grad_kernel<<(element_len), 32); + dim3 block_size(thread_x, 1024 / thread_x); + int block_x = static_cast(out_lod.size()); + dim3 grid_size(block_x, 1); + sequence_expand_grad_kernel<<>>( dout.data(), dx->mutable_data(context.GetPlace()), - out_starts.CUDAData(context.GetPlace()), out_starts.size(), element_len, - out_size); + out_lod.CUDAData(context.GetPlace()), lod.CUDAData(context.GetPlace()), + out_lod.size(), element_len, dout_size, dx_size); } }; diff --git a/python/paddle/fluid/tests/unittests/op_test.py b/python/paddle/fluid/tests/unittests/op_test.py index 8393f7827b..555f188abb 100644 --- a/python/paddle/fluid/tests/unittests/op_test.py +++ b/python/paddle/fluid/tests/unittests/op_test.py @@ -362,6 +362,9 @@ class OpTest(unittest.TestCase): for a, b, name in itertools.izip(numeric_grads, analytic_grads, names): abs_a = np.abs(a) abs_a[abs_a < 1e-3] = 1 + print("actual", a) + print("*****") + print("expected", b) diff_mat = np.abs(a - b) / abs_a max_diff = np.max(diff_mat) diff --git a/python/paddle/fluid/tests/unittests/test_sequence_expand.py b/python/paddle/fluid/tests/unittests/test_sequence_expand.py index 957fa5d2c4..f984127b4d 100644 --- a/python/paddle/fluid/tests/unittests/test_sequence_expand.py +++ b/python/paddle/fluid/tests/unittests/test_sequence_expand.py @@ -19,8 +19,14 @@ from op_test import OpTest class TestSequenceExpand(OpTest): def set_data(self): - x_data = np.random.uniform(0.1, 1, [3, 1]).astype('float32') - y_data = np.random.uniform(0.1, 1, [8, 1]).astype('float32') + x = [i / 10.0 for i in range(3)] + y = [i / 10.0 for i in range(8)] + x_data = np.array(x).reshape(3, 1).astype('float32') + y_data = np.array(y).reshape(8, 1).astype('float32') + print(x_data) + print(y_data) + # x_data = np.random.uniform(0.1, 1, [3, 1]).astype('float32') + # y_data = np.random.uniform(0.1, 1, [8, 1]).astype('float32') y_lod = [[0, 1, 4, 8]] self.inputs = {'X': x_data, 'Y': (y_data, y_lod)} @@ -45,47 +51,43 @@ class TestSequenceExpand(OpTest): def test_check_grad(self): self.check_grad(["X"], "Out") - -class TestSequenceExpandCase1(TestSequenceExpand): - def set_data(self): - x_data = np.random.uniform(0.1, 1, [5, 1]).astype('float32') - x_lod = [[0, 2, 5]] - y_data = np.random.uniform(0.1, 1, [13, 1]).astype('float32') - y_lod = [[0, 2, 5], [0, 2, 4, 7, 10, 13]] - self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} - - -class TestSequenceExpandCase2(TestSequenceExpand): - def set_data(self): - x_data = np.random.uniform(0.1, 1, [1, 2, 2]).astype('float32') - x_lod = [[0, 1]] - y_data = np.random.uniform(0.1, 1, [2, 2, 2]).astype('float32') - y_lod = [[0, 2]] - self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} - - -class TestSequenceExpandCase3(TestSequenceExpand): - def set_data(self): - x_data = np.random.uniform(0.1, 1, [4, 1]).astype('float32') - x_lod = [[0, 1, 2, 3, 4]] - y_data = np.random.uniform(0.1, 1, [6, 1]).astype('float32') - y_lod = [[0, 2, 4, 4, 6]] - self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} - - -class TestSequenceExpandCase4(TestSequenceExpand): - def set_data(self): - x_data = np.array( - [0.1, 0.3, 0.2, 0.15, 0.25, 0.2, 0.15, 0.25, 0.1, 0.3]).reshape( - [2, 5]).astype('float32') - x_lod = [[ - 0, - 1, - 2, - ]] - y_data = np.random.uniform(0.1, 1, [2, 1]).astype('float32') - y_lod = [[0, 1, 2], [0, 1, 2]] - self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} + # class TestSequenceExpandCase1(TestSequenceExpand): + # def set_data(self): + # x_data = np.random.uniform(0.1, 1, [5, 1]).astype('float32') + # x_lod = [[0, 2, 5]] + # y_data = np.random.uniform(0.1, 1, [13, 1]).astype('float32') + # y_lod = [[0, 2, 5], [0, 2, 4, 7, 10, 13]] + # self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} + + # class TestSequenceExpandCase2(TestSequenceExpand): + # def set_data(self): + # x_data = np.random.uniform(0.1, 1, [1, 2, 2]).astype('float32') + # x_lod = [[0, 1]] + # y_data = np.random.uniform(0.1, 1, [2, 2, 2]).astype('float32') + # y_lod = [[0, 2]] + # self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} + + # class TestSequenceExpandCase3(TestSequenceExpand): + # def set_data(self): + # x_data = np.random.uniform(0.1, 1, [4, 1]).astype('float32') + # x_lod = [[0, 1, 2, 3, 4]] + # y_data = np.random.uniform(0.1, 1, [6, 1]).astype('float32') + # y_lod = [[0, 2, 4, 4, 6]] + # self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} + + # class TestSequenceExpandCase4(TestSequenceExpand): + # def set_data(self): + # x_data = np.array( + # [0.1, 0.3, 0.2, 0.15, 0.25, 0.2, 0.15, 0.25, 0.1, 0.3]).reshape( + # [2, 5]).astype('float32') + # x_lod = [[ + # 0, + # 1, + # 2, + # ]] + # y_data = np.random.uniform(0.1, 1, [2, 1]).astype('float32') + # y_lod = [[0, 1, 2], [0, 1, 2]] + # self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} if __name__ == '__main__': From 154a1db04916efe74baa37e06128a43787fe6716 Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Thu, 22 Mar 2018 11:21:31 +0800 Subject: [PATCH 006/164] Adjust some commands --- doc/v2/dev/write_docs_cn.rst | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/doc/v2/dev/write_docs_cn.rst b/doc/v2/dev/write_docs_cn.rst index 674efabcef..8514e635ff 100644 --- a/doc/v2/dev/write_docs_cn.rst +++ b/doc/v2/dev/write_docs_cn.rst @@ -18,9 +18,6 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D .. code-block:: bash - mkdir paddlepaddle # Create paddlepaddle working directory - cd paddlepaddle - # Clone the content repositories git clone https://github.com/PaddlePaddle/Paddle.git git clone https://github.com/PaddlePaddle/book.git @@ -38,9 +35,6 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D .. code-block:: bash - mkdir paddlepaddle # Create paddlepaddle working directory - cd paddlepaddle - # Clone the content repositories and PaddlePaddle.org git clone https://github.com/PaddlePaddle/Paddle.git git clone https://github.com/PaddlePaddle/book.git @@ -68,14 +62,12 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D .. code-block:: bash - mkdir paddle - cd paddle git clone https://github.com/PaddlePaddle/Paddle.git cd Paddle # 从源码中构建可用于编译PaddlePaddle文档的Docker镜像 docker build -t paddle:dev . - docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_TESTING=OFF" paddle:dev /bin/bash + docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_TESTING=OFF" -e "WITH_DOC=ON" paddle:dev /bin/bash # 进入Docker容器后使用build.sh脚本构建PaddlePaddle文档 bash -x /paddle/paddle/scripts/docker/build.sh @@ -94,8 +86,6 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D .. code-block:: bash - mkdir paddle - cd paddle git clone https://github.com/PaddlePaddle/Paddle.git cd Paddle mkdir -p build From db1b128feb63a14514c2e38e344f6b464e1b7a68 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Mon, 26 Mar 2018 20:16:57 -0700 Subject: [PATCH 007/164] "add details" --- paddle/fluid/operators/sequence_expand_op.h | 161 ++++++++++++++------ 1 file changed, 114 insertions(+), 47 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.h b/paddle/fluid/operators/sequence_expand_op.h index 11890b30ae..5cab367988 100644 --- a/paddle/fluid/operators/sequence_expand_op.h +++ b/paddle/fluid/operators/sequence_expand_op.h @@ -13,15 +13,19 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include // std::itoa #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/memory/memcpy.h" -#include "paddle/fluid/platform/device_context.h" +#include "paddle/fluid/operators/math/math_function.h" namespace paddle { namespace operators { using LoDTensor = framework::LoDTensor; +template +using EigenMatrix = framework::EigenMatrix; template struct SequenceExpandFunctor { @@ -38,23 +42,35 @@ template struct SequenceExpandFunctor { void operator()(const platform::CPUDeviceContext& context, const LoDTensor& x, LoDTensor* out) { - auto x_dims = x.dims(); - size_t element_len = framework::product(x_dims) / x_dims[0]; - const T* x_data = x.data(); - T* out_data = out->mutable_data(context.GetPlace()); - auto out_starts = out->lod().back(); - - for (size_t i = 0; i < out_starts.size() - 1; i++) { - int scale = out_starts[i + 1] - out_starts[i]; - Eigen::TensorMap< - Eigen::Tensor> - x_t(x_data, 1, element_len); - Eigen::TensorMap> - out_t(out_data, scale, element_len); - Eigen::array cast({{scale, 1}}); - out_t.device(*context.eigen_device()) = x_t.broadcast(cast); - x_data += element_len; - out_data += element_len * scale; + auto& out_lod = out->lod()[0]; + framework::Vector x_lod; + if (x.lod() == 1) { + x_lod = x.lod()[0]; + } else { + x_lod.reserve(out_lod.size()); + std::itoa(x_lod.begin(), x_lod.end(), 0); // fill 0 ~ out_lod.size()-1 + } + int out_offset = 0; + auto& eigen_place = *context.eigen_device(); + for (size_t i = 1; i < out_lod.size(); ++i) { + int repeat_num = y_lod[ref_level][i] - y_lod[ref_level][i - 1]; + int x_start = x_lod[i - 1]; + int x_end = x_lod[i]; + int x_seq_len = x_end - x_start; + if (repeat_num > 0) { + auto x_sub_tensor = x->Slice(x_start, x_end); + x_sub_tensor.Resize({1, x_sub_tensor.numel()}); + int out_start = out_offset; + if (x_lod.size() == 1) { + out_start = out_lod[0][out_offset]; + } + auto out_sub_tensor = + out->Slice(out_start, out_start + x_seq_len * repeat_num); + out_sub_tensor.Resize({repeat_num, x_sub_tensor.dims()[1]}); + EigenMatrix::From(out_sub_tensor).device(eigen_place) = + EigenMatrix::From(x_sub_tensor) + .broadcast(Eigen::array({{repeat_num, 1}})); + } } } }; @@ -64,15 +80,42 @@ class SequenceExpandKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { auto* x = context.Input("X"); - auto* out = context.Output("Out"); - auto x_dims = x->dims(); auto* y = context.Input("Y"); - PADDLE_ENFORCE(!y->lod().empty(), "y should have lod"); - PADDLE_ENFORCE_EQ(static_cast(x_dims[0]), - y->lod().back().size() - 1, - "The size of last lod level in Input(Y)" - "must be equal to dims[0] of Input(X)."); - out->set_lod(y->lod()); + auto* out = context.Output("Out"); + + int ref_level = context.Attr("ref_level"); + auto& x_lod = x->lod(); + auto& y_lod = y->lod(); + + if (ref_level == -1) ref_level = y_lod.size() - 1; + + out->mutable_data(context.GetPlace()); + + if (y_lod[ref_level].size() <= 1) { + framework::TensorCopy(*x, context.GetPlace(), out); + return; + } + + auto& out_lod = *out->mutable_lod(); + // x lod level is at most 1. + if (x_lod.size() == 0) { + out_lod = y_lod[ref_level]; + } else if (x_lod.size() == 1) { + out_lod.resize(1); + out_lod[0] = {0}; + int out_offset = 0; + for (size_t i = 1; i < y_lod[ref_level].size(); ++i) { + int repeat_num = y_lod[ref_level][i] - y_lod[ref_level][i - 1]; + int x_start = x_lod[0][i - 1]; + int x_end = x_lod[0][i]; + int x_seq_len = x_end - x_start; + for (int j = 0; j < repeat_num; ++j) { + out_lod[0].push_back(out_lod[0].back() + x_seq_len); + out_offset++; + } + } + } + SequenceExpandFunctor functor; functor(context.template device_context(), *x, out); } @@ -94,21 +137,31 @@ template struct SequenceExpandGradFunctor { void operator()(const platform::CPUDeviceContext& context, const LoDTensor& x, const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx) { - auto out_last_level = out.lod().back(); - const T* d_out_data = dout.data(); - T* d_x_data = dx->mutable_data(context.GetPlace()); - size_t element_len = dout.numel() / dout.dims()[0]; - for (size_t i = 0; i < out_last_level.size() - 1; ++i) { - size_t repeat = out_last_level[i + 1] - out_last_level[i]; - Eigen::TensorMap< - Eigen::Tensor> - d_out_t(d_out_data, static_cast(repeat), element_len); - Eigen::TensorMap> - d_x_t(d_x_data, static_cast(element_len)); - d_x_t.device(*context.eigen_device()) = - d_out_t.sum(Eigen::array({{0}})); - d_out_data += (repeat * element_len); - d_x_data += element_len; + auto& dev_ctx = context.template device_context(); + + math::SetConstant set_zero; + set_zero(dev_ctx, g_x, static_cast(0)); + + int g_out_offset = 0; + for (size_t i = 1; i < y_lod[ref_level].size(); ++i) { + int repeat_num = y_lod[ref_level][i] - y_lod[ref_level][i - 1]; + if (repeat_num > 0) { + int x_start = i - 1; + int x_end = i; + if (x_lod.size() == 1) { + x_start = x_lod[0][i - 1]; + x_end = x_lod[0][i]; + } + int x_seq_len = x_end - x_start; + auto g_x_sub = g_x->Slice(x_start, x_end); + g_x_sub.Resize(flatten_to_1d(g_x_sub.dims())); + int g_out_end = g_out_offset + repeat_num * x_seq_len; + auto g_out_sub = g_out->Slice(g_out_offset, g_out_end); + g_out_sub.Resize({repeat_num, g_x_sub.dims()[0]}); + math::ColwiseSum col_sum; + col_sum(dev_ctx, g_out_sub, &g_x_sub); + g_out_offset += repeat_num * x_seq_len; + } } } }; @@ -117,15 +170,29 @@ template class SequenceExpandGradKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { + auto* g_out = context.Input(framework::GradVarName("Out")); auto* x = context.Input("X"); - auto* out = context.Input("Out"); - auto* d_out = context.Input(framework::GradVarName("Out")); + auto* y = context.Input("Y"); + auto* g_x = context.Output(framework::GradVarName("X")); + int ref_level = context.Attr("ref_level"); + + g_x->mutable_data(context.GetPlace()); + g_x->set_lod(x->lod()); + + auto& x_lod = x->lod(); + auto& y_lod = y->lod(); + + if (ref_level == -1) ref_level = y_lod.size() - 1; + + // just copy the gradient + if (y_lod[ref_level].size() <= 1) { + framework::TensorCopy(*g_out, context.GetPlace(), g_x); + return; + } - auto* d_x = context.Output(framework::GradVarName("X")); - d_x->set_lod(x->lod()); SequenceExpandGradFunctor functor; - functor(context.template device_context(), *x, *out, *d_out, - d_x); + functor(context.template device_context(), *x, *y, *g_out, + g_x); } }; From 86626a74780176a991064ce6ea7ac5d4bd683775 Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Wed, 28 Mar 2018 15:22:43 +0800 Subject: [PATCH 008/164] Add English version --- doc/v2/dev/write_docs_cn.rst | 6 ++++++ doc/v2/dev/write_docs_en.rst | 24 ++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/doc/v2/dev/write_docs_cn.rst b/doc/v2/dev/write_docs_cn.rst index f18dd86b51..83d065d3bb 100644 --- a/doc/v2/dev/write_docs_cn.rst +++ b/doc/v2/dev/write_docs_cn.rst @@ -19,6 +19,9 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D .. code-block:: bash + mkdir paddlepaddle # Create paddlepaddle working directory + cd paddlepaddle + # Clone the content repositories git clone https://github.com/PaddlePaddle/Paddle.git git clone https://github.com/PaddlePaddle/book.git @@ -36,6 +39,9 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D .. code-block:: bash + mkdir paddlepaddle # Create paddlepaddle working directory + cd paddlepaddle + # Clone the content repositories and PaddlePaddle.org git clone https://github.com/PaddlePaddle/Paddle.git git clone https://github.com/PaddlePaddle/book.git diff --git a/doc/v2/dev/write_docs_en.rst b/doc/v2/dev/write_docs_en.rst index 15ff0d34ad..8bc43be6de 100644 --- a/doc/v2/dev/write_docs_en.rst +++ b/doc/v2/dev/write_docs_en.rst @@ -68,9 +68,29 @@ Please `click here `_ on how to install Docker. After Docker is installed, you could use the scripts in the source directory to build the documentation. +Build PaddlePaddle's documentation with Docker,you need to install Docker first. Please refer to `Docker's official website `_ on how to install Docker. This method is quite similar to ` Build From Sources `_ , by constructing, from source code, a docker image that can be used to build PaddlePaddle documentation. Enter the Docker container and use the script ``build.sh`` in the source directory to build the PaddlePaddle documentation. The specific steps are as follows: -[TBD] +.. code-block:: bash + + git clone https://github.com/PaddlePaddle/Paddle.git + cd Paddle + + # Construct a docker image from source code + docker build -t paddle:dev . + docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_TESTING=OFF" -e "WITH_DOC=ON" paddle:dev /bin/bash + + # Use build.sh to build PaddlePaddle documentation + bash -x /paddle/paddle/scripts/docker/build.sh + +Note: The above commands maps the current directory (source root directory) to the :code:`/paddle` directory in the container. + +After compiling, you could enter the ``paddle/build/doc/v2`` directory, where three subdirectories ``cn/html/``, ``en/html`` and ``api/en/html`` are generated. Please enter these directories respectively and execute the following commands: + +.. code-block:: bash + + python -m SimpleHTTPServer 8088 + +Use a web browser and navigate to http://localhost:8000, you could see the compiled Chinese/English documents page and the English APIs page. If you do not wish to use Docker, you can also use the following commands to directly build the PaddlePaddle documentation. From 0be1e09f2c703c1479259ab68b06cc4bd1cb5c43 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Wed, 28 Mar 2018 02:34:34 -0700 Subject: [PATCH 009/164] "fix ci" --- paddle/fluid/operators/sequence_expand_op.cc | 5 +- paddle/fluid/operators/sequence_expand_op.cu | 193 +++++++++--------- paddle/fluid/operators/sequence_expand_op.h | 130 ++++++------ .../tests/unittests/test_sequence_expand.py | 22 +- 4 files changed, 183 insertions(+), 167 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cc b/paddle/fluid/operators/sequence_expand_op.cc index 786fe63e75..ae52849162 100644 --- a/paddle/fluid/operators/sequence_expand_op.cc +++ b/paddle/fluid/operators/sequence_expand_op.cc @@ -84,12 +84,11 @@ class SequenceExpandOp : public framework::OperatorWithKernel { } } out_dims[0] = out_first_dim; - ctx->SetOutputDim("Out", out_dims); } else { out_dims[0] = -1; - ctx->SetOutputDim("Out", out_dims); - ctx->ShareLoD("X", /*->*/ "Out"); } + ctx->SetOutputDim("Out", out_dims); + ctx->ShareLoD("X", /*->*/ "Out"); } }; diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 743e3bbc29..1bd7342652 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -24,123 +24,128 @@ namespace operators { using LoDTensor = framework::LoDTensor; template -__global__ void sequence_expand_kernel(const T* x_data, T* out_data, - const size_t* lod, - const size_t* out_offset, - size_t lod_size, size_t element_len, - size_t x_size) { - int bid_x = blockIdx.x; - if (bid_x > lod_size) return; - int repeats = lod[bid_x]; - int offset = out_offset[bid_x]; - for (int tid_y = threadIdx.y; tid_y < repeats; tid_y += blockDim.y) { - for (int tid_x = threadIdx.x; tid_x < element_len; tid_x += blockDim.x) { - out_data[(offset + tid_y) * element_len + tid_x] = - x_data[bid_x * element_len + tid_x]; +__global__ void sequence_expand_kernel(const T* x_data, const size_t* x_lod, + const size_t* ref_lod, + const size_t lod_size, + /* default=1, + the instance length*/ + const int x_item_length, T* out_data) { + constexpr int N = 1024; + __shared__ int mem[N]; + int offset = 0; + for (int i = 0; i < lod_size; ++i) { + mem[i] = offset; + if (i < lod_size - 1) { + offset += (ref_lod[i + 1] - ref_lod[i]) * (x_lod[i + 1] - x_lod[i]); } } -} + __syncthreads(); -template -__global__ void sequence_expand_grad_kernel(const T* dout_data, T* dx_data, - const size_t* lod, - const size_t* out_offset, - size_t lod_size, size_t element_len, - size_t dout_size, size_t dx_size) { - // reduce visit memory time. - // dout_shm = [0 - dout_size-1], dx_shm = [dout_size-1, dout_size + dx_size-1] - if (blockIdx.x == 0 && blockIdx.y == 0 && threadIdx.x == 0 && - threadIdx.y == 0) { - printf("lod_size=%ld, element_size=%ld, dout_size=%ld, dx_size=%ld\n", - lod_size, element_len, dout_size, dx_size); - } - extern __shared__ T shm[]; - T* dout_shm = shm; - T* dx_shm = &shm[dout_size]; - - // int idx = threadIdx.x + blockIdx.x * blockDim.x; - for (int idx = 0; idx < dout_size; ++idx) { - if (idx < dx_size) { - dx_shm[idx] = 0.0; - } - if (idx < dout_size) { - dout_shm[idx] = dout_data[idx]; + int bid = blockIdx.x; + if (bid >= lod_size - 1) return; + + int x_item_count = x_lod[bid + 1] - x_lod[bid]; + int repeats = ref_lod[bid + 1] - ref_lod[bid]; + int out_offset = mem[bid]; + int x_offset = x_lod[bid]; + for (int tid_z = threadIdx.z; tid_z < repeats; tid_z += blockDim.z) { + for (int tid_y = threadIdx.y; tid_y < x_item_count; tid_y += blockDim.y) { + for (int tid_x = threadIdx.x; tid_x < x_item_length; + tid_x += blockDim.x) { + out_data[(out_offset + tid_z * x_item_count + tid_y) * x_item_length + + tid_x] = x_data[(x_offset + tid_y) * x_item_length + tid_x]; + } } } +} - int bid_x = blockIdx.x; - if (bid_x > lod_size) return; - int repeats = lod[bid_x]; - int offset = out_offset[bid_x]; - if (threadIdx.x == 0) { - printf("repeats=%d, offset=%ld\n", repeats, offset); - } - for (int tid_y = threadIdx.y; tid_y < repeats; tid_y += blockDim.y) { - for (int tid_x = threadIdx.x; tid_x < element_len; tid_x += blockDim.x) { - T val = dout_shm[(offset + tid_y) * element_len + tid_x]; - platform::CudaAtomicAdd(&dx_shm[bid_x * element_len + tid_x], val); - int dx_idx = bid_x * element_len + tid_x; - int dout_idx = (offset + tid_y) * element_len + tid_x; - printf("dx_idx=%d, dout_idx=%d, dx_data=%f, dout_data=%f, val=%f \n", - dx_idx, dout_idx, dx_shm[dx_idx], dout_shm[dout_idx], val); +template +__global__ void sequence_expand_grad_kernel(const T* dout_data, + const size_t* ref_lod, + const size_t* dx_lod, + const size_t lod_size, + /* default=1, + the instance length*/ + const int x_item_length, + T* dx_data) { + // TODO(dzhwinter) : too many atomicAdd + // use shared memory to reduce memory visits + constexpr int N = 1024; + __shared__ int mem[N]; + int offset = 0; + for (int i = 0; i < lod_size; ++i) { + mem[i] = offset; + if (i < lod_size - 1) { + offset += (ref_lod[i + 1] - ref_lod[i]) * (dx_lod[i + 1] - dx_lod[i]); } } __syncthreads(); - // copy shared memory back to dx - for (int idx = threadIdx.x + blockIdx.x * blockDim.x; idx < dx_size; - idx += blockDim.x * gridDim.x) { - dx_data[idx] = dx_shm[idx]; + + int bid = blockIdx.x; + if (bid >= lod_size - 1) return; + int x_item_count = dx_lod[bid + 1] - dx_lod[bid]; + int repeats = ref_lod[bid + 1] - ref_lod[bid]; + int out_offset = mem[bid]; + int x_offset = dx_lod[bid]; + + for (int tid_z = threadIdx.z; tid_z < repeats; tid_z += blockDim.z) { + for (int tid_y = threadIdx.y; tid_y < x_item_count; tid_y += blockDim.y) { + for (int tid_x = threadIdx.x; tid_x < x_item_length; + tid_x += blockDim.x) { + platform::CudaAtomicAdd( + &dx_data[(x_offset + tid_y) * x_item_length + tid_x], + dout_data[(out_offset + tid_z * x_item_count + tid_y) * + x_item_length + + tid_x]); + } + } } } template struct SequenceExpandFunctor { - void operator()(const platform::CUDADeviceContext& context, - const LoDTensor& x, LoDTensor* out) { - auto x_dims = x.dims(); - size_t element_len = framework::product(x_dims) / x_dims[0]; - auto lod = out->lod().back(); - framework::Vector out_lod; - for (size_t i = 0; i < lod.size() - 1; ++i) { - out_lod.push_back(lod[i + 1] - lod[i]); - } - - int thread_x = std::max(static_cast(element_len), 32); - int block_x = static_cast(out_lod.size()); - dim3 block_size(thread_x, 1024 / thread_x); + void operator()( + const platform::CUDADeviceContext& context, const LoDTensor& x, + const framework::Vector& x_lod, /*expand source lod*/ + const framework::Vector& ref_lod, /*expand referenced lod*/ + LoDTensor* out) { + int x_item_length = 1; + x_item_length = x.numel() / x.dims()[0]; + VLOG(0) << "x_item_length" << x_item_length; + int thread_x = std::max(static_cast(ref_lod.size()), 32); + int thread_y = std::max(1024 / thread_x, 16); + int thread_z = std::min(1024 / thread_x / thread_y, 16); + int block_x = static_cast(ref_lod.size()); + dim3 block_size(thread_x, thread_y, thread_z); dim3 grid_size(block_x, 1); + sequence_expand_kernel<<>>( - x.data(), out->mutable_data(context.GetPlace()), - out_lod.CUDAData(context.GetPlace()), lod.CUDAData(context.GetPlace()), - out_lod.size(), element_len, framework::product(x_dims)); + x.data(), x_lod.CUDAData(context.GetPlace()), + ref_lod.CUDAData(context.GetPlace()), x_lod.size(), x_item_length, + out->mutable_data(context.GetPlace())); } }; template struct SequenceExpandGradFunctor { void operator()(const platform::CUDADeviceContext& context, - const LoDTensor& x, const LoDTensor& out, - const LoDTensor& dout, LoDTensor* dx) { - auto x_dims = x.dims(); - size_t element_len = framework::product(x_dims) / x_dims[0]; - auto lod = out.lod().back(); - framework::Vector out_lod; - for (size_t i = 0; i < lod.size() - 1; ++i) { - out_lod.push_back(lod[i + 1] - lod[i]); - } - size_t dout_size = framework::product(dout.dims()); - size_t dx_size = framework::product(dx->dims()); - - int thread_x = std::max(static_cast(element_len), 32); - dim3 block_size(thread_x, 1024 / thread_x); - int block_x = static_cast(out_lod.size()); + const LoDTensor& dout, + const framework::Vector& x_lod, /*expand source lod*/ + const framework::Vector& ref_lod, /*expand based lod*/ + LoDTensor* dx) { + int x_item_length = 1; + x_item_length = framework::product(dx->dims()) / dx->dims()[0]; + + int thread_x = std::max(static_cast(ref_lod.size()), 32); + int thread_y = std::max(1024 / thread_x, 16); + int thread_z = std::min(1024 / thread_x / thread_y, 16); + int block_x = static_cast(ref_lod.size()); + dim3 block_size(thread_x, thread_y, thread_z); dim3 grid_size(block_x, 1); - sequence_expand_grad_kernel<<>>( - dout.data(), dx->mutable_data(context.GetPlace()), - out_lod.CUDAData(context.GetPlace()), lod.CUDAData(context.GetPlace()), - out_lod.size(), element_len, dout_size, dx_size); + sequence_expand_grad_kernel<<>>( + dout.data(), ref_lod.CUDAData(context.GetPlace()), + x_lod.CUDAData(context.GetPlace()), ref_lod.size(), x_item_length, + dx->mutable_data(context.GetPlace())); } }; diff --git a/paddle/fluid/operators/sequence_expand_op.h b/paddle/fluid/operators/sequence_expand_op.h index 5cab367988..c55c3e215a 100644 --- a/paddle/fluid/operators/sequence_expand_op.h +++ b/paddle/fluid/operators/sequence_expand_op.h @@ -13,8 +13,10 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once -#include // std::itoa +#include // std::iota +#include +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/memory/memcpy.h" #include "paddle/fluid/operators/math/math_function.h" @@ -29,40 +31,42 @@ using EigenMatrix = framework::EigenMatrix; template struct SequenceExpandFunctor { - void operator()(const DeviceContext& ctx, const LoDTensor& x, LoDTensor* out); + void operator()( + const DeviceContext& ctx, const LoDTensor& x, + const framework::Vector& x_lod, /*expand source lod*/ + const framework::Vector& ref_lod, /*expand referenced lod*/ + LoDTensor* out); }; template struct SequenceExpandGradFunctor { - void operator()(const DeviceContext& ctx, const LoDTensor& x, - const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx); + void operator()( + const DeviceContext& ctx, const LoDTensor& dout, + const framework::Vector& x_lod, /*expand source lod*/ + const framework::Vector& ref_lod, /*expand referenced lod*/ + LoDTensor* dx); }; template struct SequenceExpandFunctor { - void operator()(const platform::CPUDeviceContext& context, const LoDTensor& x, - LoDTensor* out) { - auto& out_lod = out->lod()[0]; - framework::Vector x_lod; - if (x.lod() == 1) { - x_lod = x.lod()[0]; - } else { - x_lod.reserve(out_lod.size()); - std::itoa(x_lod.begin(), x_lod.end(), 0); // fill 0 ~ out_lod.size()-1 - } + void operator()( + const platform::CPUDeviceContext& context, const LoDTensor& x, + const framework::Vector& x_lod, /*expand source lod*/ + const framework::Vector& ref_lod, /*expand referenced lod*/ + LoDTensor* out) { int out_offset = 0; auto& eigen_place = *context.eigen_device(); - for (size_t i = 1; i < out_lod.size(); ++i) { - int repeat_num = y_lod[ref_level][i] - y_lod[ref_level][i - 1]; + for (size_t i = 1; i < ref_lod.size(); ++i) { + int repeat_num = ref_lod[i] - ref_lod[i - 1]; int x_start = x_lod[i - 1]; int x_end = x_lod[i]; int x_seq_len = x_end - x_start; if (repeat_num > 0) { - auto x_sub_tensor = x->Slice(x_start, x_end); + auto x_sub_tensor = x.Slice(x_start, x_end); x_sub_tensor.Resize({1, x_sub_tensor.numel()}); int out_start = out_offset; - if (x_lod.size() == 1) { - out_start = out_lod[0][out_offset]; + if (out->lod().size() == 1) { + out_start = out->lod()[0][out_offset]; } auto out_sub_tensor = out->Slice(out_start, out_start + x_seq_len * repeat_num); @@ -71,6 +75,7 @@ struct SequenceExpandFunctor { EigenMatrix::From(x_sub_tensor) .broadcast(Eigen::array({{repeat_num, 1}})); } + out_offset += repeat_num; } } }; @@ -96,13 +101,10 @@ class SequenceExpandKernel : public framework::OpKernel { return; } - auto& out_lod = *out->mutable_lod(); // x lod level is at most 1. - if (x_lod.size() == 0) { - out_lod = y_lod[ref_level]; - } else if (x_lod.size() == 1) { - out_lod.resize(1); - out_lod[0] = {0}; + framework::Vector out_lod; + if (x_lod.size() == 1) { + out_lod.push_back(0); int out_offset = 0; for (size_t i = 1; i < y_lod[ref_level].size(); ++i) { int repeat_num = y_lod[ref_level][i] - y_lod[ref_level][i - 1]; @@ -110,14 +112,25 @@ class SequenceExpandKernel : public framework::OpKernel { int x_end = x_lod[0][i]; int x_seq_len = x_end - x_start; for (int j = 0; j < repeat_num; ++j) { - out_lod[0].push_back(out_lod[0].back() + x_seq_len); + out_lod.push_back(out_lod.back() + x_seq_len); out_offset++; } } + // write lod to out if x has lod + auto& ref_lod = *out->mutable_lod(); + ref_lod[0] = out_lod; + } + framework::Vector ref_x_lod; + if (x->lod().size() == 1) { + ref_x_lod = x->lod()[0]; + } else { + // x_lod doesn't has lod, use fake x lod, level = 0 + ref_x_lod.resize(x->dims()[0] + 1); + std::iota(ref_x_lod.begin(), ref_x_lod.end(), 0); } - SequenceExpandFunctor functor; - functor(context.template device_context(), *x, out); + functor(context.template device_context(), *x, ref_x_lod, + y_lod[ref_level], out); } }; @@ -135,32 +148,29 @@ class SequenceExpandKernel : public framework::OpKernel { * */ template struct SequenceExpandGradFunctor { - void operator()(const platform::CPUDeviceContext& context, const LoDTensor& x, - const LoDTensor& out, const LoDTensor& dout, LoDTensor* dx) { - auto& dev_ctx = context.template device_context(); - - math::SetConstant set_zero; - set_zero(dev_ctx, g_x, static_cast(0)); - - int g_out_offset = 0; - for (size_t i = 1; i < y_lod[ref_level].size(); ++i) { - int repeat_num = y_lod[ref_level][i] - y_lod[ref_level][i - 1]; + void operator()( + const platform::CPUDeviceContext& context, const LoDTensor& dout, + const framework::Vector& x_lod, /*expand source lod*/ + const framework::Vector& ref_lod, /*expand referenced lod*/ + LoDTensor* dx) { + math::SetConstant set_zero; + set_zero(context, dx, static_cast(0)); + + int dout_offset = 0; + for (size_t i = 1; i < ref_lod.size(); ++i) { + int repeat_num = ref_lod[i] - ref_lod[i - 1]; if (repeat_num > 0) { - int x_start = i - 1; - int x_end = i; - if (x_lod.size() == 1) { - x_start = x_lod[0][i - 1]; - x_end = x_lod[0][i]; - } + int x_start = x_lod[i - 1]; + int x_end = x_lod[i]; int x_seq_len = x_end - x_start; - auto g_x_sub = g_x->Slice(x_start, x_end); - g_x_sub.Resize(flatten_to_1d(g_x_sub.dims())); - int g_out_end = g_out_offset + repeat_num * x_seq_len; - auto g_out_sub = g_out->Slice(g_out_offset, g_out_end); - g_out_sub.Resize({repeat_num, g_x_sub.dims()[0]}); - math::ColwiseSum col_sum; - col_sum(dev_ctx, g_out_sub, &g_x_sub); - g_out_offset += repeat_num * x_seq_len; + auto dx_sub = dx->Slice(x_start, x_end); + dx_sub.Resize(flatten_to_1d(dx_sub.dims())); + int dout_end = dout_offset + repeat_num * x_seq_len; + auto dout_sub = dout.Slice(dout_offset, dout_end); + dout_sub.Resize({repeat_num, dx_sub.dims()[0]}); + math::ColwiseSum col_sum; + col_sum(context, dout_sub, &dx_sub); + dout_offset += repeat_num * x_seq_len; } } } @@ -179,20 +189,26 @@ class SequenceExpandGradKernel : public framework::OpKernel { g_x->mutable_data(context.GetPlace()); g_x->set_lod(x->lod()); - auto& x_lod = x->lod(); auto& y_lod = y->lod(); - if (ref_level == -1) ref_level = y_lod.size() - 1; - // just copy the gradient if (y_lod[ref_level].size() <= 1) { framework::TensorCopy(*g_out, context.GetPlace(), g_x); return; } + framework::Vector ref_x_lod; + framework::Vector ref_lod = y_lod[ref_level]; + if (x->lod().size() == 1) { + ref_x_lod = x->lod()[0]; + } else { + // x_lod doesn't has lod, use fake x lod, level = 0 + ref_x_lod.resize(x->dims()[0] + 1); + std::iota(ref_x_lod.begin(), ref_x_lod.end(), 0); + } SequenceExpandGradFunctor functor; - functor(context.template device_context(), *x, *y, *g_out, - g_x); + functor(context.template device_context(), *g_out, ref_x_lod, + ref_lod, g_x); } }; diff --git a/python/paddle/fluid/tests/unittests/test_sequence_expand.py b/python/paddle/fluid/tests/unittests/test_sequence_expand.py index d1cebc4ea2..4c8ec1426c 100644 --- a/python/paddle/fluid/tests/unittests/test_sequence_expand.py +++ b/python/paddle/fluid/tests/unittests/test_sequence_expand.py @@ -19,14 +19,8 @@ from op_test import OpTest class TestSequenceExpand(OpTest): def set_data(self): - x = [i / 10.0 for i in range(3)] - y = [i / 10.0 for i in range(8)] - x_data = np.array(x).reshape(3, 1).astype('float32') - y_data = np.array(y).reshape(8, 1).astype('float32') - print(x_data) - print(y_data) - # x_data = np.random.uniform(0.1, 1, [3, 1]).astype('float32') - # y_data = np.random.uniform(0.1, 1, [8, 1]).astype('float32') + x_data = np.random.uniform(0.1, 1, [3, 1]).astype('float32') + y_data = np.random.uniform(0.1, 1, [8, 1]).astype('float32') y_lod = [[0, 1, 4, 8]] self.inputs = {'X': x_data, 'Y': (y_data, y_lod)} @@ -53,8 +47,10 @@ class TestSequenceExpand(OpTest): x_len = x_idx[i] - x_idx[i - 1] if repeat_num > 0: x_sub = x_data[x_idx[i - 1]:x_idx[i], :] - x_sub = np.repeat(x_sub, repeat_num, axis=0) - out = np.vstack((out, x_sub)) + stacked_x_sub = x_sub + for r in range(repeat_num - 1): + stacked_x_sub = np.vstack((stacked_x_sub, x_sub)) + out = np.vstack((out, stacked_x_sub)) if x_lod is not None: for j in xrange(repeat_num): out_lod[0].append(out_lod[0][-1] + x_len) @@ -107,11 +103,11 @@ class TestSequenceExpandCase3(TestSequenceExpand): class TestSequenceExpandCase4(TestSequenceExpand): def set_data(self): - data = [0.1, 0.3, 0.2, 0.15, 0.25, 0.2, 0.15, 0.25, 0.1, 0.3] + data = np.random.uniform(0.1, 1, [5 * 2, 1]) x_data = np.array(data).reshape([5, 2]).astype('float32') x_lod = [[0, 2, 5]] - y_data = np.random.uniform(0.1, 1, [2, 1]).astype('float32') - y_lod = [[0, 1, 2], [0, 1, 2]] + y_data = np.random.uniform(0.1, 1, [3, 1]).astype('float32') + y_lod = [[0, 1, 3], [0, 1, 3]] self.inputs = {'X': (x_data, x_lod), 'Y': (y_data, y_lod)} From 0412f5e09b9c1d13593a28b6a529affb26681141 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Wed, 28 Mar 2018 05:21:29 -0700 Subject: [PATCH 010/164] "fix ci" --- paddle/fluid/operators/sequence_expand_op.cu | 21 ++++++++------------ paddle/fluid/operators/sequence_expand_op.h | 2 -- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 1bd7342652..8a35bc908e 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -13,7 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. */ #define EIGEN_USE_GPU -#include #include #include "paddle/fluid/operators/sequence_expand_op.h" #include "paddle/fluid/platform/cuda_helper.h" @@ -109,12 +108,10 @@ struct SequenceExpandFunctor { const framework::Vector& x_lod, /*expand source lod*/ const framework::Vector& ref_lod, /*expand referenced lod*/ LoDTensor* out) { - int x_item_length = 1; - x_item_length = x.numel() / x.dims()[0]; - VLOG(0) << "x_item_length" << x_item_length; - int thread_x = std::max(static_cast(ref_lod.size()), 32); - int thread_y = std::max(1024 / thread_x, 16); - int thread_z = std::min(1024 / thread_x / thread_y, 16); + int x_item_length = x.numel() / x.dims()[0]; + int thread_x = std::min(32, std::max(static_cast(ref_lod.size()), 16)); + int thread_y = 16; + int thread_z = 1024 / thread_x / thread_y; int block_x = static_cast(ref_lod.size()); dim3 block_size(thread_x, thread_y, thread_z); dim3 grid_size(block_x, 1); @@ -133,12 +130,10 @@ struct SequenceExpandGradFunctor { const framework::Vector& x_lod, /*expand source lod*/ const framework::Vector& ref_lod, /*expand based lod*/ LoDTensor* dx) { - int x_item_length = 1; - x_item_length = framework::product(dx->dims()) / dx->dims()[0]; - - int thread_x = std::max(static_cast(ref_lod.size()), 32); - int thread_y = std::max(1024 / thread_x, 16); - int thread_z = std::min(1024 / thread_x / thread_y, 16); + int x_item_length = framework::product(dx->dims()) / dx->dims()[0]; + int thread_x = std::min(32, std::max(static_cast(ref_lod.size()), 16)); + int thread_y = 16; + int thread_z = 1024 / thread_x / thread_y; int block_x = static_cast(ref_lod.size()); dim3 block_size(thread_x, thread_y, thread_z); dim3 grid_size(block_x, 1); diff --git a/paddle/fluid/operators/sequence_expand_op.h b/paddle/fluid/operators/sequence_expand_op.h index c55c3e215a..d62c387c3e 100644 --- a/paddle/fluid/operators/sequence_expand_op.h +++ b/paddle/fluid/operators/sequence_expand_op.h @@ -15,8 +15,6 @@ limitations under the License. */ #pragma once #include // std::iota -#include -#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/memory/memcpy.h" #include "paddle/fluid/operators/math/math_function.h" From e1290c4fd7facfa9abfbb6e710ab3fa5f4ed3d10 Mon Sep 17 00:00:00 2001 From: wanghaoshuang Date: Wed, 28 Mar 2018 23:09:32 +0800 Subject: [PATCH 011/164] Make Average Model support for 'moving mean' and 'moving variance' of batch_normal op --- python/paddle/fluid/optimizer.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/python/paddle/fluid/optimizer.py b/python/paddle/fluid/optimizer.py index 180575c35d..d21320f705 100644 --- a/python/paddle/fluid/optimizer.py +++ b/python/paddle/fluid/optimizer.py @@ -850,23 +850,39 @@ class ModelAverage(Optimizer): self.min_average_window = min_average_window self.max_average_window = max_average_window self.params_grads = params_grads + + # append 'moving mean' and 'moving variance' to self.params_grads + pattern = re.compile(r"batch_norm_\d+\.w_[1,2]") + for param in framework.default_main_program().global_block( + ).all_parameters(): + if pattern.match(param.name) is not None: + self.params_grads.append((param, None)) + # create a tmp gradient variable to backup parameter value + # for parameter whose grad is None + for i, param_grad in enumerate(self.params_grads): + param, grad = param_grad + if grad is None: + grad = param.block.create_var( + name=unique_name.generate(".".join([param.name, 'tmp'])), + dtype=param.dtype, + persistable=False, + stop_gradient=stop_gradient) + self.params_grads[i] = (param, grad) + for param, grad in self.params_grads: - if grad is not None: - self._append_average_accumulate_op(param) + self._append_average_accumulate_op(param) self.apply_program = Program() block = self.apply_program.global_block() with program_guard(main_program=self.apply_program): for param_grad in self.params_grads: - if param_grad[1] is not None: - self._add_average_apply_op(block, param_grad) + self._add_average_apply_op(block, param_grad) self.restore_program = Program() block = self.restore_program.global_block() with program_guard(main_program=self.restore_program): for param_grad in self.params_grads: - if param_grad[1] is not None: - self._add_average_restore_op(block, param_grad) + self._add_average_restore_op(block, param_grad) def _add_average_apply_op(self, block, param_grad): param = block.clone_variable(param_grad[0]) From b661fe1d76514127581f2f73b177d2891677d39f Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Thu, 29 Mar 2018 01:36:34 -0700 Subject: [PATCH 012/164] "fix ci" --- python/paddle/fluid/tests/unittests/op_test.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/op_test.py b/python/paddle/fluid/tests/unittests/op_test.py index 555f188abb..8393f7827b 100644 --- a/python/paddle/fluid/tests/unittests/op_test.py +++ b/python/paddle/fluid/tests/unittests/op_test.py @@ -362,9 +362,6 @@ class OpTest(unittest.TestCase): for a, b, name in itertools.izip(numeric_grads, analytic_grads, names): abs_a = np.abs(a) abs_a[abs_a < 1e-3] = 1 - print("actual", a) - print("*****") - print("expected", b) diff_mat = np.abs(a - b) / abs_a max_diff = np.max(diff_mat) From fbdb5b7b437a55ce97fba37da5fdcbdd5e3e53bb Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Thu, 29 Mar 2018 19:20:50 -0700 Subject: [PATCH 013/164] "fix based on comment" --- paddle/fluid/operators/sequence_expand_op.cu | 68 +++++++++----------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 8a35bc908e..8119afce1a 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -25,27 +25,17 @@ using LoDTensor = framework::LoDTensor; template __global__ void sequence_expand_kernel(const T* x_data, const size_t* x_lod, const size_t* ref_lod, + const size_t* offset, const size_t lod_size, /* default=1, the instance length*/ const int x_item_length, T* out_data) { - constexpr int N = 1024; - __shared__ int mem[N]; - int offset = 0; - for (int i = 0; i < lod_size; ++i) { - mem[i] = offset; - if (i < lod_size - 1) { - offset += (ref_lod[i + 1] - ref_lod[i]) * (x_lod[i + 1] - x_lod[i]); - } - } - __syncthreads(); - int bid = blockIdx.x; if (bid >= lod_size - 1) return; int x_item_count = x_lod[bid + 1] - x_lod[bid]; int repeats = ref_lod[bid + 1] - ref_lod[bid]; - int out_offset = mem[bid]; + int out_offset = static_cast(offset[bid]); int x_offset = x_lod[bid]; for (int tid_z = threadIdx.z; tid_z < repeats; tid_z += blockDim.z) { for (int tid_y = threadIdx.y; tid_y < x_item_count; tid_y += blockDim.y) { @@ -59,32 +49,17 @@ __global__ void sequence_expand_kernel(const T* x_data, const size_t* x_lod, } template -__global__ void sequence_expand_grad_kernel(const T* dout_data, - const size_t* ref_lod, - const size_t* dx_lod, - const size_t lod_size, - /* default=1, - the instance length*/ - const int x_item_length, - T* dx_data) { - // TODO(dzhwinter) : too many atomicAdd - // use shared memory to reduce memory visits - constexpr int N = 1024; - __shared__ int mem[N]; - int offset = 0; - for (int i = 0; i < lod_size; ++i) { - mem[i] = offset; - if (i < lod_size - 1) { - offset += (ref_lod[i + 1] - ref_lod[i]) * (dx_lod[i + 1] - dx_lod[i]); - } - } - __syncthreads(); - +__global__ void sequence_expand_grad_kernel( + const T* dout_data, const size_t* ref_lod, const size_t* dx_lod, + const size_t* offset, const size_t lod_size, + /* default=1, + the instance length*/ + const int x_item_length, T* dx_data) { int bid = blockIdx.x; if (bid >= lod_size - 1) return; int x_item_count = dx_lod[bid + 1] - dx_lod[bid]; int repeats = ref_lod[bid + 1] - ref_lod[bid]; - int out_offset = mem[bid]; + int out_offset = static_cast(offset[bid]); int x_offset = dx_lod[bid]; for (int tid_z = threadIdx.z; tid_z < repeats; tid_z += blockDim.z) { @@ -101,6 +76,19 @@ __global__ void sequence_expand_grad_kernel(const T* dout_data, } } +void GetOutputOffset(const framework::Vector& x_lod, + const framework::Vector& ref_lod, + framework::Vector& out_offset) { + size_t offset = 0; + int lod_size = static_cast(x_lod.size()); + for (int i = 0; i < static_cast(x_lod.size()); ++i) { + out_offset[i] = offset; + if (i < lod_size - 1) { + offset += (ref_lod[i + 1] - ref_lod[i]) * (x_lod[i + 1] - x_lod[i]); + } + } +} + template struct SequenceExpandFunctor { void operator()( @@ -109,6 +97,9 @@ struct SequenceExpandFunctor { const framework::Vector& ref_lod, /*expand referenced lod*/ LoDTensor* out) { int x_item_length = x.numel() / x.dims()[0]; + framework::Vector out_offset(x_lod.size()); + GetOutputOffset(x_lod, ref_lod, out_offset); + int thread_x = std::min(32, std::max(static_cast(ref_lod.size()), 16)); int thread_y = 16; int thread_z = 1024 / thread_x / thread_y; @@ -118,7 +109,8 @@ struct SequenceExpandFunctor { sequence_expand_kernel<<>>( x.data(), x_lod.CUDAData(context.GetPlace()), - ref_lod.CUDAData(context.GetPlace()), x_lod.size(), x_item_length, + ref_lod.CUDAData(context.GetPlace()), + out_offset.CUDAData(context.GetPlace()), x_lod.size(), x_item_length, out->mutable_data(context.GetPlace())); } }; @@ -131,6 +123,9 @@ struct SequenceExpandGradFunctor { const framework::Vector& ref_lod, /*expand based lod*/ LoDTensor* dx) { int x_item_length = framework::product(dx->dims()) / dx->dims()[0]; + framework::Vector out_offset(x_lod.size()); + GetOutputOffset(x_lod, ref_lod, out_offset); + int thread_x = std::min(32, std::max(static_cast(ref_lod.size()), 16)); int thread_y = 16; int thread_z = 1024 / thread_x / thread_y; @@ -139,7 +134,8 @@ struct SequenceExpandGradFunctor { dim3 grid_size(block_x, 1); sequence_expand_grad_kernel<<>>( dout.data(), ref_lod.CUDAData(context.GetPlace()), - x_lod.CUDAData(context.GetPlace()), ref_lod.size(), x_item_length, + x_lod.CUDAData(context.GetPlace()), + out_offset.CUDAData(context.GetPlace()), ref_lod.size(), x_item_length, dx->mutable_data(context.GetPlace())); } }; From 62373edb0c6ad7b55ca7af5b632ecd415e9d51bb Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Fri, 30 Mar 2018 19:27:08 +0800 Subject: [PATCH 014/164] Adjust --- doc/v2/dev/write_docs_cn.rst | 7 ++----- doc/v2/dev/write_docs_en.rst | 11 ++++------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/doc/v2/dev/write_docs_cn.rst b/doc/v2/dev/write_docs_cn.rst index 83d065d3bb..0795b2d146 100644 --- a/doc/v2/dev/write_docs_cn.rst +++ b/doc/v2/dev/write_docs_cn.rst @@ -100,13 +100,10 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D cmake .. -DCMAKE_BUILD_TYPE=Release -DWITH_GPU=OFF -DWITH_MKL=OFF -DWITH_DOC=ON # 如果只需要构建使用文档,则执行以下命令 - make -j $processors gen_proto_py - make -j $processors paddle_docs paddle_docs_cn + make -j $processors paddle_docs # 如果只需要构建API,则执行以下命令 - make -j $processors gen_proto_py framework_py_proto - make -j $processors copy_paddle_pybind - make -j $processors paddle_api_docs + make -j $processors paddle_apis 其中$processors代表启动和CPU核一样多的进程来并行编译,可以根据本机的CPU核数设置相应的值。 diff --git a/doc/v2/dev/write_docs_en.rst b/doc/v2/dev/write_docs_en.rst index 8bc43be6de..f03daa300f 100644 --- a/doc/v2/dev/write_docs_en.rst +++ b/doc/v2/dev/write_docs_en.rst @@ -96,21 +96,18 @@ If you do not wish to use Docker, you can also use the following commands to dir .. code-block:: bash - mkdir paddle - cd paddle + git clone https://github.com/PaddlePaddle/Paddle.git + cd Paddle mkdir -p build cd build cmake .. -DCMAKE_BUILD_TYPE=Release -DWITH_GPU=OFF -DWITH_MKL=OFF -DWITH_DOC=ON # If you only need to build documents, use the following commands - make -j $processors gen_proto_py - make -j $processors paddle_docs paddle_docs_cn + make -j $processors paddle_docs # If you only need to build APIs, use the following commands - make -j $processors gen_proto_py framework_py_proto - make -j $processors copy_paddle_pybind - make -j $processors paddle_api_docs + make -j $processors paddle_apis $processors indicates that as many processes as the CPU cores are started to compile in parallel. It should be set according to the number of CPU cores of your machine. From abc630ecf9e01f7c09b8833ad25fa60cb9cbc6c8 Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Fri, 30 Mar 2018 21:12:29 +0800 Subject: [PATCH 015/164] Adjust descriptions for building fluid docs and api --- doc/v2/dev/write_docs_cn.rst | 4 ++-- doc/v2/dev/write_docs_en.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/v2/dev/write_docs_cn.rst b/doc/v2/dev/write_docs_cn.rst index 0795b2d146..887d92942e 100644 --- a/doc/v2/dev/write_docs_cn.rst +++ b/doc/v2/dev/write_docs_cn.rst @@ -107,13 +107,13 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D 其中$processors代表启动和CPU核一样多的进程来并行编译,可以根据本机的CPU核数设置相应的值。 -编译完成后,进入 ``doc/v2`` 目录,如果选择构建文档则会在该目录下生成 ``cn/html/`` 、 ``en/html`` 两个子目录,选择构建API则会生成 ``api/en/html`` 目录,分别进入这些目录下,执行以下命令: +编译完成后,会产生 ``doc/v2`` 和 ``doc/fluid`` 两个目录,如果选择构建文档则会在这两个目录下分别都生成 ``cn/html/`` 、 ``en/html`` 两个子目录,选择构建API则会在这两个目录下分别生成 ``api/en/html`` 目录,分别进入这些子目录下,执行以下命令: .. code-block:: bash python -m SimpleHTTPServer 8088 -在浏览器中输入 http://localhost:8088 就可以看到编译生成的中/英文的文档页面和英文的API页面,下图为生成的英文文档首页示例。注意,示例中由于使用了sphinx的原始主题,所以页面的风格与官网并不一致,但这并不影响开发者进行调试。 +在浏览器中输入 http://localhost:8088 就可以看到编译生成的 ``v2`` 和 ``fluid`` 两种版本的中/英文的文档页面和英文的API页面,下图为生成的 ``v2`` 英文文档首页示例。注意,示例中由于使用了sphinx的原始主题,所以页面的风格与官网并不一致,但这并不影响开发者进行调试。 .. image:: src/doc_en.png :align: center diff --git a/doc/v2/dev/write_docs_en.rst b/doc/v2/dev/write_docs_en.rst index f03daa300f..435bbdb60f 100644 --- a/doc/v2/dev/write_docs_en.rst +++ b/doc/v2/dev/write_docs_en.rst @@ -111,13 +111,13 @@ If you do not wish to use Docker, you can also use the following commands to dir $processors indicates that as many processes as the CPU cores are started to compile in parallel. It should be set according to the number of CPU cores of your machine. -After the compilation is complete, enter the ``doc/v2`` directory. If you chose to build documents, it will generate ``cn/html/`` and ``en/html`` subdirectories under this directory. If you chose to build APIs,it will generate``api/en/html`` subdirectory. Please enter these directories respectively and execute the following commands: +After the compilation is complete, there should be two generated directories: ``doc/v2`` and ``doc/fluid`` . If you chose to build documents, two subdirectories ``cn/html/`` and ``en/html`` will be generated in both two directories. If you chose to build APIs,a subdirectory ``api/en/html`` will be generated. Please enter these directories respectively and execute the following commands: .. code-block:: bash python -m SimpleHTTPServer 8088 -Use a web browser and navigate to http://localhost:8000, you could see the compiled Chinese/English documents page and the English APIs page. The following figure is an example of the built English documents home page. Note that due to the sphinx's original theme used in the example, the style of the page is not consistent with the official website, but this does not affect the developer's debugging. +Use a web browser and navigate to http://localhost:8000, you could see the compiled ``v2`` 's and ``fluid`` 's Chinese/English documents page and English APIs page. The following figure is an example of the built ``v2`` 's English documents home page. Note that due to the sphinx's original theme used in the example, the style of the page is not consistent with the official website, but this does not affect the developer's debugging. .. image:: src/doc_en.png :align: center From 9708b21f191b3ff606651dfaeb7cf65dfd250881 Mon Sep 17 00:00:00 2001 From: wanghaoshuang Date: Mon, 2 Apr 2018 10:51:31 +0800 Subject: [PATCH 016/164] Refine average model option 1. Add attr 'average' into ParamAttr. 2. Make 'params_grads' optional for AverageModel. 3. Add option 'average_mean' and 'average_variance' for batch_normal. --- python/paddle/fluid/framework.py | 4 +++- python/paddle/fluid/layers/nn.py | 12 +++++++++--- python/paddle/fluid/optimizer.py | 28 ++++++++++++---------------- python/paddle/fluid/param_attr.py | 9 ++++++--- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/python/paddle/fluid/framework.py b/python/paddle/fluid/framework.py index 3e78788f47..92c299a4b6 100644 --- a/python/paddle/fluid/framework.py +++ b/python/paddle/fluid/framework.py @@ -1137,6 +1137,8 @@ class Parameter(Variable): self.gradient_clip_attr = kwargs.get('gradient_clip_attr', None) + self.average = kwargs.get('average', True) + def __str__(self): return self.to_string(True) @@ -1157,7 +1159,7 @@ class Parameter(Variable): if with_details: res_str = Variable.to_string(self, throw_on_error, True) additional_attr = ("trainable", "optimize_attr", "regularizer", - "gradient_clip_attr") + "gradient_clip_attr", "average") for attr_name in additional_attr: res_str += "%s: %s\n" % (attr_name, str(getattr(self, attr_name))) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 0332556f62..3265ff733b 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -1486,7 +1486,9 @@ def batch_norm(input, in_place=False, name=None, moving_mean_name=None, - moving_variance_name=None): + moving_variance_name=None, + average_mean=True, + average_variance=True): """ This function helps create an operator to implement the BatchNorm layer using the configurations from the input parameters. @@ -1517,7 +1519,10 @@ def batch_norm(input, mean = helper.create_parameter( attr=ParamAttr( - name=moving_mean_name, initializer=Constant(0.0), trainable=False), + name=moving_mean_name, + initializer=Constant(0.0), + trainable=False, + average=average_variance), shape=param_shape, dtype=input.dtype) mean.stop_gradient = True @@ -1526,7 +1531,8 @@ def batch_norm(input, attr=ParamAttr( name=moving_variance_name, initializer=Constant(1.0), - trainable=False), + trainable=False, + average=average_mean), shape=param_shape, dtype=input.dtype) variance.stop_gradient = True diff --git a/python/paddle/fluid/optimizer.py b/python/paddle/fluid/optimizer.py index d21320f705..560257a356 100644 --- a/python/paddle/fluid/optimizer.py +++ b/python/paddle/fluid/optimizer.py @@ -11,7 +11,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. - +import re from collections import defaultdict from paddle.fluid.framework import Program import framework @@ -818,8 +818,8 @@ class ModelAverage(Optimizer): min_average_window, max_average_window and current update times. Args: - params_grads: A list of parameter-grad variable pairs. average_window_rate: The rate of average window. + params_grads: A list of parameter-grad variable pairs. min_average_window: The minimum size of average window. max_average_window: The maximum size of average window. @@ -840,8 +840,8 @@ class ModelAverage(Optimizer): """ def __init__(self, - params_grads, - average_window_rate, + average_window_rate=0.15, + params_grads=None, min_average_window=10000, max_average_window=10000, **kwargs): @@ -849,25 +849,21 @@ class ModelAverage(Optimizer): self.average_window = average_window_rate self.min_average_window = min_average_window self.max_average_window = max_average_window - self.params_grads = params_grads - # append 'moving mean' and 'moving variance' to self.params_grads - pattern = re.compile(r"batch_norm_\d+\.w_[1,2]") + self.params_grads = [] if params_grads is None else params_grads + params = {} + for param, grad in self.params_grads: + params[param.name] = (param, grad) for param in framework.default_main_program().global_block( ).all_parameters(): - if pattern.match(param.name) is not None: - self.params_grads.append((param, None)) - # create a tmp gradient variable to backup parameter value - # for parameter whose grad is None - for i, param_grad in enumerate(self.params_grads): - param, grad = param_grad - if grad is None: + if param.name not in params and param.average: grad = param.block.create_var( name=unique_name.generate(".".join([param.name, 'tmp'])), dtype=param.dtype, persistable=False, - stop_gradient=stop_gradient) - self.params_grads[i] = (param, grad) + stop_gradient=True) + params[param.name] = (param, grad) + self.params_grads = params.values() for param, grad in self.params_grads: self._append_average_accumulate_op(param) diff --git a/python/paddle/fluid/param_attr.py b/python/paddle/fluid/param_attr.py index 255cd21043..74b968f8ee 100644 --- a/python/paddle/fluid/param_attr.py +++ b/python/paddle/fluid/param_attr.py @@ -28,13 +28,15 @@ class ParamAttr(object): learning_rate=1.0, regularizer=None, trainable=True, - gradient_clip=None): + gradient_clip=None, + average=True): self.name = name self.initializer = initializer self.learning_rate = learning_rate self.regularizer = regularizer self.trainable = trainable self.gradient_clip = gradient_clip + self.average = average def set_default_initializer(self, initializer): if initializer is None: @@ -80,7 +82,8 @@ class ParamAttr(object): }, 'regularizer': self.regularizer, 'trainable': self.trainable, - 'gradient_clip_attr': self.gradient_clip + 'gradient_clip_attr': self.gradient_clip, + 'average': self.average } if with_initializer: kwargs['initializer'] = self.initializer @@ -90,7 +93,7 @@ class ParamAttr(object): class WeightNormParamAttr(ParamAttr): """ Used for weight normalization. Any field in ParamAttr can also be set here. - Besides, an extra field dim can be set to indicate the dimension except + Besides, an extra field dim can be set to indicate the dimension except which to normalize. """ # List to record the parameters reparameterized by weight normalization. From f43be75b82582ec5f81c2ceba45eb14128638478 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Mon, 2 Apr 2018 20:25:11 +0800 Subject: [PATCH 017/164] multi stream thread pool --- paddle/fluid/framework/threadpool.cc | 15 +++++++++++++++ paddle/fluid/framework/threadpool.h | 16 ++++++++++++++++ paddle/fluid/operators/detail/grpc_client.cc | 12 +++++++----- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/framework/threadpool.cc b/paddle/fluid/framework/threadpool.cc index 9854d618d2..0a8377cc47 100644 --- a/paddle/fluid/framework/threadpool.cc +++ b/paddle/fluid/framework/threadpool.cc @@ -91,5 +91,20 @@ void ThreadPool::TaskLoop() { } } +std::unique_ptr MultiStreamThreadPool::io_threadpool_(nullptr); +std::once_flag MultiStreamThreadPool::io_init_flag_; + +MultiStreamThreadPool* MultiStreamThreadPool::GetInstanceIO() { + std::call_once(io_init_flag_, &MultiStreamThreadPool::InitIO); + return static_cast(io_threadpool_.get()); +} + +void MultiStreamThreadPool::InitIO() { + if (io_threadpool_.get() == nullptr) { + // TODO(typhoonzero1986): make this configurable + io_threadpool_.reset(new ThreadPool(100)); + } +} + } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/threadpool.h b/paddle/fluid/framework/threadpool.h index f9dce7105e..5d437594ab 100644 --- a/paddle/fluid/framework/threadpool.h +++ b/paddle/fluid/framework/threadpool.h @@ -135,6 +135,17 @@ class ThreadPool { std::condition_variable completed_; }; +class MultiStreamThreadPool : ThreadPool { + public: + static MultiStreamThreadPool* GetInstanceIO(); + static void InitIO(); + + private: + // NOTE: threadpool in base will be inhereted here. + static std::unique_ptr io_threadpool_; + static std::once_flag io_init_flag_; +}; + // Run a function asynchronously. // NOTE: The function must return void. If the function need to return a value, // you can use lambda to capture a value pointer. @@ -143,5 +154,10 @@ std::future Async(Callback callback) { return ThreadPool::GetInstance()->Run(callback); } +template +std::future AsyncIO(Callback callback) { + return MultiStreamThreadPool::GetInstanceIO()->Run(callback); +} + } // namespace framework } // namespace paddle diff --git a/paddle/fluid/operators/detail/grpc_client.cc b/paddle/fluid/operators/detail/grpc_client.cc index d79ba6d291..3f96ce3718 100644 --- a/paddle/fluid/operators/detail/grpc_client.cc +++ b/paddle/fluid/operators/detail/grpc_client.cc @@ -33,7 +33,8 @@ bool RPCClient::AsyncSendVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::Async([var_name_val, p_ctx, ep_val, p_scope, time_out, ch, this] { + framework::AsyncIO([var_name_val, p_ctx, ep_val, p_scope, time_out, ch, + this] { auto* var = p_scope->FindVar(var_name_val); ::grpc::ByteBuffer req; @@ -88,7 +89,8 @@ bool RPCClient::AsyncGetVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::Async([var_name_val, ep_val, p_scope, p_ctx, time_out, ch, this] { + framework::AsyncIO([var_name_val, ep_val, p_scope, p_ctx, time_out, ch, + this] { // prepare input sendrecv::VariableMessage req; req.set_varname(var_name_val); @@ -131,8 +133,8 @@ bool RPCClient::AsyncPrefetchVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::Async([in_var_name_val, out_var_name_val, ep_val, p_scope, p_ctx, - time_out, ch, this] { + framework::AsyncIO([in_var_name_val, out_var_name_val, ep_val, p_scope, p_ctx, + time_out, ch, this] { auto* var = p_scope->FindVar(in_var_name_val); ::grpc::ByteBuffer req; @@ -195,7 +197,7 @@ bool RPCClient::Wait() { std::vector> waits(req_count_); for (int i = 0; i < req_count_; i++) { - waits[i] = framework::Async([i, &a, this] { a[i] = Proceed(); }); + waits[i] = framework::AsyncIO([i, &a, this] { a[i] = Proceed(); }); } for (int i = 0; i < req_count_; i++) { From b851c0739f29eebfb9d63db026c847733fa8d252 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Tue, 3 Apr 2018 10:02:34 +0800 Subject: [PATCH 018/164] update compile --- paddle/fluid/framework/threadpool.h | 32 ++++++++++---------- paddle/fluid/operators/detail/grpc_client.cc | 12 +++----- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/paddle/fluid/framework/threadpool.h b/paddle/fluid/framework/threadpool.h index 5d437594ab..0a60488d9f 100644 --- a/paddle/fluid/framework/threadpool.h +++ b/paddle/fluid/framework/threadpool.h @@ -28,6 +28,22 @@ limitations under the License. */ namespace paddle { namespace framework { +struct ExceptionHandler { + mutable std::future> future_; + explicit ExceptionHandler( + std::future>&& f) + : future_(std::move(f)) {} + void operator()() const { + auto ex = this->future_.get(); + if (ex != nullptr) { + LOG(FATAL) << "The exception is thrown inside the thread pool. You " + "should use RunAndGetException to handle the exception.\n" + "The default exception handler is LOG(FATAL)." + << ex->what(); + } + } +}; + // ThreadPool maintains a queue of tasks, and runs them using a fixed // number of threads. class ThreadPool { @@ -87,22 +103,6 @@ class ThreadPool { void Wait(); private: - struct ExceptionHandler { - mutable std::future> future_; - explicit ExceptionHandler( - std::future>&& f) - : future_(std::move(f)) {} - void operator()() const { - auto ex = this->future_.get(); - if (ex != nullptr) { - LOG(FATAL) << "The exception is thrown inside the thread pool. You " - "should use RunAndGetException to handle the exception.\n" - "The default exception handler is LOG(FATAL)." - << ex->what(); - } - } - }; - DISABLE_COPY_AND_ASSIGN(ThreadPool); // If the task queue is empty and avaialbe is equal to the number of diff --git a/paddle/fluid/operators/detail/grpc_client.cc b/paddle/fluid/operators/detail/grpc_client.cc index 3f96ce3718..d79ba6d291 100644 --- a/paddle/fluid/operators/detail/grpc_client.cc +++ b/paddle/fluid/operators/detail/grpc_client.cc @@ -33,8 +33,7 @@ bool RPCClient::AsyncSendVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::AsyncIO([var_name_val, p_ctx, ep_val, p_scope, time_out, ch, - this] { + framework::Async([var_name_val, p_ctx, ep_val, p_scope, time_out, ch, this] { auto* var = p_scope->FindVar(var_name_val); ::grpc::ByteBuffer req; @@ -89,8 +88,7 @@ bool RPCClient::AsyncGetVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::AsyncIO([var_name_val, ep_val, p_scope, p_ctx, time_out, ch, - this] { + framework::Async([var_name_val, ep_val, p_scope, p_ctx, time_out, ch, this] { // prepare input sendrecv::VariableMessage req; req.set_varname(var_name_val); @@ -133,8 +131,8 @@ bool RPCClient::AsyncPrefetchVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::AsyncIO([in_var_name_val, out_var_name_val, ep_val, p_scope, p_ctx, - time_out, ch, this] { + framework::Async([in_var_name_val, out_var_name_val, ep_val, p_scope, p_ctx, + time_out, ch, this] { auto* var = p_scope->FindVar(in_var_name_val); ::grpc::ByteBuffer req; @@ -197,7 +195,7 @@ bool RPCClient::Wait() { std::vector> waits(req_count_); for (int i = 0; i < req_count_; i++) { - waits[i] = framework::AsyncIO([i, &a, this] { a[i] = Proceed(); }); + waits[i] = framework::Async([i, &a, this] { a[i] = Proceed(); }); } for (int i = 0; i < req_count_; i++) { From c72450d24d49c547d8e6bfc75691f429c19d6a79 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Mon, 2 Apr 2018 23:46:34 -0700 Subject: [PATCH 019/164] "seperate test" --- python/paddle/fluid/tests/unittests/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/paddle/fluid/tests/unittests/CMakeLists.txt b/python/paddle/fluid/tests/unittests/CMakeLists.txt index 0ad273c716..3873fda226 100644 --- a/python/paddle/fluid/tests/unittests/CMakeLists.txt +++ b/python/paddle/fluid/tests/unittests/CMakeLists.txt @@ -28,6 +28,8 @@ function(py_test_modules TARGET_NAME) endif() endfunction() +list(REMOVE_ITEM TEST_OPS test_sequence_expand) + # test time consuming OPs in a separate process for expliot parallism list(REMOVE_ITEM TEST_OPS test_warpctc_op) list(REMOVE_ITEM TEST_OPS test_dyn_rnn) @@ -63,6 +65,8 @@ else() endforeach(TEST_OP) endif(WITH_FAST_BUNDLE_TEST) +# +py_test_modules(test_sequence_expand MODULES test_sequence_expand) # tests with high overhead py_test_modules(test_warpctc_op MODULES test_warpctc_op ENVS FLAGS_warpctc_dir=${WARPCTC_LIB_DIR}) py_test_modules(test_train_dyn_rnn MODULES test_dyn_rnn) From fbd3604cad8fdb3ad7fa2f6717395b1c40e6ecaf Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Tue, 3 Apr 2018 05:31:52 +0000 Subject: [PATCH 020/164] Split Executor.Run to Executor.Prepare and Executor.RunPreparedContext for inference. --- paddle/fluid/framework/executor.cc | 94 ++++++++++++------- paddle/fluid/framework/executor.h | 7 ++ .../test_inference_image_classification.cc | 4 +- paddle/fluid/inference/tests/test_helper.h | 20 +++- 4 files changed, 85 insertions(+), 40 deletions(-) diff --git a/paddle/fluid/framework/executor.cc b/paddle/fluid/framework/executor.cc index 64c06687b6..009d0fbeb8 100644 --- a/paddle/fluid/framework/executor.cc +++ b/paddle/fluid/framework/executor.cc @@ -129,13 +129,15 @@ static bool has_feed_operators( feed_count, feed_targets.size(), "The number of feed operators should match 'feed_targets'"); - // When feed operator are present, so should be feed_holder - auto var = block.FindVar(feed_holder_name); - PADDLE_ENFORCE_NOT_NULL(var, "Block should already have a '%s' variable", - feed_holder_name); - PADDLE_ENFORCE_EQ(var->GetType(), proto::VarType::FEED_MINIBATCH, - "'%s' variable should be 'FEED_MINIBATCH' type", - feed_holder_name); + if (!feed_holder_name.empty()) { + // When feed operator are present, so should be feed_holder + auto var = block.FindVar(feed_holder_name); + PADDLE_ENFORCE_NOT_NULL(var, "Block should already have a '%s' variable", + feed_holder_name); + PADDLE_ENFORCE_EQ(var->GetType(), proto::VarType::FEED_MINIBATCH, + "'%s' variable should be 'FEED_MINIBATCH' type", + feed_holder_name); + } } return feed_count > 0; @@ -169,13 +171,15 @@ static bool has_fetch_operators( fetch_count, fetch_targets.size(), "The number of fetch operators should match 'fetch_targets'"); - // When fetch operator are present, so should be fetch_holder - auto var = block.FindVar(fetch_holder_name); - PADDLE_ENFORCE_NOT_NULL(var, "Block should already have a '%s' variable", - fetch_holder_name); - PADDLE_ENFORCE_EQ(var->GetType(), proto::VarType::FETCH_LIST, - "'%s' variable should be 'FETCH_LIST' type", - fetch_holder_name); + if (!fetch_holder_name.empty()) { + // When fetch operator are present, so should be fetch_holder + auto var = block.FindVar(fetch_holder_name); + PADDLE_ENFORCE_NOT_NULL(var, "Block should already have a '%s' variable", + fetch_holder_name); + PADDLE_ENFORCE_EQ(var->GetType(), proto::VarType::FETCH_LIST, + "'%s' variable should be 'FETCH_LIST' type", + fetch_holder_name); + } } return fetch_count > 0; @@ -222,16 +226,6 @@ void Executor::Run(const ProgramDesc& program, Scope* scope, } } - // map the data of feed_targets to feed_holder - for (auto* op : global_block->AllOps()) { - if (op->Type() == kFeedOpType) { - std::string feed_target_name = op->Output("Out")[0]; - int idx = boost::get(op->GetAttr("col")); - SetFeedVariable(scope, *feed_targets[feed_target_name], feed_holder_name, - idx); - } - } - if (!has_fetch_ops) { // create fetch_holder variable auto* fetch_holder = global_block->Var(fetch_holder_name); @@ -255,17 +249,9 @@ void Executor::Run(const ProgramDesc& program, Scope* scope, } } - Run(*copy_program, scope, 0, create_vars, create_vars); - - // obtain the data of fetch_targets from fetch_holder - for (auto* op : global_block->AllOps()) { - if (op->Type() == kFetchOpType) { - std::string fetch_target_name = op->Input("X")[0]; - int idx = boost::get(op->GetAttr("col")); - *fetch_targets[fetch_target_name] = - GetFetchVariable(*scope, fetch_holder_name, idx); - } - } + auto ctx = Prepare(*copy_program, 0); + RunPreparedContext(ctx.get(), scope, feed_targets, fetch_targets, + feed_holder_name, fetch_holder_name, create_vars); } std::unique_ptr Executor::Prepare( @@ -343,5 +329,43 @@ void Executor::RunPreparedContext(ExecutorPrepareContext* ctx, Scope* scope, } } +void Executor::RunPreparedContext( + ExecutorPrepareContext* ctx, Scope* scope, + std::map& feed_targets, + std::map& fetch_targets, + const std::string& feed_holder_name, const std::string& fetch_holder_name, + bool create_vars) { + auto& global_block = ctx->prog_.Block(ctx->block_id_); + + // map the data of feed_targets to feed_holder + for (auto* op : global_block.AllOps()) { + if (op->Type() == kFeedOpType) { + std::string feed_target_name = op->Output("Out")[0]; + PADDLE_ENFORCE(feed_targets.find(feed_target_name) != feed_targets.end(), + "Variable %s is not feeded."); + + int idx = boost::get(op->GetAttr("col")); + SetFeedVariable(scope, *feed_targets[feed_target_name], feed_holder_name, + idx); + } + } + + RunPreparedContext(ctx, scope, create_vars, create_vars); + + // obtain the data of fetch_targets from fetch_holder + for (auto* op : global_block.AllOps()) { + if (op->Type() == kFetchOpType) { + std::string fetch_target_name = op->Input("X")[0]; + PADDLE_ENFORCE( + fetch_targets.find(fetch_target_name) != fetch_targets.end(), + "Variable %s is not fetched."); + + int idx = boost::get(op->GetAttr("col")); + *fetch_targets[fetch_target_name] = + GetFetchVariable(*scope, fetch_holder_name, idx); + } + } +} + } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/executor.h b/paddle/fluid/framework/executor.h index 7173c51c95..b0e64d5de0 100644 --- a/paddle/fluid/framework/executor.h +++ b/paddle/fluid/framework/executor.h @@ -65,6 +65,13 @@ class Executor { bool create_local_scope = true, bool create_vars = true); + void RunPreparedContext(ExecutorPrepareContext* ctx, Scope* scope, + std::map& feed_targets, + std::map& fetch_targets, + const std::string& feed_holder_name = "feed", + const std::string& fetch_holder_name = "fetch", + bool create_vars = true); + private: const platform::Place place_; }; diff --git a/paddle/fluid/inference/tests/book/test_inference_image_classification.cc b/paddle/fluid/inference/tests/book/test_inference_image_classification.cc index e9a27171f1..9126efb8c2 100644 --- a/paddle/fluid/inference/tests/book/test_inference_image_classification.cc +++ b/paddle/fluid/inference/tests/book/test_inference_image_classification.cc @@ -48,7 +48,7 @@ TEST(inference, image_classification) { // Run inference on CPU LOG(INFO) << "--- CPU Runs: ---"; - TestInference( + TestInference( dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat); LOG(INFO) << output1.dims(); @@ -59,7 +59,7 @@ TEST(inference, image_classification) { // Run inference on CUDA GPU LOG(INFO) << "--- GPU Runs: ---"; - TestInference( + TestInference( dirname, cpu_feeds, cpu_fetchs2, FLAGS_repeat); LOG(INFO) << output2.dims(); diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index dce541c097..d559cc7d03 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -88,7 +88,7 @@ void CheckError(paddle::framework::LoDTensor& output1, EXPECT_EQ(count, 0U) << "There are " << count << " different elements."; } -template +template void TestInference(const std::string& dirname, const std::vector& cpu_feeds, std::vector& cpu_fetchs, @@ -170,7 +170,14 @@ void TestInference(const std::string& dirname, // 6. Run the inference program { // Ignore the profiling results of the first run - executor.Run(*inference_program, scope, feed_targets, fetch_targets); + std::unique_ptr ctx; + if (PrepareContext) { + ctx = executor.Prepare(*inference_program, 0); + executor.RunPreparedContext( + ctx.get(), scope, feed_targets, fetch_targets); + } else { + executor.Run(*inference_program, scope, feed_targets, fetch_targets); + } // Enable the profiler paddle::platform::EnableProfiler(state); @@ -181,7 +188,14 @@ void TestInference(const std::string& dirname, "run_inference", paddle::platform::DeviceContextPool::Instance().Get(place)); - executor.Run(*inference_program, scope, feed_targets, fetch_targets); + if (PrepareContext) { + // Note: if you changed the inference_program, you need to call + // executor.Prepare() again to get a new ExecutorPrepareContext. + executor.RunPreparedContext( + ctx.get(), scope, feed_targets, fetch_targets); + } else { + executor.Run(*inference_program, scope, feed_targets, fetch_targets); + } } // Disable the profiler and print the timing information From a2a5ffae60043b9e7b446cb746b1dfba900da27c Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Tue, 3 Apr 2018 21:42:24 -0700 Subject: [PATCH 021/164] init checkin for aws benchmarking tool --- .../paddle_banchmarking_aws.py | 393 ++++++++++++++++++ tools/aws_benchmarking/pserver.sh.template | 1 + tools/aws_benchmarking/requirements.txt | 4 + tools/aws_benchmarking/trainer.sh.template | 1 + 4 files changed, 399 insertions(+) create mode 100644 tools/aws_benchmarking/paddle_banchmarking_aws.py create mode 100644 tools/aws_benchmarking/pserver.sh.template create mode 100644 tools/aws_benchmarking/requirements.txt create mode 100644 tools/aws_benchmarking/trainer.sh.template diff --git a/tools/aws_benchmarking/paddle_banchmarking_aws.py b/tools/aws_benchmarking/paddle_banchmarking_aws.py new file mode 100644 index 0000000000..5e36f827a8 --- /dev/null +++ b/tools/aws_benchmarking/paddle_banchmarking_aws.py @@ -0,0 +1,393 @@ +# 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 argparse +import os +import json +import math +import time +import base64 + +import netaddr +import boto3 +import namesgenerator +import paramiko + +# You must have aws_access_key_id, aws_secret_access_key, region set in +# ~/.aws/credentials and ~/.aws/config + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument( + '--vpc_id', + type=str, + default="", + help="The VPC in which you wish to run test") +parser.add_argument( + '--subnet_id', + type=str, + default="", + help="The Subnet_id in which you wish to run test") +parser.add_argument( + '--security_group_id', + type=str, + default="", + required=True, + help="required, the security group id associated with your VPC") +parser.add_argument( + '--pserver_instance_type', + type=str, + default="p2.xlarge", + help="your pserver instance type") +parser.add_argument( + '--trainer_instance_type', + type=str, + default="p2.xlarge", + help="your trainer instance type") +parser.add_argument( + '--key_name', + type=str, + default="", + required=True, + help="required, key pair name") +parser.add_argument( + '--task_name', + type=str, + default="", + help="the name you want to identify your job") +parser.add_argument( + '--pserver_image_id', + type=str, + default="ami-1ae93962", + help="ami id for system image, default one has nvidia-docker ready") +parser.add_argument( + '--trainer_image_id', + type=str, + default="ami-1ae93962", + help="ami id for system image, default one has nvidia-docker ready") + +parser.add_argument( + '--trainer_count', type=int, default=1, help="Trainer count") + +parser.add_argument( + '--pserver_count', type=int, default=1, help="Pserver count") + +parser.add_argument( + '--pserver_bash_file', + type=str, + required=False, + default=os.path.join(os.path.dirname(__file__), "pserver.sh.template"), + help="pserver bash file path") + +parser.add_argument( + '--trainer_bash_file', + type=str, + required=False, + default=os.path.join(os.path.dirname(__file__), "trainer.sh.template"), + help="trainer bash file path") + +parser.add_argument('--pem_path', type=str, help="private key file") + +parser.add_argument( + '--pserver_port', type=str, default="5436", help="pserver port") + +parser.add_argument( + '--docker_image', type=str, default="busybox", help="training docker image") + +args = parser.parse_args() + +ec2client = boto3.client('ec2') + + +def create_subnet(): + # if no vpc id provided, list vpcs + if not args.vpc_id: + print("no vpc provided, trying to find the default one") + vpcs_desc = ec2client.describe_vpcs( + Filters=[{ + "Name": "isDefault", + "Values": ["true", ] + }], ) + if len(vpcs_desc["Vpcs"]) == 0: + raise ValueError('No default VPC') + args.vpc_id = vpcs_desc["Vpcs"][0]["VpcId"] + vpc_cidrBlock = vpcs_desc["Vpcs"][0]["CidrBlock"] + + print("default vpc fount with id %s and CidrBlock %s" % + (args.vpc_id, vpc_cidrBlock)) + + if not vpc_cidrBlock: + print("trying to find cidrblock for vpc") + vpcs_desc = ec2client.describe_vpcs( + Filters=[{ + "Name": "vpc-id", + "Values": [args.vpc_id, ], + }], ) + if len(vpcs_desc["Vpcs"]) == 0: + raise ValueError('No VPC found') + vpc_cidrBlock = vpcs_desc["Vpcs"][0]["CidrBlock"] + print("cidrblock for vpc is %s" % vpc_cidrBlock) + + # list subnets in vpc in order to create a new one + + print("trying to find ip blocks for new subnet") + subnets_desc = ec2client.describe_subnets( + Filters=[{ + "Name": "vpc-id", + "Values": [args.vpc_id, ], + }], ) + + ips_taken = [] + for subnet_dec in subnets_desc["Subnets"]: + ips_taken.append(subnet_dec["CidrBlock"]) + + ip_blocks_avaliable = netaddr.IPSet( + [vpc_cidrBlock]) ^ netaddr.IPSet(ips_taken) + # adding 10 addresses as buffer + cidr_prefix = 32 - math.ceil( + math.log(args.pserver_count + args.trainer_count + 10, 2)) + if cidr_prefix <= 16: + raise ValueError('Too many nodes to fit in current VPC') + + for ipnetwork in ip_blocks_avaliable.iter_cidrs(): + try: + subnet_cidr = ipnetwork.subnet(int(cidr_prefix)).next() + print("subnet ip block found %s" % (subnet_cidr)) + break + except Exception: + pass + + if not subnet_cidr: + raise ValueError( + 'No avaliable subnet to fit required nodes in current VPC') + + print("trying to create subnet") + subnet_desc = ec2client.create_subnet( + CidrBlock=str(subnet_cidr), VpcId=args.vpc_id) + + subnet_id = subnet_desc["Subnet"]["SubnetId"] + + subnet_waiter = ec2client.get_waiter('subnet_available') + # sleep for 1s before checking its state + time.sleep(1) + subnet_waiter.wait(SubnetIds=[subnet_id, ]) + + print("subnet created") + + print("adding tags to newly created subnet") + ec2client.create_tags( + Resources=[subnet_id, ], + Tags=[{ + "Key": "Task_name", + 'Value': args.task_name + }]) + return subnet_id + + +def generate_task_name(): + return namesgenerator.get_random_name() + + +def script_to_str(file_path): + if not file_path: + return "echo $PSERVER_HOSTS" + file = open(file_path, 'r') + text = file.read().strip() + file.close() + return text + + +def run_instances(image_id, instance_type, count, role, cmd=""): + if cmd: + cmd = base64.b64encode(cmd) + response = ec2client.run_instances( + ImageId=image_id, + InstanceType=instance_type, + MaxCount=count, + MinCount=count, + UserData=cmd, + DryRun=False, + InstanceInitiatedShutdownBehavior="stop", + KeyName=args.key_name, + NetworkInterfaces=[{ + 'DeviceIndex': 0, + 'SubnetId': args.subnet_id, + "AssociatePublicIpAddress": True, + 'Groups': args.security_group_ids + }], + TagSpecifications=[{ + 'ResourceType': "instance", + 'Tags': [{ + "Key": 'Task_name', + "Value": args.task_name + }, { + "Key": 'Role', + "Value": role + }] + }]) + + instance_ids = [] + for instance in response["Instances"]: + instance_ids.append(instance["InstanceId"]) + + if len(instance_ids) > 0: + print(str(len(instance_ids)) + " instance(s) created") + else: + print("no instance created") + #create waiter to make sure it's running + + print("waiting for instance to become accessible") + waiter = ec2client.get_waiter('instance_status_ok') + waiter.wait( + Filters=[{ + "Name": "instance-status.status", + "Values": ["ok"] + }, { + "Name": "instance-status.reachability", + "Values": ["passed"] + }, { + "Name": "instance-state-name", + "Values": ["running"] + }], + InstanceIds=instance_ids) + + instances_response = ec2client.describe_instances(InstanceIds=instance_ids) + + return instances_response["Reservations"][0]["Instances"] + + +def create_pservers(): + return run_instances( + image_id=args.pserver_image_id, + instance_type=args.pserver_instance_type, + count=args.pserver_count, + role="PSERVER", ) + + +def create_trainers(kickoff_cmd, pserver_endpoints_str): + responses = [] + for i in xrange(args.trainer_count): + cmd = kickoff_cmd.format( + PSERVER_HOSTS=pserver_endpoints_str, + DOCKER_IMAGE=args.docker_image, + TRAINER_INDEX=str(i)) + print(cmd) + responses.append( + run_instances( + image_id=args.trainer_image_id, + instance_type=args.trainer_instance_type, + count=1, + role="TRAINER", + cmd=cmd, )[0]) + return responses + + +def cleanup(task_name): + #shutdown all ec2 instances + instances = ec2client.describe_instances(Filters=[{ + "Name": "tag", + "Value": "Task_name=" + task_name + }]) + + instance_ids = [] + for instance in instances["Reservations"][0]["Instances"]: + instance_ids.append(instance["InstanceId"]) + + ec2client.stop_instances(InstanceIds=instance_ids) + + instance_stop_waiter = ec2client.get_waiter('instance_stopped') + instance_stop_waiter.wait(InstanceIds=instance_ids) + + #delete the subnet created + + subnet = ec2client.describe_subnets(Filters=[{ + "Name": "tag", + "Value": "Task_name=" + task_name + }]) + + ec2client.delete_subnet(SubnetId=subnet["Subnets"][0]["SubnetId"]) + + # no subnet delete waiter, just leave it. + + return + + +def main(): + if not args.task_name: + args.task_name = generate_task_name() + print("task name generated", args.task_name) + + if not args.subnet_id: + print("creating subnet for this task") + args.subnet_id = create_subnet() + print("subnet %s created" % (args.subnet_id)) + + if not args.pem_path: + args.pem_path = os.path.expanduser("~") + "/" + args.key_name + ".pem" + if args.security_group_id: + args.security_group_ids = (args.security_group_id, ) + + print("creating pservers") + pserver_create_response = create_pservers() + print("pserver created, collecting pserver ips") + + pserver_endpoints = [] + for pserver in pserver_create_response: + pserver_endpoints.append(pserver["NetworkInterfaces"][0][ + "PrivateIpAddress"] + ":" + args.pserver_port) + + pserver_endpoints_str = ",".join(pserver_endpoints) + + # ssh to pservers to start training + ssh_key = paramiko.RSAKey.from_private_key_file(args.pem_path) + ssh_client = paramiko.SSHClient() + ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + print("kicking off pserver training process") + for pserver in pserver_create_response: + try: + ssh_client.connect( + hostname=pserver["PublicIpAddress"], + username="ubuntu", + pkey=ssh_key) + cmd = (script_to_str(args.pserver_bash_file)).format( + PSERVER_HOSTS=pserver_endpoints_str, + DOCKER_IMAGE=args.docker_image) + print(cmd) + stdin, stdout, stderr = ssh_client.exec_command(command=cmd) + if stderr.read(): + raise Exception( + "Error while kicking off pserver training process") + #print(stdout.read()) + except Exception, e: + print e + cleanup(args.task_name) + finally: + ssh_client.close() + + print("creating trainers and kicking off trainer training process") + create_trainers( + kickoff_cmd=script_to_str(args.trainer_bash_file), + pserver_endpoints_str=pserver_endpoints_str) + + +def print_arguments(): + print('----------- Configuration Arguments -----------') + for arg, value in sorted(vars(args).iteritems()): + print('%s: %s' % (arg, value)) + print('------------------------------------------------') + + +if __name__ == "__main__": + print_arguments() + main() diff --git a/tools/aws_benchmarking/pserver.sh.template b/tools/aws_benchmarking/pserver.sh.template new file mode 100644 index 0000000000..ddfe2f9d31 --- /dev/null +++ b/tools/aws_benchmarking/pserver.sh.template @@ -0,0 +1 @@ +nvidia-docker run -i -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file diff --git a/tools/aws_benchmarking/requirements.txt b/tools/aws_benchmarking/requirements.txt new file mode 100644 index 0000000000..5c523854f2 --- /dev/null +++ b/tools/aws_benchmarking/requirements.txt @@ -0,0 +1,4 @@ +netaddr==0.7.19 +boto3==1.6.21 +namesgenerator==0.3 +paramiko==2.4.1 diff --git a/tools/aws_benchmarking/trainer.sh.template b/tools/aws_benchmarking/trainer.sh.template new file mode 100644 index 0000000000..70aceb8814 --- /dev/null +++ b/tools/aws_benchmarking/trainer.sh.template @@ -0,0 +1 @@ +nvidia-docker run -i -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file From cd31c12af0e639ffdb6e73d6a8bf6cbc136e585f Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Tue, 3 Apr 2018 21:46:41 -0700 Subject: [PATCH 022/164] test pre-commit --- tools/aws_benchmarking/paddle_banchmarking_aws.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/aws_benchmarking/paddle_banchmarking_aws.py b/tools/aws_benchmarking/paddle_banchmarking_aws.py index 5e36f827a8..f6512d923c 100644 --- a/tools/aws_benchmarking/paddle_banchmarking_aws.py +++ b/tools/aws_benchmarking/paddle_banchmarking_aws.py @@ -318,7 +318,6 @@ def cleanup(task_name): ec2client.delete_subnet(SubnetId=subnet["Subnets"][0]["SubnetId"]) # no subnet delete waiter, just leave it. - return From ad4bef711d159b922696d510d999a25bda50c5d4 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Tue, 3 Apr 2018 22:20:05 -0700 Subject: [PATCH 023/164] move required arguments together --- .../paddle_banchmarking_aws.py | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/tools/aws_benchmarking/paddle_banchmarking_aws.py b/tools/aws_benchmarking/paddle_banchmarking_aws.py index f6512d923c..c63e4b0742 100644 --- a/tools/aws_benchmarking/paddle_banchmarking_aws.py +++ b/tools/aws_benchmarking/paddle_banchmarking_aws.py @@ -28,6 +28,19 @@ import paramiko # ~/.aws/credentials and ~/.aws/config parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument( + '--key_name', + type=str, + default="", + required=True, + help="required, key pair name") +parser.add_argument( + '--security_group_id', + type=str, + default="", + required=True, + help="required, the security group id associated with your VPC") + parser.add_argument( '--vpc_id', type=str, @@ -38,12 +51,7 @@ parser.add_argument( type=str, default="", help="The Subnet_id in which you wish to run test") -parser.add_argument( - '--security_group_id', - type=str, - default="", - required=True, - help="required, the security group id associated with your VPC") + parser.add_argument( '--pserver_instance_type', type=str, @@ -54,12 +62,7 @@ parser.add_argument( type=str, default="p2.xlarge", help="your trainer instance type") -parser.add_argument( - '--key_name', - type=str, - default="", - required=True, - help="required, key pair name") + parser.add_argument( '--task_name', type=str, @@ -316,7 +319,6 @@ def cleanup(task_name): }]) ec2client.delete_subnet(SubnetId=subnet["Subnets"][0]["SubnetId"]) - # no subnet delete waiter, just leave it. return From af242901232464d8a59d26cba9084ffe22562fdf Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 4 Apr 2018 15:05:46 +0800 Subject: [PATCH 024/164] Add 'buffer_size' api for open_files op --- paddle/fluid/operators/reader/open_files_op.cc | 15 ++++++++++----- python/paddle/fluid/layers/io.py | 12 ++++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index eacedeea88..db4e619e7b 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -38,8 +38,9 @@ class MultipleReader : public framework::ReaderBase { }; MultipleReader(const std::vector& file_names, - const std::vector& dims, size_t thread_num) - : file_names_(file_names), dims_(dims) { + const std::vector& dims, size_t thread_num, + size_t buffer_size) + : file_names_(file_names), dims_(dims), buffer_size_(buffer_size) { prefetchers_.resize(thread_num); StartNewScheduler(); } @@ -60,6 +61,7 @@ class MultipleReader : public framework::ReaderBase { std::vector dims_; std::thread scheduler_; std::vector prefetchers_; + size_t buffer_size_; framework::Channel* waiting_file_idx_; framework::Channel* available_thread_idx_; framework::Channel>* buffer_; @@ -92,7 +94,7 @@ void MultipleReader::StartNewScheduler() { waiting_file_idx_ = framework::MakeChannel(file_names_.size()); available_thread_idx_ = framework::MakeChannel(thread_num); buffer_ = - framework::MakeChannel>(thread_num); + framework::MakeChannel>(buffer_size_); for (size_t i = 0; i < file_names_.size(); ++i) { waiting_file_idx_->Send(&i); @@ -197,11 +199,13 @@ class OpenFilesOp : public framework::OperatorBase { const auto& file_names = Attr>("file_names"); PADDLE_ENFORCE(!file_names.empty(), "No file to be read!"); const size_t thread_num = Attr("thread_num"); + const size_t buffer_size = Attr("buffer_size"); auto* out = scope.FindVar(Output("Out")) ->template GetMutable(); - out->Reset(new MultipleReader( - file_names, RestoreShapes(shape_concat, ranks), thread_num)); + out->Reset(new MultipleReader(file_names, + RestoreShapes(shape_concat, ranks), + thread_num, buffer_size)); } }; @@ -212,6 +216,7 @@ class OpenFilesOpMaker : public FileReaderMakerBase { AddAttr>("file_names", "Files to be read."); AddAttr("thread_num", "The maximal concurrent prefetch thread number.") .GreaterThan(0); + AddAttr("buffer_size", "The size of prefetch buffer.").GreaterThan(0); AddComment(R"DOC( OpenFiles Operator diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index bd7e9c30fe..da5b4853d3 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -287,7 +287,14 @@ def open_recordio_file(filename, shapes, lod_levels, dtypes): startup_var) -def open_files(filenames, thread_num, shapes, lod_levels, dtypes): +def open_files(filenames, + shapes, + lod_levels, + dtypes, + thread_num, + buffer_size=None): + if buffer_size is None: + buffer_size = thread_num dtypes = [convert_np_dtype_to_dtype_(dt) for dt in dtypes] shape_concat = [] ranks = [] @@ -308,7 +315,8 @@ def open_files(filenames, thread_num, shapes, lod_levels, dtypes): 'lod_levels': lod_levels, 'ranks': ranks, 'file_names': filenames, - 'thread_num': thread_num + 'thread_num': thread_num, + 'buffer_size': buffer_size }) startup_var.desc.set_dtypes(dtypes) From 6dcfd97a9285161efa767516d466a084b6a45bed Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 4 Apr 2018 15:35:28 +0800 Subject: [PATCH 025/164] add docstring --- python/paddle/fluid/layers/io.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index da5b4853d3..97ac01b775 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -293,8 +293,40 @@ def open_files(filenames, dtypes, thread_num, buffer_size=None): + """ + Open files + + This layer takes a list of files to read from and returns a Reader Variable. Via the Reader Variable, we can get data from given files. + + Args: + filenames(list): The list of file names. + 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. + thread_num(int): The maximal concurrent prefetch thread number. + buffer_size(int): The size of prefetch buffer. + + Returns: + Variable: A Reader Variable via which we can get file data. + + Examples: + .. code-block:: python + + reader = fluid.layers.open_files(filenames=['./data1.recordio', + './data2.recordio'], + shapes=[(3,224,224), (1)], + lod_levels=[0, 0], + dtypes=['float32', 'int64'], + thread_num=2, + buffer_size=2) + + # Via the reader, we can use 'read_file' layer to get data: + image, label = fluid.layers.read_file(reader) + """ if buffer_size is None: buffer_size = thread_num + if isinstance(filenames, basestring): + filenames = [filenames] dtypes = [convert_np_dtype_to_dtype_(dt) for dt in dtypes] shape_concat = [] ranks = [] From 2e40660e7a81962a56d89bdd1e2a86d9f78cab35 Mon Sep 17 00:00:00 2001 From: wanghaoshuang Date: Wed, 4 Apr 2018 18:13:45 +0800 Subject: [PATCH 026/164] Fix some issues. --- python/paddle/fluid/framework.py | 4 ++-- python/paddle/fluid/layers/nn.py | 20 +++++++++++--------- python/paddle/fluid/optimizer.py | 4 ++-- python/paddle/fluid/param_attr.py | 6 +++--- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/python/paddle/fluid/framework.py b/python/paddle/fluid/framework.py index 370a477932..6120d66c12 100644 --- a/python/paddle/fluid/framework.py +++ b/python/paddle/fluid/framework.py @@ -1155,7 +1155,7 @@ class Parameter(Variable): self.gradient_clip_attr = kwargs.get('gradient_clip_attr', None) - self.average = kwargs.get('average', True) + self.do_model_average = kwargs.get('do_model_average', None) def __str__(self): return self.to_string(True) @@ -1177,7 +1177,7 @@ class Parameter(Variable): if with_details: res_str = Variable.to_string(self, throw_on_error, True) additional_attr = ("trainable", "optimize_attr", "regularizer", - "gradient_clip_attr", "average") + "gradient_clip_attr", "do_model_average") for attr_name in additional_attr: res_str += "%s: %s\n" % (attr_name, str(getattr(self, attr_name))) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index e5ae10636d..37ce738275 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -1489,8 +1489,7 @@ def batch_norm(input, name=None, moving_mean_name=None, moving_variance_name=None, - average_mean=True, - average_variance=True): + do_model_average_for_mean_and_var=False): """ This function helps create an operator to implement the BatchNorm layer using the configurations from the input parameters. @@ -1519,12 +1518,15 @@ def batch_norm(input, bias = helper.create_parameter( attr=helper.bias_attr, shape=param_shape, dtype=dtype, is_bias=True) + if do_model_average_for_mean_and_var: + do_model_average_for_mean_and_var = None + mean = helper.create_parameter( attr=ParamAttr( name=moving_mean_name, initializer=Constant(0.0), trainable=False, - average=average_variance), + do_model_average=do_model_average_for_mean_and_var), shape=param_shape, dtype=input.dtype) mean.stop_gradient = True @@ -1534,7 +1536,7 @@ def batch_norm(input, name=moving_variance_name, initializer=Constant(1.0), trainable=False, - average=average_mean), + do_model_average=do_model_average_for_mean_and_var), shape=param_shape, dtype=input.dtype) variance.stop_gradient = True @@ -3352,14 +3354,14 @@ def reshape(x, shape, actual_shape=None, act=None, inplace=True, name=None): Here are some examples to explain it. 1. Given a 3-D tensor x with a shape [2, 4, 6], and the target shape - is [6, 8], the reshape operator will transform x into a 2-D tensor with + is [6, 8], the reshape operator will transform x into a 2-D tensor with shape [6, 8] and leaving x's data unchanged. 2. Given a 3-D tensor x with a shape [2, 4, 6], and the target shape specified is [2, 3, -1, 2], the reshape operator will transform x into a 4-D tensor with shape [2, 3, 4, 2] and leaving x's data unchanged. In this - case, one dimension of the target shape is set to -1, the value of this - dimension is inferred from the total element number of x and remaining + case, one dimension of the target shape is set to -1, the value of this + dimension is inferred from the total element number of x and remaining dimensions. 3. Given a 3-D tensor x with a shape [2, 4, 6], and the target shape @@ -3593,7 +3595,7 @@ def lrn(input, n=5, k=1.0, alpha=1e-4, beta=0.75, name=None): def pad(x, paddings, pad_value=0., name=None): """ Pads a tensor with a constant value given by :attr:`pad_value`, and the - padded width is specified by :attr:`paddings`. + padded width is specified by :attr:`paddings`. Specifically, the number of values padded before the contents of :attr:`x` in dimension :attr:`i` is indicated by :attr:`paddings[i]`, and the number @@ -3621,7 +3623,7 @@ def pad(x, paddings, pad_value=0., name=None): x (Variable): The input tensor variable. paddings (list): A list of integers. Its elements specify the padded width before and after for each dimension in turn. - The length of :attr:paddings must be + The length of :attr:paddings must be :math:`rank(x) \\times 2`. pad_value (float): The constant value used to pad. name(str|None): A name for this layer(optional). If set None, the layer diff --git a/python/paddle/fluid/optimizer.py b/python/paddle/fluid/optimizer.py index 560257a356..1917b7d044 100644 --- a/python/paddle/fluid/optimizer.py +++ b/python/paddle/fluid/optimizer.py @@ -840,7 +840,7 @@ class ModelAverage(Optimizer): """ def __init__(self, - average_window_rate=0.15, + average_window_rate, params_grads=None, min_average_window=10000, max_average_window=10000, @@ -856,7 +856,7 @@ class ModelAverage(Optimizer): params[param.name] = (param, grad) for param in framework.default_main_program().global_block( ).all_parameters(): - if param.name not in params and param.average: + if param.name not in params and param.do_model_average != False: grad = param.block.create_var( name=unique_name.generate(".".join([param.name, 'tmp'])), dtype=param.dtype, diff --git a/python/paddle/fluid/param_attr.py b/python/paddle/fluid/param_attr.py index 74b968f8ee..1c6970441b 100644 --- a/python/paddle/fluid/param_attr.py +++ b/python/paddle/fluid/param_attr.py @@ -29,14 +29,14 @@ class ParamAttr(object): regularizer=None, trainable=True, gradient_clip=None, - average=True): + do_model_average=None): self.name = name self.initializer = initializer self.learning_rate = learning_rate self.regularizer = regularizer self.trainable = trainable self.gradient_clip = gradient_clip - self.average = average + self.model_average = do_model_average def set_default_initializer(self, initializer): if initializer is None: @@ -83,7 +83,7 @@ class ParamAttr(object): 'regularizer': self.regularizer, 'trainable': self.trainable, 'gradient_clip_attr': self.gradient_clip, - 'average': self.average + 'model_average': self.model_average } if with_initializer: kwargs['initializer'] = self.initializer From 442c150333ce169b9e1221c0f2e61af8cfdc1e2b Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 4 Apr 2018 20:35:59 +0800 Subject: [PATCH 027/164] a draft of ThreadedReader --- .../reader/create_threaded_reader_op.cc | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 paddle/fluid/operators/reader/create_threaded_reader_op.cc diff --git a/paddle/fluid/operators/reader/create_threaded_reader_op.cc b/paddle/fluid/operators/reader/create_threaded_reader_op.cc new file mode 100644 index 0000000000..a4aebafa8b --- /dev/null +++ b/paddle/fluid/operators/reader/create_threaded_reader_op.cc @@ -0,0 +1,125 @@ +// 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/detail/safe_ref.h" +#include "paddle/fluid/operators/reader/reader_op_registry.h" + +namespace paddle { +namespace operators { +namespace reader { + +class ThreadedReader : public framework::DecoratedReader { + public: + ThreadedReader(ReaderBase* reader, bool unsafe_mode) + : DecoratedReader(reader), unsafe_mode_(unsafe_mode) {} + + void ReadNext(std::vector* out) override { + std::lock_guard lock(mutex_); + if (!unsafe_mode) { + if (!reader_->HasNext()) { + PADDLE_THROW("There is no next data!"); + } + reader_->ReadNext(out); + } else { + auto& thread_buffer = thread_buffers_[std::this_thread::get_id()]; + if (thread_buffer.empty()) { + PADDLE_THROW( + "thread_buffer is empty! HasNext() must be invoked before " + "ReadNext() in the same thread."); + } + *out = thread_buffer; + thread_buffer.clear(); + } + } + + bool HasNext() const override { + if (!unsafe_mode_) { + PADDLE_THROW( + "ThreadedReader::HasNext() is disabled when 'unsafe_mode' is false."); + } + std::thread::id thread_id = std::this_thread::get_id(); + std::lock_guard lock(mutex_); + auto& thread_buffer = thread_buffers_[thread_id]; + if (thread_buffer.empty() && reader_->HasNext()) { + reader_->ReadNext(&thread_buffer); + } + return !threda_buffer.empty(); + } + + void ReInit() override; + + ~ThreadedReader() { + for (auto& p : thread_buffers_) { + if (!p.second.empty()) { + PADDLE_THROW( + "Find an unused data batch in ThreadedReader! Maybe one thread " + "invokes 'HasNext()' without subsequent 'ReadNext()'."); + } + } + } + + private: + mutable std::mutex mutex_; + mutable std::unordered_map> + thread_buffers_; +}; + +class CreateThreadedReaderOp : public framework::OperatorBase { + public: + using framework::OperatorBase::OperatorBase; + + private: + void RunImpl(const framework::Scope& scope, + const platform::Place& dev_place) const override { + auto* out = detail::Ref(scope.FindVar(Output("Out"))) + .GetMutable(); + if (out->Get() != nullptr) { + return; + } + const auto& underlying_reader = scope.FindVar(Input("UnderlyingReader")) + ->Get(); + bool unsafe_mode = Attr("unsafe_mode"); + out->Reset(new ThreadedReader(underlying_reader.Get(), unsafe_mode)); + } +}; + +class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { + public: + CreateThreadedReaderOpMaker(OpProto* op_proto, OpAttrChecker* op_checker) + : DecoratedReaderMakerBase(op_proto, op_checker) { + AddAttr("unsafe_mode", + "When 'unsafe_mode' is false, invoking 'HasNext()' or " + "'ReInit()' is not allowed to avoid unexpected bugs in " + "multi-thread environment.") + .SetDefault(false); + AddComment(R"DOC( + CreateThreadedReader Operator + + This operator creates a threaded reader. A threaded reader's + 'ReadNext()' can be invoked by several threads at the same + time. + When the attribute 'unsafe_mode' is false, the threaded reader's + 'HasNext()' and 'ReInit()' will be disabled to avoid unexpected + bugs in multi-thread environment. If you really need them, you + can enable them by setting 'unsafe_mode' true. In this case, + 'HasNext()' returning true only guarantees the safety of + invoking 'ReadNext()' in the same thread. Each thread must + invoke 'HasNext()' and 'ReadNext()' in pair. + )DOC") + } +}; + +} // namespace reader +} // namespace operators +} // namespace paddle From 2d324b62a40b2ebce7325d4a7822225bad7cd505 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Thu, 5 Apr 2018 19:05:27 -0700 Subject: [PATCH 028/164] GA for creating and cleaning instances --- .../paddle_banchmarking_aws.py | 189 +++++++++++------- tools/aws_benchmarking/pserver.sh.template | 3 +- tools/aws_benchmarking/trainer.sh.template | 3 +- 3 files changed, 116 insertions(+), 79 deletions(-) diff --git a/tools/aws_benchmarking/paddle_banchmarking_aws.py b/tools/aws_benchmarking/paddle_banchmarking_aws.py index c63e4b0742..68285406c4 100644 --- a/tools/aws_benchmarking/paddle_banchmarking_aws.py +++ b/tools/aws_benchmarking/paddle_banchmarking_aws.py @@ -17,7 +17,7 @@ import os import json import math import time -import base64 +import threading import netaddr import boto3 @@ -29,16 +29,11 @@ import paramiko parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( - '--key_name', - type=str, - default="", - required=True, - help="required, key pair name") + '--key_name', type=str, default="", help="required, key pair name") parser.add_argument( '--security_group_id', type=str, default="", - required=True, help="required, the security group id associated with your VPC") parser.add_argument( @@ -55,13 +50,13 @@ parser.add_argument( parser.add_argument( '--pserver_instance_type', type=str, - default="p2.xlarge", - help="your pserver instance type") + default="p2.8xlarge", + help="your pserver instance type, p2.8xlarge by default") parser.add_argument( '--trainer_instance_type', type=str, - default="p2.xlarge", - help="your trainer instance type") + default="p2.8xlarge", + help="your trainer instance type, p2.8xlarge by default") parser.add_argument( '--task_name', @@ -71,13 +66,21 @@ parser.add_argument( parser.add_argument( '--pserver_image_id', type=str, - default="ami-1ae93962", - help="ami id for system image, default one has nvidia-docker ready") + default="ami-da2c1cbf", + help="ami id for system image, default one has nvidia-docker ready, use ami-1ae93962 for us-east-2" +) parser.add_argument( '--trainer_image_id', type=str, - default="ami-1ae93962", - help="ami id for system image, default one has nvidia-docker ready") + default="ami-da2c1cbf", + help="ami id for system image, default one has nvidia-docker ready, use ami-1ae93962 for us-west-2" +) + +parser.add_argument( + '--availability_zone', + type=str, + default="us-east-2a", + help="aws zone id to place ec2 instances") parser.add_argument( '--trainer_count', type=int, default=1, help="Trainer count") @@ -88,17 +91,18 @@ parser.add_argument( parser.add_argument( '--pserver_bash_file', type=str, - required=False, default=os.path.join(os.path.dirname(__file__), "pserver.sh.template"), help="pserver bash file path") parser.add_argument( '--trainer_bash_file', type=str, - required=False, default=os.path.join(os.path.dirname(__file__), "trainer.sh.template"), help="trainer bash file path") +parser.add_argument( + '--action', type=str, default="create", help="create|cleanup|status") + parser.add_argument('--pem_path', type=str, help="private key file") parser.add_argument( @@ -176,7 +180,9 @@ def create_subnet(): print("trying to create subnet") subnet_desc = ec2client.create_subnet( - CidrBlock=str(subnet_cidr), VpcId=args.vpc_id) + CidrBlock=str(subnet_cidr), + VpcId=args.vpc_id, + AvailabilityZone=args.availability_zone) subnet_id = subnet_desc["Subnet"]["SubnetId"] @@ -211,8 +217,6 @@ def script_to_str(file_path): def run_instances(image_id, instance_type, count, role, cmd=""): - if cmd: - cmd = base64.b64encode(cmd) response = ec2client.run_instances( ImageId=image_id, InstanceType=instance_type, @@ -222,6 +226,7 @@ def run_instances(image_id, instance_type, count, role, cmd=""): DryRun=False, InstanceInitiatedShutdownBehavior="stop", KeyName=args.key_name, + Placement={'AvailabilityZone': args.availability_zone}, NetworkInterfaces=[{ 'DeviceIndex': 0, 'SubnetId': args.subnet_id, @@ -270,59 +275,94 @@ def run_instances(image_id, instance_type, count, role, cmd=""): def create_pservers(): - return run_instances( - image_id=args.pserver_image_id, - instance_type=args.pserver_instance_type, - count=args.pserver_count, - role="PSERVER", ) + try: + return run_instances( + image_id=args.pserver_image_id, + instance_type=args.pserver_instance_type, + count=args.pserver_count, + role="PSERVER", ) + except Exception, e: + print e + cleanup(args.task_name) def create_trainers(kickoff_cmd, pserver_endpoints_str): - responses = [] - for i in xrange(args.trainer_count): - cmd = kickoff_cmd.format( - PSERVER_HOSTS=pserver_endpoints_str, - DOCKER_IMAGE=args.docker_image, - TRAINER_INDEX=str(i)) - print(cmd) - responses.append( - run_instances( - image_id=args.trainer_image_id, - instance_type=args.trainer_instance_type, - count=1, - role="TRAINER", - cmd=cmd, )[0]) - return responses + try: + responses = [] + for i in xrange(args.trainer_count): + cmd = kickoff_cmd.format( + PSERVER_HOSTS=pserver_endpoints_str, + DOCKER_IMAGE=args.docker_image, + TRAINER_INDEX=str(i)) + print(cmd) + responses.append( + run_instances( + image_id=args.trainer_image_id, + instance_type=args.trainer_instance_type, + count=1, + role="TRAINER", + cmd=cmd, )[0]) + return responses + except Exception, e: + print e + cleanup(args.task_name) def cleanup(task_name): #shutdown all ec2 instances - instances = ec2client.describe_instances(Filters=[{ - "Name": "tag", - "Value": "Task_name=" + task_name + instances_response = ec2client.describe_instances(Filters=[{ + "Name": "tag:Task_name", + "Values": [task_name] }]) instance_ids = [] - for instance in instances["Reservations"][0]["Instances"]: - instance_ids.append(instance["InstanceId"]) + if len(instances_response["Reservations"]) > 0: + for reservation in instances_response["Reservations"]: + for instance in reservation["Instances"]: + instance_ids.append(instance["InstanceId"]) - ec2client.stop_instances(InstanceIds=instance_ids) + ec2client.terminate_instances(InstanceIds=instance_ids) - instance_stop_waiter = ec2client.get_waiter('instance_stopped') - instance_stop_waiter.wait(InstanceIds=instance_ids) + instance_termination_waiter = ec2client.get_waiter( + 'instance_terminated') + instance_termination_waiter.wait(InstanceIds=instance_ids) - #delete the subnet created +#delete the subnet created subnet = ec2client.describe_subnets(Filters=[{ - "Name": "tag", - "Value": "Task_name=" + task_name + "Name": "tag:Task_name", + "Values": [task_name] }]) - ec2client.delete_subnet(SubnetId=subnet["Subnets"][0]["SubnetId"]) + if len(subnet["Subnets"]) > 0: + ec2client.delete_subnet(SubnetId=subnet["Subnets"][0]["SubnetId"]) # no subnet delete waiter, just leave it. return +def kickoff_pserver(host, pserver_endpoints_str): + try: + ssh_key = paramiko.RSAKey.from_private_key_file(args.pem_path) + ssh_client = paramiko.SSHClient() + ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh_client.connect(hostname=host, username="ubuntu", pkey=ssh_key) + cmd = (script_to_str(args.pserver_bash_file)).format( + PSERVER_HOSTS=pserver_endpoints_str, + DOCKER_IMAGE=args.docker_image, + PSERVER_PORT=args.pserver_port) + print(cmd) + stdin, stdout, stderr = ssh_client.exec_command(command=cmd) + return_code = stdout.channel.recv_exit_status() + print(return_code) + if return_code != 0: + raise Exception("Error while kicking off pserver training process") + except Exception, e: + print e + cleanup(args.task_name) + finally: + ssh_client.close() + + def main(): if not args.task_name: args.task_name = generate_task_name() @@ -349,37 +389,25 @@ def main(): pserver_endpoints_str = ",".join(pserver_endpoints) - # ssh to pservers to start training - ssh_key = paramiko.RSAKey.from_private_key_file(args.pem_path) - ssh_client = paramiko.SSHClient() - ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - print("kicking off pserver training process") + pserver_threads = [] for pserver in pserver_create_response: - try: - ssh_client.connect( - hostname=pserver["PublicIpAddress"], - username="ubuntu", - pkey=ssh_key) - cmd = (script_to_str(args.pserver_bash_file)).format( - PSERVER_HOSTS=pserver_endpoints_str, - DOCKER_IMAGE=args.docker_image) - print(cmd) - stdin, stdout, stderr = ssh_client.exec_command(command=cmd) - if stderr.read(): - raise Exception( - "Error while kicking off pserver training process") - #print(stdout.read()) - except Exception, e: - print e - cleanup(args.task_name) - finally: - ssh_client.close() + pserver_thread = threading.Thread( + target=kickoff_pserver, + args=(pserver["PublicIpAddress"], pserver_endpoints_str)) + pserver_thread.start() + pserver_threads.append(pserver_thread) + + for pserver_thread in pserver_threads: + pserver_thread.join() + + print("all pserver training process started") print("creating trainers and kicking off trainer training process") create_trainers( kickoff_cmd=script_to_str(args.trainer_bash_file), pserver_endpoints_str=pserver_endpoints_str) + print("trainers created") def print_arguments(): @@ -391,4 +419,11 @@ def print_arguments(): if __name__ == "__main__": print_arguments() - main() + if args.action == "create": + if not args.key_name or not args.security_group_id: + raise ValueError("key_name and security_group_id are required") + main() + elif args.action == "cleanup": + if not args.task_name: + raise ValueError("task_name is required") + cleanup(args.task_name) diff --git a/tools/aws_benchmarking/pserver.sh.template b/tools/aws_benchmarking/pserver.sh.template index ddfe2f9d31..e6642c2db4 100644 --- a/tools/aws_benchmarking/pserver.sh.template +++ b/tools/aws_benchmarking/pserver.sh.template @@ -1 +1,2 @@ -nvidia-docker run -i -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file +#!/bin/bash +nvidia-docker run -p {PSERVER_PORT}:{PSERVER_PORT} -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file diff --git a/tools/aws_benchmarking/trainer.sh.template b/tools/aws_benchmarking/trainer.sh.template index 70aceb8814..05a7d3b91d 100644 --- a/tools/aws_benchmarking/trainer.sh.template +++ b/tools/aws_benchmarking/trainer.sh.template @@ -1 +1,2 @@ -nvidia-docker run -i -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file +#!/bin/bash +nvidia-docker run -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file From 01c6618de904e1d49660486cd65f8810cc9665a3 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Sun, 8 Apr 2018 09:38:26 +0800 Subject: [PATCH 029/164] first wip commit --- .../fluid/framework/details/send_op_handle.cc | 78 +++++++++++++++++++ .../fluid/framework/details/send_op_handle.h | 50 ++++++++++++ paddle/fluid/operators/detail/grpc_client.cc | 3 +- 3 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 paddle/fluid/framework/details/send_op_handle.cc create mode 100644 paddle/fluid/framework/details/send_op_handle.h diff --git a/paddle/fluid/framework/details/send_op_handle.cc b/paddle/fluid/framework/details/send_op_handle.cc new file mode 100644 index 0000000000..bd2a0a9c29 --- /dev/null +++ b/paddle/fluid/framework/details/send_op_handle.cc @@ -0,0 +1,78 @@ +// 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/send_op_handle.h" + +namespace paddle { +namespace framework { +namespace details { + +SendOpHandle::SendOpHandle(const std::vector &local_scopes, + const std::vector &places, + const platform::NCCLContextMap &ctxs) + : local_scopes_(local_scopes), places_(places) {} + +void SendOpHandle::RunImpl() { + if (inputs_.size() == 1) { + return; // No need to all reduce when GPU count = 1; + } else { + // Wait input done + for (auto *in : inputs_) { + auto &p = static_cast(in)->place_; + in->generated_op_->Wait(dev_ctxes_[p]); + } + + auto &var_name = static_cast(this->inputs_[0])->name_; + int dtype = -1; + size_t numel = 0; + + std::vector> all_reduce_calls; + + for (size_t i = 0; i < local_scopes_.size(); ++i) { + auto &p = places_[i]; + auto *s = local_scopes_[i]; + int dev_id = boost::get(p).device; + + auto &lod_tensor = s->FindVar(var_name)->Get(); + void *buffer = const_cast(lod_tensor.data()); + + if (dtype == -1) { + dtype = platform::ToNCCLDataType(lod_tensor.type()); + } + + if (numel == 0) { + numel = static_cast(lod_tensor.numel()); + } + + auto &nccl_ctx = nccl_ctxs_.at(dev_id); + auto stream = nccl_ctx.stream(); + auto comm = nccl_ctx.comm_; + all_reduce_calls.emplace_back([=] { + PADDLE_ENFORCE(platform::dynload::ncclAllReduce( + buffer, buffer, numel, static_cast(dtype), ncclSum, + comm, stream)); + }); + } + + platform::NCCLGroupGuard guard; + for (auto &call : all_reduce_calls) { + call(); + } + } +} + +std::string NCCLAllReduceOpHandle::Name() const { return "nccl_all_reduce"; } +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/send_op_handle.h b/paddle/fluid/framework/details/send_op_handle.h new file mode 100644 index 0000000000..515f1a10a8 --- /dev/null +++ b/paddle/fluid/framework/details/send_op_handle.h @@ -0,0 +1,50 @@ +// 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 "paddle/fluid/framework/details/op_handle_base.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/platform/nccl_helper.h" + +namespace paddle { +namespace framework { +namespace details { + +struct SendOpHandle : public OpHandleBase { + const std::vector &local_scopes_; + const std::vector &places_; + const platform::NCCLContextMap &nccl_ctxs_; + + SendOpHandle(const std::vector &local_scopes, + const std::vector &places, + const platform::NCCLContextMap &ctxs); + + std::string Name() const override; + + // Delay and buffer nccl_all_reduce together can significantly increase + // performance. Disable this feature by returning false. + bool IsMultiDeviceTransfer() override { return true; }; + + protected: + void RunImpl() override; +}; + +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/operators/detail/grpc_client.cc b/paddle/fluid/operators/detail/grpc_client.cc index ef987d07f0..3cf286575e 100644 --- a/paddle/fluid/operators/detail/grpc_client.cc +++ b/paddle/fluid/operators/detail/grpc_client.cc @@ -65,9 +65,8 @@ bool RPCClient::AsyncSendVariable(const std::string& ep, } void ProcGetResponse(const VarHandle& var_h, - // const sendrecv::VariableMessage& ret_msg) { const ::grpc::ByteBuffer& ret_msg) { - framework::Variable* outvar = NULL; + framework::Variable* outvar = nullptr; DeserializeFromByteBuffer(ret_msg, *var_h.ctx, var_h.scope, &outvar); } From 8fed780f14bf24954300ba37cebd2338ee7d199c Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Sun, 8 Apr 2018 11:26:06 +0800 Subject: [PATCH 030/164] Complete threaded reader --- paddle/fluid/operators/reader/CMakeLists.txt | 1 + .../operators/reader/create_threaded_reader_op.cc | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/operators/reader/CMakeLists.txt b/paddle/fluid/operators/reader/CMakeLists.txt index 6fa0195b9a..845528860f 100644 --- a/paddle/fluid/operators/reader/CMakeLists.txt +++ b/paddle/fluid/operators/reader/CMakeLists.txt @@ -22,5 +22,6 @@ reader_library(create_batch_reader_op SRCS create_batch_reader_op.cc) reader_library(create_recordio_file_reader_op SRCS create_recordio_file_reader_op.cc) reader_library(create_double_buffer_reader_op SRCS create_double_buffer_reader_op.cc) reader_library(create_multi_pass_reader_op SRCS create_multi_pass_reader_op.cc) +reader_library(create_threaded_reader_op SRCS create_threaded_reader_op.cc) # Export local libraries to parent set(READER_LIBRARY ${LOCAL_READER_LIBS} PARENT_SCOPE) diff --git a/paddle/fluid/operators/reader/create_threaded_reader_op.cc b/paddle/fluid/operators/reader/create_threaded_reader_op.cc index a4aebafa8b..489866ca80 100644 --- a/paddle/fluid/operators/reader/create_threaded_reader_op.cc +++ b/paddle/fluid/operators/reader/create_threaded_reader_op.cc @@ -57,7 +57,15 @@ class ThreadedReader : public framework::DecoratedReader { return !threda_buffer.empty(); } - void ReInit() override; + void ReInit() override { + if (!unsafe_mode_) { + PADDLE_THROW( + "ThreadedReader::ReInit() is disabled when 'unsafe_mode' is false."); + } + VLOG(5) << "ThreadedReader::ReInit() is invoked! It might be buggy in " + "multi-thread environment."; + reader_->ReInit(); + } ~ThreadedReader() { for (auto& p : thread_buffers_) { @@ -123,3 +131,8 @@ class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { } // namespace reader } // namespace operators } // namespace paddle + +namespace reader = paddle::operators::reader; +REGISTER_FILE_READER_OPERATOR(create_threaded_reader, + reader::CreateThreadedReaderOp, + reader::CreateThreadedReaderOpMaker); From 03ff0e58fe433496330801627e0ae2f15e21df20 Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Sun, 8 Apr 2018 04:25:56 +0000 Subject: [PATCH 031/164] fix compile errors --- paddle/fluid/operators/reader/create_threaded_reader_op.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/operators/reader/create_threaded_reader_op.cc b/paddle/fluid/operators/reader/create_threaded_reader_op.cc index 489866ca80..565cbe4d9f 100644 --- a/paddle/fluid/operators/reader/create_threaded_reader_op.cc +++ b/paddle/fluid/operators/reader/create_threaded_reader_op.cc @@ -26,7 +26,7 @@ class ThreadedReader : public framework::DecoratedReader { void ReadNext(std::vector* out) override { std::lock_guard lock(mutex_); - if (!unsafe_mode) { + if (!unsafe_mode_) { if (!reader_->HasNext()) { PADDLE_THROW("There is no next data!"); } @@ -54,7 +54,7 @@ class ThreadedReader : public framework::DecoratedReader { if (thread_buffer.empty() && reader_->HasNext()) { reader_->ReadNext(&thread_buffer); } - return !threda_buffer.empty(); + return !thread_buffer.empty(); } void ReInit() override { @@ -78,6 +78,7 @@ class ThreadedReader : public framework::DecoratedReader { } private: + bool unsafe_mode_; mutable std::mutex mutex_; mutable std::unordered_map> thread_buffers_; @@ -124,7 +125,7 @@ class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { 'HasNext()' returning true only guarantees the safety of invoking 'ReadNext()' in the same thread. Each thread must invoke 'HasNext()' and 'ReadNext()' in pair. - )DOC") + )DOC"); } }; From 49ab52d64d8aced5da6d4eedd34773baebae5546 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Sun, 8 Apr 2018 13:01:26 +0800 Subject: [PATCH 032/164] Modify MultipleReader 1. Removes MultipleReader's multi-thread support, for we have got ThreadedReader. 2. Rename MultipleReader to MultiFileReader --- .../reader/create_threaded_reader_op.cc | 2 +- .../fluid/operators/reader/open_files_op.cc | 66 +++++++------------ 2 files changed, 24 insertions(+), 44 deletions(-) diff --git a/paddle/fluid/operators/reader/create_threaded_reader_op.cc b/paddle/fluid/operators/reader/create_threaded_reader_op.cc index 565cbe4d9f..854381e0ee 100644 --- a/paddle/fluid/operators/reader/create_threaded_reader_op.cc +++ b/paddle/fluid/operators/reader/create_threaded_reader_op.cc @@ -124,7 +124,7 @@ class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { can enable them by setting 'unsafe_mode' true. In this case, 'HasNext()' returning true only guarantees the safety of invoking 'ReadNext()' in the same thread. Each thread must - invoke 'HasNext()' and 'ReadNext()' in pair. + invoke 'HasNext()' and 'ReadNext()' in pairs. )DOC"); } }; diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index db4e619e7b..45db94e780 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -19,27 +19,11 @@ namespace paddle { namespace operators { namespace reader { -class MultipleReader : public framework::ReaderBase { +class MultiFileReader : public framework::ReaderBase { public: - class ThreadBufferMap { - public: - std::vector& operator[]( - const std::thread::id& thread_id) { - std::lock_guard lock(mutex_); - return buffer_[thread_id]; - } - - void Clear() { buffer_.clear(); } - - private: - std::mutex mutex_; - std::unordered_map> - buffer_; - }; - - MultipleReader(const std::vector& file_names, - const std::vector& dims, size_t thread_num, - size_t buffer_size) + 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) { prefetchers_.resize(thread_num); StartNewScheduler(); @@ -49,7 +33,7 @@ class MultipleReader : public framework::ReaderBase { bool HasNext() const override; void ReInit() override; - ~MultipleReader() { EndScheduler(); } + ~MultiFileReader() { EndScheduler(); } private: void StartNewScheduler(); @@ -65,31 +49,27 @@ class MultipleReader : public framework::ReaderBase { framework::Channel* waiting_file_idx_; framework::Channel* available_thread_idx_; framework::Channel>* buffer_; - mutable ThreadBufferMap thread_buffer_map_; }; -void MultipleReader::ReadNext(std::vector* out) { +void MultiFileReader::ReadNext(std::vector* out) { if (!HasNext()) { PADDLE_THROW("There is no next data!"); } - auto& thread_local_buffer = thread_buffer_map_[std::this_thread::get_id()]; - *out = thread_local_buffer; - thread_local_buffer.clear(); + buffer_->Receive(out); } -bool MultipleReader::HasNext() const { - auto& thread_local_buffer = thread_buffer_map_[std::this_thread::get_id()]; - return thread_local_buffer.empty() ? buffer_->Receive(&thread_local_buffer) - : true; +bool MultiFileReader::HasNext() const { + while (!buffer_->IsClosed() && !buffer_->CanReceive()) { + } + return buffer_->CanReceive(); } -void MultipleReader::ReInit() { +void MultiFileReader::ReInit() { EndScheduler(); - thread_buffer_map_.Clear(); StartNewScheduler(); } -void MultipleReader::StartNewScheduler() { +void MultiFileReader::StartNewScheduler() { size_t thread_num = prefetchers_.size(); waiting_file_idx_ = framework::MakeChannel(file_names_.size()); available_thread_idx_ = framework::MakeChannel(thread_num); @@ -107,7 +87,7 @@ void MultipleReader::StartNewScheduler() { scheduler_ = std::thread([this] { ScheduleThreadFunc(); }); } -void MultipleReader::EndScheduler() { +void MultiFileReader::EndScheduler() { available_thread_idx_->Close(); buffer_->Close(); waiting_file_idx_->Close(); @@ -119,8 +99,8 @@ void MultipleReader::EndScheduler() { delete waiting_file_idx_; } -void MultipleReader::ScheduleThreadFunc() { - VLOG(5) << "MultipleReader schedule thread starts."; +void MultiFileReader::ScheduleThreadFunc() { + VLOG(5) << "MultiFileReader schedule thread starts."; size_t completed_thread_num = 0; size_t thread_idx; while (available_thread_idx_->Receive(&thread_idx)) { @@ -152,11 +132,11 @@ void MultipleReader::ScheduleThreadFunc() { p.join(); } } - VLOG(5) << "MultipleReader schedule thread terminates."; + VLOG(5) << "MultiFileReader schedule thread terminates."; } -void MultipleReader::PrefetchThreadFunc(std::string file_name, - size_t thread_idx) { +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_); @@ -203,9 +183,9 @@ class OpenFilesOp : public framework::OperatorBase { auto* out = scope.FindVar(Output("Out")) ->template GetMutable(); - out->Reset(new MultipleReader(file_names, - RestoreShapes(shape_concat, ranks), - thread_num, buffer_size)); + out->Reset(new MultiFileReader(file_names, + RestoreShapes(shape_concat, ranks), + thread_num, buffer_size)); } }; @@ -221,7 +201,7 @@ class OpenFilesOpMaker : public FileReaderMakerBase { AddComment(R"DOC( OpenFiles Operator - An OpenFilesOp creates a MultipleReader, which is able to + An OpenFilesOp creates a MultiFileReader, which is able to read data multi-threaded from multiple files. )DOC"); } From a9e826ed495bcd5a5b625d4ce364c8c42d0d0b7d Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Sun, 8 Apr 2018 06:32:30 +0000 Subject: [PATCH 033/164] Add the check of has_feed/fetch_operators back. --- paddle/fluid/framework/executor.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/paddle/fluid/framework/executor.cc b/paddle/fluid/framework/executor.cc index 8a0ab118d0..3edaede8d6 100644 --- a/paddle/fluid/framework/executor.cc +++ b/paddle/fluid/framework/executor.cc @@ -352,13 +352,17 @@ void Executor::RunPreparedContext( bool create_vars) { auto& global_block = ctx->prog_.Block(ctx->block_id_); + PADDLE_ENFORCE( + has_feed_operators(global_block, feed_targets, feed_holder_name), + "Program in ExecutorPrepareContext should has feed_ops."); + PADDLE_ENFORCE( + has_fetch_operators(global_block, fetch_targets, fetch_holder_name), + "Program in the prepared context should has fetch_ops."); + // map the data of feed_targets to feed_holder for (auto* op : global_block.AllOps()) { if (op->Type() == kFeedOpType) { std::string feed_target_name = op->Output("Out")[0]; - PADDLE_ENFORCE(feed_targets.find(feed_target_name) != feed_targets.end(), - "Variable %s is not feeded."); - int idx = boost::get(op->GetAttr("col")); SetFeedVariable(scope, *feed_targets[feed_target_name], feed_holder_name, idx); @@ -371,10 +375,6 @@ void Executor::RunPreparedContext( for (auto* op : global_block.AllOps()) { if (op->Type() == kFetchOpType) { std::string fetch_target_name = op->Input("X")[0]; - PADDLE_ENFORCE( - fetch_targets.find(fetch_target_name) != fetch_targets.end(), - "Variable %s is not fetched."); - int idx = boost::get(op->GetAttr("col")); *fetch_targets[fetch_target_name] = GetFetchVariable(*scope, fetch_holder_name, idx); From fca9e8847d5017601251ee8813e7af513b2603ed Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Sun, 8 Apr 2018 16:10:14 +0800 Subject: [PATCH 034/164] Update Readers Python API 1. Combine 'open_files', 'multi_pass_reader' and 'threaded_reader' together to make the new 'open_files' interface. 2. Add some docstring. 3. Simplify interface names of 'create_XXX_reader', e.g, rename 'create_double_buffer_reader' to 'double_buffer'. --- python/paddle/fluid/layers/io.py | 109 ++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 24 deletions(-) diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index 7413e69234..fc8809ce15 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -22,7 +22,7 @@ from ..executor import global_scope __all__ = [ 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_file', 'open_files', 'read_file', 'create_shuffle_reader', - 'create_double_buffer_reader', 'create_multi_pass_reader' + 'create_double_buffer_reader' ] @@ -283,7 +283,43 @@ def _copy_reader_create_op_(block, op): return new_op -def open_recordio_file(filename, shapes, lod_levels, dtypes): +def open_recordio_file(filename, + shapes, + lod_levels, + dtypes, + pass_num=1, + for_parallel=False): + """ + Open a RecordIO file + + This layer takes a RecordIO file to read from and returns a Reader Variable. + Via the Reader Variable, we can get data from the given RecordIO file. + + Args: + 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. + pass_num(int): Number of passes to run. After completing the + given number of passes, 'has_next()' will return False. + for_parallel(Bool): Set it as True if you are going to run + subsequent operators in parallel. + + Returns: + Variable: A Reader Variable via which we can get RecordIO file data. + + Examples: + .. code-block:: python + + reader = fluid.layers.io.open_recordio_file( + filename='./data.recordio', + shapes=[(3,224,224), (1)], + lod_levels=[0, 0], + dtypes=['float32', 'int64']) + + # Via the reader, we can use 'read_file' layer to get data: + image, label = fluid.layers.read_file(reader) + """ dtypes = [convert_np_dtype_to_dtype_(dt) for dt in dtypes] shape_concat = [] ranks = [] @@ -310,6 +346,13 @@ def open_recordio_file(filename, shapes, lod_levels, dtypes): startup_var.persistable = True main_prog_var = _copy_reader_var_(default_main_program().current_block(), startup_var) + + if pass_num > 1: + main_prog_var = multi_pass(reader=main_prog_var, pass_num=pass_num) + + if for_parallel: + main_prog_var = for_parallel(reader=main_prog_var) + return monkey_patch_reader_methods(main_prog_var) @@ -318,11 +361,15 @@ def open_files(filenames, lod_levels, dtypes, thread_num, - buffer_size=None): + buffer_size=None, + pass_num=1, + for_parallel=False): """ Open files - This layer takes a list of files to read from and returns a Reader Variable. Via the Reader Variable, we can get data from given files. + This layer takes a list of files to read from and returns a Reader Variable. + Via the Reader Variable, we can get data from given files. All files must + have name suffixs to indicate their formats, e.g., '*.recordio'. Args: filenames(list): The list of file names. @@ -331,6 +378,10 @@ def open_files(filenames, dtypes(list): List of strs which declaring data type. thread_num(int): The maximal concurrent prefetch thread number. buffer_size(int): The size of prefetch buffer. + pass_num(int): Number of passes to run. After completing the + given number of passes, 'has_next()' will return False. + for_parallel(Bool): Set it as True if you are going to run + subsequent operators in parallel. Returns: Variable: A Reader Variable via which we can get file data. @@ -338,16 +389,16 @@ def open_files(filenames, Examples: .. code-block:: python - reader = fluid.layers.open_files(filenames=['./data1.recordio', + reader = fluid.layers.io.open_files(filenames=['./data1.recordio', './data2.recordio'], - shapes=[(3,224,224), (1)], - lod_levels=[0, 0], - dtypes=['float32', 'int64'], - thread_num=2, - buffer_size=2) + shapes=[(3,224,224), (1)], + lod_levels=[0, 0], + dtypes=['float32', 'int64'], + thread_num=2, + buffer_size=2) # Via the reader, we can use 'read_file' layer to get data: - image, label = fluid.layers.read_file(reader) + image, label = fluid.layers.io.read_file(reader) """ if buffer_size is None: buffer_size = thread_num @@ -361,13 +412,12 @@ def open_files(filenames, shape_concat.extend(shape) ranks.append(len(shape)) - var_name = unique_name('multiple_reader') - + multi_file_reader_name = unique_name('multi_file_reader') startup_blk = default_startup_program().current_block() - startup_var = startup_blk.create_var(name=var_name) + startup_reader = startup_blk.create_var(name=multi_file_reader_name) startup_blk.append_op( type='open_files', - outputs={'Out': [startup_var]}, + outputs={'Out': [startup_reader]}, attrs={ 'shape_concat': shape_concat, 'lod_levels': lod_levels, @@ -377,14 +427,21 @@ def open_files(filenames, 'buffer_size': buffer_size }) - startup_var.desc.set_dtypes(dtypes) - startup_var.persistable = True - main_prog_var = _copy_reader_var_(default_main_program().current_block(), - startup_var) - return monkey_patch_reader_methods(main_prog_var) + startup_reader.desc.set_dtypes(dtypes) + startup_reader.persistable = True + main_prog_reader = _copy_reader_var_(default_main_program().current_block(), + startup_reader) + if pass_num > 1: + main_prog_reader = multi_pass( + reader=main_prog_reader, pass_num=pass_num) + if for_parallel: + main_prog_reader = for_parallel(reader=main_prog_reader) -def __create_decorated_reader__(op_type, reader, attrs): + return monkey_patch_reader_methods(main_prog_reader) + + +def __create_decorated_reader__(op_type, reader, attrs={}): var_name = unique_name(op_type) startup_blk = default_startup_program().current_block() startup_var = startup_blk.create_var(name=var_name) @@ -400,12 +457,12 @@ def __create_decorated_reader__(op_type, reader, attrs): return monkey_patch_reader_methods(main_prog_var) -def create_shuffle_reader(reader, buffer_size): +def shuffle(reader, buffer_size): return __create_decorated_reader__('create_shuffle_reader', reader, {'buffer_size': int(buffer_size)}) -def create_double_buffer_reader(reader, place=None): +def double_buffer(reader, place=None): attrs = dict() if place is not None: attrs['place'] = str(place).upper() @@ -413,11 +470,15 @@ def create_double_buffer_reader(reader, place=None): attrs) -def create_multi_pass_reader(reader, pass_num): +def multi_pass(reader, pass_num): return __create_decorated_reader__('create_multi_pass_reader', reader, {'pass_num': int(pass_num)}) +def for_parallel(reader): + return __create_decorated_reader__('create_threaded_reader', reader) + + def read_file(file_obj): helper = LayerHelper('read_file') out = [ From 5ad2486905214e658a0ef8f54e9b447c1fec03b2 Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Sun, 8 Apr 2018 09:15:58 +0000 Subject: [PATCH 035/164] fix errors --- python/paddle/fluid/layers/io.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index fc8809ce15..dbba1a46eb 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -21,8 +21,7 @@ from ..executor import global_scope __all__ = [ 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_file', - 'open_files', 'read_file', 'create_shuffle_reader', - 'create_double_buffer_reader' + 'open_files', 'read_file', 'shuffle', 'double_buffer' ] From baea2cf17892f2cba47c8bde29bccd7488c2ee52 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Sun, 8 Apr 2018 18:35:49 +0800 Subject: [PATCH 036/164] wip --- paddle/fluid/framework/details/CMakeLists.txt | 1 + .../details/multi_devices_graph_builder.cc | 59 +++++++++++++---- .../details/multi_devices_graph_builder.h | 14 ++++- .../fluid/framework/details/send_op_handle.cc | 63 ++++--------------- .../fluid/framework/details/send_op_handle.h | 15 ++--- python/paddle/fluid/framework.py | 7 +++ 6 files changed, 87 insertions(+), 72 deletions(-) diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index 89b5c6847f..caaf418076 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -5,6 +5,7 @@ cc_library(fetch_op_handle SRCS fetch_op_handle.cc DEPS op_handle_base scope lod nv_library(nccl_all_reduce_op_handle SRCS nccl_all_reduce_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory dynload_cuda) cc_library(computation_op_handle SRCS computation_op_handle.cc DEPS framework_proto scope place operator op_registry) +cc_library(send_op_handle SRCS send_op_handle.cc DEPS framework_proto scope place operator op_registry) cc_library(ssa_graph SRCS ssa_graph.cc DEPS var_handle op_handle_base) cc_library(ssa_graph_builder SRCS ssa_graph_builder.cc DEPS ssa_graph) diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.cc b/paddle/fluid/framework/details/multi_devices_graph_builder.cc index 128a5344fb..bea9489bbd 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.cc +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.cc @@ -15,6 +15,7 @@ #include "paddle/fluid/framework/details/multi_devices_graph_builder.h" #include "paddle/fluid/framework/details/computation_op_handle.h" #include "paddle/fluid/framework/details/scale_loss_grad_op_handle.h" +#include "paddle/fluid/framework/details/send_op_handle.h" #include "paddle/fluid/framework/scope.h" #ifdef PADDLE_WITH_CUDA @@ -34,26 +35,46 @@ MultiDevSSAGraphBuilder::MultiDevSSAGraphBuilder( const std::string &loss_var_name, const std::unordered_set ¶ms, const std::vector &local_scopes, - platform::NCCLContextMap *nccl_ctxs) + platform::NCCLContextMap *nccl_ctxs, bool distributed) : loss_var_name_(loss_var_name), places_(places), local_scopes_(local_scopes), + distributed_(distributed), nccl_ctxs_(nccl_ctxs) { #else MultiDevSSAGraphBuilder::MultiDevSSAGraphBuilder( const std::vector &places, const std::string &loss_var_name, const std::unordered_set ¶ms, - const std::vector &local_scopes) + const std::vector &local_scopes, bool distributed) : loss_var_name_(loss_var_name), places_(places), - local_scopes_(local_scopes) { + local_scopes_(local_scopes), + distributed_(distributed) { #endif for (auto &p : params) { grad_names_.insert(GradVarName(p)); } } +void MultiDevSSAGraphBuilder::CreateOpHandleIOs(SSAGraph *result, OpDesc *op, + const platform::Place &p, + const size_t &i) const { + auto *op_handle = result->ops_.back().get(); + + auto var_names = op->InputArgumentNames(); + + for (auto &each_var_name : var_names) { + VarHandle *var = CreateOrGetLatestVarHandle(result, each_var_name, p, i); + op_handle->AddInput(var); + } + var_names = op->OutputArgumentNames(); + + for (auto &each_var_name : var_names) { + CreateOpOutput(result, op_handle, each_var_name, p, i); + } +} + std::unique_ptr MultiDevSSAGraphBuilder::Build( const ProgramDesc &program) const { auto graph = new SSAGraph(); @@ -72,6 +93,17 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( } } + // append send op if program is distributed trainer main program. + // always use the first device + if (is_forwarding && distributed_ && op->Type() == "send") { + auto &p = places_[0]; + auto *s = local_scopes_[0]; + size_t i = 0; + result.ops_.emplace_back(new SendOpHandle(*op, s, p)); + CreateOpHandleIOs(&result, op, p, i); + continue; + } + for (size_t i = 0; i < places_.size(); ++i) { auto &p = places_[i]; auto *s = local_scopes_[i]; @@ -81,18 +113,19 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( op_handle->dev_ctxes_[p] = const_cast( platform::DeviceContextPool::Instance().Get(p)); - auto var_names = op->InputArgumentNames(); + CreateOpHandleIOs(&result, op, p, i); + // auto var_names = op->InputArgumentNames(); - for (auto &each_var_name : var_names) { - VarHandle *var = - CreateOrGetLatestVarHandle(&result, each_var_name, p, i); - op_handle->AddInput(var); - } - var_names = op->OutputArgumentNames(); + // for (auto &each_var_name : var_names) { + // VarHandle *var = + // CreateOrGetLatestVarHandle(&result, each_var_name, p, i); + // op_handle->AddInput(var); + // } + auto var_names = op->OutputArgumentNames(); - for (auto &each_var_name : var_names) { - CreateOpOutput(&result, op_handle, each_var_name, p, i); - } + // for (auto &each_var_name : var_names) { + // CreateOpOutput(&result, op_handle, each_var_name, p, i); + // } if (is_forwarding) { if (var_names.size() == 1 && var_names[0] == loss_var_name_) { diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.h b/paddle/fluid/framework/details/multi_devices_graph_builder.h index d3c8e582cf..004d6d50ab 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.h +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.h @@ -14,6 +14,9 @@ #pragma once +#include +#include + #include "paddle/fluid/framework/details/ssa_graph_builder.h" namespace paddle { @@ -31,21 +34,28 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { const std::string &loss_var_name, const std::unordered_set ¶ms, const std::vector &local_scopes, - platform::NCCLContextMap *nccl_ctxs); + platform::NCCLContextMap *nccl_ctxs, + bool distributed = false); #else MultiDevSSAGraphBuilder(const std::vector &places, const std::string &loss_var_name, const std::unordered_set ¶ms, - const std::vector &local_scopes); + const std::vector &local_scopes, + bool distributed = false); #endif std::unique_ptr Build(const ProgramDesc &program) const override; + private: + void CreateOpHandleIOs(SSAGraph *result, OpDesc *op, const platform::Place &p, + const size_t &i) const; + private: std::string loss_var_name_; const std::vector &places_; const std::vector &local_scopes_; std::unordered_set grad_names_; + bool distributed_; #ifdef PADDLE_WITH_CUDA platform::NCCLContextMap *nccl_ctxs_; diff --git a/paddle/fluid/framework/details/send_op_handle.cc b/paddle/fluid/framework/details/send_op_handle.cc index bd2a0a9c29..ae5637b804 100644 --- a/paddle/fluid/framework/details/send_op_handle.cc +++ b/paddle/fluid/framework/details/send_op_handle.cc @@ -18,61 +18,24 @@ namespace paddle { namespace framework { namespace details { -SendOpHandle::SendOpHandle(const std::vector &local_scopes, - const std::vector &places, - const platform::NCCLContextMap &ctxs) - : local_scopes_(local_scopes), places_(places) {} +SendOpHandle::SendOpHandle(const framework::OpDesc &op_desc, + const Scope *local_scope, + const platform::Place &place) + : op_(framework::OpRegistry::CreateOp(op_desc)), + local_scope_(local_scope), + place_(place) {} void SendOpHandle::RunImpl() { - if (inputs_.size() == 1) { - return; // No need to all reduce when GPU count = 1; - } else { - // Wait input done - for (auto *in : inputs_) { - auto &p = static_cast(in)->place_; - in->generated_op_->Wait(dev_ctxes_[p]); - } - - auto &var_name = static_cast(this->inputs_[0])->name_; - int dtype = -1; - size_t numel = 0; - - std::vector> all_reduce_calls; - - for (size_t i = 0; i < local_scopes_.size(); ++i) { - auto &p = places_[i]; - auto *s = local_scopes_[i]; - int dev_id = boost::get(p).device; - - auto &lod_tensor = s->FindVar(var_name)->Get(); - void *buffer = const_cast(lod_tensor.data()); - - if (dtype == -1) { - dtype = platform::ToNCCLDataType(lod_tensor.type()); - } - - if (numel == 0) { - numel = static_cast(lod_tensor.numel()); - } - - auto &nccl_ctx = nccl_ctxs_.at(dev_id); - auto stream = nccl_ctx.stream(); - auto comm = nccl_ctx.comm_; - all_reduce_calls.emplace_back([=] { - PADDLE_ENFORCE(platform::dynload::ncclAllReduce( - buffer, buffer, numel, static_cast(dtype), ncclSum, - comm, stream)); - }); - } - - platform::NCCLGroupGuard guard; - for (auto &call : all_reduce_calls) { - call(); - } + // Wait input done + for (auto *in : inputs_) { + auto &p = static_cast(in)->place_; + in->generated_op_->Wait(dev_ctxes_[p]); } + + op_->Run(*local_scope_, place_); } -std::string NCCLAllReduceOpHandle::Name() const { return "nccl_all_reduce"; } +std::string SendOpHandle::Name() const { return "send"; } } // namespace details } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/details/send_op_handle.h b/paddle/fluid/framework/details/send_op_handle.h index 515f1a10a8..e7857c1f23 100644 --- a/paddle/fluid/framework/details/send_op_handle.h +++ b/paddle/fluid/framework/details/send_op_handle.h @@ -19,6 +19,8 @@ #include "paddle/fluid/framework/details/op_handle_base.h" #include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/framework/operator.h" #include "paddle/fluid/framework/scope.h" #include "paddle/fluid/platform/nccl_helper.h" @@ -27,19 +29,18 @@ namespace framework { namespace details { struct SendOpHandle : public OpHandleBase { - const std::vector &local_scopes_; - const std::vector &places_; - const platform::NCCLContextMap &nccl_ctxs_; + std::unique_ptr op_; + const Scope* local_scope_; + const platform::Place& place_; - SendOpHandle(const std::vector &local_scopes, - const std::vector &places, - const platform::NCCLContextMap &ctxs); + SendOpHandle(const framework::OpDesc& op_desc, const Scope* local_scope, + const platform::Place& place); std::string Name() const override; // Delay and buffer nccl_all_reduce together can significantly increase // performance. Disable this feature by returning false. - bool IsMultiDeviceTransfer() override { return true; }; + bool IsMultiDeviceTransfer() override { return false; }; protected: void RunImpl() override; diff --git a/python/paddle/fluid/framework.py b/python/paddle/fluid/framework.py index 39d4017861..8bd9161fcb 100644 --- a/python/paddle/fluid/framework.py +++ b/python/paddle/fluid/framework.py @@ -951,6 +951,13 @@ class Block(object): if var.type == core.VarDesc.VarType.STEP_SCOPES: ret_var = self.create_var( name=var.name, persistable=var.persistable, type=var.type) + elif var.type == core.VarDesc.VarType.SELECTED_ROWS: + ret_var = self.create_var( + name=var.name, + shape=var.shape, + dtype=var.dtype, + type=var.type, + persistable=True) else: ret_var = self.create_var( name=var.name, From aaa642821e5d85a2721abb750084de070a14ab2d Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Sun, 8 Apr 2018 12:52:14 -0700 Subject: [PATCH 037/164] adding client and docker files --- tools/aws_benchmarking/client/Dockerfile | 7 + .../client/cluster_launcher.py | 374 ++++++++++++++++++ .../aws_benchmarking/client/requirements.txt | 6 + tools/aws_benchmarking/pserver.sh.template | 2 - tools/aws_benchmarking/server/Dockerfile | 10 + .../cluster_master.py} | 198 ++++++++-- .../server/pserver.sh.template | 2 + .../{ => server}/requirements.txt | 0 .../server/trainer.sh.template | 2 + tools/aws_benchmarking/trainer.sh.template | 2 - 10 files changed, 556 insertions(+), 47 deletions(-) create mode 100644 tools/aws_benchmarking/client/Dockerfile create mode 100644 tools/aws_benchmarking/client/cluster_launcher.py create mode 100644 tools/aws_benchmarking/client/requirements.txt delete mode 100644 tools/aws_benchmarking/pserver.sh.template create mode 100644 tools/aws_benchmarking/server/Dockerfile rename tools/aws_benchmarking/{paddle_banchmarking_aws.py => server/cluster_master.py} (66%) create mode 100644 tools/aws_benchmarking/server/pserver.sh.template rename tools/aws_benchmarking/{ => server}/requirements.txt (100%) create mode 100644 tools/aws_benchmarking/server/trainer.sh.template delete mode 100644 tools/aws_benchmarking/trainer.sh.template diff --git a/tools/aws_benchmarking/client/Dockerfile b/tools/aws_benchmarking/client/Dockerfile new file mode 100644 index 0000000000..812c5d4bce --- /dev/null +++ b/tools/aws_benchmarking/client/Dockerfile @@ -0,0 +1,7 @@ +FROM python:2.7.14-stretch + +ENV HOME /root +COPY ./ /root/ +WORKDIR /root +RUN pip install -r /root/requirements.txt +ENTRYPOINT ["python", "cluster_launcher.py"] \ No newline at end of file diff --git a/tools/aws_benchmarking/client/cluster_launcher.py b/tools/aws_benchmarking/client/cluster_launcher.py new file mode 100644 index 0000000000..eaccffc204 --- /dev/null +++ b/tools/aws_benchmarking/client/cluster_launcher.py @@ -0,0 +1,374 @@ +# 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 argparse +import os +import time +import math +import logging +import copy + +import netaddr +import boto3 +import namesgenerator +import paramiko +from scp import SCPClient +import requests + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument( + '--key_name', type=str, default="", help="required, key pair name") +parser.add_argument( + '--security_group_id', + type=str, + default="", + help="required, the security group id associated with your VPC") + +parser.add_argument( + '--vpc_id', + type=str, + default="", + help="The VPC in which you wish to run test") +parser.add_argument( + '--subnet_id', + type=str, + default="", + help="The Subnet_id in which you wish to run test") + +parser.add_argument( + '--pserver_instance_type', + type=str, + default="p2.8xlarge", + help="your pserver instance type, p2.8xlarge by default") +parser.add_argument( + '--trainer_instance_type', + type=str, + default="p2.8xlarge", + help="your trainer instance type, p2.8xlarge by default") + +parser.add_argument( + '--task_name', + type=str, + default="", + help="the name you want to identify your job") +parser.add_argument( + '--pserver_image_id', + type=str, + default="ami-da2c1cbf", + help="ami id for system image, default one has nvidia-docker ready, \ + use ami-1ae93962 for us-east-2") +parser.add_argument( + '--trainer_image_id', + type=str, + default="ami-da2c1cbf", + help="ami id for system image, default one has nvidia-docker ready, \ + use ami-1ae93962 for us-west-2") + +parser.add_argument( + '--availability_zone', + type=str, + default="us-east-2a", + help="aws zone id to place ec2 instances") + +parser.add_argument( + '--trainer_count', type=int, default=1, help="Trainer count") + +parser.add_argument( + '--pserver_count', type=int, default=1, help="Pserver count") + +parser.add_argument( + '--action', type=str, default="serve", help="create|cleanup|status") + +parser.add_argument('--pem_path', type=str, help="private key file") + +parser.add_argument( + '--pserver_port', type=str, default="5436", help="pserver port") + +parser.add_argument( + '--docker_image', type=str, default="busybox", help="training docker image") + +parser.add_argument( + '--master_server_port', type=int, default=5436, help="master server port") + +parser.add_argument( + '--master_server_public_ip', type=str, help="master server public ip") + +args = parser.parse_args() + +logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s') + +ec2client = boto3.client('ec2') + + +def print_arguments(): + print('----------- Configuration Arguments -----------') + for arg, value in sorted(vars(args).iteritems()): + print('%s: %s' % (arg, value)) + print('------------------------------------------------') + + +def create_subnet(): + # if no vpc id provided, list vpcs + logging.info("start creating subnet") + if not args.vpc_id: + logging.info("no vpc provided, trying to find the default one") + vpcs_desc = ec2client.describe_vpcs( + Filters=[{ + "Name": "isDefault", + "Values": ["true", ] + }], ) + if len(vpcs_desc["Vpcs"]) == 0: + raise ValueError('No default VPC') + args.vpc_id = vpcs_desc["Vpcs"][0]["VpcId"] + vpc_cidrBlock = vpcs_desc["Vpcs"][0]["CidrBlock"] + + logging.info("default vpc fount with id %s and CidrBlock %s" % + (args.vpc_id, vpc_cidrBlock)) + + if not vpc_cidrBlock: + logging.info("trying to find cidrblock for vpc") + vpcs_desc = ec2client.describe_vpcs( + Filters=[{ + "Name": "vpc-id", + "Values": [args.vpc_id, ], + }], ) + if len(vpcs_desc["Vpcs"]) == 0: + raise ValueError('No VPC found') + vpc_cidrBlock = vpcs_desc["Vpcs"][0]["CidrBlock"] + logging.info("cidrblock for vpc is %s" % vpc_cidrBlock) + + # list subnets in vpc in order to create a new one + + logging.info("trying to find ip blocks for new subnet") + subnets_desc = ec2client.describe_subnets( + Filters=[{ + "Name": "vpc-id", + "Values": [args.vpc_id, ], + }], ) + + ips_taken = [] + for subnet_dec in subnets_desc["Subnets"]: + ips_taken.append(subnet_dec["CidrBlock"]) + + ip_blocks_avaliable = netaddr.IPSet( + [vpc_cidrBlock]) ^ netaddr.IPSet(ips_taken) + # adding 10 addresses as buffer + cidr_prefix = 32 - math.ceil( + math.log(args.pserver_count + args.trainer_count + 10, 2)) + if cidr_prefix <= 16: + raise ValueError('Too many nodes to fit in current VPC') + + for ipnetwork in ip_blocks_avaliable.iter_cidrs(): + try: + subnet_cidr = ipnetwork.subnet(int(cidr_prefix)).next() + logging.info("subnet ip block found %s" % (subnet_cidr)) + break + except Exception: + pass + + if not subnet_cidr: + raise ValueError( + 'No avaliable subnet to fit required nodes in current VPC') + + logging.info("trying to create subnet") + subnet_desc = ec2client.create_subnet( + CidrBlock=str(subnet_cidr), + VpcId=args.vpc_id, + AvailabilityZone=args.availability_zone) + + subnet_id = subnet_desc["Subnet"]["SubnetId"] + + subnet_waiter = ec2client.get_waiter('subnet_available') + # sleep for 1s before checking its state + time.sleep(1) + subnet_waiter.wait(SubnetIds=[subnet_id, ]) + + logging.info("subnet created") + + logging.info("adding tags to newly created subnet") + ec2client.create_tags( + Resources=[subnet_id, ], + Tags=[{ + "Key": "Task_name", + 'Value': args.task_name + }]) + return subnet_id + + +def run_instances(image_id, instance_type, count=1, role="MASTER", cmd=""): + response = ec2client.run_instances( + ImageId=image_id, + InstanceType=instance_type, + MaxCount=count, + MinCount=count, + UserData=cmd, + DryRun=False, + InstanceInitiatedShutdownBehavior="stop", + KeyName=args.key_name, + Placement={'AvailabilityZone': args.availability_zone}, + NetworkInterfaces=[{ + 'DeviceIndex': 0, + 'SubnetId': args.subnet_id, + "AssociatePublicIpAddress": True, + 'Groups': args.security_group_ids + }], + TagSpecifications=[{ + 'ResourceType': "instance", + 'Tags': [{ + "Key": 'Task_name', + "Value": args.task_name + "_master" + }, { + "Key": 'Role', + "Value": role + }] + }]) + + instance_ids = [] + for instance in response["Instances"]: + instance_ids.append(instance["InstanceId"]) + + if len(instance_ids) > 0: + logging.info(str(len(instance_ids)) + " instance(s) created") + else: + logging.info("no instance created") + #create waiter to make sure it's running + + logging.info("waiting for instance to become accessible") + waiter = ec2client.get_waiter('instance_status_ok') + waiter.wait( + Filters=[{ + "Name": "instance-status.status", + "Values": ["ok"] + }, { + "Name": "instance-status.reachability", + "Values": ["passed"] + }, { + "Name": "instance-state-name", + "Values": ["running"] + }], + InstanceIds=instance_ids) + + instances_response = ec2client.describe_instances(InstanceIds=instance_ids) + + return instances_response["Reservations"][0]["Instances"] + + +def generate_task_name(): + return namesgenerator.get_random_name() + + +def init_args(): + + if not args.task_name: + args.task_name = generate_task_name() + logging.info("task name generated %s" % (args.task_name)) + + if not args.pem_path: + args.pem_path = os.path.expanduser("~") + "/" + args.key_name + ".pem" + if args.security_group_id: + args.security_group_ids = (args.security_group_id, ) + + +def create(): + + init_args() + + # create subnet + if not args.subnet_id: + args.subnet_id = create_subnet() + + # create master node + + master_instance_response = run_instances( + image_id="ami-7a05351f", instance_type="t2.nano") + + logging.info("master server started") + + args.master_server_public_ip = master_instance_response[0][ + "PublicIpAddress"] + args.master_server_ip = master_instance_response[0]["PrivateIpAddress"] + + logging.info("master server started, master_ip=%s, task_name=%s" % + (args.master_server_public_ip, args.task_name)) + + # cp config file and pems to master node + + ssh_key = paramiko.RSAKey.from_private_key_file(args.pem_path) + ssh_client = paramiko.SSHClient() + ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh_client.connect( + hostname=args.master_server_public_ip, username="ubuntu", pkey=ssh_key) + + with SCPClient(ssh_client.get_transport()) as scp: + scp.put(os.path.expanduser("~") + "/" + ".aws", + recursive=True, + remote_path='/home/ubuntu/') + scp.put(args.pem_path, + remote_path='/home/ubuntu/' + args.key_name + ".pem") + + logging.info("credentials and pem copied to master") + + # set arguments and start docker + kick_off_cmd = "docker run -d -v /home/ubuntu/.aws:/root/.aws/" + kick_off_cmd += " -v /home/ubuntu/" + args.key_name + ".pem:/root/" + args.key_name + ".pem" + kick_off_cmd += " -p " + str(args.master_server_port) + ":" + str( + args.master_server_port) + kick_off_cmd += " putcn/paddle_aws_master" + + args_to_pass = copy.copy(args) + args_to_pass.action = "serve" + del args_to_pass.pem_path + del args_to_pass.security_group_ids + del args_to_pass.master_server_public_ip + for arg, value in sorted(vars(args_to_pass).iteritems()): + kick_off_cmd += ' --%s %s' % (arg, value) + + logging.info(kick_off_cmd) + stdin, stdout, stderr = ssh_client.exec_command(command=kick_off_cmd) + return_code = stdout.channel.recv_exit_status() + logging.info(return_code) + if return_code != 0: + raise Exception("Error while kicking off master") + + logging.info( + "master sercer finished init process, visit %s to check master log" % + (get_master_web_url("/logs"))) + + +def cleanup(): + print requests.post(get_master_web_url("/cleanup")).text + + +def status(): + print requests.post(get_master_web_url("/logs")).text + + +def get_master_web_url(path): + return "http://" + args.master_server_public_ip + ":" + args.master_server_port + path + + +if __name__ == "__main__": + print_arguments() + if args.action == "create": + if not args.key_name or not args.security_group_id: + raise ValueError("key_name and security_group_id are required") + create() + elif args.action == "cleanup": + if not args.master_server_public_ip: + raise ValueError("master_server_public_ip is required") + cleanup() + elif args.action == "status": + if not args.master_server_public_ip: + raise ValueError("master_server_public_ip is required") + status() diff --git a/tools/aws_benchmarking/client/requirements.txt b/tools/aws_benchmarking/client/requirements.txt new file mode 100644 index 0000000000..9454801f20 --- /dev/null +++ b/tools/aws_benchmarking/client/requirements.txt @@ -0,0 +1,6 @@ +netaddr==0.7.19 +boto3==1.6.21 +namesgenerator==0.3 +paramiko==2.4.1 +scp +requests diff --git a/tools/aws_benchmarking/pserver.sh.template b/tools/aws_benchmarking/pserver.sh.template deleted file mode 100644 index e6642c2db4..0000000000 --- a/tools/aws_benchmarking/pserver.sh.template +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -nvidia-docker run -p {PSERVER_PORT}:{PSERVER_PORT} -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file diff --git a/tools/aws_benchmarking/server/Dockerfile b/tools/aws_benchmarking/server/Dockerfile new file mode 100644 index 0000000000..1593242cdc --- /dev/null +++ b/tools/aws_benchmarking/server/Dockerfile @@ -0,0 +1,10 @@ +# A image for building paddle binaries +# Use cuda devel base image for both cpu and gpu environment +FROM python:2.7.14-stretch + +ENV HOME /root +# Add bash enhancements +COPY ./ /root/ +WORKDIR /root +RUN pip install -r /root/requirements.txt +ENTRYPOINT ["python", "cluster_master.py"] \ No newline at end of file diff --git a/tools/aws_benchmarking/paddle_banchmarking_aws.py b/tools/aws_benchmarking/server/cluster_master.py similarity index 66% rename from tools/aws_benchmarking/paddle_banchmarking_aws.py rename to tools/aws_benchmarking/server/cluster_master.py index 68285406c4..a4f54e4441 100644 --- a/tools/aws_benchmarking/paddle_banchmarking_aws.py +++ b/tools/aws_benchmarking/server/cluster_master.py @@ -18,12 +18,15 @@ import json import math import time import threading +import logging import netaddr import boto3 import namesgenerator import paramiko +from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer + # You must have aws_access_key_id, aws_secret_access_key, region set in # ~/.aws/credentials and ~/.aws/config @@ -101,7 +104,7 @@ parser.add_argument( help="trainer bash file path") parser.add_argument( - '--action', type=str, default="create", help="create|cleanup|status") + '--action', type=str, default="serve", help="create|cleanup|serve") parser.add_argument('--pem_path', type=str, help="private key file") @@ -111,15 +114,25 @@ parser.add_argument( parser.add_argument( '--docker_image', type=str, default="busybox", help="training docker image") +parser.add_argument( + '--master_server_port', type=int, default=5436, help="master server port") + +parser.add_argument( + '--master_server_ip', type=str, default="", help="master server private ip") + args = parser.parse_args() ec2client = boto3.client('ec2') +logging.basicConfig( + filename='master.log', level=logging.INFO, format='%(asctime)s %(message)s') + def create_subnet(): # if no vpc id provided, list vpcs + logging.info("start creating subnet") if not args.vpc_id: - print("no vpc provided, trying to find the default one") + logging.info("no vpc provided, trying to find the default one") vpcs_desc = ec2client.describe_vpcs( Filters=[{ "Name": "isDefault", @@ -130,11 +143,11 @@ def create_subnet(): args.vpc_id = vpcs_desc["Vpcs"][0]["VpcId"] vpc_cidrBlock = vpcs_desc["Vpcs"][0]["CidrBlock"] - print("default vpc fount with id %s and CidrBlock %s" % - (args.vpc_id, vpc_cidrBlock)) + logging.info("default vpc fount with id %s and CidrBlock %s" % + (args.vpc_id, vpc_cidrBlock)) if not vpc_cidrBlock: - print("trying to find cidrblock for vpc") + logging.info("trying to find cidrblock for vpc") vpcs_desc = ec2client.describe_vpcs( Filters=[{ "Name": "vpc-id", @@ -143,11 +156,11 @@ def create_subnet(): if len(vpcs_desc["Vpcs"]) == 0: raise ValueError('No VPC found') vpc_cidrBlock = vpcs_desc["Vpcs"][0]["CidrBlock"] - print("cidrblock for vpc is %s" % vpc_cidrBlock) + logging.info("cidrblock for vpc is %s" % vpc_cidrBlock) # list subnets in vpc in order to create a new one - print("trying to find ip blocks for new subnet") + logging.info("trying to find ip blocks for new subnet") subnets_desc = ec2client.describe_subnets( Filters=[{ "Name": "vpc-id", @@ -169,7 +182,7 @@ def create_subnet(): for ipnetwork in ip_blocks_avaliable.iter_cidrs(): try: subnet_cidr = ipnetwork.subnet(int(cidr_prefix)).next() - print("subnet ip block found %s" % (subnet_cidr)) + logging.info("subnet ip block found %s" % (subnet_cidr)) break except Exception: pass @@ -178,7 +191,7 @@ def create_subnet(): raise ValueError( 'No avaliable subnet to fit required nodes in current VPC') - print("trying to create subnet") + logging.info("trying to create subnet") subnet_desc = ec2client.create_subnet( CidrBlock=str(subnet_cidr), VpcId=args.vpc_id, @@ -191,9 +204,9 @@ def create_subnet(): time.sleep(1) subnet_waiter.wait(SubnetIds=[subnet_id, ]) - print("subnet created") + logging.info("subnet created") - print("adding tags to newly created subnet") + logging.info("adding tags to newly created subnet") ec2client.create_tags( Resources=[subnet_id, ], Tags=[{ @@ -249,12 +262,12 @@ def run_instances(image_id, instance_type, count, role, cmd=""): instance_ids.append(instance["InstanceId"]) if len(instance_ids) > 0: - print(str(len(instance_ids)) + " instance(s) created") + logging.info(str(len(instance_ids)) + " instance(s) created") else: - print("no instance created") + logging.info("no instance created") #create waiter to make sure it's running - print("waiting for instance to become accessible") + logging.info("waiting for instance to become accessible") waiter = ec2client.get_waiter('instance_status_ok') waiter.wait( Filters=[{ @@ -281,8 +294,8 @@ def create_pservers(): instance_type=args.pserver_instance_type, count=args.pserver_count, role="PSERVER", ) - except Exception, e: - print e + except Exception: + logging.exception("error while trying to create pservers") cleanup(args.task_name) @@ -293,8 +306,11 @@ def create_trainers(kickoff_cmd, pserver_endpoints_str): cmd = kickoff_cmd.format( PSERVER_HOSTS=pserver_endpoints_str, DOCKER_IMAGE=args.docker_image, - TRAINER_INDEX=str(i)) - print(cmd) + TRAINER_INDEX=str(i), + TASK_NAME=args.task_name, + MASTER_ENDPOINT=args.master_server_ip + ":" + + str(args.master_server_port)) + logging.info(cmd) responses.append( run_instances( image_id=args.trainer_image_id, @@ -303,13 +319,14 @@ def create_trainers(kickoff_cmd, pserver_endpoints_str): role="TRAINER", cmd=cmd, )[0]) return responses - except Exception, e: - print e + except Exception: + logging.exception("error while trying to create trainers") cleanup(args.task_name) def cleanup(task_name): #shutdown all ec2 instances + print("going to clean up " + task_name + " instances") instances_response = ec2client.describe_instances(Filters=[{ "Name": "tag:Task_name", "Values": [task_name] @@ -327,7 +344,7 @@ def cleanup(task_name): 'instance_terminated') instance_termination_waiter.wait(InstanceIds=instance_ids) -#delete the subnet created + #delete the subnet created subnet = ec2client.describe_subnets(Filters=[{ "Name": "tag:Task_name", @@ -337,6 +354,7 @@ def cleanup(task_name): if len(subnet["Subnets"]) > 0: ec2client.delete_subnet(SubnetId=subnet["Subnets"][0]["SubnetId"]) # no subnet delete waiter, just leave it. + logging.info("Clearnup done") return @@ -349,38 +367,47 @@ def kickoff_pserver(host, pserver_endpoints_str): cmd = (script_to_str(args.pserver_bash_file)).format( PSERVER_HOSTS=pserver_endpoints_str, DOCKER_IMAGE=args.docker_image, - PSERVER_PORT=args.pserver_port) - print(cmd) + PSERVER_PORT=args.pserver_port, + TASK_NAME=args.task_name, + MASTER_ENDPOINT=args.master_server_ip + ":" + + str(args.master_server_port)) + logging.info(cmd) stdin, stdout, stderr = ssh_client.exec_command(command=cmd) return_code = stdout.channel.recv_exit_status() - print(return_code) + logging.info(return_code) if return_code != 0: raise Exception("Error while kicking off pserver training process") - except Exception, e: - print e + except Exception: + logging.exception("Error while kicking off pserver training process") cleanup(args.task_name) finally: ssh_client.close() -def main(): +def init_args(): + if not args.task_name: args.task_name = generate_task_name() - print("task name generated", args.task_name) - - if not args.subnet_id: - print("creating subnet for this task") - args.subnet_id = create_subnet() - print("subnet %s created" % (args.subnet_id)) + logging.info("task name generated %s" % (args.task_name)) if not args.pem_path: args.pem_path = os.path.expanduser("~") + "/" + args.key_name + ".pem" if args.security_group_id: args.security_group_ids = (args.security_group_id, ) - print("creating pservers") + args.trainers_job_done_count = 0 + + +def create_cluster(): + + if not args.subnet_id: + logging.info("creating subnet for this task") + args.subnet_id = create_subnet() + logging.info("subnet %s created" % (args.subnet_id)) + + logging.info("creating pservers") pserver_create_response = create_pservers() - print("pserver created, collecting pserver ips") + logging.info("pserver created, collecting pserver ips") pserver_endpoints = [] for pserver in pserver_create_response: @@ -389,7 +416,7 @@ def main(): pserver_endpoints_str = ",".join(pserver_endpoints) - print("kicking off pserver training process") + logging.info("kicking off pserver training process") pserver_threads = [] for pserver in pserver_create_response: pserver_thread = threading.Thread( @@ -401,29 +428,114 @@ def main(): for pserver_thread in pserver_threads: pserver_thread.join() - print("all pserver training process started") + logging.info("all pserver training process started") - print("creating trainers and kicking off trainer training process") + logging.info("creating trainers and kicking off trainer training process") create_trainers( kickoff_cmd=script_to_str(args.trainer_bash_file), pserver_endpoints_str=pserver_endpoints_str) - print("trainers created") + logging.info("trainers created") + + +def start_server(args): + class S(BaseHTTPRequestHandler): + def _set_headers(self): + self.send_response(200) + self.send_header('Content-type', 'text/text') + self.end_headers() + + def do_HEAD(self): + self._set_headers() + + def do_404(self): + self.send_response(404) + self.send_header('Content-type', 'text/text') + self.end_headers() + logging.info("Received invalid GET request" + self.path) + self.wfile.write("NO ACTION FOUND") + + def do_GET(self): + self._set_headers() + request_path = self.path + if request_path == "/status" or request_path == "/logs": + logging.info("Received request to return status") + with open("master.log", "r") as logfile: + self.wfile.write(logfile.read().strip()) + else: + self.do_404() + + def do_POST(self): + + request_path = self.path + + if request_path == "/save_data": + self._set_headers() + logging.info("Received request to save data") + self.wfile.write("DATA SAVED!") + content_length = int(self.headers['Content-Length']) + post_data = self.rfile.read(content_length) + if args.task_name: + with open(args.task_name + ".txt", "a") as text_file: + text_file.write(post_data + "\n") + + elif request_path == "/cleanup": + self._set_headers() + logging.info("Received request to cleanup cluster") + cleanup(args.task_name) + self.wfile.write("cleanup in progress") + + elif request_path == "/trainer_job_done": + self._set_headers() + logging.info("Received request to increase job done count") + args.trainers_job_done_count += 1 + self.wfile.write( + str(args.trainers_job_done_count) + " tainers job done") + if args.trainers_job_done_count >= args.trainer_count: + logging.info("going to clean up") + cleanup(args.task_name) + + else: + self.do_404() + + server_address = ('', args.master_server_port) + httpd = HTTPServer(server_address, S) + logging.info("HTTP server is starting") + httpd.serve_forever() def print_arguments(): - print('----------- Configuration Arguments -----------') + logging.info('----------- Configuration Arguments -----------') for arg, value in sorted(vars(args).iteritems()): - print('%s: %s' % (arg, value)) - print('------------------------------------------------') + logging.info('%s: %s' % (arg, value)) + logging.info('------------------------------------------------') if __name__ == "__main__": print_arguments() if args.action == "create": + logging.info("going to create cluster") if not args.key_name or not args.security_group_id: raise ValueError("key_name and security_group_id are required") - main() + init_args() + create_cluster() elif args.action == "cleanup": + logging.info("going to cleanup cluster") if not args.task_name: raise ValueError("task_name is required") cleanup(args.task_name) + elif args.action == "serve": + # serve mode + if not args.master_server_ip: + raise ValueError( + "No master server ip set, please run with --action create") + + logging.info("going to start serve and create cluster") + + init_args() + + logging.info("starting server in another thread") + server_thread = threading.Thread(target=start_server, args=(args, )) + server_thread.start() + + create_cluster() + server_thread.join() diff --git a/tools/aws_benchmarking/server/pserver.sh.template b/tools/aws_benchmarking/server/pserver.sh.template new file mode 100644 index 0000000000..6fbf2c5230 --- /dev/null +++ b/tools/aws_benchmarking/server/pserver.sh.template @@ -0,0 +1,2 @@ +#!/bin/bash +nvidia-docker run -p {PSERVER_PORT}:{PSERVER_PORT} -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file diff --git a/tools/aws_benchmarking/requirements.txt b/tools/aws_benchmarking/server/requirements.txt similarity index 100% rename from tools/aws_benchmarking/requirements.txt rename to tools/aws_benchmarking/server/requirements.txt diff --git a/tools/aws_benchmarking/server/trainer.sh.template b/tools/aws_benchmarking/server/trainer.sh.template new file mode 100644 index 0000000000..a83408733d --- /dev/null +++ b/tools/aws_benchmarking/server/trainer.sh.template @@ -0,0 +1,2 @@ +#!/bin/bash +nvidia-docker run -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file diff --git a/tools/aws_benchmarking/trainer.sh.template b/tools/aws_benchmarking/trainer.sh.template deleted file mode 100644 index 05a7d3b91d..0000000000 --- a/tools/aws_benchmarking/trainer.sh.template +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -nvidia-docker run -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file From 07b31b80178a51957a1ab537445fef113c927c1b Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Sun, 8 Apr 2018 12:55:59 -0700 Subject: [PATCH 038/164] cleanup dockerfile --- tools/aws_benchmarking/server/Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/aws_benchmarking/server/Dockerfile b/tools/aws_benchmarking/server/Dockerfile index 1593242cdc..333523abcd 100644 --- a/tools/aws_benchmarking/server/Dockerfile +++ b/tools/aws_benchmarking/server/Dockerfile @@ -1,9 +1,6 @@ -# A image for building paddle binaries -# Use cuda devel base image for both cpu and gpu environment FROM python:2.7.14-stretch ENV HOME /root -# Add bash enhancements COPY ./ /root/ WORKDIR /root RUN pip install -r /root/requirements.txt From 3f90a583b4e5f8a3534b03fb9ed83280ac2d69e4 Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Mon, 9 Apr 2018 04:35:25 +0000 Subject: [PATCH 039/164] update unittest --- python/paddle/fluid/tests/unittests/test_multi_pass_reader.py | 2 +- python/paddle/fluid/tests/unittests/test_recordio_reader.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py b/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py index 0b7a290759..c8a8afbea6 100644 --- a/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py +++ b/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py @@ -44,7 +44,7 @@ class TestMultipleReader(unittest.TestCase): shapes=[(-1, 784), (-1, 1)], lod_levels=[0, 0], dtypes=['float32', 'int64']) - data_file = fluid.layers.create_multi_pass_reader( + data_file = fluid.layers.io.multi_pass( reader=data_file, pass_num=self.pass_num) img, label = fluid.layers.read_file(data_file) diff --git a/python/paddle/fluid/tests/unittests/test_recordio_reader.py b/python/paddle/fluid/tests/unittests/test_recordio_reader.py index 24a0074d9b..096d99a3f3 100644 --- a/python/paddle/fluid/tests/unittests/test_recordio_reader.py +++ b/python/paddle/fluid/tests/unittests/test_recordio_reader.py @@ -74,8 +74,8 @@ class TestRecordIO(unittest.TestCase): self.assertLess(avg_loss_np[-1], avg_loss_np[0]) def test_shuffle_reader(self): - self.test_main(decorator_callback=lambda reader: fluid.layers.create_shuffle_reader(reader, buffer_size=200)) + self.test_main(decorator_callback=lambda reader: fluid.layers.io.shuffle(reader, buffer_size=200)) def test_double_buffer_reader(self): - self.test_main(decorator_callback=lambda reader: fluid.layers.create_double_buffer_reader(reader, + self.test_main(decorator_callback=lambda reader: fluid.layers.io.double_buffer(reader, place='cuda:0' if fluid.core.is_compiled_with_cuda() else 'cpu')) From 972ae6e98ffbddac7b68242f946934b07b275e01 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 9 Apr 2018 14:27:19 +0800 Subject: [PATCH 040/164] random selected rows value --- paddle/fluid/operators/uniform_random_op.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/operators/uniform_random_op.cc b/paddle/fluid/operators/uniform_random_op.cc index 87699362b2..a50add9739 100644 --- a/paddle/fluid/operators/uniform_random_op.cc +++ b/paddle/fluid/operators/uniform_random_op.cc @@ -24,7 +24,15 @@ template class CPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - auto* tensor = ctx.Output("Out"); + framework::Tensor* tensor(nullptr); + auto out_var = ctx.OutputVar("Out"); + if (out_var->IsType()) { + tensor = ctx.Output("Out"); + } else if (out_var->IsType()) { + tensor = ctx.Output("Out")->mutable_value(); + } else { + PADDLE_THROW("Only support LoDTensor and SelectedRows."); + } T* data = tensor->mutable_data(ctx.GetPlace()); unsigned int seed = static_cast(ctx.Attr("seed")); std::minstd_rand engine; @@ -36,6 +44,7 @@ class CPUUniformRandomKernel : public framework::OpKernel { static_cast(ctx.Attr("min")), static_cast(ctx.Attr("max"))); int64_t size = tensor->numel(); + VLOG(3) << "size = " << size; for (int64_t i = 0; i < size; ++i) { data[i] = dist(engine); } @@ -55,6 +64,7 @@ class UniformRandomOp : public framework::OperatorWithKernel { "uniform_random's min must less then max"); auto& shape = ctx->Attrs().Get>("shape"); std::vector temp; + VLOG(3) << "shape.size() = " << shape.size(); temp.reserve(shape.size()); for (auto dim : shape) { temp.push_back(static_cast(dim)); From 5416bac5d84b1d846744481505749df0a87db133 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 9 Apr 2018 15:47:46 +0800 Subject: [PATCH 041/164] Make shared decorated readers' creater be only in main_program --- .../reader/create_double_buffer_reader_op.cc | 9 ++++-- python/paddle/fluid/layers/io.py | 30 ++++++++++++++----- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc b/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc index ed868786ab..d9f799f14d 100644 --- a/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc +++ b/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc @@ -109,7 +109,9 @@ class CreateDoubleBufferReaderOp : public framework::OperatorBase { auto place_str = Attr("place"); platform::Place place; - if (place_str == "CPU") { + if (place_str == "AUTO") { + place = dev_place; + } else if (place_str == "CPU") { place = platform::CPUPlace(); } else { std::istringstream sin(place_str); @@ -140,8 +142,9 @@ class CreateDoubleBufferReaderOpMaker : public DecoratedReaderMakerBase { enum_range.insert(string::Sprintf("CUDA:%d", i)); } enum_range.insert("CPU"); - AddAttr("place", "The double buffer place, default is CPU") - .SetDefault("CPU") + enum_range.insert("AUTO"); + AddAttr("place", "The double buffer place") + .SetDefault("AUTO") .InEnum({enum_range}); } }; diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index dbba1a46eb..4901521db5 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -440,7 +440,7 @@ def open_files(filenames, return monkey_patch_reader_methods(main_prog_reader) -def __create_decorated_reader__(op_type, reader, attrs={}): +def __create_unshared_decorated_reader__(op_type, reader, attrs={}): var_name = unique_name(op_type) startup_blk = default_startup_program().current_block() startup_var = startup_blk.create_var(name=var_name) @@ -456,26 +456,40 @@ def __create_decorated_reader__(op_type, reader, attrs={}): return monkey_patch_reader_methods(main_prog_var) +def __create_shared_decorated_reader__(op_type, reader, attrs={}): + new_reader_name = unique_name(op_type) + main_blk = default_main_program().current_block() + new_reader = main_blk.create_var(name=new_reader_name) + main_blk.append_op( + type=op_type, + inputs={'UnderlyingReader': reader}, + outputs={'Out': [new_reader]}, + attrs=attrs) + new_reader.persistable = True + new_reader.stop_gradient = True + return monkey_patch_reader_methods(new_reader) + + def shuffle(reader, buffer_size): - return __create_decorated_reader__('create_shuffle_reader', reader, - {'buffer_size': int(buffer_size)}) + return __create_unshared_decorated_reader__( + 'create_shuffle_reader', reader, {'buffer_size': int(buffer_size)}) def double_buffer(reader, place=None): attrs = dict() if place is not None: attrs['place'] = str(place).upper() - return __create_decorated_reader__('create_double_buffer_reader', reader, - attrs) + return __create_unshared_decorated_reader__('create_double_buffer_reader', + reader, attrs) def multi_pass(reader, pass_num): - return __create_decorated_reader__('create_multi_pass_reader', reader, - {'pass_num': int(pass_num)}) + return __create_shared_decorated_reader__( + 'create_multi_pass_reader', reader, {'pass_num': int(pass_num)}) def for_parallel(reader): - return __create_decorated_reader__('create_threaded_reader', reader) + return __create_shared_decorated_reader__('create_threaded_reader', reader) def read_file(file_obj): From 0586b9e5c95a7368fc944da96fc2bfac6796b07e Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Mon, 9 Apr 2018 15:49:15 +0800 Subject: [PATCH 042/164] Add *Initializer to fluid api docs --- python/paddle/fluid/initializer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/paddle/fluid/initializer.py b/python/paddle/fluid/initializer.py index 927f1e625a..11015b6127 100644 --- a/python/paddle/fluid/initializer.py +++ b/python/paddle/fluid/initializer.py @@ -17,8 +17,7 @@ import numpy as np import contextlib __all__ = [ - 'Constant', 'Uniform', 'Normal', 'Xavier', 'force_init_on_cpu', - 'init_on_cpu' + 'ConstantInitializer', 'UniformInitializer', 'NormalInitializer', 'XavierInitializer', 'Constant', 'Uniform', 'Normal', 'Xavier', 'force_init_on_cpu','init_on_cpu' ] _force_init_on_cpu_ = False From f909ff1a3652697f63070cf1bc8cb425d1902417 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 9 Apr 2018 15:53:00 +0800 Subject: [PATCH 043/164] update unit test --- paddle/fluid/operators/uniform_random_op.cc | 5 +- paddle/fluid/operators/uniform_random_op.cu | 13 +++++- .../tests/unittests/test_uniform_random_op.py | 46 +++++++++++++++++-- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/paddle/fluid/operators/uniform_random_op.cc b/paddle/fluid/operators/uniform_random_op.cc index a50add9739..d8b38fb7eb 100644 --- a/paddle/fluid/operators/uniform_random_op.cc +++ b/paddle/fluid/operators/uniform_random_op.cc @@ -29,11 +29,14 @@ class CPUUniformRandomKernel : public framework::OpKernel { if (out_var->IsType()) { tensor = ctx.Output("Out"); } else if (out_var->IsType()) { + auto shape = ctx.Attr>("shape"); tensor = ctx.Output("Out")->mutable_value(); + tensor->Resize(framework::make_ddim(shape)); } else { PADDLE_THROW("Only support LoDTensor and SelectedRows."); } T* data = tensor->mutable_data(ctx.GetPlace()); + data[0] = static_cast(1000); unsigned int seed = static_cast(ctx.Attr("seed")); std::minstd_rand engine; if (seed == 0) { @@ -44,7 +47,6 @@ class CPUUniformRandomKernel : public framework::OpKernel { static_cast(ctx.Attr("min")), static_cast(ctx.Attr("max"))); int64_t size = tensor->numel(); - VLOG(3) << "size = " << size; for (int64_t i = 0; i < size; ++i) { data[i] = dist(engine); } @@ -64,7 +66,6 @@ class UniformRandomOp : public framework::OperatorWithKernel { "uniform_random's min must less then max"); auto& shape = ctx->Attrs().Get>("shape"); std::vector temp; - VLOG(3) << "shape.size() = " << shape.size(); temp.reserve(shape.size()); for (auto dim : shape) { temp.push_back(static_cast(dim)); diff --git a/paddle/fluid/operators/uniform_random_op.cu b/paddle/fluid/operators/uniform_random_op.cu index 1232cd1eb3..115c859527 100644 --- a/paddle/fluid/operators/uniform_random_op.cu +++ b/paddle/fluid/operators/uniform_random_op.cu @@ -43,7 +43,18 @@ template class GPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { - auto* tensor = context.Output("Out"); + framework::Tensor* tensor(nullptr); + auto out_var = ctx.OutputVar("Out"); + if (out_var->IsType()) { + tensor = ctx.Output("Out"); + } else if (out_var->IsType()) { + auto shape = ctx.Attr>("shape"); + tensor = ctx.Output("Out")->mutable_value(); + tensor->Resize(framework::make_ddim(shape)); + } else { + PADDLE_THROW("Only support LoDTensor and SelectedRows."); + } + T* data = tensor->mutable_data(context.GetPlace()); unsigned int seed = static_cast(context.Attr("seed")); if (seed == 0) { diff --git a/python/paddle/fluid/tests/unittests/test_uniform_random_op.py b/python/paddle/fluid/tests/unittests/test_uniform_random_op.py index 75ff85a55f..3331e99c36 100644 --- a/python/paddle/fluid/tests/unittests/test_uniform_random_op.py +++ b/python/paddle/fluid/tests/unittests/test_uniform_random_op.py @@ -15,6 +15,16 @@ import unittest import numpy as np from op_test import OpTest +import paddle.fluid.core as core +from paddle.fluid.op import Operator + + +def output_hist(out): + hist, _ = np.histogram(out, range=(-5, 10)) + hist = hist.astype("float32") + hist /= float(out.size) + prob = 0.1 * np.ones((10)) + return hist, prob class TestUniformRandomOp(OpTest): @@ -33,11 +43,37 @@ class TestUniformRandomOp(OpTest): self.check_output_customized(self.verify_output) def verify_output(self, outs): - tensor = outs[0] - hist, _ = np.histogram(outs[0], range=(-5, 10)) - hist = hist.astype("float32") - hist /= float(outs[0].size) - prob = 0.1 * np.ones((10)) + hist, prob = output_hist(outs[0]) + self.assertTrue( + np.allclose( + hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) + + +class TestUniformRandomOpSelectedRows(unittest.TestCase): + def get_places(self): + places = [core.CPUPlace()] + if core.is_compiled_with_cuda(): + places.append(core.CUDAPlace(0)) + return places + + def test_check_output(self): + for place in self.get_places(): + self.check_with_place(place) + + def check_with_place(self, place): + scope = core.Scope() + out = scope.var("X").get_selected_rows() + + op = Operator( + "uniform_random", + Out="X", + shape=[1000, 784], + min=-5.0, + max=10.0, + seed=10) + op.run(scope, place) + out_tensor = out.get_tensor() + hist, prob = output_hist(np.array(out_tensor)) self.assertTrue( np.allclose( hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) From d05071f0b91f7bf5f5ee978dcdecd828cdb9df2a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 9 Apr 2018 15:57:25 +0800 Subject: [PATCH 044/164] k8s dist train for en --- .../multi_cluster/k8s_distributed_en.md | 366 +++++++++++++++++- 1 file changed, 364 insertions(+), 2 deletions(-) diff --git a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md index bc3d50b3ff..dfc0f0d3e6 100644 --- a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md +++ b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md @@ -1,3 +1,365 @@ -# Kubernetes Distributed +# Kubernetes Distributed Training -TBD +We introduced how to create a PaddlePaddle Job with a single node on Kuberentes in the +previous document. +In this article, we will introduce how to craete a PaddlePaddle job with multiple nodes +on Kubernetes cluster. + +## Overall Architecture + +Before creating a training job, the users need to deploy the Python scripts and +training data which have already been sliced on the precast path in the distributed file +system(We can use the different type of Kuberentes Volumes to mount different distributed +file system). Before start training, The program would copy the training data into the +Container and also save the models at the same path during training. The global architecture +is as follows: + +![PaddlePaddle on Kubernetes Architecture](src/k8s-paddle-arch.png) + +The above figure describes a distributed training architecture which contains 3 nodes, each +Pod would mount a folder of the distributed file system to save training data and models +by Kubernetes Volume. Kubernetes created 3 Pod for this training phase and scheduled these on +3 nodes, each Pod has a PaddlePaddle container. After the containers have been created, +PaddlePaddle would start up the communication between PServer and Trainer and read training +data for this training job. + +As the description above, we can start up a PaddlePaddle distributed training job on a ready +Kubernetes cluster as the following steps: + +1. [Build PaddlePaddle Docker Image](#Build a Docker Image) +1. [Split training data and upload to the distributed file system](#Upload Training Data) +1. [Edit a YAML file and create a Kubernetes Job](#Create a Job) +1. [Check the output](#Check The Output) + +We will introduce these steps as follows: + +### Build a Docker Image + +PaddlePaddle Docker Image needs to support the runtime environment of `Paddle PServer` and +`Paddle Trainer` process and this Docker Image has the two import features: + +- Copy the training data into the container. +- Generate the start arguments of `Paddle PServer` and `Paddle Training` process. + +Because of the official Docker Image `paddlepaddle/paddle:latest` has already included the +PaddlePaddle executable file, but above features so that we can use the official Docker Image as +a base Image and add some additional scripts to finish the work of building a new image. +You can reference [Dockerfile](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/usage/cluster/src/k8s_train/Dockerfile). + + +```bash +$ cd doc/howto/usage/k8s/src/k8s_train +$ docker build -t [YOUR_REPO]/paddle:mypaddle . +``` + +And then upload the new Docker Image to a Docker hub: + +```bash +docker push [YOUR_REPO]/paddle:mypaddle +``` + +**[NOTE]**, in the above command arguments, `[YOUR_REPO]` representative your Docker repository, +you need to use your repository instead of it. We will use `[YOUR_REPO]/paddle:mypaddle` to +represent the Docker Image which built in this step. + +### Prepare Training Data + +We can download and split the training job by creating a Kubernetes Job, or custom your image +by editing [k8s_train](./src/k8s_train/README.md). + +Before creating a Job, we need to bind a [persistenVolumeClaim](https://kubernetes.io/docs/user-guide/persistent-volumes) by the different type of +the different distributed file system, the generated dataset would be saved on this volume. + +```yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: paddle-data +spec: + template: + metadata: + name: pi + spec: + hostNetwork: true + containers: + - name: paddle-data + image: paddlepaddle/paddle-tutorial:k8s_data + imagePullPolicy: Always + volumeMounts: + - mountPath: "/mnt" + name: nfs + env: + - name: OUT_DIR + value: /home/work/mfs/paddle-cluster-job + - name: SPLIT_COUNT + value: "3" + volumes: + - name: nfs + persistentVolumeClaim: + claimName: mfs + restartPolicy: Never +``` + +If success, you can see some information like this: + +```base +[root@paddle-kubernetes-node0 nfsdir]$ tree -d +. +`-- paddle-cluster-job + |-- 0 + | `-- data + |-- 1 + | `-- data + |-- 2 + | `-- data + |-- output + |-- quick_start +``` + +The `paddle-cluster-job` above is the job name for this training job; we need 3 +PaddlePaddle training node and save the split training data on `paddle-cluster-job` path, +the folder `0`, `1` and `2` representative the `training_id` on each node, `quick_start` folder is used to store training data, `output` folder is used to store the models and logs. + + +### Create a Job + +Kubernetes allow users to create an object with YAML files, and we can use a command-line tool +to create it. + +The Job YAML file describes that which Docker Image would be used in this training job, how much nodes would be created, what's the startup arguments of `Paddle PServer/Trainer` process and what's the type of Volumes. You can find the details of the YAML filed in +[Kubernetes Job API](http://kubernetes.io/docs/api-reference/batch/v1/definitions/#_v1_job). +The following is an example for this training job: + +```yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: paddle-cluster-job +spec: + parallelism: 3 + completions: 3 + template: + metadata: + name: paddle-cluster-job + spec: + volumes: + - name: jobpath + hostPath: + path: /home/work/mfs + containers: + - name: trainer + image: [YOUR_REPO]/paddle:mypaddle + command: ["bin/bash", "-c", "/root/start.sh"] + env: + - name: JOB_NAME + value: paddle-cluster-job + - name: JOB_PATH + value: /home/jobpath + - name: JOB_NAMESPACE + value: default + - name: TRAIN_CONFIG_DIR + value: recommendation + - name: CONF_PADDLE_NIC + value: eth0 + - name: CONF_PADDLE_PORT + value: "7164" + - name: CONF_PADDLE_PORTS_NUM + value: "2" + - name: CONF_PADDLE_PORTS_NUM_SPARSE + value: "2" + - name: CONF_PADDLE_GRADIENT_NUM + value: "3" + volumeMounts: + - name: jobpath + mountPath: /home/jobpath + restartPolicy: Never +``` + +In the above YAML file: +- `metadata.name`, The job name. +- `parallelism`, The Kubernetes Job would create `parallelism` Pods at the same time. +- `completions`, The Job would become the success status only the number of successful Pod(the exit code is 0) + is equal to `completions`. +- `volumeMounts`, the name field `jobpath` is a key, the `mountPath` field represents + the path in the container, and we can define the `jobpath` in `volumes` filed, use `hostPath` + to configure the host path we want to mount. +- `env`, the environment variables in the Container, we pass some startup arguments by + this approach, some details are as following: + - JOB_PATH:the mount path in the container + - JOB_NAME:the job name + - TRAIN_CONFIG_DIR:the job path in the container, we can find the training data path by + combine with JOB_NAME. + - CONF_PADDLE_NIC: the argument `--nics` of `Paddle PServer` process, the network + device name. + - CONF_PADDLE_PORT: the argument `--port` of `Paddle PServer` process. + - CONF_PADDLE_PORTS_NUM: the argument `--ports_num` of `Paddle PServer`, the port number + for dense prameter update. + - CONF_PADDLE_PORTS_NUM_SPARSE:the argument `--ports_num_for_sparse` of `Paddle PServer`, + the port number for sparse parameter update. + - CONF_PADDLE_GRADIENT_NUM:the number of training node, the argument + `--num_gradient_servers` of `Paddle PServer` and `Paddle Trainer`. + +You can find some details information at [here] +(http://www.paddlepaddle.org/docs/develop/documentation/zh/howto/usage/cmd_parameter/detail_introduction_cn.html)。 + +We can use the command-line tool of Kubernetes to create a Job when we finish the YAML file: + +```bash +kubectl create -f job.yaml +``` + +Upon successful creation, Kubernetes would create 3 Pods as PaddlePaddle training node, +, pull the Docker image and begin to train. + + +### Checkout the Output + +At the process of training, we can check the logs and the output models, such as we store +the output on `output` folder. **NOTE**, `node_0`, `node_1` and `node_2` represent the +`trainer_id` of the PaddlePaddle training job rather than the node id of Kubernetes. + +```bash +[root@paddle-kubernetes-node0 output]# tree -d +. +├── node_0 +│   ├── server.log +│   └── train.log +├── node_1 +│   ├── server.log +│   └── train.log +├── node_2 +...... +├── pass-00002 +│   ├── done +│   ├── ___embedding_0__.w0 +│   ├── ___embedding_1__.w0 +...... +``` + +We can checkout the status of each training Pod by viewing the logs: + +```bash +[root@paddle-kubernetes-node0 node_0]# cat train.log +I1116 09:10:17.123121 50 Util.cpp:155] commandline: + /usr/local/bin/../opt/paddle/bin/paddle_trainer + --nics=eth0 --port=7164 + --ports_num=2 --comment=paddle_process_by_paddle + --pservers=192.168.129.66,192.168.223.143,192.168.129.71 + --ports_num_for_sparse=2 --config=./trainer_config.py + --trainer_count=4 --num_passes=10 --use_gpu=0 + --log_period=50 --dot_period=10 --saving_period=1 + --local=0 --trainer_id=0 + --save_dir=/home/jobpath/paddle-cluster-job/output +I1116 09:10:17.123440 50 Util.cpp:130] Calling runInitFunctions +I1116 09:10:17.123764 50 Util.cpp:143] Call runInitFunctions done. +[WARNING 2016-11-16 09:10:17,227 default_decorators.py:40] please use keyword arguments in paddle config. +[INFO 2016-11-16 09:10:17,239 networks.py:1282] The input order is [movie_id, title, genres, user_id, gender, age, occupation, rating] +[INFO 2016-11-16 09:10:17,239 networks.py:1289] The output order is [__square_error_cost_0__] +I1116 09:10:17.392917 50 Trainer.cpp:170] trainer mode: Normal +I1116 09:10:17.613910 50 PyDataProvider2.cpp:257] loading dataprovider dataprovider::process +I1116 09:10:17.680917 50 PyDataProvider2.cpp:257] loading dataprovider dataprovider::process +I1116 09:10:17.681543 50 GradientMachine.cpp:134] Initing parameters.. +I1116 09:10:18.012390 50 GradientMachine.cpp:141] Init parameters done. +I1116 09:10:18.018641 50 ParameterClient2.cpp:122] pserver 0 192.168.129.66:7164 +I1116 09:10:18.018950 50 ParameterClient2.cpp:122] pserver 1 192.168.129.66:7165 +I1116 09:10:18.019069 50 ParameterClient2.cpp:122] pserver 2 192.168.223.143:7164 +I1116 09:10:18.019492 50 ParameterClient2.cpp:122] pserver 3 192.168.223.143:7165 +I1116 09:10:18.019716 50 ParameterClient2.cpp:122] pserver 4 192.168.129.71:7164 +I1116 09:10:18.019836 50 ParameterClient2.cpp:122] pserver 5 192.168.129.71:7165 +``` + +## Some Additional Details + +### Using Environment Variables + +Usually we use the environment varialbes to configurate the PaddlePaddle Job which running on +Kubernetes, `start_paddle.py` provides a start up script to convert the environment variable +to the start up argument of PaddlePaddle process: + +```bash +API = "/api/v1/namespaces/" +JOBSELECTOR = "labelSelector=job-name=" +JOB_PATH = os.getenv("JOB_PATH") + "/" + os.getenv("JOB_NAME") +JOB_PATH_OUTPUT = JOB_PATH + "/output" +JOBNAME = os.getenv("JOB_NAME") +NAMESPACE = os.getenv("JOB_NAMESPACE") +PADDLE_NIC = os.getenv("CONF_PADDLE_NIC") +PADDLE_PORT = os.getenv("CONF_PADDLE_PORT") +PADDLE_PORTS_NUM = os.getenv("CONF_PADDLE_PORTS_NUM") +PADDLE_PORTS_NUM_SPARSE = os.getenv("CONF_PADDLE_PORTS_NUM_SPARSE") +PADDLE_SERVER_NUM = os.getenv("CONF_PADDLE_GRADIENT_NUM") +``` + +### Communication between Pods + +At the begin of `start_paddle.py`, it would initialize and parse the arguments. + +```python +parser = argparse.ArgumentParser(prog="start_paddle.py", + description='simple tool for k8s') + args, train_args_list = parser.parse_known_args() + train_args = refine_unknown_args(train_args_list) + train_args_dict = dict(zip(train_args[:-1:2], train_args[1::2])) + podlist = getPodList() +``` + +And then query the status of all the other Pods of this Job by the function `getPodList()`, and fetch `triner_id` by the function `getIdMap(podlist)` if all the Pods status is `RUNNING`. + +```python + podlist = getPodList() + # need to wait until all pods are running + while not isPodAllRunning(podlist): + time.sleep(10) + podlist = getPodList() + idMap = getIdMap(podlist) +``` + +**NOTE**: `getPodList()` would fetch all the pod in the current namespace, if some Pods are running, may cause some error. We will use [statfulesets](https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets) instead of +Kubernetes Pod or Replicaset in the future. + +For the implement of `getIdMap(podlist)`, this function would fetch each IP address of +`podlist` and then sort them to generate `trainer_id`. + +```python +def getIdMap(podlist): + ''' + generate tainer_id by ip + ''' + ips = [] + for pod in podlist["items"]: + ips.append(pod["status"]["podIP"]) + ips.sort() + idMap = {} + for i in range(len(ips)): + idMap[ips[i]] = i + return idMap +``` + +After getting the `idMap`, we can generate the arguments of `Paddle PServer` and `Paddle Trainer` +so that we can start up them by `startPaddle(idMap, train_args_dict)`. + +### Create Job + +The main goal of `startPaddle` is generating the arguments of `Paddle PServer` and `Paddle Trainer` processes. Such as `Paddle Trainer`, we parse the environment variable and then get +`PADDLE_NIC`, `PADDLE_PORT`, `PADDLE_PORTS_NUM` and etc..., finally find `trainerId` from +`idMap` according to its IP address. + +```python + program = 'paddle train' + args = " --nics=" + PADDLE_NIC + args += " --port=" + str(PADDLE_PORT) + args += " --ports_num=" + str(PADDLE_PORTS_NUM) + args += " --comment=" + "paddle_process_by_paddle" + ip_string = "" + for ip in idMap.keys(): + ip_string += (ip + ",") + ip_string = ip_string.rstrip(",") + args += " --pservers=" + ip_string + args_ext = "" + for key, value in train_args_dict.items(): + args_ext += (' --' + key + '=' + value) + localIP = socket.gethostbyname(socket.gethostname()) + trainerId = idMap[localIP] + args += " " + args_ext + " --trainer_id=" + \ + str(trainerId) + " --save_dir=" + JOB_PATH_OUTPUT +``` From 9bec0d26dbbe31c057426c1f88af64dd8c907e1e Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Mon, 9 Apr 2018 16:50:10 +0800 Subject: [PATCH 045/164] Adjust some contents --- doc/v2/dev/write_docs_cn.rst | 8 ++++---- doc/v2/dev/write_docs_en.rst | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/v2/dev/write_docs_cn.rst b/doc/v2/dev/write_docs_cn.rst index 887d92942e..4231f2bb5c 100644 --- a/doc/v2/dev/write_docs_cn.rst +++ b/doc/v2/dev/write_docs_cn.rst @@ -81,13 +81,13 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D 注:上述命令把当前目录(源码根目录)映射为 container 里的 :code:`/paddle` 目录。 -编译完成后,进入 ``paddle/build/doc/v2`` 目录,该目录下生成了 ``cn/html/`` 、 ``en/html`` 以及 ``api/en/html`` 共三个子目录,分别进入这些目录下,执行以下命令: +编译完成后,会产生 ``doc/v2`` 和 ``doc/fluid`` 两个目录,在这两个目录下分别都生成 ``cn/html/`` 、 ``en/html`` 、 ``api/en/html`` 共三个子目录,分别进入这些目录下,执行以下命令: .. code-block:: bash python -m SimpleHTTPServer 8088 -在浏览器中输入http://localhost:8088就可以看到编译生成的中/英文的文档页面和英文的API页面。 +在浏览器中输入 http://localhost:8088 就可以看到编译生成的 ``v2`` 和 ``fluid`` 两种版本的中/英文的文档页面和英文的API页面。 如果不想使用Docker,也可以使用以下命令直接构建PaddlePaddle文档,即 @@ -107,13 +107,13 @@ PaddlePaddle.org工具可以配合Docker使用,需要在系统里先安装好D 其中$processors代表启动和CPU核一样多的进程来并行编译,可以根据本机的CPU核数设置相应的值。 -编译完成后,会产生 ``doc/v2`` 和 ``doc/fluid`` 两个目录,如果选择构建文档则会在这两个目录下分别都生成 ``cn/html/`` 、 ``en/html`` 两个子目录,选择构建API则会在这两个目录下分别生成 ``api/en/html`` 目录,分别进入这些子目录下,执行以下命令: +编译完成后,同样会产生 ``doc/v2`` 和 ``doc/fluid`` 两个目录,如果选择构建文档则会在这两个目录下分别都生成 ``cn/html/`` 、 ``en/html`` 两个子目录,选择构建API则会在这两个目录下分别生成 ``api/en/html`` 目录,分别进入这些子目录下,执行以下命令: .. code-block:: bash python -m SimpleHTTPServer 8088 -在浏览器中输入 http://localhost:8088 就可以看到编译生成的 ``v2`` 和 ``fluid`` 两种版本的中/英文的文档页面和英文的API页面,下图为生成的 ``v2`` 英文文档首页示例。注意,示例中由于使用了sphinx的原始主题,所以页面的风格与官网并不一致,但这并不影响开发者进行调试。 +在浏览器中输入 http://localhost:8088 就可以看到编译生成的 ``v2`` 和 ``fluid`` 两种版本的中/英文的文档页面和英文的API页面。下图为生成的 ``v2`` 英文文档首页示例。注意,示例中由于使用了sphinx的原始主题,所以页面的风格与官网并不一致,但这并不影响开发者进行调试。 .. image:: src/doc_en.png :align: center diff --git a/doc/v2/dev/write_docs_en.rst b/doc/v2/dev/write_docs_en.rst index 435bbdb60f..6105455e20 100644 --- a/doc/v2/dev/write_docs_en.rst +++ b/doc/v2/dev/write_docs_en.rst @@ -84,13 +84,13 @@ Build PaddlePaddle's documentation with Docker,you need to install Docker firs Note: The above commands maps the current directory (source root directory) to the :code:`/paddle` directory in the container. -After compiling, you could enter the ``paddle/build/doc/v2`` directory, where three subdirectories ``cn/html/``, ``en/html`` and ``api/en/html`` are generated. Please enter these directories respectively and execute the following commands: +After compiling, there should be two generated directories: ``doc/v2`` and ``doc/fluid``, where three subdirectories ``cn/html/``, ``en/html`` and ``api/en/html`` are generated. Please enter these directories respectively and execute the following commands: .. code-block:: bash python -m SimpleHTTPServer 8088 -Use a web browser and navigate to http://localhost:8000, you could see the compiled Chinese/English documents page and the English APIs page. +Use a web browser and navigate to http://localhost:8000, you could see the compiled ``v2`` 's and ``fluid`` 's Chinese/English documents page and English APIs page. If you do not wish to use Docker, you can also use the following commands to directly build the PaddlePaddle documentation. @@ -111,7 +111,7 @@ If you do not wish to use Docker, you can also use the following commands to dir $processors indicates that as many processes as the CPU cores are started to compile in parallel. It should be set according to the number of CPU cores of your machine. -After the compilation is complete, there should be two generated directories: ``doc/v2`` and ``doc/fluid`` . If you chose to build documents, two subdirectories ``cn/html/`` and ``en/html`` will be generated in both two directories. If you chose to build APIs,a subdirectory ``api/en/html`` will be generated. Please enter these directories respectively and execute the following commands: +After compiling, there also should be two generated directories: ``doc/v2`` and ``doc/fluid`` . If you chose to build documents, two subdirectories ``cn/html/`` and ``en/html`` will be generated in both two directories. If you chose to build APIs,a subdirectory ``api/en/html`` will be generated. Please enter these directories respectively and execute the following commands: .. code-block:: bash From cd41dca2ab9f5d98d6817147df2e71af152150f5 Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Mon, 9 Apr 2018 18:22:57 +0800 Subject: [PATCH 046/164] Adjust --- python/paddle/fluid/initializer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/paddle/fluid/initializer.py b/python/paddle/fluid/initializer.py index 11015b6127..ad15c32a35 100644 --- a/python/paddle/fluid/initializer.py +++ b/python/paddle/fluid/initializer.py @@ -17,7 +17,8 @@ import numpy as np import contextlib __all__ = [ - 'ConstantInitializer', 'UniformInitializer', 'NormalInitializer', 'XavierInitializer', 'Constant', 'Uniform', 'Normal', 'Xavier', 'force_init_on_cpu','init_on_cpu' + 'Constant', 'Uniform', 'Normal', 'Xavier', 'force_init_on_cpu', + 'init_on_cpu', 'ConstantInitializer', 'UniformInitializer', 'NormalInitializer', 'XavierInitializer' ] _force_init_on_cpu_ = False From 9fe938cb2aefcbced1e60fa459c943fa2ea245e6 Mon Sep 17 00:00:00 2001 From: jshower Date: Tue, 10 Apr 2018 03:48:26 +0000 Subject: [PATCH 047/164] Changing network configuration, avoid nan --- .../fluid/tests/book/test_label_semantic_roles.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/paddle/fluid/tests/book/test_label_semantic_roles.py b/python/paddle/fluid/tests/book/test_label_semantic_roles.py index c0a6df831a..5fc64ea958 100644 --- a/python/paddle/fluid/tests/book/test_label_semantic_roles.py +++ b/python/paddle/fluid/tests/book/test_label_semantic_roles.py @@ -77,7 +77,7 @@ def db_lstm(word, predicate, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, mark, emb_layers.append(mark_embedding) hidden_0_layers = [ - fluid.layers.fc(input=emb, size=hidden_dim) for emb in emb_layers + fluid.layers.fc(input=emb, size=hidden_dim, act='tanh') for emb in emb_layers ] hidden_0 = fluid.layers.sums(input=hidden_0_layers) @@ -94,8 +94,8 @@ def db_lstm(word, predicate, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, mark, for i in range(1, depth): mix_hidden = fluid.layers.sums(input=[ - fluid.layers.fc(input=input_tmp[0], size=hidden_dim), - fluid.layers.fc(input=input_tmp[1], size=hidden_dim) + fluid.layers.fc(input=input_tmp[0], size=hidden_dim, act='tanh'), + fluid.layers.fc(input=input_tmp[1], size=hidden_dim, act='tanh') ]) lstm = fluid.layers.dynamic_lstm( @@ -109,8 +109,8 @@ def db_lstm(word, predicate, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, mark, input_tmp = [mix_hidden, lstm] feature_out = fluid.layers.sums(input=[ - fluid.layers.fc(input=input_tmp[0], size=label_dict_len), - fluid.layers.fc(input=input_tmp[1], size=label_dict_len) + fluid.layers.fc(input=input_tmp[0], size=label_dict_len, act='tanh'), + fluid.layers.fc(input=input_tmp[1], size=label_dict_len, act='tanh') ]) return feature_out @@ -171,7 +171,7 @@ def train(use_cuda, save_dirname=None, is_local=True): # check other optimizers and check why out will be NAN sgd_optimizer = fluid.optimizer.SGD( learning_rate=fluid.layers.exponential_decay( - learning_rate=0.0001, + learning_rate=0.01, decay_steps=100000, decay_rate=0.5, staircase=True)) From ee178d5aebaa48f3434ec577ab1b450f4e3d7eab Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Tue, 10 Apr 2018 04:41:39 +0000 Subject: [PATCH 048/164] fix bugs --- paddle/fluid/framework/parallel_executor.cc | 4 +--- paddle/fluid/operators/read_op.cc | 7 ------- .../operators/reader/create_threaded_reader_op.cc | 8 ++++---- python/paddle/fluid/layers/io.py | 13 +++++++------ 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/paddle/fluid/framework/parallel_executor.cc b/paddle/fluid/framework/parallel_executor.cc index 74945fb4f2..1bb089c344 100644 --- a/paddle/fluid/framework/parallel_executor.cc +++ b/paddle/fluid/framework/parallel_executor.cc @@ -115,14 +115,12 @@ void ParallelExecutor::BCastParamsToGPUs( for (auto &var : vars) { auto *main_var = main_scope->FindVar(var); - if (!main_var->IsType()) { + if (main_var == nullptr || !main_var->IsType()) { continue; } auto &main_tensor = main_var->Get(); - auto &dims = main_tensor.dims(); - if (paddle::platform::is_gpu_place(main_tensor.place())) { size_t numel = main_tensor.numel(); ncclDataType_t data_type = platform::ToNCCLDataType(main_tensor.type()); diff --git a/paddle/fluid/operators/read_op.cc b/paddle/fluid/operators/read_op.cc index 2925b8a85d..4496110cf8 100644 --- a/paddle/fluid/operators/read_op.cc +++ b/paddle/fluid/operators/read_op.cc @@ -66,13 +66,6 @@ class ReadOp : public framework::OperatorBase { std::vector out_arg_names = Outputs("Out"); std::vector ins; reader->ReadNext(&ins); - if (ins.empty()) { - reader->ReInit(); - reader->ReadNext(&ins); - PADDLE_ENFORCE( - !ins.empty(), - "Reader can not read the next data even it has been re-initialized."); - } PADDLE_ENFORCE_EQ(ins.size(), out_arg_names.size()); for (size_t i = 0; i < ins.size(); ++i) { auto* out = diff --git a/paddle/fluid/operators/reader/create_threaded_reader_op.cc b/paddle/fluid/operators/reader/create_threaded_reader_op.cc index 854381e0ee..7b10135afc 100644 --- a/paddle/fluid/operators/reader/create_threaded_reader_op.cc +++ b/paddle/fluid/operators/reader/create_threaded_reader_op.cc @@ -111,7 +111,7 @@ class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { "When 'unsafe_mode' is false, invoking 'HasNext()' or " "'ReInit()' is not allowed to avoid unexpected bugs in " "multi-thread environment.") - .SetDefault(false); + .SetDefault(true); AddComment(R"DOC( CreateThreadedReader Operator @@ -134,6 +134,6 @@ class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { } // namespace paddle namespace reader = paddle::operators::reader; -REGISTER_FILE_READER_OPERATOR(create_threaded_reader, - reader::CreateThreadedReaderOp, - reader::CreateThreadedReaderOpMaker); +REGISTER_DECORATED_READER_OPERATOR(create_threaded_reader, + reader::CreateThreadedReaderOp, + reader::CreateThreadedReaderOpMaker); diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index 4901521db5..d016ab9008 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -350,7 +350,7 @@ def open_recordio_file(filename, main_prog_var = multi_pass(reader=main_prog_var, pass_num=pass_num) if for_parallel: - main_prog_var = for_parallel(reader=main_prog_var) + main_prog_var = parallelize(reader=main_prog_var) return monkey_patch_reader_methods(main_prog_var) @@ -435,12 +435,12 @@ def open_files(filenames, reader=main_prog_reader, pass_num=pass_num) if for_parallel: - main_prog_reader = for_parallel(reader=main_prog_reader) + main_prog_reader = parallelize(reader=main_prog_reader) return monkey_patch_reader_methods(main_prog_reader) -def __create_unshared_decorated_reader__(op_type, reader, attrs={}): +def __create_shared_decorated_reader__(op_type, reader, attrs): var_name = unique_name(op_type) startup_blk = default_startup_program().current_block() startup_var = startup_blk.create_var(name=var_name) @@ -456,7 +456,7 @@ def __create_unshared_decorated_reader__(op_type, reader, attrs={}): return monkey_patch_reader_methods(main_prog_var) -def __create_shared_decorated_reader__(op_type, reader, attrs={}): +def __create_unshared_decorated_reader__(op_type, reader, attrs): new_reader_name = unique_name(op_type) main_blk = default_main_program().current_block() new_reader = main_blk.create_var(name=new_reader_name) @@ -488,8 +488,9 @@ def multi_pass(reader, pass_num): 'create_multi_pass_reader', reader, {'pass_num': int(pass_num)}) -def for_parallel(reader): - return __create_shared_decorated_reader__('create_threaded_reader', reader) +def parallelize(reader): + return __create_shared_decorated_reader__('create_threaded_reader', reader, + {}) def read_file(file_obj): From d9a52223852a92d532ff2522cb648758511abe26 Mon Sep 17 00:00:00 2001 From: jshower Date: Tue, 10 Apr 2018 04:57:30 +0000 Subject: [PATCH 049/164] code style --- .../tests/book/test_label_semantic_roles.py | 67 ++++++++++--------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/python/paddle/fluid/tests/book/test_label_semantic_roles.py b/python/paddle/fluid/tests/book/test_label_semantic_roles.py index 5fc64ea958..4f5d30ac00 100644 --- a/python/paddle/fluid/tests/book/test_label_semantic_roles.py +++ b/python/paddle/fluid/tests/book/test_label_semantic_roles.py @@ -70,14 +70,15 @@ def db_lstm(word, predicate, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, mark, fluid.layers.embedding( size=[word_dict_len, word_dim], input=x, - param_attr=fluid.ParamAttr( - name=embedding_name, trainable=False)) for x in word_input + param_attr=fluid.ParamAttr(name=embedding_name, trainable=False)) + for x in word_input ] emb_layers.append(predicate_embedding) emb_layers.append(mark_embedding) hidden_0_layers = [ - fluid.layers.fc(input=emb, size=hidden_dim, act='tanh') for emb in emb_layers + fluid.layers.fc(input=emb, size=hidden_dim, act='tanh') + for emb in emb_layers ] hidden_0 = fluid.layers.sums(input=hidden_0_layers) @@ -163,8 +164,7 @@ def train(use_cuda, save_dirname=None, is_local=True): crf_cost = fluid.layers.linear_chain_crf( input=feature_out, label=target, - param_attr=fluid.ParamAttr( - name='crfw', learning_rate=mix_hidden_lr)) + param_attr=fluid.ParamAttr(name='crfw', learning_rate=mix_hidden_lr)) avg_cost = fluid.layers.mean(crf_cost) # TODO(qiao) @@ -189,8 +189,7 @@ def train(use_cuda, save_dirname=None, is_local=True): num_chunk_types=int(math.ceil((label_dict_len - 1) / 2.0))) train_data = paddle.batch( - paddle.reader.shuffle( - paddle.dataset.conll05.test(), buf_size=8192), + paddle.reader.shuffle(paddle.dataset.conll05.test(), buf_size=8192), batch_size=BATCH_SIZE) place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() @@ -223,24 +222,25 @@ def train(use_cuda, save_dirname=None, is_local=True): exe) if batch_id % 10 == 0: - print("avg_cost:" + str(cost) + " precision:" + str( - precision) + " recall:" + str(recall) + " f1_score:" + - str(f1_score) + " pass_precision:" + str( - pass_precision) + " pass_recall:" + str( - pass_recall) + " pass_f1_score:" + str( - pass_f1_score)) + print( + "avg_cost:" + str(cost) + " precision:" + + str(precision) + " recall:" + str(recall) + + " f1_score:" + str(f1_score) + " pass_precision:" + str( + pass_precision) + " pass_recall:" + str(pass_recall) + + " pass_f1_score:" + str(pass_f1_score)) if batch_id != 0: - print("second per batch: " + str((time.time( - ) - start_time) / batch_id)) + print("second per batch: " + str( + (time.time() - start_time) / batch_id)) # Set the threshold low to speed up the CI test if float(pass_precision) > 0.05: if save_dirname is not None: # TODO(liuyiqun): Change the target to crf_decode - fluid.io.save_inference_model(save_dirname, [ - 'word_data', 'verb_data', 'ctx_n2_data', - 'ctx_n1_data', 'ctx_0_data', 'ctx_p1_data', - 'ctx_p2_data', 'mark_data' - ], [feature_out], exe) + fluid.io.save_inference_model( + save_dirname, [ + 'word_data', 'verb_data', 'ctx_n2_data', + 'ctx_n1_data', 'ctx_0_data', 'ctx_p1_data', + 'ctx_p2_data', 'mark_data' + ], [feature_out], exe) return batch_id = batch_id + 1 @@ -320,19 +320,20 @@ def infer(use_cuda, save_dirname=None): assert feed_target_names[6] == 'ctx_p2_data' assert feed_target_names[7] == 'mark_data' - results = exe.run(inference_program, - feed={ - feed_target_names[0]: word, - feed_target_names[1]: pred, - feed_target_names[2]: ctx_n2, - feed_target_names[3]: ctx_n1, - feed_target_names[4]: ctx_0, - feed_target_names[5]: ctx_p1, - feed_target_names[6]: ctx_p2, - feed_target_names[7]: mark - }, - fetch_list=fetch_targets, - return_numpy=False) + results = exe.run( + inference_program, + feed={ + feed_target_names[0]: word, + feed_target_names[1]: pred, + feed_target_names[2]: ctx_n2, + feed_target_names[3]: ctx_n1, + feed_target_names[4]: ctx_0, + feed_target_names[5]: ctx_p1, + feed_target_names[6]: ctx_p2, + feed_target_names[7]: mark + }, + fetch_list=fetch_targets, + return_numpy=False) print(results[0].lod()) np_data = np.array(results[0]) print("Inference Shape: ", np_data.shape) From 3f6fc10b9fc6da75961bab0f7a473dc388d07f51 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 10 Apr 2018 14:23:09 +0800 Subject: [PATCH 050/164] new op that init table value randomly --- .../operators/uniform_random_table_op.cc | 144 ++++++++++++++++++ .../unittests/test_uniform_random_table_op.py | 66 ++++++++ 2 files changed, 210 insertions(+) create mode 100644 paddle/fluid/operators/uniform_random_table_op.cc create mode 100644 python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py diff --git a/paddle/fluid/operators/uniform_random_table_op.cc b/paddle/fluid/operators/uniform_random_table_op.cc new file mode 100644 index 0000000000..4664cc5d93 --- /dev/null +++ b/paddle/fluid/operators/uniform_random_table_op.cc @@ -0,0 +1,144 @@ +/* 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/framework/data_type.h" +#include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/operators/math/math_function.h" +#include "paddle/fluid/platform/device_context.h" + +namespace paddle { +namespace operators { + +class UniformRandomTableInferShape : public framework::InferShapeBase { + public: + void operator()(framework::InferShapeContext *ctx) const override { + VLOG(3) << "Infershape..."; + PADDLE_ENFORCE(ctx->HasOutput("Out"), + "Output(Out) of UniformRandomTableOp should not be null."); + + PADDLE_ENFORCE( + ctx->Attrs().Get("min") < ctx->Attrs().Get("max"), + "uniform_random's min must less then max"); + auto &shape = ctx->Attrs().Get>("shape"); + std::vector temp; + temp.reserve(shape.size()); + for (auto dim : shape) { + temp.push_back(static_cast(dim)); + } + ctx->SetOutputDim("Out", framework::make_ddim(temp)); + } +}; + +class UniformRandomTableOp : public framework::OperatorBase { + public: + using framework::OperatorBase::OperatorBase; + + private: + void RunImpl(const framework::Scope &scope, + const platform::Place &dev_place) const override { + VLOG(3) << "RunImpl..."; + auto out = + scope.FindVar(Output("Out"))->GetMutable(); + auto shard_cnt = Attr("shard_cnt"); + auto shard_id = Attr("shard_id"); + auto max_id = Attr("max_id"); + auto shape = Attr>("shape"); + + auto tensor = out->mutable_value(); + tensor->Resize(framework::make_ddim(shape)); + // Only allocate the memory of large table on CPU + auto cpu = platform::CPUPlace(); + float *data = tensor->mutable_data(cpu); + VLOG(3) << "generate seed"; + unsigned int seed = static_cast(Attr("seed")); + std::minstd_rand engine; + if (seed == 0) { + seed = std::random_device()(); + } + engine.seed(seed); + std::uniform_real_distribution dist(Attr("min"), + Attr("max")); + int64_t size = tensor->numel(); + for (int64_t i = 0; i < size; ++i) { + data[i] = dist(engine); + } + // initialize rows by round-robin + // TODO(Yancey1989): need to support other way to distribute Ids + VLOG(3) << "calculate rows_size..."; + int64_t rows_size = 0; + if (max_id % shard_cnt == 0) { + rows_size = max_id / shard_cnt; + } else { + rows_size = max_id / shard_cnt + 1; + } + auto *rows = out->mutable_rows(); + rows->resize(rows_size); + (*rows)[0] = shard_id; + for (int64_t idx = 1; idx < rows_size; ++idx) { + (*rows)[idx] = (*rows)[idx - 1] + shard_cnt; + } + out->set_height(max_id); + } +}; + +class UniformRandomTableOpMaker : public framework::OpProtoAndCheckerMaker { + public: + UniformRandomTableOpMaker(OpProto *proto, OpAttrChecker *op_checker) + : framework::OpProtoAndCheckerMaker(proto, op_checker) { + AddOutput("Out", + "(SelectedRows)" + "The output table of uniform random table op."); + AddComment(R"DOC( +Uniform random operator for initializing a table. + +This operator initializes a SelectedRows with random values sampled from a +uniform distribution. + +)DOC"); + AddAttr("max_id", + "(int, required)" + "The maximal Id for the table."); + AddAttr("shard_cnt", + "(int, required)" + "The count of shards for distributing the table."); + AddAttr("shard_id", "(int, required) The current shard ID."); + AddAttr>("shape", + "(vector) The shape of the output tensor"); + AddAttr("min", + "(float, default -1.0) " + "Minimum value of uniform random") + .SetDefault(-1.0f); + AddAttr("max", + "(float, default 1.0) " + "Maximun value of uniform random") + .SetDefault(1.0f); + AddAttr("seed", + "(int, default 0) " + "Random seed used for generating samples. " + "0 means use a seed generated by the system." + "Note that if seed is not 0, this operator will always " + "generate the same random numbers every time.") + .SetDefault(0); + AddAttr("dtype", "(int, default 5(FP32)) Output tensor data type") + .SetDefault(framework::proto::VarType::FP32); + } +}; +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +REGISTER_OPERATOR(uniform_random_table, ops::UniformRandomTableOp, + ops::UniformRandomTableInferShape, + ops::UniformRandomTableOpMaker, + paddle::framework::EmptyGradOpMaker); diff --git a/python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py b/python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py new file mode 100644 index 0000000000..0474c51e49 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py @@ -0,0 +1,66 @@ +# 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 +import paddle.fluid.core as core +from paddle.fluid.op import Operator + + +def output_hist(out): + hist, _ = np.histogram(out, range=(-5, 10)) + hist = hist.astype("float32") + hist /= float(out.size) + prob = 0.1 * np.ones((10)) + return hist, prob + + +class TestUniformRandomTableOp(unittest.TestCase): + def get_places(self): + places = [core.CPUPlace()] + if core.is_compiled_with_cuda(): + places.append(core.CUDAPlace(0)) + return places + + def test_check_output(self): + for place in self.get_places(): + self.check_with_place(place) + + def check_with_place(self, place): + scope = core.Scope() + out = scope.var("X").get_selected_rows() + + op = Operator( + "uniform_random_table", + Out="X", + shape=[4, 784], + min=-5.0, + max=10.0, + seed=10, + shard_cnt=3, + shard_id=1, + max_id=10) + op.run(scope, place) + self.assertEqual(out.rows(), [1, 4, 7, 10]) + self.assertEqual(out.height(), 10) + self.assertEqual(out.get_tensor().shape(), [4, 784]) + hist, prob = output_hist(np.array(out.get_tensor())) + self.assertTrue( + np.allclose( + hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) + + +if __name__ == "__main__": + unittest.main() From cb7bbf426c1be2d4a0989855f6440b0b8313f6b0 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 10 Apr 2018 14:28:35 +0800 Subject: [PATCH 051/164] revert uniform_random_op --- paddle/fluid/operators/uniform_random_op.cc | 13 +----- paddle/fluid/operators/uniform_random_op.cu | 13 +----- .../tests/unittests/test_uniform_random_op.py | 46 ++----------------- 3 files changed, 7 insertions(+), 65 deletions(-) diff --git a/paddle/fluid/operators/uniform_random_op.cc b/paddle/fluid/operators/uniform_random_op.cc index d8b38fb7eb..87699362b2 100644 --- a/paddle/fluid/operators/uniform_random_op.cc +++ b/paddle/fluid/operators/uniform_random_op.cc @@ -24,19 +24,8 @@ template class CPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - framework::Tensor* tensor(nullptr); - auto out_var = ctx.OutputVar("Out"); - if (out_var->IsType()) { - tensor = ctx.Output("Out"); - } else if (out_var->IsType()) { - auto shape = ctx.Attr>("shape"); - tensor = ctx.Output("Out")->mutable_value(); - tensor->Resize(framework::make_ddim(shape)); - } else { - PADDLE_THROW("Only support LoDTensor and SelectedRows."); - } + auto* tensor = ctx.Output("Out"); T* data = tensor->mutable_data(ctx.GetPlace()); - data[0] = static_cast(1000); unsigned int seed = static_cast(ctx.Attr("seed")); std::minstd_rand engine; if (seed == 0) { diff --git a/paddle/fluid/operators/uniform_random_op.cu b/paddle/fluid/operators/uniform_random_op.cu index 115c859527..1232cd1eb3 100644 --- a/paddle/fluid/operators/uniform_random_op.cu +++ b/paddle/fluid/operators/uniform_random_op.cu @@ -43,18 +43,7 @@ template class GPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { - framework::Tensor* tensor(nullptr); - auto out_var = ctx.OutputVar("Out"); - if (out_var->IsType()) { - tensor = ctx.Output("Out"); - } else if (out_var->IsType()) { - auto shape = ctx.Attr>("shape"); - tensor = ctx.Output("Out")->mutable_value(); - tensor->Resize(framework::make_ddim(shape)); - } else { - PADDLE_THROW("Only support LoDTensor and SelectedRows."); - } - + auto* tensor = context.Output("Out"); T* data = tensor->mutable_data(context.GetPlace()); unsigned int seed = static_cast(context.Attr("seed")); if (seed == 0) { diff --git a/python/paddle/fluid/tests/unittests/test_uniform_random_op.py b/python/paddle/fluid/tests/unittests/test_uniform_random_op.py index 3331e99c36..75ff85a55f 100644 --- a/python/paddle/fluid/tests/unittests/test_uniform_random_op.py +++ b/python/paddle/fluid/tests/unittests/test_uniform_random_op.py @@ -15,16 +15,6 @@ import unittest import numpy as np from op_test import OpTest -import paddle.fluid.core as core -from paddle.fluid.op import Operator - - -def output_hist(out): - hist, _ = np.histogram(out, range=(-5, 10)) - hist = hist.astype("float32") - hist /= float(out.size) - prob = 0.1 * np.ones((10)) - return hist, prob class TestUniformRandomOp(OpTest): @@ -43,37 +33,11 @@ class TestUniformRandomOp(OpTest): self.check_output_customized(self.verify_output) def verify_output(self, outs): - hist, prob = output_hist(outs[0]) - self.assertTrue( - np.allclose( - hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) - - -class TestUniformRandomOpSelectedRows(unittest.TestCase): - def get_places(self): - places = [core.CPUPlace()] - if core.is_compiled_with_cuda(): - places.append(core.CUDAPlace(0)) - return places - - def test_check_output(self): - for place in self.get_places(): - self.check_with_place(place) - - def check_with_place(self, place): - scope = core.Scope() - out = scope.var("X").get_selected_rows() - - op = Operator( - "uniform_random", - Out="X", - shape=[1000, 784], - min=-5.0, - max=10.0, - seed=10) - op.run(scope, place) - out_tensor = out.get_tensor() - hist, prob = output_hist(np.array(out_tensor)) + tensor = outs[0] + hist, _ = np.histogram(outs[0], range=(-5, 10)) + hist = hist.astype("float32") + hist /= float(outs[0].size) + prob = 0.1 * np.ones((10)) self.assertTrue( np.allclose( hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) From 93940642ac1f52d28743a9dbdc2940a4d986f612 Mon Sep 17 00:00:00 2001 From: weixing02 <564445201@qq.com> Date: Tue, 10 Apr 2018 14:28:50 +0800 Subject: [PATCH 052/164] Adjust --- python/paddle/fluid/initializer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/paddle/fluid/initializer.py b/python/paddle/fluid/initializer.py index ad15c32a35..4e132ed261 100644 --- a/python/paddle/fluid/initializer.py +++ b/python/paddle/fluid/initializer.py @@ -18,7 +18,8 @@ import contextlib __all__ = [ 'Constant', 'Uniform', 'Normal', 'Xavier', 'force_init_on_cpu', - 'init_on_cpu', 'ConstantInitializer', 'UniformInitializer', 'NormalInitializer', 'XavierInitializer' + 'init_on_cpu', 'ConstantInitializer', 'UniformInitializer', + 'NormalInitializer', 'XavierInitializer' ] _force_init_on_cpu_ = False From e7467d94a0418fe88fbd9eba23b4322914ebc10d Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Tue, 10 Apr 2018 14:42:13 +0800 Subject: [PATCH 053/164] add remove_op, remove_var in Python end --- paddle/fluid/framework/block_desc.cc | 50 +------------------ python/paddle/fluid/framework.py | 11 ++++ .../tests/unittests/test_protobuf_descs.py | 20 -------- 3 files changed, 13 insertions(+), 68 deletions(-) diff --git a/paddle/fluid/framework/block_desc.cc b/paddle/fluid/framework/block_desc.cc index fbe08349c3..b8847e4b90 100644 --- a/paddle/fluid/framework/block_desc.cc +++ b/paddle/fluid/framework/block_desc.cc @@ -13,11 +13,10 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/framework/block_desc.h" +#include #include "paddle/fluid/framework/operator.h" #include "paddle/fluid/framework/program_desc.h" -#include - namespace paddle { namespace framework { @@ -147,52 +146,7 @@ void BlockDesc::RemoveOp(size_t s, size_t e) { if (ops_.begin() + s == ops_.end() || ops_.begin() + e == ops_.end()) { return; } - auto get_vars = [](std::deque>::iterator &op, - std::vector &v) { - auto in_names = (*op)->InputArgumentNames(); - v.insert(v.end(), in_names.begin(), in_names.end()); - auto out_names = (*op)->OutputArgumentNames(); - v.insert(v.end(), out_names.begin(), out_names.end()); - std::sort(v.begin(), v.end()); - auto last = std::unique(v.begin(), v.end()); - v.erase(last, v.end()); - }; - need_update_ = true; - - for (size_t i = s; i < e; i++) { - // since remove op one by one, every time remove the first op. - auto op = ops_.begin() + s; - - // collect input and output variables from current delete op - std::vector cur_vars; - get_vars(op, cur_vars); - - // remove current op - ops_.erase(ops_.begin() + s); - - // collect input and output variables from other ops - std::vector other_vars; - for (auto it = ops_.begin(); it != ops_.end(); it++) { - get_vars(it, other_vars); - } - - // variables should be deleted - std::vector delete_vars; - // delete_vars = cur_vars - cur_vars ^ other_input_vars - std::set_difference(cur_vars.begin(), cur_vars.end(), other_vars.begin(), - other_vars.end(), - std::inserter(delete_vars, delete_vars.end())); - // remove variables - for (size_t i = 0; i < delete_vars.size(); i++) { - auto name = delete_vars[i]; - auto it = vars_.find(name); - PADDLE_ENFORCE(it != vars_.end(), - "%s is not in variable list, it should not be deleted", - name); - vars_.erase(it); - VLOG(3) << "deleting variable " << name; - } - } + ops_.erase(ops_.begin() + s, ops_.begin() + e); } std::vector BlockDesc::AllOps() const { diff --git a/python/paddle/fluid/framework.py b/python/paddle/fluid/framework.py index 33cf691817..793421a22f 100644 --- a/python/paddle/fluid/framework.py +++ b/python/paddle/fluid/framework.py @@ -818,6 +818,11 @@ class Block(object): del self.vars[name] self.sync_with_cpp() + def remove_var(self, name): + self.sync_with_cpp() + self.desc.remove_var(name) + del self.vars[name] + def create_parameter(self, *args, **kwargs): global_block = self.program.global_block() param = Parameter(global_block, *args, **kwargs) @@ -838,6 +843,11 @@ class Block(object): self.ops.insert(index, op) return op + def remove_op(self, index): + self.sync_with_cpp() + self.desc.remove_op(index, index + 1) + del self.ops[index] + def delete_ops(self, ops): # remove from cpp # FIXME(typhoonzero): remove only the first occurrence. @@ -846,6 +856,7 @@ class Block(object): end = list(self.ops).index(ops[-1]) except Exception, e: raise e + self.desc.remove_op(start, end + 1) def slice_ops(self, start, end): diff --git a/python/paddle/fluid/tests/unittests/test_protobuf_descs.py b/python/paddle/fluid/tests/unittests/test_protobuf_descs.py index f98a8bbc68..3f9059fb5b 100644 --- a/python/paddle/fluid/tests/unittests/test_protobuf_descs.py +++ b/python/paddle/fluid/tests/unittests/test_protobuf_descs.py @@ -201,24 +201,6 @@ class TestBlockDesc(unittest.TestCase): op1.set_type("test") op2.set_type("test") - var0 = block.var("var0") - var1 = block.var("var1") - var2 = block.var("var2") - var3 = block.var("var3") - var4 = block.var("var4") - var5 = block.var("var5") - - op0.set_input("X", ["var0"]) - op0.set_output("Y", ["var0"]) - op1.set_input("X", ["var1", "var2"]) - op1.set_output("Y", ["var3", "var4"]) - op2.set_input("X", ["var1"]) - op2.set_output("Y", ["var4", "var5"]) - - program.sync_with_cpp() - - # remove op1, its input var2 and output var3 will be removed at the same time, - # but its input var1 and output var4 will not be removed since they are used for op2. block.remove_op(1, 2) program.sync_with_cpp() @@ -226,8 +208,6 @@ class TestBlockDesc(unittest.TestCase): for idx in xrange(0, block.op_size()): all_ops.append(block.op(idx)) self.assertEqual(all_ops, [op0, op2]) - all_vars = block.all_vars() - self.assertEqual(set(all_vars), {var0, var1, var4, var5}) if __name__ == '__main__': From 7c1434dd73d367932e98ae569093183d33b7e5fb Mon Sep 17 00:00:00 2001 From: jshower Date: Tue, 10 Apr 2018 07:36:15 +0000 Subject: [PATCH 054/164] code style --- .../tests/book/test_label_semantic_roles.py | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/python/paddle/fluid/tests/book/test_label_semantic_roles.py b/python/paddle/fluid/tests/book/test_label_semantic_roles.py index 4f5d30ac00..ace2e39ba4 100644 --- a/python/paddle/fluid/tests/book/test_label_semantic_roles.py +++ b/python/paddle/fluid/tests/book/test_label_semantic_roles.py @@ -70,8 +70,8 @@ def db_lstm(word, predicate, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, mark, fluid.layers.embedding( size=[word_dict_len, word_dim], input=x, - param_attr=fluid.ParamAttr(name=embedding_name, trainable=False)) - for x in word_input + param_attr=fluid.ParamAttr( + name=embedding_name, trainable=False)) for x in word_input ] emb_layers.append(predicate_embedding) emb_layers.append(mark_embedding) @@ -164,7 +164,8 @@ def train(use_cuda, save_dirname=None, is_local=True): crf_cost = fluid.layers.linear_chain_crf( input=feature_out, label=target, - param_attr=fluid.ParamAttr(name='crfw', learning_rate=mix_hidden_lr)) + param_attr=fluid.ParamAttr( + name='crfw', learning_rate=mix_hidden_lr)) avg_cost = fluid.layers.mean(crf_cost) # TODO(qiao) @@ -189,7 +190,8 @@ def train(use_cuda, save_dirname=None, is_local=True): num_chunk_types=int(math.ceil((label_dict_len - 1) / 2.0))) train_data = paddle.batch( - paddle.reader.shuffle(paddle.dataset.conll05.test(), buf_size=8192), + paddle.reader.shuffle( + paddle.dataset.conll05.test(), buf_size=8192), batch_size=BATCH_SIZE) place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() @@ -222,25 +224,24 @@ def train(use_cuda, save_dirname=None, is_local=True): exe) if batch_id % 10 == 0: - print( - "avg_cost:" + str(cost) + " precision:" + - str(precision) + " recall:" + str(recall) + - " f1_score:" + str(f1_score) + " pass_precision:" + str( - pass_precision) + " pass_recall:" + str(pass_recall) - + " pass_f1_score:" + str(pass_f1_score)) + print("avg_cost:" + str(cost) + " precision:" + str( + precision) + " recall:" + str(recall) + " f1_score:" + + str(f1_score) + " pass_precision:" + str( + pass_precision) + " pass_recall:" + str( + pass_recall) + " pass_f1_score:" + str( + pass_f1_score)) if batch_id != 0: - print("second per batch: " + str( - (time.time() - start_time) / batch_id)) + print("second per batch: " + str((time.time( + ) - start_time) / batch_id)) # Set the threshold low to speed up the CI test if float(pass_precision) > 0.05: if save_dirname is not None: # TODO(liuyiqun): Change the target to crf_decode - fluid.io.save_inference_model( - save_dirname, [ - 'word_data', 'verb_data', 'ctx_n2_data', - 'ctx_n1_data', 'ctx_0_data', 'ctx_p1_data', - 'ctx_p2_data', 'mark_data' - ], [feature_out], exe) + fluid.io.save_inference_model(save_dirname, [ + 'word_data', 'verb_data', 'ctx_n2_data', + 'ctx_n1_data', 'ctx_0_data', 'ctx_p1_data', + 'ctx_p2_data', 'mark_data' + ], [feature_out], exe) return batch_id = batch_id + 1 @@ -320,20 +321,19 @@ def infer(use_cuda, save_dirname=None): assert feed_target_names[6] == 'ctx_p2_data' assert feed_target_names[7] == 'mark_data' - results = exe.run( - inference_program, - feed={ - feed_target_names[0]: word, - feed_target_names[1]: pred, - feed_target_names[2]: ctx_n2, - feed_target_names[3]: ctx_n1, - feed_target_names[4]: ctx_0, - feed_target_names[5]: ctx_p1, - feed_target_names[6]: ctx_p2, - feed_target_names[7]: mark - }, - fetch_list=fetch_targets, - return_numpy=False) + results = exe.run(inference_program, + feed={ + feed_target_names[0]: word, + feed_target_names[1]: pred, + feed_target_names[2]: ctx_n2, + feed_target_names[3]: ctx_n1, + feed_target_names[4]: ctx_0, + feed_target_names[5]: ctx_p1, + feed_target_names[6]: ctx_p2, + feed_target_names[7]: mark + }, + fetch_list=fetch_targets, + return_numpy=False) print(results[0].lod()) np_data = np.array(results[0]) print("Inference Shape: ", np_data.shape) From 284a2137742f63e8a70f4d98805328edc067f054 Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Tue, 10 Apr 2018 07:46:03 +0000 Subject: [PATCH 055/164] fix a name conflict --- python/paddle/fluid/layers/io.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index dbba1a46eb..7b590fb510 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -350,7 +350,7 @@ def open_recordio_file(filename, main_prog_var = multi_pass(reader=main_prog_var, pass_num=pass_num) if for_parallel: - main_prog_var = for_parallel(reader=main_prog_var) + main_prog_var = parallel(reader=main_prog_var) return monkey_patch_reader_methods(main_prog_var) @@ -435,7 +435,7 @@ def open_files(filenames, reader=main_prog_reader, pass_num=pass_num) if for_parallel: - main_prog_reader = for_parallel(reader=main_prog_reader) + main_prog_reader = parallel(reader=main_prog_reader) return monkey_patch_reader_methods(main_prog_reader) @@ -474,7 +474,7 @@ def multi_pass(reader, pass_num): {'pass_num': int(pass_num)}) -def for_parallel(reader): +def parallel(reader): return __create_decorated_reader__('create_threaded_reader', reader) From 0bf799a52388dd77743623dcb2d1ebacb352858b Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Tue, 10 Apr 2018 17:00:06 +0800 Subject: [PATCH 056/164] wip testing --- paddle/fluid/framework/details/CMakeLists.txt | 2 +- .../framework/details/multi_devices_graph_builder.cc | 10 ++++------ .../framework/details/multi_devices_graph_builder.h | 7 ++----- paddle/fluid/framework/parallel_executor.h | 4 ++-- paddle/fluid/operators/detail/serde_test.cc | 2 +- paddle/fluid/pybind/pybind.cc | 1 + python/paddle/fluid/parallel_executor.py | 7 +++++-- 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index caaf418076..85b649b293 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -16,7 +16,7 @@ else() set(multi_devices_graph_builder_deps) endif() cc_library(multi_devices_graph_builder SRCS multi_devices_graph_builder.cc DEPS ssa_graph_builder computation_op_handle - scale_loss_grad_op_handle ${multi_devices_graph_builder_deps}) + scale_loss_grad_op_handle send_op_handle ${multi_devices_graph_builder_deps}) cc_library(ssa_graph_executor SRCS ssa_graph_executor.cc DEPS ssa_graph framework_proto) cc_library(threaded_ssa_graph_executor SRCS threaded_ssa_graph_executor.cc DEPS fetch_op_handle ssa_graph_executor scope simple_threadpool device_context) diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.cc b/paddle/fluid/framework/details/multi_devices_graph_builder.cc index 8a28b18715..8a53270110 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.cc +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.cc @@ -35,22 +35,20 @@ MultiDevSSAGraphBuilder::MultiDevSSAGraphBuilder( const std::string &loss_var_name, const std::unordered_set ¶ms, const std::vector &local_scopes, - platform::NCCLContextMap *nccl_ctxs, bool distributed) + platform::NCCLContextMap *nccl_ctxs) : loss_var_name_(loss_var_name), places_(places), local_scopes_(local_scopes), - distributed_(distributed), nccl_ctxs_(nccl_ctxs) { #else MultiDevSSAGraphBuilder::MultiDevSSAGraphBuilder( const std::vector &places, const std::string &loss_var_name, const std::unordered_set ¶ms, - const std::vector &local_scopes, bool distributed) + const std::vector &local_scopes) : loss_var_name_(loss_var_name), places_(places), - local_scopes_(local_scopes), - distributed_(distributed) { + local_scopes_(local_scopes) { #endif for (auto &p : params) { grad_names_.insert(GradVarName(p)); @@ -99,7 +97,7 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( // append send op if program is distributed trainer main program. // always use the first device - if (is_forwarding && distributed_ && op->Type() == "send") { + if (!is_forwarding && op->Type() == "send") { auto &p = places_[0]; auto *s = local_scopes_[0]; size_t i = 0; diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.h b/paddle/fluid/framework/details/multi_devices_graph_builder.h index 004d6d50ab..de34caab1b 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.h +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.h @@ -34,14 +34,12 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { const std::string &loss_var_name, const std::unordered_set ¶ms, const std::vector &local_scopes, - platform::NCCLContextMap *nccl_ctxs, - bool distributed = false); + platform::NCCLContextMap *nccl_ctxs); #else MultiDevSSAGraphBuilder(const std::vector &places, const std::string &loss_var_name, const std::unordered_set ¶ms, - const std::vector &local_scopes, - bool distributed = false); + const std::vector &local_scopes); #endif std::unique_ptr Build(const ProgramDesc &program) const override; @@ -55,7 +53,6 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { const std::vector &places_; const std::vector &local_scopes_; std::unordered_set grad_names_; - bool distributed_; #ifdef PADDLE_WITH_CUDA platform::NCCLContextMap *nccl_ctxs_; diff --git a/paddle/fluid/framework/parallel_executor.h b/paddle/fluid/framework/parallel_executor.h index c048c3865f..b4f16dba85 100644 --- a/paddle/fluid/framework/parallel_executor.h +++ b/paddle/fluid/framework/parallel_executor.h @@ -48,13 +48,13 @@ class ParallelExecutor { const std::string& fetched_var_name, const std::unordered_map& feed_tensors); + void BCastParamsToGPUs(const std::unordered_set& vars) const; + private: void SplitTensorToPlaces( const std::unordered_map& feed_tensors); ParallelExecutorPrivate* member_; - - void BCastParamsToGPUs(const std::unordered_set& vars) const; }; } // namespace framework diff --git a/paddle/fluid/operators/detail/serde_test.cc b/paddle/fluid/operators/detail/serde_test.cc index f8cae6b26a..cb5f895834 100644 --- a/paddle/fluid/operators/detail/serde_test.cc +++ b/paddle/fluid/operators/detail/serde_test.cc @@ -107,7 +107,7 @@ void RunSerdeTestSelectedRows(platform::Place place) { for (int i = 0; i < tensor_numel; ++i) { EXPECT_FLOAT_EQ(tensor_data2[i], 32.7); } - for (int64_t i = 0; i < rows2->size(); ++i) { + for (size_t i = 0; i < rows2->size(); ++i) { EXPECT_EQ(rows_data2[i], i); } EXPECT_EQ(slr2->height(), 1000); diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index 3924040455..a9a5d87d77 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -554,6 +554,7 @@ All parameter, weight, gradient are variables in Paddle. bcast_vars, main_program, loss_var_name, scope, local_scopes, allow_op_delay); }) + .def("bcast_params", &ParallelExecutor::BCastParamsToGPUs) .def("local_scopes", [](ParallelExecutor &self) -> std::vector * { return &self.GetLocalScopes(); diff --git a/python/paddle/fluid/parallel_executor.py b/python/paddle/fluid/parallel_executor.py index b93f2f974c..a23cc9b772 100644 --- a/python/paddle/fluid/parallel_executor.py +++ b/python/paddle/fluid/parallel_executor.py @@ -99,7 +99,7 @@ class ParallelExecutor(object): local_scopes = share_vars_from.executor.local_scopes( ) if share_vars_from else [] - persistable_vars = [ + self.persistable_vars = [ v.name for v in filter(lambda var: var.persistable, main.list_vars()) ] @@ -112,7 +112,7 @@ class ParallelExecutor(object): p.name for p in main.global_block().iter_parameters() if not p.stop_gradient ]), - set(persistable_vars), + set(self.persistable_vars), main.desc, loss_name if loss_name else '', scope, @@ -142,3 +142,6 @@ class ParallelExecutor(object): self.executor.run(fetch_list, fetch_var_name, feed_tensor_dict) arr = self.scope.find_var(fetch_var_name).get_lod_tensor_array() return [arr[i] for i in range(len(arr))] + + def bcast_params(self): + self.executor.bcast_params(set(self.persistable_vars)) From ad6ddf533cfb1542283f741cddb78835fb3b8658 Mon Sep 17 00:00:00 2001 From: jshower Date: Tue, 10 Apr 2018 09:23:11 +0000 Subject: [PATCH 057/164] for ci --- python/paddle/fluid/tests/book/test_label_semantic_roles.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/tests/book/test_label_semantic_roles.py b/python/paddle/fluid/tests/book/test_label_semantic_roles.py index ace2e39ba4..4d8bca4d24 100644 --- a/python/paddle/fluid/tests/book/test_label_semantic_roles.py +++ b/python/paddle/fluid/tests/book/test_label_semantic_roles.py @@ -37,7 +37,7 @@ depth = 8 mix_hidden_lr = 1e-3 IS_SPARSE = True -PASS_NUM = 10 +PASS_NUM = 100 BATCH_SIZE = 10 embedding_name = 'emb' @@ -234,7 +234,7 @@ def train(use_cuda, save_dirname=None, is_local=True): print("second per batch: " + str((time.time( ) - start_time) / batch_id)) # Set the threshold low to speed up the CI test - if float(pass_precision) > 0.05: + if float(pass_precision) > 0.01: if save_dirname is not None: # TODO(liuyiqun): Change the target to crf_decode fluid.io.save_inference_model(save_dirname, [ From 40e3fe173ca06a8196c3a24906923833cfb0f372 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Tue, 10 Apr 2018 17:46:53 +0800 Subject: [PATCH 058/164] Make cuda_helper.h Pass cpplint --- paddle/fluid/platform/cuda_helper.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/paddle/fluid/platform/cuda_helper.h b/paddle/fluid/platform/cuda_helper.h index 881d611d4a..8758af0804 100644 --- a/paddle/fluid/platform/cuda_helper.h +++ b/paddle/fluid/platform/cuda_helper.h @@ -33,22 +33,26 @@ constexpr int PADDLE_CUDA_NUM_THREADS = 512; USE_CUDA_ATOMIC(Add, float); USE_CUDA_ATOMIC(Add, int); USE_CUDA_ATOMIC(Add, unsigned int); -USE_CUDA_ATOMIC(Add, unsigned long long int); +// CUDA API uses unsigned long long int, we cannot use uint64_t here. +// It because unsigned long long int is not necessarily uint64_t +USE_CUDA_ATOMIC(Add, unsigned long long int); // NOLINT CUDA_ATOMIC_WRAPPER(Add, int64_t) { - static_assert(sizeof(int64_t) == sizeof(long long int), + // Here, we check long long int must be int64_t. + static_assert(sizeof(int64_t) == sizeof(long long int), // NOLINT "long long should be int64"); - return CudaAtomicAdd(reinterpret_cast(address), - static_cast(val)); + return CudaAtomicAdd( + reinterpret_cast(address), // NOLINT + static_cast(val)); // NOLINT } #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 600 USE_CUDA_ATOMIC(Add, double); #else CUDA_ATOMIC_WRAPPER(Add, double) { - unsigned long long int* address_as_ull = - reinterpret_cast(address); - unsigned long long int old = *address_as_ull, assumed; + unsigned long long int* address_as_ull = // NOLINT + reinterpret_cast(address); // NOLINT + unsigned long long int old = *address_as_ull, assumed; // NOLINT do { assumed = old; From adaa9c5bfeabc917b6640b8f1379b6d8c2c8115c Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 10 Apr 2018 19:49:29 +0800 Subject: [PATCH 059/164] update by comments --- .../multi_cluster/k8s_distributed_en.md | 85 ++++++++++--------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md index dfc0f0d3e6..2ed75b4dcc 100644 --- a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md +++ b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md @@ -2,29 +2,29 @@ We introduced how to create a PaddlePaddle Job with a single node on Kuberentes in the previous document. -In this article, we will introduce how to craete a PaddlePaddle job with multiple nodes +In this article, we will introduce how to create a PaddlePaddle job with multiple nodes on Kubernetes cluster. ## Overall Architecture -Before creating a training job, the users need to deploy the Python scripts and -training data which have already been sliced on the precast path in the distributed file -system(We can use the different type of Kuberentes Volumes to mount different distributed -file system). Before start training, The program would copy the training data into the +Before creating a training job, the users need to slice the training data and deploy +the Python scripts along with it into the distributed file system +(We can use the different type of Kuberentes Volumes to mount different distributed +file systems). Before training starts, The program will copy the training data into the Container and also save the models at the same path during training. The global architecture is as follows: ![PaddlePaddle on Kubernetes Architecture](src/k8s-paddle-arch.png) The above figure describes a distributed training architecture which contains 3 nodes, each -Pod would mount a folder of the distributed file system to save training data and models -by Kubernetes Volume. Kubernetes created 3 Pod for this training phase and scheduled these on -3 nodes, each Pod has a PaddlePaddle container. After the containers have been created, -PaddlePaddle would start up the communication between PServer and Trainer and read training +Pod mounts a folder of the distributed file system to save training data and models +by Kubernetes Volume. Kubernetes created 3 Pods for this training phase and scheduled these on +3 nodes, each Pod has a PaddlePaddle container. After the containers car created, +PaddlePaddle starts up the communication between PServer and Trainer and read training data for this training job. -As the description above, we can start up a PaddlePaddle distributed training job on a ready -Kubernetes cluster as the following steps: +As the description above, we can start up a PaddlePaddle distributed training job on a +Kubernetes ready cluster with the following steps: 1. [Build PaddlePaddle Docker Image](#Build a Docker Image) 1. [Split training data and upload to the distributed file system](#Upload Training Data) @@ -35,16 +35,13 @@ We will introduce these steps as follows: ### Build a Docker Image -PaddlePaddle Docker Image needs to support the runtime environment of `Paddle PServer` and -`Paddle Trainer` process and this Docker Image has the two import features: +Training docker image needs to package the paddle pserver and paddle trainer runtimes, as well as two more processes before we can kick off the training: -- Copy the training data into the container. -- Generate the start arguments of `Paddle PServer` and `Paddle Training` process. +- Copying the training data into container. +- Generating the initialization arguments for `Paddle PServer` and `Paddle Training` processes. -Because of the official Docker Image `paddlepaddle/paddle:latest` has already included the -PaddlePaddle executable file, but above features so that we can use the official Docker Image as -a base Image and add some additional scripts to finish the work of building a new image. -You can reference [Dockerfile](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/usage/cluster/src/k8s_train/Dockerfile). +Since the paddlepaddle official docker image already has the runtimes we need, we'll take it as the base image and pack some additional scripts for the processes mentioned above to build our training image. for more detail, please find from the following link: +- https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/usage/cluster/src/k8s_train/Dockerfile ```bash @@ -58,17 +55,17 @@ And then upload the new Docker Image to a Docker hub: docker push [YOUR_REPO]/paddle:mypaddle ``` -**[NOTE]**, in the above command arguments, `[YOUR_REPO]` representative your Docker repository, -you need to use your repository instead of it. We will use `[YOUR_REPO]/paddle:mypaddle` to +**[NOTE]**, in the above command arguments, `[YOUR_REPO]` represents your Docker repository, +you need to use your repository instead of it. We will replace it with your respository name to represent the Docker Image which built in this step. ### Prepare Training Data We can download and split the training job by creating a Kubernetes Job, or custom your image -by editing [k8s_train](./src/k8s_train/README.md). +by editing [k8s_train](./src/k8s_train/). Before creating a Job, we need to bind a [persistenVolumeClaim](https://kubernetes.io/docs/user-guide/persistent-volumes) by the different type of -the different distributed file system, the generated dataset would be saved on this volume. +the different file system, the generated dataset would be saved on this volume. ```yaml apiVersion: batch/v1 @@ -100,7 +97,13 @@ spec: restartPolicy: Never ``` -If success, you can see some information like this: +Create the Job with the following command: + +```bash +> kubectl create -f xxx.yaml +``` + +If created successfully, you can see some information like this: ```base [root@paddle-kubernetes-node0 nfsdir]$ tree -d @@ -117,13 +120,13 @@ If success, you can see some information like this: ``` The `paddle-cluster-job` above is the job name for this training job; we need 3 -PaddlePaddle training node and save the split training data on `paddle-cluster-job` path, -the folder `0`, `1` and `2` representative the `training_id` on each node, `quick_start` folder is used to store training data, `output` folder is used to store the models and logs. +PaddlePaddle training nodes and save the split training data in `paddle-cluster-job` path, +the folder `0`, `1` and `2` represents the `training_id` on each node, `quick_start` folder is used to store training data, `output` folder is used to store the models and logs. ### Create a Job -Kubernetes allow users to create an object with YAML files, and we can use a command-line tool +Kubernetes allow users to create objects with YAML files, and we can use a command-line tool to create it. The Job YAML file describes that which Docker Image would be used in this training job, how much nodes would be created, what's the startup arguments of `Paddle PServer/Trainer` process and what's the type of Volumes. You can find the details of the YAML filed in @@ -177,8 +180,8 @@ spec: In the above YAML file: - `metadata.name`, The job name. -- `parallelism`, The Kubernetes Job would create `parallelism` Pods at the same time. -- `completions`, The Job would become the success status only the number of successful Pod(the exit code is 0) +- `parallelism`, Whether the Kubernetes Job would create `parallelism` Pods at the same time. +- `completions`, The Job would become the success status only when the number of successful Pod(the exit code is 0) is equal to `completions`. - `volumeMounts`, the name field `jobpath` is a key, the `mountPath` field represents the path in the container, and we can define the `jobpath` in `volumes` filed, use `hostPath` @@ -209,13 +212,15 @@ kubectl create -f job.yaml ``` Upon successful creation, Kubernetes would create 3 Pods as PaddlePaddle training node, -, pull the Docker image and begin to train. +pull the Docker image and begin to train. ### Checkout the Output -At the process of training, we can check the logs and the output models, such as we store -the output on `output` folder. **NOTE**, `node_0`, `node_1` and `node_2` represent the +At the process of training, we can check the logs and the output models which is stored in +the `output` folder. + +**NOTE**, `node_0`, `node_1` and `node_2` represent the `trainer_id` of the PaddlePaddle training job rather than the node id of Kubernetes. ```bash @@ -292,7 +297,7 @@ PADDLE_SERVER_NUM = os.getenv("CONF_PADDLE_GRADIENT_NUM") ### Communication between Pods -At the begin of `start_paddle.py`, it would initialize and parse the arguments. +At the begin of `start_paddle.py`, it would initializes and parses the arguments. ```python parser = argparse.ArgumentParser(prog="start_paddle.py", @@ -314,11 +319,12 @@ And then query the status of all the other Pods of this Job by the function `get idMap = getIdMap(podlist) ``` -**NOTE**: `getPodList()` would fetch all the pod in the current namespace, if some Pods are running, may cause some error. We will use [statfulesets](https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets) instead of +**NOTE**: `getPodList()` would prefetch all the Pods in the current namespace, if some +Pods are alreay running, it may cause some error. We will use [statfulesets](https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets) instead of Kubernetes Pod or Replicaset in the future. -For the implement of `getIdMap(podlist)`, this function would fetch each IP address of -`podlist` and then sort them to generate `trainer_id`. +The function `getIdMap(podlist)` fetches IPs addresses of `podlist` and then sort them +to generate `trainer_id`. ```python def getIdMap(podlist): @@ -340,9 +346,10 @@ so that we can start up them by `startPaddle(idMap, train_args_dict)`. ### Create Job -The main goal of `startPaddle` is generating the arguments of `Paddle PServer` and `Paddle Trainer` processes. Such as `Paddle Trainer`, we parse the environment variable and then get -`PADDLE_NIC`, `PADDLE_PORT`, `PADDLE_PORTS_NUM` and etc..., finally find `trainerId` from -`idMap` according to its IP address. +The main goal of `startPaddle` is generating the arguments of `Paddle PServer` and +`Paddle Trainer` processes. Take `Paddle Trainer` as an example, we parse the +environment variable and then get `PADDLE_NIC`, `PADDLE_PORT`, `PADDLE_PORTS_NUM` and etc..., +finally find `trainerId` from `idMap` according to its IP address. ```python program = 'paddle train' From 4a2234987621d4ca1e1a749d056e2402f5e39b5a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 10 Apr 2018 19:52:20 +0800 Subject: [PATCH 060/164] update by comments --- doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md index 2ed75b4dcc..08e546c4f7 100644 --- a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md +++ b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md @@ -277,9 +277,9 @@ I1116 09:10:18.019836 50 ParameterClient2.cpp:122] pserver 5 192.168.129.71:7 ### Using Environment Variables -Usually we use the environment varialbes to configurate the PaddlePaddle Job which running on +Usually we use the environment varialbes to configurate the PaddlePaddle Job which runs in Kubernetes, `start_paddle.py` provides a start up script to convert the environment variable -to the start up argument of PaddlePaddle process: +to the start up arguments of PaddlePaddle process: ```bash API = "/api/v1/namespaces/" From 875d48d106c0ec8943d0d3e9560bd7effe86c1b0 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 10 Apr 2018 19:53:40 +0800 Subject: [PATCH 061/164] edit the title --- doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md index 08e546c4f7..dee1b7554f 100644 --- a/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md +++ b/doc/v2/howto/cluster/multi_cluster/k8s_distributed_en.md @@ -1,4 +1,4 @@ -# Kubernetes Distributed Training +# Distributed Training on Kubernetes We introduced how to create a PaddlePaddle Job with a single node on Kuberentes in the previous document. From ce08dc8751b5f605ce6aece70ce6f16af72f4759 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Tue, 10 Apr 2018 20:40:43 +0800 Subject: [PATCH 062/164] have stream removed error --- .../details/multi_devices_graph_builder.cc | 34 ++++++++----------- .../details/multi_devices_graph_builder.h | 2 +- .../fluid/framework/details/send_op_handle.cc | 10 +++--- .../fluid/framework/details/send_op_handle.h | 4 +-- python/paddle/fluid/distribute_transpiler.py | 1 + python/paddle/fluid/parallel_executor.py | 4 ++- 6 files changed, 24 insertions(+), 31 deletions(-) diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.cc b/paddle/fluid/framework/details/multi_devices_graph_builder.cc index 8a53270110..0ebcd627bd 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.cc +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.cc @@ -57,8 +57,11 @@ MultiDevSSAGraphBuilder::MultiDevSSAGraphBuilder( void MultiDevSSAGraphBuilder::CreateOpHandleIOs(SSAGraph *result, OpDesc *op, const platform::Place &p, - const size_t &i) const { + const size_t &i, + bool create_output) const { auto *op_handle = result->ops_.back().get(); + op_handle->dev_ctxes_[p] = const_cast( + platform::DeviceContextPool::Instance().Get(p)); auto var_names = op->InputArgumentNames(); @@ -66,10 +69,12 @@ void MultiDevSSAGraphBuilder::CreateOpHandleIOs(SSAGraph *result, OpDesc *op, VarHandle *var = CreateOrGetLatestVarHandle(result, each_var_name, p, i); op_handle->AddInput(var); } - var_names = op->OutputArgumentNames(); + if (create_output) { + var_names = op->OutputArgumentNames(); - for (auto &each_var_name : var_names) { - CreateOpOutput(result, op_handle, each_var_name, p, i); + for (auto &each_var_name : var_names) { + CreateOpOutput(result, op_handle, each_var_name, p, i); + } } } @@ -100,9 +105,11 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( if (!is_forwarding && op->Type() == "send") { auto &p = places_[0]; auto *s = local_scopes_[0]; - size_t i = 0; - result.ops_.emplace_back(new SendOpHandle(*op, s, p)); - CreateOpHandleIOs(&result, op, p, i); + // FIXME(wuyi): send op always copy from GPU 0 + result.ops_.emplace_back(new SendOpHandle(*op, s)); + // Create inputs for output on original place and no ssa output + // is created for send op. + CreateOpHandleIOs(&result, op, p, 0, false); continue; } @@ -112,23 +119,10 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( result.ops_.emplace_back(new ComputationOpHandle(*op, s, p)); auto *op_handle = result.ops_.back().get(); - op_handle->dev_ctxes_[p] = const_cast( - platform::DeviceContextPool::Instance().Get(p)); - CreateOpHandleIOs(&result, op, p, i); - // auto var_names = op->InputArgumentNames(); - // for (auto &each_var_name : var_names) { - // VarHandle *var = - // CreateOrGetLatestVarHandle(&result, each_var_name, p, i); - // op_handle->AddInput(var); - // } auto var_names = op->OutputArgumentNames(); - // for (auto &each_var_name : var_names) { - // CreateOpOutput(&result, op_handle, each_var_name, p, i); - // } - if (is_forwarding) { if (var_names.size() == 1 && var_names[0] == loss_var_name_) { // Insert ScaleCost OpHandle diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.h b/paddle/fluid/framework/details/multi_devices_graph_builder.h index de34caab1b..137c817fde 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.h +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.h @@ -46,7 +46,7 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { private: void CreateOpHandleIOs(SSAGraph *result, OpDesc *op, const platform::Place &p, - const size_t &i) const; + const size_t &i, bool create_output = true) const; private: std::string loss_var_name_; diff --git a/paddle/fluid/framework/details/send_op_handle.cc b/paddle/fluid/framework/details/send_op_handle.cc index ae5637b804..caacfa6b1e 100644 --- a/paddle/fluid/framework/details/send_op_handle.cc +++ b/paddle/fluid/framework/details/send_op_handle.cc @@ -19,11 +19,9 @@ namespace framework { namespace details { SendOpHandle::SendOpHandle(const framework::OpDesc &op_desc, - const Scope *local_scope, - const platform::Place &place) + const Scope *local_scope) : op_(framework::OpRegistry::CreateOp(op_desc)), - local_scope_(local_scope), - place_(place) {} + local_scope_(local_scope) {} void SendOpHandle::RunImpl() { // Wait input done @@ -31,8 +29,8 @@ void SendOpHandle::RunImpl() { auto &p = static_cast(in)->place_; in->generated_op_->Wait(dev_ctxes_[p]); } - - op_->Run(*local_scope_, place_); + platform::CPUPlace cpu; + op_->Run(*local_scope_, cpu); } std::string SendOpHandle::Name() const { return "send"; } diff --git a/paddle/fluid/framework/details/send_op_handle.h b/paddle/fluid/framework/details/send_op_handle.h index e7857c1f23..8a7b62ba1c 100644 --- a/paddle/fluid/framework/details/send_op_handle.h +++ b/paddle/fluid/framework/details/send_op_handle.h @@ -31,10 +31,8 @@ namespace details { struct SendOpHandle : public OpHandleBase { std::unique_ptr op_; const Scope* local_scope_; - const platform::Place& place_; - SendOpHandle(const framework::OpDesc& op_desc, const Scope* local_scope, - const platform::Place& place); + SendOpHandle(const framework::OpDesc& op_desc, const Scope* local_scope); std::string Name() const override; diff --git a/python/paddle/fluid/distribute_transpiler.py b/python/paddle/fluid/distribute_transpiler.py index 0ec3ebc7e3..e18ace844e 100644 --- a/python/paddle/fluid/distribute_transpiler.py +++ b/python/paddle/fluid/distribute_transpiler.py @@ -255,6 +255,7 @@ class DistributeTranspiler: 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) + self.program.sync_with_cpp() # FIXME(typhoonzero): serialize once will fix error occurs when clone. self.program.__str__() return self.program diff --git a/python/paddle/fluid/parallel_executor.py b/python/paddle/fluid/parallel_executor.py index a23cc9b772..c709f364c1 100644 --- a/python/paddle/fluid/parallel_executor.py +++ b/python/paddle/fluid/parallel_executor.py @@ -101,7 +101,9 @@ class ParallelExecutor(object): self.persistable_vars = [ v.name - for v in filter(lambda var: var.persistable, main.list_vars()) + for v in filter(lambda var: \ + var.persistable and var.type != core.VarDesc.VarType.RAW, + main.list_vars()) ] self.executor = core.ParallelExecutor( From 19c1a68ee9d73e24205ce05265ac4c24e60552cc Mon Sep 17 00:00:00 2001 From: wanghaoshuang Date: Tue, 10 Apr 2018 22:20:25 +0800 Subject: [PATCH 063/164] Fix lost of LoD while splitting tensor in parallel executor. --- paddle/fluid/framework/parallel_executor.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/framework/parallel_executor.cc b/paddle/fluid/framework/parallel_executor.cc index 99b3065d8d..f393105fe8 100644 --- a/paddle/fluid/framework/parallel_executor.cc +++ b/paddle/fluid/framework/parallel_executor.cc @@ -181,10 +181,10 @@ void ParallelExecutor::SplitTensorToPlaces( member_->places_.size(), lod_tensors.size()); for (size_t j = 0; j < member_->places_.size(); ++j) { // TODO(panxy0718): Do I need to delete this var? - member_->local_scopes_[j] - ->Var(it.first) - ->GetMutable() - ->ShareDataWith(lod_tensors[j]); + auto t = + member_->local_scopes_[j]->Var(it.first)->GetMutable(); + t->ShareDataWith(lod_tensors[j]); + t->set_lod(lod_tensors[j].lod()); } } } From a84b81502cd26c02fbc3b4c46d751b0363a5ff46 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 11 Apr 2018 01:30:56 +0800 Subject: [PATCH 064/164] Remove Readers' HasNext() --- paddle/fluid/framework/lod_tensor.cc | 32 ++++---- paddle/fluid/framework/lod_tensor.h | 7 +- paddle/fluid/framework/lod_tensor_test.cc | 18 ++--- paddle/fluid/framework/reader.h | 13 +--- .../reader/create_double_buffer_reader_op.cc | 38 +++++----- .../reader/create_multi_pass_reader_op.cc | 16 +--- .../reader/create_random_data_generator_op.cc | 4 +- .../reader/create_recordio_file_reader_op.cc | 10 +-- .../reader/create_shuffle_reader_op.cc | 24 +++--- .../reader/create_threaded_reader_op.cc | 75 ++++--------------- .../fluid/operators/reader/open_files_op.cc | 25 ++++--- paddle/fluid/pybind/pybind.cc | 1 - paddle/fluid/pybind/recordio.cc | 2 +- python/paddle/fluid/layers/io.py | 10 +-- 14 files changed, 105 insertions(+), 170 deletions(-) diff --git a/paddle/fluid/framework/lod_tensor.cc b/paddle/fluid/framework/lod_tensor.cc index 8155cb55a4..a56674cbe2 100644 --- a/paddle/fluid/framework/lod_tensor.cc +++ b/paddle/fluid/framework/lod_tensor.cc @@ -12,9 +12,14 @@ 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/lod_tensor.h" +#include +#include +#include +#include + #include "paddle/fluid/framework/data_type.h" #include "paddle/fluid/framework/framework.pb.h" +#include "paddle/fluid/framework/lod_tensor.h" #include "paddle/fluid/memory/memcpy.h" #include "paddle/fluid/memory/memory.h" @@ -22,11 +27,6 @@ limitations under the License. */ #include "paddle/fluid/recordio/scanner.h" #include "paddle/fluid/recordio/writer.h" -#include -#include -#include -#include - namespace paddle { namespace framework { @@ -294,7 +294,7 @@ void DeserializeFromStream(std::istream &is, LoDTensor *tensor, TensorFromStream(is, static_cast(tensor), dev_ctx); } -void WriteToRecordIO(recordio::Writer &writer, +void WriteToRecordIO(recordio::Writer *writer, const std::vector &tensor, const platform::DeviceContext &dev_ctx) { std::stringstream buffer; @@ -303,18 +303,20 @@ void WriteToRecordIO(recordio::Writer &writer, for (auto &each : tensor) { SerializeToStream(buffer, each, dev_ctx); } - writer.Write(buffer.str()); + writer->Write(buffer.str()); } std::vector ReadFromRecordIO( - recordio::Scanner &scanner, const platform::DeviceContext &dev_ctx) { - std::istringstream sin(scanner.Next()); - uint32_t sz; - sin.read(reinterpret_cast(&sz), sizeof(uint32_t)); + recordio::Scanner *scanner, const platform::DeviceContext &dev_ctx) { std::vector result; - result.resize(sz); - for (uint32_t i = 0; i < sz; ++i) { - DeserializeFromStream(sin, &result[i], dev_ctx); + if (scanner->HasNext()) { + std::istringstream sin(scanner->Next()); + uint32_t sz; + sin.read(reinterpret_cast(&sz), sizeof(uint32_t)); + result.resize(sz); + for (uint32_t i = 0; i < sz; ++i) { + DeserializeFromStream(sin, &result[i], dev_ctx); + } } return result; } diff --git a/paddle/fluid/framework/lod_tensor.h b/paddle/fluid/framework/lod_tensor.h index 4f130d2659..1159fee39b 100644 --- a/paddle/fluid/framework/lod_tensor.h +++ b/paddle/fluid/framework/lod_tensor.h @@ -15,6 +15,9 @@ limitations under the License. */ #pragma once #include +#include +#include +#include #ifdef PADDLE_WITH_CUDA #include #include @@ -216,12 +219,12 @@ void SerializeToStream(std::ostream& os, const LoDTensor& tensor, void DeserializeFromStream(std::istream& is, LoDTensor* tensor, const platform::DeviceContext& dev_ctx); -extern void WriteToRecordIO(recordio::Writer& writer, +extern void WriteToRecordIO(recordio::Writer* writer, const std::vector& tensor, const platform::DeviceContext& dev_ctx); extern std::vector ReadFromRecordIO( - recordio::Scanner& scanner, const platform::DeviceContext& dev_ctx); + recordio::Scanner* scanner, const platform::DeviceContext& dev_ctx); } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/lod_tensor_test.cc b/paddle/fluid/framework/lod_tensor_test.cc index e691e29383..97ab98f09b 100644 --- a/paddle/fluid/framework/lod_tensor_test.cc +++ b/paddle/fluid/framework/lod_tensor_test.cc @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "paddle/fluid/framework/lod_tensor.h" - -#include "paddle/fluid/recordio/scanner.h" -#include "paddle/fluid/recordio/writer.h" - #include #include #include #include #include +#include "paddle/fluid/framework/lod_tensor.h" + +#include "paddle/fluid/recordio/scanner.h" +#include "paddle/fluid/recordio/writer.h" + namespace paddle { namespace framework { @@ -240,8 +240,8 @@ TEST(LoDTensor, RecordIO) { *platform::DeviceContextPool::Instance().Get(platform::CPUPlace()); { recordio::Writer writer(stream, recordio::Compressor::kSnappy); - WriteToRecordIO(writer, {tensor, tensor}, ctx); - WriteToRecordIO(writer, {tensor, tensor}, ctx); + WriteToRecordIO(&writer, {tensor, tensor}, ctx); + WriteToRecordIO(&writer, {tensor, tensor}, ctx); writer.Flush(); } @@ -254,11 +254,11 @@ TEST(LoDTensor, RecordIO) { { std::unique_ptr stream_ptr(stream); recordio::Scanner scanner(std::move(stream_ptr)); - auto tensors = ReadFromRecordIO(scanner, ctx); + auto tensors = ReadFromRecordIO(&scanner, ctx); ASSERT_EQ(tensors.size(), 2); assert_tensor_ok(tensors[0]); assert_tensor_ok(tensors[1]); - tensors = ReadFromRecordIO(scanner, ctx); + tensors = ReadFromRecordIO(&scanner, ctx); ASSERT_EQ(tensors.size(), 2); assert_tensor_ok(tensors[0]); assert_tensor_ok(tensors[1]); diff --git a/paddle/fluid/framework/reader.h b/paddle/fluid/framework/reader.h index 3573b99bec..3a413941df 100644 --- a/paddle/fluid/framework/reader.h +++ b/paddle/fluid/framework/reader.h @@ -14,14 +14,13 @@ #pragma once +#include +#include + #include "paddle/fluid/framework/ddim.h" #include "paddle/fluid/framework/lod_tensor_array.h" #include "paddle/fluid/platform/place.h" -#include -#include -#include - namespace paddle { namespace framework { @@ -31,8 +30,6 @@ class ReaderBase { virtual void ReInit() = 0; - virtual bool HasNext() const = 0; - virtual ~ReaderBase(); }; @@ -44,8 +41,6 @@ class DecoratedReader : public ReaderBase { void ReInit() override { reader_->ReInit(); } - bool HasNext() const override { return reader_->HasNext(); } - protected: ReaderBase* reader_; }; @@ -80,8 +75,6 @@ class ReaderHolder { reader_->ReInit(); } - bool HasNext() const { return reader_->HasNext(); } - private: std::unique_ptr reader_; }; diff --git a/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc b/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc index d9f799f14d..33a50b5ceb 100644 --- a/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc +++ b/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc @@ -63,13 +63,14 @@ class DoubleBufferReader : public framework::DecoratedReader { StartPrefetcher(); } - bool HasNext() const override; void ReadNext(std::vector* out) override; void ReInit() override; ~DoubleBufferReader() { EndPrefetcher(); } private: + bool HasNext() const; + void StartPrefetcher() { channel_ = framework::MakeChannel(kChannelSize); prefetcher_ = std::thread([this] { PrefetchThreadFunc(); }); @@ -149,22 +150,15 @@ class CreateDoubleBufferReaderOpMaker : public DecoratedReaderMakerBase { } }; -bool DoubleBufferReader::HasNext() const { - while (!channel_->IsClosed() && !channel_->CanReceive()) { - } - return channel_->CanReceive(); -} - void DoubleBufferReader::ReadNext(std::vector* out) { - if (!HasNext()) { - PADDLE_THROW("There is no next data!"); - } - - Item batch; - channel_->Receive(&batch); - *out = batch.payloads_; - if (batch.ctx_) { - batch.ctx_->Wait(); + out->clear(); + if (HasNext()) { + Item batch; + channel_->Receive(&batch); + *out = batch.payloads_; + if (batch.ctx_) { + batch.ctx_->Wait(); + } } } @@ -174,16 +168,26 @@ void DoubleBufferReader::ReInit() { StartPrefetcher(); } +bool DoubleBufferReader::HasNext() const { + while (!channel_->IsClosed() && !channel_->CanReceive()) { + } + return channel_->CanReceive(); +} + void DoubleBufferReader::PrefetchThreadFunc() { VLOG(5) << "A new prefetch thread starts."; std::vector> cpu_tensor_cache(kCacheSize); std::vector> gpu_tensor_cache(kCacheSize); size_t cached_tensor_id = 0; - while (reader_->HasNext()) { + while (true) { Item batch; auto& cpu_batch = cpu_tensor_cache[cached_tensor_id]; reader_->ReadNext(&cpu_batch); + if (cpu_batch.empty()) { + // The underlying reader have no next data. + break; + } if (platform::is_gpu_place(place_)) { auto& gpu_batch = gpu_tensor_cache[cached_tensor_id]; auto* gpu_ctx = ctxs_[cached_tensor_id].get(); diff --git a/paddle/fluid/operators/reader/create_multi_pass_reader_op.cc b/paddle/fluid/operators/reader/create_multi_pass_reader_op.cc index b72ccc77a3..0573345ba5 100644 --- a/paddle/fluid/operators/reader/create_multi_pass_reader_op.cc +++ b/paddle/fluid/operators/reader/create_multi_pass_reader_op.cc @@ -25,22 +25,12 @@ class MultiPassReader : public framework::DecoratedReader { : DecoratedReader(reader), pass_num_(pass_num), pass_count_(0) {} void ReadNext(std::vector* out) override { - if (!HasNext()) { - PADDLE_THROW("There is no next data!"); - } reader_->ReadNext(out); - } - - bool HasNext() const override { - if (reader_->HasNext()) { - return true; - } else { + if (out->empty()) { ++pass_count_; - if (pass_count_ >= pass_num_) { - return false; - } else { + if (pass_count_ < pass_num_) { reader_->ReInit(); - return true; + reader_->ReadNext(out); } } } diff --git a/paddle/fluid/operators/reader/create_random_data_generator_op.cc b/paddle/fluid/operators/reader/create_random_data_generator_op.cc index 95d8674c08..d1cb8e47da 100644 --- a/paddle/fluid/operators/reader/create_random_data_generator_op.cc +++ b/paddle/fluid/operators/reader/create_random_data_generator_op.cc @@ -52,8 +52,6 @@ class RandomDataGenerator : public framework::ReaderBase { void ReInit() override { return; } - bool HasNext() const override { return true; } - private: float min_; float max_; @@ -74,7 +72,7 @@ class CreateRandomDataGeneratorOp : public framework::OperatorBase { const auto& ranks = Attr>("ranks"); PADDLE_ENFORCE(!shape_concat.empty() && !ranks.empty()); PADDLE_ENFORCE_EQ(std::accumulate(ranks.begin(), ranks.end(), 0), - int(shape_concat.size()), + static_cast(shape_concat.size()), "The accumulate of all ranks should be equal to the " "shape concat's length."); std::vector shapes = RestoreShapes(shape_concat, ranks); 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 adaa0b9e5f..2ae2972556 100644 --- a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc +++ b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include #include "paddle/fluid/operators/reader/reader_op_registry.h" #include "paddle/fluid/recordio/scanner.h" @@ -35,17 +33,15 @@ class RecordIOFileReader : public framework::FileReader { LOG(INFO) << "Creating file reader" << filename; } - bool HasNext() const override { return scanner_.HasNext(); } - void ReInit() override { scanner_.Reset(); } protected: void ReadNextImpl(std::vector* out) override { if (ThreadSafe) { std::lock_guard guard(*mutex_); - *out = framework::ReadFromRecordIO(scanner_, dev_ctx_); + *out = framework::ReadFromRecordIO(&scanner_, dev_ctx_); } else { - *out = framework::ReadFromRecordIO(scanner_, dev_ctx_); + *out = framework::ReadFromRecordIO(&scanner_, dev_ctx_); } } @@ -66,7 +62,7 @@ class CreateRecordIOReaderOp : public framework::OperatorBase { const auto& ranks = Attr>("ranks"); PADDLE_ENFORCE(!shape_concat.empty() && !ranks.empty()); PADDLE_ENFORCE_EQ(std::accumulate(ranks.begin(), ranks.end(), 0), - int(shape_concat.size()), + static_cast(shape_concat.size()), "The accumulate of all ranks should be equal to the " "shape concat's length."); std::string filename = Attr("filename"); diff --git a/paddle/fluid/operators/reader/create_shuffle_reader_op.cc b/paddle/fluid/operators/reader/create_shuffle_reader_op.cc index b164ce232d..13825d6591 100644 --- a/paddle/fluid/operators/reader/create_shuffle_reader_op.cc +++ b/paddle/fluid/operators/reader/create_shuffle_reader_op.cc @@ -30,35 +30,33 @@ class ShuffleReader : public framework::DecoratedReader { std::random_device device; seed_ = device(); } - ReadIntoBuffers(); + ReloadBuffer(); } void ReadNext(std::vector* out) override { - if (!HasNext()) { - PADDLE_THROW("There is no next data!"); - } + out->clear(); if (iteration_pos_ >= buffer_.size()) { VLOG(10) << "Resetting shuffle buffer"; - ReadIntoBuffers(); + ReloadBuffer(); + if (buffer_.empty()) { + return; + } } *out = buffer_[iteration_pos_++]; } - bool HasNext() const override { - return iteration_pos_ < buffer_.size() || reader_->HasNext(); - } - private: - void ReadIntoBuffers() { + void ReloadBuffer() { buffer_.clear(); buffer_.reserve(buffer_size_); iteration_pos_ = 0; for (size_t i = 0; i < buffer_size_; ++i) { - if (!reader_->HasNext()) { + std::vector ins; + reader_->ReadNext(&ins); + if (ins.empty()) { break; } - buffer_.emplace_back(); - reader_->ReadNext(&buffer_.back()); + buffer_.emplace_back(ins); } std::mt19937 g(seed_); std::shuffle(buffer_.begin(), buffer_.end(), g); diff --git a/paddle/fluid/operators/reader/create_threaded_reader_op.cc b/paddle/fluid/operators/reader/create_threaded_reader_op.cc index 7b10135afc..cbf709d5e7 100644 --- a/paddle/fluid/operators/reader/create_threaded_reader_op.cc +++ b/paddle/fluid/operators/reader/create_threaded_reader_op.cc @@ -21,67 +21,27 @@ namespace reader { class ThreadedReader : public framework::DecoratedReader { public: - ThreadedReader(ReaderBase* reader, bool unsafe_mode) - : DecoratedReader(reader), unsafe_mode_(unsafe_mode) {} + ThreadedReader(ReaderBase* reader, bool safe_mode) + : DecoratedReader(reader), safe_mode_(safe_mode) {} void ReadNext(std::vector* out) override { std::lock_guard lock(mutex_); - if (!unsafe_mode_) { - if (!reader_->HasNext()) { - PADDLE_THROW("There is no next data!"); - } - reader_->ReadNext(out); - } else { - auto& thread_buffer = thread_buffers_[std::this_thread::get_id()]; - if (thread_buffer.empty()) { - PADDLE_THROW( - "thread_buffer is empty! HasNext() must be invoked before " - "ReadNext() in the same thread."); - } - *out = thread_buffer; - thread_buffer.clear(); - } - } - - bool HasNext() const override { - if (!unsafe_mode_) { - PADDLE_THROW( - "ThreadedReader::HasNext() is disabled when 'unsafe_mode' is false."); - } - std::thread::id thread_id = std::this_thread::get_id(); - std::lock_guard lock(mutex_); - auto& thread_buffer = thread_buffers_[thread_id]; - if (thread_buffer.empty() && reader_->HasNext()) { - reader_->ReadNext(&thread_buffer); - } - return !thread_buffer.empty(); + reader_->ReadNext(out); } void ReInit() override { - if (!unsafe_mode_) { + if (safe_mode_) { PADDLE_THROW( - "ThreadedReader::ReInit() is disabled when 'unsafe_mode' is false."); + "ThreadedReader::ReInit() is disabled when 'safe_mode' is true."); } VLOG(5) << "ThreadedReader::ReInit() is invoked! It might be buggy in " "multi-thread environment."; reader_->ReInit(); } - ~ThreadedReader() { - for (auto& p : thread_buffers_) { - if (!p.second.empty()) { - PADDLE_THROW( - "Find an unused data batch in ThreadedReader! Maybe one thread " - "invokes 'HasNext()' without subsequent 'ReadNext()'."); - } - } - } - private: - bool unsafe_mode_; - mutable std::mutex mutex_; - mutable std::unordered_map> - thread_buffers_; + bool safe_mode_; + std::mutex mutex_; }; class CreateThreadedReaderOp : public framework::OperatorBase { @@ -98,8 +58,8 @@ class CreateThreadedReaderOp : public framework::OperatorBase { } const auto& underlying_reader = scope.FindVar(Input("UnderlyingReader")) ->Get(); - bool unsafe_mode = Attr("unsafe_mode"); - out->Reset(new ThreadedReader(underlying_reader.Get(), unsafe_mode)); + bool safe_mode = Attr("safe_mode"); + out->Reset(new ThreadedReader(underlying_reader.Get(), safe_mode)); } }; @@ -107,10 +67,9 @@ class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { public: CreateThreadedReaderOpMaker(OpProto* op_proto, OpAttrChecker* op_checker) : DecoratedReaderMakerBase(op_proto, op_checker) { - AddAttr("unsafe_mode", - "When 'unsafe_mode' is false, invoking 'HasNext()' or " - "'ReInit()' is not allowed to avoid unexpected bugs in " - "multi-thread environment.") + AddAttr("safe_mode", + "When 'safe_mode' is true, 'ReInit()' is disabled to avoid " + "unexpected bugs in multi-thread environment.") .SetDefault(true); AddComment(R"DOC( CreateThreadedReader Operator @@ -118,13 +77,9 @@ class CreateThreadedReaderOpMaker : public DecoratedReaderMakerBase { This operator creates a threaded reader. A threaded reader's 'ReadNext()' can be invoked by several threads at the same time. - When the attribute 'unsafe_mode' is false, the threaded reader's - 'HasNext()' and 'ReInit()' will be disabled to avoid unexpected - bugs in multi-thread environment. If you really need them, you - can enable them by setting 'unsafe_mode' true. In this case, - 'HasNext()' returning true only guarantees the safety of - invoking 'ReadNext()' in the same thread. Each thread must - invoke 'HasNext()' and 'ReadNext()' in pairs. + When the attribute 'safe_mode' is true, the threaded reader's + 'ReInit()' is disabled to avoid unexpected bugs in multi-thread + environment. )DOC"); } }; diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index 45db94e780..9ce2e5dc2c 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -30,12 +30,12 @@ class MultiFileReader : public framework::ReaderBase { } void ReadNext(std::vector* out) override; - bool HasNext() const override; void ReInit() override; ~MultiFileReader() { EndScheduler(); } private: + bool HasNext(); void StartNewScheduler(); void EndScheduler(); void ScheduleThreadFunc(); @@ -52,16 +52,10 @@ class MultiFileReader : public framework::ReaderBase { }; void MultiFileReader::ReadNext(std::vector* out) { - if (!HasNext()) { - PADDLE_THROW("There is no next data!"); + out->clear(); + if (HasNext()) { + buffer_->Receive(out); } - buffer_->Receive(out); -} - -bool MultiFileReader::HasNext() const { - while (!buffer_->IsClosed() && !buffer_->CanReceive()) { - } - return buffer_->CanReceive(); } void MultiFileReader::ReInit() { @@ -69,6 +63,12 @@ void MultiFileReader::ReInit() { StartNewScheduler(); } +bool MultiFileReader::HasNext() { + while (!buffer_->IsClosed() && !buffer_->CanReceive()) { + } + return buffer_->CanReceive(); +} + void MultiFileReader::StartNewScheduler() { size_t thread_num = prefetchers_.size(); waiting_file_idx_ = framework::MakeChannel(file_names_.size()); @@ -140,9 +140,12 @@ void MultiFileReader::PrefetchThreadFunc(std::string file_name, VLOG(5) << "The prefetch thread of file '" << file_name << "' starts."; std::unique_ptr reader = CreateReaderByFileName(file_name, dims_); - while (reader->HasNext()) { + while (true) { std::vector ins; reader->ReadNext(&ins); + if (ins.empty()) { + break; + } try { buffer_->Send(&ins); } catch (paddle::platform::EnforceNotMet e) { diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index bd8446df66..c7a5d1c714 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -252,7 +252,6 @@ All parameter, weight, gradient are variables in Paddle. py::return_value_policy::reference); py::class_(m, "Reader", "") - .def("has_next", &framework::ReaderHolder::HasNext) .def("reset", &framework::ReaderHolder::ReInit); py::class_(m, "Scope", "") diff --git a/paddle/fluid/pybind/recordio.cc b/paddle/fluid/pybind/recordio.cc index 0644d91425..330d104e0a 100644 --- a/paddle/fluid/pybind/recordio.cc +++ b/paddle/fluid/pybind/recordio.cc @@ -39,7 +39,7 @@ class RecordIOWriter { void CompleteAppendTensor() { auto& ctx = *platform::DeviceContextPool::Instance().Get(platform::CPUPlace()); - framework::WriteToRecordIO(writer_, tensors_, ctx); + framework::WriteToRecordIO(&writer_, tensors_, ctx); tensors_.clear(); } diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index d016ab9008..8ba6bd18e9 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -236,13 +236,9 @@ def monkey_patch_reader_methods(reader): var = scope.find_var(reader.name) return var.get_reader() - def eof(): - return not __get_reader__().has_next() - def reset(): return __get_reader__().reset() - reader.eof = eof reader.reset = reset reader.stop_gradient = True reader.persistable = True @@ -299,8 +295,7 @@ def open_recordio_file(filename, 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. - pass_num(int): Number of passes to run. After completing the - given number of passes, 'has_next()' will return False. + pass_num(int): Number of passes to run. for_parallel(Bool): Set it as True if you are going to run subsequent operators in parallel. @@ -377,8 +372,7 @@ def open_files(filenames, dtypes(list): List of strs which declaring data type. thread_num(int): The maximal concurrent prefetch thread number. buffer_size(int): The size of prefetch buffer. - pass_num(int): Number of passes to run. After completing the - given number of passes, 'has_next()' will return False. + pass_num(int): Number of passes to run. for_parallel(Bool): Set it as True if you are going to run subsequent operators in parallel. From 7a7829466664aff8a41364d566b852ca5859bed2 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 11 Apr 2018 01:37:24 +0800 Subject: [PATCH 065/164] Remove Readers' HasNext() --- paddle/fluid/operators/reader/open_files_op.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index 9ce2e5dc2c..779dc8a6a0 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include // NOLINT + #include "paddle/fluid/framework/channel.h" #include "paddle/fluid/operators/reader/reader_op_registry.h" From 3ebc5e1b7a3545b31df85d1b65afec0c8b7aefc1 Mon Sep 17 00:00:00 2001 From: cwgis Date: Wed, 11 Apr 2018 02:07:16 +0800 Subject: [PATCH 066/164] Update compile_paddle_lib_en.md (#9795) * Update compile_paddle_lib_en.md Fix https://github.com/PaddlePaddle/Paddle/issues/8916 * Update compile_paddle_lib_en.md --- doc/v2/howto/capi/compile_paddle_lib_en.md | 174 ++++++++++++++++++++- 1 file changed, 173 insertions(+), 1 deletion(-) diff --git a/doc/v2/howto/capi/compile_paddle_lib_en.md b/doc/v2/howto/capi/compile_paddle_lib_en.md index 11d69b9b79..6212a30811 100644 --- a/doc/v2/howto/capi/compile_paddle_lib_en.md +++ b/doc/v2/howto/capi/compile_paddle_lib_en.md @@ -1,3 +1,175 @@ ## Install and Build -TBD +### Download & Install + + Download the latest C-API development package from CI system and install. You can find the required version in the table below: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Version TipsC-API
cpu_avx_mklpaddle.tgz
cpu_avx_openblas-
cpu_noavx_openblaspaddle.tgz
cuda7.5_cudnn5_avx_mklpaddle.tgz
cuda8.0_cudnn5_avx_mklpaddle.tgz
cuda8.0_cudnn7_avx_mklpaddle.tgz
+ +### From source + + Users can also compile the C-API library from PaddlePaddle source code by compiling with the following compilation options: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionsValue
WITH_C_APION
WITH_PYTHONOFF(recommended)
WITH_SWIG_PYOFF(recommended)
WITH_GOLANGOFF(recommended)
WITH_GPUON/OFF
WITH_MKLON/OFF
+ +It is best to set up with recommended values to avoid linking with unnecessary libraries. Set other compilation options as you need. + +Pull the latest following code snippet from github, and configure compilation options(replace PADDLE_ROOT with the installation path of the PaddlePaddle C-API inference library): + +```shell +PADDLE_ROOT=/path/of/capi +git clone https://github.com/PaddlePaddle/Paddle.git +cd Paddle +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=$PADDLE_ROOT \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_C_API=ON \ + -DWITH_SWIG_PY=OFF \ + -DWITH_GOLANG=OFF \ + -DWITH_PYTHON=OFF \ + -DWITH_MKL=OFF \ + -DWITH_GPU=OFF \ + .. +``` + +After running the above code to generate Makefile , run: `make && make install`. After successful compilation, the dependencies required by C-API(includes: (1)PaddlePaddle inference library and header files; (2) Third-party libraries and header files) will be stored in the `PADDLE_ROOT` directory. + +If the compilation is successful, see the following directory structure under `PADDLE_ROOT`(includes PaddlePaddle header files and libraries, and third-party libraries and header files(determined by the link methods if necessary)): + +```text +├── include +│   └── paddle +│   ├── arguments.h +│   ├── capi.h +│   ├── capi_private.h +│   ├── config.h +│   ├── error.h +│   ├── gradient_machine.h +│   ├── main.h +│   ├── matrix.h +│   ├── paddle_capi.map +│   └── vector.h +├── lib +│   ├── libpaddle_capi_engine.a +│   ├── libpaddle_capi_layers.a +│   ├── libpaddle_capi_shared.so +│   └── libpaddle_capi_whole.a +└── third_party + ├── gflags + │   ├── include + │   │   └── gflags + │   │   ├── gflags_completions.h + │   │   ├── gflags_declare.h + │   │   ... + │   └── lib + │   └── libgflags.a + ├── glog + │   ├── include + │   │   └── glog + │   │   ├── config.h + │   │   ... + │   └── lib + │   └── libglog.a + ├── openblas + │   ├── include + │   │   ├── cblas.h + │   │   ... + │   └── lib + │   ... + ├── protobuf + │   ├── include + │   │   └── google + │   │   └── protobuf + │   │   ... + │   └── lib + │   └── libprotobuf-lite.a + └── zlib + ├── include + │   ... + └── lib + ... + +``` + +### Linking Description: + +There are three kinds of linking methods: + +1. Linking with dynamic library `libpaddle_capi_shared.so`(This way is much more convenient and easier, **Without special requirements, it is recommended**), refer to the following: + 1. Compiling with CPU version and using `OpenBLAS`; only need to link one library named `libpaddle_capi_shared.so` to develop prediction program through C-API. + 1. Compiling with CPU version and using `MKL` lib, you need to link MKL library directly to develop prediction program through PaddlePaddle C-API, due to `MKL` has its own dynamic library. + 1. Compiling with GPU version, CUDA library will be loaded dynamically on prediction program run-time, and also set CUDA library to  `LD_LIBRARY_PATH` environment variable. + +2. Linking with static library `libpaddle_capi_whole.a`,refer to the following: + 1. Specify `-Wl,--whole-archive` linking options. + 1. Explicitly link third-party libraries such as `gflags`、`glog`、`libz`、`protobuf` .etc, you can find them under `PADDLE_ROOT/third_party` directory. + 1. Use OpenBLAS library if compiling C-API,must explicitly link `libopenblas.a`. + 1. Use MKL when compiling C-API, must explicitly link MKL dynamic library. + +3. Linking with static library `libpaddle_capi_layers.a` and `libpaddle_capi_engine.a`,refer to the following: + 1. This linking methods is mainly used for mobile prediction. + 1. Split `libpaddle_capi_whole.a` into two static linking library at least to reduce the size of linking libraries. + 1. Specify `-Wl,--whole-archive -lpaddle_capi_layers`  and `-Wl,--no-whole-archive -lpaddle_capi_engine` for linking. + 1. The third-party dependencies need explicitly link same as method 2 above. From cea391217ac34b63ac589a2bc7ee296f0321f298 Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Tue, 10 Apr 2018 13:04:16 -0700 Subject: [PATCH 067/164] Fix cpplint errors (#9800) --- paddle/fluid/operators/batch_norm_op.cc | 1 + paddle/fluid/operators/batch_norm_op.cu.cc | 3 +-- paddle/fluid/operators/batch_size_like.h | 3 ++- paddle/fluid/operators/box_coder_op.h | 1 + paddle/fluid/operators/compare_op.cc | 1 + paddle/fluid/operators/concat_op.cc | 1 + paddle/fluid/operators/cond_op.h | 1 + paddle/fluid/operators/conv_transpose_op.cc | 2 ++ paddle/fluid/operators/conv_transpose_op.h | 2 +- paddle/fluid/operators/crf_decoding_op.h | 1 + paddle/fluid/operators/crop_op.h | 3 ++- 11 files changed, 14 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/operators/batch_norm_op.cc b/paddle/fluid/operators/batch_norm_op.cc index 36049ee6a4..c9939e8602 100644 --- a/paddle/fluid/operators/batch_norm_op.cc +++ b/paddle/fluid/operators/batch_norm_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/batch_norm_op.h" +#include #include "paddle/fluid/framework/data_layout.h" namespace paddle { diff --git a/paddle/fluid/operators/batch_norm_op.cu.cc b/paddle/fluid/operators/batch_norm_op.cu.cc index 6ceacc3992..eecb58e11e 100644 --- a/paddle/fluid/operators/batch_norm_op.cu.cc +++ b/paddle/fluid/operators/batch_norm_op.cu.cc @@ -13,9 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/batch_norm_op.h" -#include "paddle/fluid/framework/data_layout.h" - #include +#include "paddle/fluid/framework/data_layout.h" #include "paddle/fluid/operators/math/math_function.h" #include "paddle/fluid/platform/cudnn_helper.h" #include "paddle/fluid/platform/float16.h" diff --git a/paddle/fluid/operators/batch_size_like.h b/paddle/fluid/operators/batch_size_like.h index 0bdf27e620..dd51a11fbe 100644 --- a/paddle/fluid/operators/batch_size_like.h +++ b/paddle/fluid/operators/batch_size_like.h @@ -13,7 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once - +#include +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/box_coder_op.h b/paddle/fluid/operators/box_coder_op.h index 3c7cac1cd1..77fc6c2b62 100644 --- a/paddle/fluid/operators/box_coder_op.h +++ b/paddle/fluid/operators/box_coder_op.h @@ -10,6 +10,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/compare_op.cc b/paddle/fluid/operators/compare_op.cc index 9a139ab27e..3a6a357e81 100644 --- a/paddle/fluid/operators/compare_op.cc +++ b/paddle/fluid/operators/compare_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/compare_op.h" +#include #include "paddle/fluid/framework/op_registry.h" namespace paddle { diff --git a/paddle/fluid/operators/concat_op.cc b/paddle/fluid/operators/concat_op.cc index 0eedd8ee51..d65a7b3467 100644 --- a/paddle/fluid/operators/concat_op.cc +++ b/paddle/fluid/operators/concat_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/concat_op.h" +#include #include namespace paddle { diff --git a/paddle/fluid/operators/cond_op.h b/paddle/fluid/operators/cond_op.h index a04fae2182..d3888923db 100644 --- a/paddle/fluid/operators/cond_op.h +++ b/paddle/fluid/operators/cond_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include #include "glog/logging.h" #include "paddle/fluid/framework/ddim.h" diff --git a/paddle/fluid/operators/conv_transpose_op.cc b/paddle/fluid/operators/conv_transpose_op.cc index b2a3cfc89f..08f5939d42 100644 --- a/paddle/fluid/operators/conv_transpose_op.cc +++ b/paddle/fluid/operators/conv_transpose_op.cc @@ -13,6 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/conv_transpose_op.h" +#include +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/conv_transpose_op.h b/paddle/fluid/operators/conv_transpose_op.h index d4e4b641ec..bfc0177c2a 100644 --- a/paddle/fluid/operators/conv_transpose_op.h +++ b/paddle/fluid/operators/conv_transpose_op.h @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once - +#include #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/im2col.h" diff --git a/paddle/fluid/operators/crf_decoding_op.h b/paddle/fluid/operators/crf_decoding_op.h index 2b2a733fb9..3f5fab3b38 100644 --- a/paddle/fluid/operators/crf_decoding_op.h +++ b/paddle/fluid/operators/crf_decoding_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/crop_op.h b/paddle/fluid/operators/crop_op.h index c5ac684978..f05c2e2328 100644 --- a/paddle/fluid/operators/crop_op.h +++ b/paddle/fluid/operators/crop_op.h @@ -13,7 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once - +#include +#include #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/strided_memcpy.h" From ca8af9490fc5d55e42fe5cadc638d8abb4a579d8 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Tue, 10 Apr 2018 17:29:24 -0700 Subject: [PATCH 068/164] update features mentioned by @helin --- .../client/cluster_launcher.py | 5 +- .../aws_benchmarking/server/cluster_master.py | 172 ++++++++++++++---- .../server/pserver.sh.template | 2 +- .../server/trainer.sh.template | 2 +- 4 files changed, 141 insertions(+), 40 deletions(-) diff --git a/tools/aws_benchmarking/client/cluster_launcher.py b/tools/aws_benchmarking/client/cluster_launcher.py index eaccffc204..d713bc2b45 100644 --- a/tools/aws_benchmarking/client/cluster_launcher.py +++ b/tools/aws_benchmarking/client/cluster_launcher.py @@ -88,7 +88,7 @@ parser.add_argument( '--pserver_count', type=int, default=1, help="Pserver count") parser.add_argument( - '--action', type=str, default="serve", help="create|cleanup|status") + '--action', type=str, default="create", help="create|cleanup|status") parser.add_argument('--pem_path', type=str, help="private key file") @@ -355,7 +355,8 @@ def status(): def get_master_web_url(path): - return "http://" + args.master_server_public_ip + ":" + args.master_server_port + path + return "http://" + args.master_server_public_ip + ":" + str( + args.master_server_port) + path if __name__ == "__main__": diff --git a/tools/aws_benchmarking/server/cluster_master.py b/tools/aws_benchmarking/server/cluster_master.py index a4f54e4441..38d09dc869 100644 --- a/tools/aws_benchmarking/server/cluster_master.py +++ b/tools/aws_benchmarking/server/cluster_master.py @@ -127,6 +127,8 @@ ec2client = boto3.client('ec2') logging.basicConfig( filename='master.log', level=logging.INFO, format='%(asctime)s %(message)s') +log_files = ["master.log"] + def create_subnet(): # if no vpc id provided, list vpcs @@ -299,28 +301,103 @@ def create_pservers(): cleanup(args.task_name) +def log_to_file(source, filename): + if not filename in log_files: + log_files.append(filename) + with open(filename, "a") as log_file: + for line in iter(source.readline, ""): + log_file.write(line) + + def create_trainers(kickoff_cmd, pserver_endpoints_str): + def create_and_start_trainer(trainer_index): + logging.info("trainer " + str(trainer_index) + " is starting") + + instance_response = run_instances( + image_id=args.trainer_image_id, + instance_type=args.trainer_instance_type, + count=1, + role="TRAINER", )[0] + trainer_ip = instance_response["PrivateIpAddress"] + + logging.info("trainer " + str(trainer_index) + " started") + + ssh_key = paramiko.RSAKey.from_private_key_file(args.pem_path) + ssh_client = paramiko.SSHClient() + ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh_client.connect(hostname=trainer_ip, username="ubuntu", pkey=ssh_key) + + logging.info("trainer " + str(trainer_index) + + " terminal connected via ssh") + + cmd = kickoff_cmd.format( + PSERVER_HOSTS=pserver_endpoints_str, + DOCKER_IMAGE=args.docker_image, + TRAINER_INDEX=str(trainer_index), + TASK_NAME=args.task_name, + MASTER_ENDPOINT=args.master_server_ip + ":" + + str(args.master_server_port)) + logging.info(cmd) + + stdin, stdout, stderr = ssh_client.exec_command(command=cmd) + + # read and save output log + + logging.info("trainer " + str(trainer_index) + + " command executed, keep fetching log") + + stdout_thread = threading.Thread( + target=log_to_file, + args=( + stdout, + "trainer_" + str(trainer_index) + ".log", )) + stderr_thread = threading.Thread( + target=log_to_file, + args=( + stderr, + "trainer_" + str(trainer_index) + "_err.log", )) + stdout_thread.start() + stderr_thread.start() + + stdout_thread.join() + stderr_thread.join() + + return_code = stdout.channel.recv_exit_status() + if return_code != 0: + trainer_create_results[trainer_index] = {'has_error': True} + raise ValueError("trainer didn't finish with exit code 0") + + ssh_client.close() + + # multi thread starting trainer instance and run kickoff command + + trainer_threads = [] + trainer_create_results = {} try: - responses = [] for i in xrange(args.trainer_count): - cmd = kickoff_cmd.format( - PSERVER_HOSTS=pserver_endpoints_str, - DOCKER_IMAGE=args.docker_image, - TRAINER_INDEX=str(i), - TASK_NAME=args.task_name, - MASTER_ENDPOINT=args.master_server_ip + ":" + - str(args.master_server_port)) - logging.info(cmd) - responses.append( - run_instances( - image_id=args.trainer_image_id, - instance_type=args.trainer_instance_type, - count=1, - role="TRAINER", - cmd=cmd, )[0]) - return responses - except Exception: - logging.exception("error while trying to create trainers") + logging.info("starting tread for trainer " + str(i)) + trainer_thread = threading.Thread( + target=create_and_start_trainer, args=(i, )) + trainer_thread.start() + trainer_threads.append(trainer_thread) + + for trainer_thread in trainer_threads: + trainer_thread.join() + + for result in trainer_create_results: + if result["has_error"]: + logging.error( + "error during trainer starting or training, destorying the while cluster " + ) + cleanup(args.task_name) + break + + logging.info("all trainers stopped") + except Exception, e: + logging.info( + "Training exception, clean up resources, please check log for more info" + ) + finally: cleanup(args.task_name) @@ -373,6 +450,21 @@ def kickoff_pserver(host, pserver_endpoints_str): str(args.master_server_port)) logging.info(cmd) stdin, stdout, stderr = ssh_client.exec_command(command=cmd) + + stdout_thread = threading.Thread( + target=log_to_file, args=( + stdout, + "pserver_" + host + ".log", )) + stderr_thread = threading.Thread( + target=log_to_file, args=( + stderr, + "pserver_" + host + "_err.log", )) + stdout_thread.start() + stderr_thread.start() + + stdout_thread.join() + stderr_thread.join() + return_code = stdout.channel.recv_exit_status() logging.info(return_code) if return_code != 0: @@ -421,20 +513,21 @@ def create_cluster(): for pserver in pserver_create_response: pserver_thread = threading.Thread( target=kickoff_pserver, - args=(pserver["PublicIpAddress"], pserver_endpoints_str)) + args=(pserver["PrivateIpAddress"], pserver_endpoints_str)) pserver_thread.start() pserver_threads.append(pserver_thread) - for pserver_thread in pserver_threads: - pserver_thread.join() - logging.info("all pserver training process started") logging.info("creating trainers and kicking off trainer training process") create_trainers( kickoff_cmd=script_to_str(args.trainer_bash_file), pserver_endpoints_str=pserver_endpoints_str) - logging.info("trainers created") + + for pserver_thread in pserver_threads: + pserver_thread.join() + + logging.info("all process ended") def start_server(args): @@ -455,12 +548,20 @@ def start_server(args): self.wfile.write("NO ACTION FOUND") def do_GET(self): - self._set_headers() + request_path = self.path - if request_path == "/status" or request_path == "/logs": + if request_path == "/status" or request_path == "/master_logs": + self._set_headers() logging.info("Received request to return status") with open("master.log", "r") as logfile: self.wfile.write(logfile.read().strip()) + elif request_path == "/list_logs": + self._set_headers() + self.wfile.write("\n".join(log_files)) + elif "/log/" in request_path: + log_file_path = request_path.replace("/log/") + with open(log_file_path, "r") as logfile: + self.wfile.write(logfile.read().strip()) else: self.do_404() @@ -484,16 +585,6 @@ def start_server(args): cleanup(args.task_name) self.wfile.write("cleanup in progress") - elif request_path == "/trainer_job_done": - self._set_headers() - logging.info("Received request to increase job done count") - args.trainers_job_done_count += 1 - self.wfile.write( - str(args.trainers_job_done_count) + " tainers job done") - if args.trainers_job_done_count >= args.trainer_count: - logging.info("going to clean up") - cleanup(args.task_name) - else: self.do_404() @@ -539,3 +630,12 @@ if __name__ == "__main__": create_cluster() server_thread.join() + elif args.action == "test": + init_args() + if not args.subnet_id: + logging.info("creating subnet for this task") + args.subnet_id = create_subnet() + logging.info("subnet %s created" % (args.subnet_id)) + create_trainers( + kickoff_cmd=script_to_str(args.trainer_bash_file), + pserver_endpoints_str="11.22.33.44:5476") diff --git a/tools/aws_benchmarking/server/pserver.sh.template b/tools/aws_benchmarking/server/pserver.sh.template index 6fbf2c5230..fe2360ed20 100644 --- a/tools/aws_benchmarking/server/pserver.sh.template +++ b/tools/aws_benchmarking/server/pserver.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run -p {PSERVER_PORT}:{PSERVER_PORT} -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file +nvidia-docker run -i -p {PSERVER_PORT}:{PSERVER_PORT} -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file diff --git a/tools/aws_benchmarking/server/trainer.sh.template b/tools/aws_benchmarking/server/trainer.sh.template index a83408733d..89f405811e 100644 --- a/tools/aws_benchmarking/server/trainer.sh.template +++ b/tools/aws_benchmarking/server/trainer.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file +nvidia-docker run -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file From 7ed457e77a44581503f929cef64675d458f10642 Mon Sep 17 00:00:00 2001 From: Kexin Zhao Date: Tue, 10 Apr 2018 18:30:08 -0700 Subject: [PATCH 069/164] Fix cuda 7.5 error with cublas GEMM (#9811) * fix gemm error for cuda 7.5 * fix version number --- paddle/fluid/operators/math/math_function.cu | 21 +++++++++++++---- paddle/fluid/platform/dynload/cublas.cc | 4 ++++ paddle/fluid/platform/dynload/cublas.h | 24 +++++++++++++------- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/paddle/fluid/operators/math/math_function.cu b/paddle/fluid/operators/math/math_function.cu index 82e1294314..e53183603f 100644 --- a/paddle/fluid/operators/math/math_function.cu +++ b/paddle/fluid/operators/math/math_function.cu @@ -39,13 +39,14 @@ void gemm( cublasOperation_t cuTransB = (transB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; - float h_alpha = static_cast(alpha); - float h_beta = static_cast(beta); - // TODO(kexinzhao): add processing code for compute capability < 53 case PADDLE_ENFORCE_GE(context.GetComputeCapability(), 53, "cublas fp16 gemm requires GPU compute capability >= 53"); +#if CUDA_VERSION >= 8000 + float h_alpha = static_cast(alpha); + float h_beta = static_cast(beta); + cublasGemmAlgo_t algo = CUBLAS_GEMM_DFALT; #if CUDA_VERSION >= 9000 if (context.GetComputeCapability() >= 70) { @@ -56,7 +57,7 @@ void gemm( PADDLE_ENFORCE(platform::dynload::cublasSetMathMode(context.cublas_handle(), CUBLAS_DEFAULT_MATH)); } -#endif +#endif // CUDA_VERSION >= 9000 // cublasHgemm does true FP16 computation which is slow for non-Volta // GPUs. So use cublasGemmEx instead which does pesudo FP16 computation: @@ -66,6 +67,18 @@ void gemm( context.cublas_handle(), cuTransB, cuTransA, N, M, K, &h_alpha, B, CUDA_R_16F, ldb, A, CUDA_R_16F, lda, &h_beta, C, CUDA_R_16F, N, CUDA_R_32F, algo)); +#else + // CUDA 7.5 does not support cublasGemmEx, hence we fall back to use hgemm + const half h_alpha = static_cast(alpha); + const half h_beta = static_cast(beta); + const half* h_A = reinterpret_cast(A); + const half* h_B = reinterpret_cast(B); + half* h_C = reinterpret_cast(C); + + PADDLE_ENFORCE(platform::dynload::cublasHgemm( + context.cublas_handle(), cuTransB, cuTransA, N, M, K, &h_alpha, h_B, ldb, + h_A, lda, &h_beta, h_C, N)); +#endif // CUDA_VERSION >= 8000 } template <> diff --git a/paddle/fluid/platform/dynload/cublas.cc b/paddle/fluid/platform/dynload/cublas.cc index eb541579a1..361d3439b8 100644 --- a/paddle/fluid/platform/dynload/cublas.cc +++ b/paddle/fluid/platform/dynload/cublas.cc @@ -28,6 +28,10 @@ CUBLAS_BLAS_ROUTINE_EACH(DEFINE_WRAP); CUBLAS_BLAS_ROUTINE_EACH_R2(DEFINE_WRAP); #endif +#ifdef CUBLAS_BLAS_ROUTINE_EACH_R3 +CUBLAS_BLAS_ROUTINE_EACH_R3(DEFINE_WRAP); +#endif + } // namespace dynload } // namespace platform } // namespace paddle diff --git a/paddle/fluid/platform/dynload/cublas.h b/paddle/fluid/platform/dynload/cublas.h index a41018d350..1ab55d6b9b 100644 --- a/paddle/fluid/platform/dynload/cublas.h +++ b/paddle/fluid/platform/dynload/cublas.h @@ -71,7 +71,6 @@ extern void *cublas_dso_handle; __macro(cublasDgemm_v2); \ __macro(cublasHgemm); \ __macro(cublasSgemmEx); \ - __macro(cublasGemmEx); \ __macro(cublasSgeam_v2); \ __macro(cublasDgeam_v2); \ __macro(cublasCreate_v2); \ @@ -83,11 +82,6 @@ extern void *cublas_dso_handle; __macro(cublasDgemmBatched); \ __macro(cublasCgemmBatched); \ __macro(cublasZgemmBatched); \ - __macro(cublasSgemmStridedBatched); \ - __macro(cublasDgemmStridedBatched); \ - __macro(cublasCgemmStridedBatched); \ - __macro(cublasZgemmStridedBatched); \ - __macro(cublasHgemmStridedBatched); \ __macro(cublasSgetrfBatched); \ __macro(cublasSgetriBatched); \ __macro(cublasDgetrfBatched); \ @@ -95,10 +89,24 @@ extern void *cublas_dso_handle; CUBLAS_BLAS_ROUTINE_EACH(DECLARE_DYNAMIC_LOAD_CUBLAS_WRAP) +// APIs available after CUDA 8.0 +#if CUDA_VERSION >= 8000 +#define CUBLAS_BLAS_ROUTINE_EACH_R2(__macro) \ + __macro(cublasGemmEx); \ + __macro(cublasSgemmStridedBatched); \ + __macro(cublasDgemmStridedBatched); \ + __macro(cublasCgemmStridedBatched); \ + __macro(cublasZgemmStridedBatched); \ + __macro(cublasHgemmStridedBatched); + +CUBLAS_BLAS_ROUTINE_EACH_R2(DECLARE_DYNAMIC_LOAD_CUBLAS_WRAP) +#endif + // APIs available after CUDA 9.0 #if CUDA_VERSION >= 9000 -#define CUBLAS_BLAS_ROUTINE_EACH_R2(__macro) __macro(cublasSetMathMode); -CUBLAS_BLAS_ROUTINE_EACH_R2(DECLARE_DYNAMIC_LOAD_CUBLAS_WRAP) +#define CUBLAS_BLAS_ROUTINE_EACH_R3(__macro) __macro(cublasSetMathMode); + +CUBLAS_BLAS_ROUTINE_EACH_R3(DECLARE_DYNAMIC_LOAD_CUBLAS_WRAP) #endif #undef DECLARE_DYNAMIC_LOAD_CUBLAS_WRAP From 8eaec5dd7c5d627aa2d23db1fc518a1e85a30821 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Mon, 9 Apr 2018 15:28:07 +0800 Subject: [PATCH 070/164] add BCast and Gather --- paddle/fluid/framework/details/CMakeLists.txt | 8 +- .../framework/details/broad_cast_op_handle.cc | 103 +++++++++++ .../framework/details/broad_cast_op_handle.h | 54 ++++++ .../details/broad_cast_op_handle_test.cc | 174 ++++++++++++++++++ paddle/fluid/platform/device_context.h | 46 ++++- 5 files changed, 382 insertions(+), 3 deletions(-) create mode 100644 paddle/fluid/framework/details/broad_cast_op_handle.cc create mode 100644 paddle/fluid/framework/details/broad_cast_op_handle.h create mode 100644 paddle/fluid/framework/details/broad_cast_op_handle_test.cc diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index 89b5c6847f..eda2b6aac0 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -2,8 +2,12 @@ cc_library(var_handle SRCS var_handle.cc DEPS place) cc_library(op_handle_base SRCS op_handle_base.cc DEPS var_handle device_context) cc_library(scale_loss_grad_op_handle SRCS scale_loss_grad_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) cc_library(fetch_op_handle SRCS fetch_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) -nv_library(nccl_all_reduce_op_handle SRCS nccl_all_reduce_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory +if(WITH_GPU) + nv_library(nccl_all_reduce_op_handle SRCS nccl_all_reduce_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory dynload_cuda) + nv_library(broad_cast_op_handle SRCS broad_cast_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) +endif() + cc_library(computation_op_handle SRCS computation_op_handle.cc DEPS framework_proto scope place operator op_registry) cc_library(ssa_graph SRCS ssa_graph.cc DEPS var_handle op_handle_base) @@ -11,6 +15,8 @@ cc_library(ssa_graph_builder SRCS ssa_graph_builder.cc DEPS ssa_graph) if(WITH_GPU) set(multi_devices_graph_builder_deps nccl_all_reduce_op_handle) + nv_test(broad_cast_op_test SRCS broad_cast_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory + device_context broad_cast_op_handle) else() set(multi_devices_graph_builder_deps) endif() diff --git a/paddle/fluid/framework/details/broad_cast_op_handle.cc b/paddle/fluid/framework/details/broad_cast_op_handle.cc new file mode 100644 index 0000000000..e636371b94 --- /dev/null +++ b/paddle/fluid/framework/details/broad_cast_op_handle.cc @@ -0,0 +1,103 @@ +// 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/broad_cast_op_handle.h" + +namespace paddle { +namespace framework { +namespace details { + +Tensor *GetTensorFromVar(Variable *in_var) { + if (in_var->IsType()) { + return in_var->GetMutable(); + } else if (in_var->IsType()) { + return in_var->GetMutable()->mutable_value(); + } else { + PADDLE_THROW("Var should be LoDTensor or SelectedRows"); + } + return nullptr; +} +BCastOpHandle::BCastOpHandle(const std::vector &local_scopes, + const std::vector &places, + const platform::ContextMap &ctxs) + : local_scopes_(local_scopes), places_(places), ctxs_(ctxs) { + for (auto &p : places_) { + this->dev_ctxes_[p] = ctxs_.DevCtx(p); + } +} + +void BCastOpHandle::RunImpl() { + PADDLE_ENFORCE_EQ(this->inputs_.size(), 1); + PADDLE_ENFORCE_EQ(this->outputs_.size(), places_.size()); + + // Wait input done, this Wait is asynchronous operation + auto in_var_handle = static_cast(this->inputs_[0]); + auto &in_place = in_var_handle->place_; + if (inputs_[0]->generated_op_) + inputs_[0]->generated_op_->Wait(dev_ctxes_[in_place]); + + auto iter = std::find(places_.begin(), places_.end(), in_place); + if (iter == places_.end()) { + PADDLE_THROW("The input of BCast is not in the places_."); + } + + int offset = iter - places_.begin(); + auto in_var = local_scopes_[offset]->FindVar(in_var_handle->name_); + + Tensor *in_tensor = GetTensorFromVar(in_var); + for (auto *out : outputs_) { + auto out_handle = static_cast(out); + auto &out_p = out_handle->place_; + + auto iter = std::find(places_.begin(), places_.end(), out_p); + if (iter == places_.end()) { + PADDLE_THROW("The output of BCast is not in the places_."); + } + int offset = iter - places_.begin(); + + auto *s = local_scopes_[offset]; + auto out_var = s->FindVar(out_handle->name_); + + PADDLE_ENFORCE_EQ(out_var->Type(), in_var->Type(), ""); + + if (in_var->IsType()) { + auto in_sr = in_var->GetMutable(); + auto out = out_var->GetMutable(); + if (in_sr == out) continue; + out->set_height(in_sr->height()); + out->set_rows(in_sr->rows()); + out->mutable_value()->Resize(in_sr->value().dims()); + out->mutable_value()->mutable_data(out_p, in_sr->value().type()); + } else if (in_var->IsType()) { + auto in_lod = in_var->GetMutable(); + auto out = out_var->GetMutable(); + if (in_lod == out) continue; + out->set_lod(in_lod->lod()); + out->Resize(in_lod->dims()); + out->mutable_data(out_p, in_lod->type()); + } else { + PADDLE_THROW("Var should be LoDTensor or SelectedRows"); + } + + Tensor *out_tensor = GetTensorFromVar(out_var); + + paddle::framework::TensorCopy(*in_tensor, out_p, *(dev_ctxes_[in_place]), + out_tensor); + } +} + +std::string BCastOpHandle::Name() const { return "broadcast"; } +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/broad_cast_op_handle.h b/paddle/fluid/framework/details/broad_cast_op_handle.h new file mode 100644 index 0000000000..432e86e410 --- /dev/null +++ b/paddle/fluid/framework/details/broad_cast_op_handle.h @@ -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. + +#pragma once + +#include +#include +#include + +#include "paddle/fluid/framework/details/op_handle_base.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/framework/selected_rows.h" +#include "paddle/fluid/platform/device_context.h" + +namespace paddle { +namespace framework { +namespace details { + +/* + * BroadCast the input to all scope. + * + */ +struct BCastOpHandle : public OpHandleBase { + const std::vector &local_scopes_; + const std::vector &places_; + const platform::ContextMap &ctxs_; + + BCastOpHandle(const std::vector &local_scopes, + const std::vector &places, + const platform::ContextMap &ctxs); + + std::string Name() const override; + + bool IsMultiDeviceTransfer() override { return false; }; + + protected: + void RunImpl() override; +}; + +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/broad_cast_op_handle_test.cc b/paddle/fluid/framework/details/broad_cast_op_handle_test.cc new file mode 100644 index 0000000000..a1338abeb5 --- /dev/null +++ b/paddle/fluid/framework/details/broad_cast_op_handle_test.cc @@ -0,0 +1,174 @@ +// 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/broad_cast_op_handle.h" +#include "gtest/gtest.h" + +#include "paddle/fluid/platform/device_context.h" + +namespace f = paddle::framework; +namespace p = paddle::platform; + +// test data amount +const f::DDim kDims = {20, 20}; + +class BroadCastTester : public ::testing::Test { + public: + void SetUp() override { + int count = p::GetCUDADeviceCount(); + if (count <= 1) { + LOG(WARNING) << "Cannot test multi-gpu BroadCast, because the CUDA " + "device count is " + << count; + exit(0); + } + for (int i = 0; i < count; ++i) { + gpu_list_.emplace_back(p::CUDAPlace(i)); + } + ctxs_ = new p::ContextMap(gpu_list_); + } + + template + void BroadCastInitOp(int gpu_id = 0) { + for (size_t j = 0; j < gpu_list_.size(); ++j) { + local_scope_.push_back(&g_scope_.NewScope()); + auto* out_var = local_scope_[j]->Var("out"); + out_var->GetMutable(); + } + auto* in_var = local_scope_[gpu_id]->Var("input"); + in_var->GetMutable(); + + bc_op_handle_ = + new f::details::BCastOpHandle(local_scope_, gpu_list_, *ctxs_); + + f::details::VarHandle* in_var_handle = new f::details::VarHandle(); + in_var_handle->place_ = gpu_list_[gpu_id]; + in_var_handle->name_ = "input"; + in_var_handle->version_ = 1; + in_var_handle->generated_op_ = nullptr; + bc_op_handle_->AddInput(in_var_handle); + + for (size_t j = 0; j < gpu_list_.size(); ++j) { + f::details::VarHandle* out_var_handle = new f::details::VarHandle(); + out_var_handle->place_ = gpu_list_[j]; + out_var_handle->name_ = "out"; + out_var_handle->version_ = 2; + out_var_handle->generated_op_ = bc_op_handle_; + bc_op_handle_->AddOutput(out_var_handle); + } + } + void BroadCastDestroy() { + delete ctxs_; + for (auto in : bc_op_handle_->inputs_) { + delete in; + } + for (auto out : bc_op_handle_->outputs_) { + delete out; + } + delete bc_op_handle_; + } + + public: + f::Scope g_scope_; + p::ContextMap* ctxs_; + std::vector local_scope_; + std::vector gpu_list_; + f::details::BCastOpHandle* bc_op_handle_; +}; + +TEST_F(BroadCastTester, BroadCastTestLodTensor) { + int gpu_id = 0; + BroadCastInitOp(gpu_id); + + auto in_var = local_scope_[gpu_id]->Var("input"); + auto in_lod_tensor = in_var->GetMutable(); + in_lod_tensor->mutable_data(kDims, gpu_list_[gpu_id]); + + std::vector send_vector(f::product(kDims), gpu_id + 12); + for (size_t k = 0; k < send_vector.size(); ++k) { + send_vector[k] = k; + } + f::LoD lod{{0, 10, 20}}; + paddle::framework::TensorFromVector( + send_vector, *(ctxs_->DevCtx(gpu_list_[gpu_id])), in_lod_tensor); + in_lod_tensor->set_lod(lod); + bc_op_handle_->Run(false); + + ctxs_->WaitAll(); + + p::CPUPlace cpu_place; + for (size_t j = 0; j < gpu_list_.size(); ++j) { + auto out_var = local_scope_[j]->Var("out"); + auto out_tensor = out_var->Get(); + PADDLE_ENFORCE_EQ(out_tensor.lod(), lod, "lod is not equal."); + + f::Tensor result_tensor; + f::TensorCopy(out_tensor, cpu_place, *(ctxs_->DevCtx(j)), &result_tensor); + float* ct = result_tensor.mutable_data(cpu_place); + + for (int64_t j = 0; j < f::product(kDims); ++j) { + ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + } + } + + BroadCastDestroy(); +} + +TEST_F(BroadCastTester, BroadCastTestSelectedRows) { + int gpu_id = 0; + BroadCastInitOp(gpu_id); + + auto in_var = local_scope_[gpu_id]->Var("input"); + auto in_selected_rows = in_var->GetMutable(); + auto value = in_selected_rows->mutable_value(); + value->mutable_data(kDims, gpu_list_[gpu_id]); + int height = kDims[0] * 2; + std::vector rows{0, 1, 2, 3, 3, 0, 14, 7, 3, 1, + 2, 4, 6, 3, 1, 1, 1, 1, 3, 7}; + in_selected_rows->set_height(height); + in_selected_rows->set_rows(rows); + + std::vector send_vector(f::product(kDims)); + for (size_t k = 0; k < send_vector.size(); ++k) { + send_vector[k] = k; + } + paddle::framework::TensorFromVector( + send_vector, *(ctxs_->DevCtx(gpu_list_[gpu_id])), value); + + bc_op_handle_->Run(false); + + ctxs_->WaitAll(); + + p::CPUPlace cpu_place; + for (size_t j = 0; j < gpu_list_.size(); ++j) { + auto out_var = local_scope_[j]->Var("out"); + auto& out_select_rows = out_var->Get(); + auto rt = out_select_rows.value(); + + PADDLE_ENFORCE_EQ(out_select_rows.height(), height, "height is not equal."); + for (size_t k = 0; k < out_select_rows.rows().size(); ++k) { + PADDLE_ENFORCE_EQ(out_select_rows.rows()[k], rows[k]); + } + + f::Tensor result_tensor; + f::TensorCopy(rt, cpu_place, *(ctxs_->DevCtx(j)), &result_tensor); + float* ct = result_tensor.data(); + + for (int64_t j = 0; j < f::product(kDims); ++j) { + ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + } + } + + BroadCastDestroy(); +} diff --git a/paddle/fluid/platform/device_context.h b/paddle/fluid/platform/device_context.h index 6b796d92d0..fceb5845ff 100644 --- a/paddle/fluid/platform/device_context.h +++ b/paddle/fluid/platform/device_context.h @@ -2,17 +2,20 @@ 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 + + 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 #ifdef PADDLE_WITH_CUDA #include "paddle/fluid/platform/dynload/cublas.h" @@ -137,6 +140,45 @@ template <> struct DefaultDeviceContextType { using TYPE = CUDAPinnedDeviceContext; }; + +class ContextMap { + public: + explicit ContextMap(const std::vector& places) { + order_.reserve(places.size()); + for (auto& p : places) { + auto dev = boost::get(p); + int dev_id = dev.device; + order_.emplace_back(dev_id); + contexts_[dev_id].reset(new CUDADeviceContext(dev)); + } + PADDLE_ENFORCE_EQ( + order_.size(), contexts_.size(), + "Context Map does not support contain two or more same device"); + } + + DeviceContext* DevCtx(int dev_id) const { return at(dev_id); } + + DeviceContext* DevCtx(platform::Place p) const { + return DevCtx(boost::get(p).device); + } + + DeviceContext* at(platform::Place p) const { + return this->at(boost::get(p).device); + } + + DeviceContext* at(int dev_id) const { return contexts_.at(dev_id).get(); } + + void WaitAll() { + for (auto& p : contexts_) { + p.second->Wait(); + } + } + + private: + std::unordered_map> contexts_; + std::vector order_; +}; + #endif #ifdef PADDLE_WITH_MKLDNN From a7c6bf771c493cc9031975ceabcb126ef9ed1188 Mon Sep 17 00:00:00 2001 From: wanghaoshuang Date: Wed, 11 Apr 2018 09:53:56 +0800 Subject: [PATCH 071/164] Change do_model_average_for_mean_and_var to boolean in batch_normal. --- python/paddle/fluid/layers/nn.py | 3 --- python/paddle/fluid/optimizer.py | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 37ce738275..56c37f05cc 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -1518,9 +1518,6 @@ def batch_norm(input, bias = helper.create_parameter( attr=helper.bias_attr, shape=param_shape, dtype=dtype, is_bias=True) - if do_model_average_for_mean_and_var: - do_model_average_for_mean_and_var = None - mean = helper.create_parameter( attr=ParamAttr( name=moving_mean_name, diff --git a/python/paddle/fluid/optimizer.py b/python/paddle/fluid/optimizer.py index 1917b7d044..36503cac6d 100644 --- a/python/paddle/fluid/optimizer.py +++ b/python/paddle/fluid/optimizer.py @@ -853,7 +853,8 @@ class ModelAverage(Optimizer): self.params_grads = [] if params_grads is None else params_grads params = {} for param, grad in self.params_grads: - params[param.name] = (param, grad) + if param.do_model_average != False: + params[param.name] = (param, grad) for param in framework.default_main_program().global_block( ).all_parameters(): if param.name not in params and param.do_model_average != False: From 72b5de05fee1c94c7bd40c8b69ff8c4fe2aff7d9 Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Wed, 11 Apr 2018 02:54:56 +0000 Subject: [PATCH 072/164] update unittest --- paddle/fluid/operators/read_op.cc | 1 + .../tests/unittests/test_parallel_executor.py | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/paddle/fluid/operators/read_op.cc b/paddle/fluid/operators/read_op.cc index 4496110cf8..bf02b99589 100644 --- a/paddle/fluid/operators/read_op.cc +++ b/paddle/fluid/operators/read_op.cc @@ -66,6 +66,7 @@ class ReadOp : public framework::OperatorBase { std::vector out_arg_names = Outputs("Out"); std::vector ins; reader->ReadNext(&ins); + PADDLE_ENFORCE(!ins.empty(), "There is no next data."); PADDLE_ENFORCE_EQ(ins.size(), out_arg_names.size()); for (size_t i = 0; i < ins.size(); ++i) { auto* out = diff --git a/python/paddle/fluid/tests/unittests/test_parallel_executor.py b/python/paddle/fluid/tests/unittests/test_parallel_executor.py index 8401716db8..3c00f708f0 100644 --- a/python/paddle/fluid/tests/unittests/test_parallel_executor.py +++ b/python/paddle/fluid/tests/unittests/test_parallel_executor.py @@ -26,11 +26,14 @@ def simple_fc_net(use_feed): img = fluid.layers.data(name='image', shape=[784], dtype='float32') label = fluid.layers.data(name='label', shape=[1], dtype='int64') else: - reader = fluid.layers.open_recordio_file( - filename='./mnist.recordio', + reader = fluid.layers.open_files( + filenames=['./mnist.recordio'], shapes=[[-1, 784], [-1, 1]], lod_levels=[0, 0], - dtypes=['float32', 'int64']) + dtypes=['float32', 'int64'], + thread_num=1, + for_parallel=True) + reader = fluid.layers.io.double_buffer(reader) img, label = fluid.layers.read_file(reader) hidden = img for _ in xrange(4): @@ -51,11 +54,14 @@ def fc_with_batchnorm(use_feed): img = fluid.layers.data(name='image', shape=[784], dtype='float32') label = fluid.layers.data(name='label', shape=[1], dtype='int64') else: - reader = fluid.layers.open_recordio_file( - filename='./mnist.recordio', + reader = fluid.layers.open_files( + filenames=['mnist.recordio'], shapes=[[-1, 784], [-1, 1]], lod_levels=[0, 0], - dtypes=['float32', 'int64']) + dtypes=['float32', 'int64'], + thread_num=1, + for_parallel=True) + reader = fluid.layers.io.double_buffer(reader) img, label = fluid.layers.read_file(reader) hidden = img From 6db96ec23cd02a4cec41338f3c1e53aa303be78e Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Wed, 11 Apr 2018 11:47:03 +0800 Subject: [PATCH 073/164] follow comments --- paddle/fluid/framework/details/CMakeLists.txt | 6 ++--- ...st_op_handle.cc => broadcast_op_handle.cc} | 12 ++++----- ...cast_op_handle.h => broadcast_op_handle.h} | 10 +++---- ...le_test.cc => broadcast_op_handle_test.cc} | 26 +++++++++---------- 4 files changed, 27 insertions(+), 27 deletions(-) rename paddle/fluid/framework/details/{broad_cast_op_handle.cc => broadcast_op_handle.cc} (89%) rename paddle/fluid/framework/details/{broad_cast_op_handle.h => broadcast_op_handle.h} (83%) rename paddle/fluid/framework/details/{broad_cast_op_handle_test.cc => broadcast_op_handle_test.cc} (89%) diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index eda2b6aac0..7b7582380c 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -5,7 +5,7 @@ cc_library(fetch_op_handle SRCS fetch_op_handle.cc DEPS op_handle_base scope lod if(WITH_GPU) nv_library(nccl_all_reduce_op_handle SRCS nccl_all_reduce_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory dynload_cuda) - nv_library(broad_cast_op_handle SRCS broad_cast_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) + nv_library(broadcast_op_handle SRCS broadcast_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) endif() cc_library(computation_op_handle SRCS computation_op_handle.cc DEPS framework_proto scope place operator op_registry) @@ -15,8 +15,8 @@ cc_library(ssa_graph_builder SRCS ssa_graph_builder.cc DEPS ssa_graph) if(WITH_GPU) set(multi_devices_graph_builder_deps nccl_all_reduce_op_handle) - nv_test(broad_cast_op_test SRCS broad_cast_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory - device_context broad_cast_op_handle) + nv_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory + device_context broadcast_op_handle) else() set(multi_devices_graph_builder_deps) endif() diff --git a/paddle/fluid/framework/details/broad_cast_op_handle.cc b/paddle/fluid/framework/details/broadcast_op_handle.cc similarity index 89% rename from paddle/fluid/framework/details/broad_cast_op_handle.cc rename to paddle/fluid/framework/details/broadcast_op_handle.cc index e636371b94..a782ebf8fd 100644 --- a/paddle/fluid/framework/details/broad_cast_op_handle.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle.cc @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "paddle/fluid/framework/details/broad_cast_op_handle.h" +#include "paddle/fluid/framework/details/broadcast_op_handle.h" namespace paddle { namespace framework { @@ -28,16 +28,16 @@ Tensor *GetTensorFromVar(Variable *in_var) { } return nullptr; } -BCastOpHandle::BCastOpHandle(const std::vector &local_scopes, - const std::vector &places, - const platform::ContextMap &ctxs) +BroadcastOpHandle::BroadcastOpHandle(const std::vector &local_scopes, + const std::vector &places, + const platform::ContextMap &ctxs) : local_scopes_(local_scopes), places_(places), ctxs_(ctxs) { for (auto &p : places_) { this->dev_ctxes_[p] = ctxs_.DevCtx(p); } } -void BCastOpHandle::RunImpl() { +void BroadcastOpHandle::RunImpl() { PADDLE_ENFORCE_EQ(this->inputs_.size(), 1); PADDLE_ENFORCE_EQ(this->outputs_.size(), places_.size()); @@ -97,7 +97,7 @@ void BCastOpHandle::RunImpl() { } } -std::string BCastOpHandle::Name() const { return "broadcast"; } +std::string BroadcastOpHandle::Name() const { return "broadcast"; } } // namespace details } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/details/broad_cast_op_handle.h b/paddle/fluid/framework/details/broadcast_op_handle.h similarity index 83% rename from paddle/fluid/framework/details/broad_cast_op_handle.h rename to paddle/fluid/framework/details/broadcast_op_handle.h index 432e86e410..a571af1218 100644 --- a/paddle/fluid/framework/details/broad_cast_op_handle.h +++ b/paddle/fluid/framework/details/broadcast_op_handle.h @@ -29,17 +29,17 @@ namespace framework { namespace details { /* - * BroadCast the input to all scope. + * Broadcast the input to all scope. * */ -struct BCastOpHandle : public OpHandleBase { +struct BroadcastOpHandle : public OpHandleBase { const std::vector &local_scopes_; const std::vector &places_; const platform::ContextMap &ctxs_; - BCastOpHandle(const std::vector &local_scopes, - const std::vector &places, - const platform::ContextMap &ctxs); + BroadcastOpHandle(const std::vector &local_scopes, + const std::vector &places, + const platform::ContextMap &ctxs); std::string Name() const override; diff --git a/paddle/fluid/framework/details/broad_cast_op_handle_test.cc b/paddle/fluid/framework/details/broadcast_op_handle_test.cc similarity index 89% rename from paddle/fluid/framework/details/broad_cast_op_handle_test.cc rename to paddle/fluid/framework/details/broadcast_op_handle_test.cc index a1338abeb5..fd671ded21 100644 --- a/paddle/fluid/framework/details/broad_cast_op_handle_test.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle_test.cc @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "paddle/fluid/framework/details/broad_cast_op_handle.h" +#include "paddle/fluid/framework/details/broadcast_op_handle.h" #include "gtest/gtest.h" #include "paddle/fluid/platform/device_context.h" @@ -23,12 +23,12 @@ namespace p = paddle::platform; // test data amount const f::DDim kDims = {20, 20}; -class BroadCastTester : public ::testing::Test { +class BroadcastTester : public ::testing::Test { public: void SetUp() override { int count = p::GetCUDADeviceCount(); if (count <= 1) { - LOG(WARNING) << "Cannot test multi-gpu BroadCast, because the CUDA " + LOG(WARNING) << "Cannot test multi-gpu Broadcast, because the CUDA " "device count is " << count; exit(0); @@ -40,7 +40,7 @@ class BroadCastTester : public ::testing::Test { } template - void BroadCastInitOp(int gpu_id = 0) { + void BroadcastInitOp(int gpu_id = 0) { for (size_t j = 0; j < gpu_list_.size(); ++j) { local_scope_.push_back(&g_scope_.NewScope()); auto* out_var = local_scope_[j]->Var("out"); @@ -50,7 +50,7 @@ class BroadCastTester : public ::testing::Test { in_var->GetMutable(); bc_op_handle_ = - new f::details::BCastOpHandle(local_scope_, gpu_list_, *ctxs_); + new f::details::BroadcastOpHandle(local_scope_, gpu_list_, *ctxs_); f::details::VarHandle* in_var_handle = new f::details::VarHandle(); in_var_handle->place_ = gpu_list_[gpu_id]; @@ -68,7 +68,7 @@ class BroadCastTester : public ::testing::Test { bc_op_handle_->AddOutput(out_var_handle); } } - void BroadCastDestroy() { + void BroadcastDestroy() { delete ctxs_; for (auto in : bc_op_handle_->inputs_) { delete in; @@ -84,12 +84,12 @@ class BroadCastTester : public ::testing::Test { p::ContextMap* ctxs_; std::vector local_scope_; std::vector gpu_list_; - f::details::BCastOpHandle* bc_op_handle_; + f::details::BroadcastOpHandle* bc_op_handle_; }; -TEST_F(BroadCastTester, BroadCastTestLodTensor) { +TEST_F(BroadcastTester, BroadcastTestLodTensor) { int gpu_id = 0; - BroadCastInitOp(gpu_id); + BroadcastInitOp(gpu_id); auto in_var = local_scope_[gpu_id]->Var("input"); auto in_lod_tensor = in_var->GetMutable(); @@ -122,12 +122,12 @@ TEST_F(BroadCastTester, BroadCastTestLodTensor) { } } - BroadCastDestroy(); + BroadcastDestroy(); } -TEST_F(BroadCastTester, BroadCastTestSelectedRows) { +TEST_F(BroadcastTester, BroadcastTestSelectedRows) { int gpu_id = 0; - BroadCastInitOp(gpu_id); + BroadcastInitOp(gpu_id); auto in_var = local_scope_[gpu_id]->Var("input"); auto in_selected_rows = in_var->GetMutable(); @@ -170,5 +170,5 @@ TEST_F(BroadCastTester, BroadCastTestSelectedRows) { } } - BroadCastDestroy(); + BroadcastDestroy(); } From 129859e732fa7ac056c4c453619b2c84c98bc0ac Mon Sep 17 00:00:00 2001 From: qingqing01 Date: Wed, 11 Apr 2018 12:34:46 +0800 Subject: [PATCH 074/164] Support data type int64 in NCCL. (#9818) --- paddle/fluid/platform/nccl_helper.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/paddle/fluid/platform/nccl_helper.h b/paddle/fluid/platform/nccl_helper.h index 2999004320..3a2a423486 100644 --- a/paddle/fluid/platform/nccl_helper.h +++ b/paddle/fluid/platform/nccl_helper.h @@ -14,8 +14,9 @@ #pragma once -#include +#include // NOLINT #include +#include #include "paddle/fluid/platform/dynload/nccl.h" #include "paddle/fluid/platform/enforce.h" @@ -29,6 +30,8 @@ inline ncclDataType_t ToNCCLDataType(std::type_index type) { return ncclDouble; } else if (type == typeid(int)) { // NOLINT return ncclInt; + } else if (type == typeid(int64_t)) { // NOLINT + return ncclInt64; } else { PADDLE_THROW("Not supported"); } @@ -66,23 +69,23 @@ struct NCCLContext { return boost::get(ctx_->GetPlace()).device; } - static void InitNCCLContext(std::unordered_map &contexts, + static void InitNCCLContext(std::unordered_map *contexts, const std::vector &places) { std::vector comms; std::vector devs; - comms.resize(contexts.size()); - devs.reserve(contexts.size()); + comms.resize(contexts->size()); + devs.reserve(contexts->size()); for (auto &p : places) { devs.push_back(boost::get(p).device); } PADDLE_ENFORCE(platform::dynload::ncclCommInitAll( - &comms[0], static_cast(contexts.size()), &devs[0])); + &comms[0], static_cast(contexts->size()), &devs[0])); int i = 0; for (auto &dev_id : devs) { - contexts.at(dev_id).comm_ = comms[i++]; + contexts->at(dev_id).comm_ = comms[i++]; } } }; @@ -91,7 +94,7 @@ struct NCCLContextMap { std::unordered_map contexts_; std::vector order_; - NCCLContextMap(const std::vector &places) { + explicit NCCLContextMap(const std::vector &places) { order_.reserve(places.size()); for (auto &p : places) { int dev_id = boost::get(p).device; From 38f86769892568981693d46cd3a7a77f5bf21b04 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Wed, 11 Apr 2018 12:37:53 +0800 Subject: [PATCH 075/164] remove unused nccl.cmake --- cmake/external/nccl.cmake | 67 --------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 cmake/external/nccl.cmake diff --git a/cmake/external/nccl.cmake b/cmake/external/nccl.cmake deleted file mode 100644 index af5c689c35..0000000000 --- a/cmake/external/nccl.cmake +++ /dev/null @@ -1,67 +0,0 @@ -# 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. - -if(NOT WITH_GPU) - return() -endif() - -include(ExternalProject) - -set(NCCL_SOURCE_DIR ${THIRD_PARTY_PATH}/nccl) - -include_directories(${NCCL_SOURCE_DIR}/src/extern_nccl/src) - -if(WITH_DSO) - # If we use DSO, we do not build nccl, just download the dependencies - set(NCCL_BUILD_COMMAND "") - set(NCCL_INSTALL_COMMAND "") - set(NCCL_INSTALL_DIR "") -else() - # otherwise, we build nccl and link it. - set(NCCL_INSTALL_DIR ${THIRD_PARTY_PATH}/install/nccl) - # Note: cuda 8.0 is needed to make nccl - # When cuda is not installed on the system directory, need to set CUDA_HOME to your cuda root - set(NCCL_BUILD_COMMAND "make -j 8") - set(NCCL_INSTALL_COMMAND "make install PREFIX=${NCCL_INSTALL_DIR}") -endif() - -ExternalProject_Add( - extern_nccl - ${EXTERNAL_PROJECT_LOG_ARGS} - GIT_REPOSITORY "https://github.com/NVIDIA/nccl.git" - GIT_TAG "v1.3.4-1" - PREFIX "${NCCL_SOURCE_DIR}" - UPDATE_COMMAND "" - CONFIGURE_COMMAND "" - BUILD_COMMAND "${NCCL_BUILD_COMMAND}" - INSTALL_COMMAND "${NCCL_INSTALL_COMMAND}" - INSTALL_DIR "${NCCL_INSTALL_DIR}" - TEST_COMMAND "" -) - -if(WITH_DSO) - if(${CMAKE_VERSION} VERSION_LESS "3.3.0") - set(dummyfile ${CMAKE_CURRENT_BINARY_DIR}/lib_nccl_dummy.c) - file(WRITE ${dummyfile} "const char * dummy_nccl = \"${dummyfile}\";") - add_library(nccl STATIC ${dummyfile}) - else() - add_library(nccl INTERFACE) - endif() -else() - add_library(nccl STATIC IMPORTED GLOBAL) - set_property(TARGET nccl PROPERTY IMPORTED_LOCATION - ${NCCL_INSTALL_DIR}/lib/libnccl_static.a) -endif() - -add_dependencies(nccl extern_nccl) From 273f4892b21ff8e17fba300071943846e06b75cf Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Wed, 11 Apr 2018 04:52:08 +0000 Subject: [PATCH 076/164] update recordio unittest --- paddle/fluid/framework/reader.cc | 4 +++- .../fluid/tests/unittests/test_recordio_reader.py | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/framework/reader.cc b/paddle/fluid/framework/reader.cc index 56bf00e5f9..76126f3dc6 100644 --- a/paddle/fluid/framework/reader.cc +++ b/paddle/fluid/framework/reader.cc @@ -22,7 +22,9 @@ FileReader::FileReader(const std::vector &dims) : dims_(dims) {} void FileReader::ReadNext(std::vector *out) { ReadNextImpl(out); - PADDLE_ENFORCE_EQ(out->size(), dims_.size()); + if (out->empty()) { + return; + } for (size_t i = 0; i < dims_.size(); ++i) { auto &actual = out->at(i).dims(); auto &expect = dims_[i]; diff --git a/python/paddle/fluid/tests/unittests/test_recordio_reader.py b/python/paddle/fluid/tests/unittests/test_recordio_reader.py index 096d99a3f3..2982cb8ceb 100644 --- a/python/paddle/fluid/tests/unittests/test_recordio_reader.py +++ b/python/paddle/fluid/tests/unittests/test_recordio_reader.py @@ -65,8 +65,14 @@ class TestRecordIO(unittest.TestCase): # train a pass batch_id = 0 - while not data_file.eof(): - tmp, = exe.run(fetch_list=[avg_loss]) + while True: + ex = None + try: + tmp, = exe.run(fetch_list=[avg_loss]) + except fluid.core.EnforceNotMet as ex: + self.assertIn("There is no next data.", ex.message) + break + avg_loss_np.append(tmp) batch_id += 1 data_file.reset() From b1cc28dab34c2fb5b4eeb9446ee3b066e86fac71 Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Wed, 11 Apr 2018 04:54:14 +0000 Subject: [PATCH 077/164] update --- python/paddle/fluid/tests/unittests/test_recordio_reader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/paddle/fluid/tests/unittests/test_recordio_reader.py b/python/paddle/fluid/tests/unittests/test_recordio_reader.py index 2982cb8ceb..7c8e7f634f 100644 --- a/python/paddle/fluid/tests/unittests/test_recordio_reader.py +++ b/python/paddle/fluid/tests/unittests/test_recordio_reader.py @@ -66,7 +66,6 @@ class TestRecordIO(unittest.TestCase): # train a pass batch_id = 0 while True: - ex = None try: tmp, = exe.run(fetch_list=[avg_loss]) except fluid.core.EnforceNotMet as ex: From 0dacbbe1fe79d7643ce56c6ee630b8fe1270990b Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 11 Apr 2018 14:07:58 +0800 Subject: [PATCH 078/164] update multi_pass_reader unittest --- .../fluid/tests/unittests/test_multi_pass_reader.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py b/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py index c8a8afbea6..1471843ded 100644 --- a/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py +++ b/python/paddle/fluid/tests/unittests/test_multi_pass_reader.py @@ -57,8 +57,12 @@ class TestMultipleReader(unittest.TestCase): exe.run(fluid.default_startup_program()) batch_count = 0 - while not data_file.eof(): - img_val, = exe.run(fetch_list=[img]) + while True: + try: + img_val, = exe.run(fetch_list=[img]) + except fluid.core.EnforceNotMet as ex: + self.assertIn("There is no next data.", ex.message) + break batch_count += 1 self.assertLessEqual(img_val.shape[0], self.batch_size) data_file.reset() From 8c1eb8693e58b2d516eb5bba1ed966ee81bf6cbf Mon Sep 17 00:00:00 2001 From: JiayiFeng Date: Wed, 11 Apr 2018 06:12:35 +0000 Subject: [PATCH 079/164] update unittest --- ...{test_multiple_reader.py => test_multi_file_reader.py} | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) rename python/paddle/fluid/tests/unittests/{test_multiple_reader.py => test_multi_file_reader.py} (91%) diff --git a/python/paddle/fluid/tests/unittests/test_multiple_reader.py b/python/paddle/fluid/tests/unittests/test_multi_file_reader.py similarity index 91% rename from python/paddle/fluid/tests/unittests/test_multiple_reader.py rename to python/paddle/fluid/tests/unittests/test_multi_file_reader.py index a60a5d6c4a..5dc41e54d6 100644 --- a/python/paddle/fluid/tests/unittests/test_multiple_reader.py +++ b/python/paddle/fluid/tests/unittests/test_multi_file_reader.py @@ -61,8 +61,12 @@ class TestMultipleReader(unittest.TestCase): exe.run(fluid.default_startup_program()) batch_count = 0 - while not data_files.eof(): - img_val, = exe.run(fetch_list=[img]) + while True: + try: + img_val, = exe.run(fetch_list=[img]) + except fluid.core.EnforceNotMet as ex: + self.assertIn("There is no next data.", ex.message) + break batch_count += 1 self.assertLessEqual(img_val.shape[0], self.batch_size) data_files.reset() From c64190ecbb211c09054b0ffea25179fdcad50207 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Wed, 11 Apr 2018 14:44:22 +0800 Subject: [PATCH 080/164] Polish NCCLHelper --- paddle/fluid/platform/nccl_helper.h | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/paddle/fluid/platform/nccl_helper.h b/paddle/fluid/platform/nccl_helper.h index 3a2a423486..ca9ab2c7ae 100644 --- a/paddle/fluid/platform/nccl_helper.h +++ b/paddle/fluid/platform/nccl_helper.h @@ -61,7 +61,7 @@ struct NCCLContext { ncclComm_t comm_; explicit NCCLContext(int dev_id) - : ctx_(new CUDADeviceContext(CUDAPlace(dev_id))) {} + : ctx_(new CUDADeviceContext(CUDAPlace(dev_id))), comm_{nullptr} {} cudaStream_t stream() const { return ctx_->stream(); } @@ -95,6 +95,7 @@ struct NCCLContextMap { std::vector order_; explicit NCCLContextMap(const std::vector &places) { + PADDLE_ENFORCE(!places.empty()); order_.reserve(places.size()); for (auto &p : places) { int dev_id = boost::get(p).device; @@ -105,15 +106,17 @@ struct NCCLContextMap { order_.size(), contexts_.size(), "NCCL Context Map does not support contain two or more same device"); - std::vector comms; - comms.resize(order_.size()); + if (places.size() > 1) { + std::vector comms; + comms.resize(order_.size()); - PADDLE_ENFORCE(platform::dynload::ncclCommInitAll( - &comms[0], static_cast(order_.size()), &order_[0])); + PADDLE_ENFORCE(platform::dynload::ncclCommInitAll( + &comms[0], static_cast(order_.size()), &order_[0])); - int i = 0; - for (auto &dev_id : order_) { - contexts_.at(dev_id).comm_ = comms[i++]; + int i = 0; + for (auto &dev_id : order_) { + contexts_.at(dev_id).comm_ = comms[i++]; + } } } From 16a9dfe4805fa88670338b52bf898f60043fc16f Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Wed, 11 Apr 2018 15:12:58 +0800 Subject: [PATCH 081/164] finish --- .../details/multi_devices_graph_builder.cc | 16 +++++++--------- .../details/multi_devices_graph_builder.h | 2 +- paddle/fluid/framework/details/send_op_handle.cc | 12 ++++++++---- paddle/fluid/framework/details/send_op_handle.h | 4 +++- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.cc b/paddle/fluid/framework/details/multi_devices_graph_builder.cc index 0ebcd627bd..e0dd9e6068 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.cc +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.cc @@ -57,8 +57,7 @@ MultiDevSSAGraphBuilder::MultiDevSSAGraphBuilder( void MultiDevSSAGraphBuilder::CreateOpHandleIOs(SSAGraph *result, OpDesc *op, const platform::Place &p, - const size_t &i, - bool create_output) const { + const size_t &i) const { auto *op_handle = result->ops_.back().get(); op_handle->dev_ctxes_[p] = const_cast( platform::DeviceContextPool::Instance().Get(p)); @@ -69,12 +68,11 @@ void MultiDevSSAGraphBuilder::CreateOpHandleIOs(SSAGraph *result, OpDesc *op, VarHandle *var = CreateOrGetLatestVarHandle(result, each_var_name, p, i); op_handle->AddInput(var); } - if (create_output) { - var_names = op->OutputArgumentNames(); - for (auto &each_var_name : var_names) { - CreateOpOutput(result, op_handle, each_var_name, p, i); - } + var_names = op->OutputArgumentNames(); + + for (auto &each_var_name : var_names) { + CreateOpOutput(result, op_handle, each_var_name, p, i); } } @@ -106,10 +104,10 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( auto &p = places_[0]; auto *s = local_scopes_[0]; // FIXME(wuyi): send op always copy from GPU 0 - result.ops_.emplace_back(new SendOpHandle(*op, s)); + result.ops_.emplace_back(new SendOpHandle(*op, s, p)); // Create inputs for output on original place and no ssa output // is created for send op. - CreateOpHandleIOs(&result, op, p, 0, false); + CreateOpHandleIOs(&result, op, p, 0); continue; } diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.h b/paddle/fluid/framework/details/multi_devices_graph_builder.h index 137c817fde..de34caab1b 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.h +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.h @@ -46,7 +46,7 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { private: void CreateOpHandleIOs(SSAGraph *result, OpDesc *op, const platform::Place &p, - const size_t &i, bool create_output = true) const; + const size_t &i) const; private: std::string loss_var_name_; diff --git a/paddle/fluid/framework/details/send_op_handle.cc b/paddle/fluid/framework/details/send_op_handle.cc index caacfa6b1e..d181607e86 100644 --- a/paddle/fluid/framework/details/send_op_handle.cc +++ b/paddle/fluid/framework/details/send_op_handle.cc @@ -19,18 +19,22 @@ namespace framework { namespace details { SendOpHandle::SendOpHandle(const framework::OpDesc &op_desc, - const Scope *local_scope) + const Scope *local_scope, + const platform::Place &place) : op_(framework::OpRegistry::CreateOp(op_desc)), - local_scope_(local_scope) {} + local_scope_(local_scope), + place_(place) {} void SendOpHandle::RunImpl() { // Wait input done for (auto *in : inputs_) { auto &p = static_cast(in)->place_; + if (in->DebugString() == "dummy") { // HACK + continue; + } in->generated_op_->Wait(dev_ctxes_[p]); } - platform::CPUPlace cpu; - op_->Run(*local_scope_, cpu); + op_->Run(*local_scope_, place_); } std::string SendOpHandle::Name() const { return "send"; } diff --git a/paddle/fluid/framework/details/send_op_handle.h b/paddle/fluid/framework/details/send_op_handle.h index 8a7b62ba1c..e7857c1f23 100644 --- a/paddle/fluid/framework/details/send_op_handle.h +++ b/paddle/fluid/framework/details/send_op_handle.h @@ -31,8 +31,10 @@ namespace details { struct SendOpHandle : public OpHandleBase { std::unique_ptr op_; const Scope* local_scope_; + const platform::Place& place_; - SendOpHandle(const framework::OpDesc& op_desc, const Scope* local_scope); + SendOpHandle(const framework::OpDesc& op_desc, const Scope* local_scope, + const platform::Place& place); std::string Name() const override; From d1e63a1d9205e99483a3b69058fdf36e54dc348e Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Wed, 11 Apr 2018 15:18:55 +0800 Subject: [PATCH 082/164] fix ci --- paddle/fluid/framework/details/send_op_handle.h | 1 - 1 file changed, 1 deletion(-) diff --git a/paddle/fluid/framework/details/send_op_handle.h b/paddle/fluid/framework/details/send_op_handle.h index e7857c1f23..173f9d7261 100644 --- a/paddle/fluid/framework/details/send_op_handle.h +++ b/paddle/fluid/framework/details/send_op_handle.h @@ -22,7 +22,6 @@ #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/framework/operator.h" #include "paddle/fluid/framework/scope.h" -#include "paddle/fluid/platform/nccl_helper.h" namespace paddle { namespace framework { From 124c93081d26a89b677823a7e2d74260c579fb54 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Wed, 11 Apr 2018 14:39:00 +0800 Subject: [PATCH 083/164] remove ContextMap --- paddle/fluid/framework/details/CMakeLists.txt | 7 +- .../framework/details/broadcast_op_handle.cc | 29 +-- .../framework/details/broadcast_op_handle.h | 5 +- .../details/broadcast_op_handle_test.cc | 234 +++++++++++------- paddle/fluid/framework/details/var_handle.h | 1 + paddle/fluid/platform/device_context.h | 45 +--- 6 files changed, 157 insertions(+), 164 deletions(-) diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index 7b7582380c..2a87f02bd5 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -7,16 +7,12 @@ if(WITH_GPU) dynload_cuda) nv_library(broadcast_op_handle SRCS broadcast_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) endif() - cc_library(computation_op_handle SRCS computation_op_handle.cc DEPS framework_proto scope place operator op_registry) - cc_library(ssa_graph SRCS ssa_graph.cc DEPS var_handle op_handle_base) cc_library(ssa_graph_builder SRCS ssa_graph_builder.cc DEPS ssa_graph) if(WITH_GPU) set(multi_devices_graph_builder_deps nccl_all_reduce_op_handle) - nv_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory - device_context broadcast_op_handle) else() set(multi_devices_graph_builder_deps) endif() @@ -25,3 +21,6 @@ cc_library(multi_devices_graph_builder SRCS multi_devices_graph_builder.cc DEPS cc_library(ssa_graph_executor SRCS ssa_graph_executor.cc DEPS ssa_graph framework_proto) cc_library(threaded_ssa_graph_executor SRCS threaded_ssa_graph_executor.cc DEPS fetch_op_handle ssa_graph_executor scope simple_threadpool device_context) + +cc_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory + device_context broadcast_op_handle) diff --git a/paddle/fluid/framework/details/broadcast_op_handle.cc b/paddle/fluid/framework/details/broadcast_op_handle.cc index a782ebf8fd..2c99a347bf 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle.cc @@ -29,13 +29,8 @@ Tensor *GetTensorFromVar(Variable *in_var) { return nullptr; } BroadcastOpHandle::BroadcastOpHandle(const std::vector &local_scopes, - const std::vector &places, - const platform::ContextMap &ctxs) - : local_scopes_(local_scopes), places_(places), ctxs_(ctxs) { - for (auto &p : places_) { - this->dev_ctxes_[p] = ctxs_.DevCtx(p); - } -} + const std::vector &places) + : local_scopes_(local_scopes), places_(places) {} void BroadcastOpHandle::RunImpl() { PADDLE_ENFORCE_EQ(this->inputs_.size(), 1); @@ -47,26 +42,18 @@ void BroadcastOpHandle::RunImpl() { if (inputs_[0]->generated_op_) inputs_[0]->generated_op_->Wait(dev_ctxes_[in_place]); - auto iter = std::find(places_.begin(), places_.end(), in_place); - if (iter == places_.end()) { - PADDLE_THROW("The input of BCast is not in the places_."); - } - - int offset = iter - places_.begin(); - auto in_var = local_scopes_[offset]->FindVar(in_var_handle->name_); + auto in_scope_idx = in_var_handle->scope_idx_; + PADDLE_ENFORCE_LT(in_scope_idx, local_scopes_.size(), ""); + auto in_var = local_scopes_[in_scope_idx]->FindVar(in_var_handle->name_); Tensor *in_tensor = GetTensorFromVar(in_var); for (auto *out : outputs_) { auto out_handle = static_cast(out); auto &out_p = out_handle->place_; - auto iter = std::find(places_.begin(), places_.end(), out_p); - if (iter == places_.end()) { - PADDLE_THROW("The output of BCast is not in the places_."); - } - int offset = iter - places_.begin(); - - auto *s = local_scopes_[offset]; + auto out_scope_idx = out_handle->scope_idx_; + PADDLE_ENFORCE_LT(out_scope_idx, local_scopes_.size(), ""); + auto *s = local_scopes_[out_scope_idx]; auto out_var = s->FindVar(out_handle->name_); PADDLE_ENFORCE_EQ(out_var->Type(), in_var->Type(), ""); diff --git a/paddle/fluid/framework/details/broadcast_op_handle.h b/paddle/fluid/framework/details/broadcast_op_handle.h index a571af1218..06ec164ce0 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.h +++ b/paddle/fluid/framework/details/broadcast_op_handle.h @@ -35,11 +35,10 @@ namespace details { struct BroadcastOpHandle : public OpHandleBase { const std::vector &local_scopes_; const std::vector &places_; - const platform::ContextMap &ctxs_; + // const platform::ContextMap &ctxs_; BroadcastOpHandle(const std::vector &local_scopes, - const std::vector &places, - const platform::ContextMap &ctxs); + const std::vector &places); std::string Name() const override; diff --git a/paddle/fluid/framework/details/broadcast_op_handle_test.cc b/paddle/fluid/framework/details/broadcast_op_handle_test.cc index fd671ded21..d03115f0be 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle_test.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle_test.cc @@ -25,51 +25,66 @@ const f::DDim kDims = {20, 20}; class BroadcastTester : public ::testing::Test { public: - void SetUp() override { - int count = p::GetCUDADeviceCount(); - if (count <= 1) { - LOG(WARNING) << "Cannot test multi-gpu Broadcast, because the CUDA " - "device count is " - << count; - exit(0); + void InitCtx(bool use_gpu) { + if (use_gpu) { +#ifdef PADDLE_WITH_CUDA + int count = p::GetCUDADeviceCount(); + if (count <= 1) { + LOG(WARNING) << "Cannot test multi-gpu Broadcast, because the CUDA " + "device count is " + << count; + exit(0); + } + for (int i = 0; i < count; ++i) { + auto p = p::CUDAPlace(i); + gpu_list_.push_back(p); + ctxs_.emplace_back(new p::CUDADeviceContext(p)); + } +#else + PADDLE_THROW("CUDA is not support."); +#endif + } else { + int count = 8; + for (int i = 0; i < count; ++i) { + auto p = p::CPUPlace(); + gpu_list_.push_back(p); + ctxs_.emplace_back(new p::CPUDeviceContext(p)); + } } - for (int i = 0; i < count; ++i) { - gpu_list_.emplace_back(p::CUDAPlace(i)); - } - ctxs_ = new p::ContextMap(gpu_list_); } template - void BroadcastInitOp(int gpu_id = 0) { + void BroadcastInitOp(int input_scope_idx) { for (size_t j = 0; j < gpu_list_.size(); ++j) { local_scope_.push_back(&g_scope_.NewScope()); auto* out_var = local_scope_[j]->Var("out"); out_var->GetMutable(); } - auto* in_var = local_scope_[gpu_id]->Var("input"); + auto* in_var = local_scope_[input_scope_idx]->Var("input"); in_var->GetMutable(); - bc_op_handle_ = - new f::details::BroadcastOpHandle(local_scope_, gpu_list_, *ctxs_); + bc_op_handle_ = new f::details::BroadcastOpHandle(local_scope_, gpu_list_); f::details::VarHandle* in_var_handle = new f::details::VarHandle(); - in_var_handle->place_ = gpu_list_[gpu_id]; + in_var_handle->place_ = gpu_list_[input_scope_idx]; in_var_handle->name_ = "input"; in_var_handle->version_ = 1; + in_var_handle->scope_idx_ = input_scope_idx; in_var_handle->generated_op_ = nullptr; bc_op_handle_->AddInput(in_var_handle); for (size_t j = 0; j < gpu_list_.size(); ++j) { + bc_op_handle_->dev_ctxes_[gpu_list_[j]] = ctxs_[j]; f::details::VarHandle* out_var_handle = new f::details::VarHandle(); out_var_handle->place_ = gpu_list_[j]; out_var_handle->name_ = "out"; out_var_handle->version_ = 2; + out_var_handle->scope_idx_ = j; out_var_handle->generated_op_ = bc_op_handle_; bc_op_handle_->AddOutput(out_var_handle); } } void BroadcastDestroy() { - delete ctxs_; for (auto in : bc_op_handle_->inputs_) { delete in; } @@ -77,98 +92,131 @@ class BroadcastTester : public ::testing::Test { delete out; } delete bc_op_handle_; + for (size_t j = 0; j < ctxs_.size(); ++j) { + delete ctxs_[j]; + } } - public: - f::Scope g_scope_; - p::ContextMap* ctxs_; - std::vector local_scope_; - std::vector gpu_list_; - f::details::BroadcastOpHandle* bc_op_handle_; -}; + void WaitAll() { + for (size_t j = 0; j < ctxs_.size(); ++j) { + ctxs_[j]->Wait(); + } + } -TEST_F(BroadcastTester, BroadcastTestLodTensor) { - int gpu_id = 0; - BroadcastInitOp(gpu_id); + void TestBroadcastLodTensor() { + int input_scope_idx = 0; + BroadcastInitOp(input_scope_idx); - auto in_var = local_scope_[gpu_id]->Var("input"); - auto in_lod_tensor = in_var->GetMutable(); - in_lod_tensor->mutable_data(kDims, gpu_list_[gpu_id]); + auto in_var = local_scope_[input_scope_idx]->Var("input"); + auto in_lod_tensor = in_var->GetMutable(); + in_lod_tensor->mutable_data(kDims, gpu_list_[input_scope_idx]); - std::vector send_vector(f::product(kDims), gpu_id + 12); - for (size_t k = 0; k < send_vector.size(); ++k) { - send_vector[k] = k; - } - f::LoD lod{{0, 10, 20}}; - paddle::framework::TensorFromVector( - send_vector, *(ctxs_->DevCtx(gpu_list_[gpu_id])), in_lod_tensor); - in_lod_tensor->set_lod(lod); - bc_op_handle_->Run(false); - - ctxs_->WaitAll(); - - p::CPUPlace cpu_place; - for (size_t j = 0; j < gpu_list_.size(); ++j) { - auto out_var = local_scope_[j]->Var("out"); - auto out_tensor = out_var->Get(); - PADDLE_ENFORCE_EQ(out_tensor.lod(), lod, "lod is not equal."); - - f::Tensor result_tensor; - f::TensorCopy(out_tensor, cpu_place, *(ctxs_->DevCtx(j)), &result_tensor); - float* ct = result_tensor.mutable_data(cpu_place); - - for (int64_t j = 0; j < f::product(kDims); ++j) { - ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + std::vector send_vector(f::product(kDims), input_scope_idx + 12); + for (size_t k = 0; k < send_vector.size(); ++k) { + send_vector[k] = k; } - } + f::LoD lod{{0, 10, 20}}; + paddle::framework::TensorFromVector( + send_vector, *(ctxs_[input_scope_idx]), in_lod_tensor); + in_lod_tensor->set_lod(lod); - BroadcastDestroy(); -} + bc_op_handle_->Run(false); -TEST_F(BroadcastTester, BroadcastTestSelectedRows) { - int gpu_id = 0; - BroadcastInitOp(gpu_id); - - auto in_var = local_scope_[gpu_id]->Var("input"); - auto in_selected_rows = in_var->GetMutable(); - auto value = in_selected_rows->mutable_value(); - value->mutable_data(kDims, gpu_list_[gpu_id]); - int height = kDims[0] * 2; - std::vector rows{0, 1, 2, 3, 3, 0, 14, 7, 3, 1, - 2, 4, 6, 3, 1, 1, 1, 1, 3, 7}; - in_selected_rows->set_height(height); - in_selected_rows->set_rows(rows); - - std::vector send_vector(f::product(kDims)); - for (size_t k = 0; k < send_vector.size(); ++k) { - send_vector[k] = k; - } - paddle::framework::TensorFromVector( - send_vector, *(ctxs_->DevCtx(gpu_list_[gpu_id])), value); + WaitAll(); + + p::CPUPlace cpu_place; + for (size_t j = 0; j < gpu_list_.size(); ++j) { + auto out_var = local_scope_[j]->Var("out"); + auto out_tensor = out_var->Get(); + PADDLE_ENFORCE_EQ(out_tensor.lod(), lod, "lod is not equal."); - bc_op_handle_->Run(false); + f::Tensor result_tensor; + f::TensorCopy(out_tensor, cpu_place, *(ctxs_[j]), &result_tensor); + float* ct = result_tensor.mutable_data(cpu_place); - ctxs_->WaitAll(); + for (int64_t j = 0; j < f::product(kDims); ++j) { + ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + } + } - p::CPUPlace cpu_place; - for (size_t j = 0; j < gpu_list_.size(); ++j) { - auto out_var = local_scope_[j]->Var("out"); - auto& out_select_rows = out_var->Get(); - auto rt = out_select_rows.value(); + BroadcastDestroy(); + } - PADDLE_ENFORCE_EQ(out_select_rows.height(), height, "height is not equal."); - for (size_t k = 0; k < out_select_rows.rows().size(); ++k) { - PADDLE_ENFORCE_EQ(out_select_rows.rows()[k], rows[k]); + void TestBroadcastSelectedRows() { + int input_scope_idx = 0; + BroadcastInitOp(input_scope_idx); + + auto in_var = local_scope_[input_scope_idx]->Var("input"); + auto in_selected_rows = in_var->GetMutable(); + auto value = in_selected_rows->mutable_value(); + value->mutable_data(kDims, gpu_list_[input_scope_idx]); + int height = kDims[0] * 2; + std::vector rows{0, 1, 2, 3, 3, 0, 14, 7, 3, 1, + 2, 4, 6, 3, 1, 1, 1, 1, 3, 7}; + in_selected_rows->set_height(height); + in_selected_rows->set_rows(rows); + + std::vector send_vector(f::product(kDims)); + for (size_t k = 0; k < send_vector.size(); ++k) { + send_vector[k] = k; } + paddle::framework::TensorFromVector( + send_vector, *(ctxs_[input_scope_idx]), value); + + bc_op_handle_->Run(false); - f::Tensor result_tensor; - f::TensorCopy(rt, cpu_place, *(ctxs_->DevCtx(j)), &result_tensor); - float* ct = result_tensor.data(); + WaitAll(); - for (int64_t j = 0; j < f::product(kDims); ++j) { - ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + p::CPUPlace cpu_place; + for (size_t j = 0; j < gpu_list_.size(); ++j) { + auto out_var = local_scope_[j]->Var("out"); + auto& out_select_rows = out_var->Get(); + auto rt = out_select_rows.value(); + + PADDLE_ENFORCE_EQ(out_select_rows.height(), height, + "height is not equal."); + for (size_t k = 0; k < out_select_rows.rows().size(); ++k) { + PADDLE_ENFORCE_EQ(out_select_rows.rows()[k], rows[k]); + } + + f::Tensor result_tensor; + f::TensorCopy(rt, cpu_place, *(ctxs_[j]), &result_tensor); + float* ct = result_tensor.data(); + + for (int64_t j = 0; j < f::product(kDims); ++j) { + ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + } } + + BroadcastDestroy(); } - BroadcastDestroy(); + public: + f::Scope g_scope_; + std::vector ctxs_; + std::vector local_scope_; + std::vector gpu_list_; + f::details::BroadcastOpHandle* bc_op_handle_; +}; + +TEST_F(BroadcastTester, TestCPUBroadcastTestLodTensor) { + InitCtx(false); + TestBroadcastLodTensor(); +} + +TEST_F(BroadcastTester, TestCPUBroadcastTestSelectedRows) { + InitCtx(false); + TestBroadcastSelectedRows(); +} + +#ifdef PADDLE_WITH_CUDA +TEST_F(BroadcastTester, TestGPUBroadcastTestLodTensor) { + InitCtx(true); + TestBroadcastLodTensor(); +} + +TEST_F(BroadcastTester, TestGPUBroadcastTestSelectedRows) { + InitCtx(true); + TestBroadcastSelectedRows(); } +#endif diff --git a/paddle/fluid/framework/details/var_handle.h b/paddle/fluid/framework/details/var_handle.h index 569dda17c6..871e41343f 100644 --- a/paddle/fluid/framework/details/var_handle.h +++ b/paddle/fluid/framework/details/var_handle.h @@ -50,6 +50,7 @@ struct VarHandle : public VarHandleBase { // version field currently is not used, however, just store the version to // debug easily. size_t version_; + size_t scope_idx_; std::string name_; platform::Place place_; }; diff --git a/paddle/fluid/platform/device_context.h b/paddle/fluid/platform/device_context.h index fceb5845ff..39ef082266 100644 --- a/paddle/fluid/platform/device_context.h +++ b/paddle/fluid/platform/device_context.h @@ -2,21 +2,19 @@ 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 +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 - #ifdef PADDLE_WITH_CUDA #include "paddle/fluid/platform/dynload/cublas.h" #include "paddle/fluid/platform/dynload/cudnn.h" @@ -140,45 +138,6 @@ template <> struct DefaultDeviceContextType { using TYPE = CUDAPinnedDeviceContext; }; - -class ContextMap { - public: - explicit ContextMap(const std::vector& places) { - order_.reserve(places.size()); - for (auto& p : places) { - auto dev = boost::get(p); - int dev_id = dev.device; - order_.emplace_back(dev_id); - contexts_[dev_id].reset(new CUDADeviceContext(dev)); - } - PADDLE_ENFORCE_EQ( - order_.size(), contexts_.size(), - "Context Map does not support contain two or more same device"); - } - - DeviceContext* DevCtx(int dev_id) const { return at(dev_id); } - - DeviceContext* DevCtx(platform::Place p) const { - return DevCtx(boost::get(p).device); - } - - DeviceContext* at(platform::Place p) const { - return this->at(boost::get(p).device); - } - - DeviceContext* at(int dev_id) const { return contexts_.at(dev_id).get(); } - - void WaitAll() { - for (auto& p : contexts_) { - p.second->Wait(); - } - } - - private: - std::unordered_map> contexts_; - std::vector order_; -}; - #endif #ifdef PADDLE_WITH_MKLDNN From 80bd1ca01f62871b7e14fbdbe70482b3eeff9779 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Wed, 11 Apr 2018 01:31:59 -0700 Subject: [PATCH 084/164] "fix the style" --- paddle/fluid/operators/sequence_expand_op.cu | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 8119afce1a..111ccba225 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -12,7 +12,6 @@ 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. */ -#define EIGEN_USE_GPU #include #include "paddle/fluid/operators/sequence_expand_op.h" #include "paddle/fluid/platform/cuda_helper.h" @@ -78,7 +77,7 @@ __global__ void sequence_expand_grad_kernel( void GetOutputOffset(const framework::Vector& x_lod, const framework::Vector& ref_lod, - framework::Vector& out_offset) { + framework::Vector* out_offset) { size_t offset = 0; int lod_size = static_cast(x_lod.size()); for (int i = 0; i < static_cast(x_lod.size()); ++i) { @@ -98,7 +97,7 @@ struct SequenceExpandFunctor { LoDTensor* out) { int x_item_length = x.numel() / x.dims()[0]; framework::Vector out_offset(x_lod.size()); - GetOutputOffset(x_lod, ref_lod, out_offset); + GetOutputOffset(x_lod, ref_lod, &out_offset); int thread_x = std::min(32, std::max(static_cast(ref_lod.size()), 16)); int thread_y = 16; @@ -124,7 +123,7 @@ struct SequenceExpandGradFunctor { LoDTensor* dx) { int x_item_length = framework::product(dx->dims()) / dx->dims()[0]; framework::Vector out_offset(x_lod.size()); - GetOutputOffset(x_lod, ref_lod, out_offset); + GetOutputOffset(x_lod, ref_lod, &out_offset); int thread_x = std::min(32, std::max(static_cast(ref_lod.size()), 16)); int thread_y = 16; From 62d1f9a7cb9b850584fcd22d1c2b57f31174a13a Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Wed, 11 Apr 2018 01:44:57 -0700 Subject: [PATCH 085/164] "done" --- paddle/fluid/operators/sequence_expand_op.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/operators/sequence_expand_op.cu b/paddle/fluid/operators/sequence_expand_op.cu index 111ccba225..c00765e5d5 100644 --- a/paddle/fluid/operators/sequence_expand_op.cu +++ b/paddle/fluid/operators/sequence_expand_op.cu @@ -81,7 +81,7 @@ void GetOutputOffset(const framework::Vector& x_lod, size_t offset = 0; int lod_size = static_cast(x_lod.size()); for (int i = 0; i < static_cast(x_lod.size()); ++i) { - out_offset[i] = offset; + (*out_offset)[i] = offset; if (i < lod_size - 1) { offset += (ref_lod[i + 1] - ref_lod[i]) * (x_lod[i + 1] - x_lod[i]); } From 52987902c98378432ba9e3fc54307e19e87aaca3 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Wed, 11 Apr 2018 16:52:16 +0800 Subject: [PATCH 086/164] Polish reshape op --- paddle/fluid/operators/reshape_op.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/operators/reshape_op.h b/paddle/fluid/operators/reshape_op.h index 807e5ad951..9abc78421a 100644 --- a/paddle/fluid/operators/reshape_op.h +++ b/paddle/fluid/operators/reshape_op.h @@ -60,7 +60,7 @@ class ReshapeOp : public framework::OperatorWithKernel { static framework::DDim ValidateShape(const std::vector shape, const framework::DDim &in_dims) { const int64_t in_size = framework::product(in_dims); - // only one dimension canbe set to -1, whose size will be automatically + // only one dimension can be set to -1, whose size will be automatically // infered. const int64_t unk_dim_val = -1; const int64_t copy_dim_val = 0; @@ -119,13 +119,15 @@ class ReshapeKernel : public framework::OpKernel { auto *shape_tensor = ctx.Input("Shape"); framework::DDim out_dims = out->dims(); + if (shape_tensor) { auto *shape_data = shape_tensor->data(); + framework::Tensor cpu_shape_tensor; if (platform::is_gpu_place(ctx.GetPlace())) { - framework::Tensor cpu_shape_tensor; TensorCopy(*shape_tensor, platform::CPUPlace(), ctx.device_context(), &cpu_shape_tensor); shape_data = cpu_shape_tensor.data(); + ctx.device_context().Wait(); } auto shape = std::vector(shape_data, shape_data + shape_tensor->numel()); From d52fa26fdab7a0497a3e7f49833d1b3827955c44 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Wed, 11 Apr 2018 17:03:39 +0800 Subject: [PATCH 087/164] Feature/metrics (#9791) * "add metrics" * "add fluid metrics" * "add import guards" * "show warnings" * "add demo" * "fix ci" * "add some details" * "fix cci" * "add demo Python" * "add metrics" --- benchmark/fluid/mnist.py | 7 +- python/paddle/fluid/__init__.py | 1 + python/paddle/fluid/average.py | 6 + python/paddle/fluid/evaluator.py | 4 + python/paddle/fluid/layers/metric.py | 37 ++- python/paddle/fluid/metrics.py | 378 +++++++++++++++++++++++++++ 6 files changed, 427 insertions(+), 6 deletions(-) create mode 100644 python/paddle/fluid/metrics.py diff --git a/benchmark/fluid/mnist.py b/benchmark/fluid/mnist.py index 43866da9cb..dc10ac2ec1 100644 --- a/benchmark/fluid/mnist.py +++ b/benchmark/fluid/mnist.py @@ -139,9 +139,6 @@ def run_benchmark(model, args): # inference program inference_program = fluid.default_main_program().clone() - with fluid.program_guard(inference_program): - inference_program = fluid.io.get_inference_program( - target_vars=[batch_acc, batch_size_tensor]) # Optimization opt = fluid.optimizer.AdamOptimizer( @@ -161,7 +158,7 @@ def run_benchmark(model, args): train_reader = paddle.batch( paddle.dataset.mnist.train(), batch_size=args.batch_size) - accuracy = fluid.average.WeightedAverage() + accuracy = fluid.metrics.Accuracy() iters, num_samples, start_time = 0, 0, time.time() for pass_id in range(args.pass_num): accuracy.reset() @@ -184,7 +181,7 @@ def run_benchmark(model, args): "label": y_data}, fetch_list=[avg_cost, batch_acc, batch_size_tensor] ) # The accuracy is the accumulation of batches, but not the current batch. - accuracy.add(value=outs[1], weight=outs[2]) + accuracy.update(value=outs[1], weight=outs[2]) iters += 1 num_samples += len(y_data) loss = np.array(outs[0]) diff --git a/python/paddle/fluid/__init__.py b/python/paddle/fluid/__init__.py index a5a3884750..f757411b85 100644 --- a/python/paddle/fluid/__init__.py +++ b/python/paddle/fluid/__init__.py @@ -29,6 +29,7 @@ import optimizer import backward import regularizer import average +import metrics from param_attr import ParamAttr, WeightNormParamAttr from data_feeder import DataFeeder from core import LoDTensor, CPUPlace, CUDAPlace, CUDAPinnedPlace diff --git a/python/paddle/fluid/average.py b/python/paddle/fluid/average.py index ded6eb0859..6abe8233b0 100644 --- a/python/paddle/fluid/average.py +++ b/python/paddle/fluid/average.py @@ -13,6 +13,7 @@ # limitations under the License. import numpy as np +import warnings """ Class of all kinds of Average. @@ -22,6 +23,8 @@ import numpy as np wrappers of Python functions. """ +__all__ = ["WeightedAverage"] + def _is_number_(var): return isinstance(var, int) or isinstance(var, float) or (isinstance( @@ -34,6 +37,9 @@ def _is_number_or_matrix_(var): class WeightedAverage(object): def __init__(self): + warnings.warn( + "The %s is deprecated, please use fluid.metrics.Accuracy instead." % + (self.__class__.__name__), Warning) self.reset() def reset(self): diff --git a/python/paddle/fluid/evaluator.py b/python/paddle/fluid/evaluator.py index 19e5b61b0b..13475025b5 100644 --- a/python/paddle/fluid/evaluator.py +++ b/python/paddle/fluid/evaluator.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import warnings import numpy as np import layers @@ -59,6 +60,9 @@ class Evaluator(object): """ def __init__(self, name, **kwargs): + warnings.warn( + "The %s is deprecated, because maintain a modified program inside evaluator cause bug easily, please use fluid.metrics.%s instead." + % (self.__class__.__name__, self.__class__.__name__), Warning) self.states = [] self.metrics = [] self.helper = LayerHelper(name, **kwargs) diff --git a/python/paddle/fluid/layers/metric.py b/python/paddle/fluid/layers/metric.py index 3d9157ad4e..f66dccfa2d 100644 --- a/python/paddle/fluid/layers/metric.py +++ b/python/paddle/fluid/layers/metric.py @@ -15,12 +15,13 @@ All layers just related to metric. """ +import warnings from ..layer_helper import LayerHelper from ..initializer import Normal, Constant from ..framework import Variable from ..param_attr import ParamAttr -__all__ = ['accuracy'] +__all__ = ['accuracy', 'auc'] def accuracy(input, label, k=1, correct=None, total=None): @@ -55,3 +56,37 @@ def accuracy(input, label, k=1, correct=None, total=None): "Total": [total], }) return acc_out + + +def auc(input, label, curve='ROC', num_thresholds=200): + warnings.warn( + "This interface not recommended, fluid.layers.auc compute the auc at every minibatch, \ + but can not aggregate them and get the pass AUC, because pass \ + auc can not be averaged with weighted from the minibatch auc value. \ + Please use fluid.metrics.Auc, it can compute the auc value via Python natively, \ + which can get every minibatch and every pass auc value.", Warning) + helper = LayerHelper("auc", **locals()) + topk_out = helper.create_tmp_variable(dtype=input.dtype) + topk_indices = helper.create_tmp_variable(dtype="int64") + helper.append_op( + type="top_k", + inputs={"X": [input]}, + outputs={"Out": [topk_out], + "Indices": [topk_indices]}, + attrs={"k": k}) + auc_out = helper.create_tmp_variable(dtype="float32") + if correct is None: + correct = helper.create_tmp_variable(dtype="int64") + if total is None: + total = helper.create_tmp_variable(dtype="int64") + helper.append_op( + type="accuracy", + inputs={ + "Out": [topk_out], + "Indices": [topk_indices], + "Label": [label] + }, + attrs={"curve": curve, + "num_thresholds": num_thresholds}, + outputs={"AUC": [auc_out], }) + return auc_out diff --git a/python/paddle/fluid/metrics.py b/python/paddle/fluid/metrics.py new file mode 100644 index 0000000000..99a81c1d42 --- /dev/null +++ b/python/paddle/fluid/metrics.py @@ -0,0 +1,378 @@ +# 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. +""" +Fluid Metrics + +The metrics are accomplished via Python natively. +""" +import numpy as np +import copy +import warnings + +__all__ = [ + 'MetricBase', + 'CompositeMetric', + 'Accuracy', + 'ChunkEvaluator', + 'EditDistance', + 'DetectionMAP', + 'Auc', +] + + +def _is_numpy_(var): + return isinstance(var, (np.ndarray, np.generic)) + + +def _is_number_(var): + return isinstance(var, int) or isinstance(var, float) or (isinstance( + var, np.ndarray) and var.shape == (1, )) + + +def _is_number_or_matrix_(var): + return _is_number_(var) or isinstance(var, np.ndarray) + + +class MetricBase(object): + """ + Base Class for all evaluators + + Args: + name(str): The name of evaluator. such as, "accuracy". Used for generate + temporary variable name. + Interface: + Note(*) : the states is the attributes who not has _ prefix. + + get_config(): print current states and configuration + reset(): clear the states. If the Metrics states type is not (int, float, np.ndarray), + Please override this method. + update(): update states at every minibatch + eval(): get metric evaluation in numpy type. + """ + + def __init__(self, name, **kwargs): + self._name = str(name) if name != None else self.__class__.__name__ + self._kwargs = kwargs if kwargs != None else dict() + self.reset() + + def __str__(self): + return self._name + + def reset(self): + """ + states is the attributes who not has _ prefix. + reset the states of metrics. + """ + states = { + attr: value + for attr, value in self.__dict__.iteritems() + if not attr.startswith("_") + } + for attr, value in states.iteritems(): + if isinstance(value, int): + setattr(self, attr, 0) + elif isinstance(value, float): + setattr(self, attr, .0) + elif isinstance(value, (np.ndarray, np.generic)): + setattr(self, attr, np.zeros_like(value)) + else: + setattr(self, attr, None) + + def get_config(self): + states = { + attr: value + for attr, value in self.__dict__.iteritems() + if not attr.startswith("_") + } + config = copy.deepcopy(self._kwargs) + config.update({"name": self._name, "states": copy.deepcopy(states)}) + return config + + def update(self): + raise NotImplementedError() + + def eval(self): + raise NotImplementedError() + + +class CompositeMetric(MetricBase): + """ + Compute multiple metrics in each minibatch. + for example, merge F1, accuracy, recall into one Metric. + """ + + def __init__(self, name=None, **kwargs): + super(CompositeMetric, self).__init__(name, kwargs) + self._metrics = [] + + def add_metric(self, metric): + if not isinstance(metric, MetricBase): + raise ValueError("SubMetric should be inherit from MetricBase.") + self._metrics.append(metric) + + def eval(self): + ans = [] + for m in self._metrics: + ans.append(m.eval()) + return ans + + +class Accuracy(MetricBase): + """ + Accumulate the accuracy from minibatches and compute the average accuracy + for every pass. + + Args: + name: the metrics name + + Example: + minibatch_accuracy = fluid.layers.accuracy(pred, label) + accuracy_evaluator = fluid.metrics.Accuracy() + for epoch in PASS_NUM: + accuracy_evaluator.reset() + for data in batches: + loss = exe.run(fetch_list=[cost, minibatch_accuracy]) + accuracy_evaluator.update(value=minibatch_accuracy, weight=batches) + accuracy = accuracy_evaluator.eval() + """ + + def __init__(self, name=None): + super(Accuracy, self).__init__(name) + self.value = .0 + self.weight = .0 + + def update(self, value, weight): + if not _is_number_or_matrix_(value): + raise ValueError( + "The 'value' must be a number(int, float) or a numpy ndarray.") + if not _is_number_(weight): + raise ValueError("The 'weight' must be a number(int, float).") + self.value += value * weight + self.weight += weight + + def eval(self): + if self.weight == 0: + raise ValueError( + "There is no data in Accuracy Metrics. Please check layers.accuracy output has added to Accuracy." + ) + return self.value / self.weight + + +class ChunkEvalutor(MetricBase): + """ + Accumulate counter numbers output by chunk_eval from mini-batches and + compute the precision recall and F1-score using the accumulated counter + numbers. + """ + + def __init__(self, name=None): + super(ChunkEvalutor, self).__init__(name) + self.num_infer_chunks = 0 + self.num_label_chunks = 0 + self.num_correct_chunks = 0 + + def update(self, num_infer_chunks, num_label_chunks, num_correct_chunks): + if not _is_number_or_matrix_(num_infer_chunks): + raise ValueError( + "The 'num_infer_chunks' must be a number(int, float) or a numpy ndarray." + ) + if not _is_number_or_matrix_(num_label_chunks): + raise ValueError( + "The 'num_label_chunks' must be a number(int, float) or a numpy ndarray." + ) + if not _is_number_or_matrix_(num_correct_chunks): + raise ValueError( + "The 'num_correct_chunks' must be a number(int, float) or a numpy ndarray." + ) + self.num_infer_chunks += num_infer_chunks + self.num_label_chunks += num_label_chunks + self.num_correct_chunks += num_correct_chunks + + def eval(self): + precision = float( + self.num_correct_chunks + ) / self.num_infer_chunks if self.num_infer_chunks else 0 + recall = float(self.num_correct_chunks + ) / self.num_label_chunks if self.num_label_chunks else 0 + f1_score = float(2 * precision * recall) / ( + precision + recall) if self.num_correct_chunks else 0 + return precision, recall, f1_score + + +class EditDistance(MetricBase): + """ + Accumulate edit distance sum and sequence number from mini-batches and + compute the average edit_distance and instance error of all batches. + + Args: + name: the metrics name + + Example: + edit_distance_metrics = fluid.layers.edit_distance(input, label) + distance_evaluator = fluid.metrics.EditDistance() + for epoch in PASS_NUM: + distance_evaluator.reset() + for data in batches: + loss = exe.run(fetch_list=[cost] + list(edit_distance_metrics)) + distance_evaluator.update(*edit_distance_metrics) + distance, instance_error = distance_evaluator.eval() + + In the above example: + 'distance' is the average of the edit distance in a pass. + 'instance_error' is the instance error rate in a pass. + + """ + + def __init__(self, name): + super(EditDistance, self).__init__(name) + self.total_distance = .0 + self.seq_num = 0 + self.instance_error = 0 + + def update(self, distances, seq_num): + if not _is_numpy_(distances): + raise ValueError("The 'distances' must be a numpy ndarray.") + if not _is_number_(seq_num): + raise ValueError("The 'seq_num' must be a number(int, float).") + seq_right_count = np.sum(distances == 0) + total_distance = np.sum(distances) + self.seq_num += seq_num + self.instance_error += seq_num - seq_right_count + self.total_distance += total_distance + + def eval(): + if self.seq_num == 0: + raise ValueError( + "There is no data in EditDistance Metric. Please check layers.edit_distance output has been added to EditDistance." + ) + avg_distance = self.total_distance / self.seq_num + avg_instance_error = self.instance_error / self.seq_num + return avg_distance, avg_instance_error + + +class DetectionMAP(MetricBase): + """ + Calculate the detection mean average precision (mAP). + + TODO (Dang Qingqing): update the following doc. + The general steps are as follows: + 1. calculate the true positive and false positive according to the input + of detection and labels. + 2. calculate mAP value, support two versions: '11 point' and 'integral'. + + Please get more information from the following articles: + https://sanchom.wordpress.com/tag/average-precision/ + https://arxiv.org/abs/1512.02325 + """ + + def __init__(self, name=None): + super(DetectionMAP, self).__init__(name) + # the current map value + self.value = .0 + + def update(self, value, weight): + if not _is_number_or_matrix_(value): + raise ValueError( + "The 'value' must be a number(int, float) or a numpy ndarray.") + if not _is_number_(weight): + raise ValueError("The 'weight' must be a number(int, float).") + self.value += value + self.weight += weight + + def eval(self): + if self.weight == 0: + raise ValueError( + "There is no data in DetectionMAP Metrics. " + "Please check layers.detection_map output has added to DetectionMAP." + ) + return self.value / self.weight + + +class Auc(MetricBase): + """ + Auc Metrics which adapts to binary classification. + Need to note that auc metrics compute the value via Python natively. + If you concern the speed, please use the fluid.layers.auc instead. + + The `auc` function creates four local variables, `true_positives`, + `true_negatives`, `false_positives` and `false_negatives` that are used to + compute the AUC. To discretize the AUC curve, a linearly spaced set of + thresholds is used to compute pairs of recall and precision values. The area + under the ROC-curve is therefore computed using the height of the recall + values by the false positive rate, while the area under the PR-curve is the + computed using the height of the precision values by the recall. + + Args: + name: metric name + curve: Specifies the name of the curve to be computed, 'ROC' [default] or + 'PR' for the Precision-Recall-curve. + num_thresholds: The number of thresholds to use when discretizing the roc + curve. + + "NOTE: only implement the ROC curve type via Python now." + """ + + def __init__(self, name, curve='ROC', num_thresholds=200): + super(MetricBase, self).__init__(name, curve, num_thresholds) + self._curve = curve + self._num_thresholds = num_thresholds + self._epsilon = 1e-6 + self.tp_list = np.ndarray((num_thresholds, )) + self.fn_list = np.ndarray((num_thresholds, )) + self.tn_list = np.ndarray((num_thresholds, )) + self.fp_list = np.ndarray((num_thresholds, )) + + def update(self, labels, predictions, axis=1): + if not _is_numpy_(labels): + raise ValueError("The 'labels' must be a numpy ndarray.") + if not _is_numpy_(predictions): + raise ValueError("The 'predictions' must be a numpy ndarray.") + + kepsilon = 1e-7 # to account for floating point imprecisions + thresholds = [(i + 1) * 1.0 / (num_thresholds - 1) + for i in range(num_thresholds - 2)] + thresholds = [0.0 - kepsilon] + thresholds + [1.0 + kepsilon] + + # caculate TP, FN, TN, FP count + for idx_thresh, thresh in enumerate(thresholds): + tp, fn, tn, fp = 0, 0, 0, 0 + for i, lbl in enumerate(labels): + if lbl: + if predictions[i, 0] >= thresh: + tp += 1 + else: + fn += 1 + else: + if predictions[i, 0] >= thresh: + fp += 1 + else: + tn += 1 + tp_list[idx_thresh] += tp + fn_list[idx_thresh] += fn + tn_list[idx_thresh] += tn + fp_list[idx_thresh] += fp + + def eval(self): + epsilon = self._epsilon + num_thresholds = self._num_thresholds + tpr = (tp_list.astype("float32") + epsilon) / ( + tp_list + fn_list + epsilon) + fpr = fp_list.astype("float32") / (fp_list + tn_list + epsilon) + rec = (tp_list.astype("float32") + epsilon) / ( + tp_list + fp_list + epsilon) + + x = fpr[:num_thresholds - 1] - fpr[1:] + y = (tpr[:num_thresholds - 1] + tpr[1:]) / 2.0 + auc_value = np.sum(x * y) + return auc_value From 5ceea265bba7d5612a03a645f366484ef39f8582 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Wed, 11 Apr 2018 18:45:10 +0800 Subject: [PATCH 088/164] Disable unstable unittest --- paddle/fluid/inference/tests/book/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index 6ed77adb9d..86e36f3f65 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -24,7 +24,8 @@ function(inference_test TARGET_NAME) endforeach() endfunction(inference_test) -inference_test(fit_a_line) +# This unittest is buggy! +#inference_test(fit_a_line) inference_test(image_classification ARGS vgg resnet) inference_test(label_semantic_roles) inference_test(recognize_digits ARGS mlp conv) From 9fd76c4f3a4eb4729401d5cae73fc6cb865c0eb3 Mon Sep 17 00:00:00 2001 From: Dang Qingqing Date: Wed, 11 Apr 2018 19:48:51 +0800 Subject: [PATCH 089/164] Improve test_parallel_executor. --- .../fluid/tests/unittests/test_parallel_executor.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_parallel_executor.py b/python/paddle/fluid/tests/unittests/test_parallel_executor.py index 8401716db8..e5c3961c55 100644 --- a/python/paddle/fluid/tests/unittests/test_parallel_executor.py +++ b/python/paddle/fluid/tests/unittests/test_parallel_executor.py @@ -467,7 +467,7 @@ class ParallelExecutorTestingDuringTraining(unittest.TestCase): loss = simple_fc_net(True) test_program = main.clone(for_test=True) - opt = fluid.optimizer.SGD(learning_rate=0.0001) + opt = fluid.optimizer.SGD(learning_rate=0.001) opt.minimize(loss) batch_size = 32 @@ -494,4 +494,8 @@ class ParallelExecutorTestingDuringTraining(unittest.TestCase): train_loss, = train_exe.run([loss.name], feed_dict=feed_dict) train_loss = numpy.array(train_loss) - self.assertTrue(numpy.allclose(train_loss, test_loss)) + self.assertTrue( + numpy.allclose( + train_loss, test_loss, atol=1e-8), + "Train loss: " + str(train_loss) + "\n Test loss:" + + str(test_loss)) From e7684911fd7680a2c5576da0833b7558a4ff9ba0 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Wed, 11 Apr 2018 16:32:31 +0800 Subject: [PATCH 090/164] add gather op handle --- paddle/fluid/framework/details/CMakeLists.txt | 14 +- .../framework/details/broadcast_op_handle.cc | 39 +-- .../framework/details/broadcast_op_handle.h | 1 - .../details/broadcast_op_handle_test.cc | 6 +- .../framework/details/gather_op_handle.cc | 121 ++++++++++ .../framework/details/gather_op_handle.h | 52 ++++ .../details/gather_op_handle_test.cc | 227 ++++++++++++++++++ 7 files changed, 432 insertions(+), 28 deletions(-) create mode 100644 paddle/fluid/framework/details/gather_op_handle.cc create mode 100644 paddle/fluid/framework/details/gather_op_handle.h create mode 100644 paddle/fluid/framework/details/gather_op_handle_test.cc diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index 2a87f02bd5..3644ed9cb7 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -5,22 +5,22 @@ cc_library(fetch_op_handle SRCS fetch_op_handle.cc DEPS op_handle_base scope lod if(WITH_GPU) nv_library(nccl_all_reduce_op_handle SRCS nccl_all_reduce_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory dynload_cuda) - nv_library(broadcast_op_handle SRCS broadcast_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) -endif() -cc_library(computation_op_handle SRCS computation_op_handle.cc DEPS framework_proto scope place operator op_registry) -cc_library(ssa_graph SRCS ssa_graph.cc DEPS var_handle op_handle_base) -cc_library(ssa_graph_builder SRCS ssa_graph_builder.cc DEPS ssa_graph) - -if(WITH_GPU) set(multi_devices_graph_builder_deps nccl_all_reduce_op_handle) else() set(multi_devices_graph_builder_deps) endif() +cc_library(computation_op_handle SRCS computation_op_handle.cc DEPS framework_proto scope place operator op_registry) +cc_library(ssa_graph SRCS ssa_graph.cc DEPS var_handle op_handle_base) +cc_library(ssa_graph_builder SRCS ssa_graph_builder.cc DEPS ssa_graph) cc_library(multi_devices_graph_builder SRCS multi_devices_graph_builder.cc DEPS ssa_graph_builder computation_op_handle scale_loss_grad_op_handle ${multi_devices_graph_builder_deps}) cc_library(ssa_graph_executor SRCS ssa_graph_executor.cc DEPS ssa_graph framework_proto) cc_library(threaded_ssa_graph_executor SRCS threaded_ssa_graph_executor.cc DEPS fetch_op_handle ssa_graph_executor scope simple_threadpool device_context) +cc_library(broadcast_op_handle SRCS broadcast_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) +cc_library(gather_op_handle SRCS gather_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) cc_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory device_context broadcast_op_handle) +cc_test(gather_op_test SRCS gather_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory + device_context gather_op_handle) diff --git a/paddle/fluid/framework/details/broadcast_op_handle.cc b/paddle/fluid/framework/details/broadcast_op_handle.cc index 2c99a347bf..7cd13a50f5 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle.cc @@ -18,7 +18,7 @@ namespace paddle { namespace framework { namespace details { -Tensor *GetTensorFromVar(Variable *in_var) { +static Tensor *GetTensorFromVar(Variable *in_var) { if (in_var->IsType()) { return in_var->GetMutable(); } else if (in_var->IsType()) { @@ -52,29 +52,34 @@ void BroadcastOpHandle::RunImpl() { auto &out_p = out_handle->place_; auto out_scope_idx = out_handle->scope_idx_; - PADDLE_ENFORCE_LT(out_scope_idx, local_scopes_.size(), ""); + PADDLE_ENFORCE_LT(out_scope_idx, local_scopes_.size(), + "%s is not the the local_scopes ", out_handle->name_); auto *s = local_scopes_[out_scope_idx]; auto out_var = s->FindVar(out_handle->name_); - PADDLE_ENFORCE_EQ(out_var->Type(), in_var->Type(), ""); + PADDLE_ENFORCE_EQ( + out_var->Type(), in_var->Type(), + "The type of input and output is not equal. (%s_%d vs %s_%d)", + out_handle->name_, out_handle->scope_idx_, in_var_handle->name_, + in_var_handle->scope_idx_); if (in_var->IsType()) { - auto in_sr = in_var->GetMutable(); - auto out = out_var->GetMutable(); - if (in_sr == out) continue; - out->set_height(in_sr->height()); - out->set_rows(in_sr->rows()); - out->mutable_value()->Resize(in_sr->value().dims()); - out->mutable_value()->mutable_data(out_p, in_sr->value().type()); + auto &in_sr = in_var->Get(); + auto out_sr = out_var->GetMutable(); + if (&in_sr == out_sr) continue; + out_sr->set_height(in_sr.height()); + out_sr->set_rows(in_sr.rows()); + out_sr->mutable_value()->Resize(in_sr.value().dims()); + out_sr->mutable_value()->mutable_data(out_p, in_sr.value().type()); } else if (in_var->IsType()) { - auto in_lod = in_var->GetMutable(); - auto out = out_var->GetMutable(); - if (in_lod == out) continue; - out->set_lod(in_lod->lod()); - out->Resize(in_lod->dims()); - out->mutable_data(out_p, in_lod->type()); + auto in_lod = in_var->Get(); + auto out_lod = out_var->GetMutable(); + if (&in_lod == out_lod) continue; + out_lod->set_lod(in_lod.lod()); + out_lod->Resize(in_lod.dims()); + out_lod->mutable_data(out_p, in_lod.type()); } else { - PADDLE_THROW("Var should be LoDTensor or SelectedRows"); + PADDLE_THROW("Var should be LoDTensor or SelectedRows."); } Tensor *out_tensor = GetTensorFromVar(out_var); diff --git a/paddle/fluid/framework/details/broadcast_op_handle.h b/paddle/fluid/framework/details/broadcast_op_handle.h index 06ec164ce0..74c0a6a098 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.h +++ b/paddle/fluid/framework/details/broadcast_op_handle.h @@ -35,7 +35,6 @@ namespace details { struct BroadcastOpHandle : public OpHandleBase { const std::vector &local_scopes_; const std::vector &places_; - // const platform::ContextMap &ctxs_; BroadcastOpHandle(const std::vector &local_scopes, const std::vector &places); diff --git a/paddle/fluid/framework/details/broadcast_op_handle_test.cc b/paddle/fluid/framework/details/broadcast_op_handle_test.cc index d03115f0be..29cf120c76 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle_test.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle_test.cc @@ -84,7 +84,7 @@ class BroadcastTester : public ::testing::Test { bc_op_handle_->AddOutput(out_var_handle); } } - void BroadcastDestroy() { + void BroadcastOpDestroy() { for (auto in : bc_op_handle_->inputs_) { delete in; } @@ -139,7 +139,7 @@ class BroadcastTester : public ::testing::Test { } } - BroadcastDestroy(); + BroadcastOpDestroy(); } void TestBroadcastSelectedRows() { @@ -188,7 +188,7 @@ class BroadcastTester : public ::testing::Test { } } - BroadcastDestroy(); + BroadcastOpDestroy(); } public: diff --git a/paddle/fluid/framework/details/gather_op_handle.cc b/paddle/fluid/framework/details/gather_op_handle.cc new file mode 100644 index 0000000000..9407868372 --- /dev/null +++ b/paddle/fluid/framework/details/gather_op_handle.cc @@ -0,0 +1,121 @@ +// 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/gather_op_handle.h" + +namespace paddle { +namespace framework { +namespace details { + +static Tensor *GetTensorFromVar(Variable *in_var) { + if (in_var->IsType()) { + return in_var->GetMutable(); + } else if (in_var->IsType()) { + return in_var->GetMutable()->mutable_value(); + } else { + PADDLE_THROW("Var should be LoDTensor or SelectedRows"); + } + return nullptr; +} +GatherOpHandle::GatherOpHandle(const std::vector &local_scopes, + const std::vector &places) + : local_scopes_(local_scopes), places_(places) {} + +void GatherOpHandle::RunImpl() { + PADDLE_ENFORCE_EQ(this->inputs_.size(), places_.size()); + PADDLE_ENFORCE_EQ(this->outputs_.size(), 1); + + // Wait input done, this Wait is asynchronous operation + for (auto *in : inputs_) { + if (inputs_[0]->generated_op_) { + auto &p = static_cast(in)->place_; + in->generated_op_->Wait(dev_ctxes_[p]); + } + } + auto in_0_handle = static_cast(inputs_[0]); + auto pre_in_var = + local_scopes_[in_0_handle->scope_idx_]->FindVar(in_0_handle->name_); + + std::vector out_rows; + std::vector in_tensors; + std::vector in_places; + + // gather the inputs + for (auto *in : inputs_) { + auto in_handle = static_cast(in); + auto in_p = in_handle->place_; + in_places.push_back(in_p); + PADDLE_ENFORCE_LT(in_handle->scope_idx_, local_scopes_.size(), + "%s is not the the local_scopes ", in_handle->name_); + + auto *s = local_scopes_[in_handle->scope_idx_]; + auto in_var = s->FindVar(in_handle->name_); + PADDLE_ENFORCE_EQ(in_var->Type(), pre_in_var->Type(), + "The type of input is not consistent."); + + if (in_var->IsType()) { + auto &pre_in = pre_in_var->Get(); + auto &in_sr = in_var->Get(); + auto in_sr_rows = in_sr.rows(); + out_rows.insert(out_rows.begin(), in_sr_rows.begin(), in_sr_rows.end()); + PADDLE_ENFORCE_EQ(pre_in.height(), in_sr.height(), ""); + PADDLE_ENFORCE_EQ(pre_in.GetCompleteDims(), in_sr.GetCompleteDims(), ""); + } else if (in_var->IsType()) { + auto &pre_in = pre_in_var->Get(); + auto &in_lodtensor = in_var->Get(); + PADDLE_ENFORCE_EQ(in_lodtensor.lod(), pre_in.lod()); + PADDLE_ENFORCE_EQ(in_lodtensor.dims(), pre_in.dims()); + } else { + PADDLE_THROW("Var should be LoDTensor or SelectedRows."); + } + in_tensors.push_back(GetTensorFromVar(in_var)); + pre_in_var = in_var; + } + + // write the output + auto out_handle = static_cast(this->outputs_[0]); + auto &out_place = out_handle->place_; + auto out_scope_idx = out_handle->scope_idx_; + auto out_var = local_scopes_[out_scope_idx]->FindVar(out_handle->name_); + + if (pre_in_var->IsType()) { + auto &pre_in = pre_in_var->Get(); + auto out = out_var->GetMutable(); + out->set_height(pre_in.height()); + out->set_rows(out_rows); + size_t rows = out_rows.size(); + DDim out_dim = pre_in.GetCompleteDims(); + out_dim[0] = static_cast(rows); + out->mutable_value()->Resize(out_dim); + out->mutable_value()->mutable_data(out_place, pre_in.value().type()); + auto out_tensor = out->mutable_value(); + // copy + int s = 0, e = 0; + for (size_t j = 0; j < in_tensors.size(); ++j) { + e += in_tensors[j]->dims()[0]; + auto sub_out = out_tensor->Slice(s, e); + paddle::framework::TensorCopy(*(in_tensors[j]), out_place, + *(dev_ctxes_[in_places[j]]), &sub_out); + s = e; + } + } else if (pre_in_var->IsType()) { + } else { + PADDLE_THROW("Var should be LoDTensor or SelectedRows."); + } +} + +std::string GatherOpHandle::Name() const { return "broadcast"; } +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/gather_op_handle.h b/paddle/fluid/framework/details/gather_op_handle.h new file mode 100644 index 0000000000..48e1db227b --- /dev/null +++ b/paddle/fluid/framework/details/gather_op_handle.h @@ -0,0 +1,52 @@ +// 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/op_handle_base.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/framework/selected_rows.h" +#include "paddle/fluid/platform/device_context.h" + +namespace paddle { +namespace framework { +namespace details { + +/* + * Broadcast the input to all scope. + * + */ +struct GatherOpHandle : public OpHandleBase { + const std::vector &local_scopes_; + const std::vector &places_; + + GatherOpHandle(const std::vector &local_scopes, + const std::vector &places); + + std::string Name() const override; + + bool IsMultiDeviceTransfer() override { return false; }; + + protected: + void RunImpl() override; +}; + +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/gather_op_handle_test.cc b/paddle/fluid/framework/details/gather_op_handle_test.cc new file mode 100644 index 0000000000..a029a2d266 --- /dev/null +++ b/paddle/fluid/framework/details/gather_op_handle_test.cc @@ -0,0 +1,227 @@ +// 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/gather_op_handle.h" +#include "gtest/gtest.h" + +#include "paddle/fluid/platform/device_context.h" + +namespace f = paddle::framework; +namespace p = paddle::platform; + +// test data amount +const f::DDim kDims = {20, 20}; + +class GatherTester : public ::testing::Test { + public: + void InitCtx(bool use_gpu) { + if (use_gpu) { +#ifdef PADDLE_WITH_CUDA + int count = p::GetCUDADeviceCount(); + if (count <= 1) { + LOG(WARNING) << "Cannot test multi-gpu Gather, because the CUDA " + "device count is " + << count; + exit(0); + } + for (int i = 0; i < count; ++i) { + auto p = p::CUDAPlace(i); + gpu_list_.push_back(p); + ctxs_.emplace_back(new p::CUDADeviceContext(p)); + } +#else + PADDLE_THROW("CUDA is not support."); +#endif + } else { + int count = 8; + for (int i = 0; i < count; ++i) { + auto p = p::CPUPlace(); + gpu_list_.push_back(p); + ctxs_.emplace_back(new p::CPUDeviceContext(p)); + } + } + } + + template + void InitGatherOp(int input_scope_idx) { + for (size_t j = 0; j < gpu_list_.size(); ++j) { + local_scope_.push_back(&g_scope_.NewScope()); + auto* out_var = local_scope_[j]->Var("input"); + out_var->GetMutable(); + } + auto* in_var = local_scope_[input_scope_idx]->Var("out"); + in_var->GetMutable(); + + gather_op_handle_ = new f::details::GatherOpHandle(local_scope_, gpu_list_); + + f::details::VarHandle* out_var_handle = new f::details::VarHandle(); + out_var_handle->place_ = gpu_list_[input_scope_idx]; + out_var_handle->name_ = "out"; + out_var_handle->version_ = 2; + out_var_handle->scope_idx_ = input_scope_idx; + out_var_handle->generated_op_ = gather_op_handle_; + gather_op_handle_->AddOutput(out_var_handle); + + for (size_t j = 0; j < gpu_list_.size(); ++j) { + gather_op_handle_->dev_ctxes_[gpu_list_[j]] = ctxs_[j]; + f::details::VarHandle* in_var_handle = new f::details::VarHandle(); + in_var_handle->place_ = gpu_list_[j]; + in_var_handle->name_ = "input"; + in_var_handle->version_ = 1; + in_var_handle->scope_idx_ = j; + in_var_handle->generated_op_ = nullptr; + gather_op_handle_->AddInput(in_var_handle); + } + } + void GatherOpDestroy() { + for (auto in : gather_op_handle_->inputs_) { + delete in; + } + for (auto out : gather_op_handle_->outputs_) { + delete out; + } + delete gather_op_handle_; + for (size_t j = 0; j < ctxs_.size(); ++j) { + delete ctxs_[j]; + } + } + + void WaitAll() { + for (size_t j = 0; j < ctxs_.size(); ++j) { + ctxs_[j]->Wait(); + } + } + + void TestGatherLodTensor() { + // int input_scope_idx = 0; + // InitGatherOp(input_scope_idx); + // + // auto in_var = local_scope_[input_scope_idx]->Var("input"); + // auto in_lod_tensor = in_var->GetMutable(); + // in_lod_tensor->mutable_data(kDims, gpu_list_[input_scope_idx]); + // + // std::vector send_vector(f::product(kDims), input_scope_idx + + // 12); + // for (size_t k = 0; k < send_vector.size(); ++k) { + // send_vector[k] = k; + // } + // f::LoD lod{{0, 10, 20}}; + // paddle::framework::TensorFromVector( + // send_vector, *(ctxs_[input_scope_idx]), in_lod_tensor); + // in_lod_tensor->set_lod(lod); + // + // gather_op_handle_->Run(false); + // + // WaitAll(); + // + // p::CPUPlace cpu_place; + // for (size_t j = 0; j < gpu_list_.size(); ++j) { + // auto out_var = local_scope_[j]->Var("out"); + // auto out_tensor = out_var->Get(); + // PADDLE_ENFORCE_EQ(out_tensor.lod(), lod, "lod is not equal."); + // + // f::Tensor result_tensor; + // f::TensorCopy(out_tensor, cpu_place, *(ctxs_[j]), &result_tensor); + // float* ct = result_tensor.mutable_data(cpu_place); + // + // for (int64_t j = 0; j < f::product(kDims); ++j) { + // ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + // } + // } + // + // GatherOpDestroy(); + } + + void TestGatherSelectedRows() { + int output_scope_idx = 0; + InitGatherOp(output_scope_idx); + + int height = kDims[0] * 2; + std::vector rows{0, 1, 2, 3, 3, 0, 14, 7, 3, 1, + 2, 4, 6, 3, 1, 1, 1, 1, 3, 7}; + std::vector send_vector(f::product(kDims)); + for (size_t k = 0; k < send_vector.size(); ++k) { + send_vector[k] = k; + } + + for (size_t input_scope_idx = 0; input_scope_idx < gpu_list_.size(); + ++input_scope_idx) { + auto in_var = local_scope_[input_scope_idx]->Var("input"); + auto in_selected_rows = in_var->GetMutable(); + auto value = in_selected_rows->mutable_value(); + value->mutable_data(kDims, gpu_list_[input_scope_idx]); + + in_selected_rows->set_height(height); + in_selected_rows->set_rows(rows); + + paddle::framework::TensorFromVector( + send_vector, *(ctxs_[input_scope_idx]), value); + value->Resize(kDims); + } + + gather_op_handle_->Run(false); + + WaitAll(); + + p::CPUPlace cpu_place; + + auto out_var = local_scope_[output_scope_idx]->Var("out"); + auto& out_select_rows = out_var->Get(); + auto rt = out_select_rows.value(); + + PADDLE_ENFORCE_EQ(out_select_rows.height(), height, "height is not equal."); + for (size_t k = 0; k < out_select_rows.rows().size(); ++k) { + PADDLE_ENFORCE_EQ(out_select_rows.rows()[k], rows[k % rows.size()]); + } + + f::Tensor result_tensor; + f::TensorCopy(rt, cpu_place, *(ctxs_[output_scope_idx]), &result_tensor); + float* ct = result_tensor.data(); + + for (int64_t j = 0; j < f::product(kDims); ++j) { + ASSERT_NEAR(ct[j], send_vector[j % send_vector.size()], 1e-5); + } + + GatherOpDestroy(); + } + + public: + f::Scope g_scope_; + std::vector ctxs_; + std::vector local_scope_; + std::vector gpu_list_; + f::details::GatherOpHandle* gather_op_handle_; +}; + +// TEST_F(GatherTester, TestCPUGatherTestLodTensor) { +// InitCtx(false); +// TestGatherLodTensor(); +//} + +TEST_F(GatherTester, TestCPUGatherTestSelectedRows) { + InitCtx(false); + TestGatherSelectedRows(); +} + +#ifdef PADDLE_WITH_CUDA +// TEST_F(GatherTester, TestGPUGatherTestLodTensor) { +// InitCtx(true); +// TestGatherLodTensor(); +//} + +TEST_F(GatherTester, TestGPUGatherTestSelectedRows) { + InitCtx(true); + TestGatherSelectedRows(); +} +#endif From 8d3ce01f363051f56ef1ce89197f8e47e814876a Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Wed, 11 Apr 2018 11:31:06 -0700 Subject: [PATCH 091/164] Fix cpplint errors for a set of operators (#9837) * Fix cpplint errors, round2 * Fix pointer issue --- paddle/fluid/operators/ctc_align_op.cu | 1 + paddle/fluid/operators/ctc_align_op.h | 1 + paddle/fluid/operators/elementwise_op.h | 13 +++++++------ paddle/fluid/operators/gru_op.cc | 1 + paddle/fluid/operators/gru_op.h | 7 +++---- paddle/fluid/operators/im2sequence_op.cc | 1 + paddle/fluid/operators/im2sequence_op.h | 2 +- paddle/fluid/operators/label_smooth_op.cc | 1 + paddle/fluid/operators/linear_chain_crf_op.h | 2 +- paddle/fluid/operators/logical_op.cc | 1 + paddle/fluid/operators/lrn_op.cc | 1 + paddle/fluid/operators/lstm_op.cc | 1 + paddle/fluid/operators/lstm_op.h | 1 + paddle/fluid/operators/lstm_unit_op.cu | 1 + paddle/fluid/operators/lstmp_op.cc | 1 + paddle/fluid/operators/lstmp_op.h | 1 + paddle/fluid/operators/matmul_op.cc | 2 ++ paddle/fluid/operators/matmul_op.h | 4 +++- paddle/fluid/operators/maxout_op.cc | 2 ++ paddle/fluid/operators/minus_op.cc | 2 ++ paddle/fluid/operators/momentum_op.cu | 1 + paddle/fluid/operators/mul_op.cc | 1 + 22 files changed, 35 insertions(+), 13 deletions(-) diff --git a/paddle/fluid/operators/ctc_align_op.cu b/paddle/fluid/operators/ctc_align_op.cu index 54e0b1d9ad..bbad74e96d 100644 --- a/paddle/fluid/operators/ctc_align_op.cu +++ b/paddle/fluid/operators/ctc_align_op.cu @@ -15,6 +15,7 @@ limitations under the License. */ #include #include #include +#include #include "paddle/fluid/operators/ctc_align_op.h" namespace paddle { diff --git a/paddle/fluid/operators/ctc_align_op.h b/paddle/fluid/operators/ctc_align_op.h index 70698d9958..9c5c6f5aa0 100644 --- a/paddle/fluid/operators/ctc_align_op.h +++ b/paddle/fluid/operators/ctc_align_op.h @@ -15,6 +15,7 @@ limitations under the License. */ #pragma once #include +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/elementwise_op.h b/paddle/fluid/operators/elementwise_op.h index f04d8d8fd8..a33634ab25 100644 --- a/paddle/fluid/operators/elementwise_op.h +++ b/paddle/fluid/operators/elementwise_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/framework/operator.h" @@ -106,18 +107,18 @@ information. However, the output only shares the LoD information with input $X$. protected: std::string comment_; - void Replace(std::string& src, std::string from, std::string to) { + void Replace(std::string* src, std::string from, std::string to) { std::size_t len_from = std::strlen(from.c_str()); std::size_t len_to = std::strlen(to.c_str()); - for (std::size_t pos = src.find(from); pos != std::string::npos; - pos = src.find(from, pos + len_to)) { - src.replace(pos, len_from, to); + for (std::size_t pos = src->find(from); pos != std::string::npos; + pos = src->find(from, pos + len_to)) { + src->replace(pos, len_from, to); } } void SetComment(std::string name, std::string equation) { - Replace(comment_, "{name}", name); - Replace(comment_, "{equation}", equation); + Replace(&comment_, "{name}", name); + Replace(&comment_, "{equation}", equation); } }; diff --git a/paddle/fluid/operators/gru_op.cc b/paddle/fluid/operators/gru_op.cc index 2a91dcbcd4..2490b83b8c 100644 --- a/paddle/fluid/operators/gru_op.cc +++ b/paddle/fluid/operators/gru_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/gru_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/gru_op.h b/paddle/fluid/operators/gru_op.h index 0886bebc41..1d5c291495 100644 --- a/paddle/fluid/operators/gru_op.h +++ b/paddle/fluid/operators/gru_op.h @@ -13,15 +13,14 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once - +#include +#include "paddle/fluid/framework/eigen.h" +#include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/detail/activation_functions.h" #include "paddle/fluid/operators/math/gru_compute.h" #include "paddle/fluid/operators/math/math_function.h" #include "paddle/fluid/operators/math/sequence2batch.h" -#include "paddle/fluid/framework/eigen.h" -#include "paddle/fluid/framework/op_registry.h" - namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/im2sequence_op.cc b/paddle/fluid/operators/im2sequence_op.cc index 048391549d..5b387d8d34 100644 --- a/paddle/fluid/operators/im2sequence_op.cc +++ b/paddle/fluid/operators/im2sequence_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/im2sequence_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/im2sequence_op.h b/paddle/fluid/operators/im2sequence_op.h index a6a83fefbc..d792c68f78 100644 --- a/paddle/fluid/operators/im2sequence_op.h +++ b/paddle/fluid/operators/im2sequence_op.h @@ -13,7 +13,7 @@ limitations under the License. */ #pragma once - +#include #include "paddle/fluid/framework/data_layout.h" #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" diff --git a/paddle/fluid/operators/label_smooth_op.cc b/paddle/fluid/operators/label_smooth_op.cc index eef25f8a06..c2a8c7f867 100644 --- a/paddle/fluid/operators/label_smooth_op.cc +++ b/paddle/fluid/operators/label_smooth_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/label_smooth_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/linear_chain_crf_op.h b/paddle/fluid/operators/linear_chain_crf_op.h index 800a1303e1..d5162bcd74 100644 --- a/paddle/fluid/operators/linear_chain_crf_op.h +++ b/paddle/fluid/operators/linear_chain_crf_op.h @@ -100,7 +100,7 @@ class LinearChainCRFOpKernel : public framework::OpKernel { auto x_row_max = EigenMatrix::From(emission_row_max); x_row_max.device(place) = x.maximum(Eigen::DSizes(1)) - .reshape(Eigen::DSizes(int(batch_size), 1)); + .reshape(Eigen::DSizes(static_cast(batch_size), 1)); auto x_exps = EigenMatrix::From(*emission_exps); x_exps.device(place) = diff --git a/paddle/fluid/operators/logical_op.cc b/paddle/fluid/operators/logical_op.cc index 6a7db31cf3..41aa00ee8a 100644 --- a/paddle/fluid/operators/logical_op.cc +++ b/paddle/fluid/operators/logical_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/logical_op.h" +#include #include "paddle/fluid/framework/op_registry.h" namespace paddle { diff --git a/paddle/fluid/operators/lrn_op.cc b/paddle/fluid/operators/lrn_op.cc index cb15683981..553a06c3dc 100644 --- a/paddle/fluid/operators/lrn_op.cc +++ b/paddle/fluid/operators/lrn_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/lrn_op.h" +#include #ifdef PADDLE_WITH_MKLDNN #include "paddle/fluid/platform/mkldnn_helper.h" #endif diff --git a/paddle/fluid/operators/lstm_op.cc b/paddle/fluid/operators/lstm_op.cc index d75537741e..e062d62c66 100644 --- a/paddle/fluid/operators/lstm_op.cc +++ b/paddle/fluid/operators/lstm_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/lstm_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/lstm_op.h b/paddle/fluid/operators/lstm_op.h index 11f9f223b5..a1ef0eb278 100644 --- a/paddle/fluid/operators/lstm_op.h +++ b/paddle/fluid/operators/lstm_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/detail/activation_functions.h" #include "paddle/fluid/operators/math/lstm_compute.h" diff --git a/paddle/fluid/operators/lstm_unit_op.cu b/paddle/fluid/operators/lstm_unit_op.cu index 76245a1b5a..acf094238f 100644 --- a/paddle/fluid/operators/lstm_unit_op.cu +++ b/paddle/fluid/operators/lstm_unit_op.cu @@ -18,6 +18,7 @@ https://github.com/caffe2/caffe2/blob/master/caffe2/operators/lstm_unit_op_gpu.c #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/cross_entropy_op.h" +#include "paddle/fluid/operators/lstm_unit_op.h" #include "paddle/fluid/platform/assert.h" #include "paddle/fluid/platform/hostdevice.h" diff --git a/paddle/fluid/operators/lstmp_op.cc b/paddle/fluid/operators/lstmp_op.cc index a881ef82ec..82541517e1 100644 --- a/paddle/fluid/operators/lstmp_op.cc +++ b/paddle/fluid/operators/lstmp_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/lstmp_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/lstmp_op.h b/paddle/fluid/operators/lstmp_op.h index dfa7f74d51..172db54896 100644 --- a/paddle/fluid/operators/lstmp_op.h +++ b/paddle/fluid/operators/lstmp_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/operators/activation_op.h" #include "paddle/fluid/operators/math/detail/activation_functions.h" #include "paddle/fluid/operators/math/lstm_compute.h" diff --git a/paddle/fluid/operators/matmul_op.cc b/paddle/fluid/operators/matmul_op.cc index 8585592852..1f52558873 100644 --- a/paddle/fluid/operators/matmul_op.cc +++ b/paddle/fluid/operators/matmul_op.cc @@ -13,6 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/matmul_op.h" +#include +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/matmul_op.h b/paddle/fluid/operators/matmul_op.h index 1cd8fe55dc..f2e9cfdcdb 100644 --- a/paddle/fluid/operators/matmul_op.h +++ b/paddle/fluid/operators/matmul_op.h @@ -13,7 +13,9 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once - +#include +#include +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" #include "paddle/fluid/operators/math/matmul.h" diff --git a/paddle/fluid/operators/maxout_op.cc b/paddle/fluid/operators/maxout_op.cc index efaae7d5f2..4e28d98834 100644 --- a/paddle/fluid/operators/maxout_op.cc +++ b/paddle/fluid/operators/maxout_op.cc @@ -13,6 +13,8 @@ * limitations under the License. */ #include "paddle/fluid/operators/maxout_op.h" +#include + namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/minus_op.cc b/paddle/fluid/operators/minus_op.cc index 7de9d94979..5790deb54d 100644 --- a/paddle/fluid/operators/minus_op.cc +++ b/paddle/fluid/operators/minus_op.cc @@ -13,6 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/minus_op.h" +#include +#include #include "paddle/fluid/operators/net_op.h" namespace paddle { diff --git a/paddle/fluid/operators/momentum_op.cu b/paddle/fluid/operators/momentum_op.cu index da4a6af298..5eb9d99502 100644 --- a/paddle/fluid/operators/momentum_op.cu +++ b/paddle/fluid/operators/momentum_op.cu @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/operators/momentum_op.h" namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/mul_op.cc b/paddle/fluid/operators/mul_op.cc index 90af1e2d60..5038287527 100644 --- a/paddle/fluid/operators/mul_op.cc +++ b/paddle/fluid/operators/mul_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/mul_op.h" +#include namespace paddle { namespace operators { From b26f5050020ea14fca6c1c2c759aa269c6331177 Mon Sep 17 00:00:00 2001 From: "Yang Yang(Tony)" Date: Wed, 11 Apr 2018 14:04:30 -0700 Subject: [PATCH 092/164] remove net op and cond_op (#9663) * remove net op and cond_op * fix cpplint * fix dependency * delete backward_test; fix compile * disable batch_norm backward * rm test_net.py * make batchnorm test independent of backward.cc * make test_layer_norm_op independent of backward.cc * make test_layer_norm_op independent of backward.cc * delete unused code * clean up --- paddle/fluid/framework/CMakeLists.txt | 3 +- paddle/fluid/framework/backward.cc | 119 +-- paddle/fluid/framework/backward_test.cc | 918 ------------------ paddle/fluid/framework/prune_test.cc | 7 +- paddle/fluid/operators/CMakeLists.txt | 4 +- paddle/fluid/operators/cond_op.cc | 235 ----- paddle/fluid/operators/cond_op.h | 96 -- paddle/fluid/operators/minus_op.cc | 2 +- paddle/fluid/operators/net_op.cc | 103 -- paddle/fluid/operators/net_op.h | 130 --- paddle/fluid/operators/net_op_test.cc | 103 -- paddle/fluid/operators/prelu_op.cc | 3 +- paddle/fluid/operators/scale_op.cc | 3 +- paddle/fluid/operators/split_op.cc | 1 - paddle/fluid/pybind/pybind.cc | 49 +- paddle/fluid/recordio/chunk.cc | 4 +- paddle/fluid/recordio/header.cc | 3 + .../tests/unittests/test_batch_norm_op.py | 361 +++---- .../fluid/tests/unittests/test_cond_op.py | 128 --- .../tests/unittests/test_layer_norm_op.py | 231 ++--- .../paddle/fluid/tests/unittests/test_net.py | 53 - 21 files changed, 205 insertions(+), 2351 deletions(-) delete mode 100644 paddle/fluid/framework/backward_test.cc delete mode 100644 paddle/fluid/operators/cond_op.cc delete mode 100644 paddle/fluid/operators/cond_op.h delete mode 100644 paddle/fluid/operators/net_op.cc delete mode 100644 paddle/fluid/operators/net_op.h delete mode 100644 paddle/fluid/operators/net_op_test.cc delete mode 100644 python/paddle/fluid/tests/unittests/test_cond_op.py delete mode 100644 python/paddle/fluid/tests/unittests/test_net.py diff --git a/paddle/fluid/framework/CMakeLists.txt b/paddle/fluid/framework/CMakeLists.txt index 3840bbe83b..77f459b4dd 100644 --- a/paddle/fluid/framework/CMakeLists.txt +++ b/paddle/fluid/framework/CMakeLists.txt @@ -79,8 +79,7 @@ add_custom_command(TARGET framework_py_proto POST_BUILD COMMENT "Copy generated python proto into directory paddle/fluid/proto." WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -cc_library(backward SRCS backward.cc DEPS net_op) -cc_test(backward_test SRCS backward_test.cc DEPS backward recurrent_op device_context fill_constant_op) +cc_library(backward SRCS backward.cc DEPS operator) cc_library(lod_rank_table SRCS lod_rank_table.cc DEPS lod_tensor) cc_library(feed_fetch_method SRCS feed_fetch_method.cc DEPS lod_tensor scope glog) diff --git a/paddle/fluid/framework/backward.cc b/paddle/fluid/framework/backward.cc index 1314af2b3d..76133b5136 100644 --- a/paddle/fluid/framework/backward.cc +++ b/paddle/fluid/framework/backward.cc @@ -13,7 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/framework/backward.h" -#include "paddle/fluid/operators/net_op.h" #include #include @@ -22,7 +21,6 @@ limitations under the License. */ #include "paddle/fluid/framework/block_desc.h" #include "paddle/fluid/framework/op_registry.h" -#include "paddle/fluid/operators/net_op.h" namespace paddle { namespace framework { @@ -60,12 +58,7 @@ static inline std::unique_ptr CreateGradOp( if (grad_ops.size() == 1) { return std::move(grad_ops[0]); } else { - auto net_op = new operators::NetOp(); - for (auto& grad_op : grad_ops) { - net_op->AppendOp(std::move(grad_op)); - } - net_op->CompleteAddOp(); - return std::unique_ptr(net_op); + PADDLE_THROW("Unexpected Branch"); } } @@ -91,10 +84,7 @@ static bool AllInSet( } static std::unique_ptr NOP() { - auto net_op = new operators::NetOp(); - net_op->SetType("@NOP@"); - net_op->CompleteAddOp(); - return std::unique_ptr(net_op); + PADDLE_THROW("Unexpected Branch"); } // Get backward operator from a forward operator, a recursive implementation. @@ -136,110 +126,7 @@ static std::unique_ptr BackwardRecursive( } // Returned gradient network - auto net = std::unique_ptr(new operators::NetOp()); - - if (forwardOp.IsNetOp()) { - // Because forwardOp is a net op, it can static_cast. - auto& forwardNet = static_cast(forwardOp); - - // Map from output gradient variable name to operator's indices in - // backward net's ops_. That operator generates that variable. - std::unordered_map> dup_output_ops; - - size_t local_op_id = 0; - // reversely travel forwardNet and collect all duplicate outputs. - for (auto it = forwardNet.ops_.rbegin(); it != forwardNet.ops_.rend(); - ++it, ++local_op_id) { - auto& fwd = *it; - auto bwd = BackwardRecursive(*fwd, no_grad_names, grad_to_var, uniq_id); - ForEachVarName(bwd->Outputs(), - [&dup_output_ops, local_op_id](const std::string& out) { - dup_output_ops[out].emplace_back(local_op_id); - return false; - }); - net->AppendOp(std::move(bwd)); - } - // Get unique ID for this method. - auto uid = uniq_id++; - // TODO(dzh): more comment - // multiple operators which have the same output (y for example) may - // overwrite the same y variable when backward, special operations are token - // to handle this case. For each duplicate output, rename it to an alias - // (original name with a offset), append an `add` op for its operator, - // and finally sum all the alias variable to the final output variable y. - using Pos = std::pair>; - std::list insert_position; - for (auto& dup_output_op : dup_output_ops) { - const std::string& name = dup_output_op.first; - // duplicate @Empty@ don't need to be added - if (name == kEmptyVarName) continue; - - auto& dup_op = dup_output_op.second; - // no duplicate output - if (dup_op.size() == 1) continue; - - // process the duplicate outputs - std::vector dup_outputs; - for (size_t i = 0; i < dup_op.size(); ++i) { - // rename each duplicate output to an alias - auto op_offset = dup_op[i]; - dup_outputs.push_back(name + "@RENAME@" + std::to_string(uid) + "@" + - std::to_string(i)); - net->ops_[op_offset]->Rename(name, dup_outputs.back()); - } - // collect all the offset for each alias, - // insert a sum operator to add all aliases to output - insert_position.push_back( - {dup_op.back(), - OpRegistry::CreateOp("sum", {{"X", dup_outputs}}, {{"Out", {name}}}, - AttributeMap{})}); - } - - // make sure the inserted `sum` ops follow the BFS order. - insert_position.sort( - [](const Pos& l, const Pos& r) { return l.first > r.first; }); - - for (auto& pos : insert_position) { - net->InsertOp(pos.first + 1, std::move(pos.second)); - } - } else { - std::unique_ptr grad_op( - CreateGradOp(forwardOp, no_grad_names, grad_to_var)); - - ForEachVarName(grad_op->Inputs(), [&no_grad_names, &net, &grad_op]( - const std::string& grad_input) { - if (no_grad_names.count(grad_input)) { - // +1 for \0 - std::string prefix = grad_input.substr( - 0, grad_input.size() - sizeof(kGradVarSuffix) / sizeof(char) + 1); - grad_op->Rename(grad_input, prefix + kZeroVarSuffix); - - // If part of input gradient of that operator is not calculated, fill - // zero variables to that input gradient. - net->AppendOp(OpRegistry::CreateOp("fill_zeros_like", {{"X", {prefix}}}, - {{"Out", {grad_input}}}, - AttributeMap{})); - } - return false; - }); - - ForEachVarName(grad_op->Outputs(), - [&no_grad_names, &grad_op](const std::string& grad_output) { - if (no_grad_names.count(grad_output)) { - grad_op->Rename(grad_output, kEmptyVarName); - } - return false; - }); - - if (net->ops_.empty()) { // Current no aux op is added to network - return grad_op; - } - net->AppendOp(std::move(grad_op)); - } - net->SetType("@GENERATED_BACKWARD@"); - net->CompleteAddOp(); - return std::unique_ptr( - static_cast(net.release())); + PADDLE_THROW("Unexpected Branch"); } // See header for comments diff --git a/paddle/fluid/framework/backward_test.cc b/paddle/fluid/framework/backward_test.cc deleted file mode 100644 index cc1f871360..0000000000 --- a/paddle/fluid/framework/backward_test.cc +++ /dev/null @@ -1,918 +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. - -#include "paddle/fluid/framework/backward.h" - -#include -#include "paddle/fluid/framework/block_desc.h" -#include "paddle/fluid/framework/op_desc.h" -#include "paddle/fluid/framework/op_registry.h" -#include "paddle/fluid/framework/var_desc.h" -#include "paddle/fluid/operators/net_op.h" - -USE_NO_KERNEL_OP(fill_constant); - -namespace paddle { -namespace framework { - -using DeviceContext = platform::DeviceContext; - -class NoneOp : public framework::OperatorWithKernel { - public: - using framework::OperatorWithKernel::OperatorWithKernel; - - protected: - void InferShape(framework::InferShapeContext *ctx) const override {} -}; - -template -class NoneKernel : public framework::OpKernel { - public: - void Compute(const framework::ExecutionContext &context) const override {} -}; - -class RowWiseAddOpMaker : public OpProtoAndCheckerMaker { - public: - RowWiseAddOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "Input X of Add"); - AddInput("b", "Bias of Add"); - AddOutput("Out", "Out of Add"); - AddComment("Add Op"); - } -}; - -class RowWiseAddGradMaker : public SingleGradOpDescMaker { - public: - using SingleGradOpDescMaker::SingleGradOpDescMaker; - - protected: - std::unique_ptr Apply() const override { - auto grad_op = new OpDesc(); - grad_op->SetInput(GradVarName("Out"), OutputGrad("Out")); - grad_op->SetOutput(GradVarName("X"), InputGrad("X")); - grad_op->SetOutput(GradVarName("b"), InputGrad("b")); - grad_op->SetType("rowwise_add_grad"); - return std::unique_ptr(grad_op); - } -}; - -class MulOpMaker : public OpProtoAndCheckerMaker { - public: - MulOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "A"); - AddInput("Y", "B"); - AddOutput("Out", "Out"); - AddAttr("x_num_col_dims", "").SetDefault(1).EqualGreaterThan(1); - AddAttr("y_num_col_dims", "").SetDefault(1).EqualGreaterThan(1); - AddComment("Mul"); - } -}; - -class SigmoidOpMaker : public OpProtoAndCheckerMaker { - public: - SigmoidOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "X"); - AddOutput("Out", "Y"); - AddComment("Sigmoid"); - } -}; - -class NoGradOpMaker : public OpProtoAndCheckerMaker { - public: - NoGradOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "X input"); - AddOutput("Out", "Y output"); - AddComment("NoGradOp, same input output. no Grad"); - } -}; - -class FcOp : public operators::NetOp { - public: - FcOp(const std::string &type, const VariableNameMap &inputs, - const VariableNameMap &outputs, const AttributeMap &attrs) - : NetOp(type, inputs, outputs, attrs) { - AppendOp(OpRegistry::CreateOp( - "mul", {{"X", {Input("X")}}, {"Y", {Input("W")}}}, - {{"Out", {Output("mul_result")}}}, AttributeMap{})); - auto input_b = Inputs("b"); - std::string before_act = "mul_result"; - if (input_b.size() != 0) { - AppendOp(OpRegistry::CreateOp( - "rowwise_add", {{"X", {Output("mul_result")}}, {"b", {input_b[0]}}}, - {{"Out", {Output("add_result")}}}, AttributeMap{})); - before_act = "add_result"; - } else { - auto out_varname = Output("add_result"); - if (out_varname != kEmptyVarName) { - this->Rename(out_varname, kEmptyVarName); - } - } - - AppendOp(OpRegistry::CreateOp("sigmoid", {{"X", {Output(before_act)}}}, - {{"Out", {Output("Out")}}}, AttributeMap{})); - CompleteAddOp(false); - } -}; - -class FcOpMaker : public OpProtoAndCheckerMaker { - public: - FcOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "x"); - AddInput("W", "w"); - AddInput("b", "b"); - AddOutput("mul_result", "").AsIntermediate(); - AddOutput("add_result", "").AsIntermediate(); - AddOutput("Out", ""); - AddComment(""); - } -}; - -class ManyOutputOpMaker : public OpProtoAndCheckerMaker { - public: - ManyOutputOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("x", "x"); - AddOutput("y", "y"); - AddOutput("z", "z"); - AddComment(""); - } -}; - -class FillZeroOpMaker : public OpProtoAndCheckerMaker { - public: - FillZeroOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "x"); - AddOutput("Out", "out"); - AddComment(""); - } -}; - -class SumOpMaker : public framework::OpProtoAndCheckerMaker { - public: - SumOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "the input tensors of sum operator.").AsDuplicable(); - AddOutput("Out", "the output tensor of sum operator."); - AddComment(""); - } -}; - -class MultInOutOpMaker : public OpProtoAndCheckerMaker { - public: - MultInOutOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", "x"); - AddInput("H", "h"); - AddOutput("Y", "y"); - AddOutput("Z", "z"); - AddComment(""); - } -}; - -class MinusGradOpDescMaker : public GradOpDescMakerBase { - public: - using GradOpDescMakerBase::GradOpDescMakerBase; - - std::vector> operator()() const override { - std::vector> retv; - auto x_g = InputGrad("X"); - if (!x_g.empty()) { - auto *op_desc = new OpDesc(); - op_desc->SetType("scale"); - op_desc->SetInput("X", OutputGrad("Out")); - op_desc->SetOutput("Out", x_g); - op_desc->SetAttr("scale", 1.0f); - retv.emplace_back(op_desc); - } - - auto y_g = InputGrad("Y"); - if (!y_g.empty()) { - auto *op_desc = new OpDesc(); - op_desc->SetType("scale"); - op_desc->SetInput("X", OutputGrad("Out")); - op_desc->SetOutput("Out", y_g); - op_desc->SetAttr("scale", -1.0f); - retv.emplace_back(op_desc); - } - return retv; - } -}; - -class MinusOpMaker : public OpProtoAndCheckerMaker { - public: - MinusOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("X", ""); - AddInput("Y", ""); - AddOutput("Out", ""); - AddComment("minus for unittest"); - } -}; -} // namespace framework -} // namespace paddle - -namespace f = paddle::framework; -namespace ops = paddle::operators; -using EnforceNotMet = paddle::platform::EnforceNotMet; -// rowwise_add -REGISTER_OPERATOR(rowwise_add, f::NoneOp, f::RowWiseAddOpMaker, - f::RowWiseAddGradMaker); -REGISTER_OP_CPU_KERNEL(rowwise_add, - f::NoneKernel); -REGISTER_OPERATOR(rowwise_add_grad, f::NoneOp); -REGISTER_OP_CPU_KERNEL(rowwise_add_grad, - f::NoneKernel); -// mul -REGISTER_OP(mul, f::NoneOp, f::MulOpMaker, mul_grad, f::NoneOp); -REGISTER_OP_CPU_KERNEL(mul, f::NoneKernel); -REGISTER_OP_CPU_KERNEL(mul_grad, - f::NoneKernel); -// sigmoid -REGISTER_OP(sigmoid, f::NoneOp, f::SigmoidOpMaker, sigmoid_grad, f::NoneOp); -REGISTER_OP_CPU_KERNEL(sigmoid, - f::NoneKernel); -REGISTER_OP_WITHOUT_GRADIENT(nograd, f::NoneOp, f::NoGradOpMaker); -// fill_zeros_like -REGISTER_OP_WITHOUT_GRADIENT(fill_zeros_like, f::NoneOp, f::FillZeroOpMaker); -REGISTER_OP_CPU_KERNEL(fill_zeros_like, - f::NoneKernel); -// sum -REGISTER_OP(sum, f::NoneOp, f::SumOpMaker, sum_grad, f::NoneOp); -REGISTER_OP_CPU_KERNEL(sum, f::NoneKernel); -REGISTER_OP_CPU_KERNEL(sum_grad, - f::NoneKernel); -// fc -REGISTER_OP_WITHOUT_GRADIENT(fc, f::FcOp, f::FcOpMaker); -// many_output_op -REGISTER_OP(many_output_op, f::NoneOp, f::ManyOutputOpMaker, - many_output_op_grad, f::NoneOp); -// mult_in_out -REGISTER_OP(mult_in_out, f::NoneOp, f::MultInOutOpMaker, mult_in_out_grad, - f::NoneOp); -REGISTER_OP_CPU_KERNEL(mult_in_out, - f::NoneKernel); -REGISTER_OP_CPU_KERNEL(mult_in_out_grad, - f::NoneKernel); -// minus -REGISTER_OPERATOR(minus, f::NoneOp, f::MinusOpMaker, f::MinusGradOpDescMaker); -REGISTER_OP_CPU_KERNEL(minus, f::NoneKernel); -// scale -REGISTER_OPERATOR(scale, f::NoneOp); -REGISTER_OP_CPU_KERNEL(scale, f::NoneKernel); - -TEST(Backward, simple_op_not_need_grad) { - auto fwd = - f::OpRegistry::CreateOp("rowwise_add", {{"X", {"x"}}, {"b", {"b"}}}, - {{"Out", {"out"}}}, f::AttributeMap{}); - ASSERT_NE(fwd, nullptr); - auto gop = f::Backward(*fwd, {"x"}); - ASSERT_EQ(gop->Output(f::GradVarName("X")), f::kEmptyVarName); - - auto no_input_gop = f::Backward(*fwd, {"x", "b"}); - ASSERT_NE(no_input_gop, nullptr); - ASSERT_TRUE(no_input_gop->IsNetOp()); - ASSERT_EQ(0UL, static_cast(no_input_gop.get())->ops_.size()); -} - -TEST(Backward, net_fc_backward_normal) { - std::shared_ptr fwd = - f::OpRegistry::CreateOp("fc", {{"X", {"x"}}, {"W", {"w"}}, {"b", {"b"}}}, - {{"mul_result", {"mul_res"}}, - {"add_result", {"add_re"}}, - {"Out", {"out"}}}, - f::AttributeMap{}); - ASSERT_NE(fwd, nullptr); - std::shared_ptr gop = - f::Backward(*fwd, std::unordered_set{}); - ASSERT_TRUE(gop->IsNetOp()); - auto net = static_cast(gop.get()); - - ASSERT_NO_THROW(net->DebugString()); - - ASSERT_EQ(3UL, net->ops_.size()); - - f::OperatorBase &d_sigmoid = *net->ops_[0]; - ASSERT_EQ("sigmoid_grad", d_sigmoid.Type()); - - f::OperatorBase &d_add = *net->ops_[1]; - ASSERT_EQ("rowwise_add_grad", d_add.Type()); - - f::OperatorBase &d_mul = *net->ops_[2]; - ASSERT_EQ("mul_grad", d_mul.Type()); -} - -TEST(Backward, net_fc_backward_not_have_b) { - std::shared_ptr fwd = - f::OpRegistry::CreateOp("fc", {{"X", {"x"}}, {"W", {"w"}}, {"b", {}}}, - {{"mul_result", {"mul_res"}}, - {"add_result", {"add_res"}}, - {"Out", {"tmp"}}}, - f::AttributeMap{}); - ASSERT_NE(fwd, nullptr); - std::shared_ptr gop = - f::Backward(*fwd, std::unordered_set{}); - ASSERT_TRUE(gop->IsNetOp()); - auto net = static_cast(gop.get()); - - ASSERT_NO_THROW(net->DebugString()); - - ASSERT_EQ(2UL, net->ops_.size()); - - f::OperatorBase &d_sigmoid = *net->ops_[0]; - ASSERT_EQ("sigmoid_grad", d_sigmoid.Type()); - - f::OperatorBase &d_mul = *net->ops_[1]; - ASSERT_EQ("mul_grad", d_mul.Type()); -} - -TEST(Backward, net_input_of_network_not_need_grad) { - ops::NetOp net; - net.AppendOp(f::OpRegistry::CreateOp( - "fc", {{"X", {"x"}}, {"W", {"W1"}}, {"b", {"b1"}}}, - {{"mul_result", {"mul_tmp_0"}}, - {"add_result", {"add_tmp_0"}}, - {"Out", {"hidden0"}}}, - f::AttributeMap{})); - net.AppendOp(f::OpRegistry::CreateOp( - "fc", {{"X", {"hidden0"}}, {"W", {"W2"}}, {"b", {"b2"}}}, - {{"mul_result", {"mul_tmp_1"}}, - {"add_result", {"add_tmp_1"}}, - {"Out", {"hidden1"}}}, - f::AttributeMap{})); - net.CompleteAddOp(); - auto bwd = Backward(net, {"x"}); // x@GRAD is not need. - ASSERT_TRUE(bwd->IsNetOp()); - auto bwd_net = static_cast(bwd.get()); - - auto output_vars = bwd_net->OutputVars(true); - std::unordered_set all_outputs = - std::unordered_set(output_vars.begin(), output_vars.end()); - all_outputs.erase(f::kEmptyVarName); - - for (auto &out : {"W1", "b1", "hidden0", "W2", "b2"}) { - ASSERT_NE(all_outputs.find(f::GradVarName(out)), all_outputs.end()); - } - - // Not Generated X - ASSERT_EQ(all_outputs.find(f::GradVarName("X")), all_outputs.end()); - - ASSERT_EQ(2UL, bwd_net->ops_.size()); - ASSERT_TRUE(bwd_net->ops_[1]->IsNetOp()); - auto first_fc_grad = static_cast(bwd_net->ops_[1].get()); - ASSERT_EQ(3UL, first_fc_grad->ops_.size()); - ASSERT_EQ(f::kEmptyVarName, - first_fc_grad->ops_[2]->Output(f::GradVarName("X"))); -} - -TEST(Backward, net_shared_weight) { - ops::NetOp net; - net.AppendOp(f::OpRegistry::CreateOp("mul", {{"X", {"x"}}, {"Y", {"w"}}}, - {{"Out", {"out"}}}, f::AttributeMap{})); - net.AppendOp(f::OpRegistry::CreateOp("mul", {{"X", {"out"}}, {"Y", {"w"}}}, - {{"Out", {"FinalOut"}}}, - f::AttributeMap{})); - net.CompleteAddOp(); - - auto bwd = f::Backward(net, std::unordered_set{}); - ASSERT_TRUE(bwd->IsNetOp()); - auto bwd_net = static_cast(bwd.get()); - ASSERT_EQ(3UL, bwd_net->ops_.size()); - ASSERT_EQ("sum", bwd_net->ops_[2]->Type()); -} - -TEST(Backward, op_all_input_are_not_need) { - auto fwd = - f::OpRegistry::CreateOp("rowwise_add", {{"X", {"x"}}, {"b", {"b"}}}, - {{"Out", {"out"}}}, f::AttributeMap{}); - auto backward = f::Backward(*fwd, {"x", "b"}); - ASSERT_TRUE(backward->IsNetOp()); - auto net = static_cast(backward.get()); - ASSERT_TRUE(net->ops_.empty()); -} - -TEST(Backward, op_all_output_are_not_need) { - auto fwd = - f::OpRegistry::CreateOp("rowwise_add", {{"X", {"x"}}, {"b", {"b"}}}, - {{"Out", {"out"}}}, f::AttributeMap{}); - auto backward = f::Backward(*fwd, {"out"}); - ASSERT_TRUE(backward->IsNetOp()); - auto net = static_cast(backward.get()); - ASSERT_TRUE(net->ops_.empty()); -} - -TEST(Backward, op_part_of_output_are_not_need) { - auto fwd = - f::OpRegistry::CreateOp("many_output_op", {{"x", {"X"}}}, - {{"y", {"Y"}}, {"z", {"Z"}}}, f::AttributeMap{}); - auto backward = f::Backward(*fwd, {"Z"}); - ASSERT_TRUE(backward->IsNetOp()); - auto net = static_cast(backward.get()); - ASSERT_EQ(net->ops_.size(), 2UL); - - auto &fill_zero = *net->ops_[0]; - ASSERT_EQ("fill_zeros_like", fill_zero.Type()); - ASSERT_EQ(1UL, fill_zero.Inputs("X").size()); - ASSERT_EQ("Z", fill_zero.Input("X")); - ASSERT_EQ(1UL, fill_zero.Outputs("Out").size()); - ASSERT_EQ(std::string("Z") + f::kZeroVarSuffix, fill_zero.Output("Out")); - - auto &d_many_out = *net->ops_[1]; - ASSERT_EQ("many_output_op_grad", d_many_out.Type()); - ASSERT_EQ(1UL + 2UL + 2UL, d_many_out.Inputs().size()); // I/O/OG - ASSERT_EQ(std::string("Z") + f::kZeroVarSuffix, - d_many_out.Input(f::GradVarName("z"))); - ASSERT_EQ(f::GradVarName("Y"), d_many_out.Input(f::GradVarName("y"))); - ASSERT_EQ(f::GradVarName("X"), d_many_out.Output(f::GradVarName("x"))); -} - -TEST(Backward, op_part_of_input_are_not_need) { - auto fwd = f::OpRegistry::CreateOp("mul", {{"X", {"a"}}, {"Y", {"b"}}}, - {{"Out", {"out"}}}, f::AttributeMap{}); - auto backward = f::Backward(*fwd, {"a"}); - auto &grad_mul = *backward; - ASSERT_EQ(grad_mul.Type(), "mul_grad"); - ASSERT_EQ(grad_mul.Inputs().size(), 2UL + 1UL + 1UL); - ASSERT_EQ(grad_mul.Outputs().size(), 2UL); - ASSERT_EQ(grad_mul.Output(f::GradVarName("X")), f::kEmptyVarName); - ASSERT_EQ(grad_mul.Output(f::GradVarName("Y")), f::GradVarName("b")); - ASSERT_EQ(grad_mul.Input(f::GradVarName("Out")), f::GradVarName("out")); - ASSERT_EQ(grad_mul.Input("X"), "a"); - ASSERT_EQ(grad_mul.Input("Y"), "b"); - ASSERT_EQ(grad_mul.Input("Out"), "out"); -} - -TEST(Backward, linear_net_intermediate_variable_has_no_grad) { - ops::NetOp net; - net.AppendOp(f::OpRegistry::CreateOp( - "fc", {{"X", {"x1"}}, {"W", {"w1"}}, {"b", {"b1"}}}, - {{"mul_result", {"mul_out1"}}, - {"add_result", {"add_out1"}}, - {"Out", {"out1"}}}, - f::AttributeMap{})); - net.AppendOp(f::OpRegistry::CreateOp( - "fc", {{"X", {"out1"}}, {"W", {"w2"}}, {"b", {"b2"}}}, - {{"mul_result", {"mul_out2"}}, - {"add_result", {"tmp_out2"}}, - {"Out", {"out2"}}}, - f::AttributeMap{})); - net.AppendOp(f::OpRegistry::CreateOp( - "fc", {{"X", {"out2"}}, {"W", {"w3"}}, {"b", {"b3"}}}, - {{"mul_result", {"mul_out3"}}, - {"add_result", {"tmp_out3"}}, - {"Out", {"out3"}}}, - f::AttributeMap{})); - net.CompleteAddOp(); - - auto backward = f::Backward(net, {"mul_out2", "tmp_out2", "out2"}); - ASSERT_TRUE(backward->IsNetOp()); - auto bwd_net = static_cast(backward.get()); - ASSERT_EQ(bwd_net->ops_.size(), 3UL); - auto &grad_fc = *bwd_net->ops_[0]; - - const char *all = paddle::operators::NetOp::kAll; - EXPECT_EQ(grad_fc.Inputs(all).size(), - 2UL /* external input number */ - + 1UL /* external output number*/ - + 1UL /* number of gradient of external output*/ - + 2UL /* internal variable number*/ - ); - EXPECT_EQ(grad_fc.Outputs(all).size(), - 2UL /* input number of mul*/ - + 2UL /* input number of rowwise_add*/ - + 1UL /* input number of sigmod */ - - 1UL /* out2 is not needed*/); - EXPECT_EQ(bwd_net->ops_[1]->Inputs(all).size(), 0UL); - EXPECT_EQ(bwd_net->ops_[1]->Outputs(all).size(), 0UL); - EXPECT_EQ(bwd_net->ops_[2]->Inputs(all).size(), 0UL); - EXPECT_EQ(bwd_net->ops_[2]->Outputs(all).size(), 0UL); -} - -TEST(Backward, simple_single_op) { - f::ProgramDesc program; - f::BlockDesc *block = program.MutableBlock(0); - - f::OpDesc *op = block->AppendOp(); - op->SetType("rowwise_add"); - op->SetInput("X", {"x"}); - op->SetInput("b", {"b"}); - op->SetOutput("Out", {"out"}); - - auto target = f::VarDesc("out"); - target.SetShape({1}); - auto var_to_grad = - AppendBackward(program, target, std::unordered_set{}); - - ASSERT_EQ(block->AllOps().size(), 3UL); - f::OpDesc *fill_op = block->AllOps()[1]; - EXPECT_EQ(fill_op->Type(), "fill_constant"); - - f::OpDesc *grad_op = block->AllOps()[2]; - EXPECT_EQ(grad_op->Type(), "rowwise_add_grad"); - ASSERT_EQ(grad_op->InputNames().size(), 1UL); - ASSERT_EQ(grad_op->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out")})); - EXPECT_EQ(grad_op->Output(f::GradVarName("X")), - std::vector({f::GradVarName("x")})); - EXPECT_EQ(grad_op->Output(f::GradVarName("b")), - std::vector({f::GradVarName("b")})); - - EXPECT_EQ(var_to_grad.size(), 3UL); - EXPECT_EQ(var_to_grad.at("b"), f::GradVarInfo(f::GradVarName("b"), 0, 2)); - EXPECT_EQ(var_to_grad.at("x"), f::GradVarInfo(f::GradVarName("x"), 0, 2)); - - EXPECT_TRUE(block->HasVar(f::GradVarName("b"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("x"))); -} - -TEST(Backward, default_attribute) { - f::ProgramDesc program; - f::BlockDesc *block = program.MutableBlock(0); - f::OpDesc *op = block->AppendOp(); - op->SetType("mul"); - op->SetInput("X", {"x"}); - op->SetInput("Y", {"y"}); - op->SetOutput("Out", {"out"}); - op->CheckAttrs(); - - auto target = f::VarDesc("out"); - target.SetShape({1}); - AppendBackward(program, target, std::unordered_set{}); - - ASSERT_EQ(block->AllOps().size(), 3UL); - EXPECT_EQ(boost::get(op->GetAttr("x_num_col_dims")), 1); - EXPECT_EQ(boost::get(op->GetAttr("y_num_col_dims")), 1); - - f::OpDesc *fill_op = block->AllOps()[1]; - EXPECT_EQ(fill_op->Type(), "fill_constant"); - - f::OpDesc *grad_op = block->AllOps()[2]; - ASSERT_EQ(grad_op->Type(), "mul_grad"); - EXPECT_EQ(boost::get(grad_op->GetAttr("x_num_col_dims")), 1); - EXPECT_EQ(boost::get(grad_op->GetAttr("y_num_col_dims")), 1); -} - -TEST(Backward, simple_mult_op) { - f::ProgramDesc program; - f::BlockDesc *block = program.MutableBlock(0); - f::OpDesc *op1 = block->AppendOp(); - op1->SetType("rowwise_add"); - op1->SetInput("X", {"x1"}); - op1->SetInput("b", {"b1"}); - op1->SetOutput("Out", {"out1"}); - - f::OpDesc *op2 = block->AppendOp(); - op2->SetType("mul"); - op2->SetInput("X", {"out1"}); - op2->SetInput("Y", {"y2"}); - op2->SetOutput("Out", {"out2"}); - - f::OpDesc *op3 = block->AppendOp(); - op3->SetType("rowwise_add"); - op3->SetInput("X", {"out2"}); - op3->SetInput("b", {"b3"}); - op3->SetOutput("Out", {"out3"}); - - auto target = f::VarDesc("out3"); - target.SetShape({1}); - size_t forward_len = block->AllOps().size(); - auto var_to_grad = - AppendBackward(program, target, std::unordered_set{}); - - ASSERT_EQ(block->AllOps().size(), 6UL + 1); - f::OpDesc *fill_op = block->AllOps()[forward_len]; - EXPECT_EQ(fill_op->Type(), "fill_constant"); - - f::OpDesc *grad_op1 = block->AllOps()[6]; - EXPECT_EQ(grad_op1->Type(), "rowwise_add_grad"); - ASSERT_EQ(grad_op1->InputNames().size(), 1UL); - ASSERT_EQ(grad_op1->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op1->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out1")})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("X")), - std::vector({f::GradVarName("x1")})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("b")), - std::vector({f::GradVarName("b1")})); - - f::OpDesc *grad_op2 = block->AllOps()[5]; - EXPECT_EQ(grad_op2->Type(), "mul_grad"); - ASSERT_EQ(grad_op2->InputNames().size(), 4UL); - ASSERT_EQ(grad_op2->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op2->Input("X"), std::vector({"out1"})); - EXPECT_EQ(grad_op2->Input("Y"), std::vector({"y2"})); - EXPECT_EQ(grad_op2->Input("Out"), std::vector({"out2"})); - EXPECT_EQ(grad_op2->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out2")})); - EXPECT_EQ(grad_op2->Output(f::GradVarName("X")), - std::vector({f::GradVarName("out1")})); - EXPECT_EQ(grad_op2->Output(f::GradVarName("Y")), - std::vector({f::GradVarName("y2")})); - - f::OpDesc *grad_op3 = block->AllOps()[4]; - EXPECT_EQ(grad_op3->Type(), "rowwise_add_grad"); - ASSERT_EQ(grad_op3->InputNames().size(), 1UL); - ASSERT_EQ(grad_op3->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op3->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out3")})); - EXPECT_EQ(grad_op3->Output(f::GradVarName("X")), - std::vector({f::GradVarName("out2")})); - EXPECT_EQ(grad_op3->Output(f::GradVarName("b")), - std::vector({f::GradVarName("b3")})); - - EXPECT_EQ(var_to_grad.size(), 7UL); - EXPECT_EQ(var_to_grad.at("x1"), f::GradVarInfo(f::GradVarName("x1"), 0, 6)); - EXPECT_EQ(var_to_grad.at("b1"), f::GradVarInfo(f::GradVarName("b1"), 0, 6)); - EXPECT_EQ(var_to_grad.at("out1"), - f::GradVarInfo(f::GradVarName("out1"), 0, 5)); - EXPECT_EQ(var_to_grad.at("y2"), f::GradVarInfo(f::GradVarName("y2"), 0, 5)); - EXPECT_EQ(var_to_grad.at("out2"), - f::GradVarInfo(f::GradVarName("out2"), 0, 4)); - EXPECT_EQ(var_to_grad.at("b3"), f::GradVarInfo(f::GradVarName("b3"), 0, 4)); - - EXPECT_TRUE(block->HasVar(f::GradVarName("x1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("b1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("out1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("y2"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("out2"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("b3"))); -} - -TEST(Backward, intermedia_var_no_grad) { - f::ProgramDesc program; - f::BlockDesc *block = program.MutableBlock(0); - f::OpDesc *op1 = block->AppendOp(); - op1->SetType("rowwise_add"); - op1->SetInput("X", {"x1"}); - op1->SetInput("b", {"b1"}); - op1->SetOutput("Out", {"out1"}); - - f::OpDesc *op2 = block->AppendOp(); - op2->SetType("mul"); - op2->SetInput("X", {"x2"}); - op2->SetInput("Y", {"y2"}); - op2->SetOutput("Out", {"out2"}); - - f::OpDesc *op3 = block->AppendOp(); - op3->SetType("rowwise_add"); - op3->SetInput("X", {"out2"}); - op3->SetInput("b", {"b3"}); - op3->SetOutput("Out", {"out3"}); - - f::OpDesc *op4 = block->AppendOp(); - op4->SetType("mul"); - op4->SetInput("X", {"out1"}); - op4->SetInput("Y", {"out3"}); - op4->SetOutput("Out", {"out4"}); - - auto target = f::VarDesc("out4"); - target.SetShape({1}); - size_t forward_len = block->AllOps().size(); - auto var_to_grad = AppendBackward(program, target, {"out3"}); - - ASSERT_EQ(block->AllOps().size(), 7UL); - f::OpDesc *fill_op = block->AllOps()[forward_len]; - EXPECT_EQ(fill_op->Type(), "fill_constant"); - - f::OpDesc *grad_op1 = block->AllOps()[6]; - EXPECT_EQ(grad_op1->Type(), "rowwise_add_grad"); - ASSERT_EQ(grad_op1->InputNames().size(), 1UL); - ASSERT_EQ(grad_op1->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op1->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out1")})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("X")), - std::vector({f::GradVarName("x1")})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("b")), - std::vector({f::GradVarName("b1")})); - - f::OpDesc *grad_op4 = block->AllOps()[5]; - EXPECT_EQ(grad_op4->Type(), "mul_grad"); - ASSERT_EQ(grad_op4->InputNames().size(), 4UL); - ASSERT_EQ(grad_op4->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op4->Input("X"), std::vector({"out1"})); - EXPECT_EQ(grad_op4->Input("Y"), std::vector({"out3"})); - EXPECT_EQ(grad_op4->Input("Out"), std::vector({"out4"})); - EXPECT_EQ(grad_op4->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out4")})); - EXPECT_EQ(grad_op4->Output(f::GradVarName("X")), - std::vector({f::GradVarName("out1")})); - EXPECT_EQ(grad_op4->Output(f::GradVarName("Y")), std::vector()); - - EXPECT_EQ(var_to_grad.size(), 4UL); - EXPECT_EQ(var_to_grad.at("x1"), f::GradVarInfo(f::GradVarName("x1"), 0, 6)); - EXPECT_EQ(var_to_grad.at("b1"), f::GradVarInfo(f::GradVarName("b1"), 0, 6)); - EXPECT_EQ(var_to_grad.at("out1"), - f::GradVarInfo(f::GradVarName("out1"), 0, 5)); - - EXPECT_TRUE(block->HasVar(f::GradVarName("x1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("b1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("out1"))); -} - -TEST(Backward, var_no_grad) { - f::ProgramDesc program; - f::BlockDesc *block = program.MutableBlock(0); - f::OpDesc *op1 = block->AppendOp(); - op1->SetType("mult_in_out"); - op1->SetInput("X", {"x1"}); - op1->SetInput("H", {"h1"}); - op1->SetOutput("Y", {"y1"}); - op1->SetOutput("Z", {"z1"}); - - f::OpDesc *op2 = block->AppendOp(); - op2->SetType("mult_in_out"); - op2->SetInput("X", {"y1"}); - op2->SetInput("H", {"z1"}); - op2->SetOutput("Y", {"y2"}); - op2->SetOutput("Z", {"z2"}); - - auto target = f::VarDesc("z2"); - target.SetShape({1}); - size_t forward_len = block->AllOps().size(); - auto var_to_grad = AppendBackward(program, target, {"z1"}); - - ASSERT_EQ(block->AllOps().size(), 6UL); - f::OpDesc *fill_op = block->AllOps()[forward_len]; - EXPECT_EQ(fill_op->Type(), "fill_constant"); - - f::OpDesc *grad_op2 = block->AllOps()[3]; - ASSERT_EQ(grad_op2->Type(), "mult_in_out_grad"); - ASSERT_EQ(grad_op2->InputNames().size(), 6UL); - ASSERT_EQ(grad_op2->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op2->Input("X"), std::vector({"y1"})); - EXPECT_EQ(grad_op2->Input("H"), std::vector({"z1"})); - EXPECT_EQ(grad_op2->Input("Y"), std::vector({"y2"})); - EXPECT_EQ(grad_op2->Input("Z"), std::vector({"z2"})); - EXPECT_EQ(grad_op2->Input(f::GradVarName("Y")), - std::vector({f::GradVarName("y2")})); - EXPECT_EQ(grad_op2->Input(f::GradVarName("Z")), - std::vector({f::GradVarName("z2")})); - EXPECT_EQ(grad_op2->Output(f::GradVarName("X")), - std::vector({f::GradVarName("y1")})); - EXPECT_EQ(grad_op2->Output(f::GradVarName("H")), std::vector()); - - f::OpDesc *fill_zero_op = block->AllOps()[4]; - ASSERT_EQ(fill_zero_op->Type(), "fill_zeros_like"); - ASSERT_EQ(fill_zero_op->InputNames().size(), 1UL); - ASSERT_EQ(fill_zero_op->OutputNames().size(), 1UL); - EXPECT_EQ(fill_zero_op->Input("X"), std::vector({"z1"})); - EXPECT_EQ(fill_zero_op->Output("Out"), - std::vector({std::string("z1") + f::kZeroVarSuffix})); - - f::OpDesc *grad_op1 = block->AllOps()[5]; - ASSERT_EQ(grad_op1->Type(), "mult_in_out_grad"); - ASSERT_EQ(grad_op1->InputNames().size(), 6UL); - ASSERT_EQ(grad_op1->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op1->Input("X"), std::vector({"x1"})); - EXPECT_EQ(grad_op1->Input("H"), std::vector({"h1"})); - EXPECT_EQ(grad_op1->Input("Y"), std::vector({"y1"})); - EXPECT_EQ(grad_op1->Input("Z"), std::vector({"z1"})); - EXPECT_EQ(grad_op1->Input(f::GradVarName("Y")), - std::vector({f::GradVarName("y1")})); - EXPECT_EQ(grad_op1->Input(f::GradVarName("Z")), - std::vector({std::string("z1") + f::kZeroVarSuffix})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("X")), - std::vector({f::GradVarName("x1")})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("H")), - std::vector({f::GradVarName("h1")})); - - EXPECT_EQ(var_to_grad.size(), 4UL); - EXPECT_EQ(var_to_grad.at("y1"), f::GradVarInfo(f::GradVarName("y1"), 0, 3)); - EXPECT_EQ(var_to_grad.at("x1"), f::GradVarInfo(f::GradVarName("x1"), 0, 5)); - EXPECT_EQ(var_to_grad.at("h1"), f::GradVarInfo(f::GradVarName("h1"), 0, 5)); - - EXPECT_TRUE(block->HasVar(f::GradVarName("y1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("x1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("h1"))); -} - -TEST(Backward, shared_var) { - f::ProgramDesc program; - f::BlockDesc *block = program.MutableBlock(0); - f::OpDesc *op1 = block->AppendOp(); - op1->SetType("rowwise_add"); - op1->SetInput("X", {"x1"}); - op1->SetInput("b", {"b1"}); - op1->SetOutput("Out", {"out1"}); - - f::OpDesc *op2 = block->AppendOp(); - op2->SetType("mul"); - op2->SetInput("X", {"out1"}); - op2->SetInput("Y", {"y2"}); - op2->SetOutput("Out", {"out2"}); - - f::OpDesc *op3 = block->AppendOp(); - op3->SetType("rowwise_add"); - op3->SetInput("X", {"out1"}); - op3->SetInput("b", {"b3"}); - op3->SetOutput("Out", {"out3"}); - - auto target = f::VarDesc("out3"); - target.SetShape({1}); - size_t forward_len = block->AllOps().size(); - auto var_to_grad = - AppendBackward(program, target, std::unordered_set{}); - - ASSERT_EQ(block->AllOps().size(), 8UL); - f::OpDesc *fill_op = block->AllOps()[forward_len]; - EXPECT_EQ(fill_op->Type(), "fill_constant"); - - f::OpDesc *grad_op3 = block->AllOps()[4]; - ASSERT_EQ(grad_op3->Type(), "rowwise_add_grad"); - ASSERT_EQ(grad_op3->InputNames().size(), 1UL); - ASSERT_EQ(grad_op3->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op3->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out3")})); - EXPECT_EQ(grad_op3->Output(f::GradVarName("X")), - std::vector({f::GradVarName("out1") + "@RENAME@0"})); - EXPECT_EQ(grad_op3->Output(f::GradVarName("b")), - std::vector({f::GradVarName("b3")})); - - f::OpDesc *grad_op4 = block->AllOps()[5]; - ASSERT_EQ(grad_op4->Type(), "mul_grad"); - ASSERT_EQ(grad_op4->InputNames().size(), 4UL); - ASSERT_EQ(grad_op4->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op4->Input("X"), std::vector({"out1"})); - EXPECT_EQ(grad_op4->Input("Y"), std::vector({"y2"})); - EXPECT_EQ(grad_op4->Input("Out"), std::vector({"out2"})); - EXPECT_EQ(grad_op4->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out2")})); - EXPECT_EQ(grad_op4->Output(f::GradVarName("X")), - std::vector({f::GradVarName("out1") + "@RENAME@1"})); - EXPECT_EQ(grad_op4->Output(f::GradVarName("Y")), - std::vector({f::GradVarName("y2")})); - - f::OpDesc *sum_op = block->AllOps()[6]; - ASSERT_EQ(sum_op->Type(), "sum"); - ASSERT_EQ(sum_op->InputNames().size(), 1UL); - ASSERT_EQ(sum_op->OutputNames().size(), 1UL); - EXPECT_EQ(sum_op->Input("X"), - std::vector({f::GradVarName("out1") + "@RENAME@0", - f::GradVarName("out1") + "@RENAME@1"})); - EXPECT_EQ(sum_op->Output("Out"), - std::vector({f::GradVarName("out1")})); - - f::OpDesc *grad_op1 = block->AllOps()[7]; - ASSERT_EQ(grad_op1->Type(), "rowwise_add_grad"); - ASSERT_EQ(grad_op1->InputNames().size(), 1UL); - ASSERT_EQ(grad_op1->OutputNames().size(), 2UL); - EXPECT_EQ(grad_op1->Input(f::GradVarName("Out")), - std::vector({f::GradVarName("out1")})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("X")), - std::vector({f::GradVarName("x1")})); - EXPECT_EQ(grad_op1->Output(f::GradVarName("b")), - std::vector({f::GradVarName("b1")})); - - EXPECT_EQ(var_to_grad.size(), 6UL); - EXPECT_EQ(var_to_grad.at("b3"), f::GradVarInfo(f::GradVarName("b3"), 0, 4)); - EXPECT_EQ(var_to_grad.at("y2"), f::GradVarInfo(f::GradVarName("y2"), 0, 5)); - EXPECT_EQ(var_to_grad.at("out1"), - f::GradVarInfo(f::GradVarName("out1"), 0, 6)); - EXPECT_EQ(var_to_grad.at("x1"), f::GradVarInfo(f::GradVarName("x1"), 0, 7)); - EXPECT_EQ(var_to_grad.at("b1"), f::GradVarInfo(f::GradVarName("b1"), 0, 7)); - - EXPECT_TRUE(block->HasVar(f::GradVarName("b3"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("y2"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("out1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("x1"))); - EXPECT_TRUE(block->HasVar(f::GradVarName("b1"))); -} - -TEST(Backward, half_backward) { - f::ProgramDesc program; - f::BlockDesc *block = program.MutableBlock(0); - auto *op1 = block->AppendOp(); - op1->SetType("minus"); - op1->SetInput("X", {"a"}); - op1->SetInput("Y", {"b"}); - op1->SetOutput("Out", {"out"}); - - auto target = f::VarDesc("out"); - target.SetShape({1}); - size_t forward_len = block->AllOps().size(); - auto var_to_grad = AppendBackward(program, target, {"b"}); - f::OpDesc *fill_op = block->AllOps()[forward_len]; - EXPECT_EQ(fill_op->Type(), "fill_constant"); - auto ops = block->AllOps(); - ASSERT_EQ(3UL, ops.size()); - - EXPECT_EQ(var_to_grad.size(), 2UL); - EXPECT_EQ(var_to_grad.at("a"), - f::GradVarInfo(f::GradVarName("a"), 0, forward_len + 1)); -} diff --git a/paddle/fluid/framework/prune_test.cc b/paddle/fluid/framework/prune_test.cc index 0e44b34383..8af7d2d510 100644 --- a/paddle/fluid/framework/prune_test.cc +++ b/paddle/fluid/framework/prune_test.cc @@ -14,18 +14,17 @@ limitations under the License. */ #include "paddle/fluid/framework/prune.h" +#include +#include + #include "paddle/fluid/framework/attribute.h" #include "paddle/fluid/framework/operator.h" -#include "paddle/fluid/operators/net_op.h" #include "paddle/fluid/framework/block_desc.h" #include "paddle/fluid/framework/op_desc.h" #include "paddle/fluid/framework/program_desc.h" -#include - namespace f = paddle::framework; -namespace ops = paddle::operators; void AddOp(const std::string &type, const f::VariableNameMap &inputs, const f::VariableNameMap &outputs, f::AttributeMap attrs, diff --git a/paddle/fluid/operators/CMakeLists.txt b/paddle/fluid/operators/CMakeLists.txt index 5ff987ad8b..3c8696b508 100644 --- a/paddle/fluid/operators/CMakeLists.txt +++ b/paddle/fluid/operators/CMakeLists.txt @@ -100,7 +100,7 @@ function(op_library TARGET) endif() # Define operators that don't need pybind here. - foreach(manual_pybind_op "net_op" "compare_op" "logical_op" "nccl_op" "tensor_array_read_write_op") + foreach(manual_pybind_op "compare_op" "logical_op" "nccl_op" "tensor_array_read_write_op") if ("${TARGET}" STREQUAL "${manual_pybind_op}") set(pybind_flag 1) endif() @@ -199,7 +199,6 @@ else() set(DEPS_OPS ${DEPS_OPS} send_op prefetch_op recv_op listen_and_serv_op send_vars_op send_barrier_op) endif() -op_library(cond_op DEPS framework_proto tensor net_op) op_library(cross_entropy_op DEPS cross_entropy) op_library(softmax_with_cross_entropy_op DEPS cross_entropy softmax) op_library(softmax_op DEPS softmax) @@ -259,7 +258,6 @@ endforeach() set(GLOB_OP_LIB ${OP_LIBRARY} CACHE INTERNAL "Global OP library") cc_test(gather_test SRCS gather_test.cc DEPS tensor) -cc_test(net_op_test SRCS net_op_test.cc DEPS net_op) cc_test(scatter_test SRCS scatter_test.cc DEPS tensor) cc_test(beam_search_decode_op_test SRCS beam_search_decode_op_test.cc DEPS lod_tensor) cc_test(beam_search_op_test SRCS beam_search_op_test.cc DEPS lod_tensor beam_search_op) diff --git a/paddle/fluid/operators/cond_op.cc b/paddle/fluid/operators/cond_op.cc deleted file mode 100644 index 15dce9e3e2..0000000000 --- a/paddle/fluid/operators/cond_op.cc +++ /dev/null @@ -1,235 +0,0 @@ -/* 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/cond_op.h" -#include "paddle/fluid/operators/gather.h" -#include "paddle/fluid/operators/scatter.h" -#include "paddle/fluid/platform/device_context.h" - -namespace paddle { -namespace operators { - -using Scope = framework::Scope; -using Variable = framework::Variable; -using Tensor = framework::Tensor; -using LoDTensor = framework::LoDTensor; -using DDim = framework::DDim; - -framework::Scope& CondOp::AddSubScope(const Scope& scope) const { - auto sub_scopes_var = scope.FindVar("SubScopes"); - PADDLE_ENFORCE_NOT_NULL(sub_scopes_var, - "Output(SubScopes) of CondOp should not be null."); - auto sub_scopes = sub_scopes_var->GetMutable>(); - auto& sub_scope = scope.NewScope(); - sub_scopes->push_back(&sub_scope); - return sub_scope; -} - -std::vector& CondOp::GetSubScopes( - const framework::Scope& scope) const { - auto sub_scopes_var = scope.FindVar("SubScopes"); - PADDLE_ENFORCE_NOT_NULL(sub_scopes_var, - "Output(SubScopes) of CondOp should not be null."); - return *sub_scopes_var->GetMutable>(); -} - -LoDTensor& CondOp::AddIndexTensor(const Scope& scope) const { - auto index_tensors_var = scope.FindVar("IndexTensors"); - PADDLE_ENFORCE_NOT_NULL(index_tensors_var, - "Output(IndexTensors) of CondOp should not be null."); - auto& index_tensors = - *index_tensors_var->GetMutable>(); - index_tensors.push_back(LoDTensor()); - return index_tensors.back(); -} - -std::vector& CondOp::GetIndexTensors( - const framework::Scope& scope) const { - auto* index_tensors_var = scope.FindVar("IndexTensors"); - PADDLE_ENFORCE_NOT_NULL(index_tensors_var, - "Output(IndexTensors) of CondOp should not be null."); - return *index_tensors_var->GetMutable>(); -} - -void CondOp::PrepareDataForSubnet( - const framework::Scope& scope, - const platform::DeviceContext& dev_ctx) const { - PADDLE_ENFORCE(!Inputs("Xs").empty(), "Inputs(Xs) of CondOp can't be empty."); - - for (int i = 0; i < BRANCH_NUM; ++i) { - // Create two sub scopes for true and false branches - // sub_scopes[0] for the true branch - // sub_scopes[1] for the false branch - AddSubScope(scope); - // Create two tensors for true and false indices: - // index_tensors[0] for the true branch - // index_tensors[1] for the false branch - AddIndexTensor(scope); - } - - Variable* cond_var = scope.FindVar(Input("Cond")); - PADDLE_ENFORCE_NOT_NULL(cond_var, - "Input(Cond) of CondOp should not be null."); - const LoDTensor* cond = cond_var->GetMutable(); - - // get the true/false index at runtime according to cond tensor - // index_vectors[0]: vector, contains all index for cond[i] == true - // index_vectors[1]: vector, contains all index for cond[i] == false - std::vector> index_vectors; - index_vectors.resize(BRANCH_NUM); - - const int* cond_data = cond->data(); - for (int i = 0; i < cond->dims()[0]; ++i) { - if (cond_data[i]) - index_vectors[TRUE_BRANCH].push_back(i); - else - index_vectors[FALSE_BRANCH].push_back(i); - } - - // put index_vectors[0] and index_vectors[1] into two tensors: - // index_tensors[0] and index_tensors[1] - std::vector& index_tensors = GetIndexTensors(scope); - std::vector& sub_scopes = GetSubScopes(scope); - - for (int i = 0; i < BRANCH_NUM; ++i) { - DDim dim = {static_cast(index_vectors[i].size())}; - int* index_tensor_data_ptr = - index_tensors[i].mutable_data(dim, platform::CPUPlace()); - memcpy(index_tensor_data_ptr, index_vectors[i].data(), - dim[0] * sizeof(int)); - } - - // create input in subscopes according to index_vectors - for (auto& input : Inputs("Xs")) { - Variable* var_parent = scope.FindVar(input); - PADDLE_ENFORCE_NOT_NULL(var_parent); - const auto* tensor_parent = &var_parent->Get(); - - for (int i = 0; i < BRANCH_NUM; ++i) { - Variable* var_child = sub_scopes[i]->FindVar(input); - PADDLE_ENFORCE_NOT_NULL(var_child); - auto* tensor_child = var_child->GetMutable(); - - // Resize child - DDim dim = tensor_parent->dims(); - dim[0] = index_tensors[i].dims()[0]; - tensor_child->mutable_data(dim, platform::CPUPlace()); - - CPUGather(dev_ctx, *tensor_parent, index_tensors[i], tensor_child); - } - } - - // create output_tensors in subscope for sub_net - for (int i = 0; i < BRANCH_NUM; ++i) { - for (auto& output : (*sub_net_op_[i]).Outputs()) { - for (auto& var_name : output.second) { - sub_scopes[i]->Var(var_name); - } - } - } -} - -void CondOp::MergeDataFromSubnet(const framework::Scope& scope, - const platform::DeviceContext& dev_ctx) const { - std::vector& sub_scopes = GetSubScopes(scope); - const std::vector& index_tensors = - GetIndexTensors(scope); - - // Infer the output dim, out_dim[0] = true_dim[0] + false_dim[0] - PADDLE_ENFORCE(!Outputs("Outs").empty(), - "Outputs(Outs) of CondOp can't be empty."); - for (auto& output : Outputs("Outs")) { - const LoDTensor* tensor_t_out = - &sub_scopes[TRUE_BRANCH]->FindVar(output)->Get(); - PADDLE_ENFORCE_NOT_NULL(tensor_t_out, "True output should not be NULL"); - const LoDTensor* tensor_f_out = - &sub_scopes[FALSE_BRANCH]->FindVar(output)->Get(); - PADDLE_ENFORCE_NOT_NULL(tensor_f_out, "False output should not be NULL"); - - auto* var_out = scope.FindVar(output); - PADDLE_ENFORCE_NOT_NULL(var_out, "Output not found"); - LoDTensor* tensor_out = var_out->GetMutable(); - PADDLE_ENFORCE_NOT_NULL(tensor_t_out, - "True output tensor should not be NULL"); - - DDim true_dim = tensor_t_out->dims(); - DDim false_dim = tensor_f_out->dims(); - true_dim[0] = 0; - false_dim[0] = 0; - PADDLE_ENFORCE_EQ(true_dim, false_dim, - "Outputs not of the same shape except the first dim"); - - DDim out_dim = tensor_t_out->dims(); - out_dim[0] = tensor_t_out->dims()[0] + tensor_f_out->dims()[0]; - tensor_out->Resize(out_dim); - tensor_out->mutable_data(platform::CPUPlace()); - } - - // merge output results: - // output_tensor = true_output_tensor + false_output_tensor - for (auto& output : Outputs("Outs")) { - Variable* var_parent = scope.FindVar(output); - PADDLE_ENFORCE_NOT_NULL(var_parent); - auto* tensor_parent = var_parent->GetMutable(); - - for (int i = 0; i < BRANCH_NUM; ++i) { - Variable* var_child = sub_scopes[i]->FindVar(output); - PADDLE_ENFORCE_NOT_NULL(var_child); - auto* tensor_child = &var_child->Get(); - ScatterAssign(dev_ctx, *tensor_child, index_tensors[i], - tensor_parent); - } - } -} - -void CondOp::RunImpl(const Scope& scope, const platform::Place& place) const { - // get device context from pool - platform::DeviceContextPool& pool = platform::DeviceContextPool::Instance(); - auto& dev_ctx = *pool.Get(place); - - PrepareDataForSubnet(scope, dev_ctx); - std::vector& sub_scopes = GetSubScopes(scope); - for (int i = 0; i < BRANCH_NUM; ++i) { - sub_net_op_[i]->Run(*sub_scopes[i], place); - } - MergeDataFromSubnet(scope, dev_ctx); -} - -class CondOpProtoAndCheckerMaker : public framework::OpProtoAndCheckerMaker { - public: - CondOpProtoAndCheckerMaker(OpProto* proto, OpAttrChecker* op_checker) - : OpProtoAndCheckerMaker(proto, op_checker) { - AddInput("Cond", "The condition, which is a bool vector"); - AddInput("Xs", "Inputs of Subnets").AsDuplicable(); - AddOutput("Outs", "Outputs of Cond_Op after merge").AsDuplicable(); - - AddOutput("SubScopes", "sub scopes for true and false branches"); - AddOutput("IndexTensors", "Index Tensors contains indices for true/false"); - - AddComment(R"DOC( -Sample Dependent Conditional Operator. - -Given Cond[i] as a 1/0 vector to indicate true/false: -Out[i] = subnet_true[i], if Cond[i] == true -Out[i] = subnet_false[i], if Cond[i] == false - -)DOC"); - } -}; - -} // namespace operators -} // namespace paddle - -REGISTER_OP_WITHOUT_GRADIENT(cond, paddle::operators::CondOp, - paddle::operators::CondOpProtoAndCheckerMaker); diff --git a/paddle/fluid/operators/cond_op.h b/paddle/fluid/operators/cond_op.h deleted file mode 100644 index d3888923db..0000000000 --- a/paddle/fluid/operators/cond_op.h +++ /dev/null @@ -1,96 +0,0 @@ -/* 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 "glog/logging.h" -#include "paddle/fluid/framework/ddim.h" -#include "paddle/fluid/framework/eigen.h" -#include "paddle/fluid/framework/operator.h" -#include "paddle/fluid/framework/tensor.h" -#include "paddle/fluid/operators/net_op.h" - -namespace paddle { -namespace operators { - -/* - * @brief CondOp is a dynamic if-else Operator - * - * It has a input tensor named cond indicating which netop each instance will - * run. - * - * if cond == 1, it will run true_net, which is a NetOp. - * - * if cond == 0, it will run false_net, which is another NetOp. - */ -class CondOp : public framework::OperatorBase { - public: - CondOp(const std::string& type, const framework::VariableNameMap& inputs, - const framework::VariableNameMap& outputs, - const framework::AttributeMap& attrs) - : OperatorBase(type, inputs, outputs, attrs) { - sub_net_op_.resize(BRANCH_NUM); - } - - CondOp(const CondOp& o) - : framework::OperatorBase( - static_cast(o)) { - // TODO(yuyang18): Implement copy ctor well. - PADDLE_THROW("Not implemented"); - } - - framework::Scope& AddSubScope(const framework::Scope& scope) const; - std::vector& GetSubScopes( - const framework::Scope& scope) const; - - framework::LoDTensor& AddIndexTensor(const framework::Scope& scope) const; - std::vector& GetIndexTensors( - const framework::Scope& scope) const; - - void PrepareDataForSubnet(const framework::Scope& scope, - const platform::DeviceContext& dev_ctx) const; - void MergeDataFromSubnet(const framework::Scope& scope, - const platform::DeviceContext& dev_ctx) const; - - /* - * Set True Block - */ - void set_truenet(std::unique_ptr&& net) { - sub_net_op_[TRUE_BRANCH] = std::move(net); - } - - /* - * Set False Block - */ - void set_falsenet(std::unique_ptr&& net) { - sub_net_op_[FALSE_BRANCH] = std::move(net); - } - - private: - void RunImpl(const framework::Scope& scope, - const platform::Place& place) const override; - - private: - const int TRUE_BRANCH = 0; - const int FALSE_BRANCH = 1; - const int BRANCH_NUM = 2; - - // sub_net_op_[0]: subnet_t - // sub_net_op_[1]: subnet_f - std::vector> sub_net_op_; -}; - -} // namespace operators -} // namespace paddle diff --git a/paddle/fluid/operators/minus_op.cc b/paddle/fluid/operators/minus_op.cc index 5790deb54d..a302b24560 100644 --- a/paddle/fluid/operators/minus_op.cc +++ b/paddle/fluid/operators/minus_op.cc @@ -13,9 +13,9 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/minus_op.h" + #include #include -#include "paddle/fluid/operators/net_op.h" namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/net_op.cc b/paddle/fluid/operators/net_op.cc deleted file mode 100644 index 0c2da74417..0000000000 --- a/paddle/fluid/operators/net_op.cc +++ /dev/null @@ -1,103 +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. - -#include "paddle/fluid/operators/net_op.h" -#include -#include "paddle/fluid/framework/op_registry.h" - -namespace paddle { -namespace operators { - -const char NetOp::kAll[] = "all"; - -void NetOp::CompleteAddOp(bool calc) { - add_op_done_ = true; - if (!calc) return; - std::set input_set; - std::set output_set; - for (auto& op : ops_) { - for (auto& ipt : op->Inputs()) { - for (auto& var_name : ipt.second) { - // If input variable has been in output set, then it will be - // added into intermediate_outputs_. Otherwise, it will be - // added into input set. - if (Contains(output_set, var_name)) { - intermediate_outputs_.insert(var_name); - } else { - input_set.insert(var_name); - } - } - } - - for (auto& opt : op->Outputs()) { - for (auto& var_name : opt.second) { - output_set.insert(var_name); - } - } - } - auto& inputs = inputs_[kAll]; - inputs.reserve(input_set.size()); - std::copy(input_set.begin(), input_set.end(), std::back_inserter(inputs)); - auto& outputs = outputs_[kAll]; - outputs.reserve(output_set.size()); - std::copy(output_set.begin(), output_set.end(), std::back_inserter(outputs)); -} - -std::string NetOp::DebugStringEx(const framework::Scope* scope) const { - std::ostringstream os; - os << OperatorBase::DebugStringEx(scope) << std::endl; - for (auto& op : ops_) { - std::istringstream is(op->DebugStringEx(scope)); - for (std::string line; std::getline(is, line);) { - os << " " << line << std::endl; - } - } - return os.str(); -} - -bool NetOp::IsNetOp() const { return true; } - -std::vector NetOp::OutputVars(bool has_intermediate) const { - std::vector all; - for (auto& pair : this->outputs_) { - for (auto& var_name : pair.second) { - all.push_back(var_name); - } - } - if (has_intermediate) { - return all; - } - std::vector ret_val; - for (auto& each : all) { - if (!Contains(intermediate_outputs_, each)) { - ret_val.push_back(each); - } - } - return ret_val; -} - -NetOp::NetOp(const std::string& type, const framework::VariableNameMap& inputs, - const framework::VariableNameMap& outputs, - const framework::AttributeMap& attrs) - : framework::OperatorBase(type, inputs, outputs, attrs) {} - -std::unique_ptr NetOp::Clone() const { - PADDLE_ENFORCE( - add_op_done_, - "Must clone a sealed NetOp, invoke Net::CompleteAddOp before clone"); - return std::unique_ptr(new NetOp(*this)); -} - -} // namespace operators -} // namespace paddle diff --git a/paddle/fluid/operators/net_op.h b/paddle/fluid/operators/net_op.h deleted file mode 100644 index cbf8820cf4..0000000000 --- a/paddle/fluid/operators/net_op.h +++ /dev/null @@ -1,130 +0,0 @@ -/* 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/framework.pb.h" -#include "paddle/fluid/framework/op_registry.h" - -namespace paddle { -namespace operators { - -/** - * @brief Network is also a type of Operator - * - * It will manage the operators it has. - * - * Network is the container and controller of a set of operators. - - * A network object knows all Operators belonging to this network. Variables, - * which are inputs and outputs of these operators, are created and managed by a - * hierarchy of Scope objects. - * - * This is the base class of network, all the networks should implement the APIs - * it defines. - */ -class NetOp : public framework::OperatorBase { - public: - static const char kAll[]; - NetOp() - : framework::OperatorBase("plain_net", framework::VariableNameMap{}, - framework::VariableNameMap{}, - framework::AttributeMap{}) {} - - NetOp(const std::string& type, const framework::VariableNameMap& inputs, - const framework::VariableNameMap& outputs, - const framework::AttributeMap& attrs); - - NetOp(const NetOp& o) : framework::OperatorBase(o.type_, {}, {}, o.attrs_) { - this->ops_.reserve(o.ops_.size()); - std::transform( - o.ops_.begin(), o.ops_.end(), std::back_inserter(this->ops_), - [](const std::unique_ptr& op) { - return std::unique_ptr(op->Clone()); - }); - this->CompleteAddOp(); - } - - bool SupportGPU() const override { - for (auto& op : ops_) { - if (!op->SupportGPU()) { - return false; - } - } - return true; - } - - void AppendOp(const framework::OperatorBase& op) { AppendOp(op.Clone()); } - - /** - * @brief Add an operator by ptr - */ - void AppendOp(std::unique_ptr op) { - PADDLE_ENFORCE(!add_op_done_, - "Cannot AppendOp when this network is sealed"); - PADDLE_ENFORCE_NOT_NULL(op, "Cannot Insert Null op"); - ops_.push_back(std::move(op)); - } - - void InsertOp(size_t pos, std::unique_ptr op) { - PADDLE_ENFORCE(!add_op_done_, - "Cannot InsertOp when this network is sealed"); - PADDLE_ENFORCE_NOT_NULL(op, "Cannot Insert Null op"); - PADDLE_ENFORCE_LE(pos, ops_.size(), "Out of range"); - ops_.insert(ops_.begin() + pos, std::move(op)); - } - - void InsertOp(size_t pos, const framework::OperatorBase& op) { - InsertOp(pos, op.Clone()); - } - - void CompleteAddOp(bool calculate = true); - - std::string DebugStringEx( - const framework::Scope* scope = nullptr) const override; - - bool IsNetOp() const override; - std::vector OutputVars(bool has_intermediate) const override; - - std::unique_ptr Clone() const override; - - std::vector> ops_; - - private: - /** - * @brief Run the network. - * - * Run all the operators with the `scope`, if no scope is provided, default - * scope will be used instead. If no OpContext is provicded, default context - * will be used. - */ - void RunImpl(const framework::Scope& scope, - const platform::Place& place) const override { - for (auto& op : ops_) { - op->Run(scope, place); - } - } - - bool add_op_done_{false}; - std::set intermediate_outputs_; - - template - static bool Contains(T container, KeyType key) { - return container.find(key) != container.end(); - } -}; - -} // namespace operators -} // namespace paddle diff --git a/paddle/fluid/operators/net_op_test.cc b/paddle/fluid/operators/net_op_test.cc deleted file mode 100644 index 3b5f575485..0000000000 --- a/paddle/fluid/operators/net_op_test.cc +++ /dev/null @@ -1,103 +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. -#include "paddle/fluid/operators/net_op.h" - -#include - -namespace paddle { -namespace operators { -using Scope = framework::Scope; -using DeviceContext = platform::DeviceContext; - -static int run_cnt = 0; - -class TestOp : public framework::OperatorBase { - public: - using framework::OperatorBase::OperatorBase; - DEFINE_OP_CLONE_METHOD(TestOp); - - private: - void RunImpl(const Scope& scope, - const platform::Place& place) const override { - ++run_cnt; - } -}; - -template -void AssertSameVectorWithoutOrder(const std::vector& expected, - const std::vector& actual) { - ASSERT_EQ(expected.size(), actual.size()); - std::unordered_set expected_set; - for (auto& tmp : expected) { - expected_set.insert(tmp); - } - for (auto& act : actual) { - ASSERT_NE(expected_set.end(), expected_set.find(act)); - } -} - -TEST(OpKernel, all) { - auto net = std::make_shared(); - ASSERT_NE(net, nullptr); - - net->AppendOp(std::unique_ptr( - new TestOp("test", {{"X", {"x"}}, {"W", {"w1"}}, {"b", {"b1"}}}, - {{"Out", {"y"}}}, framework::AttributeMap{}))); - net->AppendOp(std::unique_ptr( - new TestOp("test", {{"X", {"y"}}, {"W", {"w2"}}, {"b", {"b2"}}}, - {{"Out", {"z"}}}, framework::AttributeMap{}))); - - net->CompleteAddOp(); - AssertSameVectorWithoutOrder({"x", "w1", "b1", "w2", "b2"}, - net->Inputs(NetOp::kAll)); - AssertSameVectorWithoutOrder({"y", "z"}, net->Outputs(NetOp::kAll)); - - auto final_outs = net->OutputVars(false); - - ASSERT_EQ(final_outs.size(), 1UL); - ASSERT_EQ(final_outs[0], "z"); -} - -TEST(NetOp, insert_op) { - NetOp net; - auto op1 = std::unique_ptr( - new framework::NOP("empty", {{"X", {"x"}}, {"W", {"w1"}}, {"b", {"b1"}}}, - {{"Out", {"y"}}}, framework::AttributeMap{})); - net.AppendOp(*op1); - net.InsertOp(0, *op1); - ASSERT_EQ(2UL, net.ops_.size()); - net.InsertOp(2, std::move(op1)); - ASSERT_EQ(3UL, net.ops_.size()); -} - -TEST(NetOp, Clone) { - NetOp net; - net.AppendOp(std::unique_ptr(new framework::NOP{ - "empty", framework::VariableNameMap{}, framework::VariableNameMap{}, - framework::AttributeMap{}})); - net.AppendOp(std::unique_ptr(new framework::NOP{ - "empty2", framework::VariableNameMap{}, framework::VariableNameMap{}, - framework::AttributeMap{}})); - net.CompleteAddOp(true); - auto new_net_op = net.Clone(); - ASSERT_NE(new_net_op, nullptr); - ASSERT_TRUE(new_net_op->IsNetOp()); - auto* new_net = static_cast(new_net_op.get()); - ASSERT_EQ(2UL, new_net->ops_.size()); - ASSERT_EQ(new_net->ops_[0]->Type(), "empty"); - ASSERT_EQ(new_net->ops_[1]->Type(), "empty2"); -} - -} // namespace operators -} // namespace paddle diff --git a/paddle/fluid/operators/prelu_op.cc b/paddle/fluid/operators/prelu_op.cc index 447b854544..7fb45bd19d 100644 --- a/paddle/fluid/operators/prelu_op.cc +++ b/paddle/fluid/operators/prelu_op.cc @@ -13,7 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/prelu_op.h" -#include "paddle/fluid/operators/net_op.h" + +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/scale_op.cc b/paddle/fluid/operators/scale_op.cc index b16d06df8d..7ca7639fdb 100644 --- a/paddle/fluid/operators/scale_op.cc +++ b/paddle/fluid/operators/scale_op.cc @@ -13,7 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/scale_op.h" -#include "paddle/fluid/operators/net_op.h" + +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/split_op.cc b/paddle/fluid/operators/split_op.cc index dffac772f1..e745509ec8 100644 --- a/paddle/fluid/operators/split_op.cc +++ b/paddle/fluid/operators/split_op.cc @@ -13,7 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/split_op.h" -#include "paddle/fluid/operators/net_op.h" namespace paddle { namespace operators { diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index d559743a69..e571da42cb 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -20,8 +20,6 @@ limitations under the License. */ #include #include -#include "paddle/fluid/pybind/protobuf.h" - #include "paddle/fluid/framework/backward.h" #include "paddle/fluid/framework/channel.h" #include "paddle/fluid/framework/executor.h" @@ -31,18 +29,18 @@ limitations under the License. */ #include "paddle/fluid/framework/lod_rank_table.h" #include "paddle/fluid/framework/lod_tensor.h" #include "paddle/fluid/framework/lod_tensor_array.h" +#include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/framework/parallel_executor.h" #include "paddle/fluid/framework/prune.h" #include "paddle/fluid/framework/reader.h" #include "paddle/fluid/framework/selected_rows.h" -#include "paddle/fluid/operators/cond_op.h" -#include "paddle/fluid/operators/net_op.h" #include "paddle/fluid/platform/enforce.h" #include "paddle/fluid/platform/place.h" #include "paddle/fluid/platform/profiler.h" #include "paddle/fluid/pybind/const_value.h" #include "paddle/fluid/pybind/exception.h" -#include "paddle/fluid/pybind/pybind.h" +#include "paddle/fluid/pybind/protobuf.h" +#include "paddle/fluid/pybind/pybind.h" // NOLINT #include "paddle/fluid/pybind/recordio.h" #include "paddle/fluid/pybind/tensor_py.h" @@ -239,11 +237,6 @@ All parameter, weight, gradient are variables in Paddle. }, py::return_value_policy::reference) #endif - .def("get_net", - [](Variable &self) -> operators::NetOp * { - return self.GetMutable(); - }, - py::return_value_policy::reference) .def("get_reader", [](Variable &self) -> framework::ReaderHolder * { PADDLE_ENFORCE(self.IsType()); @@ -420,42 +413,6 @@ All parameter, weight, gradient are variables in Paddle. [](const OperatorBase &op) { return op.OutputVars(false); }) .def("support_gpu", &OperatorBase::SupportGPU); - py::class_(m, "Net") - .def_static("create", - []() -> operators::NetOp * { - auto *retv = new operators::NetOp; - retv->SetType("plain_net"); - return retv; - }) - .def("append_op", [](operators::NetOp &self, - const OperatorBase &op) { self.AppendOp(op); }) - .def("complete_add_op", &operators::NetOp::CompleteAddOp) - .def("complete_add_op", [](std::shared_ptr &self) { - self->CompleteAddOp(); - }); - - // cond_op - py::class_(m, "CondOp") - .def_static("create", - [](py::bytes protobin) -> operators::CondOp * { - proto::OpDesc desc; - PADDLE_ENFORCE(desc.ParsePartialFromString(protobin), - "Cannot parse user input to OpDesc"); - PADDLE_ENFORCE(desc.IsInitialized(), - "User OpDesc is not initialized, reason %s", - desc.InitializationErrorString()); - auto cond_op = OpRegistry::CreateOp(desc); - return static_cast(cond_op.release()); - }) - .def("set_truenet", - [](operators::CondOp &self, const operators::NetOp &net) -> void { - self.set_truenet(net.Clone()); - }) - .def("set_falsenet", - [](operators::CondOp &self, const operators::NetOp &net) -> void { - self.set_falsenet(net.Clone()); - }); - py::class_(m, "Executor") .def(py::init()) .def("run", diff --git a/paddle/fluid/recordio/chunk.cc b/paddle/fluid/recordio/chunk.cc index e7ebbba452..82d9aa601c 100644 --- a/paddle/fluid/recordio/chunk.cc +++ b/paddle/fluid/recordio/chunk.cc @@ -14,13 +14,13 @@ #include "paddle/fluid/recordio/chunk.h" +#include #include #include #include #include "paddle/fluid/platform/enforce.h" -#include "snappy_stream/include/snappystream.hpp" -#include "zlib/include/zlib.h" +#include "snappystream.hpp" namespace paddle { namespace recordio { diff --git a/paddle/fluid/recordio/header.cc b/paddle/fluid/recordio/header.cc index ed09d58f6a..c4822329a4 100644 --- a/paddle/fluid/recordio/header.cc +++ b/paddle/fluid/recordio/header.cc @@ -13,6 +13,9 @@ // limitations under the License. #include "paddle/fluid/recordio/header.h" + +#include + #include "paddle/fluid/platform/enforce.h" namespace paddle { diff --git a/python/paddle/fluid/tests/unittests/test_batch_norm_op.py b/python/paddle/fluid/tests/unittests/test_batch_norm_op.py index 10aa63e18a..7ecf9a1459 100644 --- a/python/paddle/fluid/tests/unittests/test_batch_norm_op.py +++ b/python/paddle/fluid/tests/unittests/test_batch_norm_op.py @@ -14,23 +14,13 @@ import unittest import numpy as np -from op_test import OpTest import paddle.fluid.core as core from paddle.fluid.op import Operator +import paddle.fluid as fluid +from op_test import OpTest from paddle.fluid.framework import grad_var_name -def get_backward_op(scope, op, no_grad_set): - backward_op = core.Operator.backward(op, no_grad_set) - for input in backward_op.input_vars(): - var = scope.var(input) - var.get_tensor() - for output in backward_op.output_vars(): - var = scope.var(output) - var.get_tensor() - return backward_op - - def _reference_testing(x, scale, offset, mean, var, epsilon, data_format): x_shape = x.shape if len(x_shape) == 2: @@ -64,11 +54,6 @@ def _reference_testing(x, scale, offset, mean, var, epsilon, data_format): def _reference_training(x, scale, offset, epsilon, data_format): x_shape = x.shape - if len(x_shape) == 2: - if data_format == "NCHW": - x = np.reshape(x, (x.shape[0], x.shape[1], 1, 1)) - else: - x = np.reshape(x, (x.shape[0], 1, 1, x.shape[1])) if data_format == "NCHW": n, c, h, w = x.shape @@ -88,8 +73,6 @@ def _reference_training(x, scale, offset, epsilon, data_format): offset_tile = np.reshape(offset, (1, c, 1, 1)) offset_tile = np.reshape(offset_tile, (1, c, 1, 1)) y = normalized * scale_tile + offset_tile - if len(x_shape) == 2: - y = np.reshape(y, (y.shape[0], y.shape[1])) return y, mean, var elif data_format == "NHWC": x_square = x * x @@ -100,59 +83,42 @@ def _reference_training(x, scale, offset, epsilon, data_format): var = x_square_sum / element_count - mean * mean normalized = (x - mean) / np.sqrt(var + epsilon) y = normalized * scale + offset - if len(x_shape) == 2: - y = np.reshape(y, x_shape) return y, mean, var else: raise ValueError("Unknown data order.") -def _reference_grad(x, grad_y, scale, mean, var, epsilon, data_format): +def _reference_grad(x, y_grad, scale, mean, var, epsilon, data_format): # Use the following formulas to calculate gradients: # grad_scale = # sum(grad_y * (x - mean)) * rsqrt(var + epsilon) # # grad_offset = sum(output_y) # - # grad_x = + # x_grad = # 1/N * scale * rsqrt(var + epsilon) * (N * grad_y - sum(grad_y) - # (x - mean) * sum(grad_y * (x - mean)) / (var + epsilon)) # transfer from (N, C, H, W) to (N, H, W, C) to simplify computation - x_shape = x.shape - - if len(x_shape) == 2: - if data_format == "NCHW": - x = np.reshape(x, (x.shape[0], x.shape[1], 1, 1)) - grad_y = np.reshape(grad_y, - (grad_y.shape[0], grad_y.shape[1], 1, 1)) - else: - x = np.reshape(x, (x.shape[0], 1, 1, x.shape[1])) - grad_y = np.reshape(grad_y, - (grad_y.shape[0], 1, 1, grad_y.shape[1])) - if data_format == "NCHW": x = np.transpose(x, (0, 2, 3, 1)) - grad_y = np.transpose(grad_y, (0, 2, 3, 1)) + y_grad = np.transpose(y_grad, (0, 2, 3, 1)) - # raise ValueError("data_format must be NHWC, got %s." % data_format) - grad_x = scale * (grad_y - np.mean( - grad_y, axis=(0, 1, 2)) - (x - mean) * np.mean( - grad_y * (x - mean), axis=(0, 1, 2)) / + x_grad = scale * (y_grad - np.mean( + y_grad, axis=(0, 1, 2)) - (x - mean) * np.mean( + y_grad * (x - mean), axis=(0, 1, 2)) / (var + epsilon)) / np.sqrt(var + epsilon) - grad_scale = np.sum(grad_y * (x - mean) / np.sqrt(var + epsilon), + grad_scale = np.sum(y_grad * (x - mean) / np.sqrt(var + epsilon), axis=(0, 1, 2)) - grad_offset = np.sum(grad_y, axis=(0, 1, 2)) + grad_offset = np.sum(y_grad, axis=(0, 1, 2)) # transfer back to N, C, H, W if data_format == "NCHW": - grad_x = np.transpose(grad_x, (0, 3, 1, 2)) + x_grad = np.transpose(x_grad, (0, 3, 1, 2)) x = np.transpose(x, (0, 3, 1, 2)) - grad_y = np.transpose(grad_y, (0, 3, 1, 2)) + y_grad = np.transpose(y_grad, (0, 3, 1, 2)) - if len(x_shape) == 2: - grad_x = np.reshape(grad_x, x_shape) - return grad_x, grad_scale, grad_offset + return x_grad, grad_scale, grad_offset def create_or_get_tensor(scope, var_name, var, place): @@ -186,7 +152,7 @@ def set_output_grad(scope, outputs, place, feed_dict=None): __set_tensor__(output, data) -class TestBatchNormOpInference(OpTest): +class TestBatchNormOpInference(unittest.TestCase): def setUp(self): self.dtype = np.float32 @@ -304,231 +270,121 @@ class TestFP16BatchNormOpInference(TestBatchNormOpInference): self.check_with_place(place, data_format, self.dtype, [2, 3]) -class TestBatchNormOpTraining(OpTest): +class TestBatchNormOpTraining(unittest.TestCase): def __assert_close(self, tensor, np_array, msg, atol=1e-4): + if not np.allclose(np.array(tensor), np_array, atol=atol): + import pdb + pdb.set_trace() self.assertTrue(np.allclose(np.array(tensor), np_array, atol=atol), msg) - def test_python_testing(self): - data_format = "NHWC" - epsilon = 0.00001 - - n, h, w, c = 2, 3, 4, 5 - x_shape = [n, h, w, c] - scale_shape = [c] - - x_val = np.random.random_sample(x_shape).astype(np.float32) - scale_val = np.random.random_sample(scale_shape).astype(np.float32) - bias_val = np.random.random_sample(scale_shape).astype(np.float32) - - mean = np.zeros(scale_shape).astype(np.float32) - variance = np.ones(scale_shape).astype(np.float32) - - y_out = _reference_testing(x_val, scale_val, bias_val, mean, variance, - epsilon, "NHWC") - - # running N, C, H, W case - # should produce the same results - x_shape2 = [n, c, h, w] - x_val2 = np.transpose(x_val, (0, 3, 1, 2)) - y_out2 = _reference_testing(x_val2, scale_val, bias_val, mean, variance, - epsilon, "NCHW") - - # transfer (N, C, H, W) back to (N, H, W, C) - y_out2_trans = np.transpose(y_out2, (0, 2, 3, 1)) - self.__assert_close(y_out, y_out2_trans, "inference output") - print 'python: NHWC, NCHW, inference checking passed' - - def test_python_training(self): - data_format = "NHWC" - epsilon = 0.00001 - momentum = 0.9 - - # N, H, W, C: 2, 3, 4, 2 - n, h, w, c = 2, 3, 4, 5 - x_shape = [n, h, w, c] - scale_shape = [c] - - x_val = np.random.random_sample(x_shape).astype(np.float32) - scale_val = np.random.random_sample(scale_shape).astype(np.float32) - bias_val = np.random.random_sample(scale_shape).astype(np.float32) - - mean = np.zeros(scale_shape).astype(np.float32) - variance = np.ones(scale_shape).astype(np.float32) - - # run forward - y_out, saved_mean, var_ref = _reference_training( - x_val, scale_val, bias_val, epsilon, "NHWC") - - # - mean_out = saved_mean * (1. - momentum) + momentum * mean - variance_out = var_ref * (1. - momentum) + momentum * variance - saved_variance = 1. / np.sqrt(var_ref + epsilon) - - # running N, C, H, W case - # should produce the same results - x_shape2 = [n, c, h, w] - x_val2 = np.transpose(x_val, (0, 3, 1, 2)) - y_out2, saved_mean2, var_ref2 = _reference_training( - x_val2, scale_val, bias_val, epsilon, "NCHW") - - self.__assert_close(saved_mean, saved_mean2, "batch mean") - self.__assert_close(var_ref, var_ref2, "batch variance") - - # transfer (N, C, H, W) back to (N, H, W, C) - y_out2_trans = np.transpose(y_out2, (0, 2, 3, 1)) - self.__assert_close(y_out, y_out2_trans, "batch output") - print 'python: NHWC, NCHW, forward checking passed' - - # test backward now - # NHWC - self.y_grad = np.random.random_sample(x_shape).astype(np.float32) - y_grad = self.y_grad - # y_grad = np.ones(x_shape).astype(np.float32) - x_grad_ref, scale_grad_ref, bias_grad_ref = _reference_grad( - x_val, y_grad, scale_val, saved_mean, var_ref, epsilon, "NHWC") - - # NCHW - y_grad2 = np.transpose(y_grad, (0, 3, 1, 2)) - # y_grad2 = np.ones(x_shape2).astype(np.float32) - x_grad_ref2, scale_grad_ref2, bias_grad_ref2 = _reference_grad( - x_val2, y_grad2, scale_val, saved_mean2, var_ref2, epsilon, "NCHW") - - self.__assert_close(scale_grad_ref, scale_grad_ref2, "scale gradient") - self.__assert_close(bias_grad_ref, bias_grad_ref2, "bias gradient") - - x_grad_transpose = np.transpose(x_grad_ref2, (0, 2, 3, 1)) - self.__assert_close(x_grad_ref, x_grad_transpose, "x gradient") - print 'python: NHWC, NCHW, backward checking passed' - def test_forward_backward(self): def test_with_place(place, data_layout, shape): # attr epsilon = 0.00001 momentum = 0.9 - - if len(shape) == 2: - x_shape = shape - c = shape[1] + if data_layout == "NCHW": + n, c, h, w = shape[0], shape[1], shape[2], shape[3] else: - # n, h, w, c = 2, 3, 4, 2 n, h, w, c = shape[0], shape[1], shape[2], shape[3] - if data_format == "NHWC": - x_shape = [n, h, w, c] - elif data_format == "NCHW": - x_shape = [n, c, h, w] - else: - raise ValueError("Unknown data type.") scale_shape = [c] - x_val = np.random.random_sample(x_shape).astype(np.float32) - scale_val = np.random.random_sample(scale_shape).astype(np.float32) - bias_val = np.random.random_sample(scale_shape).astype(np.float32) - + np.random.seed(123) + x = np.random.random_sample(shape).astype(np.float32) + scale = np.random.random_sample(scale_shape).astype(np.float32) + bias = np.random.random_sample(scale_shape).astype(np.float32) mean = np.zeros(scale_shape).astype(np.float32) variance = np.ones(scale_shape).astype(np.float32) # run forward - y_out, saved_mean, var_ref = _reference_training( - x_val, scale_val, bias_val, epsilon, data_format) - - # update moving mean and variance + y, saved_mean, var_ref = _reference_training(x, scale, bias, + epsilon, data_layout) mean_out = saved_mean * (1. - momentum) + momentum * mean variance_out = var_ref * (1. - momentum) + momentum * variance saved_variance = 1. / np.sqrt(var_ref + epsilon) - - # for gradient test - # y_grad = np.ones(x_shape).astype(np.float32) - y_grad = np.zeros(x_shape).astype(np.float32) - if len(y_grad.shape) == 2: - y_grad[0, 0] = 1. - else: - y_grad[0, 0, 0, 0] = 1. - # y_grad = np.random.random_sample(x_shape).astype(np.float32) - x_grad_ref, scale_grad_ref, bias_grad_ref = _reference_grad( - x_val, y_grad, scale_val, saved_mean, var_ref, epsilon, - data_format) - - scope = core.Scope() - - # create input - x_tensor = create_or_get_tensor(scope, "x_val", x_val, place) - scale_tensor = create_or_get_tensor(scope, "scale_val", scale_val, - place) - bias_tensor = create_or_get_tensor(scope, "bias_val", bias_val, - place) - mean_tensor = create_or_get_tensor(scope, "mean", mean, place) - variance_tensor = create_or_get_tensor(scope, "variance", variance, - place) - - # create output - y_tensor = create_or_get_tensor(scope, "y_out", None, place) - saved_mean_tensor = create_or_get_tensor(scope, "saved_mean", None, - place) - saved_variance_tensor = create_or_get_tensor( - scope, "saved_variance", None, place) - mean_out_tensor = mean_tensor - variance_out_tensor = variance_tensor - - batch_norm_op = Operator( - "batch_norm", - # inputs - X="x_val", - Scale="scale_val", - Bias="bias_val", - Mean="mean", - Variance="variance", - # outputs - Y="y_out", - MeanOut="mean", - VarianceOut="variance", - SavedMean="saved_mean", - SavedVariance="saved_variance", - # attrs - is_test=False, - data_layout=data_layout, - momentum=momentum, - epsilon=epsilon) - - batch_norm_op.run(scope, place) - - # check forward result - self.__assert_close(y_tensor, y_out, "y_out") - self.__assert_close(saved_mean_tensor, saved_mean, "saved_mean") - self.__assert_close(saved_variance_tensor, saved_variance, - "saved_variance") - self.__assert_close(mean_out_tensor, mean_out, "mean_out") - if isinstance(place, core.CUDAPlace): - atol = 5e-2 - else: - atol = 1e-4 - self.__assert_close(variance_out_tensor, variance_out, - "variance_out", atol) - print "op test forward passed: ", str(place), data_layout - # run backward - batch_norm_op_grad = get_backward_op(scope, batch_norm_op, set()) - set_output_grad( - scope, - ["y_out", "mean", "variance", "saved_mean", "saved_variance"], - place, - feed_dict={"y_out": y_grad}) - batch_norm_op_grad.run(scope, place) - - x_grad_tensor = create_or_get_tensor(scope, - grad_var_name("x_val"), None, - place) - scale_grad_tensor = create_or_get_tensor(scope, - grad_var_name("scale_val"), - None, place) - bias_grad_tensor = create_or_get_tensor(scope, - grad_var_name("bias_val"), - None, place) + y_grad = np.random.random_sample(shape).astype(np.float32) + x_grad, scale_grad, bias_grad = _reference_grad( + x, y_grad, scale, saved_mean, var_ref, epsilon, data_format) + + var_dict = locals() + var_dict['y@GRAD'] = y_grad + + var_names = [ + 'x', 'scale', 'bias', 'mean', 'variance', 'y', 'saved_mean', + 'saved_variance' + ] + ground_truth = {name: var_dict[name] for name in var_names} + + program = fluid.Program() + with fluid.program_guard(program): + block = program.global_block() + for name in ground_truth: + block.create_var( + name=name, + dtype='float32', + shape=ground_truth[name].shape) + bn_op = block.append_op( + type="batch_norm", + inputs={ + "X": block.var('x'), + "Scale": block.var('scale'), + "Bias": block.var('bias'), + "Mean": block.var('mean'), + "Variance": block.var('variance') + }, + outputs={ + "Y": block.var('y'), + "MeanOut": block.var('mean'), # share the same memory + "VarianceOut": + block.var('variance'), # share the same memory + "SavedMean": block.var('saved_mean'), + "SavedVariance": block.var('saved_variance') + }, + attrs={ + "momentum": momentum, + "epsilon": epsilon, + "is_test": False, + "data_layout": data_layout + }) + block.create_var(name='y@GRAD', dtype='float32', shape=y.shape) + + # generate backward op_desc + grad_op_desc_list, op_grad_to_var = core.get_grad_op_desc( + bn_op.desc, set(), []) + grad_op_desc = grad_op_desc_list[0] + new_op_desc = block.desc.append_op() + new_op_desc.copy_from(grad_op_desc) + for var_name in grad_op_desc.output_arg_names(): + block.desc.var(var_name.encode("ascii")) + grad_op_desc.infer_var_type(block.desc) + grad_op_desc.infer_shape(block.desc) + for arg in grad_op_desc.output_arg_names(): + grad_var = block.desc.find_var(arg.encode("ascii")) + grad_var.set_dtype(core.VarDesc.VarType.FP32) + + exe = fluid.Executor(place) + out = exe.run( + program, + feed={ + name: var_dict[name] + for name in + ['x', 'scale', 'bias', 'mean', 'variance', 'y@GRAD'] + }, + fetch_list=[ + 'y', 'mean', 'variance', 'saved_mean', 'saved_variance', + 'x@GRAD', 'scale@GRAD', 'bias@GRAD' + ]) + + self.__assert_close(y, out[0], "y") + self.__assert_close(mean_out, out[1], "mean") + self.__assert_close(variance_out, out[2], "variance", 1e-3) + self.__assert_close(saved_mean, out[3], "saved_mean") + self.__assert_close(saved_variance, out[4], "saved_variance", 1e-3) + self.__assert_close(x_grad, out[5], "x_grad") + self.__assert_close(scale_grad, out[6], "scale_grad") + self.__assert_close(bias_grad, out[7], "bias_grad") - # check gradient output - self.__assert_close(x_grad_tensor, x_grad_ref, "x_grad") - self.__assert_close(scale_grad_tensor, scale_grad_ref, "scale_grad") - self.__assert_close(bias_grad_tensor, bias_grad_ref, "bias_grad") - print "op test backward passed: ", str(place), data_layout + print "op test forward passed: ", str(place), data_layout places = [core.CPUPlace()] if core.is_compiled_with_cuda() and core.op_support_gpu("batch_norm"): @@ -537,7 +393,6 @@ class TestBatchNormOpTraining(OpTest): for place in places: for data_format in ["NCHW", "NHWC"]: test_with_place(place, data_format, [2, 3, 4, 5]) - test_with_place(place, data_format, [2, 3]) if __name__ == '__main__': diff --git a/python/paddle/fluid/tests/unittests/test_cond_op.py b/python/paddle/fluid/tests/unittests/test_cond_op.py deleted file mode 100644 index 66fbae961a..0000000000 --- a/python/paddle/fluid/tests/unittests/test_cond_op.py +++ /dev/null @@ -1,128 +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. - -import logging -import paddle.fluid.core as core -import unittest -import numpy as np -from paddle.fluid.op import Operator, CondOp - - -class PySimpleCond(object): - ''' - A simple implementation of dynamic if-else based on numpy - ''' - - def __init__(self): - array = [1] * 10 - for i in range(1, 10, 2): - array[i] = 0 - self.cond = np.array(array) - self.x = np.ones(shape=(10, 1)).astype("float32") - - def forward(self): - self.index_t = np.where(self.cond == 1) - self.index_f = np.where(self.cond == 0) - y_t = self.x[self.index_t] - y_f = self.x[self.index_f] - y_t = y_t * 2. - y_f = y_f * (-2.) - output = np.zeros(shape=(10, 1)) - output[self.index_t] = y_t - output[self.index_f] = y_f - return output - - -class PySimpleCondTest(unittest.TestCase): - def setUp(self): - self.condnn = PySimpleCond() - - def test_forward(self): - output = self.condnn.forward() - - -def create_tensor(scope, name, shape, np_data): - tensor = scope.var(name).get_tensor() - tensor.set_dims(shape) - tensor.set(np_data, core.CPUPlace()) - return tensor - - -class TestCondOp(unittest.TestCase): - ''' - Test CondOp - - equation: - cond = [True, False, True, False, ...] - y[index_t] = x[index_t] * 2. - y[index_f] = x[index_f] * -2. - outputs: - y - ''' - - def setUp(self): - self.py_cond = PySimpleCond() - - def forward(self): - self.scope = core.Scope() - self.create_global_variables() - self.create_cond_op() - self.create_sub_net() - self.condop.run(self.scope, core.CPUPlace()) - return np.array(self.scope.find_var("Out").get_tensor()) - - def create_global_variables(self): - x_np_data = self.py_cond.x - create_tensor(self.scope, "X", [10, 1], x_np_data) - cond_np_data = self.py_cond.cond.astype("int32") - create_tensor(self.scope, "cond", [10, 1], cond_np_data) - self.scope.var("SubScopes") - self.scope.var("IndexTensors") - self.scope.var("Out") - - def create_cond_op(self): - self.condop = CondOp( - Cond="cond", - Xs=["X"], - Outs=["Out"], - SubScopes="SubScopes", - IndexTensors="IndexTensors") - - def create_sub_net(self): - truenet = core.Net.create() - scale_op_t = Operator("scale", X='X', Out='Out', scale=2.) - truenet.append_op(scale_op_t) - truenet.complete_add_op(True) - self.condop.set_truenet(truenet) - - falsenet = core.Net.create() - scale_op_t = Operator("scale", X='X', Out='Out', scale=-2.) - falsenet.append_op(scale_op_t) - falsenet.complete_add_op(True) - self.condop.set_falsenet(falsenet) - - def test_forward(self): - print 'test cond op forward' - pd_output = self.forward() - py_output = self.py_cond.forward() - print 'pd_output', pd_output - print - print 'py_output', py_output - self.assertEqual(pd_output.shape, py_output.shape) - print 'test passed' - return 0 - - -if __name__ == "__main__": - unittest.main() diff --git a/python/paddle/fluid/tests/unittests/test_layer_norm_op.py b/python/paddle/fluid/tests/unittests/test_layer_norm_op.py index 8c67e45b7f..69365db4d1 100644 --- a/python/paddle/fluid/tests/unittests/test_layer_norm_op.py +++ b/python/paddle/fluid/tests/unittests/test_layer_norm_op.py @@ -15,10 +15,8 @@ import unittest import numpy as np from operator import mul -from op_test import OpTest import paddle.fluid.core as core -from paddle.fluid.op import Operator -from paddle.fluid.framework import grad_var_name +import paddle.fluid as fluid np.random.random(123) @@ -70,161 +68,93 @@ def _reference_layer_norm_grad(x, grad_y, scale, mean, var, begin_norm_axis=1): return grad_x, d_scale, d_bias -def get_backward_op(scope, op, no_grad_set): - backward_op = core.Operator.backward(op, no_grad_set) - for input in backward_op.input_vars(): - var = scope.var(input) - var.get_tensor() - for output in backward_op.output_vars(): - var = scope.var(output) - var.get_tensor() - return backward_op - - -def create_or_get_tensor(scope, var_name, var, place): - tensor = scope.var(var_name).get_tensor() - if var is not None: - assert isinstance(var, np.ndarray) - tensor.set_lod([[]]) - tensor.set_dims(var.shape) - tensor.set(var, place) - return tensor - - -def set_output_grad(scope, outputs, place, feed_dict=None): - def __set_tensor__(name, data=None): - out_tensor = scope.find_var(name).get_tensor() - grad_tensor = scope.var(grad_var_name(name)).get_tensor() - out_dtype = out_tensor.dtype() - if data is None: - if out_dtype == core.VarDesc.VarType.FP64: - data = np.ones(out_tensor.shape(), dtype=np.float64) - elif out_dtype == core.VarDesc.VarType.FP32: - data = np.ones(out_tensor.shape(), dtype=np.float32) - else: - raise ValueError("Not supported data type " + str(out_dtype)) - grad_tensor.set(data, place) - - for output in outputs: - data = None - if output in feed_dict: - data = feed_dict[output] - __set_tensor__(output, data) - - -class TestLayerNormdOp(OpTest): +class TestLayerNormdOp(unittest.TestCase): def __assert_close(self, tensor, np_array, msg, atol=1e-4): self.assertTrue(np.allclose(np.array(tensor), np_array, atol=atol), msg) - def __assert_grad_close(self, - tensor, - np_array, - name, - place, - max_relative_error=0.02): - a = np.array(tensor) - b = np_array - abs_a = np.abs(a) - abs_a[abs_a < 1e-5] = 1 - - diff_mat = np.abs(a - b) / abs_a - max_diff = np.max(diff_mat) - - def err_msg(): - offset = np.argmax(diff_mat > max_relative_error) - return ("%s Variable %s max gradient diff %f over limit %f, " - "the first error element is %d, %f, %f") % ( - "Gradient Check On %s" % str(place), name, max_diff, - max_relative_error, offset, a.flatten()[offset], - b.flatten()[offset]) - - self.assertLessEqual(max_diff, max_relative_error, err_msg()) - def check_forward_backward(self, shape, begin_norm_axis): - def test_with_place(place, shape, begin_norm_axis=1): - # setUp - assert begin_norm_axis > 0 and begin_norm_axis < len( - shape), 'begin_norm_axis must be between 0 and len(shape)-1.' + def test_with_place(place, shape, begin_norm_axis): # attr epsilon = 0.00001 x_shape = shape D = reduce(mul, x_shape[begin_norm_axis:len(x_shape)], 1) scale_shape = [D] - x_val = np.random.random_sample(x_shape).astype(np.float32) - scale_val = np.random.random_sample(scale_shape).astype(np.float32) - bias_val = np.random.random_sample(scale_shape).astype(np.float32) + np.random.seed(123) + x = np.random.random_sample(x_shape).astype(np.float32) + scale = np.random.random_sample(scale_shape).astype(np.float32) + bias = np.random.random_sample(scale_shape).astype(np.float32) y_grad = np.random.random_sample(x_shape).astype(np.float32) - # run forward - y_out, saved_mean, var_ref = _reference_layer_norm_naive( - x_val, scale_val, bias_val, epsilon, begin_norm_axis) - naive_fw = {"Y": y_out, "Mean": saved_mean, "Variance": var_ref} - - # get gradient - x_grad_ref, scale_grad_ref, bias_grad_ref = _reference_layer_norm_grad( - x_val, y_grad, scale_val, saved_mean, var_ref, begin_norm_axis) - naive_grad = { - "X": x_grad_ref, - "Scale": scale_grad_ref, - "Bias": bias_grad_ref - } - - scope = core.Scope() - - # create input - input_map = {"X": x_val, "Scale": scale_val, "Bias": bias_val} - for i_name in input_map: - create_or_get_tensor(scope, i_name, input_map[i_name], place) - - # create output - output_map = {"Y": None, "Mean": None, "Variance": None} - output_tensor = {} - for o_name in output_map: - output_tensor[o_name] = create_or_get_tensor( - scope, o_name, output_map[o_name], place) - - layer_norm_op = Operator( - "layer_norm", - # inputs - X="X", - Scale="Scale", - Bias="Bias", - # outputs - Y="Y", - Mean="Mean", - Variance="Variance", - # attrs - epsilon=epsilon, - begin_norm_axis=begin_norm_axis) - - layer_norm_op.run(scope, place) - - # check forward result - atol = 5e-2 if isinstance(place, core.CUDAPlace) else 1e-4 - for o_tensor in output_tensor: - self.__assert_close(output_tensor[o_tensor], naive_fw[o_tensor], - o_tensor, atol) - - # run backward - layer_norm_op_grad = get_backward_op(scope, layer_norm_op, set()) - set_output_grad( - scope, ["Y", "Mean", "Variance"], - place, - feed_dict={"Y": y_grad}) - layer_norm_op_grad.run(scope, place) - - # get output - grad_tensor = {} - for o_name in naive_grad: - grad_tensor[o_name] = x_ = create_or_get_tensor( - scope, grad_var_name(o_name), None, place) - - # check gradient output - for o_grad in naive_grad: - self.__assert_grad_close(grad_tensor[o_grad], - naive_grad[o_grad], o_grad + "@GRAD", - place) + # reference forward & backward + y, mean, variance = _reference_layer_norm_naive( + x, scale, bias, epsilon, begin_norm_axis) + x_grad, scale_grad, bias_grad = _reference_layer_norm_grad( + x, y_grad, scale, mean, variance, begin_norm_axis) + + var_dict = locals() + var_dict['y@GRAD'] = y_grad + var_names = [ + 'x', 'scale', 'bias', 'mean', 'variance', 'y', 'y@GRAD' + ] + ground_truth = {name: var_dict[name] for name in var_names} + + program = fluid.Program() + with fluid.program_guard(program): + block = program.global_block() + for name in ground_truth: + block.create_var( + name=name, + dtype='float32', + shape=ground_truth[name].shape) + layer_norm_op = block.append_op( + type="layer_norm", + inputs={ + "X": block.var('x'), + "Scale": block.var('scale'), + "Bias": block.var('bias'), + }, + outputs={ + "Y": block.var('y'), + "Mean": block.var('mean'), # share the same memory + "Variance": + block.var('variance'), # share the same memory + }, + attrs={ + "epsilon": epsilon, + "begin_norm_axis": begin_norm_axis + }) + + # generate backward op_desc + grad_op_desc_list, op_grad_to_var = core.get_grad_op_desc( + layer_norm_op.desc, set(), []) + grad_op_desc = grad_op_desc_list[0] + new_op_desc = block.desc.append_op() + new_op_desc.copy_from(grad_op_desc) + for var_name in grad_op_desc.output_arg_names(): + block.desc.var(var_name.encode("ascii")) + grad_op_desc.infer_var_type(block.desc) + grad_op_desc.infer_shape(block.desc) + for arg in grad_op_desc.output_arg_names(): + grad_var = block.desc.find_var(arg.encode("ascii")) + grad_var.set_dtype(core.VarDesc.VarType.FP32) + + exe = fluid.Executor(place) + out = exe.run(program, + feed={ + name: var_dict[name] + for name in ['x', 'scale', 'bias', 'y@GRAD'] + }, + fetch_list=[ + 'y', 'mean', 'variance', 'x@GRAD', + 'scale@GRAD', 'bias@GRAD' + ]) + self.__assert_close(y, out[0], "y") + self.__assert_close(mean, out[1], "mean") + self.__assert_close(variance, out[2], "variance", 1e-3) + self.__assert_close(x_grad, out[3], "x_grad") + self.__assert_close(scale_grad, out[4], "scale_grad", 1e-3) + self.__assert_close(bias_grad, out[5], "bias_grad") places = [core.CPUPlace()] if core.is_compiled_with_cuda() and core.op_support_gpu("layer_norm"): @@ -237,15 +167,6 @@ class TestLayerNormdOp(OpTest): self.check_forward_backward(shape=[2, 3, 4, 5], begin_norm_axis=1) self.check_forward_backward(shape=[2, 3, 4, 5], begin_norm_axis=3) - def test_check_forward_backward_with_scale(self): - pass # TODO(zcd) - - def test_check_forward_backward_with_bias(self): - pass # TODO(zcd) - - def test_check_forward_backward(self): - pass # TODO(zcd) - if __name__ == '__main__': unittest.main() diff --git a/python/paddle/fluid/tests/unittests/test_net.py b/python/paddle/fluid/tests/unittests/test_net.py deleted file mode 100644 index ae1699d647..0000000000 --- a/python/paddle/fluid/tests/unittests/test_net.py +++ /dev/null @@ -1,53 +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. - -import paddle.fluid.core as core -from paddle.fluid.op import Operator -import unittest - - -def fc(X, W, Y): - ret_v = core.Net.create() - - ret_v.append_op(Operator("mul", X="X", Y="W", Out="pre_activation")) - ret_v.append_op(Operator("sigmoid", X="pre_activation", Out=Y)) - ret_v.complete_add_op(True) - return ret_v - - -class TestNet(unittest.TestCase): - def test_net_all(self): - net = core.Net.create() - op1 = Operator("sum", X=["X", "Y"], Out="Out") - net.append_op(op1) - - net2 = core.Net.create() - net2.append_op(fc(X="X", W="w", Y="fc.out")) - net2.complete_add_op(True) - net.append_op(net2) - net.complete_add_op(True) - - expected = ''' -Op(plain_net), inputs:{all[W, X, Y]}, outputs:{all[Out, fc.out, pre_activation]}. - Op(sum), inputs:{X[X, Y]}, outputs:{Out[Out]}. - Op(plain_net), inputs:{all[W, X]}, outputs:{all[fc.out, pre_activation]}. - Op(plain_net), inputs:{all[W, X]}, outputs:{all[fc.out, pre_activation]}. - Op(mul), inputs:{X[X], Y[W]}, outputs:{Out[pre_activation]}. - Op(sigmoid), inputs:{X[pre_activation]}, outputs:{Out[fc.out]}. -''' - self.assertEqual(expected, "\n" + str(net)) - - -if __name__ == "__main__": - unittest.main() From a64edbf14e9c2f499a0dbb34417c50b8ded67c58 Mon Sep 17 00:00:00 2001 From: "Yang Yang(Tony)" Date: Wed, 11 Apr 2018 14:55:13 -0700 Subject: [PATCH 093/164] delete backward.cc related code on the python side (#9854) --- paddle/fluid/framework/CMakeLists.txt | 3 +- paddle/fluid/framework/backward.cc | 472 ------------------ paddle/fluid/framework/backward.h | 56 --- paddle/fluid/pybind/CMakeLists.txt | 4 +- paddle/fluid/pybind/protobuf.cc | 18 - paddle/fluid/pybind/pybind.cc | 6 - python/paddle/fluid/framework.py | 18 - .../fluid/tests/unittests/test_layers.py | 3 - .../fluid/tests/unittests/test_program.py | 51 -- 9 files changed, 3 insertions(+), 628 deletions(-) delete mode 100644 paddle/fluid/framework/backward.cc delete mode 100644 paddle/fluid/framework/backward.h diff --git a/paddle/fluid/framework/CMakeLists.txt b/paddle/fluid/framework/CMakeLists.txt index 77f459b4dd..1f3ca24df1 100644 --- a/paddle/fluid/framework/CMakeLists.txt +++ b/paddle/fluid/framework/CMakeLists.txt @@ -79,13 +79,12 @@ add_custom_command(TARGET framework_py_proto POST_BUILD COMMENT "Copy generated python proto into directory paddle/fluid/proto." WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -cc_library(backward SRCS backward.cc DEPS operator) cc_library(lod_rank_table SRCS lod_rank_table.cc DEPS lod_tensor) cc_library(feed_fetch_method SRCS feed_fetch_method.cc DEPS lod_tensor scope glog) cc_library(executor SRCS executor.cc DEPS op_registry device_context scope -framework_proto backward glog lod_rank_table feed_fetch_method) +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) diff --git a/paddle/fluid/framework/backward.cc b/paddle/fluid/framework/backward.cc deleted file mode 100644 index 76133b5136..0000000000 --- a/paddle/fluid/framework/backward.cc +++ /dev/null @@ -1,472 +0,0 @@ -/* 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/framework/backward.h" - -#include -#include -#include -#include - -#include "paddle/fluid/framework/block_desc.h" -#include "paddle/fluid/framework/op_registry.h" - -namespace paddle { -namespace framework { - -static std::unordered_set* g_ctrl_flow_ops_ = nullptr; -// Control Flow operators's backward is significantly different from -// computational operators. Hack Code here. -// We should design a better way to backward CtrlFlowOps. -static std::unordered_set& CtrlFlowOps() { - if (g_ctrl_flow_ops_ == nullptr) { - g_ctrl_flow_ops_ = new std::unordered_set{ - "increment", "lod_rank_table", "less_than"}; - } - return *g_ctrl_flow_ops_; -} - -static inline std::unique_ptr CreateGradOp( - const OperatorBase& op, const std::unordered_set& no_grad_set, - std::unordered_map* grad_to_var) { - OpDesc op_desc; - op_desc.SetInputMap(op.Inputs()); - op_desc.SetOutputMap(op.Outputs()); - op_desc.SetType(op.Type()); - op_desc.SetAttrMap(op.Attrs()); - auto& info = OpInfoMap::Instance().Get(op.Type()); - auto grad_descs = info.GradOpMaker()(op_desc, no_grad_set, grad_to_var, {}); - std::vector> grad_ops; - grad_ops.reserve(grad_descs.size()); - std::transform(grad_descs.begin(), grad_descs.end(), - std::back_inserter(grad_ops), - [](const std::unique_ptr& grad_desc) { - return OpRegistry::CreateOp(*grad_desc); - }); - PADDLE_ENFORCE(!grad_ops.empty()); - if (grad_ops.size() == 1) { - return std::move(grad_ops[0]); - } else { - PADDLE_THROW("Unexpected Branch"); - } -} - -template -static void ForEachVarName(const Map& names, T callback) { - for (auto& name : names) { - for (auto& n : name.second) { - if (callback(n)) return; - } - } -} - -// return whether all the names + suffixes in the set -static bool AllInSet( - const std::map>& names, - const std::string& suffix, const std::unordered_set& set) { - bool all_in_set = true; - ForEachVarName(names, [&all_in_set, &set, &suffix](const std::string& n) { - all_in_set = set.find(n + suffix) != set.end(); - return !all_in_set; - }); - return all_in_set; -} - -static std::unique_ptr NOP() { - PADDLE_THROW("Unexpected Branch"); -} - -// Get backward operator from a forward operator, a recursive implementation. -// -// no_grad_names the gradient variable names without gradient calculating. -// -// uniq_id is a unique index used inside recursively calling -// BackwardRecursive. use `uid = uniq_id++;` to get the unique index, and -// pass `uniq_id` through recursive calling. -// -// returns The backward operator. In a simple situation, it may be a simple -// operator, in a complex situation, it maybe a NetOp. -// -// See Backward.h for details -static std::unique_ptr BackwardRecursive( - const OperatorBase& forwardOp, - std::unordered_set& no_grad_names, - std::unordered_map* grad_to_var, - size_t& uniq_id) { - // If all input gradients of forwarding operator do not need to calculate, - // just return an NOP. Not return null ptr because NOP does not take - // too much time for calculation, but it is useful for simplifying logic. - if (AllInSet(forwardOp.Inputs() /*names*/, kGradVarSuffix /*suffix*/, - no_grad_names /*set*/)) { - return NOP(); - } - - // All output gradients of forwarding operator do not need to calculate. - // Then all input gradients cannot be computed at all, and we put them into - // `no_grad_names` set. Return an NOP. - if (AllInSet(forwardOp.Outputs() /*names*/, kGradVarSuffix /*suffix*/, - no_grad_names /*set*/)) { - ForEachVarName(forwardOp.Inputs(), - [&no_grad_names](const std::string& name) -> bool { - no_grad_names.insert(GradVarName(name)); - return false; - }); - return NOP(); - } - - // Returned gradient network - PADDLE_THROW("Unexpected Branch"); -} - -// See header for comments -std::unique_ptr Backward( - const OperatorBase& forwardOp, - const std::unordered_set& no_grad_vars) { - std::unordered_set no_grad_names; - no_grad_names.reserve(no_grad_vars.size() + 1); - - no_grad_names.insert(std::string(kEmptyVarName) + kGradVarSuffix); - - for (auto& name : no_grad_vars) { - no_grad_names.insert(name + kGradVarSuffix); - } - size_t uid = 0; - std::unordered_map grad_to_var; - return BackwardRecursive(forwardOp, no_grad_names, &grad_to_var, uid); -} - -// ==================================== // - -static bool AllGradInSet(const std::vector& names, - const std::unordered_set& set) { - for (const std::string& name : names) { - if (!set.count(GradVarName(name))) { - return false; - } - } - if (VLOG_IS_ON(10)) { - std::ostringstream sout; - sout << "All input {"; - for (auto& name : names) { - sout << name << ","; - } - sout << "} is in {"; - for (auto& name : set) { - sout << name << ","; - } - sout << "}"; - VLOG(10) << sout.str(); - } - return true; -} - -static std::string FwdName(const std::string& grad_name) { - auto pos = grad_name.find("@GRAD"); - if (pos == std::string::npos) { - return ""; - } else { - return grad_name.substr(0, pos); - } -} - -static void CreateGradVarInBlock( - size_t grad_op_start_index, - const std::unordered_map& param_name_map, - BlockDesc* block_desc, - std::unordered_map* grad_var_record) { - auto ops = block_desc->AllOps(); - for (size_t op_index = grad_op_start_index; op_index < ops.size(); - ++op_index) { - std::unordered_set new_vars; - auto& ctrl_flow_ops = CtrlFlowOps(); - ForEachVarName(ops[op_index]->Outputs(), - [&](const std::string& grad_var_name) { - if (ctrl_flow_ops.find(ops[op_index]->Type()) != - ctrl_flow_ops.end()) { - if (block_desc->HasVarRecursive(grad_var_name)) { - return false; - } - } else { - if (block_desc->HasVar(grad_var_name)) { - return false; - } - } - if (grad_var_name == framework::kEmptyVarName) { - return false; - } - auto var = block_desc->Var(grad_var_name); - VLOG(10) << "Creating Variable " << grad_var_name; - new_vars.insert(var->Name()); - auto it = param_name_map.find(grad_var_name); - if (it == param_name_map.end()) { - return false; - } - auto param_var_name = it->second; - auto& grad_record = (*grad_var_record)[param_var_name]; - grad_record.name_ = grad_var_name; - grad_record.block_idx_ = block_desc->ID(); - grad_record.op_idx_ = static_cast(op_index); - return false; /* not break */ - }); - ops[op_index]->InferVarType(block_desc); - for (auto& arg : ops[op_index]->OutputArgumentNames()) { - if (new_vars.find(arg) == new_vars.end()) { - continue; - } - auto pname = FwdName(arg); - auto* param = block_desc->FindVarRecursive(pname); - auto* grad = block_desc->FindVar(arg); - if (param == nullptr) { - grad->SetDataType(proto::VarType::FP32); - } else { - grad->SetDataType(param->GetDataType()); - } - } - ops[op_index]->InferShape(*block_desc); - } -} - -std::vector> MakeOpGrad( - const OpDesc* op_desc, std::unordered_set* no_grad_vars, - std::unordered_map* grad_to_var, - const std::vector& grad_block = std::vector()) { - std::vector> grad_op_descs; - // All input gradients of forwarding operator do not need to calculate. - const std::vector& inputs = op_desc->InputArgumentNames(); - if (AllGradInSet(inputs, *no_grad_vars)) { - VLOG(10) << "Drop operator " << op_desc->Type(); - return grad_op_descs; // empty vector - } - - // All output gradients of forwarding operator do not need to calculate. - const std::vector& outputs = op_desc->OutputArgumentNames(); - - if (AllGradInSet(outputs, *no_grad_vars)) { - VLOG(10) << "Drop operator " << op_desc->Type(); - // FIXME: Hack code here - auto& ctrl_flow_ops = CtrlFlowOps(); - if (ctrl_flow_ops.find(op_desc->Type()) == ctrl_flow_ops.end()) { - // Only computational op need drop input's gradient. - for (const std::string& name : inputs) { - no_grad_vars->insert(GradVarName(name)); - VLOG(10) << " Also drop " << GradVarName(name); - } - } - - return grad_op_descs; // empty vector - } - - grad_op_descs = - OpInfoMap::Instance() - .Get(op_desc->Type()) - .GradOpMaker()(*op_desc, *no_grad_vars, grad_to_var, grad_block); - - std::list> pending_fill_zeros_ops; - for (auto& desc : grad_op_descs) { - for (const std::string& in_name : desc->InputArgumentNames()) { - if (no_grad_vars->count(in_name)) { - std::string prefix = in_name.substr( - 0, in_name.size() - sizeof(kGradVarSuffix) / sizeof(char) + 1); - std::string new_name = prefix + kZeroVarSuffix; - desc->Rename(in_name, new_name); - std::unique_ptr fill_zeros_op( - new OpDesc("fill_zeros_like", {{"X", {prefix}}}, - {{"Out", {new_name}}}, AttributeMap{})); - pending_fill_zeros_ops.push_back(std::move(fill_zeros_op)); - } - } - } - - for (auto& p : pending_fill_zeros_ops) { - grad_op_descs.insert(grad_op_descs.begin(), std::move(p)); - } - return grad_op_descs; -} - -static BlockDesc* CreateStepBlock( - ProgramDesc& program_desc, std::unordered_set* no_grad_vars, - std::unordered_map* grad_to_var, - int step_block_idx); - -std::vector> MakeBlockBackward( - ProgramDesc& program_desc, int block_idx, - std::unordered_set* no_grad_vars, - std::unordered_map* grad_to_var) { - VLOG(5) << "MakeBlockBackward"; - BlockDesc* cur_block = program_desc.MutableBlock(block_idx); - std::vector op_descs = cur_block->AllOps(); - std::unordered_map> dup_out_ops; - size_t grad_desc_idx = 0; - std::vector> backward_descs; - - for (auto it = op_descs.rbegin(); it != op_descs.rend(); ++it) { - VLOG(5) << "Making backward " << (*it)->Type() << " op"; - std::vector> op_grads; - - if ((*it)->Type() == "recurrent" || (*it)->Type() == "while" || - (*it)->Type() == "parallel_do") { - int step_block_idx = (*it)->GetBlockAttr("sub_block"); - BlockDesc* backward_block = CreateStepBlock(program_desc, no_grad_vars, - grad_to_var, step_block_idx); - op_grads = MakeOpGrad(*it, no_grad_vars, grad_to_var, {backward_block}); - } else if ((*it)->Type() == "conditional_block") { - BlockDesc* backward_block = - CreateStepBlock(program_desc, no_grad_vars, grad_to_var, - (*it)->GetBlockAttr("sub_block")); - op_grads = MakeOpGrad(*it, no_grad_vars, grad_to_var, {backward_block}); - } else { - op_grads = MakeOpGrad(*it, no_grad_vars, grad_to_var); - } - - if (VLOG_IS_ON(10)) { - std::ostringstream sout; - sout << "Made "; - for (auto& op_grad : op_grads) { - sout << op_grad->Type() << " "; - } - VLOG(10) << sout.str(); - } - - for (const auto& desc : op_grads) { - for (const std::string& out_name : desc->OutputArgumentNames()) { - if (out_name.find("@GRAD") == std::string::npos) { - // Not all outputs of a backward operator is a gradient. Only gradient - // need to be sum. Skip variables are not gradient. - continue; - } - dup_out_ops[out_name].emplace_back(grad_desc_idx); - } - ++grad_desc_idx; - } - std::transform(op_grads.begin(), op_grads.end(), - std::back_inserter(backward_descs), - [](std::unique_ptr& ptr) { return std::move(ptr); }); - } - - VLOG(5) << "Appending Sums"; - // Check whether some variables are written more than once - std::list>> pending_sum_ops; - for (const auto& dup : dup_out_ops) { - const std::string& out_name = dup.first; - const std::vector dup_op = dup.second; - if (out_name != kEmptyVarName && dup_op.size() > 1) { - std::vector sum_op_inputs; - std::string next_g_name = out_name; - for (size_t i = 0; i < dup_op.size(); ++i) { - VLOG(10) << backward_descs[dup_op[i]]->Type() << " has " << out_name - << " duplicated"; - std::string new_name = out_name + "@RENAME@" + std::to_string(i); - backward_descs[dup_op[i]]->RenameOutput(out_name, new_name); - backward_descs[dup_op[i]]->RenameInput(out_name, next_g_name); - sum_op_inputs.emplace_back(new_name); - next_g_name = sum_op_inputs.back(); - } - std::unique_ptr sum_op(new OpDesc("sum", {{"X", sum_op_inputs}}, - {{"Out", {out_name}}}, - AttributeMap{})); - pending_sum_ops.push_back({dup_op.back(), std::move(sum_op)}); - } - } - - pending_sum_ops.sort([](const std::pair>& a, - const std::pair>& b) { - return a.first > b.first; - }); - for (auto& p : pending_sum_ops) { - backward_descs.insert(backward_descs.begin() + p.first + 1, - std::move(p.second)); - } - - VLOG(5) << "MakeBlockBackward Finished"; - - return backward_descs; -} - -static BlockDesc* CreateStepBlock( - ProgramDesc& program_desc, std::unordered_set* no_grad_vars, - std::unordered_map* grad_to_var, - int step_block_idx) { - auto backward_block_op_descs = MakeBlockBackward(program_desc, step_block_idx, - no_grad_vars, grad_to_var); - BlockDesc* backward_block = - program_desc.AppendBlock(*program_desc.MutableBlock(step_block_idx)); - for (auto& ptr : backward_block_op_descs) { - backward_block->AppendAllocatedOp(move(ptr)); - } - return backward_block; -} - -ParamGradInfoMap AppendBackward( - ProgramDesc& program_desc, const VarDesc& target, - const std::unordered_set& no_grad_vars) { - std::unordered_set no_grad_var_names; - no_grad_var_names.reserve(no_grad_vars.size() + 1); - no_grad_var_names.insert(std::string(kEmptyVarName) + kGradVarSuffix); - for (auto& name : no_grad_vars) { - no_grad_var_names.insert(GradVarName(name)); - } - - const int root_block_idx = 0; - auto root_block = program_desc.MutableBlock(root_block_idx); - - std::string fill_one_op_out = GradVarName(target.Name()); - bool is_scalar = target.GetShape() == std::vector{1}; - PADDLE_ENFORCE(is_scalar, "target should be scalar"); - VLOG(3) << "backward from loss=" << target.Name() - << " data_type=" << target.GetDataType(); - std::unique_ptr fill_one_op( - new OpDesc("fill_constant", {}, {{"Out", {fill_one_op_out}}}, - {{"shape", std::vector{1}}, - {"value", static_cast(1.0)}, - {"dtype", target.GetDataType()}})); - // infer var type of fill_one_op - fill_one_op->InferVarType(root_block); - - root_block->AppendAllocatedOp(std::move(fill_one_op)); - size_t forward_op_num = root_block->OpSize(); - size_t forward_block_num = program_desc.Size(); - - // Insert backward operators - std::unordered_map grad_to_var; - auto backward_op_descs = MakeBlockBackward(program_desc, root_block_idx, - &no_grad_var_names, &grad_to_var); - - for (auto& ptr : backward_op_descs) { - root_block->AppendAllocatedOp(std::move(ptr)); - } - // Create Variable - - // Create target gradient variable - std::unordered_map retv; - - auto var = root_block->Var(fill_one_op_out); - var->SetDataType(target.GetDataType()); - var->SetShape(target.GetShape()); - auto& target_grad = retv[target.Name()]; - target_grad.name_ = fill_one_op_out; - target_grad.block_idx_ = root_block_idx; - target_grad.op_idx_ = static_cast(forward_op_num); - - // create grad_var for all blocks in this program - CreateGradVarInBlock(forward_op_num, grad_to_var, root_block, &retv); - for (size_t block_index = forward_block_num; - block_index < program_desc.Size(); ++block_index) { - CreateGradVarInBlock(0, grad_to_var, program_desc.MutableBlock(block_index), - &retv); - } - return retv; -} - -} // namespace framework -} // namespace paddle diff --git a/paddle/fluid/framework/backward.h b/paddle/fluid/framework/backward.h deleted file mode 100644 index 3a971090c2..0000000000 --- a/paddle/fluid/framework/backward.h +++ /dev/null @@ -1,56 +0,0 @@ -/* 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 "paddle/fluid/framework/operator.h" -#include "paddle/fluid/framework/program_desc.h" - -namespace paddle { -namespace framework { - -// Create the backward operator from a forward operator. -// TODO(yuyang18): Add more API reference comment. -extern std::unique_ptr Backward( - const OperatorBase& forwardOp, - const std::unordered_set& no_grad_vars); - -struct GradVarInfo { - GradVarInfo() {} - GradVarInfo(const std::string& name, int block_idx, int op_idx) - : name_(name), block_idx_(block_idx), op_idx_(op_idx) {} - - bool operator==(const GradVarInfo& b) const { - return name_ == b.name_ && block_idx_ == b.block_idx_ && - op_idx_ == b.op_idx_; - } - - std::string name_; - int block_idx_; - int op_idx_; -}; - -using ParamGradInfoMap = std::unordered_map; - -ParamGradInfoMap AppendBackward( - ProgramDesc& program_desc, const VarDesc& target, - const std::unordered_set& no_grad_vars); - -} // namespace framework -} // namespace paddle diff --git a/paddle/fluid/pybind/CMakeLists.txt b/paddle/fluid/pybind/CMakeLists.txt index 884289a7fd..4fef351c21 100644 --- a/paddle/fluid/pybind/CMakeLists.txt +++ b/paddle/fluid/pybind/CMakeLists.txt @@ -2,13 +2,13 @@ if(WITH_PYTHON) if(WITH_AMD_GPU) hip_library(paddle_pybind SHARED SRCS pybind.cc exception.cc protobuf.cc const_value.cc recordio.cc - DEPS pybind python backward proto_desc memory executor prune init profiler feed_fetch_method + DEPS pybind python proto_desc memory executor prune init profiler feed_fetch_method parallel_executor ${GLOB_OP_LIB}) else() cc_library(paddle_pybind SHARED SRCS pybind.cc exception.cc protobuf.cc const_value.cc recordio.cc - DEPS pybind python backward proto_desc memory executor prune init profiler feed_fetch_method + DEPS pybind python proto_desc memory executor prune init profiler feed_fetch_method parallel_executor ${GLOB_OP_LIB}) if(NOT APPLE AND NOT ANDROID) diff --git a/paddle/fluid/pybind/protobuf.cc b/paddle/fluid/pybind/protobuf.cc index 2fe8290363..93533e5c9d 100644 --- a/paddle/fluid/pybind/protobuf.cc +++ b/paddle/fluid/pybind/protobuf.cc @@ -18,7 +18,6 @@ limitations under the License. */ #include #include -#include "paddle/fluid/framework/backward.h" #include "paddle/fluid/framework/block_desc.h" #include "paddle/fluid/framework/op_desc.h" #include "paddle/fluid/framework/program_desc.h" @@ -125,23 +124,6 @@ void BindProgramDesc(pybind11::module *m) { }) .def("append_block", &pd::ProgramDesc::AppendBlock, pybind11::return_value_policy::reference) - .def("append_backward", - [](pd::ProgramDesc &program_desc, const pd::VarDesc &target, - const std::unordered_set &no_grad_vars) { - pd::ParamGradInfoMap param_grad_map = - AppendBackward(program_desc, target, no_grad_vars); - std::unordered_map< - std::string, std::tuple> - retv; - for (auto it = param_grad_map.begin(); it != param_grad_map.end(); - ++it) { - const auto &grad_info = it->second; - retv[it->first] = std::make_tuple( - grad_info.name_, grad_info.block_idx_, grad_info.op_idx_); - } - return retv; - }) .def("block", &pd::ProgramDesc::MutableBlock, pybind11::return_value_policy::reference) .def("num_blocks", &pd::ProgramDesc::Size) diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index e571da42cb..a1e8ff6399 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -20,7 +20,6 @@ limitations under the License. */ #include #include -#include "paddle/fluid/framework/backward.h" #include "paddle/fluid/framework/channel.h" #include "paddle/fluid/framework/executor.h" #include "paddle/fluid/framework/feed_fetch_method.h" @@ -381,11 +380,6 @@ All parameter, weight, gradient are variables in Paddle. desc.InitializationErrorString()); return OpRegistry::CreateOp(desc); }) - .def("backward", - [](const OperatorBase &forwardOp, - const std::unordered_set &no_grad_vars) { - return Backward(forwardOp, no_grad_vars).release(); - }) .def("run", [](OperatorBase &self, const Scope &scope, const platform::CPUPlace &place) { self.Run(scope, place); }) diff --git a/python/paddle/fluid/framework.py b/python/paddle/fluid/framework.py index 793421a22f..ea9abdcae2 100644 --- a/python/paddle/fluid/framework.py +++ b/python/paddle/fluid/framework.py @@ -1119,24 +1119,6 @@ class Program(object): def current_block(self): return self.blocks[self.current_block_idx] - def append_backward(self, target, no_grad_set=None): - """ - return map(param_name -> (grad_name, block_index, op_index)) - """ - assert isinstance(target, Variable) - if no_grad_set is None: - no_grad_set = set() - try: - param_to_grad_info = self.desc.append_backward(target.desc, - no_grad_set) - except Exception as e: - raise core.EnforceNotMet( - str(e) + "\nCurrent protobuf is\n{0}".format( - self.to_string(False))) - - self.sync_with_cpp() - return param_to_grad_info - def create_block(self, parent_idx=None): new_block_idx = len(self.blocks) parent = self.current_block() if parent_idx is None else self.block( diff --git a/python/paddle/fluid/tests/unittests/test_layers.py b/python/paddle/fluid/tests/unittests/test_layers.py index 2179826d81..f88a6f1ce6 100644 --- a/python/paddle/fluid/tests/unittests/test_layers.py +++ b/python/paddle/fluid/tests/unittests/test_layers.py @@ -32,7 +32,6 @@ class TestBook(unittest.TestCase): cost = layers.square_error_cost(input=y_predict, label=y) avg_cost = layers.mean(cost) self.assertIsNotNone(avg_cost) - program.append_backward(avg_cost) print(str(program)) @@ -94,8 +93,6 @@ class TestBook(unittest.TestCase): cost = layers.cross_entropy(input=predict, label=label) avg_cost = layers.mean(cost) - program.append_backward(avg_cost) - print(str(program)) def test_word_embedding(self): diff --git a/python/paddle/fluid/tests/unittests/test_program.py b/python/paddle/fluid/tests/unittests/test_program.py index 87a2195f0d..c51a482393 100644 --- a/python/paddle/fluid/tests/unittests/test_program.py +++ b/python/paddle/fluid/tests/unittests/test_program.py @@ -87,57 +87,6 @@ class TestProgram(unittest.TestCase): print(prog) print(prog_restored) - def test_append_backward(self): - prog = Program() - block = prog.global_block() - - mul_x = block.create_var( - dtype="float32", shape=[5, 10], lod_level=0, name="mul.x") - mul_y = block.create_var( - dtype="float32", shape=[10, 8], lod_level=0, name="mul.y") - mul_out = block.create_var( - dtype="float32", shape=[5, 8], lod_level=0, name="mul.out") - mul_op = block.append_op( - type="mul", - inputs={"X": [mul_x], - "Y": mul_y}, - outputs={"Out": [mul_out]}, - attrs={"x_num_col_dims": 1}) - - add_y = block.create_var( - dtype="float32", shape=[5, 8], lod_level=0, name="add.y") - add_out = block.create_var( - dtype="float32", shape=[5, 8], lod_level=0, name="add.out") - add_op = block.append_op( - type="elementwise_add", - inputs={"X": mul_out, - "Y": add_y}, - outputs={"Out": add_out}, - attrs={"x_num_col_dims": 1}) - mean_out = block.create_var( - dtype="float32", shape=[1], lod_level=0, name="mean.out") - block.append_op( - type="mean", inputs={"X": add_out}, outputs={"Out": mean_out}) - - self.assertEqual(mul_op.idx, 0) - self.assertEqual(add_op.idx, 1) - param_to_grad = prog.append_backward(mean_out, set()) - - for var_name in ("mul.x", "mul.y", "mul.out", "add.y", "add.out", - "mean.out"): - self.assertEqual(param_to_grad[var_name][0], - grad_var_name(var_name)) - self.assertEqual(param_to_grad[var_name][1], 0) - - expect_ops = [ - "mul", "elementwise_add", "mean", "fill_constant", "mean_grad", - "elementwise_add_grad", "mul_grad" - ] - actual_ops = [] - for op in block.ops: - actual_ops.append(op.type) - self.assertEqual(actual_ops, expect_ops) - def test_program_clone_with_parameter(self): main_program = Program() startup_program = Program() From 35b0ed369cf7796d58c1f9eb1c81bcb376194fd8 Mon Sep 17 00:00:00 2001 From: Helin Wang Date: Wed, 11 Apr 2018 15:00:33 -0700 Subject: [PATCH 094/164] make -j nproc when making inference_lib_dist --- paddle/scripts/docker/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/scripts/docker/build.sh b/paddle/scripts/docker/build.sh index 4885b74e6c..be1565ab53 100755 --- a/paddle/scripts/docker/build.sh +++ b/paddle/scripts/docker/build.sh @@ -231,7 +231,7 @@ function gen_fluid_inference_lib() { Deploying fluid inference library ... ======================================== EOF - make inference_lib_dist + make -j `nproc` inference_lib_dist fi } From 70500398b63cf8a80a6113ada9e06aa5e98a541e Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Thu, 12 Apr 2018 09:54:33 +0800 Subject: [PATCH 095/164] wip --- paddle/fluid/operators/detail/grpc_client.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/operators/detail/grpc_client.cc b/paddle/fluid/operators/detail/grpc_client.cc index 8bbfd1f159..b546aa1d2f 100644 --- a/paddle/fluid/operators/detail/grpc_client.cc +++ b/paddle/fluid/operators/detail/grpc_client.cc @@ -35,7 +35,8 @@ bool RPCClient::AsyncSendVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::Async([var_name_val, p_ctx, ep_val, p_scope, time_out, ch, this] { + framework::AsyncIO([var_name_val, p_ctx, ep_val, p_scope, time_out, ch, + this] { auto* var = p_scope->FindVar(var_name_val); ::grpc::ByteBuffer req; @@ -90,7 +91,8 @@ bool RPCClient::AsyncGetVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::Async([var_name_val, ep_val, p_scope, p_ctx, time_out, ch, this] { + framework::AsyncIO([var_name_val, ep_val, p_scope, p_ctx, time_out, ch, + this] { // prepare input sendrecv::VariableMessage req; req.set_varname(var_name_val); @@ -133,8 +135,8 @@ bool RPCClient::AsyncPrefetchVariable(const std::string& ep, const framework::Scope* p_scope = &scope; const auto ch = GetChannel(ep_val); - framework::Async([in_var_name_val, out_var_name_val, ep_val, p_scope, p_ctx, - time_out, ch, this] { + framework::AsyncIO([in_var_name_val, out_var_name_val, ep_val, p_scope, p_ctx, + time_out, ch, this] { auto* var = p_scope->FindVar(in_var_name_val); ::grpc::ByteBuffer req; @@ -197,7 +199,7 @@ bool RPCClient::Wait() { std::vector> waits(req_count_); for (int i = 0; i < req_count_; i++) { - waits[i] = framework::Async([i, &a, this] { a[i] = Proceed(); }); + waits[i] = framework::AsyncIO([i, &a, this] { a[i] = Proceed(); }); } for (int i = 0; i < req_count_; i++) { From d44895e679c86dc78e444e64efdf78e374851e55 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Wed, 11 Apr 2018 18:57:19 -0700 Subject: [PATCH 096/164] add readme and some small tweaks --- tools/aws_benchmarking/README.md | 153 ++++++++++++++++++ .../client/cluster_launcher.py | 6 +- tools/aws_benchmarking/diagram.png | Bin 0 -> 41741 bytes 3 files changed, 156 insertions(+), 3 deletions(-) create mode 100644 tools/aws_benchmarking/README.md create mode 100644 tools/aws_benchmarking/diagram.png diff --git a/tools/aws_benchmarking/README.md b/tools/aws_benchmarking/README.md new file mode 100644 index 0000000000..5fd586cc15 --- /dev/null +++ b/tools/aws_benchmarking/README.md @@ -0,0 +1,153 @@ +# AWS benchmark testing tool +This is an automation tool for deploying paddlepaddle benchmark testing to AWS. + +## Features + + - subnet creation to fit just the amount of ec2 instances required. + - pserver and trainer ec2 instances allocation, and instance state verification + - nvidia-docker ready for GPU training + - Instances and network element garbage collection when a task is accomplished or an error occurred + - Test log is collected in realtime + - Web service for checking log or tearing down the testing setup + - No testing code change needed + - Lots of optional configuration options + + ## Usages + + ### Prerequisites + + - You have a working AWS account + - You have [AWS Command Line Interface](https://aws.amazon.com/cli/) installed + - Your AWS cli is bind with a account which has `AmazonEC2FullAccess` permission, and it's set as default credential. + - You have key pair created and pem file downloaded. + - You have a default VPC in the region you want to run the test. + - You have a Security Group created for the VPC mentioned above, which allows port 22 and the port you want to expose your control web service (5436 by default) + - If your test is supposed to run in a GPU machine, especially a multi card GPU machine (p2, p3 series), you might need to contact amazon to raise the limit which allows no more than 1 GPU instance at a time. + + ### Start a benchmark test + +#### Create training image + +*What to expect in this step:* + +*You will have your training logic packed with paddle runtime in a docker image, and be able to be picked up by AWS instance for training.* + +Training python script and PaddlePaddle runtime are supposed to be packed into one docker image. Use PaddlePaddle production images as base image and create the training images with the docker file as follows: + +```Dockerfile +FROM paddlepaddle/paddle:latest-gpu + +ENV HOME /root +COPY ./ /root/ +WORKDIR /root +RUN pip install -r /root/requirements.txt +ENTRYPOINT ["python", "my_training.py"] +``` + +***Please Note*** +Training nodes will run your `ENTRYPOINT` script with the following environment variables: + + - `TASK_NAME`: unique name to identify this training process. + - `TRAINING_ROLE`: current node's role in this training process, either "PSERVER" or "TRAINER" + - `PSERVER_HOSTS`: comma separated value of pserver end points, I.E. "192.168.1.2:5436,192.168.1.3:5436" + - `TRAINER_INDEX`: an integer to identify the index of current trainer + + Now we have a working distributed training script which takes advantage of node environment variables and docker file to generate the training image. Run the following command: + + ```bash + docker build -t myreponname/paddle_benchmark . + ``` + + Now you have the image built and tagged with `myreponame/paddle_benchmark`, let's push it to dockerhub so that it can be picked up by out AWS instance. + + ```bash + docker push myreponame/paddle_benchmark + ``` + +#### Create instances and start training + +*What to expect in this step* + +*you will be asked to provide some basic settings to config your training, and this tool will have your training started and monitored* + +Now let's start the training process: + +```bash +docker run -i -v $HOME/.aws:/root/.aws -v :/.pem \ +putcn/paddle_aws_client \ +--action create \ +--key_name \ +--security_group_id +``` + +Now just wait until you see this: +``` +master server finished init process, visit http://XXX:XXX/status to check master log +``` +That means you can turn off your laptop and your cluster is creating instances, starting training process, collecting logs and eventually shut all pservers and trainers down when training is finished. + +#### Post creation operations + +To access the master log: + +```bash +docker run -i -v $HOME/.aws:/root/.aws -v :/.pem \ +putcn/paddle_aws_client \ +--action status \ +--master_server_public_ip \ +--master_server_port +``` + +To tear down the training setup: + +```bash +docker run -i -v $HOME/.aws:/root/.aws -v :/.pem \ +putcn/paddle_aws_client \ +--action cleanup \ +--master_server_public_ip \ +--master_server_port +``` + +To retrieve training logs +TBD + +### Tech details + +*What to expect in this step* + +*You will understand what is happening behind the scene, and how to check the training log, how to tear down the training on the fly, etc.* + +Let's understand what is happening under the hood when you run above command in your laptop + +![alt](diagram.png) + +There are 4 roles in the figure above: + - client: your laptop + - master: who tasks to aws api server to create/tear down instances, and monitor training process + - AWS api server: the one who actually creates and manages instances + - pservers and trainers: training instances + +When you run the `docker run` command above, what it actually does is to ask aws api service to create a subnet (step 1) and a master instance (step 2), and pass all the parameters the client collected or generated (step 3). The master is kept as minimum hardware config to keep the running cost low. + +Then when the master is up and running, it will ask the aws api server to create the heavy lifting training instances who are expensive to run (step 4). And the master will start training process as soon as they are done initializing (step 5). + +Meanwhile, the master will expose a web service for client to check training log or even tear the training setup down by a web service call. + +if you are creating the training with client docker container, and also monitoring your aws dashboard, you will initially see a instance tagged with `ROLE=MASTER` and `TASK_NAME=_master` starts, then you will see several instances tagged with `ROLE=PSERVER` and `ROLE=TRAINER` starts. +When the training is finished, pservers and trainers will be terminated. All their logs are kept in master node's docker env. + +Master exposes 4 major services: + + - GET `/status`: return master log + - GET `/list_logs`: return list of log file names + - GET `/log/`: return a particular log by log file name + - POST `/cleanup`: teardown the whole setup + + +### Parameters + +TBD, please refer to client/cluster_launcher.py for now + +### Trouble shooting + +TBD diff --git a/tools/aws_benchmarking/client/cluster_launcher.py b/tools/aws_benchmarking/client/cluster_launcher.py index d713bc2b45..bbabd98246 100644 --- a/tools/aws_benchmarking/client/cluster_launcher.py +++ b/tools/aws_benchmarking/client/cluster_launcher.py @@ -342,8 +342,8 @@ def create(): raise Exception("Error while kicking off master") logging.info( - "master sercer finished init process, visit %s to check master log" % - (get_master_web_url("/logs"))) + "master server finished init process, visit %s to check master log" % + (get_master_web_url("/status"))) def cleanup(): @@ -351,7 +351,7 @@ def cleanup(): def status(): - print requests.post(get_master_web_url("/logs")).text + print requests.post(get_master_web_url("/status")).text def get_master_web_url(path): diff --git a/tools/aws_benchmarking/diagram.png b/tools/aws_benchmarking/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd656c9b4719fc6a96eb3d68c796daa0aaf7b98 GIT binary patch literal 41741 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 literal 0 HcmV?d00001 From d798e3258d475140a532804d7cd4980aa38475cd Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Thu, 12 Apr 2018 09:57:38 +0800 Subject: [PATCH 097/164] update grpc version --- cmake/external/grpc.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake index 0853b98181..aa24915947 100644 --- a/cmake/external/grpc.cmake +++ b/cmake/external/grpc.cmake @@ -24,16 +24,16 @@ SET(GRPC_INSTALL_DIR ${THIRD_PARTY_PATH}/install/grpc) SET(GRPC_INCLUDE_DIR "${GRPC_INSTALL_DIR}/include/" CACHE PATH "grpc include directory." FORCE) SET(GRPC_CPP_PLUGIN "${GRPC_INSTALL_DIR}/bin/grpc_cpp_plugin" CACHE FILEPATH "GRPC_CPP_PLUGIN" FORCE) IF(APPLE) - SET(BUILD_CMD make -n HAS_SYSTEM_PROTOBUF=false -s -j8 static grpc_cpp_plugin | sed "s/-Werror//g" | sh) + SET(BUILD_CMD make -n HAS_SYSTEM_PROTOBUF=false -s -j static grpc_cpp_plugin | sed "s/-Werror//g" | sh) ELSE() - SET(BUILD_CMD make HAS_SYSTEM_PROTOBUF=false -s -j8 static grpc_cpp_plugin) + SET(BUILD_CMD make HAS_SYSTEM_PROTOBUF=false -s -j static grpc_cpp_plugin) ENDIF() ExternalProject_Add( extern_grpc DEPENDS protobuf zlib GIT_REPOSITORY "https://github.com/grpc/grpc.git" - GIT_TAG "v1.8.x" + GIT_TAG "v1.11.x" PREFIX ${GRPC_SOURCES_DIR} UPDATE_COMMAND "" CONFIGURE_COMMAND "" From 0532bc4078f59e44967df2ebca4e2aa0bd28ea36 Mon Sep 17 00:00:00 2001 From: Yang Yang Date: Thu, 12 Apr 2018 11:43:46 +0800 Subject: [PATCH 098/164] init --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index fbec88c796..7856d3bbc4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # A image for building paddle binaries # Use cuda devel base image for both cpu and gpu environment -FROM nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04 +FROM nvidia/cuda:8.0-cudnn7-devel-ubuntu16.04 MAINTAINER PaddlePaddle Authors ARG UBUNTU_MIRROR From e90e7ab237723ddab75be247d5f29780968924f4 Mon Sep 17 00:00:00 2001 From: Yiqun Liu Date: Thu, 12 Apr 2018 11:45:43 +0800 Subject: [PATCH 099/164] Remove the use of ARCHIVE_START/END (#9844) * Add USE_OP of all operators and kernels and remove ARCHIVE_START/END in CMakeLists.txt of inference unittests. * Remove ARCHIVE_START/END when linking inference shared library. * Disable some fluid related cmake operations for cross-compiling. --- cmake/cblas.cmake | 34 +++++++++++-------- cmake/external/snappy.cmake | 16 ++++----- cmake/external/snappystream.cmake | 14 ++++---- cmake/generic.cmake | 15 ++------ cmake/inference_lib.cmake | 32 +++++++++++++++++ paddle/CMakeLists.txt | 2 +- paddle/fluid/CMakeLists.txt | 3 +- paddle/fluid/inference/CMakeLists.txt | 4 +-- paddle/fluid/inference/io.cc | 6 ++++ paddle/fluid/inference/io.h | 3 ++ .../fluid/inference/tests/book/CMakeLists.txt | 2 +- 11 files changed, 83 insertions(+), 48 deletions(-) diff --git a/cmake/cblas.cmake b/cmake/cblas.cmake index 6320b17520..52a22c1fbf 100644 --- a/cmake/cblas.cmake +++ b/cmake/cblas.cmake @@ -62,29 +62,33 @@ endif() ## Then find the reference-cblas. www.netlib.org/blas/ - - set(REFERENCE_CBLAS_ROOT $ENV{REFERENCE_CBLAS_ROOT} CACHE PATH "Folder contains reference-cblas") -set(REFERENCE_CBLAS_INCLUDE_SEARCH_PATHS - ${REFERENCE_CBLAS_ROOT}/include - /usr/include - /usr/include/cblas -) - -set(REFERENCE_CBLAS_LIB_SEARCH_PATHS - ${REFERENCE_CBLAS_ROOT}/lib - /usr/lib - /usr/lib/blas/reference/ - /usr/lib/reference/ -) +if(NOT CMAKE_CROSSCOMPILING) + set(REFERENCE_CBLAS_INCLUDE_SEARCH_PATHS + ${REFERENCE_CBLAS_ROOT}/include + /usr/include + /usr/include/cblas + ) + + set(REFERENCE_CBLAS_LIB_SEARCH_PATHS + ${REFERENCE_CBLAS_ROOT}/lib + /usr/lib + /usr/lib/blas/reference/ + /usr/lib/reference/ + ) +else() + # Diable the finding of reference cblas under host's system path + set(REFERENCE_CBLAS_INCLUDE_SEARCH_PATHS ${REFERENCE_CBLAS_ROOT}/include) + set(REFERENCE_CBLAS_LIB_SEARCH_PATHS ${REFERENCE_CBLAS_ROOT}/lib) +endif() find_path(REFERENCE_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${REFERENCE_CBLAS_INCLUDE_SEARCH_PATHS}) find_library(REFERENCE_CBLAS_LIBRARY NAMES cblas PATHS ${REFERENCE_CBLAS_LIB_SEARCH_PATHS}) -if (REFERENCE_CBLAS_INCLUDE_DIR AND REFERENCE_CBLAS_LIBRARY) +if(REFERENCE_CBLAS_INCLUDE_DIR AND REFERENCE_CBLAS_LIBRARY) set(CBLAS_FOUND ON) set(CBLAS_PROVIDER REFERENCE) set(CBLAS_INC_DIR ${REFERENCE_CBLAS_INCLUDE_DIR}) diff --git a/cmake/external/snappy.cmake b/cmake/external/snappy.cmake index 71f54c425d..80282329c6 100644 --- a/cmake/external/snappy.cmake +++ b/cmake/external/snappy.cmake @@ -11,19 +11,20 @@ # 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. -# -IF(MOBILE_INFERENCE) +if(MOBILE_INFERENCE OR RPI) return() -ENDIF() +endif() include (ExternalProject) # NOTE: snappy is needed when linking with recordio -SET(SNAPPY_SOURCES_DIR ${THIRD_PARTY_PATH}/snappy) -SET(SNAPPY_INSTALL_DIR ${THIRD_PARTY_PATH}/install/snappy) -SET(SNAPPY_INCLUDE_DIR "${SNAPPY_INSTALL_DIR}/include/" CACHE PATH "snappy include directory." FORCE) +set(SNAPPY_SOURCES_DIR ${THIRD_PARTY_PATH}/snappy) +set(SNAPPY_INSTALL_DIR ${THIRD_PARTY_PATH}/install/snappy) +set(SNAPPY_INCLUDE_DIR "${SNAPPY_INSTALL_DIR}/include" CACHE PATH "snappy include directory." FORCE) + +set(SNAPPY_LIBRARIES "${SNAPPY_INSTALL_DIR}/lib/libsnappy.a") ExternalProject_Add( extern_snappy @@ -51,8 +52,7 @@ ExternalProject_Add( ) add_library(snappy STATIC IMPORTED GLOBAL) -set_property(TARGET snappy PROPERTY IMPORTED_LOCATION - "${SNAPPY_INSTALL_DIR}/lib/libsnappy.a") +set_property(TARGET snappy PROPERTY IMPORTED_LOCATION ${SNAPPY_LIBRARIES}) include_directories(${SNAPPY_INCLUDE_DIR}) add_dependencies(snappy extern_snappy) diff --git a/cmake/external/snappystream.cmake b/cmake/external/snappystream.cmake index 8f7a3bf8ee..20a9643082 100644 --- a/cmake/external/snappystream.cmake +++ b/cmake/external/snappystream.cmake @@ -11,9 +11,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. -# -IF(MOBILE_INFERENCE) +IF(MOBILE_INFERENCE OR RPI) return() ENDIF() @@ -21,9 +20,11 @@ include (ExternalProject) # NOTE: snappy is needed when linking with recordio -SET(SNAPPYSTREAM_SOURCES_DIR ${THIRD_PARTY_PATH}/snappy_stream) -SET(SNAPPYSTREAM_INSTALL_DIR ${THIRD_PARTY_PATH}/install/snappy_stream) -SET(SNAPPYSTREAM_INCLUDE_DIR "${SNAPPYSTREAM_INSTALL_DIR}/include/" CACHE PATH "snappy stream include directory." FORCE) +set(SNAPPYSTREAM_SOURCES_DIR ${THIRD_PARTY_PATH}/snappy_stream) +set(SNAPPYSTREAM_INSTALL_DIR ${THIRD_PARTY_PATH}/install/snappy_stream) +set(SNAPPYSTREAM_INCLUDE_DIR "${SNAPPYSTREAM_INSTALL_DIR}/include" CACHE PATH "snappy stream include directory." FORCE) + +set(SNAPPYSTREAM_LIBRARIES "${SNAPPYSTREAM_INSTALL_DIR}/lib/libsnappystream.a") ExternalProject_Add( extern_snappystream @@ -51,8 +52,7 @@ ExternalProject_Add( ) add_library(snappystream STATIC IMPORTED GLOBAL) -set_property(TARGET snappystream PROPERTY IMPORTED_LOCATION - "${SNAPPYSTREAM_INSTALL_DIR}/lib/libsnappystream.a") +set_property(TARGET snappystream PROPERTY IMPORTED_LOCATION ${SNAPPYSTREAM_LIBRARIES}) include_directories(${SNAPPYSTREAM_INCLUDE_DIR}) # For snappysteam to include its own headers. include_directories(${THIRD_PARTY_PATH}/install) # For Paddle to include snappy stream headers. diff --git a/cmake/generic.cmake b/cmake/generic.cmake index c4c9f77df8..1d3e2ade6d 100644 --- a/cmake/generic.cmake +++ b/cmake/generic.cmake @@ -195,14 +195,7 @@ function(cc_library TARGET_NAME) list(REMOVE_ITEM cc_library_DEPS warpctc) add_dependencies(${TARGET_NAME} warpctc) endif() - if("${cc_library_DEPS}" MATCHES "ARCHIVE_START") - # Support linking flags: --whole-archive (Linux) / -force_load (MacOS). - # WARNING: Please don't use ARCHIVE_START&ARCHIVE_END if TARGET_NAME will be linked by other libraries. - target_circle_link_libraries(${TARGET_NAME} ${cc_library_DEPS}) - list(REMOVE_ITEM cc_library_DEPS ARCHIVE_START ARCHIVE_END) - else() - target_link_libraries(${TARGET_NAME} ${cc_library_DEPS}) - endif() + target_link_libraries(${TARGET_NAME} ${cc_library_DEPS}) add_dependencies(${TARGET_NAME} ${cc_library_DEPS}) endif() @@ -243,11 +236,7 @@ function(cc_test TARGET_NAME) set(multiValueArgs SRCS DEPS ARGS) cmake_parse_arguments(cc_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) add_executable(${TARGET_NAME} ${cc_test_SRCS}) - # Support linking flags: --whole-archive (Linux) / -force_load (MacOS) - target_circle_link_libraries(${TARGET_NAME} ${cc_test_DEPS} paddle_gtest_main memory gtest gflags glog) - if("${cc_test_DEPS}" MATCHES "ARCHIVE_START") - list(REMOVE_ITEM cc_test_DEPS ARCHIVE_START ARCHIVE_END) - endif() + target_link_libraries(${TARGET_NAME} ${cc_test_DEPS} paddle_gtest_main memory gtest gflags glog) add_dependencies(${TARGET_NAME} ${cc_test_DEPS} paddle_gtest_main memory gtest gflags glog) add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME} ${cc_test_ARGS} diff --git a/cmake/inference_lib.cmake b/cmake/inference_lib.cmake index 0323cd9698..cc75801982 100644 --- a/cmake/inference_lib.cmake +++ b/cmake/inference_lib.cmake @@ -1,7 +1,22 @@ +# 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. + set_property(GLOBAL PROPERTY FLUID_MODULES "") # find all fluid modules is used for paddle fluid static library function(find_fluid_modules TARGET_NAME) get_filename_component(__target_path ${TARGET_NAME} ABSOLUTE) + string(REGEX REPLACE "^${PADDLE_SOURCE_DIR}/" "" __target_path ${__target_path}) string(FIND "${__target_path}" "fluid" pos) if(pos GREATER 1) get_property(fluid_modules GLOBAL PROPERTY FLUID_MODULES) @@ -77,6 +92,23 @@ elseif (WITH_MKLML) ) endif() +if(NOT MOBILE_INFERENCE AND NOT RPI) + set(dst_dir "${CMAKE_INSTALL_PREFIX}/third_party/install/snappy") + copy(snappy_lib + SRCS ${SNAPPY_INCLUDE_DIR} ${SNAPPY_LIBRARIES} + DSTS ${dst_dir} ${dst_dir}/lib) + + set(dst_dir "${CMAKE_INSTALL_PREFIX}/third_party/install/snappystream") + copy(snappystream_lib + SRCS ${SNAPPYSTREAM_INCLUDE_DIR} ${SNAPPYSTREAM_LIBRARIES} + DSTS ${dst_dir} ${dst_dir}/lib) + + set(dst_dir "${CMAKE_INSTALL_PREFIX}/third_party/install/zlib") + copy(zlib_lib + SRCS ${ZLIB_INCLUDE_DIR} ${ZLIB_LIBRARIES} + DSTS ${dst_dir} ${dst_dir}/lib) +endif() + # paddle fluid module set(src_dir "${PADDLE_SOURCE_DIR}/paddle/fluid") set(dst_dir "${CMAKE_INSTALL_PREFIX}/paddle/fluid") diff --git a/paddle/CMakeLists.txt b/paddle/CMakeLists.txt index c44f8a8a8e..8b1ca5e165 100644 --- a/paddle/CMakeLists.txt +++ b/paddle/CMakeLists.txt @@ -24,6 +24,6 @@ if(NOT WITH_FLUID_ONLY) endif() add_subdirectory(testing) -if(NOT MOBILE_INFERENCE AND NOT ANDROID AND NOT IOS) +if(NOT MOBILE_INFERENCE AND NOT RPI) add_subdirectory(fluid) endif() diff --git a/paddle/fluid/CMakeLists.txt b/paddle/fluid/CMakeLists.txt index d725763b01..d274d96c29 100644 --- a/paddle/fluid/CMakeLists.txt +++ b/paddle/fluid/CMakeLists.txt @@ -3,6 +3,7 @@ add_subdirectory(platform) add_subdirectory(framework) add_subdirectory(operators) add_subdirectory(pybind) -add_subdirectory(inference) add_subdirectory(string) add_subdirectory(recordio) +# NOTE: please add subdirectory inference at last. +add_subdirectory(inference) diff --git a/paddle/fluid/inference/CMakeLists.txt b/paddle/fluid/inference/CMakeLists.txt index f417f62f3f..e53bcf2384 100644 --- a/paddle/fluid/inference/CMakeLists.txt +++ b/paddle/fluid/inference/CMakeLists.txt @@ -1,4 +1,4 @@ -set(FLUID_CORE_MODULES proto_desc memory lod_tensor executor prune init) +set(FLUID_CORE_MODULES proto_desc memory lod_tensor executor init) cc_library(paddle_fluid_api SRCS io.cc @@ -11,7 +11,7 @@ cc_library(paddle_fluid DEPS ${fluid_modules}) # Create shared library cc_library(paddle_fluid_shared SHARED SRCS io.cc - DEPS ARCHIVE_START ${GLOB_OP_LIB} ${FLUID_CORE_MODULES} ARCHIVE_END) + DEPS ${fluid_modules}) set_target_properties(paddle_fluid_shared PROPERTIES OUTPUT_NAME paddle_fluid) if(NOT APPLE) # TODO(liuyiqun): Temporarily disable the link flag because it is not support on Mac. diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index a5b62ef322..a29d457b6f 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -17,10 +17,16 @@ limitations under the License. */ #include #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/pybind/pybind.h" namespace paddle { namespace inference { +// Temporarilly add this function for exposing framework::InitDevices() when +// linking the inference shared library. +void Init(bool init_p2p) { framework::InitDevices(init_p2p); } + void ReadBinaryFile(const std::string& filename, std::string& contents) { std::ifstream fin(filename, std::ios::in | std::ios::binary); PADDLE_ENFORCE(static_cast(fin), "Cannot open file %s", filename); diff --git a/paddle/fluid/inference/io.h b/paddle/fluid/inference/io.h index d07d315b93..756c936b33 100644 --- a/paddle/fluid/inference/io.h +++ b/paddle/fluid/inference/io.h @@ -18,12 +18,15 @@ limitations under the License. */ #include #include #include "paddle/fluid/framework/executor.h" +#include "paddle/fluid/framework/init.h" #include "paddle/fluid/framework/program_desc.h" #include "paddle/fluid/framework/scope.h" namespace paddle { namespace inference { +void Init(bool init_p2p); + void LoadPersistables(framework::Executor& executor, framework::Scope& scope, const framework::ProgramDesc& main_program, const std::string& dirname, diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index 86e36f3f65..97d9f03f88 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -17,7 +17,7 @@ function(inference_test TARGET_NAME) string(REGEX REPLACE "^_$" "" arg "${arg}") cc_test(test_inference_${TARGET_NAME}${arg} SRCS test_inference_${TARGET_NAME}.cc - DEPS ARCHIVE_START paddle_fluid ARCHIVE_END + DEPS paddle_fluid ARGS --dirname=${PYTHON_TESTS_DIR}/book/${TARGET_NAME}${arg}.inference.model) set_tests_properties(test_inference_${TARGET_NAME}${arg} PROPERTIES DEPENDS test_${TARGET_NAME}) From 7132bbe6b7329914fefcd4fa9960afda495d3f89 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 12 Apr 2018 12:20:13 +0800 Subject: [PATCH 100/164] update by comment --- paddle/fluid/operators/uniform_random_op.cc | 12 +- paddle/fluid/operators/uniform_random_op.cu | 12 +- .../operators/uniform_random_table_op.cc | 144 ------------------ .../tests/unittests/test_uniform_random_op.py | 46 +++++- .../unittests/test_uniform_random_table_op.py | 66 -------- 5 files changed, 63 insertions(+), 217 deletions(-) delete mode 100644 paddle/fluid/operators/uniform_random_table_op.cc delete mode 100644 python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py diff --git a/paddle/fluid/operators/uniform_random_op.cc b/paddle/fluid/operators/uniform_random_op.cc index 87699362b2..155690a6f4 100644 --- a/paddle/fluid/operators/uniform_random_op.cc +++ b/paddle/fluid/operators/uniform_random_op.cc @@ -24,7 +24,17 @@ template class CPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - auto* tensor = ctx.Output("Out"); + framework::Tensor* tensor(nullptr); + auto out_var = ctx.OutputVar("Out"); + if (out_var->IsType()) { + tensor = out_var->GetMutable(); + } else if (out_var->IsType()) { + auto shape = ctx.Attr>("shape"); + tensor = out_var->GetMutable()->mutable_value(); + tensor->Resize(framework::make_ddim(shape)); + } else { + PADDLE_THROW("Only support SelectedRows and Tensor"); + } T* data = tensor->mutable_data(ctx.GetPlace()); unsigned int seed = static_cast(ctx.Attr("seed")); std::minstd_rand engine; diff --git a/paddle/fluid/operators/uniform_random_op.cu b/paddle/fluid/operators/uniform_random_op.cu index 1232cd1eb3..33971be3e0 100644 --- a/paddle/fluid/operators/uniform_random_op.cu +++ b/paddle/fluid/operators/uniform_random_op.cu @@ -43,7 +43,17 @@ template class GPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { - auto* tensor = context.Output("Out"); + framework::Tensor* tensor(nullptr); + auto out_var = ctx.OutputVar("Out"); + if (out_var->IsType()) { + tensor = out_var->GetMutable(); + } else if (out_var->IsType()) { + auto shape = ctx.Attr>("shape"); + tensor = out_var->GetMutable()->mutable_value(); + tensor->Resize(framework::make_ddim(shape)); + } else { + PADDLE_THROW("Only support SelectedRows and Tensor"); + } T* data = tensor->mutable_data(context.GetPlace()); unsigned int seed = static_cast(context.Attr("seed")); if (seed == 0) { diff --git a/paddle/fluid/operators/uniform_random_table_op.cc b/paddle/fluid/operators/uniform_random_table_op.cc deleted file mode 100644 index 4664cc5d93..0000000000 --- a/paddle/fluid/operators/uniform_random_table_op.cc +++ /dev/null @@ -1,144 +0,0 @@ -/* 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/framework/data_type.h" -#include "paddle/fluid/framework/op_registry.h" -#include "paddle/fluid/operators/math/math_function.h" -#include "paddle/fluid/platform/device_context.h" - -namespace paddle { -namespace operators { - -class UniformRandomTableInferShape : public framework::InferShapeBase { - public: - void operator()(framework::InferShapeContext *ctx) const override { - VLOG(3) << "Infershape..."; - PADDLE_ENFORCE(ctx->HasOutput("Out"), - "Output(Out) of UniformRandomTableOp should not be null."); - - PADDLE_ENFORCE( - ctx->Attrs().Get("min") < ctx->Attrs().Get("max"), - "uniform_random's min must less then max"); - auto &shape = ctx->Attrs().Get>("shape"); - std::vector temp; - temp.reserve(shape.size()); - for (auto dim : shape) { - temp.push_back(static_cast(dim)); - } - ctx->SetOutputDim("Out", framework::make_ddim(temp)); - } -}; - -class UniformRandomTableOp : public framework::OperatorBase { - public: - using framework::OperatorBase::OperatorBase; - - private: - void RunImpl(const framework::Scope &scope, - const platform::Place &dev_place) const override { - VLOG(3) << "RunImpl..."; - auto out = - scope.FindVar(Output("Out"))->GetMutable(); - auto shard_cnt = Attr("shard_cnt"); - auto shard_id = Attr("shard_id"); - auto max_id = Attr("max_id"); - auto shape = Attr>("shape"); - - auto tensor = out->mutable_value(); - tensor->Resize(framework::make_ddim(shape)); - // Only allocate the memory of large table on CPU - auto cpu = platform::CPUPlace(); - float *data = tensor->mutable_data(cpu); - VLOG(3) << "generate seed"; - unsigned int seed = static_cast(Attr("seed")); - std::minstd_rand engine; - if (seed == 0) { - seed = std::random_device()(); - } - engine.seed(seed); - std::uniform_real_distribution dist(Attr("min"), - Attr("max")); - int64_t size = tensor->numel(); - for (int64_t i = 0; i < size; ++i) { - data[i] = dist(engine); - } - // initialize rows by round-robin - // TODO(Yancey1989): need to support other way to distribute Ids - VLOG(3) << "calculate rows_size..."; - int64_t rows_size = 0; - if (max_id % shard_cnt == 0) { - rows_size = max_id / shard_cnt; - } else { - rows_size = max_id / shard_cnt + 1; - } - auto *rows = out->mutable_rows(); - rows->resize(rows_size); - (*rows)[0] = shard_id; - for (int64_t idx = 1; idx < rows_size; ++idx) { - (*rows)[idx] = (*rows)[idx - 1] + shard_cnt; - } - out->set_height(max_id); - } -}; - -class UniformRandomTableOpMaker : public framework::OpProtoAndCheckerMaker { - public: - UniformRandomTableOpMaker(OpProto *proto, OpAttrChecker *op_checker) - : framework::OpProtoAndCheckerMaker(proto, op_checker) { - AddOutput("Out", - "(SelectedRows)" - "The output table of uniform random table op."); - AddComment(R"DOC( -Uniform random operator for initializing a table. - -This operator initializes a SelectedRows with random values sampled from a -uniform distribution. - -)DOC"); - AddAttr("max_id", - "(int, required)" - "The maximal Id for the table."); - AddAttr("shard_cnt", - "(int, required)" - "The count of shards for distributing the table."); - AddAttr("shard_id", "(int, required) The current shard ID."); - AddAttr>("shape", - "(vector) The shape of the output tensor"); - AddAttr("min", - "(float, default -1.0) " - "Minimum value of uniform random") - .SetDefault(-1.0f); - AddAttr("max", - "(float, default 1.0) " - "Maximun value of uniform random") - .SetDefault(1.0f); - AddAttr("seed", - "(int, default 0) " - "Random seed used for generating samples. " - "0 means use a seed generated by the system." - "Note that if seed is not 0, this operator will always " - "generate the same random numbers every time.") - .SetDefault(0); - AddAttr("dtype", "(int, default 5(FP32)) Output tensor data type") - .SetDefault(framework::proto::VarType::FP32); - } -}; -} // namespace operators -} // namespace paddle - -namespace ops = paddle::operators; -REGISTER_OPERATOR(uniform_random_table, ops::UniformRandomTableOp, - ops::UniformRandomTableInferShape, - ops::UniformRandomTableOpMaker, - paddle::framework::EmptyGradOpMaker); diff --git a/python/paddle/fluid/tests/unittests/test_uniform_random_op.py b/python/paddle/fluid/tests/unittests/test_uniform_random_op.py index 75ff85a55f..346a949b6e 100644 --- a/python/paddle/fluid/tests/unittests/test_uniform_random_op.py +++ b/python/paddle/fluid/tests/unittests/test_uniform_random_op.py @@ -15,6 +15,16 @@ import unittest import numpy as np from op_test import OpTest +import paddle.fluid.core as core +from paddle.fluid.op import Operator + + +def output_hist(out): + hist, _ = np.histogram(out, range=(-5, 10)) + hist = hist.astype("float32") + hist /= float(out.size) + prob = 0.1 * np.ones((10)) + return hist, prob class TestUniformRandomOp(OpTest): @@ -33,11 +43,37 @@ class TestUniformRandomOp(OpTest): self.check_output_customized(self.verify_output) def verify_output(self, outs): - tensor = outs[0] - hist, _ = np.histogram(outs[0], range=(-5, 10)) - hist = hist.astype("float32") - hist /= float(outs[0].size) - prob = 0.1 * np.ones((10)) + hist, prob = output_hist(np.array(outs[0])) + self.assertTrue( + np.allclose( + hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) + + +class TestUniformRandomOpSelectedRows(unittest.TestCase): + def get_places(self): + places = [core.CPUPlace()] + if core.is_compiled_with_cuda(): + places.append(core.CUDAPlace(0)) + return places + + def test_check_output(self): + for place in self.get_places(): + self.check_with_place(place) + + def check_with_place(self, place): + scope = core.Scope() + out = scope.var("X").get_selected_rows() + + op = Operator( + "uniform_random", + Out="X", + shape=[4, 784], + min=-5.0, + max=10.0, + seed=10) + op.run(scope, place) + self.assertEqual(out.get_tensor().shape(), [4, 784]) + hist, prob = output_hist(np.array(out.get_tensor())) self.assertTrue( np.allclose( hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) diff --git a/python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py b/python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py deleted file mode 100644 index 0474c51e49..0000000000 --- a/python/paddle/fluid/tests/unittests/test_uniform_random_table_op.py +++ /dev/null @@ -1,66 +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. - -import unittest -import numpy as np -from op_test import OpTest -import paddle.fluid.core as core -from paddle.fluid.op import Operator - - -def output_hist(out): - hist, _ = np.histogram(out, range=(-5, 10)) - hist = hist.astype("float32") - hist /= float(out.size) - prob = 0.1 * np.ones((10)) - return hist, prob - - -class TestUniformRandomTableOp(unittest.TestCase): - def get_places(self): - places = [core.CPUPlace()] - if core.is_compiled_with_cuda(): - places.append(core.CUDAPlace(0)) - return places - - def test_check_output(self): - for place in self.get_places(): - self.check_with_place(place) - - def check_with_place(self, place): - scope = core.Scope() - out = scope.var("X").get_selected_rows() - - op = Operator( - "uniform_random_table", - Out="X", - shape=[4, 784], - min=-5.0, - max=10.0, - seed=10, - shard_cnt=3, - shard_id=1, - max_id=10) - op.run(scope, place) - self.assertEqual(out.rows(), [1, 4, 7, 10]) - self.assertEqual(out.height(), 10) - self.assertEqual(out.get_tensor().shape(), [4, 784]) - hist, prob = output_hist(np.array(out.get_tensor())) - self.assertTrue( - np.allclose( - hist, prob, rtol=0, atol=0.01), "hist: " + str(hist)) - - -if __name__ == "__main__": - unittest.main() From 9e9f5d8080995e71b3a7ef8fd20a0a02f33f107f Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 12 Apr 2018 12:43:16 +0800 Subject: [PATCH 101/164] fix ci --- paddle/fluid/operators/uniform_random_op.cu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/operators/uniform_random_op.cu b/paddle/fluid/operators/uniform_random_op.cu index 33971be3e0..00011bbe61 100644 --- a/paddle/fluid/operators/uniform_random_op.cu +++ b/paddle/fluid/operators/uniform_random_op.cu @@ -44,11 +44,11 @@ class GPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { framework::Tensor* tensor(nullptr); - auto out_var = ctx.OutputVar("Out"); + auto out_var = context.OutputVar("Out"); if (out_var->IsType()) { tensor = out_var->GetMutable(); } else if (out_var->IsType()) { - auto shape = ctx.Attr>("shape"); + auto shape = context.Attr>("shape"); tensor = out_var->GetMutable()->mutable_value(); tensor->Resize(framework::make_ddim(shape)); } else { From 1204d9f3d1b76de8d3fce594634134bcfb653c8e Mon Sep 17 00:00:00 2001 From: Dang Qingqing Date: Thu, 12 Apr 2018 13:12:05 +0800 Subject: [PATCH 102/164] Refine batch_norm_op. --- paddle/fluid/operators/batch_norm_op.cu.cc | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/paddle/fluid/operators/batch_norm_op.cu.cc b/paddle/fluid/operators/batch_norm_op.cu.cc index eecb58e11e..cb1927bc0f 100644 --- a/paddle/fluid/operators/batch_norm_op.cu.cc +++ b/paddle/fluid/operators/batch_norm_op.cu.cc @@ -114,23 +114,11 @@ class BatchNormKernel const auto *bias = ctx.Input("Bias"); auto *y = ctx.Output("Y"); - auto *mean_out = ctx.Output("MeanOut"); - auto *variance_out = ctx.Output("VarianceOut"); - auto *saved_mean = ctx.Output("SavedMean"); - auto *saved_variance = ctx.Output("SavedVariance"); // alloc memory y->mutable_data(ctx.GetPlace()); - mean_out->mutable_data>(ctx.GetPlace()); - variance_out->mutable_data>(ctx.GetPlace()); - saved_mean->mutable_data>(ctx.GetPlace()); - saved_variance->mutable_data>(ctx.GetPlace()); auto &dev_ctx = ctx.template device_context(); - math::SetConstant> - functor; - functor(dev_ctx, saved_mean, static_cast>(0)); - functor(dev_ctx, saved_variance, static_cast>(0)); auto handle = dev_ctx.cudnn_handle(); @@ -159,6 +147,21 @@ class BatchNormKernel // Run training mode. // obtain running mean and running inv var, and see if we need to // initialize them. + + auto *mean_out = ctx.Output("MeanOut"); + auto *variance_out = ctx.Output("VarianceOut"); + mean_out->mutable_data>(ctx.GetPlace()); + variance_out->mutable_data>(ctx.GetPlace()); + + auto *saved_mean = ctx.Output("SavedMean"); + auto *saved_variance = ctx.Output("SavedVariance"); + saved_mean->mutable_data>(ctx.GetPlace()); + saved_variance->mutable_data>(ctx.GetPlace()); + math::SetConstant> + functor; + functor(dev_ctx, saved_mean, static_cast>(0)); + functor(dev_ctx, saved_variance, static_cast>(0)); + double this_factor = 1. - momentum; CUDNN_ENFORCE(platform::dynload::cudnnBatchNormalizationForwardTraining( From ad73b331c757a0a0d795d9aa99a86b077f144357 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Thu, 12 Apr 2018 13:30:04 +0800 Subject: [PATCH 103/164] Eagerly drop local scope in iteration (#9838) * Eagerly drop local scope in iteration * Correct create var * Fix typo * Debug --- .../details/computation_op_handle.cc | 4 +- .../framework/details/fetch_op_handle.cc | 8 +++- .../fluid/framework/details/op_handle_base.h | 2 + .../framework/details/ssa_graph_executor.h | 4 +- .../details/threaded_ssa_graph_executor.cc | 30 ------------ .../details/threaded_ssa_graph_executor.h | 3 -- paddle/fluid/framework/parallel_executor.cc | 47 +++++++++++++++---- 7 files changed, 54 insertions(+), 44 deletions(-) diff --git a/paddle/fluid/framework/details/computation_op_handle.cc b/paddle/fluid/framework/details/computation_op_handle.cc index 7a1b40c0b6..e3f8bbb72f 100644 --- a/paddle/fluid/framework/details/computation_op_handle.cc +++ b/paddle/fluid/framework/details/computation_op_handle.cc @@ -14,6 +14,8 @@ #include "paddle/fluid/framework/details/computation_op_handle.h" +#include + namespace paddle { namespace framework { namespace details { @@ -33,7 +35,7 @@ void ComputationOpHandle::RunImpl() { } } - op_->Run(*scope_->FindVar("@TMP_SCOPE@")->Get(), place_); + op_->Run(*scope_->FindVar(kLocalExecScopeName)->Get(), place_); } std::string ComputationOpHandle::Name() const { return op_->Type(); } diff --git a/paddle/fluid/framework/details/fetch_op_handle.cc b/paddle/fluid/framework/details/fetch_op_handle.cc index 9180903b86..e3e7c55d15 100644 --- a/paddle/fluid/framework/details/fetch_op_handle.cc +++ b/paddle/fluid/framework/details/fetch_op_handle.cc @@ -14,6 +14,9 @@ #include "paddle/fluid/framework/details/fetch_op_handle.h" +#include +#include + namespace paddle { namespace framework { namespace details { @@ -57,7 +60,10 @@ void FetchOpHandle::RunImpl() { for (size_t i = 0; i < scopes.size(); ++i) { auto &scope = scopes[i]; - auto &t = scope->FindVar(var_name)->Get(); + auto &t = scope->FindVar(kLocalExecScopeName) + ->Get() + ->FindVar(var_name) + ->Get(); if (platform::is_gpu_place(var->place_)) { #ifdef PADDLE_WITH_CUDA TensorCopy(t, cpu, *dev_ctxes_[t.place()], &tensors_[i]); diff --git a/paddle/fluid/framework/details/op_handle_base.h b/paddle/fluid/framework/details/op_handle_base.h index d7a541ac4b..fbdb54ba8d 100644 --- a/paddle/fluid/framework/details/op_handle_base.h +++ b/paddle/fluid/framework/details/op_handle_base.h @@ -24,6 +24,8 @@ namespace paddle { namespace framework { namespace details { +constexpr char kLocalExecScopeName[] = "@LCOAL_SCOPE@"; + class OpHandleBase { private: DISABLE_COPY_AND_ASSIGN(OpHandleBase); diff --git a/paddle/fluid/framework/details/ssa_graph_executor.h b/paddle/fluid/framework/details/ssa_graph_executor.h index 3b818b1a45..a8833b7388 100644 --- a/paddle/fluid/framework/details/ssa_graph_executor.h +++ b/paddle/fluid/framework/details/ssa_graph_executor.h @@ -15,13 +15,15 @@ #pragma once #include +#include +#include + #include "paddle/fluid/framework/details/ssa_graph.h" #include "paddle/fluid/framework/feed_fetch_type.h" namespace paddle { namespace framework { namespace details { - class SSAGraphExecutor { DISABLE_COPY_AND_ASSIGN(SSAGraphExecutor); diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 62af4c1d79..1ce69ab02b 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -136,12 +136,6 @@ FeedFetchList ThreadedSSAGraphExecutor::Run( ready_ops.clear(); }; - // Create local scopes. - for (auto &scope : local_scopes_) { - auto &local_scope = scope->NewScope(); - *scope->Var("@TMP_SCOPE@")->GetMutable() = &local_scope; - } - // Step 3. Execution while (!pending_vars.empty() || !ready_ops.empty() || !delayed_ops.empty()) { // 1. Run All Ready ops @@ -189,34 +183,10 @@ FeedFetchList ThreadedSSAGraphExecutor::Run( PADDLE_ENFORCE(ready_ops.empty()); PADDLE_ENFORCE(delayed_ops.empty()); PADDLE_ENFORCE(blocked_by_delayed_ops.empty()); - ++computation_count_; - - auto sync_computation = [&] { - computation_count_ = 0; - // Wait All computational streams - for (auto p : this->places_) { - platform::DeviceContextPool::Instance().Get(p)->Wait(); - } - for (auto &scope : local_scopes_) { - scope->DropKids(); - } - }; // Wait FetchOps. if (!fetch_ops.empty()) { fetch_ops.clear(); - sync_computation(); - } - - if (computation_count_ == max_async_computation) { - sync_computation(); - } - - // NOTE: the temp scope can be dropped lazily if needed. - // Drop tmp scopes; - for (auto &scope : local_scopes_) { - auto &kid = *scope->Var("@TMP_SCOPE@")->GetMutable(); - kid = nullptr; } return fetch_data; diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.h b/paddle/fluid/framework/details/threaded_ssa_graph_executor.h index 79cfc26b46..bb5e837b13 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.h +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.h @@ -99,9 +99,6 @@ class ThreadedSSAGraphExecutor : public SSAGraphExecutor { std::unique_ptr exception_; std::atomic running_ops_; bool allow_op_delay_; - - size_t computation_count_{0}; - size_t max_async_computation{100}; }; } // namespace details diff --git a/paddle/fluid/framework/parallel_executor.cc b/paddle/fluid/framework/parallel_executor.cc index 20dcc080b6..c1486b527d 100644 --- a/paddle/fluid/framework/parallel_executor.cc +++ b/paddle/fluid/framework/parallel_executor.cc @@ -15,6 +15,7 @@ limitations under the License. */ #include "paddle/fluid/framework/parallel_executor.h" #include +#include #include #ifdef PADDLE_WITH_CUDA @@ -41,6 +42,8 @@ class ParallelExecutorPrivate { #ifdef PADDLE_WITH_CUDA std::unique_ptr nccl_ctxs_; #endif + + std::vector> var_types_; }; std::vector &ParallelExecutor::GetLocalScopes() { @@ -97,14 +100,9 @@ ParallelExecutor::ParallelExecutor( allow_op_delay)); // Step 3. Create vars in each scope; - for (auto *scope : member_->local_scopes_) { - for (auto *var : main_program.Block(0).AllVars()) { - if (scope->FindVar(var->Name()) != nullptr) { - continue; - } - - InitializeVariable(scope->Var(var->Name()), var->GetType()); - } + for (auto *var : main_program.Block(0).AllVars()) { + member_->var_types_.emplace_back(var->Name(), var->GetType(), + var->Persistable()); } } @@ -163,9 +161,42 @@ void ParallelExecutor::Run( const std::unordered_map &feed_tensors) { platform::RecordBlock b(0); SplitTensorToPlaces(feed_tensors); + + // Create local scopes. + for (auto &scope : member_->local_scopes_) { + 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(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); + local_scope = nullptr; + } } void ParallelExecutor::SplitTensorToPlaces( From 339be6254ea5e3432e4cbe44f35609bb45662e12 Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Thu, 12 Apr 2018 05:58:26 +0000 Subject: [PATCH 104/164] Refine the order of arguments. --- paddle/fluid/framework/executor.cc | 5 ++--- paddle/fluid/framework/executor.h | 4 ++-- paddle/fluid/inference/tests/test_helper.h | 6 +++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/paddle/fluid/framework/executor.cc b/paddle/fluid/framework/executor.cc index 910012927b..34bba77f40 100644 --- a/paddle/fluid/framework/executor.cc +++ b/paddle/fluid/framework/executor.cc @@ -359,9 +359,8 @@ void Executor::RunPreparedContext(ExecutorPrepareContext* ctx, Scope* scope, void Executor::RunPreparedContext( ExecutorPrepareContext* ctx, Scope* scope, std::map& feed_targets, - std::map& fetch_targets, - const std::string& feed_holder_name, const std::string& fetch_holder_name, - bool create_vars) { + std::map& fetch_targets, bool create_vars, + const std::string& feed_holder_name, const std::string& fetch_holder_name) { auto& global_block = ctx->prog_.Block(ctx->block_id_); PADDLE_ENFORCE( diff --git a/paddle/fluid/framework/executor.h b/paddle/fluid/framework/executor.h index cbd70d9544..8b3ea01542 100644 --- a/paddle/fluid/framework/executor.h +++ b/paddle/fluid/framework/executor.h @@ -73,9 +73,9 @@ class Executor { void RunPreparedContext(ExecutorPrepareContext* ctx, Scope* scope, std::map& feed_targets, std::map& fetch_targets, + bool create_vars = true, const std::string& feed_holder_name = "feed", - const std::string& fetch_holder_name = "fetch", - bool create_vars = true); + const std::string& fetch_holder_name = "fetch"); private: const platform::Place place_; diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 09fe344ec7..9875e43860 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -178,8 +178,8 @@ void TestInference(const std::string& dirname, std::unique_ptr ctx; if (PrepareContext) { ctx = executor.Prepare(*inference_program, 0); - executor.RunPreparedContext(ctx.get(), scope, feed_targets, - fetch_targets); + executor.RunPreparedContext(ctx.get(), scope, feed_targets, fetch_targets, + CreateVars); } else { executor.Run(*inference_program, scope, feed_targets, fetch_targets, CreateVars); @@ -198,7 +198,7 @@ void TestInference(const std::string& dirname, // Note: if you changed the inference_program, you need to call // executor.Prepare() again to get a new ExecutorPrepareContext. executor.RunPreparedContext(ctx.get(), scope, feed_targets, - fetch_targets); + fetch_targets, CreateVars); } else { executor.Run(*inference_program, scope, feed_targets, fetch_targets, CreateVars); From 26cfc634b9f4dc02b051b49f54e33b57938e5ff2 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Thu, 12 Apr 2018 14:48:26 +0800 Subject: [PATCH 105/164] multi stream thread pool --- paddle/fluid/framework/threadpool.cc | 10 +++++++--- paddle/fluid/framework/threadpool.h | 10 +++++----- paddle/fluid/operators/detail/grpc_server.cc | 2 +- .../paddle/fluid/tests/book/test_recognize_digits.py | 1 - 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/paddle/fluid/framework/threadpool.cc b/paddle/fluid/framework/threadpool.cc index 0a8377cc47..109c2c745c 100644 --- a/paddle/fluid/framework/threadpool.cc +++ b/paddle/fluid/framework/threadpool.cc @@ -14,8 +14,12 @@ #include "paddle/fluid/framework/threadpool.h" +#include "gflags/gflags.h" #include "paddle/fluid/platform/enforce.h" +DEFINE_int32(io_threadpool_size, 100, + "number of threads used for doing IO, default 100"); + namespace paddle { namespace framework { @@ -94,15 +98,15 @@ void ThreadPool::TaskLoop() { std::unique_ptr MultiStreamThreadPool::io_threadpool_(nullptr); std::once_flag MultiStreamThreadPool::io_init_flag_; -MultiStreamThreadPool* MultiStreamThreadPool::GetInstanceIO() { +ThreadPool* MultiStreamThreadPool::GetInstanceIO() { std::call_once(io_init_flag_, &MultiStreamThreadPool::InitIO); - return static_cast(io_threadpool_.get()); + return io_threadpool_.get(); } void MultiStreamThreadPool::InitIO() { if (io_threadpool_.get() == nullptr) { // TODO(typhoonzero1986): make this configurable - io_threadpool_.reset(new ThreadPool(100)); + io_threadpool_.reset(new ThreadPool(FLAGS_io_threadpool_size)); } } diff --git a/paddle/fluid/framework/threadpool.h b/paddle/fluid/framework/threadpool.h index 0a60488d9f..1cc058834c 100644 --- a/paddle/fluid/framework/threadpool.h +++ b/paddle/fluid/framework/threadpool.h @@ -14,12 +14,12 @@ limitations under the License. */ #pragma once -#include +#include // NOLINT #include -#include -#include +#include // NOLINT +#include // NOLINT #include -#include +#include // NOLINT #include #include "glog/logging.h" #include "paddle/fluid/platform/enforce.h" @@ -137,7 +137,7 @@ class ThreadPool { class MultiStreamThreadPool : ThreadPool { public: - static MultiStreamThreadPool* GetInstanceIO(); + static ThreadPool* GetInstanceIO(); static void InitIO(); private: diff --git a/paddle/fluid/operators/detail/grpc_server.cc b/paddle/fluid/operators/detail/grpc_server.cc index d5fc163bc2..36dad5dd43 100644 --- a/paddle/fluid/operators/detail/grpc_server.cc +++ b/paddle/fluid/operators/detail/grpc_server.cc @@ -216,10 +216,10 @@ void AsyncGRPCServer::RunSyncUpdate() { std::function prefetch_register = std::bind(&AsyncGRPCServer::TryToRegisterNewPrefetchOne, this); + // TODO(wuyi): Run these "HandleRequest" in thread pool t_send_.reset( new std::thread(std::bind(&AsyncGRPCServer::HandleRequest, this, cq_send_.get(), "cq_send", send_register))); - t_get_.reset( new std::thread(std::bind(&AsyncGRPCServer::HandleRequest, this, cq_get_.get(), "cq_get", get_register))); diff --git a/python/paddle/fluid/tests/book/test_recognize_digits.py b/python/paddle/fluid/tests/book/test_recognize_digits.py index e4997b4069..5ec6890c1b 100644 --- a/python/paddle/fluid/tests/book/test_recognize_digits.py +++ b/python/paddle/fluid/tests/book/test_recognize_digits.py @@ -157,7 +157,6 @@ def train(nn_type, for ip in pserver_ips.split(","): eplist.append(':'.join([ip, port])) pserver_endpoints = ",".join(eplist) # ip:port,ip:port... - pserver_endpoints = os.getenv("PSERVERS") trainers = int(os.getenv("TRAINERS")) current_endpoint = os.getenv("POD_IP") + ":" + port trainer_id = int(os.getenv("PADDLE_INIT_TRAINER_ID")) From 4c55a6022a0a758295177371fc67c6800658b286 Mon Sep 17 00:00:00 2001 From: Qiao Longfei Date: Thu, 12 Apr 2018 15:26:35 +0800 Subject: [PATCH 106/164] Dist transpiler support prefetch (#9714) * init * add some check * add dist transpile logic * add insert op for block * init change get_pserver_program * optimize code * fix a bug * can run now * start to do table split * start to process table gradient * complete pserver part * can send_vars now * revert cpplint * fix a bug * optimize code * move dist test to models * revert the interface of distribute_transpiler.transpile * fix prefetch_block * optimize trainspiler code * add comment to sum_op * add warning log * fix comment * fix test_send_recv * fix test_send_recv * fix train with no distributed table * optimize GetDims --- paddle/fluid/framework/block_desc.h | 2 +- paddle/fluid/framework/operator.cc | 13 +- paddle/fluid/operators/concat_op.cc | 6 +- paddle/fluid/operators/detail/grpc_server.cc | 1 + paddle/fluid/operators/listen_and_serv_op.cc | 45 ++- paddle/fluid/operators/listen_and_serv_op.h | 2 + paddle/fluid/operators/lookup_table_op.cc | 3 + paddle/fluid/operators/prefetch_op.cc | 8 +- paddle/fluid/operators/send_recv_op_test.cc | 26 +- paddle/fluid/operators/send_vars_op.cc | 4 +- paddle/fluid/operators/sgd_op.cc | 4 +- paddle/fluid/operators/split_ids_op.cc | 14 +- paddle/fluid/operators/split_ids_op.h | 70 ++-- paddle/fluid/operators/sum_op.cc | 7 +- python/paddle/fluid/distribute_transpiler.py | 343 +++++++++++++++++-- python/paddle/fluid/layers/nn.py | 8 +- 16 files changed, 450 insertions(+), 106 deletions(-) diff --git a/paddle/fluid/framework/block_desc.h b/paddle/fluid/framework/block_desc.h index 873969b2a8..eef19c4f09 100644 --- a/paddle/fluid/framework/block_desc.h +++ b/paddle/fluid/framework/block_desc.h @@ -92,7 +92,7 @@ class BlockDesc { /* * Remove Op and its input/output variables. - * Note that for either input or ouput variable, if it is also an input or + * Note that for either input or output variable, if it is also an input or * output variable of other ops, we should remain it. */ void RemoveOp(size_t s, size_t e); diff --git a/paddle/fluid/framework/operator.cc b/paddle/fluid/framework/operator.cc index a3b4a8c082..f97bd08274 100644 --- a/paddle/fluid/framework/operator.cc +++ b/paddle/fluid/framework/operator.cc @@ -46,7 +46,8 @@ proto::VarType::Type GetDataTypeOfVar(const Variable* var) { } } -static DDim GetDims(const Scope& scope, const std::string& name) { +static DDim GetDims(const Scope& scope, const std::string& name, + bool get_actual_dim = false) { Variable* var = scope.FindVar(name); if (var == nullptr) { return DDim({-1}); @@ -55,7 +56,11 @@ static DDim GetDims(const Scope& scope, const std::string& name) { if (var->IsType()) { return var->Get().dims(); } else if (var->IsType()) { - return var->Get().GetCompleteDims(); + if (get_actual_dim) { + return var->Get().value().dims(); + } else { + return var->Get().GetCompleteDims(); + } } else { return DDim({-1}); } @@ -129,7 +134,7 @@ std::string OperatorBase::DebugStringEx(const Scope* scope) const { for (size_t i = 0; i < input.second.size(); ++i) { ss << input.second[i]; if (scope) { - ss << "[" << GetDims(*scope, input.second[i]) << "]"; + ss << "[" << GetDims(*scope, input.second[i], true) << "]"; ss << "(" << GetLoD(*scope, input.second[i]) << ")"; } if (i != input.second.size() - 1) { @@ -149,7 +154,7 @@ std::string OperatorBase::DebugStringEx(const Scope* scope) const { for (size_t i = 0; i < output.second.size(); ++i) { ss << output.second[i]; if (scope) { - ss << "[" << GetDims(*scope, output.second[i]) << "]"; + ss << "[" << GetDims(*scope, output.second[i], true) << "]"; ss << "(" << GetLoD(*scope, output.second[i]) << ")"; } if (i != output.second.size() - 1) { diff --git a/paddle/fluid/operators/concat_op.cc b/paddle/fluid/operators/concat_op.cc index d65a7b3467..4a36b03cb6 100644 --- a/paddle/fluid/operators/concat_op.cc +++ b/paddle/fluid/operators/concat_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/concat_op.h" + #include #include @@ -34,7 +35,10 @@ class ConcatOp : public framework::OperatorWithKernel { size_t axis = static_cast(ctx->Attrs().Get("axis")); const size_t n = ins.size(); - PADDLE_ENFORCE_GT(n, 1, "Input tensors count should > 1."); + PADDLE_ENFORCE_GT(n, 0, "Input tensors count should > 0."); + if (n == 1) { + VLOG(3) << "Warning: concat op have only one input, may waste memory"; + } auto out_dims = ins[0]; size_t in_zero_dims_size = out_dims.size(); diff --git a/paddle/fluid/operators/detail/grpc_server.cc b/paddle/fluid/operators/detail/grpc_server.cc index d5fc163bc2..0b582a08bc 100644 --- a/paddle/fluid/operators/detail/grpc_server.cc +++ b/paddle/fluid/operators/detail/grpc_server.cc @@ -161,6 +161,7 @@ class RequestPrefetch final : public RequestBase { ::grpc::ByteBuffer reply; std::string var_name = request_->OutVarname(); + VLOG(3) << "prefetch var " << var_name; auto var_desc = program_->Block(0).FindVar(var_name); framework::Scope* local_scope = &scope_->NewScope(); auto* var = local_scope->FindVar(var_name); diff --git a/paddle/fluid/operators/listen_and_serv_op.cc b/paddle/fluid/operators/listen_and_serv_op.cc index 9188f2d989..5d293665f0 100644 --- a/paddle/fluid/operators/listen_and_serv_op.cc +++ b/paddle/fluid/operators/listen_and_serv_op.cc @@ -13,7 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #include -#include +#include // NOLINT +#include #include "paddle/fluid/operators/listen_and_serv_op.h" @@ -88,8 +89,9 @@ void ListenAndServOp::RunImpl(const framework::Scope &scope, auto ins = Inputs("X"); auto fan_in = Attr("Fanin"); - auto *block = Attr(kOptimizeBlock); - auto *program = block->Program(); + auto *optimize_block = Attr(kOptimizeBlock); + auto *prefetch_block = Attr(kPrefetchBlock); + auto *program = optimize_block->Program(); size_t num_blocks = program->Size(); PADDLE_ENFORCE_GE(num_blocks, 2, "server program should have at least 2 blocks"); @@ -97,18 +99,25 @@ void ListenAndServOp::RunImpl(const framework::Scope &scope, framework::Executor executor(dev_place); std::vector block_list; for (size_t blkid = 1; blkid < num_blocks; ++blkid) { - block_list.push_back(blkid); + if (blkid != prefetch_block->ID()) { + block_list.push_back(blkid); + } } - auto prepared = executor.Prepare(*program, block_list); + auto optimize_prepared = executor.Prepare(*program, block_list); // Insert placeholder for block0 which holds current op itself. - prepared.insert(prepared.begin(), - std::shared_ptr(nullptr)); + optimize_prepared.insert( + optimize_prepared.begin(), + std::shared_ptr(nullptr)); rpc_service_->SetScope(&recv_scope); rpc_service_->SetDevCtx(&dev_ctx); // TODO(qiao) set proper fields for table lookup and update rpc_service_->SetExecutor(&executor); - rpc_service_->SetPrefetchBlkdId(0); + VLOG(3) << "prefetch block id is " << prefetch_block->ID(); + auto prefetch_prepared = executor.Prepare(*program, prefetch_block->ID()); + rpc_service_->SetPrefetchBlkdId(prefetch_block->ID()); + rpc_service_->SetPrefetchPreparedCtx(prefetch_prepared.get()); + prefetch_prepared.release(); rpc_service_->SetProgram(program); // start the server listening after all member initialized. server_thread_.reset(new std::thread(RunServer, rpc_service_)); @@ -166,16 +175,18 @@ void ListenAndServOp::RunImpl(const framework::Scope &scope, parallel_blkids.push_back(1); double ts = detail::GetTimestamp(); for (size_t blkid = 2; blkid < num_blocks; ++blkid) { - if (program->Block(blkid).Parent() != last_parent_blkid) { - ParallelExecuteBlocks(parallel_blkids, &executor, prepared, program, - &recv_scope); - parallel_blkids.clear(); - last_parent_blkid = program->Block(blkid).Parent(); + if (blkid != prefetch_block->ID()) { + if (program->Block(blkid).Parent() != last_parent_blkid) { + ParallelExecuteBlocks(parallel_blkids, &executor, optimize_prepared, + program, &recv_scope); + parallel_blkids.clear(); + last_parent_blkid = program->Block(blkid).Parent(); + } + parallel_blkids.push_back(blkid); } - parallel_blkids.push_back(blkid); } - ParallelExecuteBlocks(parallel_blkids, &executor, prepared, program, - &recv_scope); + ParallelExecuteBlocks(parallel_blkids, &executor, optimize_prepared, + program, &recv_scope); VLOG(2) << "run all blocks spent " << detail::GetTimestamp() - ts << "(ms)"; // Reset the received sparse variables, the sum operator would not @@ -211,6 +222,8 @@ from send_op and send back variables to recv_op. .AddCustomChecker([](const std::string &ip) { return !ip.empty(); }); AddAttr(kOptimizeBlock, "BlockID to run on server side."); + AddAttr(kPrefetchBlock, + "prefetch block to run on server side."); AddAttr("Fanin", "How many clients send to this server.") .SetDefault(1); } diff --git a/paddle/fluid/operators/listen_and_serv_op.h b/paddle/fluid/operators/listen_and_serv_op.h index 0da87afc96..759b2a462b 100644 --- a/paddle/fluid/operators/listen_and_serv_op.h +++ b/paddle/fluid/operators/listen_and_serv_op.h @@ -16,6 +16,7 @@ limitations under the License. */ #include #include +#include #include "paddle/fluid/framework/executor.h" #include "paddle/fluid/framework/lod_tensor.h" @@ -27,6 +28,7 @@ namespace paddle { namespace operators { constexpr char kOptimizeBlock[] = "OptimizeBlock"; +constexpr char kPrefetchBlock[] = "PrefetchBlock"; void RunServer(std::shared_ptr service); diff --git a/paddle/fluid/operators/lookup_table_op.cc b/paddle/fluid/operators/lookup_table_op.cc index bf33be3106..5e59bd1b17 100644 --- a/paddle/fluid/operators/lookup_table_op.cc +++ b/paddle/fluid/operators/lookup_table_op.cc @@ -78,6 +78,9 @@ class LookupTableOpMaker : public framework::OpProtoAndCheckerMaker { "(boolean, default false) " "Sparse update.") .SetDefault(false); + AddAttr("is_distributed", + "(boolean, default false) distributed lookup table.") + .SetDefault(false); AddAttr("padding_idx", "(int64, default -1) " "If the value is -1, it makes no effect to lookup. " diff --git a/paddle/fluid/operators/prefetch_op.cc b/paddle/fluid/operators/prefetch_op.cc index 09ab7da663..f9ae01ab5d 100644 --- a/paddle/fluid/operators/prefetch_op.cc +++ b/paddle/fluid/operators/prefetch_op.cc @@ -12,7 +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. */ -#include +#include // NOLINT #include #include "paddle/fluid/framework/data_type.h" @@ -50,8 +50,8 @@ class PrefetchOp : public framework::OperatorBase { for (size_t i = 0; i < ins.size(); i++) { if (NeedSend(scope, ins[i])) { - VLOG(3) << "sending " << ins[i] << " to " << epmap[i] << "to get " - << outs[i] << "back"; + VLOG(3) << "sending " << ins[i] << " to " << epmap[i] << " to get " + << outs[i] << " back"; rpc_client->AsyncPrefetchVariable(epmap[i], ctx, scope, ins[i], outs[i]); } else { @@ -71,7 +71,7 @@ class PrefetchOpMaker : public framework::OpProtoAndCheckerMaker { "(RPCClient) The RPC client object which will be" "initialized at most once."); AddOutput("Out", - "(SelectedRows) result " + "(LoDTensor) result " "to be fetched from parameter server") .AsDuplicable(); AddAttr>( diff --git a/paddle/fluid/operators/send_recv_op_test.cc b/paddle/fluid/operators/send_recv_op_test.cc index 542bc3fde2..3bf5d57809 100644 --- a/paddle/fluid/operators/send_recv_op_test.cc +++ b/paddle/fluid/operators/send_recv_op_test.cc @@ -14,7 +14,7 @@ limitations under the License. */ #include #include -#include +#include // NOLINT #include "gtest/gtest.h" #include "paddle/fluid/framework/op_registry.h" @@ -37,11 +37,11 @@ namespace m = paddle::operators::math; std::unique_ptr listen_and_serv_op; int selected_port; -void InitTensorsInScope(f::Scope &scope, p::CPUPlace &place) { +void InitTensorsInScope(const p::CPUPlace &place, f::Scope *scope) { p::CPUDeviceContext ctx(place); for (int i = 0; i < 2; ++i) { auto var_name = paddle::string::Sprintf("x%d", i); - auto var = scope.Var(var_name); + auto var = scope->Var(var_name); auto tensor = var->GetMutable(); tensor->Resize({10, 10}); float *expect = tensor->mutable_data(place); @@ -50,20 +50,20 @@ void InitTensorsInScope(f::Scope &scope, p::CPUPlace &place) { } } - auto out_var = scope.Var("Out"); + auto out_var = scope->Var("Out"); auto out_tensor = out_var->GetMutable(); out_tensor->Resize({10, 10}); out_tensor->mutable_data(place); // allocate } -void InitSelectedRowsInScope(f::Scope &scope, p::CPUPlace &place) { +void InitSelectedRowsInScope(const p::CPUPlace &place, f::Scope *scope) { p::CPUDeviceContext ctx(place); int64_t height = 10; int64_t row_numel = 10; m::SetConstant set_one; // init x0 std::vector rows0{0, 4, 7}; - auto x0_var = scope.Var("x0"); + auto x0_var = scope->Var("x0"); auto x0 = x0_var->GetMutable(); x0->set_rows(rows0); x0->set_height(height); @@ -74,7 +74,7 @@ void InitSelectedRowsInScope(f::Scope &scope, p::CPUPlace &place) { // init x1 std::vector rows1{2, 9}; - auto x1_var = scope.Var("x1"); + auto x1_var = scope->Var("x1"); auto x1 = x1_var->GetMutable(); x1->set_rows(rows1); x1->set_height(height); @@ -83,7 +83,7 @@ void InitSelectedRowsInScope(f::Scope &scope, p::CPUPlace &place) { f::make_ddim({static_cast(rows1.size()), row_numel}), place); set_one(ctx, x1_value, 1.0); - auto out_var = scope.Var("Out"); + auto out_var = scope->Var("Out"); auto out = out_var->GetMutable(); auto out_value = out->mutable_value(); out->set_height(height); @@ -117,15 +117,16 @@ void StartServerNet(bool is_sparse) { f::Scope scope; p::CPUPlace place; if (is_sparse) { - InitSelectedRowsInScope(scope, place); + InitSelectedRowsInScope(place, &scope); } else { - InitTensorsInScope(scope, place); + InitTensorsInScope(place, &scope); } // sub program run in listen_and_serv_op, for simple test we use sum f::ProgramDesc program; const auto &root_block = program.Block(0); auto *optimize_block = program.AppendBlock(root_block); + auto *prefetch_block = program.AppendBlock(root_block); // X for server side tensors, RX for received tensers, must be of same shape. AddOp("sum", {{"X", {"x0", "x1"}}}, {{"Out", {"Out"}}}, {}, optimize_block); @@ -135,6 +136,7 @@ void StartServerNet(bool is_sparse) { attrs.insert({"ParamList", std::vector({"Out"})}); attrs.insert({"GradList", std::vector({"x1"})}); attrs.insert({"OptimizeBlock", optimize_block}); + attrs.insert({"PrefetchBlock", prefetch_block}); listen_and_serv_op = f::OpRegistry::CreateOp("listen_and_serv", {{"X", {"x1"}}}, {}, attrs); LOG(INFO) << "selected port before run " << selected_port; @@ -148,7 +150,7 @@ TEST(SendRecvOp, CPUDense) { // local net f::Scope scope; p::CPUPlace place; - InitTensorsInScope(scope, place); + InitTensorsInScope(place, &scope); // create rpc client var scope.Var("RPC_CLIENT_VAR"); @@ -191,7 +193,7 @@ TEST(SendRecvOp, CPUSparse) { f::Scope scope; p::CPUPlace place; p::CPUDeviceContext ctx(place); - InitSelectedRowsInScope(scope, place); + InitSelectedRowsInScope(place, &scope); scope.Var("RPC_CLIENT_VAR"); f::AttributeMap attrs; selected_port = static_cast( diff --git a/paddle/fluid/operators/send_vars_op.cc b/paddle/fluid/operators/send_vars_op.cc index 2cbd9e2394..56b3713d6a 100644 --- a/paddle/fluid/operators/send_vars_op.cc +++ b/paddle/fluid/operators/send_vars_op.cc @@ -12,7 +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. */ -#include +#include // NOLINT #include #include "paddle/fluid/framework/data_type.h" @@ -36,7 +36,7 @@ class SendVarsOp : public framework::OperatorBase { auto ins = Inputs("X"); std::vector epmap = Attr>("epmap"); - int sync_send = Attr("sync_sent"); + int sync_send = Attr("sync_send"); platform::DeviceContextPool& pool = platform::DeviceContextPool::Instance(); auto& ctx = *pool.Get(place); diff --git a/paddle/fluid/operators/sgd_op.cc b/paddle/fluid/operators/sgd_op.cc index 074fa9e00f..06cb0550ad 100644 --- a/paddle/fluid/operators/sgd_op.cc +++ b/paddle/fluid/operators/sgd_op.cc @@ -35,8 +35,8 @@ class SGDOp : public framework::OperatorWithKernel { PADDLE_ENFORCE_EQ(framework::product(lr_dims), 1, "Learning rate should have 1 element"); auto param_dim = ctx->GetInputDim("Param"); - // TODO(qijun): check dimensions of Param and Grad at complie - // and run time. + // TODO(qijun): check dimensions of Param and Grad at compile + // and runtime. ctx->SetOutputDim("ParamOut", param_dim); } diff --git a/paddle/fluid/operators/split_ids_op.cc b/paddle/fluid/operators/split_ids_op.cc index a54f8a2878..a53cbc8ac5 100644 --- a/paddle/fluid/operators/split_ids_op.cc +++ b/paddle/fluid/operators/split_ids_op.cc @@ -48,11 +48,11 @@ class SplitIdsOp : public framework::OperatorWithKernel { PADDLE_ENFORCE(ctx->HasOutputs("Out"), "SplitIdsOp must has output Out."); auto ids_var_type = ctx->GetInputsVarType("Ids").front(); - PADDLE_ENFORCE_EQ(ids_var_type, framework::proto::VarType::LOD_TENSOR); - auto ids_dims = ctx->GetInputDim("Ids"); - PADDLE_ENFORCE_EQ(ids_dims.size(), 2); - PADDLE_ENFORCE_EQ(ids_dims[1], 1); + if (ids_var_type == framework::proto::VarType::LOD_TENSOR) { + PADDLE_ENFORCE_EQ(ids_dims.size(), 2); + PADDLE_ENFORCE_EQ(ids_dims[1], 1); + } } }; @@ -60,8 +60,9 @@ class SplitIdsOpInferVarType : public framework::VarTypeInference { public: void operator()(const framework::OpDesc &op_desc, framework::BlockDesc *block) const override { + auto *input_var = block->Var(op_desc.Input("Ids")[0]); for (auto &out_var : op_desc.Output("Out")) { - block->Var(out_var)->SetType(framework::proto::VarType::LOD_TENSOR); + block->Var(out_var)->SetType(input_var->GetType()); } } }; @@ -73,4 +74,5 @@ namespace ops = paddle::operators; REGISTER_OPERATOR(split_ids, ops::SplitIdsOp, ops::SplitIdsOpMaker, ops::SplitIdsOpInferVarType); REGISTER_OP_CPU_KERNEL( - split_ids, ops::SplitIdsOpKernel); + split_ids, ops::SplitIdsOpKernel, + ops::SplitIdsOpKernel); diff --git a/paddle/fluid/operators/split_ids_op.h b/paddle/fluid/operators/split_ids_op.h index d36ed398eb..ba1e903dbb 100644 --- a/paddle/fluid/operators/split_ids_op.h +++ b/paddle/fluid/operators/split_ids_op.h @@ -24,35 +24,63 @@ namespace operators { template class SplitIdsOpKernel : public framework::OpKernel { public: - void Compute(const framework::ExecutionContext& ctx) const override { + void Compute(const framework::ExecutionContext &ctx) const override { auto place = ctx.GetPlace(); if (!platform::is_cpu_place(place)) { PADDLE_THROW("SplitIds do not support GPU kernel"); } - auto& ids_dims = ctx.Input("Ids")->dims(); - const T* ids = ctx.Input("Ids")->data(); - auto outs = ctx.MultiOutput("Out"); - const size_t shard_num = outs.size(); + const auto *ids_var = ctx.InputVar("Ids"); + if (ids_var->IsType()) { + const auto &ids_dims = ctx.Input("Ids")->dims(); + const T *ids = ctx.Input("Ids")->data(); + auto outs = ctx.MultiOutput("Out"); + const size_t shard_num = outs.size(); - std::vector> out_ids; - out_ids.resize(outs.size()); + std::vector> out_ids; + out_ids.resize(outs.size()); - // split id by their shard_num. - for (int i = 0; i < ids_dims[0]; ++i) { - T id = ids[i]; - size_t shard_id = static_cast(id) % shard_num; - out_ids[shard_id].push_back(id); - } + // split id by their shard_num. + for (int i = 0; i < ids_dims[0]; ++i) { + T id = ids[i]; + size_t shard_id = static_cast(id) % shard_num; + out_ids[shard_id].push_back(id); + } + + // create tensor for each shard and send to parameter server + for (size_t i = 0; i < out_ids.size(); ++i) { + auto *shard_t = outs[i]; + std::vector ids = out_ids[i]; + auto *shard_data = shard_t->mutable_data( + framework::make_ddim({static_cast(ids.size()), 1}), place); + for (size_t i = 0; i < ids.size(); ++i) { + shard_data[i] = ids[i]; + } + } + } else if (ids_var->IsType()) { + const auto *ids_selected_rows = ctx.Input("Ids"); + auto &ids_dims = ids_selected_rows->value().dims(); + PADDLE_ENFORCE_EQ(ids_dims[0], ids_selected_rows->rows().size(), ""); + const T *ids = ids_selected_rows->value().data(); + const auto &ids_rows = ids_selected_rows->rows(); + auto outs = ctx.MultiOutput("Out"); + const size_t shard_num = outs.size(); + // get rows for outputs + for (auto &id : ids_rows) { + size_t shard_id = static_cast(id) % shard_num; + outs[shard_id]->mutable_rows()->push_back(id); + } - // create tensor for each shard and send to parameter server - for (size_t i = 0; i < out_ids.size(); ++i) { - auto* shard_t = outs[i]; - std::vector ids = out_ids[i]; - auto* shard_data = shard_t->mutable_data( - framework::make_ddim({static_cast(ids.size()), 1}), place); - for (size_t i = 0; i < ids.size(); ++i) { - shard_data[i] = ids[i]; + int64_t row_width = ids_dims[1]; + for (auto &out : outs) { + out->set_height(ids_selected_rows->height()); + framework::DDim ddim = framework::make_ddim( + {static_cast(out->rows().size()), row_width}); + T *output = out->mutable_value()->mutable_data(ddim, place); + for (size_t i = 0; i < ddim[0]; ++i) { + memcpy(output + i * row_width, ids + out->rows()[i] * row_width, + row_width * sizeof(T)); + } } } } diff --git a/paddle/fluid/operators/sum_op.cc b/paddle/fluid/operators/sum_op.cc index 9061e137bd..108f26fafe 100644 --- a/paddle/fluid/operators/sum_op.cc +++ b/paddle/fluid/operators/sum_op.cc @@ -10,9 +10,11 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/sum_op.h" + #include #include #include + #include "paddle/fluid/framework/var_type_inference.h" #include "paddle/fluid/operators/detail/safe_ref.h" @@ -37,7 +39,10 @@ class SumOp : public framework::OperatorWithKernel { auto x_dims = ctx->GetInputsDim("X"); size_t N = x_dims.size(); - PADDLE_ENFORCE_GT(N, 1, "Input tensors count should > 1."); + PADDLE_ENFORCE_GT(N, 0, "Input tensors count should > 0."); + if (N == 1) { + VLOG(3) << "Warning: sum have only one input, may waste memory"; + } framework::DDim in_dim({0}); for (auto& x_dim : x_dims) { diff --git a/python/paddle/fluid/distribute_transpiler.py b/python/paddle/fluid/distribute_transpiler.py index e18ace844e..b0522b49f4 100644 --- a/python/paddle/fluid/distribute_transpiler.py +++ b/python/paddle/fluid/distribute_transpiler.py @@ -13,14 +13,17 @@ # limitations under the License. from __future__ import print_function -import framework -from framework import Program, default_main_program, default_startup_program, Parameter, Variable -import optimizer -from layer_helper import LayerHelper -import distributed_splitter as splitter + import math + +import distributed_splitter as splitter +import framework +from framework import Program, default_main_program, Variable from . import core -import debuger + +LOOKUP_TABLE_TYPE = "lookup_table" +LOOKUP_TABLE_GRAD_TYPE = "lookup_table_grad" +RPC_CLIENT_VAR_NAME = "RPC_CLIENT_VAR" class VarBlock: @@ -35,9 +38,9 @@ class VarBlock: class UnionFind(object): - """ Union-find data struct. + """ Union-find data structure. - Union-find is a data struct that keeps track of a set of elements partitioned + Union-find is a data structure that keeps track of a set of elements partitioned into a number of disjoint (non-overlapping) subsets. Reference: @@ -185,19 +188,66 @@ class DistributeTranspiler: assert (callable(split_method)) if program is None: program = default_main_program() - self.program = program - self.trainers = trainers + self.origin_program = program + self.trainer_num = trainers self.optimize_ops = optimize_ops # TODO(typhoonzero): currently trainer_id is fetched from cluster system # like Kubernetes, we should port this to use etcd later when developing # fluid distributed training with fault-tolerance. self.trainer_id = trainer_id pserver_endpoints = pservers.split(",") + self.pserver_endpoints = pserver_endpoints + + # process lookup_table_op + # 1. check all lookup_table_op is distributed + # 2. check all lookup_table_op share the same table. + distributed_lookup_table_ops = [] + # support only one distributed_lookup_table now + self.table_name = None + for op in program.global_block().ops: + if op.type == LOOKUP_TABLE_TYPE: + if op.attrs['is_distributed'] is True: + if self.table_name is None: + self.table_name = op.input("W")[0] + if self.table_name != op.input("W")[0]: + raise RuntimeError("all distributed lookup_table_ops" + " should have only one table") + distributed_lookup_table_ops.append(op) + else: + if self.table_name is not None: + assert op.input("W")[0] != self.table_name + + self.has_distributed_lookup_table = len( + distributed_lookup_table_ops) > 0 # step1: For large parameters and gradients, split them into smaller # blocks. param_list = [pg[0] for pg in params_grads] grad_list = [pg[1] for pg in params_grads] + + if self.has_distributed_lookup_table: + param_list = [ + param for param in param_list if param.name != self.table_name + ] + grad_list = [ + grad for grad in grad_list + if grad.name != framework.grad_var_name(self.table_name) + ] + self.table_param_grad = [ + param_grad for param_grad in params_grads + if param_grad[0].name == self.table_name + ][0] + table_grad_var = self.table_param_grad[1] + self.table_grad_list = [ + program.global_block().create_var( + name="%s.trainer_%d.pserver_%d" % + (table_grad_var.name, trainer_id, index), + type=table_grad_var.type, + shape=table_grad_var.shape, + dtype=table_grad_var.dtype) + 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)) # step2: Create new vars for the parameters and gradients blocks and @@ -229,7 +279,7 @@ class DistributeTranspiler: self.param_grad_ep_mapping[ep]["grads"].append(grad) rpc_client_var = program.global_block().create_var( - name="RPC_CLIENT_VAR", + name=RPC_CLIENT_VAR_NAME, persistable=True, type=core.VarDesc.VarType.RAW) @@ -252,13 +302,19 @@ class DistributeTranspiler: outputs={"Out": [orig_param]}, attrs={"axis": 0}) + if self.has_distributed_lookup_table: + self._replace_lookup_table_op_with_prefetch(program, rpc_client_var, + eplist) + self._split_table_grad_and_add_send_vars(program, rpc_client_var, + pserver_endpoints) + 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) - self.program.sync_with_cpp() + self.origin_program.global_block().delete_ops(self.optimize_ops) + self.origin_program.sync_with_cpp() # FIXME(typhoonzero): serialize once will fix error occurs when clone. - self.program.__str__() - return self.program + self.origin_program.__str__() + return self.origin_program def get_pserver_program(self, endpoint): """ @@ -294,8 +350,8 @@ class DistributeTranspiler: type=v.type, dtype=v.dtype, shape=v.shape) - if self.trainers > 1: - for trainer_id in xrange(self.trainers): + if self.trainer_num > 1: + for trainer_id in xrange(self.trainer_num): var = pserver_program.global_block().create_var( name="%s.trainer_%d" % (orig_var_name, trainer_id), persistable=False, @@ -309,7 +365,7 @@ class DistributeTranspiler: # step3 optimize_block = pserver_program.create_block(0) # step 4 - # Create a union-find data struct from optimize ops, + # Create a union-find data structure from optimize ops, # If two ops are connected, we could add these two ops # into one set. ufind = self._create_ufind(self.optimize_ops) @@ -384,6 +440,23 @@ class DistributeTranspiler: # __append_optimize_op__(glb_op, optimize_block) # break + # process distributed lookup_table + prefetch_block = None + if self.has_distributed_lookup_table: + pserver_index = self.pserver_endpoints.index(endpoint) + self._create_table_optimize_block(pserver_index, pserver_program, + append_block) + prefetch_block = self._create_prefetch_block( + pserver_index, pserver_program, optimize_block) + + # NOTE: if has_distributed_lookup_table is False, then prefetch_block will + # not be executed, so it's safe to use optimize_block to hold the place + if self.has_distributed_lookup_table: + assert prefetch_block is not None + else: + assert prefetch_block is None + prefetch_block = pserver_program.global_block() + # step5 append the listen_and_serv op pserver_program.global_block().append_op( type="listen_and_serv", @@ -392,8 +465,10 @@ class DistributeTranspiler: attrs={ "OptimizeBlock": optimize_block, "endpoint": endpoint, - "Fanin": self.trainers + "Fanin": self.trainer_num, + "PrefetchBlock": prefetch_block }) + pserver_program.sync_with_cpp() return pserver_program @@ -451,6 +526,197 @@ class DistributeTranspiler: attrs=op.attrs) return s_prog + # transpiler function for dis lookup_table + def _replace_lookup_table_op_with_prefetch(self, program, rpc_client_var, + eplist): + # 1. replace lookup_table_op with split_ids_op -> prefetch_op -> sum_op + self.prefetch_input_vars = None + self.prefetch_output_vars = None + + continue_search_lookup_table_op = True + while continue_search_lookup_table_op: + continue_search_lookup_table_op = False + all_ops = program.global_block().ops + for op in all_ops: + if op.type == LOOKUP_TABLE_TYPE: + continue_search_lookup_table_op = True + + op_index = list(all_ops).index(op) + ids_name = op.input("Ids") + out_name = op.output("Out") + + if self.prefetch_input_vars is None: + ids_var = program.global_block().vars[ids_name[0]] + self.prefetch_input_vars = self.create_splited_vars( + source_var=ids_var, + block=program.global_block(), + tag="_prefetch_in_") + if self.prefetch_output_vars is None: + out_var = program.global_block().vars[out_name[0]] + self.prefetch_output_vars = self.create_splited_vars( + source_var=out_var, + block=program.global_block(), + tag="_prefetch_out_") + + # insert split_ids_op + program.global_block().insert_op( + index=op_index, + type="split_ids", + inputs={ + 'Ids': [ + program.global_block().vars[varname] + for varname in ids_name + ] + }, + outputs={"Out": self.prefetch_input_vars}) + + # insert prefetch_op + program.global_block().insert_op( + index=op_index + 1, + type="prefetch", + inputs={'X': self.prefetch_input_vars}, + outputs={ + "Out": self.prefetch_output_vars, + "RPCClient": rpc_client_var + }, + attrs={"epmap": eplist}) + + # insert concat_op + program.global_block().insert_op( + index=op_index + 2, + type="concat", + inputs={'X': self.prefetch_output_vars}, + outputs={ + "Out": [ + program.global_block().vars[varname] + for varname in out_name + ] + }, + attrs={"axis": 0}) + + # delete lookup_table_op + program.global_block().delete_ops([op]) + program.sync_with_cpp() + # break for loop + break + + def _split_table_grad_and_add_send_vars(self, program, rpc_client_var, + pserver_endpoints): + # 2. add split_ids_op and send_vars_op to send gradient to pservers + # there should only be one table_name + all_ops = program.global_block().ops + table_grad_name = framework.grad_var_name(self.table_name) + for op in all_ops: + if table_grad_name in op.output_arg_names: + op_index = list(all_ops).index(op) + # insert split_ids_op + program.global_block().insert_op( + index=op_index + 1, + type="split_ids", + inputs={ + 'Ids': [program.global_block().vars[table_grad_name]] + }, + outputs={"Out": self.table_grad_list}) + program.global_block().insert_op( + index=op_index + 2, + type="send_vars", + inputs={'X': self.table_grad_list}, + outputs={"RPCClient": rpc_client_var}, + attrs={"sync_send": True, + "epmap": pserver_endpoints}) + break + + def _create_prefetch_block(self, pserver_index, pserver_program, + optimize_block): + # STEP: create prefetch block + table_var = pserver_program.global_block().vars[self.table_name] + prefetch_block = pserver_program.create_block(optimize_block.idx) + trainer_ids = self.prefetch_input_vars[pserver_index] + pserver_ids = pserver_program.global_block().create_var( + name=trainer_ids.name, + type=trainer_ids.type, + shape=trainer_ids.shape, + dtype=trainer_ids.dtype) + trainer_out = self.prefetch_output_vars[pserver_index] + pserver_out = pserver_program.global_block().create_var( + name=trainer_out.name, + type=trainer_out.type, + shape=trainer_out.shape, + dtype=trainer_out.dtype) + prefetch_block.append_op( + type=LOOKUP_TABLE_TYPE, + inputs={'Ids': pserver_ids, + "W": table_var}, + outputs={"Out": pserver_out}, + attrs={ + "is_sparse": True, # has no effect on lookup_table op + "is_distributed": True, + "padding_idx": -1 + }) + return prefetch_block + + def _create_table_optimize_block(self, pserver_index, pserver_program, + append_block): + def _clone_var(block, var, persistable=True): + assert isinstance(var, Variable) + return block.create_var( + name=var.name, + shape=var.shape, + dtype=var.dtype, + type=var.type, + persistable=persistable) + + # STEP: create table optimize block + # create table param and grad var in pserver program + param_var = _clone_var( + pserver_program.global_block(), + self.origin_program.global_block().vars[self.table_name]) + grad_var = _clone_var( + pserver_program.global_block(), + self.origin_program.global_block().vars[framework.grad_var_name( + self.table_name)], + persistable=False) + + # create grad vars in pserver program + table_grad_var = self.table_param_grad[1] + table_grad_list = [ + pserver_program.global_block().create_var( + name="%s.trainer_%d.pserver_%d" % + (table_grad_var.name, index, pserver_index), + type=table_grad_var.type, + shape=table_grad_var.shape, + dtype=table_grad_var.dtype) for index in range(self.trainer_num) + ] + + # create table optimize block in pserver program + table_opt_op = [ + op for op in self.optimize_ops + if op.input("Param")[0] == self.table_name + ][0] + table_opt_block = pserver_program.create_block(append_block.idx) + # only support sgd now + assert table_opt_op.type == "sgd" + + # append sum op for table_grad_list + table_opt_block.append_op( + type="sum", + inputs={"X": table_grad_list}, + outputs={"Out": [grad_var]}) + + lr_var = pserver_program.global_block().vars[table_opt_op.input( + "LearningRate")[0]] + inputs = { + "Param": [param_var], + "Grad": [grad_var], + "LearningRate": [lr_var] + } + outputs = {"ParamOut": [param_var]} + table_opt_block.append_op( + type=table_opt_op.type, + inputs=inputs, + outputs=outputs, + attrs=table_opt_op.attrs) + # ====================== private transpiler functions ===================== def _create_vars_from_blocklist(self, program, @@ -512,7 +778,17 @@ class DistributeTranspiler: program.global_block().sync_with_cpp() return var_mapping - def _clone_var(self, block, var): + def create_splited_vars(self, source_var, block, tag): + return [ + block.create_var( + name=str(source_var.name + tag + str(index)), + type=source_var.type, + shape=source_var.shape, + dtype=source_var.dtype) + for index in range(len(self.pserver_endpoints)) + ] + + def _clone_var(self, block, var, persistable=True): assert isinstance(var, Variable) return block.create_var( name=var.name, @@ -520,12 +796,12 @@ class DistributeTranspiler: dtype=var.dtype, type=var.type, lod_level=var.lod_level, - persistable=True) + persistable=persistable) def _append_split_op(self, program, gradblocks): # Split variables that need to be split and append respective ops add_suffix = False - if self.trainers > 1: + if self.trainer_num > 1: add_suffix = True var_mapping = self._create_vars_from_blocklist( program, gradblocks, add_trainer_suffix=add_suffix) @@ -616,9 +892,9 @@ class DistributeTranspiler: return merged_var = \ pserver_block.vars[self._orig_varname(grad_block.name)] - if self.trainers > 1: + if self.trainer_num > 1: vars2merge = [] - for i in xrange(self.trainers): + for i in xrange(self.trainer_num): per_trainer_name = "%s.trainer_%d" % \ (self._orig_varname(grad_block.name), i) vars2merge.append(pserver_block.vars[per_trainer_name]) @@ -633,7 +909,7 @@ class DistributeTranspiler: type="scale", inputs={"X": merged_var}, outputs={"Out": merged_var}, - attrs={"scale": 1.0 / float(self.trainers)}) + attrs={"scale": 1.0 / float(self.trainer_num)}) new_inputs[key] = merged_var elif key == "Param": # param is already created on global program @@ -669,7 +945,7 @@ class DistributeTranspiler: new_shape = None if key in ["Param", "Grad", "LearningRate"]: continue - var = self.program.global_block().vars[opt_op.input(key)[0]] + var = self.origin_program.global_block().vars[opt_op.input(key)[0]] # update accumulator variable shape param_shape = new_inputs["Param"].shape new_shape = self._get_optimizer_input_shape(opt_op.type, key, @@ -682,8 +958,8 @@ class DistributeTranspiler: new_inputs[key] = tmpvar # change output's ParamOut variable - outputs = self._get_output_map_from_op(self.program.global_block().vars, - opt_op) + outputs = self._get_output_map_from_op( + self.origin_program.global_block().vars, opt_op) outputs["ParamOut"] = new_inputs["Param"] optimize_block.append_op( @@ -695,8 +971,8 @@ class DistributeTranspiler: def _append_pserver_non_opt_ops(self, optimize_block, opt_op): program = optimize_block.program # Append the ops for parameters that do not need to be optimized/updated - inputs = self._get_input_map_from_op(self.program.global_block().vars, - opt_op) + inputs = self._get_input_map_from_op( + self.origin_program.global_block().vars, opt_op) for varlist in inputs.itervalues(): if not isinstance(varlist, list): varlist = [varlist] @@ -709,8 +985,8 @@ class DistributeTranspiler: dtype=var.dtype, shape=var.shape) - outputs = self._get_output_map_from_op(self.program.global_block().vars, - opt_op) + outputs = self._get_output_map_from_op( + self.origin_program.global_block().vars, opt_op) for varlist in outputs.itervalues(): if not isinstance(varlist, list): @@ -783,7 +1059,6 @@ class DistributeTranspiler: if same_or_split_var(n, param) and n != param: return True return False - return False def _get_input_map_from_op(self, varmap, op): """Returns a dict from op input name to the vars in varmap.""" @@ -821,7 +1096,7 @@ class DistributeTranspiler: find_ops = [] # find ops which output is lr var - block = self.program.global_block() + block = self.origin_program.global_block() for op in block.ops: if set(op.output_arg_names) & lr_vars: find_ops.append(op) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 7ca4ed9a7b..5c2c2dd7ab 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -218,6 +218,7 @@ def fc(input, def embedding(input, size, is_sparse=False, + is_distributed=False, padding_idx=None, param_attr=None, dtype='float32'): @@ -268,8 +269,11 @@ def embedding(input, inputs={'Ids': input, 'W': w}, outputs={'Out': tmp}, - attrs={'is_sparse': is_sparse, - 'padding_idx': padding_idx}) + attrs={ + 'is_sparse': is_sparse, + 'is_distributed': is_distributed, + 'padding_idx': padding_idx + }) return tmp From e26c6d78adc47eb721286f9b0517ac500e03528a Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Wed, 11 Apr 2018 22:42:29 +0800 Subject: [PATCH 107/164] code refine --- paddle/fluid/framework/details/CMakeLists.txt | 10 ++-- .../framework/details/broadcast_op_handle.cc | 29 ++++------ .../framework/details/broadcast_op_handle.h | 4 -- .../details/broadcast_op_handle_test.cc | 18 ++++-- .../framework/details/gather_op_handle.cc | 39 ++++++------- .../framework/details/gather_op_handle.h | 4 -- .../details/gather_op_handle_test.cc | 56 ++++--------------- .../fluid/framework/details/op_handle_base.cc | 15 +++++ .../fluid/framework/details/op_handle_base.h | 8 +++ 9 files changed, 83 insertions(+), 100 deletions(-) diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index 9c1d145828..897e41f79f 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -1,5 +1,5 @@ cc_library(var_handle SRCS var_handle.cc DEPS place) -cc_library(op_handle_base SRCS op_handle_base.cc DEPS var_handle device_context) +cc_library(op_handle_base SRCS op_handle_base.cc DEPS var_handle device_context lod_tensor) cc_library(scale_loss_grad_op_handle SRCS scale_loss_grad_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) cc_library(fetch_op_handle SRCS fetch_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) nv_library(nccl_all_reduce_op_handle SRCS nccl_all_reduce_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory @@ -21,10 +21,10 @@ cc_library(ssa_graph_executor SRCS ssa_graph_executor.cc DEPS ssa_graph framewor cc_library(threaded_ssa_graph_executor SRCS threaded_ssa_graph_executor.cc DEPS fetch_op_handle ssa_graph_executor scope simple_threadpool device_context) -cc_library(broadcast_op_handle SRCS broadcast_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) -cc_library(gather_op_handle SRCS gather_op_handle.cc DEPS op_handle_base scope lod_tensor ddim memory) +cc_library(broadcast_op_handle SRCS broadcast_op_handle.cc DEPS op_handle_base scope ddim memory) +cc_library(gather_op_handle SRCS gather_op_handle.cc DEPS op_handle_base scope ddim memory) -cc_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory +cc_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_handle_base scope ddim memory device_context broadcast_op_handle) -cc_test(gather_op_test SRCS gather_op_handle_test.cc DEPS var_handle op_handle_base scope lod_tensor ddim memory +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) diff --git a/paddle/fluid/framework/details/broadcast_op_handle.cc b/paddle/fluid/framework/details/broadcast_op_handle.cc index 7cd13a50f5..dc8db33ef4 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle.cc @@ -18,23 +18,16 @@ namespace paddle { namespace framework { namespace details { -static Tensor *GetTensorFromVar(Variable *in_var) { - if (in_var->IsType()) { - return in_var->GetMutable(); - } else if (in_var->IsType()) { - return in_var->GetMutable()->mutable_value(); - } else { - PADDLE_THROW("Var should be LoDTensor or SelectedRows"); - } - return nullptr; -} BroadcastOpHandle::BroadcastOpHandle(const std::vector &local_scopes, const std::vector &places) : local_scopes_(local_scopes), places_(places) {} void BroadcastOpHandle::RunImpl() { - PADDLE_ENFORCE_EQ(this->inputs_.size(), 1); - PADDLE_ENFORCE_EQ(this->outputs_.size(), places_.size()); + PADDLE_ENFORCE_EQ(this->inputs_.size(), 1, + "The number of input should be one."); + PADDLE_ENFORCE_EQ( + this->outputs_.size(), places_.size(), + "The number of output should equal to the number of places."); // Wait input done, this Wait is asynchronous operation auto in_var_handle = static_cast(this->inputs_[0]); @@ -43,7 +36,9 @@ void BroadcastOpHandle::RunImpl() { inputs_[0]->generated_op_->Wait(dev_ctxes_[in_place]); auto in_scope_idx = in_var_handle->scope_idx_; - PADDLE_ENFORCE_LT(in_scope_idx, local_scopes_.size(), ""); + PADDLE_ENFORCE_LT(in_scope_idx, local_scopes_.size(), + "The input(%s) is not in the local_scopes.", + in_var_handle->name_); auto in_var = local_scopes_[in_scope_idx]->FindVar(in_var_handle->name_); Tensor *in_tensor = GetTensorFromVar(in_var); @@ -56,12 +51,8 @@ void BroadcastOpHandle::RunImpl() { "%s is not the the local_scopes ", out_handle->name_); auto *s = local_scopes_[out_scope_idx]; auto out_var = s->FindVar(out_handle->name_); - - PADDLE_ENFORCE_EQ( - out_var->Type(), in_var->Type(), - "The type of input and output is not equal. (%s_%d vs %s_%d)", - out_handle->name_, out_handle->scope_idx_, in_var_handle->name_, - in_var_handle->scope_idx_); + PADDLE_ENFORCE_EQ(out_p.which(), in_place.which(), + "The place of input and output should be the same."); if (in_var->IsType()) { auto &in_sr = in_var->Get(); diff --git a/paddle/fluid/framework/details/broadcast_op_handle.h b/paddle/fluid/framework/details/broadcast_op_handle.h index 74c0a6a098..b329242252 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.h +++ b/paddle/fluid/framework/details/broadcast_op_handle.h @@ -28,10 +28,6 @@ namespace paddle { namespace framework { namespace details { -/* - * Broadcast the input to all scope. - * - */ struct BroadcastOpHandle : public OpHandleBase { const std::vector &local_scopes_; const std::vector &places_; diff --git a/paddle/fluid/framework/details/broadcast_op_handle_test.cc b/paddle/fluid/framework/details/broadcast_op_handle_test.cc index 29cf120c76..cd069df118 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle_test.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle_test.cc @@ -17,6 +17,10 @@ #include "paddle/fluid/platform/device_context.h" +namespace paddle { +namespace framework { +namespace details { + namespace f = paddle::framework; namespace p = paddle::platform; @@ -25,7 +29,7 @@ const f::DDim kDims = {20, 20}; class BroadcastTester : public ::testing::Test { public: - void InitCtx(bool use_gpu) { + void InitCtxOnGpu(bool use_gpu) { if (use_gpu) { #ifdef PADDLE_WITH_CUDA int count = p::GetCUDADeviceCount(); @@ -200,23 +204,27 @@ class BroadcastTester : public ::testing::Test { }; TEST_F(BroadcastTester, TestCPUBroadcastTestLodTensor) { - InitCtx(false); + InitCtxOnGpu(false); TestBroadcastLodTensor(); } TEST_F(BroadcastTester, TestCPUBroadcastTestSelectedRows) { - InitCtx(false); + InitCtxOnGpu(false); TestBroadcastSelectedRows(); } #ifdef PADDLE_WITH_CUDA TEST_F(BroadcastTester, TestGPUBroadcastTestLodTensor) { - InitCtx(true); + InitCtxOnGpu(true); TestBroadcastLodTensor(); } TEST_F(BroadcastTester, TestGPUBroadcastTestSelectedRows) { - InitCtx(true); + InitCtxOnGpu(true); TestBroadcastSelectedRows(); } #endif + +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/gather_op_handle.cc b/paddle/fluid/framework/details/gather_op_handle.cc index 9407868372..3047054d1a 100644 --- a/paddle/fluid/framework/details/gather_op_handle.cc +++ b/paddle/fluid/framework/details/gather_op_handle.cc @@ -18,23 +18,16 @@ namespace paddle { namespace framework { namespace details { -static Tensor *GetTensorFromVar(Variable *in_var) { - if (in_var->IsType()) { - return in_var->GetMutable(); - } else if (in_var->IsType()) { - return in_var->GetMutable()->mutable_value(); - } else { - PADDLE_THROW("Var should be LoDTensor or SelectedRows"); - } - return nullptr; -} GatherOpHandle::GatherOpHandle(const std::vector &local_scopes, const std::vector &places) : local_scopes_(local_scopes), places_(places) {} void GatherOpHandle::RunImpl() { - PADDLE_ENFORCE_EQ(this->inputs_.size(), places_.size()); - PADDLE_ENFORCE_EQ(this->outputs_.size(), 1); + PADDLE_ENFORCE_EQ( + this->inputs_.size(), places_.size(), + "The number of inputs should be equal to the number of place."); + PADDLE_ENFORCE_EQ(this->outputs_.size(), 1, + "The number of output should be one."); // Wait input done, this Wait is asynchronous operation for (auto *in : inputs_) { @@ -46,6 +39,7 @@ void GatherOpHandle::RunImpl() { auto in_0_handle = static_cast(inputs_[0]); auto pre_in_var = local_scopes_[in_0_handle->scope_idx_]->FindVar(in_0_handle->name_); + auto pre_place = in_0_handle->place_; std::vector out_rows; std::vector in_tensors; @@ -58,7 +52,8 @@ void GatherOpHandle::RunImpl() { in_places.push_back(in_p); PADDLE_ENFORCE_LT(in_handle->scope_idx_, local_scopes_.size(), "%s is not the the local_scopes ", in_handle->name_); - + PADDLE_ENFORCE_EQ(in_p.which(), pre_place.which(), + "The place of input should be the same."); auto *s = local_scopes_[in_handle->scope_idx_]; auto in_var = s->FindVar(in_handle->name_); PADDLE_ENFORCE_EQ(in_var->Type(), pre_in_var->Type(), @@ -69,13 +64,17 @@ void GatherOpHandle::RunImpl() { auto &in_sr = in_var->Get(); auto in_sr_rows = in_sr.rows(); out_rows.insert(out_rows.begin(), in_sr_rows.begin(), in_sr_rows.end()); - PADDLE_ENFORCE_EQ(pre_in.height(), in_sr.height(), ""); - PADDLE_ENFORCE_EQ(pre_in.GetCompleteDims(), in_sr.GetCompleteDims(), ""); + PADDLE_ENFORCE_EQ(pre_in.height(), in_sr.height(), + "The height of inputs is not consistent."); + PADDLE_ENFORCE_EQ(pre_in.GetCompleteDims(), in_sr.GetCompleteDims(), , + "The dims of inputs is not consistent."); } else if (in_var->IsType()) { auto &pre_in = pre_in_var->Get(); auto &in_lodtensor = in_var->Get(); - PADDLE_ENFORCE_EQ(in_lodtensor.lod(), pre_in.lod()); - PADDLE_ENFORCE_EQ(in_lodtensor.dims(), pre_in.dims()); + PADDLE_ENFORCE_EQ(in_lodtensor.lod(), pre_in.lod(), + "The lod of inputs is not consistent."); + PADDLE_ENFORCE_EQ(in_lodtensor.dims(), pre_in.dims(), + "The dims of inputs is not consistent."); } else { PADDLE_THROW("Var should be LoDTensor or SelectedRows."); } @@ -88,7 +87,8 @@ void GatherOpHandle::RunImpl() { auto &out_place = out_handle->place_; auto out_scope_idx = out_handle->scope_idx_; auto out_var = local_scopes_[out_scope_idx]->FindVar(out_handle->name_); - + PADDLE_ENFORCE_EQ(out_place.which(), pre_place.which(), + "The place of input and output should be the same."); if (pre_in_var->IsType()) { auto &pre_in = pre_in_var->Get(); auto out = out_var->GetMutable(); @@ -110,12 +110,13 @@ void GatherOpHandle::RunImpl() { s = e; } } else if (pre_in_var->IsType()) { + // gather LoDTensor ??? } else { PADDLE_THROW("Var should be LoDTensor or SelectedRows."); } } -std::string GatherOpHandle::Name() const { return "broadcast"; } +std::string GatherOpHandle::Name() const { return "gather"; } } // namespace details } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/details/gather_op_handle.h b/paddle/fluid/framework/details/gather_op_handle.h index 48e1db227b..6c0231f642 100644 --- a/paddle/fluid/framework/details/gather_op_handle.h +++ b/paddle/fluid/framework/details/gather_op_handle.h @@ -28,10 +28,6 @@ namespace paddle { namespace framework { namespace details { -/* - * Broadcast the input to all scope. - * - */ struct GatherOpHandle : public OpHandleBase { const std::vector &local_scopes_; const std::vector &places_; diff --git a/paddle/fluid/framework/details/gather_op_handle_test.cc b/paddle/fluid/framework/details/gather_op_handle_test.cc index a029a2d266..5d105b37aa 100644 --- a/paddle/fluid/framework/details/gather_op_handle_test.cc +++ b/paddle/fluid/framework/details/gather_op_handle_test.cc @@ -17,6 +17,9 @@ #include "paddle/fluid/platform/device_context.h" +namespace paddle { +namespace framework { +namespace details { namespace f = paddle::framework; namespace p = paddle::platform; @@ -25,7 +28,7 @@ const f::DDim kDims = {20, 20}; class GatherTester : public ::testing::Test { public: - void InitCtx(bool use_gpu) { + void InitCtxOnGpu(bool use_gpu) { if (use_gpu) { #ifdef PADDLE_WITH_CUDA int count = p::GetCUDADeviceCount(); @@ -103,45 +106,7 @@ class GatherTester : public ::testing::Test { } } - void TestGatherLodTensor() { - // int input_scope_idx = 0; - // InitGatherOp(input_scope_idx); - // - // auto in_var = local_scope_[input_scope_idx]->Var("input"); - // auto in_lod_tensor = in_var->GetMutable(); - // in_lod_tensor->mutable_data(kDims, gpu_list_[input_scope_idx]); - // - // std::vector send_vector(f::product(kDims), input_scope_idx + - // 12); - // for (size_t k = 0; k < send_vector.size(); ++k) { - // send_vector[k] = k; - // } - // f::LoD lod{{0, 10, 20}}; - // paddle::framework::TensorFromVector( - // send_vector, *(ctxs_[input_scope_idx]), in_lod_tensor); - // in_lod_tensor->set_lod(lod); - // - // gather_op_handle_->Run(false); - // - // WaitAll(); - // - // p::CPUPlace cpu_place; - // for (size_t j = 0; j < gpu_list_.size(); ++j) { - // auto out_var = local_scope_[j]->Var("out"); - // auto out_tensor = out_var->Get(); - // PADDLE_ENFORCE_EQ(out_tensor.lod(), lod, "lod is not equal."); - // - // f::Tensor result_tensor; - // f::TensorCopy(out_tensor, cpu_place, *(ctxs_[j]), &result_tensor); - // float* ct = result_tensor.mutable_data(cpu_place); - // - // for (int64_t j = 0; j < f::product(kDims); ++j) { - // ASSERT_NEAR(ct[j], send_vector[j], 1e-5); - // } - // } - // - // GatherOpDestroy(); - } + void TestGatherLodTensor() {} void TestGatherSelectedRows() { int output_scope_idx = 0; @@ -205,23 +170,26 @@ class GatherTester : public ::testing::Test { }; // TEST_F(GatherTester, TestCPUGatherTestLodTensor) { -// InitCtx(false); +// InitCtxOnGpu(false); // TestGatherLodTensor(); //} TEST_F(GatherTester, TestCPUGatherTestSelectedRows) { - InitCtx(false); + InitCtxOnGpu(false); TestGatherSelectedRows(); } #ifdef PADDLE_WITH_CUDA // TEST_F(GatherTester, TestGPUGatherTestLodTensor) { -// InitCtx(true); +// InitCtxOnGpu(true); // TestGatherLodTensor(); //} TEST_F(GatherTester, TestGPUGatherTestSelectedRows) { - InitCtx(true); + InitCtxOnGpu(true); TestGatherSelectedRows(); } #endif +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/op_handle_base.cc b/paddle/fluid/framework/details/op_handle_base.cc index e4194a7442..0d7fbdfeab 100644 --- a/paddle/fluid/framework/details/op_handle_base.cc +++ b/paddle/fluid/framework/details/op_handle_base.cc @@ -17,6 +17,21 @@ namespace paddle { namespace framework { namespace details { + +// GetTensorFromVar is used in broadcast_op handle and gather_op handle, so it +// should be placed in a commonplace. I don't find an appropriate place, so I +// temporarily place it in op_handle_base. +Tensor *GetTensorFromVar(Variable *in_var) { + if (in_var->IsType()) { + return in_var->GetMutable(); + } else if (in_var->IsType()) { + return in_var->GetMutable()->mutable_value(); + } else { + PADDLE_THROW("Var should be LoDTensor or SelectedRows"); + } + return nullptr; +} + std::string OpHandleBase::DebugString() const { std::stringstream ss; ss << "("; diff --git a/paddle/fluid/framework/details/op_handle_base.h b/paddle/fluid/framework/details/op_handle_base.h index d7a541ac4b..fedff07772 100644 --- a/paddle/fluid/framework/details/op_handle_base.h +++ b/paddle/fluid/framework/details/op_handle_base.h @@ -17,6 +17,9 @@ #include #include "paddle/fluid/framework/details/var_handle.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/selected_rows.h" +#include "paddle/fluid/framework/variable.h" #include "paddle/fluid/platform/device_context.h" #include "paddle/fluid/platform/macros.h" @@ -24,6 +27,11 @@ namespace paddle { namespace framework { namespace details { +// GetTensorFromVar is used in broadcast_op handle and gather_op handle, so it +// should be placed in a commonplace. I don't find an appropriate place, so I +// temporarily place it in op_handle. +Tensor *GetTensorFromVar(Variable *in_var); + class OpHandleBase { private: DISABLE_COPY_AND_ASSIGN(OpHandleBase); From 449bdde58accc9beb94d56c8ef33c0bde4c007b7 Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Thu, 12 Apr 2018 06:15:24 +0000 Subject: [PATCH 108/164] Correct some typos. --- cmake/cblas.cmake | 2 +- paddle/fluid/framework/executor.cc | 19 +++++++++++-------- paddle/fluid/framework/executor.h | 3 +++ paddle/fluid/inference/io.cc | 2 +- paddle/fluid/inference/tests/test_helper.h | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/cmake/cblas.cmake b/cmake/cblas.cmake index 52a22c1fbf..e3b9d94215 100644 --- a/cmake/cblas.cmake +++ b/cmake/cblas.cmake @@ -78,7 +78,7 @@ if(NOT CMAKE_CROSSCOMPILING) /usr/lib/reference/ ) else() - # Diable the finding of reference cblas under host's system path + # Disable the finding of reference cblas under host's system path set(REFERENCE_CBLAS_INCLUDE_SEARCH_PATHS ${REFERENCE_CBLAS_ROOT}/include) set(REFERENCE_CBLAS_LIB_SEARCH_PATHS ${REFERENCE_CBLAS_ROOT}/lib) endif() diff --git a/paddle/fluid/framework/executor.cc b/paddle/fluid/framework/executor.cc index 34bba77f40..513e720fd0 100644 --- a/paddle/fluid/framework/executor.cc +++ b/paddle/fluid/framework/executor.cc @@ -83,8 +83,8 @@ static void CheckTensorNANOrInf(const std::string& name, if (tensor.memory_size() == 0) { return; } - if (tensor.type().hash_code() != typeid(float).hash_code() && - tensor.type().hash_code() != typeid(double).hash_code()) { + if (tensor.type().hash_code() != typeid(float).hash_code() && // NOLINT + tensor.type().hash_code() != typeid(double).hash_code()) { // NOLINT return; } PADDLE_ENFORCE(!framework::TensorContainsInf(tensor), @@ -145,12 +145,13 @@ void Executor::Run(const ProgramDesc& pdesc, Scope* scope, int block_id, // Return true if the block has feed operators and holder of matching info. static bool has_feed_operators( const BlockDesc& block, - std::map& feed_targets, + const std::map& feed_targets, const std::string& feed_holder_name) { size_t feed_count = 0; for (auto* op : block.AllOps()) { if (op->Type() == kFeedOpType) { feed_count++; + // The input variable's name of feed_op should be feed_holder_name. PADDLE_ENFORCE_EQ(op->Input("X")[0], feed_holder_name, "Input to feed op should be '%s'", feed_holder_name); std::string feed_target_name = op->Output("Out")[0]; @@ -167,7 +168,7 @@ static bool has_feed_operators( "The number of feed operators should match 'feed_targets'"); if (!feed_holder_name.empty()) { - // When feed operator are present, so should be feed_holder + // When feed operator are present, so should be feed_holder. auto var = block.FindVar(feed_holder_name); PADDLE_ENFORCE_NOT_NULL(var, "Block should already have a '%s' variable", feed_holder_name); @@ -187,12 +188,14 @@ static bool has_feed_operators( // and fetch_holder_name. Raise exception when any mismatch is found. // Return true if the block has fetch operators and holder of matching info. static bool has_fetch_operators( - const BlockDesc& block, std::map& fetch_targets, + const BlockDesc& block, + const std::map& fetch_targets, const std::string& fetch_holder_name) { size_t fetch_count = 0; for (auto* op : block.AllOps()) { if (op->Type() == kFetchOpType) { fetch_count++; + // The output variable's name of fetch_op should be fetch_holder_name. PADDLE_ENFORCE_EQ(op->Output("Out")[0], fetch_holder_name, "Output of fetch op should be '%s'", fetch_holder_name); std::string fetch_target_name = op->Input("X")[0]; @@ -209,7 +212,7 @@ static bool has_fetch_operators( "The number of fetch operators should match 'fetch_targets'"); if (!fetch_holder_name.empty()) { - // When fetch operator are present, so should be fetch_holder + // When fetch operator are present, so should be fetch_holder. auto var = block.FindVar(fetch_holder_name); PADDLE_ENFORCE_NOT_NULL(var, "Block should already have a '%s' variable", fetch_holder_name); @@ -287,8 +290,8 @@ void Executor::Run(const ProgramDesc& program, Scope* scope, } auto ctx = Prepare(*copy_program, 0); - RunPreparedContext(ctx.get(), scope, feed_targets, fetch_targets, - feed_holder_name, fetch_holder_name, create_vars); + RunPreparedContext(ctx.get(), scope, feed_targets, fetch_targets, create_vars, + feed_holder_name, fetch_holder_name); } std::unique_ptr Executor::Prepare( diff --git a/paddle/fluid/framework/executor.h b/paddle/fluid/framework/executor.h index 8b3ea01542..43defdacf2 100644 --- a/paddle/fluid/framework/executor.h +++ b/paddle/fluid/framework/executor.h @@ -14,6 +14,9 @@ limitations under the License. */ #pragma once +#include +#include +#include #include "paddle/fluid/framework/op_info.h" #include "paddle/fluid/framework/program_desc.h" #include "paddle/fluid/framework/scope.h" diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index a29d457b6f..3b58019db6 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -23,7 +23,7 @@ limitations under the License. */ namespace paddle { namespace inference { -// Temporarilly add this function for exposing framework::InitDevices() when +// Temporarily add this function for exposing framework::InitDevices() when // linking the inference shared library. void Init(bool init_p2p) { framework::InitDevices(init_p2p); } diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 9875e43860..c3a8d0889c 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -195,7 +195,7 @@ void TestInference(const std::string& dirname, paddle::platform::DeviceContextPool::Instance().Get(place)); if (PrepareContext) { - // Note: if you changed the inference_program, you need to call + // Note: if you change the inference_program, you need to call // executor.Prepare() again to get a new ExecutorPrepareContext. executor.RunPreparedContext(ctx.get(), scope, feed_targets, fetch_targets, CreateVars); From 8eac2a46f7f6945cf2c553d8716be02b96791813 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 12 Apr 2018 19:52:40 +0800 Subject: [PATCH 109/164] update by comment --- paddle/fluid/operators/uniform_random_op.cc | 6 ++++-- paddle/fluid/operators/uniform_random_op.cu | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/operators/uniform_random_op.cc b/paddle/fluid/operators/uniform_random_op.cc index 155690a6f4..acaefaacda 100644 --- a/paddle/fluid/operators/uniform_random_op.cc +++ b/paddle/fluid/operators/uniform_random_op.cc @@ -24,7 +24,7 @@ template class CPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - framework::Tensor* tensor(nullptr); + framework::Tensor* tensor = nullptr; auto out_var = ctx.OutputVar("Out"); if (out_var->IsType()) { tensor = out_var->GetMutable(); @@ -33,7 +33,9 @@ class CPUUniformRandomKernel : public framework::OpKernel { tensor = out_var->GetMutable()->mutable_value(); tensor->Resize(framework::make_ddim(shape)); } else { - PADDLE_THROW("Only support SelectedRows and Tensor"); + PADDLE_THROW( + "uniform_random_op's output only" + "supports SelectedRows and Tensor"); } T* data = tensor->mutable_data(ctx.GetPlace()); unsigned int seed = static_cast(ctx.Attr("seed")); diff --git a/paddle/fluid/operators/uniform_random_op.cu b/paddle/fluid/operators/uniform_random_op.cu index 00011bbe61..e1c7323a30 100644 --- a/paddle/fluid/operators/uniform_random_op.cu +++ b/paddle/fluid/operators/uniform_random_op.cu @@ -43,7 +43,7 @@ template class GPUUniformRandomKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& context) const override { - framework::Tensor* tensor(nullptr); + framework::Tensor* tensor = nullptr; auto out_var = context.OutputVar("Out"); if (out_var->IsType()) { tensor = out_var->GetMutable(); @@ -52,7 +52,9 @@ class GPUUniformRandomKernel : public framework::OpKernel { tensor = out_var->GetMutable()->mutable_value(); tensor->Resize(framework::make_ddim(shape)); } else { - PADDLE_THROW("Only support SelectedRows and Tensor"); + PADDLE_THROW( + "uniform_random_op's output only" + "supports SelectedRows and Tensor"); } T* data = tensor->mutable_data(context.GetPlace()); unsigned int seed = static_cast(context.Attr("seed")); From d24b5e060f738139feab99b1c4a97042bce1982f Mon Sep 17 00:00:00 2001 From: mozga-intel Date: Thu, 12 Apr 2018 14:33:38 +0200 Subject: [PATCH 110/164] The fully connected: the operator is removed when the MKLDNN flag is OFF --- paddle/fluid/operators/CMakeLists.txt | 8 ++++++++ python/paddle/fluid/tests/unittests/CMakeLists.txt | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/paddle/fluid/operators/CMakeLists.txt b/paddle/fluid/operators/CMakeLists.txt index 3c8696b508..7d6781c2c3 100644 --- a/paddle/fluid/operators/CMakeLists.txt +++ b/paddle/fluid/operators/CMakeLists.txt @@ -245,9 +245,17 @@ op_library(channel_send_op DEPS concurrency) op_library(channel_recv_op DEPS concurrency) list(REMOVE_ITEM GENERAL_OPS ${DEPS_OPS}) + +# The fully connected layer is deleted when the WITH_MKLDNN flag is OFF +# Because the fully connected layer has only one MKLDNN's operator +if(NOT WITH_MKLDNN) + list(REMOVE_ITEM GENERAL_OPS fc_op) +endif(NOT WITH_MKLDNN) + foreach(src ${GENERAL_OPS}) op_library(${src}) endforeach() + file(APPEND ${pybind_file} "USE_OP(less_than);\nUSE_OP(logical_and);\nUSE_NO_KERNEL_OP(read_from_array);\n") add_subdirectory(reader) diff --git a/python/paddle/fluid/tests/unittests/CMakeLists.txt b/python/paddle/fluid/tests/unittests/CMakeLists.txt index f10ef9b634..3bd24c98a2 100644 --- a/python/paddle/fluid/tests/unittests/CMakeLists.txt +++ b/python/paddle/fluid/tests/unittests/CMakeLists.txt @@ -1,6 +1,12 @@ file(GLOB TEST_OPS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "test_*.py") string(REPLACE ".py" "" TEST_OPS "${TEST_OPS}") +# The fully connected test is removed whe the WITH_MKLDNN flag is OFF +# Because the fully connected layer has only one kernel (MKLDNN) +if(NOT WITH_MKLDNN) + list(REMOVE_ITEM TEST_OPS test_fc_op) +endif(NOT WITH_MKLDNN) + if(NOT WITH_DISTRIBUTE) list(REMOVE_ITEM TEST_OPS test_recv_op) endif(NOT WITH_DISTRIBUTE) From 617e790a596ccd3f2eb940fcfe76803c01ee6cc8 Mon Sep 17 00:00:00 2001 From: Kexin Zhao Date: Thu, 12 Apr 2018 11:48:17 -0700 Subject: [PATCH 111/164] fix cuda 7.5 compile error (#9885) --- paddle/fluid/operators/math/math_function.cu | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/paddle/fluid/operators/math/math_function.cu b/paddle/fluid/operators/math/math_function.cu index e53183603f..c28047e6e9 100644 --- a/paddle/fluid/operators/math/math_function.cu +++ b/paddle/fluid/operators/math/math_function.cu @@ -288,9 +288,14 @@ void batched_gemm( // TODO(kexinzhao): add processing code for compute capability < 53 case PADDLE_ENFORCE_GE(context.GetComputeCapability(), 53, "cublas Hgemm requires GPU compute capability >= 53"); + +#if CUDA_VERSION >= 8000 PADDLE_ENFORCE(platform::dynload::cublasHgemmStridedBatched( context.cublas_handle(), cuTransB, cuTransA, N, M, K, &h_alpha, h_B, ldb, strideB, h_A, lda, strideA, &h_beta, h_C, ldc, strideC, batchCount)); +#else + PADDLE_ENFORCE(false, "HgemmStridedBatched is not supported on cuda <= 7.5"); +#endif } template <> @@ -310,9 +315,13 @@ void batched_gemm( (transB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; const int strideC = M * N; +#if CUDA_VERSION >= 8000 PADDLE_ENFORCE(platform::dynload::cublasSgemmStridedBatched( context.cublas_handle(), cuTransB, cuTransA, N, M, K, &alpha, B, ldb, strideB, A, lda, strideA, &beta, C, ldc, strideC, batchCount)); +#else + PADDLE_ENFORCE(false, "SgemmStridedBatched is not supported on cuda <= 7.5"); +#endif } template <> @@ -332,9 +341,13 @@ void batched_gemm( (transB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; const int strideC = M * N; +#if CUDA_VERSION >= 8000 PADDLE_ENFORCE(platform::dynload::cublasDgemmStridedBatched( context.cublas_handle(), cuTransB, cuTransA, N, M, K, &alpha, B, ldb, strideB, A, lda, strideA, &beta, C, ldc, strideC, batchCount)); +#else + PADDLE_ENFORCE(false, "DgemmStridedBatched is not supported on cuda <= 7.5"); +#endif } template <> From 59234b7287980ef0fec0a064f524e6c25697b7c7 Mon Sep 17 00:00:00 2001 From: redrayqll Date: Fri, 13 Apr 2018 03:25:44 +0800 Subject: [PATCH 112/164] =?UTF-8?q?modify=20=E2=80=9Cif-then-else=E2=80=9D?= =?UTF-8?q?=20md=20path=20(#9876)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/fluid/design/motivation/fluid.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fluid/design/motivation/fluid.md b/doc/fluid/design/motivation/fluid.md index 5e147f8263..4b7696cc1b 100644 --- a/doc/fluid/design/motivation/fluid.md +++ b/doc/fluid/design/motivation/fluid.md @@ -119,7 +119,7 @@ An actual Fluid example is described [here](https://github.com/PaddlePaddle/Pad From the example, the Fluid programs look very similar to their PyTorch equivalent programs, except that Fluid's loop structure, wrapped with Python's `with` statement, could run much faster than just a Python loop. -We have more examples of the [`if-then-else`](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/if_else_op.md) structure of Fluid. +We have more examples of the [`if-then-else`](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/fluid/design/execution/if_else_op.md) structure of Fluid. ## Turing Completeness From 3794027d7fbb4d6636534c78452aad589db66361 Mon Sep 17 00:00:00 2001 From: Abhinav Arora Date: Thu, 12 Apr 2018 15:45:07 -0700 Subject: [PATCH 113/164] Fix warnings in sgd_op.h --- paddle/fluid/operators/sgd_op.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/operators/sgd_op.h b/paddle/fluid/operators/sgd_op.h index 8d2bdf7590..cfc8793e1e 100644 --- a/paddle/fluid/operators/sgd_op.h +++ b/paddle/fluid/operators/sgd_op.h @@ -65,7 +65,8 @@ class SGDOpKernel : public framework::OpKernel { auto &grad_rows = grad->rows(); size_t grad_row_numel = grad_value.numel() / grad_rows.size(); - PADDLE_ENFORCE_EQ(grad_row_numel, param_out->numel() / grad_height); + PADDLE_ENFORCE_EQ(static_cast(grad_row_numel), + param_out->numel() / grad_height); auto *grad_data = grad_value.data(); auto *out_data = param_out->data(); @@ -73,7 +74,7 @@ class SGDOpKernel : public framework::OpKernel { for (size_t i = 0; i < grad_rows.size(); i++) { PADDLE_ENFORCE(grad_rows[i] < grad_height, "Input rows index should less than height"); - for (int64_t j = 0; j < grad_row_numel; j++) { + for (size_t j = 0; j < grad_row_numel; j++) { out_data[grad_rows[i] * grad_row_numel + j] -= lr[0] * grad_data[i * grad_row_numel + j]; } @@ -107,7 +108,7 @@ class SGDOpKernel : public framework::OpKernel { PADDLE_ENFORCE(grad.rows()[i] < grad.height(), "Input rows index should less than height"); int64_t id_index = param.index(grad.rows()[i]); - for (int64_t j = 0; j < grad_row_width; j++) { + for (size_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]; } From 9b63b7dde0173cc10b0d99d50d7f37837665b673 Mon Sep 17 00:00:00 2001 From: Abhinav Arora Date: Thu, 12 Apr 2018 16:04:58 -0700 Subject: [PATCH 114/164] Fix warnings in split_ids_op --- paddle/fluid/operators/split_ids_op.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/operators/split_ids_op.h b/paddle/fluid/operators/split_ids_op.h index ba1e903dbb..d263426e07 100644 --- a/paddle/fluid/operators/split_ids_op.h +++ b/paddle/fluid/operators/split_ids_op.h @@ -60,7 +60,9 @@ class SplitIdsOpKernel : public framework::OpKernel { } else if (ids_var->IsType()) { const auto *ids_selected_rows = ctx.Input("Ids"); auto &ids_dims = ids_selected_rows->value().dims(); - PADDLE_ENFORCE_EQ(ids_dims[0], ids_selected_rows->rows().size(), ""); + PADDLE_ENFORCE_EQ(ids_dims[0], + static_cast(ids_selected_rows->rows().size()), + ""); const T *ids = ids_selected_rows->value().data(); const auto &ids_rows = ids_selected_rows->rows(); auto outs = ctx.MultiOutput("Out"); @@ -77,7 +79,7 @@ class SplitIdsOpKernel : public framework::OpKernel { framework::DDim ddim = framework::make_ddim( {static_cast(out->rows().size()), row_width}); T *output = out->mutable_value()->mutable_data(ddim, place); - for (size_t i = 0; i < ddim[0]; ++i) { + for (int64_t i = 0; i < ddim[0]; ++i) { memcpy(output + i * row_width, ids + out->rows()[i] * row_width, row_width * sizeof(T)); } From c241959e489053259274edb2614381d7058463a4 Mon Sep 17 00:00:00 2001 From: Abhinav Arora Date: Thu, 12 Apr 2018 16:45:40 -0700 Subject: [PATCH 115/164] Fix CPPLint errors in operators (#9828) * Fix CPPLint errors in operators * Fix prior box op * Fix Prior Box op * Fix top_k_op.cu * Fix pool mkmldnn * Fix pool mkmldnn --- paddle/fluid/operators/pad_op.h | 2 + paddle/fluid/operators/pool_mkldnn_op.cc | 12 ++- paddle/fluid/operators/pool_op.h | 2 + paddle/fluid/operators/pool_with_index_op.h | 1 + paddle/fluid/operators/prelu_op.cc | 1 - paddle/fluid/operators/prior_box_op.cc | 2 +- paddle/fluid/operators/prior_box_op.cu | 2 +- paddle/fluid/operators/prior_box_op.h | 18 +++-- paddle/fluid/operators/rank_loss_op.cc | 1 + paddle/fluid/operators/recv_op.cc | 2 +- paddle/fluid/operators/roi_pool_op.h | 2 + paddle/fluid/operators/strided_memcpy.h | 4 +- paddle/fluid/operators/top_k_op.cu | 83 +++++++++++---------- 13 files changed, 73 insertions(+), 59 deletions(-) diff --git a/paddle/fluid/operators/pad_op.h b/paddle/fluid/operators/pad_op.h index a36abe3789..c93c096575 100644 --- a/paddle/fluid/operators/pad_op.h +++ b/paddle/fluid/operators/pad_op.h @@ -14,6 +14,8 @@ limitations under the License. */ #pragma once +#include +#include #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" diff --git a/paddle/fluid/operators/pool_mkldnn_op.cc b/paddle/fluid/operators/pool_mkldnn_op.cc index c88578570c..63eaaedcd5 100644 --- a/paddle/fluid/operators/pool_mkldnn_op.cc +++ b/paddle/fluid/operators/pool_mkldnn_op.cc @@ -83,9 +83,11 @@ class PoolMKLDNNOpKernel : public paddle::framework::OpKernel { dev_ctx.SetBlob(key_pool_workspace_memory, workspace_memory); auto src_memory = - mkldnn::memory({src_md, mkldnn_engine}, (void*)input_data); + mkldnn::memory({src_md, mkldnn_engine}, + static_cast(const_cast(input_data))); auto dst_memory = - mkldnn::memory({dst_md, mkldnn_engine}, (void*)output_data); + mkldnn::memory({dst_md, mkldnn_engine}, + static_cast(const_cast(output_data))); auto pool_prim = mkldnn::pooling_forward(*pool_pd, src_memory, dst_memory, *workspace_memory); @@ -195,9 +197,11 @@ class PoolMKLDNNGradOpKernel : public paddle::framework::OpKernel { pool_bwd_desc, mkldnn_engine, *pool_pd); auto diff_src_memory = - mkldnn::memory({diff_src_md, mkldnn_engine}, (void*)in_x_grad_data); + mkldnn::memory({diff_src_md, mkldnn_engine}, + static_cast(const_cast(in_x_grad_data))); auto diff_dst_memory = - mkldnn::memory({diff_dst_md, mkldnn_engine}, (void*)out_grad_data); + mkldnn::memory({diff_dst_md, mkldnn_engine}, + static_cast(const_cast(out_grad_data))); auto bwd_prim = mkldnn::pooling_backward( pool_bwd_pd, diff_dst_memory, *workspace_memory, diff_src_memory); diff --git a/paddle/fluid/operators/pool_op.h b/paddle/fluid/operators/pool_op.h index 2fec50ef25..a48127ea69 100644 --- a/paddle/fluid/operators/pool_op.h +++ b/paddle/fluid/operators/pool_op.h @@ -14,6 +14,8 @@ limitations under the License. */ #pragma once +#include +#include #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/pool_with_index_op.h b/paddle/fluid/operators/pool_with_index_op.h index 83e7bd138a..b55fa76eae 100644 --- a/paddle/fluid/operators/pool_with_index_op.h +++ b/paddle/fluid/operators/pool_with_index_op.h @@ -14,6 +14,7 @@ limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/prelu_op.cc b/paddle/fluid/operators/prelu_op.cc index 7fb45bd19d..8eaa12a4a6 100644 --- a/paddle/fluid/operators/prelu_op.cc +++ b/paddle/fluid/operators/prelu_op.cc @@ -13,7 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/prelu_op.h" - #include namespace paddle { diff --git a/paddle/fluid/operators/prior_box_op.cc b/paddle/fluid/operators/prior_box_op.cc index 82e54139c8..058b13eeb8 100644 --- a/paddle/fluid/operators/prior_box_op.cc +++ b/paddle/fluid/operators/prior_box_op.cc @@ -45,7 +45,7 @@ class PriorBoxOp : public framework::OperatorWithKernel { bool flip = ctx->Attrs().Get("flip"); std::vector aspect_ratios_vec; - ExpandAspectRatios(aspect_ratios, flip, aspect_ratios_vec); + ExpandAspectRatios(aspect_ratios, flip, &aspect_ratios_vec); size_t num_priors = aspect_ratios_vec.size() * min_sizes.size(); if (max_sizes.size() > 0) { diff --git a/paddle/fluid/operators/prior_box_op.cu b/paddle/fluid/operators/prior_box_op.cu index 76bf2b3b7d..0ea8909296 100644 --- a/paddle/fluid/operators/prior_box_op.cu +++ b/paddle/fluid/operators/prior_box_op.cu @@ -96,7 +96,7 @@ class PriorBoxOpCUDAKernel : public framework::OpKernel { auto clip = ctx.Attr("clip"); std::vector aspect_ratios; - ExpandAspectRatios(input_aspect_ratio, flip, aspect_ratios); + ExpandAspectRatios(input_aspect_ratio, flip, &aspect_ratios); T step_w = static_cast(ctx.Attr("step_w")); T step_h = static_cast(ctx.Attr("step_h")); diff --git a/paddle/fluid/operators/prior_box_op.h b/paddle/fluid/operators/prior_box_op.h index 1e4a12aac1..1c62fd8d2c 100644 --- a/paddle/fluid/operators/prior_box_op.h +++ b/paddle/fluid/operators/prior_box_op.h @@ -13,6 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" #include "paddle/fluid/platform/transform.h" @@ -22,23 +24,23 @@ namespace operators { inline void ExpandAspectRatios(const std::vector& input_aspect_ratior, bool flip, - std::vector& output_aspect_ratior) { + std::vector* output_aspect_ratior) { constexpr float epsilon = 1e-6; - output_aspect_ratior.clear(); - output_aspect_ratior.push_back(1.0f); + output_aspect_ratior->clear(); + output_aspect_ratior->push_back(1.0f); for (size_t i = 0; i < input_aspect_ratior.size(); ++i) { float ar = input_aspect_ratior[i]; bool already_exist = false; - for (size_t j = 0; j < output_aspect_ratior.size(); ++j) { - if (fabs(ar - output_aspect_ratior[j]) < epsilon) { + for (size_t j = 0; j < output_aspect_ratior->size(); ++j) { + if (fabs(ar - output_aspect_ratior->at(j)) < epsilon) { already_exist = true; break; } } if (!already_exist) { - output_aspect_ratior.push_back(ar); + output_aspect_ratior->push_back(ar); if (flip) { - output_aspect_ratior.push_back(1.0f / ar); + output_aspect_ratior->push_back(1.0f / ar); } } } @@ -68,7 +70,7 @@ class PriorBoxOpKernel : public framework::OpKernel { auto clip = ctx.Attr("clip"); std::vector aspect_ratios; - ExpandAspectRatios(input_aspect_ratio, flip, aspect_ratios); + ExpandAspectRatios(input_aspect_ratio, flip, &aspect_ratios); T step_w = static_cast(ctx.Attr("step_w")); T step_h = static_cast(ctx.Attr("step_h")); diff --git a/paddle/fluid/operators/rank_loss_op.cc b/paddle/fluid/operators/rank_loss_op.cc index 767eef5686..a1127f11a7 100644 --- a/paddle/fluid/operators/rank_loss_op.cc +++ b/paddle/fluid/operators/rank_loss_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/rank_loss_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/recv_op.cc b/paddle/fluid/operators/recv_op.cc index 083c1fae5e..a4dcf704a6 100644 --- a/paddle/fluid/operators/recv_op.cc +++ b/paddle/fluid/operators/recv_op.cc @@ -12,6 +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. */ +#include // NOLINT #include #include "paddle/fluid/framework/data_type.h" @@ -19,7 +20,6 @@ limitations under the License. */ #include "paddle/fluid/framework/lod_tensor.h" #include "paddle/fluid/framework/op_registry.h" -#include #include "paddle/fluid/operators/detail/grpc_client.h" namespace paddle { diff --git a/paddle/fluid/operators/roi_pool_op.h b/paddle/fluid/operators/roi_pool_op.h index f38c5a3c0c..54e0749031 100644 --- a/paddle/fluid/operators/roi_pool_op.h +++ b/paddle/fluid/operators/roi_pool_op.h @@ -13,6 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/strided_memcpy.h b/paddle/fluid/operators/strided_memcpy.h index 22c1db82e9..7a10218e15 100644 --- a/paddle/fluid/operators/strided_memcpy.h +++ b/paddle/fluid/operators/strided_memcpy.h @@ -37,8 +37,8 @@ inline void StridedMemcpy(const platform::DeviceContext& dev_ctx, const T* src, const framework::DDim& src_stride, const framework::DDim& dst_dim, const framework::DDim& dst_stride, T* dst) { - using namespace detail; - StridedCopyDimVisitor func(dev_ctx, src, src_stride, dst_stride, dst); + paddle::operators::detail::StridedCopyDimVisitor func( + dev_ctx, src, src_stride, dst_stride, dst); boost::apply_visitor(func, dst_dim); } diff --git a/paddle/fluid/operators/top_k_op.cu b/paddle/fluid/operators/top_k_op.cu index bfd26c2f22..d7f4d383ce 100644 --- a/paddle/fluid/operators/top_k_op.cu +++ b/paddle/fluid/operators/top_k_op.cu @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/operators/top_k_op.h" #include "paddle/fluid/platform/assert.h" namespace paddle { @@ -133,71 +134,71 @@ __device__ __forceinline__ void GetTopK(Pair topk[], const T* val, int* col, } template -__device__ __forceinline__ void ThreadGetTopK(Pair topk[], int& beam, +__device__ __forceinline__ void ThreadGetTopK(Pair topk[], int* beam, int beam_size, const T* src, - bool& firstStep, bool& is_empty, - Pair& max, int dim, + bool* firstStep, bool* is_empty, + Pair* max, int dim, const int tid) { - if (beam > 0) { - int length = beam < beam_size ? beam : beam_size; - if (firstStep) { - firstStep = false; + if (*beam > 0) { + int length = (*beam) < beam_size ? *beam : beam_size; + if (*firstStep) { + *firstStep = false; GetTopK(topk, src, tid, dim, length); } else { for (int k = 0; k < MaxLength; k++) { - if (k < MaxLength - beam) { - topk[k] = topk[k + beam]; + if (k < MaxLength - (*beam)) { + topk[k] = topk[k + *beam]; } else { topk[k].set(-INFINITY, -1); } } - if (!is_empty) { - GetTopK(topk + MaxLength - beam, src, tid, dim, max, + if (!(*is_empty)) { + GetTopK(topk + MaxLength - *beam, src, tid, dim, *max, length); } } - max = topk[MaxLength - 1]; - if (max.v == -1) is_empty = true; - beam = 0; + *max = topk[MaxLength - 1]; + if ((*max).v == -1) *is_empty = true; + *beam = 0; } } template -__device__ __forceinline__ void ThreadGetTopK(Pair topk[], int& beam, +__device__ __forceinline__ void ThreadGetTopK(Pair topk[], int* beam, int beam_size, const T* val, - int* col, bool& firstStep, - bool& is_empty, Pair& max, + int* col, bool* firstStep, + bool* is_empty, Pair* max, int dim, const int tid) { - if (beam > 0) { - int length = beam < beam_size ? beam : beam_size; - if (firstStep) { - firstStep = false; + if (*beam > 0) { + int length = (*beam) < beam_size ? *beam : beam_size; + if (*firstStep) { + *firstStep = false; GetTopK(topk, val, col, tid, dim, length); } else { for (int k = 0; k < MaxLength; k++) { - if (k < MaxLength - beam) { - topk[k] = topk[k + beam]; + if (k < MaxLength - *beam) { + topk[k] = topk[k + *beam]; } else { topk[k].set(-INFINITY, -1); } } - if (!is_empty) { - GetTopK(topk + MaxLength - beam, val, col, tid, dim, max, + if (!(*is_empty)) { + GetTopK(topk + MaxLength - *beam, val, col, tid, dim, max, length); } } - max = topk[MaxLength - 1]; - if (max.v == -1) is_empty = true; - beam = 0; + *max = topk[MaxLength - 1]; + if ((*max).v == -1) *is_empty = true; + *beam = 0; } } template __device__ __forceinline__ void BlockReduce(Pair* sh_topk, int* maxid, Pair topk[], T** topVal, - int64_t** topIds, int& beam, int& k, + int64_t** topIds, int* beam, int* k, const int tid, const int warp) { while (true) { __syncthreads(); @@ -225,17 +226,17 @@ __device__ __forceinline__ void BlockReduce(Pair* sh_topk, int* maxid, (*topVal)++; (*topIds)++; } - if (tid == maxid[0]) beam++; - if (--k == 0) break; + if (tid == maxid[0]) (*beam)++; + if (--(*k) == 0) break; __syncthreads(); if (tid == maxid[0]) { - if (beam < MaxLength) { - sh_topk[tid] = topk[beam]; + if (*beam < MaxLength) { + sh_topk[tid] = topk[*beam]; } } if (maxid[0] / 32 == warp) { - if (__shfl(beam, (maxid[0]) % 32, 32) == MaxLength) break; + if (__shfl(*beam, (maxid[0]) % 32, 32) == MaxLength) break; } } } @@ -268,13 +269,13 @@ __global__ void KeMatrixTopK(T* output, int output_stride, int64_t* indices, topk[k].set(-INFINITY, -1); } while (k) { - ThreadGetTopK(topk, beam, k, - src + blockIdx.x * lds, firststep, - is_empty, max, dim, tid); + ThreadGetTopK(topk, &beam, k, + src + blockIdx.x * lds, &firststep, + &is_empty, &max, dim, tid); sh_topk[tid] = topk[0]; BlockReduce(sh_topk, maxid, topk, &output, - &indices, beam, k, tid, warp); + &indices, &beam, &k, tid, warp); } } @@ -308,9 +309,9 @@ class TopkOpCUDAKernel : public framework::OpKernel { KeMatrixTopK<<< grid, threads, 0, reinterpret_cast( ctx.device_context()) - .stream()>>>(output_data, output->dims()[1], - indices_data, input_data, - input_width, input_width, int(k)); + .stream()>>>( + output_data, output->dims()[1], indices_data, input_data, input_width, + input_width, static_cast(k)); } }; From 855992dab0e840109899983baf3a9675185b0c35 Mon Sep 17 00:00:00 2001 From: Abhinav Arora Date: Thu, 12 Apr 2018 17:04:54 -0700 Subject: [PATCH 116/164] Fix warnings in chunk_test --- paddle/fluid/recordio/chunk_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/recordio/chunk_test.cc b/paddle/fluid/recordio/chunk_test.cc index 98ca99b9a0..5177475c01 100644 --- a/paddle/fluid/recordio/chunk_test.cc +++ b/paddle/fluid/recordio/chunk_test.cc @@ -43,5 +43,5 @@ TEST(Chunk, Compressor) { ch.Clear(); ch.Parse(ss); - ASSERT_EQ(ch.NumBytes(), 18); + ASSERT_EQ(ch.NumBytes(), 18ul); } From b0267ac93a84cdb3be3099b869c1c334b7e26096 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Fri, 13 Apr 2018 11:31:59 +0800 Subject: [PATCH 117/164] refine broadcast op --- .../framework/details/broadcast_op_handle.cc | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/framework/details/broadcast_op_handle.cc b/paddle/fluid/framework/details/broadcast_op_handle.cc index cd9bff52d9..53e8f9f366 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle.cc @@ -32,8 +32,14 @@ void BroadcastOpHandle::RunImpl() { // Wait input done, this Wait is asynchronous operation auto in_var_handle = static_cast(this->inputs_[0]); auto &in_place = in_var_handle->place_; - if (inputs_[0]->generated_op_) + if (inputs_[0]->generated_op_) { inputs_[0]->generated_op_->Wait(dev_ctxes_[in_place]); + for (auto *out : outputs_) { + auto out_handle = static_cast(out); + auto &out_p = out_handle->place_; + inputs_[0]->generated_op_->Wait(dev_ctxes_[out_p]); + } + } auto in_scope_idx = in_var_handle->scope_idx_; PADDLE_ENFORCE_LT(in_scope_idx, local_scopes_.size(), @@ -74,9 +80,24 @@ void BroadcastOpHandle::RunImpl() { } Tensor *out_tensor = GetTensorFromVar(out_var); - - paddle::framework::TensorCopy(*in_tensor, out_p, *(dev_ctxes_[in_place]), - out_tensor); + if (platform::is_cpu_place(in_place)) { + paddle::framework::TensorCopy(*in_tensor, out_p, *(dev_ctxes_[in_place]), + out_tensor); + } else if (platform::is_gpu_place(in_place)) { +#ifdef PADDLE_WITH_CUDA + auto src_gpu_place = boost::get(in_place); + auto dst_gpu_place = boost::get(out_p); + void *dst_ptr = out_tensor->mutable_data(out_p); + void *src_ptr = in_tensor->data(); + int64_t size = in_tensor->numel(); + memory::Copy( + dst_gpu_place, dst_ptr, src_gpu_place, src_ptr, size, + reinterpret_cast(dev_ctxes_[out_p]) + ->stream()); +#else + PADDLE_THROW("CUDAPlace is not supported in CPU device."); +#endif + } } } From 94ad30e52b348d3f5917dc101c2a28dcf26b4481 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Thu, 12 Apr 2018 20:54:29 -0700 Subject: [PATCH 118/164] fix log service, add docker run command --- tools/aws_benchmarking/README.md | 19 ++++++++++++------ tools/aws_benchmarking/diagram.png | Bin 41741 -> 40790 bytes tools/aws_benchmarking/server/logs/master.log | 0 .../server/pserver.sh.template | 2 +- .../server/trainer.sh.template | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 tools/aws_benchmarking/server/logs/master.log diff --git a/tools/aws_benchmarking/README.md b/tools/aws_benchmarking/README.md index 5fd586cc15..dfa2a5f478 100644 --- a/tools/aws_benchmarking/README.md +++ b/tools/aws_benchmarking/README.md @@ -50,7 +50,10 @@ Training nodes will run your `ENTRYPOINT` script with the following environment - `TASK_NAME`: unique name to identify this training process. - `TRAINING_ROLE`: current node's role in this training process, either "PSERVER" or "TRAINER" - `PSERVER_HOSTS`: comma separated value of pserver end points, I.E. "192.168.1.2:5436,192.168.1.3:5436" - - `TRAINER_INDEX`: an integer to identify the index of current trainer + - `PSERVERS`: same as above + - `TRAINERS`: trainer count + - `SERVER_ENDPOINT`: current server end point if the node role is a pserver + - `TRAINER_INDEX`: an integer to identify the index of current trainer if the node role is a trainer. Now we have a working distributed training script which takes advantage of node environment variables and docker file to generate the training image. Run the following command: @@ -73,11 +76,15 @@ Training nodes will run your `ENTRYPOINT` script with the following environment Now let's start the training process: ```bash -docker run -i -v $HOME/.aws:/root/.aws -v :/.pem \ +docker run -i -v $HOME/.aws:/root/.aws -v :/root/.pem \ putcn/paddle_aws_client \ --action create \ --key_name \ ---security_group_id +--security_group_id \ +--pserver_image_id \ +--trainer_image_id \ +--pserver_count 2 \ +--trainer_count 2 ``` Now just wait until you see this: @@ -91,7 +98,7 @@ That means you can turn off your laptop and your cluster is creating instances, To access the master log: ```bash -docker run -i -v $HOME/.aws:/root/.aws -v :/.pem \ +docker run -i -v $HOME/.aws:/root/.aws \ putcn/paddle_aws_client \ --action status \ --master_server_public_ip \ @@ -101,7 +108,7 @@ putcn/paddle_aws_client \ To tear down the training setup: ```bash -docker run -i -v $HOME/.aws:/root/.aws -v :/.pem \ +docker run -i -v $HOME/.aws:/root/.aws \ putcn/paddle_aws_client \ --action cleanup \ --master_server_public_ip \ @@ -111,7 +118,7 @@ putcn/paddle_aws_client \ To retrieve training logs TBD -### Tech details +### Tech details *What to expect in this step* diff --git a/tools/aws_benchmarking/diagram.png b/tools/aws_benchmarking/diagram.png index 9dd656c9b4719fc6a96eb3d68c796daa0aaf7b98..b97909c5fe78b59d0e636ff73c2ed3e63a0be722 100644 GIT binary patch literal 40790 zcmb4rbySsG*YC484I(YlNFxo>sibr%5)z7pq#&`8*a%1qNOyxENJ-Zg5Rew66a}P1 z>8`sr$Mb#fJMR7Gj4=z?VNjA287wL_!4$ey4 zHje%rG})DMYm>l8i2vgg!sXBXjP7ATI1<-VVTKCw2~@^Zkh}aaisP!pv3E)J_Rf%~ zz_O+XXZlmQul@6^|6AN;4cVLaPg&sa$)Y(t=qj-Ped`5rG{?c9NjE78E_>E4MJdkT z^;DSPqziX%O}gCscLA^rDif2X=S-ZhQuRN6$QX)V_={!ls2qv*v1(Ry>^=`KIi~o#83t0Y>}*~)3kk%i^Zp4Voayp&S3xdEDwNImJ$4v! z*Z?m4Q1JfWl^!uO>d@23R{!16-+d+Fsl;_fXw#ur`=8H$Et_9fr+EMDuRus5@ck2K zUCTGPHo1jk|31M&2@BnxPjN!f(87IXd=~7XNf<4bGl!VUlcK-xJxoL@)cY+dC9sOZ z3P%jyV{Z~7JD~z&8#63t2&Ff6;R<^I%OXNP8?#e{d1GacG5WtPNVQl975VTHV7oiU%ZInQ1HB`R$kzu0!83W|Rgls;FIZ zIrI#Qjc644fYm%qvKwF~<2=0g*M;RUa~Oe@W8D%a@kbJ?yl7DEwlB!GFCV_=$t(Uz zL^MFxJ~&V~>W+6ikeZX5dkOA|CHI~GB3W%)3|Mgp45G1r#R}yz**cf&G z%zcir{c9*Qw_u?zg`vf=B+jppnIi^iTiVV4<9K;M8RL)s4J?; s`&DQXAP#`C|z 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 diff --git a/tools/aws_benchmarking/server/logs/master.log b/tools/aws_benchmarking/server/logs/master.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/aws_benchmarking/server/pserver.sh.template b/tools/aws_benchmarking/server/pserver.sh.template index fe2360ed20..5e46a4246f 100644 --- a/tools/aws_benchmarking/server/pserver.sh.template +++ b/tools/aws_benchmarking/server/pserver.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run -i -p {PSERVER_PORT}:{PSERVER_PORT} -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINING_ROLE=PSERVER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file +nvidia-docker run -i -p {PSERVER_PORT}:{PSERVER_PORT} -e "SERVER_ENDPOINT={SERVER_ENDPOINT}" -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINING_ROLE=PSERVER" -e "TRAINERS={TRAINER_COUNT}" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} \ No newline at end of file diff --git a/tools/aws_benchmarking/server/trainer.sh.template b/tools/aws_benchmarking/server/trainer.sh.template index 89f405811e..56405a8e31 100644 --- a/tools/aws_benchmarking/server/trainer.sh.template +++ b/tools/aws_benchmarking/server/trainer.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} \ No newline at end of file +nvidia-docker run -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} \ No newline at end of file From 45d87ade441b786c8d6cac20a6234816fe5a2019 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Thu, 12 Apr 2018 20:55:01 -0700 Subject: [PATCH 119/164] minor tweaks --- .../client/cluster_launcher.py | 21 ++++++++-- .../aws_benchmarking/server/cluster_master.py | 41 ++++++++++++------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/tools/aws_benchmarking/client/cluster_launcher.py b/tools/aws_benchmarking/client/cluster_launcher.py index bbabd98246..3a6cc57b3a 100644 --- a/tools/aws_benchmarking/client/cluster_launcher.py +++ b/tools/aws_benchmarking/client/cluster_launcher.py @@ -49,8 +49,8 @@ parser.add_argument( parser.add_argument( '--pserver_instance_type', type=str, - default="p2.8xlarge", - help="your pserver instance type, p2.8xlarge by default") + default="c5.2xlarge", + help="your pserver instance type, c5.2xlarge by default") parser.add_argument( '--trainer_instance_type', type=str, @@ -68,6 +68,10 @@ parser.add_argument( default="ami-da2c1cbf", help="ami id for system image, default one has nvidia-docker ready, \ use ami-1ae93962 for us-east-2") + +parser.add_argument( + '--pserver_command', type=str, default="", help="pserver start command") + parser.add_argument( '--trainer_image_id', type=str, @@ -75,6 +79,9 @@ parser.add_argument( help="ami id for system image, default one has nvidia-docker ready, \ use ami-1ae93962 for us-west-2") +parser.add_argument( + '--trainer_command', type=str, default="", help="trainer start command") + parser.add_argument( '--availability_zone', type=str, @@ -104,6 +111,12 @@ parser.add_argument( parser.add_argument( '--master_server_public_ip', type=str, help="master server public ip") +parser.add_argument( + '--master_docker_image', + type=str, + default="putcn/paddle_aws_master:latest", + help="master docker image id") + args = parser.parse_args() logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s') @@ -322,14 +335,16 @@ def create(): # set arguments and start docker kick_off_cmd = "docker run -d -v /home/ubuntu/.aws:/root/.aws/" kick_off_cmd += " -v /home/ubuntu/" + args.key_name + ".pem:/root/" + args.key_name + ".pem" + kick_off_cmd += " -v /home/ubuntu/logs/:/root/logs/" kick_off_cmd += " -p " + str(args.master_server_port) + ":" + str( args.master_server_port) - kick_off_cmd += " putcn/paddle_aws_master" + kick_off_cmd += " " + args.master_docker_image args_to_pass = copy.copy(args) args_to_pass.action = "serve" del args_to_pass.pem_path del args_to_pass.security_group_ids + del args_to_pass.master_docker_image del args_to_pass.master_server_public_ip for arg, value in sorted(vars(args_to_pass).iteritems()): kick_off_cmd += ' --%s %s' % (arg, value) diff --git a/tools/aws_benchmarking/server/cluster_master.py b/tools/aws_benchmarking/server/cluster_master.py index 38d09dc869..5e63b5a8b4 100644 --- a/tools/aws_benchmarking/server/cluster_master.py +++ b/tools/aws_benchmarking/server/cluster_master.py @@ -53,8 +53,8 @@ parser.add_argument( parser.add_argument( '--pserver_instance_type', type=str, - default="p2.8xlarge", - help="your pserver instance type, p2.8xlarge by default") + default="c5.2xlarge", + help="your pserver instance type, c5.2xlarge by default") parser.add_argument( '--trainer_instance_type', type=str, @@ -97,12 +97,18 @@ parser.add_argument( default=os.path.join(os.path.dirname(__file__), "pserver.sh.template"), help="pserver bash file path") +parser.add_argument( + '--pserver_command', type=str, default="", help="pserver start command") + parser.add_argument( '--trainer_bash_file', type=str, default=os.path.join(os.path.dirname(__file__), "trainer.sh.template"), help="trainer bash file path") +parser.add_argument( + '--trainer_command', type=str, default="", help="trainer start command") + parser.add_argument( '--action', type=str, default="serve", help="create|cleanup|serve") @@ -124,8 +130,12 @@ args = parser.parse_args() ec2client = boto3.client('ec2') +args.log_path = os.path.join(os.path.dirname(__file__), "logs/") + logging.basicConfig( - filename='master.log', level=logging.INFO, format='%(asctime)s %(message)s') + filename=args.log_path + 'master.log', + level=logging.INFO, + format='%(asctime)s %(message)s') log_files = ["master.log"] @@ -304,7 +314,7 @@ def create_pservers(): def log_to_file(source, filename): if not filename in log_files: log_files.append(filename) - with open(filename, "a") as log_file: + with open(args.log_path + filename, "a") as log_file: for line in iter(source.readline, ""): log_file.write(line) @@ -335,6 +345,8 @@ def create_trainers(kickoff_cmd, pserver_endpoints_str): DOCKER_IMAGE=args.docker_image, TRAINER_INDEX=str(trainer_index), TASK_NAME=args.task_name, + TRAINER_COUNT=args.trainer_count, + COMMAND=args.trainer_command, MASTER_ENDPOINT=args.master_server_ip + ":" + str(args.master_server_port)) logging.info(cmd) @@ -446,6 +458,9 @@ def kickoff_pserver(host, pserver_endpoints_str): DOCKER_IMAGE=args.docker_image, PSERVER_PORT=args.pserver_port, TASK_NAME=args.task_name, + COMMAND=args.pserver_command, + TRAINER_COUNT=args.trainer_count, + SERVER_ENDPOINT=host + ":" + str(args.pserver_port), MASTER_ENDPOINT=args.master_server_ip + ":" + str(args.master_server_port)) logging.info(cmd) @@ -553,14 +568,17 @@ def start_server(args): if request_path == "/status" or request_path == "/master_logs": self._set_headers() logging.info("Received request to return status") - with open("master.log", "r") as logfile: + with open(args.log_path + "master.log", "r") as logfile: self.wfile.write(logfile.read().strip()) elif request_path == "/list_logs": self._set_headers() self.wfile.write("\n".join(log_files)) elif "/log/" in request_path: - log_file_path = request_path.replace("/log/") - with open(log_file_path, "r") as logfile: + self._set_headers() + log_file_path = request_path.replace("/log/", "") + logging.info("requesting log file path is" + args.log_path + + log_file_path) + with open(args.log_path + log_file_path, "r") as logfile: self.wfile.write(logfile.read().strip()) else: self.do_404() @@ -631,11 +649,4 @@ if __name__ == "__main__": create_cluster() server_thread.join() elif args.action == "test": - init_args() - if not args.subnet_id: - logging.info("creating subnet for this task") - args.subnet_id = create_subnet() - logging.info("subnet %s created" % (args.subnet_id)) - create_trainers( - kickoff_cmd=script_to_str(args.trainer_bash_file), - pserver_endpoints_str="11.22.33.44:5476") + start_server(args) From c20cc2bd8a018f078e3916e01579df8faab66f92 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Fri, 13 Apr 2018 05:45:52 +0000 Subject: [PATCH 120/164] Add Wait() for reshape_op --- paddle/fluid/operators/reshape_op.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paddle/fluid/operators/reshape_op.h b/paddle/fluid/operators/reshape_op.h index 9abc78421a..8320c257c9 100644 --- a/paddle/fluid/operators/reshape_op.h +++ b/paddle/fluid/operators/reshape_op.h @@ -147,6 +147,7 @@ class ReshapeKernel : public framework::OpKernel { if (!inplace) { out->mutable_data(ctx.GetPlace()); framework::TensorCopy(*in, ctx.GetPlace(), ctx.device_context(), out); + ctx.device_context().Wait(); // TensorCopy will resize to in_dims. out->Resize(out_dims); } else { @@ -169,6 +170,7 @@ class ReshapeGradKernel : public framework::OpKernel { auto in_dims = d_x->dims(); if (!inplace) { framework::TensorCopy(*d_out, ctx.GetPlace(), ctx.device_context(), d_x); + ctx.device_context().Wait(); d_x->Resize(in_dims); } else { d_x->ShareDataWith(*d_out); From a08bf76f74cbdd4db4a773a4557b4ad6551ce679 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Fri, 13 Apr 2018 13:52:39 +0800 Subject: [PATCH 121/164] refine name --- paddle/fluid/framework/threadpool.cc | 10 +++++----- paddle/fluid/framework/threadpool.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/paddle/fluid/framework/threadpool.cc b/paddle/fluid/framework/threadpool.cc index 109c2c745c..f26f212d4d 100644 --- a/paddle/fluid/framework/threadpool.cc +++ b/paddle/fluid/framework/threadpool.cc @@ -95,15 +95,15 @@ void ThreadPool::TaskLoop() { } } -std::unique_ptr MultiStreamThreadPool::io_threadpool_(nullptr); -std::once_flag MultiStreamThreadPool::io_init_flag_; +std::unique_ptr ThreadPoolIO::io_threadpool_(nullptr); +std::once_flag ThreadPoolIO::io_init_flag_; -ThreadPool* MultiStreamThreadPool::GetInstanceIO() { - std::call_once(io_init_flag_, &MultiStreamThreadPool::InitIO); +ThreadPool* ThreadPoolIO::GetInstanceIO() { + std::call_once(io_init_flag_, &ThreadPoolIO::InitIO); return io_threadpool_.get(); } -void MultiStreamThreadPool::InitIO() { +void ThreadPoolIO::InitIO() { if (io_threadpool_.get() == nullptr) { // TODO(typhoonzero1986): make this configurable io_threadpool_.reset(new ThreadPool(FLAGS_io_threadpool_size)); diff --git a/paddle/fluid/framework/threadpool.h b/paddle/fluid/framework/threadpool.h index 1cc058834c..94111ee335 100644 --- a/paddle/fluid/framework/threadpool.h +++ b/paddle/fluid/framework/threadpool.h @@ -135,7 +135,7 @@ class ThreadPool { std::condition_variable completed_; }; -class MultiStreamThreadPool : ThreadPool { +class ThreadPoolIO : ThreadPool { public: static ThreadPool* GetInstanceIO(); static void InitIO(); @@ -156,7 +156,7 @@ std::future Async(Callback callback) { template std::future AsyncIO(Callback callback) { - return MultiStreamThreadPool::GetInstanceIO()->Run(callback); + return ThreadPoolIO::GetInstanceIO()->Run(callback); } } // namespace framework From 3fa0ef3d7102615848f8793c1151c6ec069cd296 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Fri, 13 Apr 2018 06:40:50 +0000 Subject: [PATCH 122/164] Refine double_buffer code --- .../reader/create_double_buffer_reader_op.cc | 62 +++++++------------ 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc b/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc index 33a50b5ceb..0b7c1d6af7 100644 --- a/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc +++ b/paddle/fluid/operators/reader/create_double_buffer_reader_op.cc @@ -33,28 +33,14 @@ static constexpr size_t kChannelSize = 0; // kCacheSize - 2 class DoubleBufferReader : public framework::DecoratedReader { public: - struct Item { - Item() : ctx_(nullptr) {} - Item(Item&& b) { - payloads_ = std::move(b.payloads_); - ctx_ = std::move(b.ctx_); - } - Item& operator=(Item&& b) { - payloads_ = std::move(b.payloads_); - ctx_ = std::move(b.ctx_); - return *this; - } - - std::vector payloads_; - platform::DeviceContext* ctx_; - }; - explicit DoubleBufferReader( ReaderBase* reader, platform::Place target_place = platform::CPUPlace()) : DecoratedReader(reader), place_(target_place) { + cpu_tensor_cache_.resize(kCacheSize); + gpu_tensor_cache_.resize(kCacheSize); #ifdef PADDLE_WITH_CUDA - for (size_t i = 0; i < kCacheSize; ++i) { - if (platform::is_gpu_place(place_)) { + if (platform::is_gpu_place(place_)) { + for (size_t i = 0; i < kCacheSize; ++i) { ctxs_.emplace_back(new platform::CUDADeviceContext( boost::get(place_))); } @@ -72,7 +58,7 @@ class DoubleBufferReader : public framework::DecoratedReader { bool HasNext() const; void StartPrefetcher() { - channel_ = framework::MakeChannel(kChannelSize); + channel_ = framework::MakeChannel(kChannelSize); prefetcher_ = std::thread([this] { PrefetchThreadFunc(); }); } @@ -88,8 +74,10 @@ class DoubleBufferReader : public framework::DecoratedReader { void PrefetchThreadFunc(); std::thread prefetcher_; - framework::Channel* channel_; + framework::Channel* channel_; platform::Place place_; + std::vector> cpu_tensor_cache_; + std::vector> gpu_tensor_cache_; std::vector> ctxs_; }; @@ -153,11 +141,14 @@ class CreateDoubleBufferReaderOpMaker : public DecoratedReaderMakerBase { void DoubleBufferReader::ReadNext(std::vector* out) { out->clear(); if (HasNext()) { - Item batch; - channel_->Receive(&batch); - *out = batch.payloads_; - if (batch.ctx_) { - batch.ctx_->Wait(); + size_t cached_tensor_id; + channel_->Receive(&cached_tensor_id); + if (platform::is_gpu_place(place_)) { + *out = gpu_tensor_cache_[cached_tensor_id]; + ctxs_[cached_tensor_id]->Wait(); + } else { + // CPU place + *out = cpu_tensor_cache_[cached_tensor_id]; } } } @@ -176,42 +167,33 @@ bool DoubleBufferReader::HasNext() const { void DoubleBufferReader::PrefetchThreadFunc() { VLOG(5) << "A new prefetch thread starts."; - std::vector> cpu_tensor_cache(kCacheSize); - std::vector> gpu_tensor_cache(kCacheSize); size_t cached_tensor_id = 0; - while (true) { - Item batch; - auto& cpu_batch = cpu_tensor_cache[cached_tensor_id]; + auto& cpu_batch = cpu_tensor_cache_[cached_tensor_id]; reader_->ReadNext(&cpu_batch); if (cpu_batch.empty()) { // The underlying reader have no next data. break; } if (platform::is_gpu_place(place_)) { - auto& gpu_batch = gpu_tensor_cache[cached_tensor_id]; + auto& gpu_batch = gpu_tensor_cache_[cached_tensor_id]; auto* gpu_ctx = ctxs_[cached_tensor_id].get(); gpu_batch.resize(cpu_batch.size()); for (size_t i = 0; i < cpu_batch.size(); ++i) { framework::TensorCopy(cpu_batch[i], place_, *gpu_ctx, &gpu_batch[i]); gpu_batch[i].set_lod(cpu_batch[i].lod()); } - batch.payloads_ = gpu_batch; - batch.ctx_ = gpu_ctx; - } else { - // CPUPlace - batch.payloads_ = cpu_batch; } - ++cached_tensor_id; - cached_tensor_id %= kCacheSize; - try { - channel_->Send(&batch); + size_t tmp = cached_tensor_id; + channel_->Send(&tmp); } catch (paddle::platform::EnforceNotMet e) { VLOG(5) << "WARNING: The double buffer channel has been closed. The " "prefetch thread will terminate."; break; } + ++cached_tensor_id; + cached_tensor_id %= kCacheSize; } channel_->Close(); VLOG(5) << "Prefetch thread terminates."; From 6b20b35589c3443bbd49fde2b71b5c4e0e5b8cc0 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Fri, 13 Apr 2018 15:22:04 +0800 Subject: [PATCH 123/164] Fix Transformer Hang Problem --- .../details/computation_op_handle.cc | 4 ++- .../details/nccl_all_reduce_op_handle.cc | 10 +++--- .../fluid/framework/details/op_handle_base.cc | 32 ++++++++++++------- .../fluid/framework/details/op_handle_base.h | 2 ++ .../details/scale_loss_grad_op_handle.cc | 14 +++++--- .../fluid/framework/details/send_op_handle.cc | 2 +- .../details/threaded_ssa_graph_executor.cc | 4 ++- paddle/fluid/platform/device_context.cc | 2 +- paddle/fluid/platform/device_context.h | 9 +++++- 9 files changed, 54 insertions(+), 25 deletions(-) diff --git a/paddle/fluid/framework/details/computation_op_handle.cc b/paddle/fluid/framework/details/computation_op_handle.cc index e3f8bbb72f..ff6d91c1da 100644 --- a/paddle/fluid/framework/details/computation_op_handle.cc +++ b/paddle/fluid/framework/details/computation_op_handle.cc @@ -35,7 +35,9 @@ void ComputationOpHandle::RunImpl() { } } - op_->Run(*scope_->FindVar(kLocalExecScopeName)->Get(), place_); + this->RunAndRecordEvent([this] { + op_->Run(*scope_->FindVar(kLocalExecScopeName)->Get(), place_); + }); } std::string ComputationOpHandle::Name() const { return op_->Type(); } diff --git a/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc b/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc index 55b5f11358..0611ec6376 100644 --- a/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc +++ b/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc @@ -69,10 +69,12 @@ void NCCLAllReduceOpHandle::RunImpl() { }); } - platform::NCCLGroupGuard guard; - for (auto &call : all_reduce_calls) { - call(); - } + this->RunAndRecordEvent([&] { + platform::NCCLGroupGuard guard; + for (auto &call : all_reduce_calls) { + call(); + } + }); } } diff --git a/paddle/fluid/framework/details/op_handle_base.cc b/paddle/fluid/framework/details/op_handle_base.cc index e4194a7442..846bc21be2 100644 --- a/paddle/fluid/framework/details/op_handle_base.cc +++ b/paddle/fluid/framework/details/op_handle_base.cc @@ -54,17 +54,6 @@ void OpHandleBase::Run(bool use_event) { #endif RunImpl(); - -#ifdef PADDLE_WITH_CUDA - if (use_event) { - for (auto &p : dev_ctxes_) { - int dev_id = boost::get(p.first).device; - auto stream = - static_cast(p.second)->stream(); - PADDLE_ENFORCE(cudaEventRecord(events_.at(dev_id), stream)); - } - } -#endif } void OpHandleBase::Wait(platform::DeviceContext *waited_dev) { @@ -97,6 +86,27 @@ void OpHandleBase::AddOutput(VarHandleBase *out) { out->generated_op_ = this; } +void OpHandleBase::RunAndRecordEvent(const std::function &callback) { +#ifdef PADDLE_WITH_CUDA + if (!events_.empty()) { // Use event + std::function method = callback; + + for (auto &p : dev_ctxes_) { + method = [method, p, this]() { + static_cast(p.second)->RecordEvent( + events_.at(boost::get(p.first).device), + method); + }; + } + method(); + } else { +#endif + callback(); +#ifdef PADDLE_WITH_CUDA + } +#endif +} + } // namespace details } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/details/op_handle_base.h b/paddle/fluid/framework/details/op_handle_base.h index fbdb54ba8d..1aacba5a4c 100644 --- a/paddle/fluid/framework/details/op_handle_base.h +++ b/paddle/fluid/framework/details/op_handle_base.h @@ -62,6 +62,8 @@ class OpHandleBase { virtual bool IsMultiDeviceTransfer() { return false; } protected: + void RunAndRecordEvent(const std::function &callback); + virtual void RunImpl() = 0; }; diff --git a/paddle/fluid/framework/details/scale_loss_grad_op_handle.cc b/paddle/fluid/framework/details/scale_loss_grad_op_handle.cc index 0a6f6129b8..7fb9f99a8a 100644 --- a/paddle/fluid/framework/details/scale_loss_grad_op_handle.cc +++ b/paddle/fluid/framework/details/scale_loss_grad_op_handle.cc @@ -14,6 +14,8 @@ #include "paddle/fluid/framework/details/scale_loss_grad_op_handle.h" +#include + namespace paddle { namespace framework { namespace details { @@ -37,11 +39,13 @@ void ScaleLossGradOpHandle::RunImpl() { *tmp = coeff_; } else { #ifdef PADDLE_WITH_CUDA - auto stream = - static_cast(this->dev_ctxes_[place_]) - ->stream(); - memory::Copy(boost::get(place_), tmp, - platform::CPUPlace(), &coeff_, sizeof(float), stream); + this->RunAndRecordEvent([&] { + auto stream = + static_cast(this->dev_ctxes_[place_]) + ->stream(); + memory::Copy(boost::get(place_), tmp, + platform::CPUPlace(), &coeff_, sizeof(float), stream); + }); #endif } } diff --git a/paddle/fluid/framework/details/send_op_handle.cc b/paddle/fluid/framework/details/send_op_handle.cc index d181607e86..549b9d9abb 100644 --- a/paddle/fluid/framework/details/send_op_handle.cc +++ b/paddle/fluid/framework/details/send_op_handle.cc @@ -34,7 +34,7 @@ void SendOpHandle::RunImpl() { } in->generated_op_->Wait(dev_ctxes_[p]); } - op_->Run(*local_scope_, place_); + this->RunAndRecordEvent([&] { op_->Run(*local_scope_, place_); }); } std::string SendOpHandle::Name() const { return "send"; } diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 1ce69ab02b..a371ee10fe 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -196,10 +196,12 @@ void ThreadedSSAGraphExecutor::RunOp( BlockingQueue *ready_var_q, details::OpHandleBase *op) { auto op_run = [ready_var_q, op, this] { try { - VLOG(10) << op->Name() << " : " << op->DebugString(); + VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); op->Run(use_event_); + VLOG(10) << op << " " << op->Name() << " Done "; running_ops_--; ready_var_q->Extend(op->outputs_); + VLOG(10) << op << " " << op->Name() << "Signal posted"; } catch (platform::EnforceNotMet ex) { exception_.reset(new platform::EnforceNotMet(ex)); } catch (...) { diff --git a/paddle/fluid/platform/device_context.cc b/paddle/fluid/platform/device_context.cc index f03165fae5..1f733d71bd 100644 --- a/paddle/fluid/platform/device_context.cc +++ b/paddle/fluid/platform/device_context.cc @@ -175,7 +175,7 @@ CUDADeviceContext::~CUDADeviceContext() { Place CUDADeviceContext::GetPlace() const { return place_; } void CUDADeviceContext::Wait() const { - std::lock_guard guard(mutex_); + 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 b175583379..a9c1984616 100644 --- a/paddle/fluid/platform/device_context.h +++ b/paddle/fluid/platform/device_context.h @@ -98,13 +98,20 @@ class CUDADeviceContext : public DeviceContext { /*! \brief Return cuda stream in the device context. */ cudaStream_t stream() const; + template + void RecordEvent(cudaEvent_t ev, Callback callback) { + std::lock_guard guard(mutex_); + callback(); + PADDLE_ENFORCE(cudaEventRecord(ev, stream_)); + } + private: CUDAPlace place_; std::unique_ptr eigen_device_; std::unique_ptr eigen_stream_; - mutable std::mutex mutex_; + mutable std::recursive_mutex mutex_; cudaStream_t stream_; cudnnHandle_t cudnn_handle_; cublasHandle_t cublas_handle_; From cedade949412a1fcffa12714375e03e4234282af Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Fri, 13 Apr 2018 16:30:08 +0800 Subject: [PATCH 124/164] Stash --- .../details/nccl_all_reduce_op_handle.cc | 84 ++++++++++++++----- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc b/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc index 55b5f11358..6e4314e2a8 100644 --- a/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc +++ b/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc @@ -14,6 +14,8 @@ #include "paddle/fluid/framework/details/nccl_all_reduce_op_handle.h" +#include + namespace paddle { namespace framework { namespace details { @@ -27,6 +29,32 @@ NCCLAllReduceOpHandle::NCCLAllReduceOpHandle( } } +struct ReduceLoDTensor { + const std::vector &src_tensors_; + LoDTensor &dst_tensor_; + + ReduceLoDTensor(const std::vector &src, LoDTensor *dst) + : src_tensors_(src), dst_tensor_(*dst) {} + + template + void operator()() const { + PADDLE_ENFORCE(!src_tensors_.empty()); + auto &t0 = src_tensors_[0]; + PADDLE_ENFORCE_NE(t0.numel(), 0); + dst_tensor_.Resize(t0.dims()); + T *dst = dst_tensor_.mutable_data(platform::CPUPlace()); + std::copy(t0.data(), t0.data() + t0.numel(), dst); + + for (size_t i = 1; i < src_tensors_.size(); ++i) { + auto &t = src_tensors_[i]; + PADDLE_ENFORCE_EQ(t.dims(), t0.dims()); + PADDLE_ENFORCE_EQ(t.type(), t0.type()); + std::transform(t.data(), t.data() + t.numel(), dst, dst, + [](T a, T b) -> T { return a + b; }); + } + } +}; + void NCCLAllReduceOpHandle::RunImpl() { if (inputs_.size() == 1) { return; // No need to all reduce when GPU count = 1; @@ -41,37 +69,53 @@ void NCCLAllReduceOpHandle::RunImpl() { int dtype = -1; size_t numel = 0; - std::vector> all_reduce_calls; + std::vector lod_tensors; for (size_t i = 0; i < local_scopes_.size(); ++i) { - auto &p = places_[i]; auto *s = local_scopes_[i]; - int dev_id = boost::get(p).device; auto &lod_tensor = s->FindVar(var_name)->Get(); - void *buffer = const_cast(lod_tensor.data()); + lod_tensors.emplace_back(lod_tensor); + } + + if (platform::is_gpu_place(lod_tensors[0].place())) { + std::vector> all_reduce_calls; + for (size_t i = 0; i < local_scopes_.size(); ++i) { + auto &p = places_[i]; + auto &lod_tensor = lod_tensors[i]; + void *buffer = const_cast(lod_tensor.data()); - if (dtype == -1) { - dtype = platform::ToNCCLDataType(lod_tensor.type()); + if (dtype == -1) { + dtype = platform::ToNCCLDataType(lod_tensor.type()); + } + + if (numel == 0) { + numel = static_cast(lod_tensor.numel()); + } + + int dev_id = boost::get(p).device; + auto &nccl_ctx = nccl_ctxs_.at(dev_id); + auto stream = nccl_ctx.stream(); + auto comm = nccl_ctx.comm_; + all_reduce_calls.emplace_back([=] { + PADDLE_ENFORCE(platform::dynload::ncclAllReduce( + buffer, buffer, numel, static_cast(dtype), + ncclSum, comm, stream)); + }); } - if (numel == 0) { - numel = static_cast(lod_tensor.numel()); + platform::NCCLGroupGuard guard; + for (auto &call : all_reduce_calls) { + call(); } + } else { // Special handle CPU only Operator's gradient. Like CRF + framework::LoDTensor trg; - auto &nccl_ctx = nccl_ctxs_.at(dev_id); - auto stream = nccl_ctx.stream(); - auto comm = nccl_ctx.comm_; - all_reduce_calls.emplace_back([=] { - PADDLE_ENFORCE(platform::dynload::ncclAllReduce( - buffer, buffer, numel, static_cast(dtype), ncclSum, - comm, stream)); - }); - } + // Reduce All Tensor to trg in CPU + ReduceLoDTensor func(lod_tensors, &trg); + VisitDataType(ToDataType(lod_tensors[0].type()), func); - platform::NCCLGroupGuard guard; - for (auto &call : all_reduce_calls) { - call(); + // Copy trg to GPU } } } From 79be06045c2cfd97b14991dac5bdbe2a2fa765db Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Fri, 13 Apr 2018 16:43:44 +0800 Subject: [PATCH 125/164] Support CPU/GPU mixture for ParallelExecutor --- .../details/nccl_all_reduce_op_handle.cc | 13 +++++++++++++ paddle/fluid/framework/details/op_handle_base.cc | 16 ++++++++++++++++ paddle/fluid/framework/details/op_handle_base.h | 3 +++ 3 files changed, 32 insertions(+) diff --git a/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc b/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc index 3547a6e21c..1e48f75958 100644 --- a/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc +++ b/paddle/fluid/framework/details/nccl_all_reduce_op_handle.cc @@ -116,6 +116,19 @@ void NCCLAllReduceOpHandle::RunImpl() { // Reduce All Tensor to trg in CPU ReduceLoDTensor func(lod_tensors, &trg); VisitDataType(ToDataType(lod_tensors[0].type()), func); + + for (size_t i = 0; i < local_scopes_.size(); ++i) { + auto &scope = local_scopes_[i]; + auto &p = places_[i]; + auto *var = scope->FindVar(var_name); + auto *dev_ctx = dev_ctxes_[p]; + + RunAndRecordEvent(p, [&trg, var, dev_ctx, p] { + auto &tensor_gpu = *var->GetMutable(); + auto &tensor_cpu = trg; + TensorCopy(tensor_cpu, p, *dev_ctx, &tensor_gpu); + }); + } } } } diff --git a/paddle/fluid/framework/details/op_handle_base.cc b/paddle/fluid/framework/details/op_handle_base.cc index 846bc21be2..28f1e7b508 100644 --- a/paddle/fluid/framework/details/op_handle_base.cc +++ b/paddle/fluid/framework/details/op_handle_base.cc @@ -107,6 +107,22 @@ void OpHandleBase::RunAndRecordEvent(const std::function &callback) { #endif } +void OpHandleBase::RunAndRecordEvent(platform::Place p, + const std::function &callback) { + if (platform::is_cpu_place(p) || events_.empty()) { + callback(); + } else { +#ifdef PADDLE_WITH_CUDA + auto *ctx = dev_ctxes_.at(p); + auto *cuda_ctx = static_cast(ctx); + cuda_ctx->RecordEvent(events_.at(boost::get(p).device), + callback); +#else + PADDLE_THROW("Not implemented"); +#endif + } +} + } // namespace details } // namespace framework } // namespace paddle diff --git a/paddle/fluid/framework/details/op_handle_base.h b/paddle/fluid/framework/details/op_handle_base.h index 1aacba5a4c..a9a6c8d39c 100644 --- a/paddle/fluid/framework/details/op_handle_base.h +++ b/paddle/fluid/framework/details/op_handle_base.h @@ -64,6 +64,9 @@ class OpHandleBase { protected: void RunAndRecordEvent(const std::function &callback); + void RunAndRecordEvent(platform::Place p, + const std::function &callback); + virtual void RunImpl() = 0; }; From 02842cfc2508240cca89bac59d1beaac2f5da2b6 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Fri, 13 Apr 2018 13:46:17 +0800 Subject: [PATCH 126/164] enhance broadcast_op_handle and gather_op_handle --- .../framework/details/broadcast_op_handle.cc | 71 +++++--- .../details/broadcast_op_handle_test.cc | 151 +++++++++--------- .../framework/details/gather_op_handle.cc | 131 +++++++-------- .../details/gather_op_handle_test.cc | 129 ++++++++------- .../fluid/framework/details/op_handle_base.cc | 15 -- .../fluid/framework/details/op_handle_base.h | 8 - 6 files changed, 266 insertions(+), 239 deletions(-) diff --git a/paddle/fluid/framework/details/broadcast_op_handle.cc b/paddle/fluid/framework/details/broadcast_op_handle.cc index 53e8f9f366..24115cae81 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle.cc @@ -18,45 +18,74 @@ namespace paddle { namespace framework { namespace details { +Tensor *GetTensorFromVar(Variable *in_var) { + if (in_var->IsType()) { + return in_var->GetMutable(); + } else if (in_var->IsType()) { + return in_var->GetMutable()->mutable_value(); + } else { + PADDLE_THROW("Var should be LoDTensor or SelectedRows"); + } + return nullptr; +} + BroadcastOpHandle::BroadcastOpHandle(const std::vector &local_scopes, const std::vector &places) : local_scopes_(local_scopes), places_(places) {} void BroadcastOpHandle::RunImpl() { - PADDLE_ENFORCE_EQ(this->inputs_.size(), 1, + // the input may have dummy var. + std::vector in_var_handle; + for (auto *in : inputs_) { + auto *out_handle = dynamic_cast(in); + if (out_handle) { + in_var_handle.push_back(out_handle); + } + } + PADDLE_ENFORCE_EQ(in_var_handle.size(), 1, "The number of input should be one."); + + // the output may have dummy var. + std::vector out_var_handles; + for (auto *out : outputs_) { + auto *out_handle = dynamic_cast(out); + if (out_handle) { + out_var_handles.push_back(out_handle); + } + } + PADDLE_ENFORCE_EQ( - this->outputs_.size(), places_.size(), + out_var_handles.size(), places_.size(), "The number of output should equal to the number of places."); // Wait input done, this Wait is asynchronous operation - auto in_var_handle = static_cast(this->inputs_[0]); - auto &in_place = in_var_handle->place_; - if (inputs_[0]->generated_op_) { - inputs_[0]->generated_op_->Wait(dev_ctxes_[in_place]); - for (auto *out : outputs_) { - auto out_handle = static_cast(out); - auto &out_p = out_handle->place_; - inputs_[0]->generated_op_->Wait(dev_ctxes_[out_p]); + auto &in_place = in_var_handle[0]->place_; + if (in_var_handle[0]->generated_op_) { + in_var_handle[0]->generated_op_->Wait(dev_ctxes_[in_place]); + for (auto *out : out_var_handles) { + auto &out_p = out->place_; + if (platform::is_same_place(in_place, out_p)) continue; + in_var_handle[0]->generated_op_->Wait(dev_ctxes_[out_p]); } } - auto in_scope_idx = in_var_handle->scope_idx_; + // + auto in_scope_idx = in_var_handle[0]->scope_idx_; PADDLE_ENFORCE_LT(in_scope_idx, local_scopes_.size(), "The input(%s) is not in the local_scopes.", - in_var_handle->name_); - auto in_var = local_scopes_[in_scope_idx]->FindVar(in_var_handle->name_); - + in_var_handle[0]->name_); + auto in_var = local_scopes_[in_scope_idx]->FindVar(in_var_handle[0]->name_); Tensor *in_tensor = GetTensorFromVar(in_var); - for (auto *out : outputs_) { - auto out_handle = static_cast(out); - auto &out_p = out_handle->place_; - auto out_scope_idx = out_handle->scope_idx_; + for (auto *out : out_var_handles) { + auto &out_p = out->place_; + + auto out_scope_idx = out->scope_idx_; PADDLE_ENFORCE_LT(out_scope_idx, local_scopes_.size(), - "%s is not in the local_scopes ", out_handle->name_); + "%s is not in the local_scopes ", out->name_); + auto *s = local_scopes_[out_scope_idx]; - auto out_var = s->FindVar(out_handle->name_); + auto out_var = s->FindVar(out->name_); PADDLE_ENFORCE_EQ(out_p.which(), in_place.which(), "The place of input and output should be the same."); @@ -89,7 +118,7 @@ void BroadcastOpHandle::RunImpl() { auto dst_gpu_place = boost::get(out_p); void *dst_ptr = out_tensor->mutable_data(out_p); void *src_ptr = in_tensor->data(); - int64_t size = in_tensor->numel(); + int64_t size = in_tensor->numel() * SizeOfType(in_tensor->type()); memory::Copy( dst_gpu_place, dst_ptr, src_gpu_place, src_ptr, size, reinterpret_cast(dev_ctxes_[out_p]) diff --git a/paddle/fluid/framework/details/broadcast_op_handle_test.cc b/paddle/fluid/framework/details/broadcast_op_handle_test.cc index 9bf72f0360..dfc52b012f 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle_test.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle_test.cc @@ -27,8 +27,20 @@ namespace p = paddle::platform; // test data amount const f::DDim kDims = {20, 20}; -class BroadcastTester : public ::testing::Test { - public: +struct TestBroadcastOpHandle { + std::vector> ctxs_; + std::vector local_scopes_; + Scope g_scope_; + std::unique_ptr op_handle_; + std::vector> vars_; + std::vector gpu_list_; + + void WaitAll() { + for (size_t j = 0; j < ctxs_.size(); ++j) { + ctxs_[j]->Wait(); + } + } + void InitCtxOnGpu(bool use_gpu) { if (use_gpu) { #ifdef PADDLE_WITH_CUDA @@ -57,61 +69,56 @@ class BroadcastTester : public ::testing::Test { } } - void BroadcastInitOp(int input_scope_idx) { + void InitBroadcastOp(size_t input_scope_idx) { for (size_t j = 0; j < gpu_list_.size(); ++j) { - local_scope_.push_back(&g_scope_.NewScope()); - local_scope_[j]->Var("out"); + local_scopes_.push_back(&(g_scope_.NewScope())); + local_scopes_[j]->Var("out"); } - local_scope_[input_scope_idx]->Var("input"); + local_scopes_[input_scope_idx]->Var("input"); - bc_op_handle_ = new f::details::BroadcastOpHandle(local_scope_, gpu_list_); + op_handle_.reset(new BroadcastOpHandle(local_scopes_, gpu_list_)); - f::details::VarHandle* in_var_handle = new f::details::VarHandle(); + vars_.emplace_back(new VarHandle()); + VarHandle* in_var_handle = static_cast(vars_.back().get()); in_var_handle->place_ = gpu_list_[input_scope_idx]; in_var_handle->name_ = "input"; in_var_handle->version_ = 1; in_var_handle->scope_idx_ = input_scope_idx; in_var_handle->generated_op_ = nullptr; - bc_op_handle_->AddInput(in_var_handle); + op_handle_->AddInput(in_var_handle); + + // add dummy var + vars_.emplace_back(new DummyVarHandle()); + DummyVarHandle* dummy_var_handle = + static_cast(vars_.back().get()); + dummy_var_handle->generated_op_ = nullptr; + op_handle_->AddInput(dummy_var_handle); for (size_t j = 0; j < gpu_list_.size(); ++j) { - bc_op_handle_->dev_ctxes_[gpu_list_[j]] = ctxs_[j]; - f::details::VarHandle* out_var_handle = new f::details::VarHandle(); + op_handle_->dev_ctxes_[gpu_list_[j]] = ctxs_[j].get(); + vars_.emplace_back(new VarHandle()); + VarHandle* out_var_handle = static_cast(vars_.back().get()); out_var_handle->place_ = gpu_list_[j]; out_var_handle->name_ = "out"; out_var_handle->version_ = 2; out_var_handle->scope_idx_ = j; - bc_op_handle_->AddOutput(out_var_handle); - } - } - void BroadcastOpDestroy() { - for (auto in : bc_op_handle_->inputs_) { - delete in; - } - for (auto out : bc_op_handle_->outputs_) { - delete out; + op_handle_->AddOutput(out_var_handle); } - delete bc_op_handle_; - for (size_t j = 0; j < ctxs_.size(); ++j) { - delete ctxs_[j]; - } - } - void WaitAll() { - for (size_t j = 0; j < ctxs_.size(); ++j) { - ctxs_[j]->Wait(); - } + // add dummy var + vars_.emplace_back(new DummyVarHandle()); + DummyVarHandle* out_dummy_var_handle = + static_cast(vars_.back().get()); + out_dummy_var_handle->generated_op_ = nullptr; + op_handle_->AddOutput(out_dummy_var_handle); } - void TestBroadcastLodTensor() { - int input_scope_idx = 0; - BroadcastInitOp(input_scope_idx); - - auto in_var = local_scope_[input_scope_idx]->Var("input"); + void TestBroadcastLodTensor(size_t input_scope_idx) { + auto in_var = local_scopes_[input_scope_idx]->Var("input"); auto in_lod_tensor = in_var->GetMutable(); in_lod_tensor->mutable_data(kDims, gpu_list_[input_scope_idx]); - std::vector send_vector(f::product(kDims), input_scope_idx + 12); + std::vector send_vector(static_cast(f::product(kDims))); for (size_t k = 0; k < send_vector.size(); ++k) { send_vector[k] = k; } @@ -120,13 +127,13 @@ class BroadcastTester : public ::testing::Test { send_vector, *(ctxs_[input_scope_idx]), in_lod_tensor); in_lod_tensor->set_lod(lod); - bc_op_handle_->Run(false); + op_handle_->Run(false); WaitAll(); p::CPUPlace cpu_place; for (size_t j = 0; j < gpu_list_.size(); ++j) { - auto out_var = local_scope_[j]->Var("out"); + auto out_var = local_scopes_[j]->Var("out"); auto out_tensor = out_var->Get(); PADDLE_ENFORCE_EQ(out_tensor.lod(), lod, "lod is not equal."); @@ -134,42 +141,37 @@ class BroadcastTester : public ::testing::Test { f::TensorCopy(out_tensor, cpu_place, *(ctxs_[j]), &result_tensor); float* ct = result_tensor.mutable_data(cpu_place); - for (int64_t j = 0; j < f::product(kDims); ++j) { - ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + for (int64_t i = 0; i < f::product(kDims); ++i) { + ASSERT_NEAR(ct[i], send_vector[i], 1e-5); } } - - BroadcastOpDestroy(); } - void TestBroadcastSelectedRows() { - int input_scope_idx = 0; - BroadcastInitOp(input_scope_idx); - - auto in_var = local_scope_[input_scope_idx]->Var("input"); + void TestBroadcastSelectedRows(size_t input_scope_idx) { + auto in_var = local_scopes_[input_scope_idx]->Var("input"); auto in_selected_rows = in_var->GetMutable(); auto value = in_selected_rows->mutable_value(); value->mutable_data(kDims, gpu_list_[input_scope_idx]); - int height = kDims[0] * 2; + int height = static_cast(kDims[0]) * 2; std::vector rows{0, 1, 2, 3, 3, 0, 14, 7, 3, 1, 2, 4, 6, 3, 1, 1, 1, 1, 3, 7}; in_selected_rows->set_height(height); in_selected_rows->set_rows(rows); - std::vector send_vector(f::product(kDims)); + std::vector send_vector(static_cast(f::product(kDims))); for (size_t k = 0; k < send_vector.size(); ++k) { send_vector[k] = k; } paddle::framework::TensorFromVector( send_vector, *(ctxs_[input_scope_idx]), value); - bc_op_handle_->Run(false); + op_handle_->Run(false); WaitAll(); p::CPUPlace cpu_place; for (size_t j = 0; j < gpu_list_.size(); ++j) { - auto out_var = local_scope_[j]->Var("out"); + auto out_var = local_scopes_[j]->Var("out"); auto& out_select_rows = out_var->Get(); auto rt = out_select_rows.value(); @@ -183,41 +185,44 @@ class BroadcastTester : public ::testing::Test { f::TensorCopy(rt, cpu_place, *(ctxs_[j]), &result_tensor); float* ct = result_tensor.data(); - for (int64_t j = 0; j < f::product(kDims); ++j) { - ASSERT_NEAR(ct[j], send_vector[j], 1e-5); + for (int64_t i = 0; i < f::product(kDims); ++i) { + ASSERT_NEAR(ct[i], send_vector[i], 1e-5); } } - - BroadcastOpDestroy(); } - - public: - f::Scope g_scope_; - std::vector ctxs_; - std::vector local_scope_; - std::vector gpu_list_; - f::details::BroadcastOpHandle* bc_op_handle_; }; -TEST_F(BroadcastTester, TestCPUBroadcastTestLodTensor) { - InitCtxOnGpu(false); - TestBroadcastLodTensor(); +TEST(BroadcastTester, TestCPUBroadcastTestLodTensor) { + TestBroadcastOpHandle test_op; + size_t input_scope_idx = 0; + test_op.InitCtxOnGpu(false); + test_op.InitBroadcastOp(input_scope_idx); + test_op.TestBroadcastLodTensor(input_scope_idx); } -TEST_F(BroadcastTester, TestCPUBroadcastTestSelectedRows) { - InitCtxOnGpu(false); - TestBroadcastSelectedRows(); +TEST(BroadcastTester, TestCPUBroadcastTestSelectedRows) { + TestBroadcastOpHandle test_op; + size_t input_scope_idx = 0; + test_op.InitCtxOnGpu(false); + test_op.InitBroadcastOp(input_scope_idx); + test_op.TestBroadcastSelectedRows(input_scope_idx); } #ifdef PADDLE_WITH_CUDA -TEST_F(BroadcastTester, TestGPUBroadcastTestLodTensor) { - InitCtxOnGpu(true); - TestBroadcastLodTensor(); +TEST(BroadcastTester, TestGPUBroadcastTestLodTensor) { + TestBroadcastOpHandle test_op; + size_t input_scope_idx = 0; + test_op.InitCtxOnGpu(true); + test_op.InitBroadcastOp(input_scope_idx); + test_op.TestBroadcastLodTensor(input_scope_idx); } -TEST_F(BroadcastTester, TestGPUBroadcastTestSelectedRows) { - InitCtxOnGpu(true); - TestBroadcastSelectedRows(); +TEST(BroadcastTester, TestGPUBroadcastTestSelectedRows) { + TestBroadcastOpHandle test_op; + size_t input_scope_idx = 0; + test_op.InitCtxOnGpu(true); + test_op.InitBroadcastOp(input_scope_idx); + test_op.TestBroadcastSelectedRows(input_scope_idx); } #endif diff --git a/paddle/fluid/framework/details/gather_op_handle.cc b/paddle/fluid/framework/details/gather_op_handle.cc index f9dfb2f5c6..3c3054c03d 100644 --- a/paddle/fluid/framework/details/gather_op_handle.cc +++ b/paddle/fluid/framework/details/gather_op_handle.cc @@ -23,32 +23,54 @@ GatherOpHandle::GatherOpHandle(const std::vector &local_scopes, : local_scopes_(local_scopes), places_(places) {} void GatherOpHandle::RunImpl() { + // the input may have dummy var. + std::vector in_var_handles; + for (auto *in : inputs_) { + auto *in_handle = dynamic_cast(in); + if (in_handle) { + in_var_handles.push_back(in_handle); + } + } PADDLE_ENFORCE_EQ( - this->inputs_.size(), places_.size(), - "The number of inputs should be equal to the number of place."); - PADDLE_ENFORCE_EQ(this->outputs_.size(), 1, + in_var_handles.size(), places_.size(), + "The number of output should equal to the number of places."); + + // the output may have dummy var. + std::vector out_var_handles; + for (auto *out : outputs_) { + auto *out_handle = dynamic_cast(out); + if (out_handle) { + out_var_handles.push_back(out_handle); + } + } + PADDLE_ENFORCE_EQ(out_var_handles.size(), 1, "The number of output should be one."); - auto in_0_handle = static_cast(inputs_[0]); + + auto in_0_handle = static_cast(in_var_handles[0]); auto pre_in_var = local_scopes_[in_0_handle->scope_idx_]->FindVar(in_0_handle->name_); + auto pre_place = in_0_handle->place_; + PADDLE_ENFORCE(pre_in_var->IsType(), "Currently, gather_op only can gather SelectedRows."); - auto pre_place = in_0_handle->place_; + + PADDLE_ENFORCE_EQ(out_var_handles[0]->place_.which(), pre_place.which(), + "The place of input and output should be the same."); // Wait input done, this Wait is asynchronous operation - for (auto *in : inputs_) { - if (inputs_[0]->generated_op_) { - auto &p = static_cast(in)->place_; - in->generated_op_->Wait(dev_ctxes_[p]); + for (auto *in : in_var_handles) { + if (in->generated_op_) { + in->generated_op_->Wait(dev_ctxes_[in->place_]); } } std::vector out_rows; - std::vector in_tensors; + std::vector in_tensors; std::vector in_places; + auto &pre_in = pre_in_var->Get(); // gather the inputs - for (auto *in : inputs_) { + for (auto *in : in_var_handles) { auto in_handle = static_cast(in); auto in_p = in_handle->place_; in_places.push_back(in_p); @@ -58,63 +80,46 @@ void GatherOpHandle::RunImpl() { "The place of input should be the same."); auto *s = local_scopes_[in_handle->scope_idx_]; auto in_var = s->FindVar(in_handle->name_); - PADDLE_ENFORCE_EQ(in_var->Type(), pre_in_var->Type(), + + auto &in_sr = in_var->Get(); + + PADDLE_ENFORCE_EQ(in_sr.value().type(), pre_in.value().type(), "The type of input is not consistent."); + PADDLE_ENFORCE_EQ(pre_in.height(), in_sr.height(), + "The height of inputs is not consistent."); + PADDLE_ENFORCE_EQ(pre_in.GetCompleteDims(), in_sr.GetCompleteDims(), , + "The dims of inputs is not consistent."); - if (in_var->IsType()) { - auto &pre_in = pre_in_var->Get(); - auto &in_sr = in_var->Get(); - auto in_sr_rows = in_sr.rows(); - out_rows.insert(out_rows.begin(), in_sr_rows.begin(), in_sr_rows.end()); - PADDLE_ENFORCE_EQ(pre_in.height(), in_sr.height(), - "The height of inputs is not consistent."); - PADDLE_ENFORCE_EQ(pre_in.GetCompleteDims(), in_sr.GetCompleteDims(), , - "The dims of inputs is not consistent."); - } else if (in_var->IsType()) { - auto &pre_in = pre_in_var->Get(); - auto &in_lodtensor = in_var->Get(); - PADDLE_ENFORCE_EQ(in_lodtensor.lod(), pre_in.lod(), - "The lod of inputs is not consistent."); - PADDLE_ENFORCE_EQ(in_lodtensor.dims(), pre_in.dims(), - "The dims of inputs is not consistent."); - } else { - PADDLE_THROW("Var should be LoDTensor or SelectedRows."); - } - in_tensors.push_back(GetTensorFromVar(in_var)); - pre_in_var = in_var; + auto in_sr_rows = in_sr.rows(); + out_rows.insert(out_rows.end(), in_sr_rows.begin(), in_sr_rows.end()); + + in_tensors.emplace_back(in_sr.value()); } // write the output - auto out_handle = static_cast(this->outputs_[0]); - auto &out_place = out_handle->place_; - auto out_scope_idx = out_handle->scope_idx_; - auto out_var = local_scopes_[out_scope_idx]->FindVar(out_handle->name_); - PADDLE_ENFORCE_EQ(out_place.which(), pre_place.which(), - "The place of input and output should be the same."); - if (pre_in_var->IsType()) { - auto &pre_in = pre_in_var->Get(); - auto out = out_var->GetMutable(); - out->set_height(pre_in.height()); - out->set_rows(out_rows); - size_t rows = out_rows.size(); - DDim out_dim = pre_in.GetCompleteDims(); - out_dim[0] = static_cast(rows); - out->mutable_value()->Resize(out_dim); - out->mutable_value()->mutable_data(out_place, pre_in.value().type()); - auto out_tensor = out->mutable_value(); - // copy - int s = 0, e = 0; - for (size_t j = 0; j < in_tensors.size(); ++j) { - e += in_tensors[j]->dims()[0]; - auto sub_out = out_tensor->Slice(s, e); - paddle::framework::TensorCopy(*(in_tensors[j]), out_place, - *(dev_ctxes_[in_places[j]]), &sub_out); - s = e; - } - } else if (pre_in_var->IsType()) { - PADDLE_THROW("Currently, Var only can be SelectedRows."); - } else { - PADDLE_THROW("Var should be SelectedRows."); + auto &out_place = out_var_handles[0]->place_; + auto out_scope_idx = out_var_handles[0]->scope_idx_; + auto out_var = + local_scopes_[out_scope_idx]->FindVar(out_var_handles[0]->name_); + + auto out = out_var->GetMutable(); + out->set_height(pre_in.height()); + out->set_rows(out_rows); + size_t rows = out_rows.size(); + DDim out_dim = pre_in.GetCompleteDims(); + out_dim[0] = static_cast(rows); + out->mutable_value()->Resize(out_dim); + out->mutable_value()->mutable_data(out_place, pre_in.value().type()); + Tensor *out_tensor = out->mutable_value(); + + // copy + int s = 0, e = 0; + for (size_t j = 0; j < in_tensors.size(); ++j) { + e += in_tensors[j].dims()[0]; + auto sub_out = out_tensor->Slice(s, e); + paddle::framework::TensorCopy(in_tensors[j], out_place, + *(dev_ctxes_[in_places[j]]), &sub_out); + s = e; } } diff --git a/paddle/fluid/framework/details/gather_op_handle_test.cc b/paddle/fluid/framework/details/gather_op_handle_test.cc index 3cf2155320..10839f239d 100644 --- a/paddle/fluid/framework/details/gather_op_handle_test.cc +++ b/paddle/fluid/framework/details/gather_op_handle_test.cc @@ -26,14 +26,26 @@ namespace p = paddle::platform; // test data amount const f::DDim kDims = {20, 20}; -class GatherTester : public ::testing::Test { - public: +struct TestGatherOpHandle { + std::vector> ctxs_; + std::vector local_scopes_; + Scope g_scope_; + std::unique_ptr op_handle_; + std::vector> vars_; + std::vector gpu_list_; + + void WaitAll() { + for (size_t j = 0; j < ctxs_.size(); ++j) { + ctxs_[j]->Wait(); + } + } + void InitCtxOnGpu(bool use_gpu) { if (use_gpu) { #ifdef PADDLE_WITH_CUDA int count = p::GetCUDADeviceCount(); if (count <= 1) { - LOG(WARNING) << "Cannot test multi-gpu Gather, because the CUDA " + LOG(WARNING) << "Cannot test multi-gpu Broadcast, because the CUDA " "device count is " << count; exit(0); @@ -56,57 +68,51 @@ class GatherTester : public ::testing::Test { } } - void InitGatherOp(int input_scope_idx) { + void InitGatherOp(size_t input_scope_idx) { for (size_t j = 0; j < gpu_list_.size(); ++j) { - local_scope_.push_back(&g_scope_.NewScope()); - local_scope_[j]->Var("input"); + local_scopes_.push_back(&(g_scope_.NewScope())); + local_scopes_[j]->Var("out"); } - local_scope_[input_scope_idx]->Var("out"); - - gather_op_handle_ = new f::details::GatherOpHandle(local_scope_, gpu_list_); - - f::details::VarHandle* out_var_handle = new f::details::VarHandle(); - out_var_handle->place_ = gpu_list_[input_scope_idx]; - out_var_handle->name_ = "out"; - out_var_handle->version_ = 2; - out_var_handle->scope_idx_ = input_scope_idx; - out_var_handle->generated_op_ = gather_op_handle_; - gather_op_handle_->AddOutput(out_var_handle); + local_scopes_[input_scope_idx]->Var("input"); + op_handle_.reset(new GatherOpHandle(local_scopes_, gpu_list_)); + // add input for (size_t j = 0; j < gpu_list_.size(); ++j) { - gather_op_handle_->dev_ctxes_[gpu_list_[j]] = ctxs_[j]; - f::details::VarHandle* in_var_handle = new f::details::VarHandle(); + op_handle_->dev_ctxes_[gpu_list_[j]] = ctxs_[j].get(); + vars_.emplace_back(new VarHandle()); + VarHandle* in_var_handle = static_cast(vars_.back().get()); in_var_handle->place_ = gpu_list_[j]; in_var_handle->name_ = "input"; in_var_handle->version_ = 1; in_var_handle->scope_idx_ = j; in_var_handle->generated_op_ = nullptr; - gather_op_handle_->AddInput(in_var_handle); - } - } - void GatherOpDestroy() { - for (auto in : gather_op_handle_->inputs_) { - delete in; - } - for (auto out : gather_op_handle_->outputs_) { - delete out; - } - delete gather_op_handle_; - for (size_t j = 0; j < ctxs_.size(); ++j) { - delete ctxs_[j]; + op_handle_->AddInput(in_var_handle); } - } - void WaitAll() { - for (size_t j = 0; j < ctxs_.size(); ++j) { - ctxs_[j]->Wait(); - } - } + // add dummy var + vars_.emplace_back(new DummyVarHandle()); + DummyVarHandle* in_dummy_var_handle = + static_cast(vars_.back().get()); + in_dummy_var_handle->generated_op_ = nullptr; + op_handle_->AddInput(in_dummy_var_handle); + + // add output + vars_.emplace_back(new VarHandle()); + VarHandle* out_var_handle = static_cast(vars_.back().get()); + out_var_handle->place_ = gpu_list_[input_scope_idx]; + out_var_handle->name_ = "out"; + out_var_handle->version_ = 2; + out_var_handle->scope_idx_ = input_scope_idx; + op_handle_->AddOutput(out_var_handle); - void TestGatherSelectedRows() { - int output_scope_idx = 0; - InitGatherOp(output_scope_idx); + // add dummy var + vars_.emplace_back(new DummyVarHandle()); + DummyVarHandle* dummy_var_handle = + static_cast(vars_.back().get()); + op_handle_->AddOutput(dummy_var_handle); + } + void TestGatherSelectedRows(size_t output_scope_idx) { int height = kDims[0] * 2; std::vector rows{0, 1, 2, 3, 3, 0, 14, 7, 3, 1, 2, 4, 6, 3, 1, 1, 1, 1, 3, 7}; @@ -117,7 +123,7 @@ class GatherTester : public ::testing::Test { for (size_t input_scope_idx = 0; input_scope_idx < gpu_list_.size(); ++input_scope_idx) { - auto in_var = local_scope_[input_scope_idx]->Var("input"); + auto in_var = local_scopes_[input_scope_idx]->Var("input"); auto in_selected_rows = in_var->GetMutable(); auto value = in_selected_rows->mutable_value(); value->mutable_data(kDims, gpu_list_[input_scope_idx]); @@ -130,13 +136,21 @@ class GatherTester : public ::testing::Test { value->Resize(kDims); } - gather_op_handle_->Run(false); + auto out_var = local_scopes_[output_scope_idx]->Var("out"); + auto out_selected_rows = out_var->GetMutable(); + + auto in_var = local_scopes_[output_scope_idx]->Var("input"); + auto in_selected_rows = in_var->GetMutable(); + + out_selected_rows->mutable_value()->ShareDataWith( + in_selected_rows->value()); + + op_handle_->Run(false); WaitAll(); p::CPUPlace cpu_place; - auto out_var = local_scope_[output_scope_idx]->Var("out"); auto& out_select_rows = out_var->Get(); auto rt = out_select_rows.value(); @@ -152,28 +166,25 @@ class GatherTester : public ::testing::Test { for (int64_t j = 0; j < f::product(kDims); ++j) { ASSERT_NEAR(ct[j], send_vector[j % send_vector.size()], 1e-5); } - - GatherOpDestroy(); } - - public: - f::Scope g_scope_; - std::vector ctxs_; - std::vector local_scope_; - std::vector gpu_list_; - f::details::GatherOpHandle* gather_op_handle_; }; -TEST_F(GatherTester, TestCPUGatherTestSelectedRows) { - InitCtxOnGpu(false); - TestGatherSelectedRows(); +TEST(GatherTester, TestCPUGatherTestSelectedRows) { + TestGatherOpHandle test_op; + size_t input_scope_idx = 0; + test_op.InitCtxOnGpu(false); + test_op.InitGatherOp(input_scope_idx); + test_op.TestGatherSelectedRows(input_scope_idx); } #ifdef PADDLE_WITH_CUDA -TEST_F(GatherTester, TestGPUGatherTestSelectedRows) { - InitCtxOnGpu(true); - TestGatherSelectedRows(); +TEST(GatherTester, TestGPUGatherTestSelectedRows) { + TestGatherOpHandle test_op; + size_t input_scope_idx = 0; + test_op.InitCtxOnGpu(false); + test_op.InitGatherOp(input_scope_idx); + test_op.TestGatherSelectedRows(input_scope_idx); } #endif } // namespace details diff --git a/paddle/fluid/framework/details/op_handle_base.cc b/paddle/fluid/framework/details/op_handle_base.cc index 0d7fbdfeab..e4194a7442 100644 --- a/paddle/fluid/framework/details/op_handle_base.cc +++ b/paddle/fluid/framework/details/op_handle_base.cc @@ -17,21 +17,6 @@ namespace paddle { namespace framework { namespace details { - -// GetTensorFromVar is used in broadcast_op handle and gather_op handle, so it -// should be placed in a commonplace. I don't find an appropriate place, so I -// temporarily place it in op_handle_base. -Tensor *GetTensorFromVar(Variable *in_var) { - if (in_var->IsType()) { - return in_var->GetMutable(); - } else if (in_var->IsType()) { - return in_var->GetMutable()->mutable_value(); - } else { - PADDLE_THROW("Var should be LoDTensor or SelectedRows"); - } - return nullptr; -} - std::string OpHandleBase::DebugString() const { std::stringstream ss; ss << "("; diff --git a/paddle/fluid/framework/details/op_handle_base.h b/paddle/fluid/framework/details/op_handle_base.h index b733817dcd..fbdb54ba8d 100644 --- a/paddle/fluid/framework/details/op_handle_base.h +++ b/paddle/fluid/framework/details/op_handle_base.h @@ -17,9 +17,6 @@ #include #include "paddle/fluid/framework/details/var_handle.h" -#include "paddle/fluid/framework/lod_tensor.h" -#include "paddle/fluid/framework/selected_rows.h" -#include "paddle/fluid/framework/variable.h" #include "paddle/fluid/platform/device_context.h" #include "paddle/fluid/platform/macros.h" @@ -27,11 +24,6 @@ namespace paddle { namespace framework { namespace details { -// GetTensorFromVar is used in broadcast_op handle and gather_op handle, so it -// should be placed in a commonplace. I don't find an appropriate place, so I -// temporarily place it in op_handle. -Tensor *GetTensorFromVar(Variable *in_var); - constexpr char kLocalExecScopeName[] = "@LCOAL_SCOPE@"; class OpHandleBase { From 482314e3b1a7f869daca7de302eab0b53abd91cf Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Fri, 13 Apr 2018 17:09:39 +0800 Subject: [PATCH 127/164] Add CRF unittest --- .../tests/book/test_label_semantic_roles.py | 11 +- .../tests/unittests/test_parallel_executor.py | 145 ++++++++++++++++++ 2 files changed, 150 insertions(+), 6 deletions(-) diff --git a/python/paddle/fluid/tests/book/test_label_semantic_roles.py b/python/paddle/fluid/tests/book/test_label_semantic_roles.py index 4d8bca4d24..d9cd76952e 100644 --- a/python/paddle/fluid/tests/book/test_label_semantic_roles.py +++ b/python/paddle/fluid/tests/book/test_label_semantic_roles.py @@ -12,17 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. +import contextlib import math - import numpy as np +import os +import time +import unittest + import paddle import paddle.dataset.conll05 as conll05 import paddle.fluid as fluid -from paddle.fluid.initializer import init_on_cpu -import contextlib -import time -import unittest -import os word_dict, verb_dict, label_dict = conll05.get_dict() word_dict_len = len(word_dict) diff --git a/python/paddle/fluid/tests/unittests/test_parallel_executor.py b/python/paddle/fluid/tests/unittests/test_parallel_executor.py index 95845ea4de..83d22fd799 100644 --- a/python/paddle/fluid/tests/unittests/test_parallel_executor.py +++ b/python/paddle/fluid/tests/unittests/test_parallel_executor.py @@ -505,3 +505,148 @@ class ParallelExecutorTestingDuringTraining(unittest.TestCase): train_loss, test_loss, atol=1e-8), "Train loss: " + str(train_loss) + "\n Test loss:" + str(test_loss)) + + +import paddle.dataset.conll05 as conll05 +import paddle.fluid as fluid + +word_dict, verb_dict, label_dict = conll05.get_dict() +word_dict_len = len(word_dict) +label_dict_len = len(label_dict) +pred_dict_len = len(verb_dict) +mark_dict_len = 2 +word_dim = 32 +mark_dim = 5 +hidden_dim = 512 +depth = 8 +mix_hidden_lr = 1e-3 +embedding_name = 'emb' + + +def db_lstm(word, predicate, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, mark, + **ignored): + # 8 features + predicate_embedding = fluid.layers.embedding( + input=predicate, + size=[pred_dict_len, word_dim], + dtype='float32', + param_attr='vemb') + + mark_embedding = fluid.layers.embedding( + input=mark, size=[mark_dict_len, mark_dim], dtype='float32') + + word_input = [word, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2] + emb_layers = [ + fluid.layers.embedding( + size=[word_dict_len, word_dim], + input=x, + param_attr=fluid.ParamAttr( + name=embedding_name, trainable=False)) for x in word_input + ] + emb_layers.append(predicate_embedding) + emb_layers.append(mark_embedding) + + hidden_0_layers = [ + fluid.layers.fc(input=emb, size=hidden_dim, act='tanh') + for emb in emb_layers + ] + + hidden_0 = fluid.layers.sums(input=hidden_0_layers) + + lstm_0 = fluid.layers.dynamic_lstm( + input=hidden_0, + size=hidden_dim, + candidate_activation='relu', + gate_activation='sigmoid', + cell_activation='sigmoid') + + # stack L-LSTM and R-LSTM with direct edges + input_tmp = [hidden_0, lstm_0] + + for i in range(1, depth): + mix_hidden = fluid.layers.sums(input=[ + fluid.layers.fc(input=input_tmp[0], size=hidden_dim, act='tanh'), + fluid.layers.fc(input=input_tmp[1], size=hidden_dim, act='tanh') + ]) + + lstm = fluid.layers.dynamic_lstm( + input=mix_hidden, + size=hidden_dim, + candidate_activation='relu', + gate_activation='sigmoid', + cell_activation='sigmoid', + is_reverse=((i % 2) == 1)) + + input_tmp = [mix_hidden, lstm] + + feature_out = fluid.layers.sums(input=[ + fluid.layers.fc(input=input_tmp[0], size=label_dict_len, act='tanh'), + fluid.layers.fc(input=input_tmp[1], size=label_dict_len, act='tanh') + ]) + + return feature_out + + +class TestCRFModel(unittest.TestCase): + def test_all(self): + main = fluid.Program() + startup = fluid.Program() + with fluid.program_guard(main, startup): + word = fluid.layers.data( + name='word_data', shape=[1], dtype='int64', lod_level=1) + predicate = fluid.layers.data( + name='verb_data', shape=[1], dtype='int64', lod_level=1) + ctx_n2 = fluid.layers.data( + name='ctx_n2_data', shape=[1], dtype='int64', lod_level=1) + ctx_n1 = fluid.layers.data( + name='ctx_n1_data', shape=[1], dtype='int64', lod_level=1) + ctx_0 = fluid.layers.data( + name='ctx_0_data', shape=[1], dtype='int64', lod_level=1) + ctx_p1 = fluid.layers.data( + name='ctx_p1_data', shape=[1], dtype='int64', lod_level=1) + ctx_p2 = fluid.layers.data( + name='ctx_p2_data', shape=[1], dtype='int64', lod_level=1) + mark = fluid.layers.data( + name='mark_data', shape=[1], dtype='int64', lod_level=1) + feature_out = db_lstm(**locals()) + target = fluid.layers.data( + name='target', shape=[1], dtype='int64', lod_level=1) + crf_cost = fluid.layers.linear_chain_crf( + input=feature_out, + label=target, + param_attr=fluid.ParamAttr( + name='crfw', learning_rate=1e-1)) + avg_cost = fluid.layers.mean(crf_cost) + + sgd_optimizer = fluid.optimizer.SGD( + learning_rate=fluid.layers.exponential_decay( + learning_rate=0.01, + decay_steps=100000, + decay_rate=0.5, + staircase=True)) + sgd_optimizer.minimize(avg_cost) + + train_data = paddle.batch( + paddle.reader.shuffle( + paddle.dataset.conll05.test(), buf_size=8192), + batch_size=16) + + place = fluid.CUDAPlace(0) + exe = fluid.Executor(place) + exe.run(startup) + + pe = fluid.ParallelExecutor(use_cuda=True, loss_name=avg_cost.name) + + feeder = fluid.DataFeeder( + feed_list=[ + word, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, predicate, + mark, target + ], + place=fluid.CPUPlace()) + + data = train_data() + for i in xrange(10): + cur_batch = next(data) + print map(numpy.array, + pe.run(feed_dict=feeder.feed(cur_batch), + fetch_list=[avg_cost.name]))[0] From 253441b55355303f6bc5814f41806d1ab0420b0d Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 13 Apr 2018 17:36:46 +0800 Subject: [PATCH 128/164] fix duplicate lr op after distribute transpiler --- python/paddle/fluid/distribute_transpiler.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/paddle/fluid/distribute_transpiler.py b/python/paddle/fluid/distribute_transpiler.py index b0522b49f4..aa15392d7e 100644 --- a/python/paddle/fluid/distribute_transpiler.py +++ b/python/paddle/fluid/distribute_transpiler.py @@ -1115,4 +1115,6 @@ class DistributeTranspiler: for op2 in find_ops: if ufind.is_connected(op1, op2): lr_ops.append(op1) + # we only need to append op for once + break return lr_ops From 4452ff76b79b3a9acdcd15ba6e751117889db3fb Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Fri, 13 Apr 2018 17:38:43 +0800 Subject: [PATCH 129/164] Fix CPU compile --- paddle/fluid/framework/details/op_handle_base.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/framework/details/op_handle_base.cc b/paddle/fluid/framework/details/op_handle_base.cc index 28f1e7b508..534d77860f 100644 --- a/paddle/fluid/framework/details/op_handle_base.cc +++ b/paddle/fluid/framework/details/op_handle_base.cc @@ -109,18 +109,18 @@ void OpHandleBase::RunAndRecordEvent(const std::function &callback) { void OpHandleBase::RunAndRecordEvent(platform::Place p, const std::function &callback) { +#ifdef PADDLE_WITH_CUDA if (platform::is_cpu_place(p) || events_.empty()) { callback(); } else { -#ifdef PADDLE_WITH_CUDA auto *ctx = dev_ctxes_.at(p); auto *cuda_ctx = static_cast(ctx); cuda_ctx->RecordEvent(events_.at(boost::get(p).device), callback); + } #else - PADDLE_THROW("Not implemented"); + callback(); #endif - } } } // namespace details From 384d6ee8ac3e0ca9372ef90a1626f7129c9e7f37 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Fri, 13 Apr 2018 17:44:58 +0800 Subject: [PATCH 130/164] follow comments --- .../framework/details/broadcast_op_handle.cc | 37 +++---------------- .../framework/details/gather_op_handle.cc | 9 ++--- paddle/fluid/framework/tensor_util.cc | 6 +-- 3 files changed, 12 insertions(+), 40 deletions(-) diff --git a/paddle/fluid/framework/details/broadcast_op_handle.cc b/paddle/fluid/framework/details/broadcast_op_handle.cc index 24115cae81..7d29012380 100644 --- a/paddle/fluid/framework/details/broadcast_op_handle.cc +++ b/paddle/fluid/framework/details/broadcast_op_handle.cc @@ -61,33 +61,24 @@ void BroadcastOpHandle::RunImpl() { // Wait input done, this Wait is asynchronous operation auto &in_place = in_var_handle[0]->place_; if (in_var_handle[0]->generated_op_) { - in_var_handle[0]->generated_op_->Wait(dev_ctxes_[in_place]); for (auto *out : out_var_handles) { auto &out_p = out->place_; - if (platform::is_same_place(in_place, out_p)) continue; in_var_handle[0]->generated_op_->Wait(dev_ctxes_[out_p]); } } // auto in_scope_idx = in_var_handle[0]->scope_idx_; - PADDLE_ENFORCE_LT(in_scope_idx, local_scopes_.size(), - "The input(%s) is not in the local_scopes.", - in_var_handle[0]->name_); - auto in_var = local_scopes_[in_scope_idx]->FindVar(in_var_handle[0]->name_); + auto in_var = + local_scopes_.at(in_scope_idx)->FindVar(in_var_handle[0]->name_); Tensor *in_tensor = GetTensorFromVar(in_var); for (auto *out : out_var_handles) { auto &out_p = out->place_; + auto out_var = local_scopes_.at(out->scope_idx_)->FindVar(out->name_); - auto out_scope_idx = out->scope_idx_; - PADDLE_ENFORCE_LT(out_scope_idx, local_scopes_.size(), - "%s is not in the local_scopes ", out->name_); - - auto *s = local_scopes_[out_scope_idx]; - auto out_var = s->FindVar(out->name_); PADDLE_ENFORCE_EQ(out_p.which(), in_place.which(), - "The place of input and output should be the same."); + "Places must be all on CPU or all on CUDA."); if (in_var->IsType()) { auto &in_sr = in_var->Get(); @@ -109,24 +100,8 @@ void BroadcastOpHandle::RunImpl() { } Tensor *out_tensor = GetTensorFromVar(out_var); - if (platform::is_cpu_place(in_place)) { - paddle::framework::TensorCopy(*in_tensor, out_p, *(dev_ctxes_[in_place]), - out_tensor); - } else if (platform::is_gpu_place(in_place)) { -#ifdef PADDLE_WITH_CUDA - auto src_gpu_place = boost::get(in_place); - auto dst_gpu_place = boost::get(out_p); - void *dst_ptr = out_tensor->mutable_data(out_p); - void *src_ptr = in_tensor->data(); - int64_t size = in_tensor->numel() * SizeOfType(in_tensor->type()); - memory::Copy( - dst_gpu_place, dst_ptr, src_gpu_place, src_ptr, size, - reinterpret_cast(dev_ctxes_[out_p]) - ->stream()); -#else - PADDLE_THROW("CUDAPlace is not supported in CPU device."); -#endif - } + paddle::framework::TensorCopy(*in_tensor, out_p, *(dev_ctxes_[in_place]), + out_tensor); } } diff --git a/paddle/fluid/framework/details/gather_op_handle.cc b/paddle/fluid/framework/details/gather_op_handle.cc index 3c3054c03d..8dd85be567 100644 --- a/paddle/fluid/framework/details/gather_op_handle.cc +++ b/paddle/fluid/framework/details/gather_op_handle.cc @@ -74,13 +74,10 @@ void GatherOpHandle::RunImpl() { auto in_handle = static_cast(in); auto in_p = in_handle->place_; in_places.push_back(in_p); - PADDLE_ENFORCE_LT(in_handle->scope_idx_, local_scopes_.size(), - "%s is not the the local_scopes ", in_handle->name_); PADDLE_ENFORCE_EQ(in_p.which(), pre_place.which(), - "The place of input should be the same."); - auto *s = local_scopes_[in_handle->scope_idx_]; - auto in_var = s->FindVar(in_handle->name_); - + "Places must be all on CPU or all on CUDA."); + auto in_var = + local_scopes_.at(in_handle->scope_idx_)->FindVar(in_handle->name_); auto &in_sr = in_var->Get(); PADDLE_ENFORCE_EQ(in_sr.value().type(), pre_in.value().type(), diff --git a/paddle/fluid/framework/tensor_util.cc b/paddle/fluid/framework/tensor_util.cc index 1d864af011..d1b01ae05b 100644 --- a/paddle/fluid/framework/tensor_util.cc +++ b/paddle/fluid/framework/tensor_util.cc @@ -11,8 +11,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/framework/tensor_util.h" +#include +#include +#include namespace paddle { namespace framework { @@ -65,8 +67,6 @@ void TensorCopy(const Tensor& src, const platform::Place& dst_place, auto dst_gpu_place = boost::get(dst_place); auto ctx_place = ctx.GetPlace(); PADDLE_ENFORCE(platform::is_gpu_place(ctx_place)); - auto ctx_gpu_place = boost::get(ctx_place); - PADDLE_ENFORCE_EQ(src_gpu_place, ctx_gpu_place); memory::Copy( dst_gpu_place, dst_ptr, src_gpu_place, src_ptr, size, reinterpret_cast(ctx).stream()); From f3a55f2192b4094e81b3a65b15e3ee00250dd339 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Fri, 13 Apr 2018 11:20:45 -0700 Subject: [PATCH 131/164] add no clean option --- .../client/cluster_launcher.py | 19 ++++++++++++++++++- .../aws_benchmarking/server/cluster_master.py | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/tools/aws_benchmarking/client/cluster_launcher.py b/tools/aws_benchmarking/client/cluster_launcher.py index 3a6cc57b3a..594378ff8f 100644 --- a/tools/aws_benchmarking/client/cluster_launcher.py +++ b/tools/aws_benchmarking/client/cluster_launcher.py @@ -26,6 +26,16 @@ import paramiko from scp import SCPClient import requests + +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') + + parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( '--key_name', type=str, default="", help="required, key pair name") @@ -117,6 +127,12 @@ parser.add_argument( default="putcn/paddle_aws_master:latest", help="master docker image id") +parser.add_argument( + '--no_clean_up', + type=str2bool, + default=False, + help="whether to clean up after training") + args = parser.parse_args() logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s') @@ -347,7 +363,8 @@ def create(): del args_to_pass.master_docker_image del args_to_pass.master_server_public_ip for arg, value in sorted(vars(args_to_pass).iteritems()): - kick_off_cmd += ' --%s %s' % (arg, value) + if value: + kick_off_cmd += ' --%s %s' % (arg, value) logging.info(kick_off_cmd) stdin, stdout, stderr = ssh_client.exec_command(command=kick_off_cmd) diff --git a/tools/aws_benchmarking/server/cluster_master.py b/tools/aws_benchmarking/server/cluster_master.py index 5e63b5a8b4..798228b35a 100644 --- a/tools/aws_benchmarking/server/cluster_master.py +++ b/tools/aws_benchmarking/server/cluster_master.py @@ -27,8 +27,17 @@ import paramiko from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer + # You must have aws_access_key_id, aws_secret_access_key, region set in # ~/.aws/credentials and ~/.aws/config +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') + parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( @@ -126,6 +135,12 @@ parser.add_argument( parser.add_argument( '--master_server_ip', type=str, default="", help="master server private ip") +parser.add_argument( + '--no_clean_up', + type=str2bool, + default=False, + help="whether to clean up after training") + args = parser.parse_args() ec2client = boto3.client('ec2') @@ -414,6 +429,9 @@ def create_trainers(kickoff_cmd, pserver_endpoints_str): def cleanup(task_name): + if args.no_clean_up: + logging.info("no clean up option set, going to leave the setup running") + return #shutdown all ec2 instances print("going to clean up " + task_name + " instances") instances_response = ec2client.describe_instances(Filters=[{ From b8577266c584e2a785d45a2756c3f4f6efc05a99 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Fri, 13 Apr 2018 15:31:41 -0700 Subject: [PATCH 132/164] change pserver to use regular docker and some other tweaks --- tools/aws_benchmarking/server/cluster_master.py | 5 ++++- tools/aws_benchmarking/server/pserver.sh.template | 2 +- tools/aws_benchmarking/server/trainer.sh.template | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/aws_benchmarking/server/cluster_master.py b/tools/aws_benchmarking/server/cluster_master.py index 798228b35a..21f85a5fc4 100644 --- a/tools/aws_benchmarking/server/cluster_master.py +++ b/tools/aws_benchmarking/server/cluster_master.py @@ -478,6 +478,9 @@ def kickoff_pserver(host, pserver_endpoints_str): TASK_NAME=args.task_name, COMMAND=args.pserver_command, TRAINER_COUNT=args.trainer_count, + TRAINER_INDEX=0, + # there is no way to use 0.0.0.0:port to start pserver + # has to docker --network="host" with host ip to make this work SERVER_ENDPOINT=host + ":" + str(args.pserver_port), MASTER_ENDPOINT=args.master_server_ip + ":" + str(args.master_server_port)) @@ -588,7 +591,7 @@ def start_server(args): logging.info("Received request to return status") with open(args.log_path + "master.log", "r") as logfile: self.wfile.write(logfile.read().strip()) - elif request_path == "/list_logs": + elif request_path == "/list_logs" or request_path == "/logs": self._set_headers() self.wfile.write("\n".join(log_files)) elif "/log/" in request_path: diff --git a/tools/aws_benchmarking/server/pserver.sh.template b/tools/aws_benchmarking/server/pserver.sh.template index 5e46a4246f..e648ecaac1 100644 --- a/tools/aws_benchmarking/server/pserver.sh.template +++ b/tools/aws_benchmarking/server/pserver.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run -i -p {PSERVER_PORT}:{PSERVER_PORT} -e "SERVER_ENDPOINT={SERVER_ENDPOINT}" -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINING_ROLE=PSERVER" -e "TRAINERS={TRAINER_COUNT}" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} \ No newline at end of file +docker run --network="host" -i -p {PSERVER_PORT}:{PSERVER_PORT} -e "SERVER_ENDPOINT={SERVER_ENDPOINT}" -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=PSERVER" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device CPU \ No newline at end of file diff --git a/tools/aws_benchmarking/server/trainer.sh.template b/tools/aws_benchmarking/server/trainer.sh.template index 56405a8e31..4ece636a08 100644 --- a/tools/aws_benchmarking/server/trainer.sh.template +++ b/tools/aws_benchmarking/server/trainer.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} \ No newline at end of file +nvidia-docker run -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device GPU \ No newline at end of file From 47609ab2b8c5e620c2d9cbe367136d542715b782 Mon Sep 17 00:00:00 2001 From: Yi Wang Date: Fri, 13 Apr 2018 16:11:24 -0700 Subject: [PATCH 133/164] Document transform.h and fix cpplint errors (#9913) --- ..._cast.h => cuda_transform_iterator_cast.h} | 33 ++++++++++++----- paddle/fluid/platform/transform.h | 35 ++++++++++++++----- 2 files changed, 50 insertions(+), 18 deletions(-) rename paddle/fluid/platform/details/{device_ptr_cast.h => cuda_transform_iterator_cast.h} (50%) diff --git a/paddle/fluid/platform/details/device_ptr_cast.h b/paddle/fluid/platform/details/cuda_transform_iterator_cast.h similarity index 50% rename from paddle/fluid/platform/details/device_ptr_cast.h rename to paddle/fluid/platform/details/cuda_transform_iterator_cast.h index 1c502a19c0..06afc44c25 100644 --- a/paddle/fluid/platform/details/device_ptr_cast.h +++ b/paddle/fluid/platform/details/cuda_transform_iterator_cast.h @@ -18,16 +18,22 @@ limitations under the License. */ #error device_ptr_cast must be include by .cu file #endif -#include +#include // For std::remove_pointer and std::is_pointer. + +#include "thrust/device_ptr.h" namespace paddle { namespace platform { namespace details { + +// PointerToThrustDevicePtr has two speicalizations, one casts a (CUDA +// device) pointer into thrust::device_ptr, the other keeps rest types +// un-casted. template -struct DevicePtrCast; +struct PointerToThrustDevicePtr; template -struct DevicePtrCast { +struct PointerToThrustDevicePtr { using ELEM = typename std::remove_pointer::type; using RTYPE = thrust::device_ptr; @@ -37,17 +43,26 @@ struct DevicePtrCast { }; template -struct DevicePtrCast { +struct PointerToThrustDevicePtr { using RTYPE = T; inline RTYPE operator()(RTYPE it) const { return it; } }; -// Cast T to thrust::device_ptr if T is a pointer. -// Otherwise, e.g., T is a iterator, return T itself. +// CastToCUDATransformIterator casts a pointer to thrust::device_ptr +// so it could be used as the iterator of thrust::transform. It +// doesn't cast other types. +// +// We need CastToCUDATransformIterator because it is often that we +// want to use device memory pointers as transform iterators, e.g., to +// transform a block of float32 to float16. In this case, we want +// CastToCUDATransformIterator to cast float16/32 pointers to +// thrust::device_ptr, otherwise they cannot work as the iterator +// required by thrust::transform. At the same time, we don't want to +// cast thrust::device_ptr to thrust::device_ptr repeatedly. template -auto DevPtrCast(T t) -> - typename DevicePtrCast::value>::RTYPE { - DevicePtrCast::value> cast; +auto CastToCUDATransformIterator(T t) -> + typename PointerToThrustDevicePtr::value>::RTYPE { + PointerToThrustDevicePtr::value> cast; return cast(t); } diff --git a/paddle/fluid/platform/transform.h b/paddle/fluid/platform/transform.h index 917c48b47f..7877d3e41c 100644 --- a/paddle/fluid/platform/transform.h +++ b/paddle/fluid/platform/transform.h @@ -14,29 +14,44 @@ limitations under the License. */ #pragma once +#include +#include + #include "paddle/fluid/platform/device_context.h" #include "paddle/fluid/platform/enforce.h" #include "paddle/fluid/platform/hostdevice.h" #include "paddle/fluid/platform/place.h" -#include -#include #ifdef __NVCC__ #include #include -#include "paddle/fluid/platform/details/device_ptr_cast.h" +#include "paddle/fluid/platform/details/cuda_transform_iterator_cast.h" #endif namespace paddle { namespace platform { -// Transform on host or device. It provides the same API in std library. +// Transform applys a unary or a binary functor on each element in a +// range defined by a pair of iterators. +// +// - The specialization for CPU calls std::transform. +// - The specialization for CUDA calls thrust::tranform. +// +// NOTE: We need to define InputIter and OutputIter defined as +// different types, because the InputIter points op's inputs and +// OutputIter pints to op's outputs. +// +// NOTE: We don't assume that InputIter to be const InputType* and +// OutputIter to be OutputType*, because we might use a iterator +// class, paddle::fluid::operators::RowwiseTRansformIterator. template struct Transform { + // The unary version. template void operator()(const DeviceContext& context, InputIter first, InputIter last, OutputIter result, UnaryOperation op); + // The binary version. template void operator()(const DeviceContext& context, InputIter1 first1, @@ -70,8 +85,9 @@ struct Transform { auto place = context.GetPlace(); PADDLE_ENFORCE(is_gpu_place(place), "It must use GPU place."); thrust::transform(thrust::cuda::par.on(context.stream()), - details::DevPtrCast(first), details::DevPtrCast(last), - details::DevPtrCast(result), op); + details::CastToCUDATransformIterator(first), + details::CastToCUDATransformIterator(last), + details::CastToCUDATransformIterator(result), op); } template { auto place = context.GetPlace(); PADDLE_ENFORCE(is_gpu_place(place), "It must use GPU place."); thrust::transform(thrust::cuda::par.on(context.stream()), - details::DevPtrCast(first1), details::DevPtrCast(last1), - details::DevPtrCast(first2), details::DevPtrCast(result), - op); + details::CastToCUDATransformIterator(first1), + details::CastToCUDATransformIterator(last1), + details::CastToCUDATransformIterator(first2), + details::CastToCUDATransformIterator(result), op); } }; #endif From 92913027fc17a1240a97aa565ec7e953d4181a78 Mon Sep 17 00:00:00 2001 From: Kexin Zhao Date: Fri, 13 Apr 2018 16:15:02 -0700 Subject: [PATCH 134/164] fix unused var error (#9908) --- paddle/fluid/operators/math/math_function.cu | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/operators/math/math_function.cu b/paddle/fluid/operators/math/math_function.cu index c28047e6e9..9badf26c9b 100644 --- a/paddle/fluid/operators/math/math_function.cu +++ b/paddle/fluid/operators/math/math_function.cu @@ -268,6 +268,7 @@ void batched_gemm( const CBLAS_TRANSPOSE transB, const int M, const int N, const int K, const float16 alpha, const float16* A, const float16* B, const float16 beta, float16* C, const int batchCount, const int strideA, const int strideB) { +#if CUDA_VERSION >= 8000 // Note that cublas follows fortran order, so the order is different from // the cblas convention. int lda = (transA == CblasNoTrans) ? K : M; @@ -289,7 +290,6 @@ void batched_gemm( PADDLE_ENFORCE_GE(context.GetComputeCapability(), 53, "cublas Hgemm requires GPU compute capability >= 53"); -#if CUDA_VERSION >= 8000 PADDLE_ENFORCE(platform::dynload::cublasHgemmStridedBatched( context.cublas_handle(), cuTransB, cuTransA, N, M, K, &h_alpha, h_B, ldb, strideB, h_A, lda, strideA, &h_beta, h_C, ldc, strideC, batchCount)); @@ -304,6 +304,7 @@ void batched_gemm( const CBLAS_TRANSPOSE transB, const int M, const int N, const int K, const float alpha, const float* A, const float* B, const float beta, float* C, const int batchCount, const int strideA, const int strideB) { +#if CUDA_VERSION >= 8000 // Note that cublas follows fortran order, so the order is different from // the cblas convention. int lda = (transA == CblasNoTrans) ? K : M; @@ -315,7 +316,6 @@ void batched_gemm( (transB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; const int strideC = M * N; -#if CUDA_VERSION >= 8000 PADDLE_ENFORCE(platform::dynload::cublasSgemmStridedBatched( context.cublas_handle(), cuTransB, cuTransA, N, M, K, &alpha, B, ldb, strideB, A, lda, strideA, &beta, C, ldc, strideC, batchCount)); @@ -330,6 +330,7 @@ void batched_gemm( const CBLAS_TRANSPOSE transB, const int M, const int N, const int K, const double alpha, const double* A, const double* B, const double beta, double* C, const int batchCount, const int strideA, const int strideB) { +#if CUDA_VERSION >= 8000 // Note that cublas follows fortran order, so the order is different from // the cblas convention. int lda = (transA == CblasNoTrans) ? K : M; @@ -341,7 +342,6 @@ void batched_gemm( (transB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; const int strideC = M * N; -#if CUDA_VERSION >= 8000 PADDLE_ENFORCE(platform::dynload::cublasDgemmStridedBatched( context.cublas_handle(), cuTransB, cuTransA, N, M, K, &alpha, B, ldb, strideB, A, lda, strideA, &beta, C, ldc, strideC, batchCount)); From 946dc16ef615708962b3192c29341732b7f72f73 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Fri, 13 Apr 2018 16:18:35 -0700 Subject: [PATCH 135/164] update docker command template --- tools/aws_benchmarking/server/pserver.sh.template | 2 +- tools/aws_benchmarking/server/trainer.sh.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/aws_benchmarking/server/pserver.sh.template b/tools/aws_benchmarking/server/pserver.sh.template index e648ecaac1..18f9b800da 100644 --- a/tools/aws_benchmarking/server/pserver.sh.template +++ b/tools/aws_benchmarking/server/pserver.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -docker run --network="host" -i -p {PSERVER_PORT}:{PSERVER_PORT} -e "SERVER_ENDPOINT={SERVER_ENDPOINT}" -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=PSERVER" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device CPU \ No newline at end of file +docker run --network="host" -i -e "SERVER_ENDPOINT={SERVER_ENDPOINT}" -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=PSERVER" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device GPU \ No newline at end of file diff --git a/tools/aws_benchmarking/server/trainer.sh.template b/tools/aws_benchmarking/server/trainer.sh.template index 4ece636a08..301ad26213 100644 --- a/tools/aws_benchmarking/server/trainer.sh.template +++ b/tools/aws_benchmarking/server/trainer.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device GPU \ No newline at end of file +nvidia-docker run --network="host" -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device GPU \ No newline at end of file From f22da580fa7bba561ccbfd3ea55fcfbb264bf12a Mon Sep 17 00:00:00 2001 From: Tao Luo Date: Sat, 14 Apr 2018 07:23:14 +0800 Subject: [PATCH 136/164] fix compiler error in paddle:latest-dev image (#9907) --- python/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 7cbd7f22bf..c7c0812fe2 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,5 +1,5 @@ file(GLOB UTILS_PY_FILES . ./paddle/utils/*.py) -file(GLOB_RECURSE FLUID_PY_FILES ./paddle/fluid/ *.py) +file(GLOB_RECURSE FLUID_PY_FILES ./paddle/fluid/*.py) set(PY_FILES paddle/__init__.py ${UTILS_PY_FILES} ${FLUID_PY_FILES}) @@ -7,7 +7,7 @@ set(PY_FILES paddle/__init__.py if(NOT WITH_FLUID_ONLY) file(GLOB TRAINER_PY_FILES . ./paddle/trainer/*.py) file(GLOB HELPERS_PY_FILES . ./paddle/trainer_config_helpers/*.py) - file(GLOB_RECURSE V2_PY_FILES ./paddle/v2/ *.py) + file(GLOB_RECURSE V2_PY_FILES ./paddle/v2/*.py) set(PY_FILES ${PY_FILES} ${TRAINER_PY_FILES} ${HELPERS_PY_FILES} @@ -55,7 +55,7 @@ add_custom_target(copy_paddle_pybind ALL DEPENDS ${PADDLE_BINARY_DIR}/python/pad add_custom_command(OUTPUT ${PADDLE_PYTHON_BUILD_DIR}/.timestamp COMMAND touch stub.cc - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PADDLE_SOURCE_DIR}/python/paddle ${PADDLE_BINARY_DIR}/python/paddle + COMMAND cp -r ${PADDLE_SOURCE_DIR}/python/paddle ${PADDLE_BINARY_DIR}/python COMMAND cp -r ${PADDLE_SOURCE_DIR}/paddle/py_paddle ${PADDLE_BINARY_DIR}/python/ COMMAND env ${py_env} ${PYTHON_EXECUTABLE} setup.py bdist_wheel COMMAND ${CMAKE_COMMAND} -E touch ${PADDLE_PYTHON_BUILD_DIR}/.timestamp From 7b86da71954ecac5f9cfd28804177f78c5022eab Mon Sep 17 00:00:00 2001 From: Abhinav Arora Date: Fri, 13 Apr 2018 16:24:09 -0700 Subject: [PATCH 137/164] Fix CPPLint errors in operators (#9826) * Fix CPPLint errors in operators * Fix cast in softmax * Fix softmax_mkldnn * Fix send_recv_op_test * Send_recv * Fix softmax mkldnn --- paddle/fluid/operators/scale_op.cc | 1 - paddle/fluid/operators/scatter_op.cu | 5 +- paddle/fluid/operators/scatter_op.h | 4 +- paddle/fluid/operators/scatter_test.cc | 46 ++++++++++--------- paddle/fluid/operators/send_barrier_op.cc | 2 +- paddle/fluid/operators/send_op.cc | 2 +- paddle/fluid/operators/send_recv_util.h | 3 ++ paddle/fluid/operators/sequence_concat_op.h | 1 + paddle/fluid/operators/sequence_conv_op.h | 1 + paddle/fluid/operators/sequence_erase_op.cc | 1 + paddle/fluid/operators/sequence_erase_op.h | 1 + paddle/fluid/operators/sequence_pool_op.cc | 1 + paddle/fluid/operators/sequence_pool_op.h | 1 + paddle/fluid/operators/sequence_softmax_op.cc | 1 + paddle/fluid/operators/softmax_mkldnn_op.cc | 9 ++-- paddle/fluid/operators/split_op.h | 2 +- 16 files changed, 48 insertions(+), 33 deletions(-) diff --git a/paddle/fluid/operators/scale_op.cc b/paddle/fluid/operators/scale_op.cc index 7ca7639fdb..1e938638c9 100644 --- a/paddle/fluid/operators/scale_op.cc +++ b/paddle/fluid/operators/scale_op.cc @@ -13,7 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/scale_op.h" - #include namespace paddle { diff --git a/paddle/fluid/operators/scatter_op.cu b/paddle/fluid/operators/scatter_op.cu index ef7d700659..a70b909172 100644 --- a/paddle/fluid/operators/scatter_op.cu +++ b/paddle/fluid/operators/scatter_op.cu @@ -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 "gather.cu.h" +#include "paddle/fluid/operators/gather.cu.h" #include "paddle/fluid/operators/gather_op.h" -#include "scatter.cu.h" +#include "paddle/fluid/operators/scatter.cu.h" +#include "paddle/fluid/operators/scatter_op.h" namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/scatter_op.h b/paddle/fluid/operators/scatter_op.h index 2151d8a924..d29947b55e 100644 --- a/paddle/fluid/operators/scatter_op.h +++ b/paddle/fluid/operators/scatter_op.h @@ -13,10 +13,10 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once -#include "gather.h" #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" -#include "scatter.h" +#include "paddle/fluid/operators/gather.h" +#include "paddle/fluid/operators/scatter.h" namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/scatter_test.cc b/paddle/fluid/operators/scatter_test.cc index b67af3c371..750245153a 100644 --- a/paddle/fluid/operators/scatter_test.cc +++ b/paddle/fluid/operators/scatter_test.cc @@ -13,44 +13,48 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/scatter.h" -#include "paddle/fluid/framework/ddim.h" -#include "paddle/fluid/framework/tensor.h" -#include "paddle/fluid/platform/place.h" - #include #include #include +#include "paddle/fluid/framework/ddim.h" +#include "paddle/fluid/framework/tensor.h" +#include "paddle/fluid/platform/place.h" TEST(scatter, ScatterUpdate) { - using namespace paddle::framework; - using namespace paddle::platform; - using namespace paddle::operators; + // using namespace paddle::framework; + // using namespace paddle::platform; + // using namespace paddle::operators; - Tensor* src = new Tensor(); - Tensor* index = new Tensor(); - Tensor* output = new Tensor(); + paddle::framework::Tensor* src = new paddle::framework::Tensor(); + paddle::framework::Tensor* index = new paddle::framework::Tensor(); + paddle::framework::Tensor* output = new paddle::framework::Tensor(); float* p_src = nullptr; int* p_index = nullptr; - p_src = src->mutable_data(make_ddim({1, 4}), CPUPlace()); - p_index = index->mutable_data(make_ddim({1}), CPUPlace()); + p_src = src->mutable_data(paddle::framework::make_ddim({1, 4}), + paddle::platform::CPUPlace()); + p_index = index->mutable_data(paddle::framework::make_ddim({1}), + paddle::platform::CPUPlace()); - for (size_t i = 0; i < 4; ++i) p_src[i] = float(i); + for (size_t i = 0; i < 4; ++i) p_src[i] = static_cast(i); p_index[0] = 1; - float* p_output = output->mutable_data(make_ddim({4, 4}), CPUPlace()); + float* p_output = output->mutable_data( + paddle::framework::make_ddim({4, 4}), paddle::platform::CPUPlace()); auto* cpu_place = new paddle::platform::CPUPlace(); paddle::platform::CPUDeviceContext ctx(*cpu_place); - ScatterAssign(ctx, *src, *index, output); + paddle::operators::ScatterAssign(ctx, *src, *index, output); - for (size_t i = 0; i < 4; ++i) EXPECT_EQ(p_output[i], float(0)); - for (size_t i = 0; i < 4; ++i) EXPECT_EQ(output->data()[i], float(0)); - for (size_t i = 4; i < 8; ++i) EXPECT_EQ(p_output[i], float(i - 4)); + for (size_t i = 0; i < 4; ++i) EXPECT_EQ(p_output[i], 0.0f); + for (size_t i = 0; i < 4; ++i) EXPECT_EQ(output->data()[i], 0.0f); + for (size_t i = 4; i < 8; ++i) { + EXPECT_EQ(p_output[i], static_cast(i - 4)); + } for (size_t i = 4; i < 8; ++i) - EXPECT_EQ(output->data()[i], float(i - 4)); - for (size_t i = 8; i < 16; ++i) EXPECT_EQ(p_output[i], float(0)); - for (size_t i = 8; i < 16; ++i) EXPECT_EQ(output->data()[i], float(0)); + EXPECT_EQ(output->data()[i], static_cast(i - 4)); + for (size_t i = 8; i < 16; ++i) EXPECT_EQ(p_output[i], 0.0f); + for (size_t i = 8; i < 16; ++i) EXPECT_EQ(output->data()[i], 0.0f); delete src; delete index; diff --git a/paddle/fluid/operators/send_barrier_op.cc b/paddle/fluid/operators/send_barrier_op.cc index 8d02a6f291..12b844daaa 100644 --- a/paddle/fluid/operators/send_barrier_op.cc +++ b/paddle/fluid/operators/send_barrier_op.cc @@ -12,6 +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. */ +#include // NOLINT #include #include "paddle/fluid/framework/data_type.h" @@ -19,7 +20,6 @@ limitations under the License. */ #include "paddle/fluid/framework/lod_tensor.h" #include "paddle/fluid/framework/op_registry.h" -#include #include "paddle/fluid/operators/detail/grpc_client.h" namespace paddle { diff --git a/paddle/fluid/operators/send_op.cc b/paddle/fluid/operators/send_op.cc index d47f66de21..82ff087d0a 100644 --- a/paddle/fluid/operators/send_op.cc +++ b/paddle/fluid/operators/send_op.cc @@ -12,7 +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. */ -#include +#include // NOLINT #include #include "paddle/fluid/framework/data_type.h" diff --git a/paddle/fluid/operators/send_recv_util.h b/paddle/fluid/operators/send_recv_util.h index 196f56f634..113513eb6b 100644 --- a/paddle/fluid/operators/send_recv_util.h +++ b/paddle/fluid/operators/send_recv_util.h @@ -12,6 +12,9 @@ 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 + namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/sequence_concat_op.h b/paddle/fluid/operators/sequence_concat_op.h index 9f04c41991..71c9f45287 100644 --- a/paddle/fluid/operators/sequence_concat_op.h +++ b/paddle/fluid/operators/sequence_concat_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/strided_memcpy.h" diff --git a/paddle/fluid/operators/sequence_conv_op.h b/paddle/fluid/operators/sequence_conv_op.h index ee48339c52..b59504bb98 100644 --- a/paddle/fluid/operators/sequence_conv_op.h +++ b/paddle/fluid/operators/sequence_conv_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/context_project.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/sequence_erase_op.cc b/paddle/fluid/operators/sequence_erase_op.cc index 32b9d7f7c1..73c0e89512 100644 --- a/paddle/fluid/operators/sequence_erase_op.cc +++ b/paddle/fluid/operators/sequence_erase_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/sequence_erase_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/sequence_erase_op.h b/paddle/fluid/operators/sequence_erase_op.h index b490c34f54..265390528a 100644 --- a/paddle/fluid/operators/sequence_erase_op.h +++ b/paddle/fluid/operators/sequence_erase_op.h @@ -14,6 +14,7 @@ limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/op_registry.h" namespace paddle { diff --git a/paddle/fluid/operators/sequence_pool_op.cc b/paddle/fluid/operators/sequence_pool_op.cc index 3d4d54a3a3..933c8c2623 100644 --- a/paddle/fluid/operators/sequence_pool_op.cc +++ b/paddle/fluid/operators/sequence_pool_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/sequence_pool_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/sequence_pool_op.h b/paddle/fluid/operators/sequence_pool_op.h index c58d677c92..2aa20792f2 100644 --- a/paddle/fluid/operators/sequence_pool_op.h +++ b/paddle/fluid/operators/sequence_pool_op.h @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once +#include #include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/math/math_function.h" diff --git a/paddle/fluid/operators/sequence_softmax_op.cc b/paddle/fluid/operators/sequence_softmax_op.cc index e8b4df0428..d2c1317bef 100644 --- a/paddle/fluid/operators/sequence_softmax_op.cc +++ b/paddle/fluid/operators/sequence_softmax_op.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include "paddle/fluid/operators/sequence_softmax_op.h" +#include namespace paddle { namespace operators { diff --git a/paddle/fluid/operators/softmax_mkldnn_op.cc b/paddle/fluid/operators/softmax_mkldnn_op.cc index cf0244e866..dc2f176344 100644 --- a/paddle/fluid/operators/softmax_mkldnn_op.cc +++ b/paddle/fluid/operators/softmax_mkldnn_op.cc @@ -12,12 +12,11 @@ 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 "mkldnn.hpp" #include "paddle/fluid/operators/softmax_op.h" #include "paddle/fluid/platform/mkldnn_helper.h" -#include - namespace paddle { namespace operators { @@ -63,9 +62,11 @@ class SoftmaxMKLDNNKernel : public paddle::framework::OpKernel { softmax_md, 1 /*dim: C*/); // create memory primitives auto softmax_src_memory = - memory({softmax_md, mkldnn_engine}, (void*)input_data); + memory({softmax_md, mkldnn_engine}, + static_cast(const_cast(input_data))); auto softmax_dst_memory = - memory({softmax_md, mkldnn_engine}, (void*)output_data); + memory({softmax_md, mkldnn_engine}, + static_cast(const_cast(output_data))); auto softmax_prim_desc = softmax_forward::primitive_desc(softmax_desc, mkldnn_engine); auto softmax = softmax_forward(softmax_prim_desc, softmax_src_memory, diff --git a/paddle/fluid/operators/split_op.h b/paddle/fluid/operators/split_op.h index ae8562c0c5..e2c41f44ab 100644 --- a/paddle/fluid/operators/split_op.h +++ b/paddle/fluid/operators/split_op.h @@ -14,7 +14,7 @@ limitations under the License. */ #pragma once -#include +#include // NOLINT #include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/strided_memcpy.h" From d4024a6ebd8d25a287bf4671e06ea8fa781b85fd Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Fri, 13 Apr 2018 20:14:42 -0700 Subject: [PATCH 138/164] Polish memory_optimizer code with mode comments and less identions --- .../fluid/memory_optimization_transpiler.py | 135 ++++++++++++------ 1 file changed, 88 insertions(+), 47 deletions(-) diff --git a/python/paddle/fluid/memory_optimization_transpiler.py b/python/paddle/fluid/memory_optimization_transpiler.py index 41d1eca82e..20ed191042 100644 --- a/python/paddle/fluid/memory_optimization_transpiler.py +++ b/python/paddle/fluid/memory_optimization_transpiler.py @@ -29,17 +29,20 @@ dtype_to_size = { core.VarDesc.VarType.BOOL: 1 } -sub_block_ops = [ +SUB_BLOCK_OPS = [ "while", "while_grad", "parallel_do", "parallel_do_grad", "conditional_block", "conditional_block_grad" ] +SUB_BLOCK_PAIR = [("while", "while_grad"), ("parallel_do", "parallel_do_grad"), + ("conditional_block", "conditional_block_grad")] + PRINT_LOG = False class ControlFlowGraph(object): - def __init__(self, Program, ops, forward_num, skip_opt): - self._program = Program + def __init__(self, program, ops, forward_num, skip_opt): + self._program = program self._ops = ops self._forward_num = forward_num self._successors = defaultdict(set) @@ -51,6 +54,7 @@ class ControlFlowGraph(object): self._skip_opt = skip_opt def _add_connections(self, connections): + """Populates _successors and _presuccessors for two neighbor nodes.""" for node1, node2 in connections: self._add(node1, node2) @@ -58,7 +62,11 @@ class ControlFlowGraph(object): self._successors[node1].add(node2) self._presuccessors[node2].add(node1) + # TODO(panyx0718): We need to have a unified way of building intermediate + # representation. def _build_graph(self): + """Build a graph based on op sequence. + """ self.op_size = len(self._ops) op_node_connections = [(i, i + 1) for i in range(self.op_size - 1)] self._add_connections(op_node_connections) @@ -82,15 +90,14 @@ class ControlFlowGraph(object): self._live_out[i].add(new_name) def _reach_fixed_point(self, live_in, live_out): + """Check if the liveness set has stablized.""" if len(live_in) != len(self._live_in): return False if len(live_out) != len(self._live_out): return False for i in range(self.op_size): - if live_in[i] != self._live_in[i]: - return False - for i in range(self.op_size): - if live_out[i] != self._live_out[i]: + if (live_in[i] != self._live_in[i] or + live_out[i] != self._live_out[i]): return False return True @@ -98,6 +105,8 @@ class ControlFlowGraph(object): self._build_graph() live_in = defaultdict(set) live_out = defaultdict(set) + # Repeatedly apply liveness updates until the algorithm stablize + # on a complete set live input vars and live output vars. while True: for i in range(self.op_size, 0, -1): live_in[i] = set(self._live_in[i]) @@ -141,6 +150,8 @@ class ControlFlowGraph(object): return False return True + # TODO(panyx0718): This needs to be less hacky. It seems memory optimization + # doesn't consider vars copied between cpu and gpu. def _update_skip_opt_set(self): for i in range(self.op_size): op = self._ops[i] @@ -154,7 +165,7 @@ class ControlFlowGraph(object): bwd_id = 0 for i in range(self.op_size): op = self._ops[i] - if op.type() in sub_block_ops: + if op.type() in SUB_BLOCK_OPS: continue block_desc = op.block() is_forward = i < self._forward_num @@ -177,13 +188,15 @@ class ControlFlowGraph(object): def compare_shape(x_shape, cache_shape, opt_level): if opt_level == 0: return x_shape == cache_shape - if opt_level == 1: + elif opt_level == 1: if (x_shape[0] == -1) ^ (cache_shape[0] == -1): return False x_size = abs(reduce(lambda x, y: x * y, x_shape)) cache_size = abs(reduce(lambda x, y: x * y, cache_shape)) if x_size <= cache_size: return True + else: + raise ValueError("only support opt_level 0 or 1.") return False self._dataflow_analyze() @@ -191,10 +204,9 @@ class ControlFlowGraph(object): self.pool = [] for i in range(self.op_size): op = self._ops[i] - if op.type() in sub_block_ops: + if op.type() in SUB_BLOCK_OPS: continue block_desc = op.block() - self.current_block_desc = block_desc is_forward = i < self._forward_num if self.pool: defs_can_optimize = filter( @@ -211,37 +223,40 @@ class ControlFlowGraph(object): for index, cache_pair in enumerate(self.pool): cache_var = cache_pair[0] cache_shape = cache_pair[1] - if compare_shape(x_shape, cache_shape, level): - if self._has_var(block_desc, cache_var, is_forward): - x_dtype = self._find_var(block_desc, x, - is_forward).dtype() - cache_dtype = self._find_var( - block_desc, cache_var, is_forward).dtype() - # TODO(qijun): actually, we should compare dtype_to_size[x_dtype] - # and dtype_to_size[cache_dtype] - if x_dtype == cache_dtype: - if PRINT_LOG: - print( - ("Hit Cache !!!! cache pool index " - "is %d, var name is %s, " - "cached var name is %s, " - "var shape is %s ") % - (index, x, cache_var, - str(cache_shape))) - self.pool.pop(index) - if x == cache_var: - break - _rename_arg_( - self._ops, x, cache_var, begin_idx=i) - self._program.block(block_desc.id).var( - str(x)).desc = self._find_var( - block_desc, cache_var, is_forward) - self._update_graph( - x, cache_var, begin_idx=i) - break - - in_diff, out_diff = self._get_diff(self._live_in[i], - self._live_out[i]) + if not compare_shape(x_shape, cache_shape, level): + continue + + if not self._has_var(block_desc, cache_var, is_forward): + continue + + x_dtype = self._find_var(block_desc, x, + is_forward).dtype() + cache_dtype = self._find_var(block_desc, cache_var, + is_forward).dtype() + # TODO(qijun): actually, we should compare + # dtype_to_size[x_dtype] and dtype_to_size[cache_dtype] + if x_dtype != cache_dtype: + continue + + if PRINT_LOG: + print(("Hit Cache !!!! cache pool index " + "is %d, var name is %s, " + "cached var name is %s, " + "var shape is %s ") % (index, x, cache_var, + str(cache_shape))) + self.pool.pop(index) + if x == cache_var: + break + # Rename the var to the cache var already with + # memory allocated in order to reuse the memory. + _rename_arg_(self._ops, x, cache_var, begin_idx=i) + self._program.block(block_desc.id).var(str( + x)).desc = self._find_var(block_desc, cache_var, + is_forward) + self._update_graph(x, cache_var, begin_idx=i) + break + + in_diff, _ = self._get_diff(self._live_in[i], self._live_out[i]) can_optimize = filter( lambda x: self._check_var_validity(block_desc, x, is_forward), in_diff) @@ -252,6 +267,19 @@ class ControlFlowGraph(object): def _process_sub_block_pair(pdesc, sub_block_pair): + """Creates a list of tuple each of which tracks info of a subblock. + + Note: this function doesn't handle nested subblocks yet. + TODO(panyx0718): assert if case nested subblocks happen. + + :param pdesc: ProgramDesc. + :param sub_block_pair: A list op pairs. Each op pair is the forward + op and backward op. The ops in the list are special that they contain + a subblock of ops. + :return: A list of tuples, each tuple is (all ops in a subblock pair + including forward and backward, number of forward ops, + all output args names of the ops in the subblock pairs). + """ ops_list = [] block_desc = pdesc.block(0) op_size = block_desc.op_size() @@ -308,6 +336,11 @@ def _process_sub_block_pair(pdesc, sub_block_pair): def _get_cfgs(input_program): + """Process each block and create ControlFlowGraph for each of them. + + :param input_program: Program object. + :return: A list of ControlFlowGraph, each corresponds to a block. + """ ops_list = [] pdesc = input_program.get_desc() block_desc = pdesc.block(0) @@ -316,11 +349,8 @@ def _get_cfgs(input_program): ops_list.append( ([block_desc.op(i) for i in range(op_size)], op_size, set())) - sub_block_pair = [("while", "while_grad"), ("parallel_do", - "parallel_do_grad"), - ("conditional_block", "conditional_block_grad")] - - ops_list.extend(_process_sub_block_pair(pdesc, sub_block_pair)) + # Only process one level of nested subblock. + ops_list.extend(_process_sub_block_pair(pdesc, SUB_BLOCK_PAIR)) cfgs = [ ControlFlowGraph(input_program, ops, forward_num, skip_opt) @@ -330,6 +360,17 @@ def _get_cfgs(input_program): def memory_optimize(input_program, print_log=False, level=0): + """Optimize memory by reusing var memory. + + Note: it doesn't not support subblock nested in subblock. + + :param input_program: Input Program + :param print_log: whether to print debug log. + :param level: If level=0, reuse if the shape is completely equal, o + :return: + """ + if level != 0 and level != 1: + raise ValueError("only support opt_level 0 or 1.") global PRINT_LOG PRINT_LOG = print_log cfgs = _get_cfgs(input_program) From b48cf1712bebe617764539064aadf31f7ecc2b1d Mon Sep 17 00:00:00 2001 From: Yi Wang Date: Fri, 13 Apr 2018 22:33:25 -0700 Subject: [PATCH 139/164] Fix cpplint errors in transform_test.cu (#9915) * Fix cpplint errors with transformer_test.cu * Update --- paddle/fluid/platform/transform_test.cu | 31 +++++++++++++++---------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/paddle/fluid/platform/transform_test.cu b/paddle/fluid/platform/transform_test.cu index 7b5cfd8f43..f65d1f6010 100644 --- a/paddle/fluid/platform/transform_test.cu +++ b/paddle/fluid/platform/transform_test.cu @@ -18,11 +18,12 @@ limitations under the License. */ #include "paddle/fluid/platform/hostdevice.h" #include "paddle/fluid/platform/transform.h" +namespace { + template class Scale { public: explicit Scale(const T& scale) : scale_(scale) {} - HOSTDEVICE T operator()(const T& a) const { return a * scale_; } private: @@ -35,11 +36,23 @@ class Multiply { HOSTDEVICE T operator()(const T& a, const T& b) const { return a * b; } }; +} // namespace + +using paddle::memory::Alloc; +using paddle::memory::Free; +using paddle::memory::Copy; + +using paddle::platform::CPUPlace; +using paddle::platform::CUDAPlace; +using paddle::platform::CPUDeviceContext; +using paddle::platform::CUDADeviceContext; + +using paddle::platform::Transform; + TEST(Transform, CPUUnary) { - using namespace paddle::platform; CPUDeviceContext ctx; float buf[4] = {0.1, 0.2, 0.3, 0.4}; - Transform trans; + Transform trans; trans(ctx, buf, buf + 4, buf, Scale(10)); for (int i = 0; i < 4; ++i) { ASSERT_NEAR(buf[i], static_cast(i + 1), 1e-5); @@ -47,14 +60,12 @@ TEST(Transform, CPUUnary) { } TEST(Transform, GPUUnary) { - using namespace paddle::platform; - using namespace paddle::memory; CUDAPlace gpu0(0); CUDADeviceContext ctx(gpu0); float cpu_buf[4] = {0.1, 0.2, 0.3, 0.4}; float* gpu_buf = static_cast(Alloc(gpu0, sizeof(float) * 4)); Copy(gpu0, gpu_buf, CPUPlace(), cpu_buf, sizeof(cpu_buf), ctx.stream()); - Transform trans; + Transform trans; trans(ctx, gpu_buf, gpu_buf + 4, gpu_buf, Scale(10)); ctx.Wait(); Copy(CPUPlace(), cpu_buf, gpu0, gpu_buf, sizeof(cpu_buf), ctx.stream()); @@ -65,10 +76,8 @@ TEST(Transform, GPUUnary) { } TEST(Transform, CPUBinary) { - using namespace paddle::platform; - using namespace paddle::memory; int buf[4] = {1, 2, 3, 4}; - Transform trans; + Transform trans; CPUDeviceContext ctx; trans(ctx, buf, buf + 4, buf, buf, Multiply()); for (int i = 0; i < 4; ++i) { @@ -77,14 +86,12 @@ TEST(Transform, CPUBinary) { } TEST(Transform, GPUBinary) { - using namespace paddle::platform; - using namespace paddle::memory; int buf[4] = {1, 2, 3, 4}; CUDAPlace gpu0(0); CUDADeviceContext ctx(gpu0); int* gpu_buf = static_cast(Alloc(gpu0, sizeof(buf))); Copy(gpu0, gpu_buf, CPUPlace(), buf, sizeof(buf), ctx.stream()); - Transform trans; + Transform trans; trans(ctx, gpu_buf, gpu_buf + 4, gpu_buf, gpu_buf, Multiply()); ctx.Wait(); Copy(CPUPlace(), buf, gpu0, gpu_buf, sizeof(buf), ctx.stream()); From 630943c7a79ce2ee3c3ce291a3bb8c5a32b8931d Mon Sep 17 00:00:00 2001 From: Yi Wang Date: Fri, 13 Apr 2018 23:42:02 -0700 Subject: [PATCH 140/164] Update documentation (#9918) --- paddle/fluid/platform/cuda_profiler.h | 9 ++++---- paddle/fluid/platform/variant.h | 32 ++++++++++++--------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/paddle/fluid/platform/cuda_profiler.h b/paddle/fluid/platform/cuda_profiler.h index ebd6aebd76..41d7c12146 100644 --- a/paddle/fluid/platform/cuda_profiler.h +++ b/paddle/fluid/platform/cuda_profiler.h @@ -11,12 +11,13 @@ 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 + +#include "paddle/fluid/platform/enforce.h" namespace paddle { namespace platform { diff --git a/paddle/fluid/platform/variant.h b/paddle/fluid/platform/variant.h index 05ca33137d..45f60fc9d7 100644 --- a/paddle/fluid/platform/variant.h +++ b/paddle/fluid/platform/variant.h @@ -14,29 +14,25 @@ limitations under the License. */ #pragma once -#ifdef __CUDACC__ -#ifdef __CUDACC_VER_MAJOR__ -// CUDA 9 define `__CUDACC_VER__` as a warning message, manually define -// __CUDACC_VER__ instead. +// Boost 1.41.0 requires __CUDACC_VER__, but in CUDA 9 __CUDACC_VER__ +// is removed, so we have to manually define __CUDACC_VER__ instead. +// For details, please refer to +// https://github.com/PaddlePaddle/Paddle/issues/6626 +#if defined(__CUDACC__) && defined(__CUDACC_VER_MAJOR__) #undef __CUDACC_VER__ - -#define __CUDACC_VER__ \ - (__CUDACC_VER_MAJOR__ * 10000 + __CUDACC_VER_MINOR__ * 100 + \ - __CUDACC_VER_BUILD__) -#endif - +#define __CUDACC_VER__ \ + __CUDACC_VER_BUILD__ + __CUDACC_VER_MAJOR__ * 10000 + \ + __CUDACC_VER_MINOR__ * 100 #endif -#include +#include "boost/config.hpp" -#ifdef PADDLE_WITH_CUDA - -// Because boost's variadic templates has bug on nvcc, boost will disable -// variadic template support when GPU enabled on nvcc. -// Define BOOST_NO_CXX11_VARIADIC_TEMPLATES on gcc/clang to generate same -// function symbols. -// +// Because Boost 1.41.0's variadic templates has bug on nvcc, boost +// will disable variadic template support in NVCC mode. Define +// BOOST_NO_CXX11_VARIADIC_TEMPLATES on gcc/clang to generate same +// function symbols. For details, // https://github.com/PaddlePaddle/Paddle/issues/3386 +#ifdef PADDLE_WITH_CUDA #ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES #define BOOST_NO_CXX11_VARIADIC_TEMPLATES #endif From 494c262a26a1ff29143491fa60fd6ba546d3bebf Mon Sep 17 00:00:00 2001 From: whs Date: Sat, 14 Apr 2018 14:42:58 +0800 Subject: [PATCH 141/164] Fix average_accumulate_op for parallel executor. (#9852) --- .../fluid/operators/average_accumulates_op.cu | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/paddle/fluid/operators/average_accumulates_op.cu b/paddle/fluid/operators/average_accumulates_op.cu index 046f72b471..104e24f6ee 100644 --- a/paddle/fluid/operators/average_accumulates_op.cu +++ b/paddle/fluid/operators/average_accumulates_op.cu @@ -25,12 +25,14 @@ void GetAccumulators( auto* in_num_accumulates = ctx.Input("in_num_accumulates"); auto* in_num_updates = ctx.Input("in_num_updates"); auto stream = ctx.cuda_device_context().stream(); - memory::Copy(platform::CPUPlace(), old_num_accumulates_, - platform::CUDAPlace(), in_old_num_accumulates->data(), - sizeof(int64_t), stream); - memory::Copy(platform::CPUPlace(), num_accumulates_, platform::CUDAPlace(), + auto cuda_place = + boost::get(in_old_num_accumulates->place()); + memory::Copy(platform::CPUPlace(), old_num_accumulates_, cuda_place, + in_old_num_accumulates->data(), sizeof(int64_t), + stream); + memory::Copy(platform::CPUPlace(), num_accumulates_, cuda_place, in_num_accumulates->data(), sizeof(int64_t), stream); - memory::Copy(platform::CPUPlace(), num_updates_, platform::CUDAPlace(), + memory::Copy(platform::CPUPlace(), num_updates_, cuda_place, in_num_updates->data(), sizeof(int64_t), stream); } @@ -42,14 +44,16 @@ void SetAccumulators( auto* out_old_num_accumulates = ctx.Output("out_old_num_accumulates"); auto* out_num_accumulates = ctx.Output("out_num_accumulates"); auto* out_num_updates = ctx.Output("out_num_updates"); + auto cuda_place = + boost::get(out_old_num_accumulates->place()); - memory::Copy(platform::CUDAPlace(), out_old_num_accumulates->data(), + memory::Copy(cuda_place, out_old_num_accumulates->data(), platform::CPUPlace(), &old_num_accumulates_, sizeof(int64_t), stream); - memory::Copy(platform::CUDAPlace(), out_num_accumulates->data(), + memory::Copy(cuda_place, out_num_accumulates->data(), platform::CPUPlace(), &num_accumulates_, sizeof(int64_t), stream); - memory::Copy(platform::CUDAPlace(), out_num_updates->data(), + memory::Copy(cuda_place, out_num_updates->data(), platform::CPUPlace(), &num_updates_, sizeof(int64_t), stream); } From 04a652c6365145d8e6f2f879369e1a92f0ce3d36 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 16 Apr 2018 10:07:25 +0800 Subject: [PATCH 142/164] specified pip version in dev image --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7856d3bbc4..0f13acabc3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -57,7 +57,7 @@ RUN localedef -i en_US -f UTF-8 en_US.UTF-8 # specify sphinx version as 1.5.6 and remove -U option for [pip install -U # sphinx-rtd-theme] since -U option will cause sphinx being updated to newest # version(1.7.1 for now), which causes building documentation failed. -RUN pip install --upgrade pip && \ +RUN pip install --upgrade pip==9.0.3 && \ pip install -U wheel && \ pip install -U docopt PyYAML sphinx==1.5.6 && \ pip install sphinx-rtd-theme==0.1.9 recommonmark From d9e2ff333e96fc06912754754599b72e4c4001dd Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Mon, 16 Apr 2018 11:40:36 +0800 Subject: [PATCH 143/164] grpc version to 1.10.x --- cmake/external/grpc.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake index aa24915947..e90948782b 100644 --- a/cmake/external/grpc.cmake +++ b/cmake/external/grpc.cmake @@ -33,7 +33,7 @@ ExternalProject_Add( extern_grpc DEPENDS protobuf zlib GIT_REPOSITORY "https://github.com/grpc/grpc.git" - GIT_TAG "v1.11.x" + GIT_TAG "v1.10.x" PREFIX ${GRPC_SOURCES_DIR} UPDATE_COMMAND "" CONFIGURE_COMMAND "" From 8d73752c737d29eb00d5b3ea6bcd754c4c7f93c8 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 16 Apr 2018 12:00:09 +0800 Subject: [PATCH 144/164] add async update design doc --- doc/fluid/design/dist_train/async_update.md | 52 ++++++++++++++++++ .../dist_train/src/async_pserver.graffle | Bin 0 -> 10621 bytes .../design/dist_train/src/async_pserver.png | Bin 0 -> 164416 bytes .../dist_train/src/async_update.graffle | Bin 0 -> 8121 bytes .../design/dist_train/src/async_update.png | Bin 0 -> 192539 bytes 5 files changed, 52 insertions(+) create mode 100644 doc/fluid/design/dist_train/async_update.md create mode 100644 doc/fluid/design/dist_train/src/async_pserver.graffle create mode 100644 doc/fluid/design/dist_train/src/async_pserver.png create mode 100644 doc/fluid/design/dist_train/src/async_update.graffle create mode 100644 doc/fluid/design/dist_train/src/async_update.png diff --git a/doc/fluid/design/dist_train/async_update.md b/doc/fluid/design/dist_train/async_update.md new file mode 100644 index 0000000000..05175596f7 --- /dev/null +++ b/doc/fluid/design/dist_train/async_update.md @@ -0,0 +1,52 @@ +# Design Doc: Asynchronous Update With Distributed Training + +## Background + +For the typical synchronous distributed training, some significant steps are as follows: + +1. A Trainer will compute the gradients and SEND them to the Parameter +Server(PServer) nodes. +1. After the PServer node received gradients came from all the Trainers, it would apply the gradient to the respective variables, and using an optimize algorithms(SGD, + Momentment...) to update the parameters. +1. The Trainer would wait for the PServers finished the optimize stage, and GET the parameters from PServer, so all the Trainers would get the same parameters. + +In the synchronously distributed training, there should be a `Barrier` to synchronise the +parameters after the optimizing stage. The performance of a distributed training job +depends on the lowest node, if there were hundreds or thousand training nodes in a Job, +the performance of synchronously distributed training might be very slow because of +the slow node. So this design doc would introduce an approach to implement +*asynchronously* distributed training in PaddlePaddle Fluid. + +## Design + + + +As the figure above, we describe a global view of asynchronously update process and use +the parameter `w1` as an example to introduce the steps: +1. For each gradient variables, they may distribute on different GPU card and aggregate +them while they are all calculated. +1. Split the gradient variable into multiple blocks according to the number of PServer +instances and sent them. +1. PServer would run an `Optimize Block` to use a specified optimize algorithm to update +the specified parameter, such as `w1`. +1. The trainer will fetch the latest parameter after PServer finished the optimize stage. +1. Broadcast the received variable into multiple GPU cards and continue to run the next +mini-batch. + +### Trainer + +- We need a new Operator named `RemoteOptimize` to send gradients to multiple PServer +instances and fetch the latest parameter. +- There could be a large number of gradient variables to be sent, so we need to use another +thread pool(IO Threadpool) which number of the schedulable threads is larger than the +computing thread pool to avoid competitive the thread resources with computing. + +### Parameter Server + + + +- There should be multiple trainer instances want to optimize the same parameter at +the same time, to avoid the pollution, we need one `BlockingQueue` for each gradient +variable to process them one by one. +- We need a `Map` structure to map a gradient variable name to the `OptimizeBlock` which +can optimize the respective parameter. diff --git a/doc/fluid/design/dist_train/src/async_pserver.graffle b/doc/fluid/design/dist_train/src/async_pserver.graffle new file mode 100644 index 0000000000000000000000000000000000000000..110eec7f9b3f26034cd90feb188b558c11f7ce02 GIT binary patch literal 10621 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

|vnS9S<gMvh$i0oV!3`P47TZKR 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%0AN1c8WzRwK5dl)wHNE?cL_Z-lR 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℘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 Tx@fTcf@NOzc|bhmV)gf!f_(Q`h( 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�mB+k}-{GO%36pub038;!thsycE(%R( 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 z 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 literal 0 HcmV?d00001 From fb873713e7a3b8645c099a9cb6eb7115d80df683 Mon Sep 17 00:00:00 2001 From: dongdaxiang Date: Mon, 16 Apr 2018 12:34:06 +0800 Subject: [PATCH 145/164] update program_desc_test testcase --- paddle/fluid/framework/program_desc_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/framework/program_desc_test.cc b/paddle/fluid/framework/program_desc_test.cc index 66618a291b..6c46e9aad5 100644 --- a/paddle/fluid/framework/program_desc_test.cc +++ b/paddle/fluid/framework/program_desc_test.cc @@ -66,7 +66,7 @@ TEST(ProgramDesc, copy_ctor) { for (size_t i = 0; i < global_block->OpSize(); ++i) { auto op_origin = global_block->Op(i); - auto op_copy = global_block->Op(i); + auto op_copy = global_block_copy->Op(i); ASSERT_EQ(op_origin->Type(), op_copy->Type()); ASSERT_EQ(op_origin->Inputs(), op_copy->Inputs()); @@ -131,7 +131,7 @@ TEST(ProgramDescBind, serialize_and_deserialize) { for (size_t i = 0; i < global_block->OpSize(); ++i) { auto op_origin = global_block->Op(i); - auto op_restored = global_block->Op(i); + auto op_restored = global_block_restored->Op(i); ASSERT_EQ(op_origin->Type(), op_restored->Type()); ASSERT_EQ(op_origin->Inputs(), op_restored->Inputs()); From 5b84c9b59ce55bfeef6e474905b41475dfb07b36 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Mon, 16 Apr 2018 13:12:20 +0800 Subject: [PATCH 146/164] CreateOpHandleIOs --- .../details/multi_devices_graph_builder.cc | 14 +++++++------- .../details/multi_devices_graph_builder.h | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.cc b/paddle/fluid/framework/details/multi_devices_graph_builder.cc index e0dd9e6068..5a95cbc536 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.cc +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.cc @@ -55,21 +55,21 @@ MultiDevSSAGraphBuilder::MultiDevSSAGraphBuilder( } } -void MultiDevSSAGraphBuilder::CreateOpHandleIOs(SSAGraph *result, OpDesc *op, +void MultiDevSSAGraphBuilder::CreateOpHandleIOs(SSAGraph *result, + const OpDesc &op, const platform::Place &p, const size_t &i) const { auto *op_handle = result->ops_.back().get(); - op_handle->dev_ctxes_[p] = const_cast( - platform::DeviceContextPool::Instance().Get(p)); + op_handle->dev_ctxes_[p] = platform::DeviceContextPool::Instance().Get(p); - auto var_names = op->InputArgumentNames(); + auto var_names = op.InputArgumentNames(); for (auto &each_var_name : var_names) { VarHandle *var = CreateOrGetLatestVarHandle(result, each_var_name, p, i); op_handle->AddInput(var); } - var_names = op->OutputArgumentNames(); + var_names = op.OutputArgumentNames(); for (auto &each_var_name : var_names) { CreateOpOutput(result, op_handle, each_var_name, p, i); @@ -107,7 +107,7 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( result.ops_.emplace_back(new SendOpHandle(*op, s, p)); // Create inputs for output on original place and no ssa output // is created for send op. - CreateOpHandleIOs(&result, op, p, 0); + CreateOpHandleIOs(&result, *op, p, 0); continue; } @@ -117,7 +117,7 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( result.ops_.emplace_back(new ComputationOpHandle(*op, s, p)); auto *op_handle = result.ops_.back().get(); - CreateOpHandleIOs(&result, op, p, i); + CreateOpHandleIOs(&result, *op, p, i); auto var_names = op->OutputArgumentNames(); diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.h b/paddle/fluid/framework/details/multi_devices_graph_builder.h index de34caab1b..f1518d75b4 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.h +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.h @@ -45,8 +45,8 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { std::unique_ptr Build(const ProgramDesc &program) const override; private: - void CreateOpHandleIOs(SSAGraph *result, OpDesc *op, const platform::Place &p, - const size_t &i) const; + void CreateOpHandleIOs(SSAGraph *result, const OpDesc &op, + const platform::Place &p, const size_t &i) const; private: std::string loss_var_name_; From 2b05b010ff189f270849145b7e3e90fe48ed42b0 Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Mon, 16 Apr 2018 13:14:11 +0800 Subject: [PATCH 147/164] fix chunk evaluator name in metrics --- python/paddle/fluid/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/paddle/fluid/metrics.py b/python/paddle/fluid/metrics.py index 99a81c1d42..68e75bbb1f 100644 --- a/python/paddle/fluid/metrics.py +++ b/python/paddle/fluid/metrics.py @@ -169,7 +169,7 @@ class Accuracy(MetricBase): return self.value / self.weight -class ChunkEvalutor(MetricBase): +class ChunkEvaluator(MetricBase): """ Accumulate counter numbers output by chunk_eval from mini-batches and compute the precision recall and F1-score using the accumulated counter From c4de344ce24894309fd08065ad7f52cbcb88598b Mon Sep 17 00:00:00 2001 From: typhoonzero Date: Mon, 16 Apr 2018 13:16:44 +0800 Subject: [PATCH 148/164] update --- python/paddle/fluid/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/paddle/fluid/metrics.py b/python/paddle/fluid/metrics.py index 68e75bbb1f..c618b02a76 100644 --- a/python/paddle/fluid/metrics.py +++ b/python/paddle/fluid/metrics.py @@ -177,7 +177,7 @@ class ChunkEvaluator(MetricBase): """ def __init__(self, name=None): - super(ChunkEvalutor, self).__init__(name) + super(ChunkEvaluator, self).__init__(name) self.num_infer_chunks = 0 self.num_label_chunks = 0 self.num_correct_chunks = 0 From d04073050e49cd0404ae605b677ca032926a89a0 Mon Sep 17 00:00:00 2001 From: guosheng Date: Mon, 16 Apr 2018 15:23:41 +0800 Subject: [PATCH 149/164] Add python wrapper for label smoothing --- doc/fluid/api/layers.rst | 6 ++ python/paddle/fluid/layers/nn.py | 66 +++++++++++++++++++ .../fluid/tests/unittests/test_layers.py | 10 +++ 3 files changed, 82 insertions(+) diff --git a/doc/fluid/api/layers.rst b/doc/fluid/api/layers.rst index 22e6fb13d7..5c02886efd 100644 --- a/doc/fluid/api/layers.rst +++ b/doc/fluid/api/layers.rst @@ -473,6 +473,12 @@ multiplex .. autofunction:: paddle.fluid.layers.multiplex :noindex: +label_smooth +------------ + +.. autofunction:: paddle.fluid.layers.label_smooth + :noindex: + ops === diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 5c2c2dd7ab..bba8b64bd8 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -77,6 +77,7 @@ __all__ = [ 'lod_reset', 'lrn', 'pad', + 'label_smooth', ] @@ -3678,3 +3679,68 @@ def pad(x, paddings, pad_value=0., name=None): attrs={'paddings': paddings, 'pad_value': float(pad_value)}) return out + + +def label_smooth(label, + prior_dist=None, + epsilon=0.1, + dtype="float32", + name=None): + """ + Label smoothing is a mechanism to regularize the classifier layer and is + called label-smoothing regularization (LSR). + + Label smoothing is proposed to encourage the model to be less confident, + since optimizing the log-likelihood of the correct label directly may + cause overfitting and reduce the ability of the model to adapt. Label + smoothing replaces the ground-truth label :math:`y` with the weighted sum + of itself and some fixed distribution :math:`\mu`. For class :math:`k`, + i.e. + + .. math:: + + \\tilde{y_k} = (1 - \epsilon) * y_k + \epsilon * \mu_k, + + where :math:`1 - \epsilon` and :math:`\epsilon` are the weights + respectively, and :math:`\\tilde{y}_k` is the smoothed label. Usually + uniform distribution is used for :math:`\mu`. + + See more details about label smoothing in https://arxiv.org/abs/1512.00567. + + Args: + label(Variable): The input variable containing the label data. The + label data should use one-hot representation. + prior_dist(Variable): The prior distribution to be used to smooth + labels. If not provided, an uniform distribution + is used. The shape of :attr:`prior_dist` should + be :math:`(1, class\_num)`. + epsilon(float): The weight used to mix up the original ground-truth + distribution and the fixed distribution. + dtype(np.dtype|core.VarDesc.VarType|str): The type of data : float32, + float_64, int etc. + name(str|None): A name for this layer(optional). If set None, the layer + will be named automatically. + + Returns: + Variable: The tensor variable containing the smoothed labels. + + Examples: + .. code-block:: python + + label = layers.data(name="label", shape=[1], dtype="float32") + one_hot_label = layers.one_hot(input=label, depth=10) + smooth_label = layers.label_smooth( + label=one_hot_label, epsilon=0.1, dtype="float32") + """ + if epsilon > 1. or epsilon < 0.: + raise ValueError("The value of epsilon must be between 0 and 1.") + helper = LayerHelper("label_smooth", **locals()) + label.stop_gradient = True + smooth_label = helper.create_tmp_variable(dtype) + helper.append_op( + type="label_smooth", + inputs={"X": label, + "PriorDist": prior_dist} if prior_dist else {"X": label}, + outputs={"Out": smooth_label}, + attrs={"epsilon": float(epsilon)}) + return smooth_label diff --git a/python/paddle/fluid/tests/unittests/test_layers.py b/python/paddle/fluid/tests/unittests/test_layers.py index f88a6f1ce6..a1be2d671d 100644 --- a/python/paddle/fluid/tests/unittests/test_layers.py +++ b/python/paddle/fluid/tests/unittests/test_layers.py @@ -340,6 +340,16 @@ class TestBook(unittest.TestCase): print(layers.lod_reset(x=x, y=y)) print(str(program)) + def test_label_smooth(self): + program = Program() + with program_guard(program): + label = layers.data(name="label", shape=[1], dtype="float32") + one_hot_label = layers.one_hot(input=label, depth=10) + smooth_label = layers.label_smooth( + label=one_hot_label, epsilon=0.1, dtype="float32") + self.assertIsNotNone(smooth_label) + print(str(program)) + if __name__ == '__main__': unittest.main() From 0f1fd01018cbf444efd83fb59a9f18f5dea86753 Mon Sep 17 00:00:00 2001 From: Shan Yi <35982308+shanyi15@users.noreply.github.com> Date: Mon, 16 Apr 2018 16:38:22 +0800 Subject: [PATCH 150/164] Update index_en.rst --- doc/fluid/dev/index_en.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/fluid/dev/index_en.rst b/doc/fluid/dev/index_en.rst index 98988fc22d..80c899a82f 100644 --- a/doc/fluid/dev/index_en.rst +++ b/doc/fluid/dev/index_en.rst @@ -4,6 +4,7 @@ Development .. toctree:: :maxdepth: 1 + api_doc_std_en.md new_op_en.md new_op_kernel.md use_eigen_en.md From 52d076cb537bf6182279f6c5a2547bd227977782 Mon Sep 17 00:00:00 2001 From: Shan Yi <35982308+shanyi15@users.noreply.github.com> Date: Mon, 16 Apr 2018 16:39:49 +0800 Subject: [PATCH 151/164] Update index_cn.rst --- doc/fluid/dev/index_cn.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/fluid/dev/index_cn.rst b/doc/fluid/dev/index_cn.rst index b123b756e2..ad798003f5 100644 --- a/doc/fluid/dev/index_cn.rst +++ b/doc/fluid/dev/index_cn.rst @@ -4,6 +4,7 @@ .. toctree:: :maxdepth: 1 + api_doc_std_cn.md new_op_cn.md new_op_kernel.md use_eigen_cn.md From 15c3a8e106f341dd8c277bfee55c6646ff9383d3 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 16 Apr 2018 19:37:14 +0800 Subject: [PATCH 152/164] update by comment --- doc/fluid/design/dist_train/async_update.md | 39 ++++++++++-------- .../dist_train/src/async_pserver.graffle | Bin 10621 -> 11035 bytes .../design/dist_train/src/async_pserver.png | Bin 164416 -> 169986 bytes .../dist_train/src/async_update.graffle | Bin 8121 -> 8266 bytes .../design/dist_train/src/async_update.png | Bin 192539 -> 183948 bytes 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/doc/fluid/design/dist_train/async_update.md b/doc/fluid/design/dist_train/async_update.md index 05175596f7..be8783a7e7 100644 --- a/doc/fluid/design/dist_train/async_update.md +++ b/doc/fluid/design/dist_train/async_update.md @@ -4,41 +4,46 @@ For the typical synchronous distributed training, some significant steps are as follows: -1. A Trainer will compute the gradients and SEND them to the Parameter -Server(PServer) nodes. -1. After the PServer node received gradients came from all the Trainers, it would apply the gradient to the respective variables, and using an optimize algorithms(SGD, - Momentment...) to update the parameters. -1. The Trainer would wait for the PServers finished the optimize stage, and GET the parameters from PServer, so all the Trainers would get the same parameters. +1. A Trainer will compute the gradients and SEND them to the Parameter Server(PServer) nodes. +1. After the PServer node received gradients came from all the Trainers, +it would apply the gradient to the respective variables, and using an optimize algorithms(SGD, +Momentment...) to update the parameters. +1. The Trainer would wait for the PServers finished the optimize stage, and GET the parameters from PServer, +so all the Trainers would get the same parameters. In the synchronously distributed training, there should be a `Barrier` to synchronise the -parameters after the optimizing stage. The performance of a distributed training job -depends on the lowest node, if there were hundreds or thousand training nodes in a Job, -the performance of synchronously distributed training might be very slow because of -the slow node. So this design doc would introduce an approach to implement +parameters after the optimizing stage. The performance of a distributed training job would +depend on the slowest node if there were hundreds or thousands of training nodes in a +Job, the performance of synchronously distributed training might be very poor because of +the slow node. So this design doc would introduce an approach to implement *asynchronously* distributed training in PaddlePaddle Fluid. ## Design - + As the figure above, we describe a global view of asynchronously update process and use the parameter `w1` as an example to introduce the steps: 1. For each gradient variables, they may distribute on different GPU card and aggregate them while they are all calculated. 1. Split the gradient variable into multiple blocks according to the number of PServer -instances and sent them. -1. PServer would run an `Optimize Block` to use a specified optimize algorithm to update -the specified parameter, such as `w1`. -1. The trainer will fetch the latest parameter after PServer finished the optimize stage. +instances and then sent them. +1. PServer would run an `Optimize Block` using a specified optimize algorithm to update +the specified parameter. +1. The trainer will fetch the parameter before running forward Op depends on the specified +parameter. 1. Broadcast the received variable into multiple GPU cards and continue to run the next mini-batch. ### Trainer -- We need a new Operator named `RemoteOptimize` to send gradients to multiple PServer -instances and fetch the latest parameter. +- For the multiple devices distributed training, we need to aggregate the gradient +variables which placed on different devices firstly, and then schedule a `SendVars` Operator to +send the gradient variables to the multiple PServer instances. +- Schedule `FetchVars` operator to fetch the latest parameter from PServer before running +the forward ops. - There could be a large number of gradient variables to be sent, so we need to use another -thread pool(IO Threadpool) which number of the schedulable threads is larger than the +thread pool(IO Threadpool) which a number of the schedulable threads is larger than the computing thread pool to avoid competitive the thread resources with computing. ### Parameter Server diff --git a/doc/fluid/design/dist_train/src/async_pserver.graffle b/doc/fluid/design/dist_train/src/async_pserver.graffle index 110eec7f9b3f26034cd90feb188b558c11f7ce02..ea6dcfa2a9e4daac1500d98743a7a5a4234470f9 100644 GIT binary patch literal 11035 zcmaLcRZtzw)+S)wEl6;8cXtR9+}#Nf+}+*XT{rIT5*#+}?yw=aJM*10|4f~kn)$m{ zy%*g#ebcpS^+OyD2llT833lOo+EygpdUaCUM`q~T@g!6g2Q=9^>t)7)#*%;yLe&!CS-@*Zt}Vs<+x{PuY(T*mY2;L;=@o!s{Uw<9X- z=YYZQ8Z`8_5r3BSmid0;|M@w{{1u)#Cu=(Gw<;lO;FD3c_@hAh{n@z>)vasn;wh8z z&RFPM%27C7tY3br-}`m3A!b+KGV|8U5U*3Nz~pnZ4Pmj zO>KoRt-`}1{Q3Ts@cU8vtl(GAG*kUlkyoAmxZml@Ox22cTIR#Bq2G9PHQm=v)%oQ- z4}3R+;Q6Kb5>|d@w)`QA-)S2K_aY1YjG04;Lacw(>*4D^2AH9QjXe5eSc)OkF-O8)xl1Q41}lQ@Ua1=jJ1yPi-6;SGP0z znvT9|&kK{3rBvng=m~2fSp5{_snSB_*!K2qZ}~NK{@WEVeY`%}q|UGp*Qpf�mNt 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 jy$6gKaVQ>p=G4E|2q7n;isQ-7Fh1F=%>r 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
    -_`MZ<_WYC*&d;HF=Y9s+{|*aQJ#sJU*@ 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

    ?*MMp{Wfb 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

    Pc@|p^Dn{o^UMQX$Y~e{ast}9SaTQcr@~r$j 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 MId$1G8MC1O1Mzm+^#A|> literal 192539 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�mB+k}-{GO%36pub038;!thsycE(%R( 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 z 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 From 49e885b6eaf969c07413889f12f12241fefbe4f6 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 16 Apr 2018 19:43:36 +0800 Subject: [PATCH 153/164] update --- doc/fluid/design/dist_train/async_update.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/fluid/design/dist_train/async_update.md b/doc/fluid/design/dist_train/async_update.md index be8783a7e7..344a44bde8 100644 --- a/doc/fluid/design/dist_train/async_update.md +++ b/doc/fluid/design/dist_train/async_update.md @@ -5,9 +5,10 @@ For the typical synchronous distributed training, some significant steps are as follows: 1. A Trainer will compute the gradients and SEND them to the Parameter Server(PServer) nodes. -1. After the PServer node received gradients came from all the Trainers, -it would apply the gradient to the respective variables, and using an optimize algorithms(SGD, -Momentment...) to update the parameters. +1. After the PServer node received gradients came from all the Trainers, It will aggregate the +gradient variables for the same parameter into one gradient variable and then apply the aggregated +gradient to the respective parameter, finally using an optimize algorithms(SGD, Monument...) +to update the parameters. 1. The Trainer would wait for the PServers finished the optimize stage, and GET the parameters from PServer, so all the Trainers would get the same parameters. @@ -38,7 +39,7 @@ mini-batch. ### Trainer - For the multiple devices distributed training, we need to aggregate the gradient -variables which placed on different devices firstly, and then schedule a `SendVars` Operator to +variables which placed on different devices firstly and then schedule a `SendVars` Operator to send the gradient variables to the multiple PServer instances. - Schedule `FetchVars` operator to fetch the latest parameter from PServer before running the forward ops. From 186659798f41f06879f30dec8b2f4ccfd90b69be Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Mon, 16 Apr 2018 20:33:25 +0800 Subject: [PATCH 154/164] add tensorrt build support(#9891) --- CMakeLists.txt | 6 + Dockerfile | 7 + paddle/fluid/inference/CMakeLists.txt | 3 + .../fluid/inference/tensorrt/CMakeLists.txt | 1 + .../fluid/inference/tensorrt/test_tensorrt.cc | 155 ++++++++++++++++++ paddle/fluid/platform/dynload/CMakeLists.txt | 5 + .../fluid/platform/dynload/dynamic_loader.cc | 12 ++ .../fluid/platform/dynload/dynamic_loader.h | 1 + paddle/fluid/platform/dynload/tensorrt.cc | 30 ++++ paddle/fluid/platform/dynload/tensorrt.h | 69 ++++++++ paddle/utils/DynamicLoader.cpp | 11 ++ paddle/utils/DynamicLoader.h | 8 + 12 files changed, 308 insertions(+) create mode 100644 paddle/fluid/inference/tensorrt/CMakeLists.txt create mode 100644 paddle/fluid/inference/tensorrt/test_tensorrt.cc create mode 100644 paddle/fluid/platform/dynload/tensorrt.cc create mode 100644 paddle/fluid/platform/dynload/tensorrt.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c649aafedd..de47086dbd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ option(WITH_GPU "Compile PaddlePaddle with NVIDIA GPU" ${CUDA_F option(WITH_AMD_GPU "Compile PaddlePaddle with AMD GPU" OFF) option(WITH_AVX "Compile PaddlePaddle with AVX intrinsics" ${AVX_FOUND}) option(WITH_MKL "Compile PaddlePaddle with MKL support." ${AVX_FOUND}) +option(WITH_TENSORRT "Compile PaddlePaddle with TensorRT support." OFF) option(WITH_DSO "Compile PaddlePaddle with dynamic linked CUDA" ON) option(WITH_TESTING "Compile PaddlePaddle with unit testing" OFF) option(WITH_SWIG_PY "Compile PaddlePaddle with inference api" ON) @@ -181,6 +182,11 @@ if(WITH_GPU) include(cuda) endif(WITH_GPU) +# TensorRT depends on GPU. +if (NOT WITH_GPU) + set(WITH_TENSORRT OFF) +endif() + if(WITH_AMD_GPU) find_package(HIP) include(hip) diff --git a/Dockerfile b/Dockerfile index 0f13acabc3..9097bb657d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,6 +45,13 @@ ENV PATH=${PATH}:${GOROOT}/bin:${GOPATH}/bin # install glide RUN curl -s -q https://glide.sh/get | sh +# Install TensorRT +# The unnecessary files has been removed to make the library small. +RUN wget -qO- http://paddlepaddledeps.bj.bcebos.com/TensorRT-4.0.0.3.Ubuntu-16.04.4.x86_64-gnu.cuda-8.0.cudnn7.0.tar.gz | \ + tar -xz -C /usr/local && \ + cp -rf /usr/local/TensorRT/include /usr && \ + cp -rf /usr/local/TensorRT/lib /usr + # git credential to skip password typing RUN git config --global credential.helper store diff --git a/paddle/fluid/inference/CMakeLists.txt b/paddle/fluid/inference/CMakeLists.txt index e53bcf2384..8494edee6c 100644 --- a/paddle/fluid/inference/CMakeLists.txt +++ b/paddle/fluid/inference/CMakeLists.txt @@ -21,4 +21,7 @@ endif() if(WITH_TESTING) add_subdirectory(tests/book) + if (WITH_TENSORRT) + add_subdirectory(tensorrt) + endif() endif() diff --git a/paddle/fluid/inference/tensorrt/CMakeLists.txt b/paddle/fluid/inference/tensorrt/CMakeLists.txt new file mode 100644 index 0000000000..e39c0daac7 --- /dev/null +++ b/paddle/fluid/inference/tensorrt/CMakeLists.txt @@ -0,0 +1 @@ +nv_test(test_tensorrt SRCS test_tensorrt.cc DEPS dynload_cuda device_context dynamic_loader) diff --git a/paddle/fluid/inference/tensorrt/test_tensorrt.cc b/paddle/fluid/inference/tensorrt/test_tensorrt.cc new file mode 100644 index 0000000000..a81a708e7a --- /dev/null +++ b/paddle/fluid/inference/tensorrt/test_tensorrt.cc @@ -0,0 +1,155 @@ +/* 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 +#include "NvInfer.h" +#include "cuda.h" +#include "cuda_runtime_api.h" +#include "paddle/fluid/platform/dynload/tensorrt.h" + +namespace dy = paddle::platform::dynload; + +class Logger : public nvinfer1::ILogger { + public: + void log(nvinfer1::ILogger::Severity severity, const char* msg) override { + switch (severity) { + case Severity::kINFO: + LOG(INFO) << msg; + break; + case Severity::kWARNING: + LOG(WARNING) << msg; + break; + case Severity::kINTERNAL_ERROR: + case Severity::kERROR: + LOG(ERROR) << msg; + break; + default: + break; + } + } +}; + +class ScopedWeights { + public: + ScopedWeights(float value) : value_(value) { + w.type = nvinfer1::DataType::kFLOAT; + w.values = &value_; + w.count = 1; + } + const nvinfer1::Weights& get() { return w; } + + private: + float value_; + nvinfer1::Weights w; +}; + +// The following two API are implemented in TensorRT's header file, cannot load +// from the dynamic library. So create our own implementation and directly +// trigger the method from the dynamic library. +nvinfer1::IBuilder* createInferBuilder(nvinfer1::ILogger& logger) { + return static_cast( + dy::createInferBuilder_INTERNAL(&logger, NV_TENSORRT_VERSION)); +} +nvinfer1::IRuntime* createInferRuntime(nvinfer1::ILogger& logger) { + return static_cast( + dy::createInferRuntime_INTERNAL(&logger, NV_TENSORRT_VERSION)); +} + +const char* kInputTensor = "input"; +const char* kOutputTensor = "output"; + +// Creates a network to compute y = 2x + 3 +nvinfer1::IHostMemory* CreateNetwork() { + Logger logger; + // Create the engine. + nvinfer1::IBuilder* builder = createInferBuilder(logger); + ScopedWeights weights(2.); + ScopedWeights bias(3.); + + nvinfer1::INetworkDefinition* network = builder->createNetwork(); + // Add the input + auto input = network->addInput(kInputTensor, nvinfer1::DataType::kFLOAT, + nvinfer1::DimsCHW{1, 1, 1}); + EXPECT_NE(input, nullptr); + // Add the hidden layer. + auto layer = network->addFullyConnected(*input, 1, weights.get(), bias.get()); + EXPECT_NE(layer, nullptr); + // Mark the output. + auto output = layer->getOutput(0); + output->setName(kOutputTensor); + network->markOutput(*output); + // Build the engine. + builder->setMaxBatchSize(1); + builder->setMaxWorkspaceSize(1 << 10); + auto engine = builder->buildCudaEngine(*network); + EXPECT_NE(engine, nullptr); + // Serialize the engine to create a model, then close. + nvinfer1::IHostMemory* model = engine->serialize(); + network->destroy(); + engine->destroy(); + builder->destroy(); + return model; +} + +void Execute(nvinfer1::IExecutionContext& context, const float* input, + float* output) { + const nvinfer1::ICudaEngine& engine = context.getEngine(); + // Two binds, input and output + ASSERT_EQ(engine.getNbBindings(), 2); + const int input_index = engine.getBindingIndex(kInputTensor); + const int output_index = engine.getBindingIndex(kOutputTensor); + // Create GPU buffers and a stream + void* buffers[2]; + ASSERT_EQ(0, cudaMalloc(&buffers[input_index], sizeof(float))); + ASSERT_EQ(0, cudaMalloc(&buffers[output_index], sizeof(float))); + cudaStream_t stream; + ASSERT_EQ(0, cudaStreamCreate(&stream)); + // Copy the input to the GPU, execute the network, and copy the output back. + ASSERT_EQ(0, cudaMemcpyAsync(buffers[input_index], input, sizeof(float), + cudaMemcpyHostToDevice, stream)); + context.enqueue(1, buffers, stream, nullptr); + ASSERT_EQ(0, cudaMemcpyAsync(output, buffers[output_index], sizeof(float), + cudaMemcpyDeviceToHost, stream)); + cudaStreamSynchronize(stream); + + // Release the stream and the buffers + cudaStreamDestroy(stream); + ASSERT_EQ(0, cudaFree(buffers[input_index])); + ASSERT_EQ(0, cudaFree(buffers[output_index])); +} + +TEST(TensorrtTest, BasicFunction) { + // Create the network serialized model. + nvinfer1::IHostMemory* model = CreateNetwork(); + + // Use the model to create an engine and an execution context. + Logger logger; + nvinfer1::IRuntime* runtime = createInferRuntime(logger); + nvinfer1::ICudaEngine* engine = + runtime->deserializeCudaEngine(model->data(), model->size(), nullptr); + model->destroy(); + nvinfer1::IExecutionContext* context = engine->createExecutionContext(); + + // Execute the network. + float input = 1234; + float output; + Execute(*context, &input, &output); + EXPECT_EQ(output, input * 2 + 3); + + // Destroy the engine. + context->destroy(); + engine->destroy(); + runtime->destroy(); +} diff --git a/paddle/fluid/platform/dynload/CMakeLists.txt b/paddle/fluid/platform/dynload/CMakeLists.txt index 84dac2937d..b93b925a72 100644 --- a/paddle/fluid/platform/dynload/CMakeLists.txt +++ b/paddle/fluid/platform/dynload/CMakeLists.txt @@ -1,6 +1,11 @@ cc_library(dynamic_loader SRCS dynamic_loader.cc DEPS glog gflags enforce) list(APPEND CUDA_SRCS cublas.cc cudnn.cc curand.cc nccl.cc) +if (WITH_TENSORRT) + list(APPEND CUDA_SRCS tensorrt.cc) +endif() + + configure_file(cupti_lib_path.h.in ${CMAKE_CURRENT_BINARY_DIR}/cupti_lib_path.h) if (CUPTI_FOUND) list(APPEND CUDA_SRCS cupti.cc) diff --git a/paddle/fluid/platform/dynload/dynamic_loader.cc b/paddle/fluid/platform/dynload/dynamic_loader.cc index 3c1ccc7445..19c01dc5a9 100644 --- a/paddle/fluid/platform/dynload/dynamic_loader.cc +++ b/paddle/fluid/platform/dynload/dynamic_loader.cc @@ -45,6 +45,10 @@ DEFINE_string(nccl_dir, "", DEFINE_string(cupti_dir, "", "Specify path for loading cupti.so."); +DEFINE_string( + tensorrt_dir, "", + "Specify path for loading tensorrt library, such as libnvinfer.so."); + namespace paddle { namespace platform { namespace dynload { @@ -194,6 +198,14 @@ void* GetNCCLDsoHandle() { #endif } +void* GetTensorRtDsoHandle() { +#if defined(__APPLE__) || defined(__OSX__) + return GetDsoHandleFromSearchPath(FLAGS_tensorrt_dir, "libnvinfer.dylib"); +#else + return GetDsoHandleFromSearchPath(FLAGS_tensorrt_dir, "libnvinfer.so"); +#endif +} + } // namespace dynload } // namespace platform } // namespace paddle diff --git a/paddle/fluid/platform/dynload/dynamic_loader.h b/paddle/fluid/platform/dynload/dynamic_loader.h index 4c85093a43..0de3559b60 100644 --- a/paddle/fluid/platform/dynload/dynamic_loader.h +++ b/paddle/fluid/platform/dynload/dynamic_loader.h @@ -25,6 +25,7 @@ void* GetCurandDsoHandle(); void* GetWarpCTCDsoHandle(); void* GetLapackDsoHandle(); void* GetNCCLDsoHandle(); +void* GetTensorRtDsoHandle(); } // namespace dynload } // namespace platform diff --git a/paddle/fluid/platform/dynload/tensorrt.cc b/paddle/fluid/platform/dynload/tensorrt.cc new file mode 100644 index 0000000000..f3c8e27944 --- /dev/null +++ b/paddle/fluid/platform/dynload/tensorrt.cc @@ -0,0 +1,30 @@ +/* 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/platform/dynload/tensorrt.h" + +namespace paddle { +namespace platform { +namespace dynload { + +std::once_flag tensorrt_dso_flag; +void *tensorrt_dso_handle; + +#define DEFINE_WRAP(__name) DynLoad__##__name __name + +TENSORRT_RAND_ROUTINE_EACH(DEFINE_WRAP); + +} // namespace dynload +} // namespace platform +} // namespace paddle diff --git a/paddle/fluid/platform/dynload/tensorrt.h b/paddle/fluid/platform/dynload/tensorrt.h new file mode 100644 index 0000000000..f584a49da0 --- /dev/null +++ b/paddle/fluid/platform/dynload/tensorrt.h @@ -0,0 +1,69 @@ +/* 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 // NOLINT + +#include "paddle/fluid/platform/dynload/dynamic_loader.h" +#include "paddle/fluid/platform/enforce.h" + +namespace paddle { +namespace platform { +namespace dynload { + +extern std::once_flag tensorrt_dso_flag; +extern void* tensorrt_dso_handle; + +#ifdef PADDLE_USE_DSO + +#define DECLARE_DYNAMIC_LOAD_TENSORRT_WRAP(__name) \ + struct DynLoad__##__name { \ + template \ + auto operator()(Args... args) -> decltype(__name(args...)) { \ + using tensorrt_func = decltype(__name(args...)) (*)(Args...); \ + std::call_once(tensorrt_dso_flag, []() { \ + tensorrt_dso_handle = \ + paddle::platform::dynload::GetTensorRtDsoHandle(); \ + PADDLE_ENFORCE(tensorrt_dso_handle, "load tensorrt so failed"); \ + }); \ + void* p_##__name = dlsym(tensorrt_dso_handle, #__name); \ + PADDLE_ENFORCE(p_##__name, "load %s failed", #__name); \ + return reinterpret_cast(p_##__name)(args...); \ + } \ + }; \ + extern DynLoad__##__name __name + +#else +#define DECLARE_DYNAMIC_LOAD_TENSORRT_WRAP(__name) \ + struct DynLoad__##__name { \ + template \ + tensorrtResult_t operator()(Args... args) { \ + return __name(args...); \ + } \ + }; \ + extern DynLoad__##__name __name +#endif + +#define TENSORRT_RAND_ROUTINE_EACH(__macro) \ + __macro(createInferBuilder_INTERNAL); \ + __macro(createInferRuntime_INTERNAL); + +TENSORRT_RAND_ROUTINE_EACH(DECLARE_DYNAMIC_LOAD_TENSORRT_WRAP) + +} // namespace dynload +} // namespace platform +} // namespace paddle diff --git a/paddle/utils/DynamicLoader.cpp b/paddle/utils/DynamicLoader.cpp index 5604a90038..9ac4a56c6e 100644 --- a/paddle/utils/DynamicLoader.cpp +++ b/paddle/utils/DynamicLoader.cpp @@ -32,6 +32,8 @@ DEFINE_string(warpctc_dir, "", "Specify path for loading libwarpctc.so."); DEFINE_string(lapack_dir, "", "Specify path for loading liblapack.so."); +DEFINE_string(tensorrt_dir, "", "Specify path for loading libnvinfer.so."); + static inline std::string join(const std::string& part1, const std::string& part2) { // directory separator @@ -157,3 +159,12 @@ void GetLapackDsoHandle(void** dso_handle) { GetDsoHandleFromSearchPath(FLAGS_lapack_dir, "liblapacke.so", dso_handle); #endif } + +void GetTensorRtDsoHandle(void** dso_handle) { +#if defined(__APPLE__) || defined(__OSX__) + GetDsoHandleFromSearchPath( + FLAGS_tensorrt_dir, "libnvinfer.dylib", dso_handle); +#else + GetDsoHandleFromSearchPath(FLAGS_tensorrt_dir, "libnvinfer.so", dso_handle); +#endif +} diff --git a/paddle/utils/DynamicLoader.h b/paddle/utils/DynamicLoader.h index 2e5ff76a06..02f519de4b 100644 --- a/paddle/utils/DynamicLoader.h +++ b/paddle/utils/DynamicLoader.h @@ -58,3 +58,11 @@ void GetWarpCTCDsoHandle(void** dso_handle); * */ void GetLapackDsoHandle(void** dso_handle); + +/** + * @brief load the DSO of tensorrt + * + * @param **dso_handle dso handler + * + */ +void GetTensorRtDsoHandle(void** dso_handle); From 3fbe9c34f7c7952d2ea3daae70a5912a91707e92 Mon Sep 17 00:00:00 2001 From: wanglun Date: Tue, 17 Apr 2018 01:49:48 +0800 Subject: [PATCH 155/164] Fix typo in docstring (#9829) --- python/paddle/v2/reader/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/paddle/v2/reader/__init__.py b/python/paddle/v2/reader/__init__.py index 3b059735a9..12efdc4a0f 100644 --- a/python/paddle/v2/reader/__init__.py +++ b/python/paddle/v2/reader/__init__.py @@ -50,7 +50,7 @@ An example implementation for single item data reader creator: def reader(): while True: yield numpy.random.uniform(-1, 1, size=width*height) - return reader + return reader An example implementation for multiple item data reader creator: @@ -60,7 +60,7 @@ An example implementation for multiple item data reader creator: def reader(): while True: yield numpy.random.uniform(-1, 1, size=width*height), label - return reader + return reader TODO(yuyang18): Should we add whole design doc here? From 8db220d342842d9d5a92c4d6df1ac22bdecb480d Mon Sep 17 00:00:00 2001 From: Thuan Nguyen Date: Mon, 16 Apr 2018 16:22:49 -0700 Subject: [PATCH 156/164] Add sphinx documentation for Mobile --- doc/CMakeLists.txt | 4 ++- doc/mobile/CMakeLists.txt | 53 +++++++++++++++++++++++++++++++++++++++ doc/mobile/index_cn.rst | 9 +++++++ doc/mobile/index_en.rst | 9 +++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 doc/mobile/CMakeLists.txt create mode 100644 doc/mobile/index_cn.rst create mode 100644 doc/mobile/index_en.rst diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 7066637a7c..0f95216169 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -3,7 +3,9 @@ add_custom_target(paddle_apis ALL add_custom_target(paddle_docs ALL DEPENDS paddle_v2_docs paddle_v2_docs_cn - paddle_fluid_docs paddle_fluid_docs_cn) + paddle_fluid_docs paddle_fluid_docs_cn + paddle_mobile_docs paddle_mobile_docs_cn) add_subdirectory(v2) add_subdirectory(fluid) +add_subdirectory(mobile) diff --git a/doc/mobile/CMakeLists.txt b/doc/mobile/CMakeLists.txt new file mode 100644 index 0000000000..b104a6318d --- /dev/null +++ b/doc/mobile/CMakeLists.txt @@ -0,0 +1,53 @@ +if(NOT DEFINED SPHINX_THEME) + set(SPHINX_THEME default) +endif() + +if(NOT DEFINED SPHINX_THEME_DIR) + set(SPHINX_THEME_DIR) +endif() + +# configured documentation tools and intermediate build results +set(BINARY_BUILD_DIR_EN "${CMAKE_CURRENT_BINARY_DIR}/en/_build") + +# Sphinx cache with pickled ReST documents +set(SPHINX_CACHE_DIR_EN "${CMAKE_CURRENT_BINARY_DIR}/en/_doctrees") + +# HTML output director +set(SPHINX_HTML_DIR_EN "${CMAKE_CURRENT_BINARY_DIR}/en/html") + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/../templates/conf.py.en.in" + "${BINARY_BUILD_DIR_EN}/conf.py" + @ONLY) + +sphinx_add_target(paddle_mobile_docs + html + ${BINARY_BUILD_DIR_EN} + ${SPHINX_CACHE_DIR_EN} + ${CMAKE_CURRENT_SOURCE_DIR} + ${SPHINX_HTML_DIR_EN}) + +add_dependencies(paddle_mobile_docs gen_proto_py paddle_python) + +# configured documentation tools and intermediate build results +set(BINARY_BUILD_DIR_CN "${CMAKE_CURRENT_BINARY_DIR}/cn/_build") + +# Sphinx cache with pickled ReST documents +set(SPHINX_CACHE_DIR_CN "${CMAKE_CURRENT_BINARY_DIR}/cn/_doctrees") + +# HTML output director +set(SPHINX_HTML_DIR_CN "${CMAKE_CURRENT_BINARY_DIR}/cn/html") + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/../templates/conf.py.cn.in" + "${BINARY_BUILD_DIR_CN}/conf.py" + @ONLY) + +sphinx_add_target(paddle_mobile_docs_cn + html + ${BINARY_BUILD_DIR_CN} + ${SPHINX_CACHE_DIR_CN} + ${CMAKE_CURRENT_SOURCE_DIR} + ${SPHINX_HTML_DIR_CN}) + +add_dependencies(paddle_mobile_docs_cn gen_proto_py paddle_python) diff --git a/doc/mobile/index_cn.rst b/doc/mobile/index_cn.rst new file mode 100644 index 0000000000..8297316e8f --- /dev/null +++ b/doc/mobile/index_cn.rst @@ -0,0 +1,9 @@ +移动端 +===== + +.. toctree:: + :maxdepth: 1 + + cross_compiling_for_android_cn.md + cross_compiling_for_ios_cn.md + cross_compiling_for_raspberry_cn.md \ No newline at end of file diff --git a/doc/mobile/index_en.rst b/doc/mobile/index_en.rst new file mode 100644 index 0000000000..e0acdff028 --- /dev/null +++ b/doc/mobile/index_en.rst @@ -0,0 +1,9 @@ +Mobile +====== + +.. toctree:: + :maxdepth: 1 + + cross_compiling_for_android_en.md + cross_compiling_for_ios_en.md + cross_compiling_for_raspberry_en.md From edb199b58c2476358bf5c7f75c38c317d2d80ab1 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Mon, 16 Apr 2018 16:27:15 -0700 Subject: [PATCH 157/164] adding more env vars --- tools/aws_benchmarking/server/pserver.sh.template | 2 +- tools/aws_benchmarking/server/trainer.sh.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/aws_benchmarking/server/pserver.sh.template b/tools/aws_benchmarking/server/pserver.sh.template index 18f9b800da..2612856d1e 100644 --- a/tools/aws_benchmarking/server/pserver.sh.template +++ b/tools/aws_benchmarking/server/pserver.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -docker run --network="host" -i -e "SERVER_ENDPOINT={SERVER_ENDPOINT}" -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=PSERVER" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device GPU \ No newline at end of file +docker run --network="host" -i -e "SERVER_ENDPOINT={SERVER_ENDPOINT}" -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=PSERVER" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device CPU \ No newline at end of file diff --git a/tools/aws_benchmarking/server/trainer.sh.template b/tools/aws_benchmarking/server/trainer.sh.template index 301ad26213..a4b2876b08 100644 --- a/tools/aws_benchmarking/server/trainer.sh.template +++ b/tools/aws_benchmarking/server/trainer.sh.template @@ -1,2 +1,2 @@ #!/bin/bash -nvidia-docker run --network="host" -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device GPU \ No newline at end of file +nvidia-docker run --network="host" -i -e "MASTER_ENDPOINT={MASTER_ENDPOINT}" -e "TASK_NAME={TASK_NAME}" -e "TRAINER_COUNT={TRAINER_COUNT}" -e "TRAINERS={TRAINER_COUNT}" -e "TRAINER_INDEX={TRAINER_INDEX}" -e "PADDLE_INIT_TRAINER_ID={TRAINER_INDEX}" -e "TRAINING_ROLE=TRAINER" -e "PSERVER_HOSTS={PSERVER_HOSTS}" -e "PSERVERS={PSERVER_HOSTS}" {DOCKER_IMAGE} {COMMAND} --device GPU \ No newline at end of file From 1e7c69fda42e0d5f8212ba815e9dba0bdf11d3c1 Mon Sep 17 00:00:00 2001 From: Xi Chen Date: Mon, 16 Apr 2018 16:48:20 -0700 Subject: [PATCH 158/164] doc update --- tools/aws_benchmarking/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/aws_benchmarking/README.md b/tools/aws_benchmarking/README.md index dfa2a5f478..837fcbb851 100644 --- a/tools/aws_benchmarking/README.md +++ b/tools/aws_benchmarking/README.md @@ -54,6 +54,7 @@ Training nodes will run your `ENTRYPOINT` script with the following environment - `TRAINERS`: trainer count - `SERVER_ENDPOINT`: current server end point if the node role is a pserver - `TRAINER_INDEX`: an integer to identify the index of current trainer if the node role is a trainer. + - `PADDLE_INIT_TRAINER_ID`: same as above Now we have a working distributed training script which takes advantage of node environment variables and docker file to generate the training image. Run the following command: @@ -81,8 +82,7 @@ putcn/paddle_aws_client \ --action create \ --key_name \ --security_group_id \ ---pserver_image_id \ ---trainer_image_id \ +--docker_image myreponame/paddle_benchmark \ --pserver_count 2 \ --trainer_count 2 ``` @@ -146,7 +146,7 @@ When the training is finished, pservers and trainers will be terminated. All the Master exposes 4 major services: - GET `/status`: return master log - - GET `/list_logs`: return list of log file names + - GET `/logs`: return list of log file names - GET `/log/`: return a particular log by log file name - POST `/cleanup`: teardown the whole setup From a54962d36c5bd4e880ea37ead2826583509168ec Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 17 Apr 2018 10:27:34 +0800 Subject: [PATCH 159/164] update by comment --- doc/fluid/design/dist_train/async_update.md | 8 ++++---- .../dist_train/src/async_pserver.graffle | Bin 11035 -> 10525 bytes .../design/dist_train/src/async_pserver.png | Bin 169986 -> 169996 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/fluid/design/dist_train/async_update.md b/doc/fluid/design/dist_train/async_update.md index 344a44bde8..0318ef33c2 100644 --- a/doc/fluid/design/dist_train/async_update.md +++ b/doc/fluid/design/dist_train/async_update.md @@ -28,10 +28,10 @@ the parameter `w1` as an example to introduce the steps: 1. For each gradient variables, they may distribute on different GPU card and aggregate them while they are all calculated. 1. Split the gradient variable into multiple blocks according to the number of PServer -instances and then sent them. +instances and then send them. 1. PServer would run an `Optimize Block` using a specified optimize algorithm to update the specified parameter. -1. The trainer will fetch the parameter before running forward Op depends on the specified +1. The trainer will fetch the parameter before running forward Op which depends on the specified parameter. 1. Broadcast the received variable into multiple GPU cards and continue to run the next mini-batch. @@ -44,7 +44,7 @@ send the gradient variables to the multiple PServer instances. - Schedule `FetchVars` operator to fetch the latest parameter from PServer before running the forward ops. - There could be a large number of gradient variables to be sent, so we need to use another -thread pool(IO Threadpool) which a number of the schedulable threads is larger than the +thread pool(IO Threadpool) whose a number of the schedulable threads is larger than the computing thread pool to avoid competitive the thread resources with computing. ### Parameter Server @@ -52,7 +52,7 @@ computing thread pool to avoid competitive the thread resources with computing. - There should be multiple trainer instances want to optimize the same parameter at -the same time, to avoid the pollution, we need one `BlockingQueue` for each gradient +the same time, to avoid the racing, we need one `BlockingQueue` for each gradient variable to process them one by one. - We need a `Map` structure to map a gradient variable name to the `OptimizeBlock` which can optimize the respective parameter. diff --git a/doc/fluid/design/dist_train/src/async_pserver.graffle b/doc/fluid/design/dist_train/src/async_pserver.graffle index ea6dcfa2a9e4daac1500d98743a7a5a4234470f9..d2301611774fcb3866473e3e6470568d1e1312cf 100644 GIT binary patch literal 10525 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�wvE*1VtlmgHr< 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�mNt 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�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

    59t`FUDSqT2@?r2Ex%mvRpq&S5cpaz%1lu!Q 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%0Dk7|!|(i`n^H4D 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 Date: Mon, 16 Apr 2018 19:31:51 -0700 Subject: [PATCH 160/164] add print support to float16 (#9960) --- paddle/fluid/platform/float16.h | 5 +++++ paddle/fluid/platform/float16_test.cc | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/paddle/fluid/platform/float16.h b/paddle/fluid/platform/float16.h index 673e1bcae4..ffd183af68 100644 --- a/paddle/fluid/platform/float16.h +++ b/paddle/fluid/platform/float16.h @@ -873,6 +873,11 @@ HOSTDEVICE inline bool(isfinite)(const float16& a) { return !((isnan)(a)) && !((isinf)(a)); } +inline std::ostream& operator<<(std::ostream& os, const float16& a) { + os << static_cast(a); + return os; +} + } // namespace platform } // namespace paddle diff --git a/paddle/fluid/platform/float16_test.cc b/paddle/fluid/platform/float16_test.cc index d60aecf96c..a589e32b61 100644 --- a/paddle/fluid/platform/float16_test.cc +++ b/paddle/fluid/platform/float16_test.cc @@ -141,5 +141,10 @@ TEST(float16, lod_tensor_cpu) { } } +TEST(float16, print) { + float16 a = float16(1.0f); + std::cout << a << std::endl; +} + } // namespace platform } // namespace paddle From 936dfcbe8e391b144751ee8ef0d97ce1c705328f Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 17 Apr 2018 10:32:11 +0800 Subject: [PATCH 161/164] update --- doc/fluid/design/dist_train/async_update.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/fluid/design/dist_train/async_update.md b/doc/fluid/design/dist_train/async_update.md index 0318ef33c2..6a0835b761 100644 --- a/doc/fluid/design/dist_train/async_update.md +++ b/doc/fluid/design/dist_train/async_update.md @@ -31,8 +31,8 @@ them while they are all calculated. instances and then send them. 1. PServer would run an `Optimize Block` using a specified optimize algorithm to update the specified parameter. -1. The trainer will fetch the parameter before running forward Op which depends on the specified -parameter. +1. The trainer will fetch latest parameter from PServer before running forward Op which depends +on the specified parameter. 1. Broadcast the received variable into multiple GPU cards and continue to run the next mini-batch. From b821a7efc1246dd41e88800f0f045b5f2e0398eb Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 17 Apr 2018 10:48:18 +0800 Subject: [PATCH 162/164] specified pip version in production image --- paddle/scripts/docker/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/scripts/docker/build.sh b/paddle/scripts/docker/build.sh index be1565ab53..2b2a904974 100755 --- a/paddle/scripts/docker/build.sh +++ b/paddle/scripts/docker/build.sh @@ -198,7 +198,7 @@ EOF # run paddle version to install python packages first RUN apt-get update &&\ ${NCCL_DEPS}\ - apt-get install -y wget python-pip dmidecode python-tk && pip install -U pip && \ + apt-get install -y wget python-pip dmidecode python-tk && pip install -U pip==9.0.3 && \ pip install /*.whl; apt-get install -f -y && \ apt-get clean -y && \ rm -f /*.whl && \ From 91f0e3f887f0294d468f4d067b52754639a2a002 Mon Sep 17 00:00:00 2001 From: Qiao Longfei Date: Tue, 17 Apr 2018 11:54:50 +0800 Subject: [PATCH 163/164] Add distributed training overview doc (#9937) * add asynchronous design doc * update distributed_training.png * add distributed_training.graffle * add async_distributed_training.png * update design doc * change name to distributed_training_overview * follow comment * change distributed_training_overview.md to README.md * update sync_distributed_training.png * follow comment * fix typo --- doc/fluid/design/dist_train/README.md | 57 ++++++++++++++++++ .../src/async_distributed_training.png | Bin 0 -> 184568 bytes .../src/distributed_training.graffle | Bin 0 -> 8709 bytes .../src/sync_distributed_training.png | Bin 0 -> 188676 bytes 4 files changed, 57 insertions(+) create mode 100644 doc/fluid/design/dist_train/README.md create mode 100644 doc/fluid/design/dist_train/src/async_distributed_training.png create mode 100644 doc/fluid/design/dist_train/src/distributed_training.graffle create mode 100644 doc/fluid/design/dist_train/src/sync_distributed_training.png diff --git a/doc/fluid/design/dist_train/README.md b/doc/fluid/design/dist_train/README.md new file mode 100644 index 0000000000..2dd652d8bd --- /dev/null +++ b/doc/fluid/design/dist_train/README.md @@ -0,0 +1,57 @@ +## Distributed training overview doc + +Currently Paddle Fluid use parameter server architecture to support distributed training. + +For synchronous and asynchronous training, the differences are mostly in the logic of parameter server. Now we have already support synchronous training. + +### Synchronous training + +The training process of synchronous training is: + +![synchronous distributed training](./src/sync_distributed_training.png) + +1. Pserver + 1. set `barrier_condition_` to 0 and waits for trainers to send gradient. +1. Trainer + 1. Trainer read minibatch of data, run forward-backward with local parameter copy and get the gradients for parameters. + 1. Trainer use split op to split all the gradient into blocks. The split method is determined at compile time. + 1. Trainer use send_op to send all the split gradients to corresponding parameter server. + 1. After trainer send all the gradients, it will send a `BATCH_BARRIER_MESSAGE` to all pservers. + 1. Trainer call GetVariable to pserver and wait for `barrier_condition_` on pserver to be 1. +1. Pserver + 1. Pserver will count the number of `BATCH_BARRIER_MESSAGE`. + 1. When the count of `BATCH_BARRIER_MESSAGE` is equal to the number of Trainer. Pserver thinks it received all gradient from all trainers. + 1. Pserver will run the optimization block to optimize the parameters. + 1. After optimization, pserver set `barrier_condition_` to 1. + 1. Pserver wait for `FETCH_BARRIER_MESSAGE`. +1. Trainer. + 1. The trainer uses GetVariable to get all the parameters from pserver. + 1. Trainer sends a `FETCH_BARRIER_MESSAGE` to each pserver. +1. Pserver. + 1. when the number of `FETCH_BARRIER_MESSAGE` reach the number of all trainers. Pserver think all the parameters have been got. it will go back to 1. to set `barrier_condition_` to 0. + +### Asynchronous training +In the above process. There are two barriers for all trainers to synchronize with each other. In asynchronous training, these two barriers are not needed. The trainer can just send gradients to pserver and then get parameters back. + +The training process of asynchronous training can be: + +![asynchronous distributed training](./src/async_distributed_training.png) + +1. Pserver: + 1. Each parameter has a queue to receive its gradient from trainers. + 1. Each parameter has a thread to read data from the queue and run optimize block, using the gradient to optimize the parameter. + 1. Using an independent thread to handle RPC call `GetVariable` for trainers to get parameters back.(Maybe here we should use a thread pool to speed up fetching the parameters.) + +1. Trainer: + 1. Trainer read a batch of data. Run forward and backward with local parameter copy and get the gradients for parameters. + 1. Trainer split all gradients to blocks and then send these gradient blocks to pservers(pserver will put them into the queue). + 2. Trainer gets all parameters back from pserver. + +### Note: +There are also some conditions that need to consider. For exmaple: + +1. If trainer needs to wait for the pserver to apply it's gradient and then get back the parameters back. +1. If we need a lock between parameter update and parameter fetch. +1. If one parameter must be on one server, or it can also be split and send to multiple parameter servers. + +The above architecture of asynchronous training can support different mode, we can have a detailed test in the future for these problems. diff --git a/doc/fluid/design/dist_train/src/async_distributed_training.png b/doc/fluid/design/dist_train/src/async_distributed_training.png new file mode 100644 index 0000000000000000000000000000000000000000..3b53ab59c0cd7b44b2956f16f1adc47fe85909d3 GIT binary patch literal 184568 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 z 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%0D{KIfR5Lw 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 Date: Tue, 17 Apr 2018 14:42:59 +0800 Subject: [PATCH 164/164] Update parallel_executor.md (#9959) --- doc/fluid/design/concepts/parallel_executor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fluid/design/concepts/parallel_executor.md b/doc/fluid/design/concepts/parallel_executor.md index 9aed3b059a..4f88e27bed 100644 --- a/doc/fluid/design/concepts/parallel_executor.md +++ b/doc/fluid/design/concepts/parallel_executor.md @@ -84,7 +84,7 @@ Running an operator can be asynchronized. There is a thread pool to execute an ` ## Synchronize GPU Kernels -The GPU is a non-blocking device. The different streams need be synchronized when switing streams. In current implementation, the synchronization based on the following algorithm: +The GPU is a non-blocking device. The different streams need be synchronized when switching streams. In current implementation, the synchronization based on the following algorithm: 1. `OpHandle` will record `DeviceContext` that it is used. 2. In `OpHandle::Run`, if the `DeviceContext` of current operator is different from `DeviceContext` of any input variable, just wait the generate operator of this input variable.

    |vnS9S<gMvh$i0oV!3`P47TZKR zCUUdv2xUVG8q=^Kp0oDTrJP;zA^mr9MvZ}V1eJ=Lam9qyfqk5ef~wgik=O>yVsXcBsM29TtqSpD)UZPVP93nuvx@b zZSjp!Q?ntvIbY>x@saT$i&KPK)EgA9FrWHf(0LAcG29}GEeM%5uqABPJ};@^W;C=~ zxNTDs*tC&@@rbw4sQ`i1wqvet2RfkxWB_k>DtB=mDhxnHJY_8I*^7whRc0f4>+`kb z)Luk&?*R|5f!}M99~5N?0h&*c);jYDTl|SR z!o-o>684tb10cP0>K%)W*o7(UR9h$n3e zn_sbt^G?&KbNuj%a8=H+KCkaZ_Ddln|Ih2m+N_W)Xg_`}HR&rZ&9$(Ny53WTT5H+# z^CITYs-eqx`hJH~hU*qFA|!;iMf|yehtSBy7k)a`v9jE6+&8SkQvs8hPlIajO%j2i z!EUMrt4+!lQ?K#x@TZ3PGpPJr@2uQ^fgU!p@Y*onnvK3cz6hH*L6irROqK(*q@ zlVf22;%S_{4f(HMsl#~jvtA5;7s>mD@KU6;X{(PWRYQ(H=xIn@9o5@U9qzpb3JJE# z=C#8iuIE)@$G=7;jgY7W6iB$MVhz78V26%m*x=9r@&x|Kyk?YN_tJcdbi`Hp?&H_e ze?9QOUjR2yLls~@{&k_B#n-$24f6dmvFALK|aRD93 zcKhj9gI{&`+kH0w{WSj?wIA(K`_ebetAZV;u3fLe0A5&c* zxyAR#{eB6NwqaUA5Z>~BX_Nk#)}V3Qp9lZ(3&ICgU=9BJ?PC8aZT&qx7X@Sgxzv6? z#s7Q3e^|o*d%?fW?Ekkbc$gO9|61Fc;$dH=UTQq!{RAT5P9c?C;g`)8i0IufP;$PLKnjwT$io{LS%I0-{06 zje3sY8<&rEOKsIgs?sz3uv9$28>X(H)}19B$-L5dARK`=Fh5!@L-rkcmZM zUn)9b^*m9+URiYvjp$%u7swN*>9>z|9_T%60QE`7QDGtjt0x-|hQJuEfJdBuUP$-H zIsu+fO9f8Z}I=b1NV>M5BCX z7fH}@wuW)^Zl#~%nwHMSr*A1`UFzmsqq*w^#PiA4^zRv zahucsuMm>r4PNY(P-7UKEd?xM!ep$j{Tzn%TY!)`+US3sIR$tvKGPrm(|mVO5KKGV z2mKC#bCwUWZOa!KLG_7A9dy6BI^{#H99Vq&=%X*BW-X5GGx;=ZlDR?T>IrOP{nOLp zm0==m+1*_2hwQg(QmXC2#4ow=3Ytcii2~fMy$>^sAGUh)jqq!aW+ZAUXIo|r;M(4R zniV6cV+0nR{{S+xOQ1eH*v6K+{I-%1PF9--lMsmQ)lV_zI6WTnbg~4h!?Gt}(1|fl zzrFO&m#xGFKa2>Vh`Cj_BBdXFd0syuSHpWPlG!&v8;JTi3#C*ACn0`V&u+S6Zjvv_ zq}_i4xdmtEZV!_rfIAvM(Et_(g;=W9IfN7?3>T(Xq?GXY+FxoPtsHmP$G|H?hQ(dC z%*EoLtKerGIc|4Wu^Yl7YTaD4a$N7Ap#Tx6`|Ugii3;2put})cP!F+n9YH zfrkH>T!0y{KsnX-9+NByu6Nysv5n#@p@?q*Phy4IjElyP1SUDEU_0yQ9ex>DSQKq2 zjyI4@W0CQ1g=0$&W?91ckM4}{h)&YX>wY?Ep0_s%yFrX5%1Z>LJnW|;*HghYQ z*u!4I%IMh-I1q&X8zq$yAi&6WA|t1X7SBzf{$q;^*YCXp)a|bA$J1c8yn)V{?RHda ztf457)`AMclVPMy3y=H=|F-HH#=csQ=sVskS}zv-XIR2`aX`leqSecPqmI7=`}-$d zfGKMSay9QSlaUL3?x+acFioT>U`BxO^(_Fref}8A2(RBX&I8FFpZz3#V2$z|1?Q?l zEIcDiYSWxePNs=J%iK~e(yI($ejk?n|9dp$jM5YmPROl~c20mxjgB0JslRt?27u1{ ze79~4IM#gO;ZlFZFZvV)DkqCRrX|t{1Z$CZrv8%JI=*QjQlA4dUVBm9ZC3hmJK)L4 zvD)$f8}WGHb>U~E3;^tFQBRr+Zs1Za!5i1!$n2?9?MP^X6Aw?4PA9{R!6>h*8~086PhleVHMrpmqPy7mF`D1d}O$$~0w+F#(hx`suO58&vl8qsed-U{@Flk%j9( z%v3j_Ku$w&4YIZdvUdyKu-m^Bz_|b<4=1f2ik6PIWW9+@1 z2|JtWT|&>o`xx4QD$l6Fp`T3o;p1W+R+?DT$+uQB3}MJL1(LJW`ge5x%aekrx!M~I z)Zg1#=uw=2Y$Y#5R+iVgL~X1fhjmiz0r}qel1uAe52{@)y=0Pz`LcuuyR z;1e3R$G!%w~=)~NAZvVp7{ z@`Bb45dHX1QpO`Nl?d)mQmn5%eARtN@&BkB{sV^#Sny%>Dr~V`?w+L@WvwT$stc(8 z7;7)NZJ$Qj9snjhxk`xb3j7NcnXZ!xFM~gDY9buN(7Ng4lm7$pm*<(HG~*?H-Ln1+zO4~ak@e^ zlM~i@khWMzo+cfP0FcsGETILQN=uPh5OFS@+b0K+l!!e+oq7)hrHXaH-YuXwT4Ucv64__Rz0P~{K>KNQM$Ol>Rf}_tr0Ktv|!SJ@= zZ6DjG(%WcfpHeQ2HW0`o;9On-aj29mzT3CU?_;hhA{6!Skzgu?XExcf_ffDZFS}8w z(*4gIC|uY2Vgdb_A98(O13RPdo-eg4P)Q|1@Q_PVd#?lRo0SW0-Z+PMG^+rsh zs4L(_9R!3^B@U!ts^?vRiJf|a5E63n<)tB(R$<}?6t*Ksi_@Q;sEiu{gjwBh>I}{Y zK-8^o{<`YxCl`RYN}egWl8Jfm+CC4;$Y*Cjq4WiUcFC+Zk>*N}K3I>6Y?d5?){_1C z2FF9zPe3~i|CFz|cK9V|`uGZ(o5E8DE>y*i8)i&~Lc6Kj8tGj5)??anjEcXJvE?|( z1pQb0=wH$23vH-|wLZ?;3VYp|WPW9=$F#S!489!oZl-^EBI;Xy#`wIUzF3k8%>GOVZNpP>5Fn^GVZRi;z! z)Ok3ymJj2?F3&PYN=yC41=g_x*75YXuPcx&JoHq(3#U zh5an(_XAbeJx~M52cV+%RM=&q8K9=8id<7VfTD)-vJOx}B2_m;~%SV6l&RkFs-vDg58GSb+@!ELPdc(YIzBeWbNU zT6-9O$|HfX0Pw;D3asZU0SVxvjGAhgzXB~A1$ed_393{1tO&;VrLC?i?uR-hx+a$-obs11&)>P%28%AFbe#k$y48`3#fZ&!!?cr$V*L3~ZiR zg9f1{tDFRnJGxmEVGk+X`*1ehX0_|c>?Q-2`4JE=Vz&_(SfHBOD z{SZl{e4l}`dTbiy$#?F&V)*hzzG-p)qb=&&cnvAlSvzl7_ZsrGYo`m*s1_COR z&%!z%yp$M!yO5jnv5;y8t1i%FQf=B9OfVSvIA4j9au*4}fKw1A#4O*+gd<;_cHZ>M zJ@J3H!34ES2{Mc(gve+j1CK7BK*96b2-H&;HS#aP#1&@bgT;a^afIXdT-8D;=D}y+ zEukeiHVTXmOKl=i5ukjE=CMa=n;W(y>NH#3{K|_6L@+;7w>3PjwB^pj;-4cEyRJAZLX# z<`f*k#O9=r=`M&-5@FTjBN-=5Xb3`@k!!nv%_jvT`gn{M&9$sT>G0VozxWB1o$4N8 zmNn`h7C(4m`9!~f(%qQICPhYch7btJv&}A%z-1%5`(e_ZL z#1U3&3Spfk3wKx+NJra12PH@=ajSu>LL@U$`OfXZ4W{l2LMn%z z?@zdq9;?O$#2XydvD_ z2ZN7swc8cyJzG#CS|Lt=M3OkzeJ9|&_qn^DBnZb*rs5pda4A|`am%wOceJ0MIvOH_ za_0zyIGbTPrw&bgPb^#hn3qOQHS*zc;l~CvGKA}*X}2m+S7k5d4#}8y9E}vtFdk~! zIPQ|SRXaLO>tktMs0k6>-hBFBJTE^5{BU#6N*32Wz*?;`dTij~QFH7A{Z()1!R-vU zOD(JqFI0)~+_}jNRC=@X5%wS*Q4sRmayt$ri>P$gxzkr;|iooFsB8h&?4~F%Zf(yc6C9fpccWGkvzj;AU4^S4B`SMXqP<0 zNYl>B3a8{B(uKfCs0ac`?sa0t(n;Y!Z2hF zJEu-hgl(tgZYsv6F~@|IY~wTks8srWPm&uTJ{b|Yf9t_3Y~Aq@kMcha3M6{|$J>M! zy;mU3E)zlJA?$on+6upRx(7s2m)7ykTX>FKp8^=%zkz5lKt18&@?_l`6>{)55c4kmT}$KOXw*@bOYzXXgMdWiJ$0xarC7mUvq`LJ$UkYb$yAmS+C`;7cGb_Qwl)SsD{^aK2^Dg3b!kUbEh(Y=Z1U`y*7h&T8;_hphr6hmcC?_s3^UL)yEM z$y2aI{Epu=EzyR;nWKTm^G%RdVHWpqe5ikFtI`tuOwgqA@5Jd<23#k4RQoAliX3R( zJFgeLCKn1&2E@WQ$3nDa<0f5k_#_nwDAmjbWn`=`q(NKV9%5zzbe|vMr!CDRbGgnyEt`<1d0z;sKi5 zSN*=u)!8Z_PBItkAS?5%YaOQ7(^LdjwtPl^`bdA(CdV1ZzM#}NJ`XzagLQym(bxh+ z4WRzl1in$FC~G8w$<=fg?bID8C(O~qIt!-jOm&oo@yc@ns2Wswd~pL3nYHCR+3xSg z;1E%6tDUGQi(JQ7T$!nSjT!n48vi!TFjiVOplAOIg!ksX5z(>|_-Ddud5n!0r*mMfo!H1>^wnyfL36Q8+Wl=kJE` z7WaE>Jw3=QVV<3`*6~oO$~`9K0MNmuuT|e5nvnNC4$8#!HX3wu?mYZ759K@_EB^#)bK|{ka-UqgY_T&eNH`oziAhmL> zPe!+6C83yvcgy;YEk!@SOS<5(DUEjs5Pk;Aa^*i-n;V%J#~0{3yC4=qdN7dwhuZ^e zyBeIUidIFcxgdXkMzpl+IbPwkcrM4b;!2u^B+ZZ<0g5t`T1gASb<1(i$P%6sE?{s8 z7BMsbg+VmM;oE$_<+66PbHD~wk_M+60VBI_i|yiMM9Z%N&Y@@7tFjTTY8&)f544^D z=!X%oyV!bKZQjc|;ZcpYOxHB+2G|Djq&IZGNdg7B&|7^UW5cHuj8vxkfLhR6e;$O5 zI!+=ZndRv>Mrj#O&JOxdYG5VxuzI|%yNL-nzzxx~m>STXgzMv`F2eko#!hO^`?qd8 zj18Q4&Vvt!_L>1(1~PFqf)>UG4I#R)OK{`wbq8_3Fk+b+LYp}rUe0Cs!O9Wv8!Ejn z)uYlg7#MVRqW1VZjjv$+{xc$Ks8BrpCfr?^G=bU~DM@s@4D1%+0Ay*l<`H!Cdn{qY zE}*qDB|*UXwKLhy>hhDWa{!Fc#SB5^1nLWubqXb7y~RKyQ0}^qU$j|>zD@IZm!fk*LT>CY)5R9H#ZR%h82X@!tErkK@$ zj=wqbk2Vn89cbw(@Vfm|5RQt*c?aO=B^~XiN=Lv>0*0IY6(Fl~dVUrTQg5?7lp0vQ zA&dY|-z@AFYCyD~z?TH6vlT>LVUS*cwHz<^_HrsTG^r3; z@dkIf(g&532Vlpa>Q^pJIX_`gfd%R=$cm7#D5QeL9mpCzU~5_b0;nqh_wW?d3Skv1 zAWOe%u>-tT|L!XxYb5d`caul~+kmxy5^ zH124yT~F2&YCm*V3w44F?d+u|U@sHasBu|u3$KL2IBe5-T61&d0#P(ODgC_D#fLwa zlx8;)s!TILxE%H4ch9!hgfG|Pxi~?E@WuQXsNX2j9F8W0^MI<|`KJt{r1T_J&K9dM z7J#}W?pn8l!cN;jtvFutw~IJGI)f;`aEXl+SqEbp*A}E%T5H=Z>(Xa7Jx~nWw+YIA zJd~hE-zyVRdk98t0`gG4>`3hhowX7C_V}qpuzu3+33iigW*E7I!8WmJn^a+2&4JO_ zo4e$!u{TQ8)iWR|2b)Rs9w!hV!eq9oeqhH8*xn-}*#eeoZ+y|=jzHg?W(dOG$0m?_ z<=~?8(9;*Y#Hjw5OjuvOxjv-~*p*>Se4uOa;u>Gz1Fm#`CzsEHJIeBMUIRSi3%=hR5iGWZuuN0bYv{tL zJ-`awuZ`lZ>SoS@s-zDrdVl0Fz#k$pgCX73Bj6e75UybT9gf~*-S+|j&>(*3H31?w zWh*^~ubX9E_!=o2E)v)WMXE$YeB$mWu$)gp`Dy@}2u98D=fWX!ASaDd#1Ce$SeDa!ryZZ6fz%66eg#f$;;~ zoO&w0Gazb!^XC?@3RnRB$UK682bJPEuw?eYk3Q;yW%aeHqlcg$QF=URLx~+_ZUWTF zx(DYt{3ICRh_&5fdG{f6&K6j7#_s)uB!YNh*Uv}?dN8;Wx=~YUqZ0MNA_gWNy#=lH zJ4kB38`h+bo3-#LTq{Ua_DJI7Hsnns%JP_MvYF-+@aba zkNFQZjt&X@umYw37R?f(fsm_Mq=Z%c0y%Q13`L*tt@UPRgtd+Myne9jhBrXK7LR=( zq_%QXA_|Nd+Bhhnqy8hz8BfR)V@*vUTT0M(0zcW2b&L8t4TR?Q;dTIERfv?RVq>7V zkd5Q2YRMR@SVz93E*e<|mgH3;Q;gF&TdKB~E&jb&Le;GsqVCF&V-ojjP{j9Tu4-P3 zTV*ZHZZpFBn6JH1=ExtXmSk@Ln}Bjuv+TrffdSx06IBMQsJnAhs2-g$ZgvSL!4X`J z_qdW=9zEuAE-zKz6qYOV1^YLh+iyQnq+E^8O^~&k7#VF(E!&& zhw^vK`AE;>)~I{&l-&Sb4ndBlpCGM+TLmdMLl2$S3IYZ@PSskoA|M`QhgmIO{I$1I zqI{^SwlD~GyunPR`ih?BbEpUzel;1cV1z`K`% zsC)z{`5}^LAx{NCuZtRsd#ifzxh?;9U{0t2GX&xN9{oI8N)jE}+JOQ=pA69z;2}XF zCEV>;mAytT=p^*D$G6!L?qby>D8rGY+O{ti#szhy5zVw%cQtQc_c*R9mT@S|UDTG- zN2_GioOS(w#C>H{RcjZnZ0YWn+=S98s5H_gA|*;nqm&8)!j>*6rBx6lq(cNjrMsm? zB?S}|5ETLO&UL=S=6v@%_xBxxF^`_A{7&wS=H4JpK~LhZZ(+Uq}+UFRjx zPX^w)cETo_$A$mq@*w8*Bo1rv*B{y8Y(TT9SSDVwk&Y-&6}$JB9}si&5wXievE5Ar z(iCUbk0{TA9hgn=g*z?yRIx{jO@|X2p^h-F%D*7;0TUYd+Nt>1VrEJpvE~CQaA*>< zZC_^)_-;4-b|O?R@oiKf>#s#8DDvL@4(}S%47W}4ZR6IW{l&Y9qT}&TdzKXLayczi$fRxjIH+35l!Z=P`0s%rTXAI(Cf&m@5IF1 zksgDJ3{oMZwr+ni{P3fsb|xIguxnMwB|Mou6W8e2h9+R^?Tc0(e281a0Q}EMFzh z#~FH@u4qiJul0arfa3$}7C59Q`LqUblWMg5u{)U{tG zn+p1=vq>v~Co(L{$7N^Te@oymj2v?0h8Nm#&Ps0YA#JrXSA{(~lrKc!KC8zhzY8Os zCkHL{Ih?A`>nZD%WLt~9B9|A+cOa08Es_Un;-9@sbvN@P#-osyuoA-@!5i^&3+jxi z4R)~23xqIg`ya}tgvWmz9A==gNH~(tA%dBRj7R6n?{L^N#6;qK005;s_)_L}RUZw&Fs*bGnW@lXy%00T_`&m z{+#CjR!^ny&3*kFwK{(mnmPtGOOfPt*P!tOlPoobWAl}eU~z&!Tdi449xwdywzQ@n z%a&hUYOFYAsr?zi>=Yun6cT%TfN22vQz~Z6k4BH$`E-um2pF=K=J%GZPfFn)>1eMA z8nVO*piH79)xUH0@{i7@x#00L?R=++D`k5a3v1q4471~}KW!Sum_ ze19lAPszdCoybT6awKOc1sqs%VY+!0$7W`3pN(qYSq&LUHtnT)w*raW>`SrJaRl!# z!&YZKKZq1RtxJIrWJ?hqzLLmJBO;yoKw_*hV*$8JDeq+i!+W%y{?xZ-Ii!IuhGOL< zu=djk@$Om49u@JoYWTK<2C(hJ(&j24CHto`zUk=oxKymS(twsqYC4KGeP^ zvV4vms(MEr9GS8tyxwt<>Ak5nhtY{Wf2!3m3ijJ@BpK9Ad-hzBVR*xKvNR^rL*;Jp zjB`pjD9evc0W!Z*+G`mJEa!7S zi+vb~VQ)xM!MsMtJ=MQm5_A0))P_gW8g<(0cgB6mPyg)|nSSIi0n(){pp}SR^D{3} zUV7(f>l^;c*w%7EHfAbO>8RLFR^rd+%>e)nF4DH!WgvDpZsccUv~b1uoPV*mA)Uz@ zu_3W{P z)iD7~tSres%*2pBuuD19@=E0HHvpYB!8^AC6%*!7=B4`6Ou;^fa=>AI#oeZ@58NjF ze?j9yj=xBy@|vG2-p_c(me<5s_7;-#<6Fv~w)oZo@lNY(LH82T?%*n+>mY;SEak)- zn<%1YvGD4XA~@zviBt7>)Q;!NV~_FGapgmy6N2>L(8AA@W_5&u`|9)r&(>NuE%SbhRL z<#}NPD%h?u5aboPf()REt*!7|J;>1{I0A;15J z!|HZo;LN(}f3AK2Sg}Od{}2cV&+_jK2%dcb#s1N7KJ0z}_dh5=EQ2pxuYXs3_zbZh zj{MHPl48I*yUdxx&gcL7B*hER!czS7?VA0+FoFmzyG{WY_|rHW`TzL*r-)wm!n>;{ z58GO>z!do+m_U#a?h%md|JUFCeRuE=3=r4oqE9#K&9JZNzaP@SnCA`}5h1yFocxaC z>)XG_U`d0-I=}Ghn*eOh08Z-ECpE`h4>C#QO6-USjejk^gi_w#h!H%JG| zL2@$Y(3>~(6POrQpwpowZn?Qe$}YbLg>6K@ou~hZ4L`r(joxWGg&}0645_mZy#l`| z&_ij)9)qLf8)Q}`kXA_5R3EMtM{jt1vA0PqkZ1ANU5_fyAjA~H3(0*SfdD74>I>ea z5M*7d?ECP^SrJV^zvLU8(Pl1}zk2zhg$TONGl~Ux3S@x)MnI)Z8Sq=c#!td^&lf2n zq)Z<;pn-U5YYNKSQ0-l*1o_y>Yw!IbODP?-kUq59TjYaH`YY`;R&YD2F#`;l^4=*R zn5YO4{{aA3>!6Vy0PjS_H0Dpp!7ydSogVnx1$09opAhjw+NoLYG=ha5Xx4!Ghs2o9 zRodk=UVE4lYbH46B0bPHFW5mX(Aflq?7|Xyv)-A5Kn03V?wpWs>R{sQr9?nA^8Ho4yGeA!txFkL>;{SMK&Qu?h8W*@~5 zg5T4BhtCe=&oW|`T668gt5l^LU?q_NxXp#b@aDZVcJ*gb5iMIzN31^p4bxxs2aGeP zVnGv7*O~7gA7S$zRAPE7kMvsWKlJZDo=?e5@$*8fAae|})F)7@bX2=TdE^vuP>2j* zFq+?|7Crx}dj+HwQ8xDnILOtfz{zb9=?H)qK>0NJk;f{8CF{Kf=5ARN&-VuQ4_d;= zavGojVee;(cq@-vc#*j&+xmw97#wxYzog~^MPji@l0IWo>ri0jx$k}c^AmiMttj)_ z2^uC_%vK0z=GUS_3FUnSIdt(5V9|gy-Hk)DVUrw*yL=k2xjdZyS1FXaSt`jB54mx)HE_m ztNe9VTA0=i^;?v*FDLT)@vahI?(*h)qzQ30nw@}(CSV;(ZDGFvIG*=czX)GhH{%Fz z7f^F&EG=~XGIV`z?#&NB(M|#Gu9oQQP{{>O4E3JEc{)Qc=ok2VXJz@I8gTImF3<{~ zn=_9Uc2LJ_Pmtns*Mb1f}*59r197gp^g> zj*yzga2{^49+bI%fYd@Px{_~oU0%!-kQKQ?FY7qSL0kk)cF>xiX0H(Yi(0Mp1lMur4f;%>;&$Y;*%9b)2h$o zmB4|Ll;h#SI^@7m({SurGFG^~t-%YsYvL4#XMst^6P_*5E>~uDeX)`!8(=;(t`@@x zwmH{GS!K!}cHPkyABXS9UQ-1YF?16QEApLRl-rl!)+8l&KNXdgXSqUa3|RQ&T;RPp z?`*J09AjLhoytQ!>j4%~r5DNu8U56Zw7X?)UW1T-ov}$6l6e~5#yCY-S-RIM4R z=|wL~;2(FJP6QsAesvJ6$@FI6xs!XfvU1Dj$Cw~gZzfq(VQZWZ*sfPkgDyN_rLt0kk@1_=HL`!rrQ@5qvU=`!NF z1x$AeXsR_pUr0;}PAc2t^Ng46rsiUr=JVR)*dP6e`TI|Jif2PjQRFRMuBARWC)0T` z(r!~Bv2ExE*`G{h!qArSm*7B+K79=iEvXuHi)fT_Y-|&c|%8m(&xvi+r0*S^LH}2aW*Wp!ILTyJpeK96jZ~JwO zeP-fIw2{r_=b#OCI9X7Um+4iJ8h@oW=pGY;4xw_QIGn3VGP<@WH1w=(1cjk#2+#t( zS}4*g1LwU&2dkF>Q+;kWW#zf0-1M-;I{bqdfj)vWPqD*zfG{~QVLYO66v3uy>cu?$ z4(HZFW(=AIN~?@1Ac9D86@^&uvD3z2i55`tov!tmybmt&h6SX~wl{)NQV?&1xf!(+ zXBoKbP1C9raTRZb%S5O~>}ay&HVV~D+(Bu^Yxe0lwt;-L0F>^s^(VD>3ez+-`bJgR$v1W6u^Ij!4km9jI^aO74h-PxGzELv<)>i&C6s?VrsF> z_lt95j&ntss`2CxxuoJo+imw1l7!MkYYdj>kR z6(8pbr-PXEj*e!&{A6jCm?`nyGVHKn?SH9Celi@_52fIDk8TE%Grl4uSf?H&b1jvm z`SXZZ3K&X(`MOEF-2`2tZ*X^#-l<3(2K2ARuRs&1OuT~DxpRTgcr?r4--O4|dKYSL ztTs&dp^hYco^p_Kmg4m3ow-MTpdz+1i6{=swyAzc63`=SV&P_?qUY5)AxH~FeJN6O z@MDH~QhWy66LnfL%`w86iSwyvnsbTMuC*)4)10Vdn5~9lFU*1H{Bj{NeJDpg++$8! zTf8{6VHqTCFig1$<%mCQE^i#2 zD87ofSGy9?9Bpv%?;`ns@}_P@@cX(Fv`UK&Wix*WM{HPAEqQU zdc}Mf5c~qPD?RV790*~JyrX8NYNTAPU|4)FfauAi_!xe>Tld=-3!HE?qok8d~jY}!T%;2cUyn!P-*tW?;F=pG}y&Od}3+1v% zl`nANOc4T)E2|5EMXd7v+rVR~c&0*g!d_YbpF{j{51yyaO00+3!F43%P(bIf@cfj5 z7+)+muVHL#?F)dK@r=(pw61tV=~t30fU=IJDMj}gh}ns+6r?M&uQ(xCsen}}h zPyhgUO=<-3i977k)?)7auQcyjZnj90l~fIX4gGxZTES_4iefCH6aU~#zz$pFDDQ~L zVU>{DW9>>!BvZ(cINWx(s0MGBU*297Jj|T`nI>bRz^Kr4==ne!mYM$Vf0%U{9`5JR zf&PD7@1K7xaD)SuE@0Q90UL)8fc1Yi&L>3a@c;J3UQ_k2-%s%rp$;@*L!JnZ zPpgo_oq3}paXsAwX*30)?ux0EnF&%S4}|jzaE~;9_bCrNy*znS%*j5Ue|uz@Kx(9Z z4!h_VNGIDqft}YmCO>|*=J zOMo#R?u++L*x<fy9aV$~wTVPgBp3j_6VFIc~RftTRSXxk~Wl zZRpqV>@#cn210@LKChL3zPN+8WCb`v9mM%Cq-+w7OoR}*P-G0@vwqbRP&-l>hot^b z#m$cx@%w++|AbLacBMb440k-=X;@&VpZxgRS?WmQv$T&j%nXwg?V?pxbI(Sjg?%M?Ve~QQ>Fa9|3yS>ow(Z2Kj z^GVkUcVJX1m*PP2)02-Ic?V{^^-4JOi)y4xI;{tnnpSWvf(8+3!32e8sNkL1%B6H~4rYcT{>Ubk4dmC2xY1`(yuuo;(@Gc(?n| zxCYQ)bc;=aXLplLh|VRKB9F^oR|v($@h?BexyoH9#XS>6TOnMna+0TeNL=X-xo!>R zpQV9Ee^&Azy?1XRL!7Q3P9Mut0@wWnyo9%UnKIVS+mRaK4`r+xgGiagC$!EhD*8hY z{Las>ae|KeZtokI%+?SUFz7SWdTe>1;qx|B@?GbX`1J2WA5Ggj9AqjflHZp-fN1ZB z6OE~~u{mTzJBP^&nA@&NZlss*BeSN6ea)Gz>!PXFex@ws&gKFYA01_kd69rA36uqB%P>t zoFK6tv=+1VPCpseAhI-amH&@|(#c{q7fKwefBhkRc*LA7cB7hX#x>*g&8xkOy$%@t?!PPTdPQj2#N7Qxs1#FJwS^sXhfR&u9G3%N9e99-8$7jW_e@s zip=bfPopF>%F~#RSeEeoa=GZR&ZZ7fsofW=*nRurx=Yg?ynLOsJ0~2{vww27`*z-d zA_321F2iG+kB_ZErj5oSIc>Gr8K`=xI^T4-@8k!aO&cBBSgRe-_sz$-vKa6iWCe*m z_BOuL91#oyAJBOT#<;nQz?1%gVhZ%lN7NZ8$hw?{J3oC#n|PSuk|$?1>A&B%hBOYV z-^%$~_t{1{kEg#uXHhJ_>>Bg^gF1VFQKg;c#mH0{>t@_f>JS)VUjlpg&ijpSW?N?| zL79pdFP<2$8LM0F< zFhHB5L(SI_g08;dVl#>K*%s4)BJZ#QX=9Ee=tYZ2R*?9-o0o}lj zXHgZ<&XudZzUz7SYnUhVNkQfR_j|+~vA?;sc{guK%;?AJWT9BBoZk24p_b$1Q&s#y zc??baI#0SNm7&#(bgO}a^ygLR5M+i5Bf~~N`QkYax~@bX?aa9>^`lGbmFY85(=ZfG zRdf1L1yAek_<}p_t#Pfq{q5QJJxqDmhyui@w@%)X4OMpTB@K|)9((0~H{SeyCA*H$ zX1dA0MO#J0HNze+1=WgeYGRI50Ro z+2FV_HsKkJPZn|AQ30Pn{#!0g?1F-Nv^tCN6=zUuE_s{?iGy6^*vs+@l6r&k>im|k z&X7gKYs`ZxcGs0=@0I@z{Wh(Y;6g&n^U?nn10oco2r0L(!MsfL21i;uu*@@Ff~t~9 zi^1*h$xss;Y3J*2tckxYCiX=FTt;*<#D|UtX{$W%y?BbkrknUZ>}b@+RC&+?p8I>h zHg3I#Xo(04j;Pj`+mU^Kms${EWD^{TS`HW+DK9KGt4eHWll(C*sP_2@Mf-B-o658Q zdM?c6m+j8rpFSSyH-NK~2&heIcv_;YB zURk(J&LocOu@21(jplw8k5& z_YJ=L=5s5qdXw$@=Iu5wx0*~FoXxBLB}_x?-iuR&f4{r6qB0AI;g92Qg&;)3@|Mgp zd*%OYe|+f!fo}*1qxQeP_+uq}6D)E$TV_qPn=+qWZUIIu3!~2Pjml5X7+M|o9t21e zz8Y?&2SlBv&R~4@cA}i$51*0K3UG9`cjf_EaD6O8oQj1(&{VOK>e~hs-6awT{Jwv> z5>W8q<$8bngEZ#!UnJwpuIye{R)WQDc2!&bdu-VbL?Hse{h9(ND9$_(zY<0FksojY zOYZMQqY9fg#~*(JSb0`gZ^4}am;?J?SRY{ir_fGY0gp?~40O5dg|a$c=6Vm$$f|^q zZqJTAz0mVfO4`Bc1B|$64kfXDGV#o194u}oG!5p+A1TB<7je4Vr~ZwG&*ts0nds$# z+;ePF&iA^?ly{-3Qv{7Q%W-);0Ze_9J;^R31xmpBSxOtn7epZ>mzWLiN?g-*NES?8 zlx~Dj@o4eSOB5!YUy}jAlDpZNz%7}@6uVY9_~S}_eZD*9rPFj3Z;9&PE5|}3=w`0{ zh2OhBZ_aK`H=wh zB2%WOFcOlE4q%t{ZCs6e{;_7!< z(FVLF@aNOekmQoSu>tUxUB*4@S44(8pr*U*3SU@T&FuZ#?SA)bb?0iU5m#@r?~1>j z9f2j(KL>UT$GTIA-$OKKv*G#PdO?*%%03K_n0EX3p3+NM#So%wiCFOn=#9p)E$y@@ zcpPCL@eoddC))j)vXMT^7IvMxI}SvJf687yxuTG|!=NJYuLmn7<{qWuAFfCO&xce) zosPYj^mcWBdoiLddV)1?yJKb*Hh9v(z|gZqMpndew_b*DV+=?F7=8+m_{#`5ul2C~ z_OY)b|FriqG%ZY zs|u2|&mdNHu#5;MeP3a#t|to@3U3hEd9k*ga%8op%}MTG0VVup6QyD&HwDrATJ#si zs+I=wGSisdm;|dCDubPPDp|*{>0~>Gk#_L*o2{q^=bUO~QhW$7THea{q`pR;xbSpA z#5DV+ZCrY~lnYWJsy)Fyu-JW{WR|*Opt?zVa67l)iZ@b!O!DyTdI}Gd!6v<0OKcu|7+P9IF#tvPZ|%#t&m6gu z8H8eO_|c)r(byz#>+;8Mfj9SqzqplCwxm{j|Glvzh;i-}8!pAgJA5k){lzK-Dz>1vzf`MhE)c%bE`EMbp7FDZ!Dj|6*1~jB&)h%FrqXbo?+trX z=Q&iLeh!f#Ii(&ykHGxvkI?aS(wtMF4|7!`xt)560>$>k&i^|d_SbQ!L?Mg$r1#GS zww-aLi%gR|f_C}LI?E}KIn^zuZ0$LM)(YQm_K&LO?Lr1<37oT!uhTFMIoMu^Iyn1e zh-T92ty}QVL)*-U)YsolKV2v^Y;zEVmwkUeE@-Q1yFPC!;qX!6Y6nfcg%sywq1EWq z3%P{TuL4e&HZ|SY&p+1R{3rG2;%p>W&{xs?c#fk!>|Rm)GwrGy09v`94k;vUZ>Qk1 z;xgQP*pn_La9a=ZBi=bf_!I%70!2k0hokqgXCH^6=X>Z4VxmQ_J=4*^ZEzgo+C3MF z%gGTSsw7-pbNn!Q`NJKw^8+^UV|->^%F{}{TZyW+g5O2o^gL2{eIIpvX02yH(5w2rktUe1&b zxXdT7HrRDh$Nj-yH>rearye!u-S`+$!vw+ExzdNLp0WkEoZR$<_wlY>gTD3A?>^M) z6Q*z$6_=F?+4Us%<(SdRQwLIBN^G$_<4Hp|)I!G`t+6x(u_Kte+xmo&G%2E zU@U#H$XIBOGExF_h7Pi*m)C?+|;iC2nwUACesOJvfgl$BLOQrHlb6qu`E$Ywa_);8jzLYkR zm&S`sC`#60EM)>qB~4B@_RfgTD(+Y*U%KjsMFboViL3;E!Z+d|oD&X_{3zkWep`j` zjvARNeQT<4zjwuSo!7X0V5&f@EGK_2#wNnT@#~Ro%KG?um~f#)_YzFaD2WqDW`kEA zyXDkD6VSeWsbWX33_3ivZWW1HHF&ih$q^CfmPzB` zN-?m^GQgfkUZrKEY*Atz>gdR0q|Edxa6iio00L3h2&7_g&o;Kpj5=ozJ{E^6LLXk> z{I?g*CfNJ*&_8nA9Zs9hJ0uLkpn=QnxJ^}qByviu;h7FXtSEA3UO=9kOLtxZKWZ|- zP8bRTGj;yrb2(vx#6l``STn#+}XL;=g#y}%g`R*M&66hU8Wv@dm@oqMmb0PK%b5Ww< zc`4m7lsLRE4P6v^Qt@TF_?2#?4RdSxT-+0*r$#HFcyOGoys|OZCa1SzD~e0ZAUwUX zhqFW{V9fElA07~RN#uP+irSld=W;cuI6zCC4UnUWwCJB}oCbHewe`d^jelIw6jgu$ zIlFTFQ_I)#J6Y#h1x-q)p@09R+te16>E)mimYU%F?W7s?nA6fWGa%;PhE}CBAkpw) zdTR}Z;_py2xi55)p1Th$!KT(jYcRzBxW#B(I|asQ6I~bjgW#t@hyq)l#=7f}hTCy? zT&?w98Qy;3nMHBx^96F4o#ZqeKa@HT4az$}9#rtdan}#UA^W^Wvb3XK&5$Gf0at}S zh&_z?V+Q}Y(iK!CdyKfdF5h8n(WGoVLH1TsaHRaa3VZb&$HwN1n_u@K*w~0hOlGw< zp=H8WB-1X#_*0eUMCc6)?TmvS9PN}ZUrkn1X>4lD3Jf^U+%+k?d@PS*B=5q37XXn| z%;BO}&43u|NHgw#_*G`&j=XAtIh;c09;+tt>Wb=D^_?&(5C!iKWa=*@kDw71aD7QU zgbot)fv^qq*;`;1m)}1B3S~|kdj-f#p)!2=ne!-OsRj(-QvZYKk54624lkRV375Sm zF+zBF*?2<~GGPd;#Bgvc)LTyUk%n`OHu!pFUPPKZf$dWOSaJM;+V2*nBf(8j(+@im z3apkI1g*7rqz4f~mw<6`1Yc!|khpNGsHeHEVHyzd{e`sZLr_S|Ls3&<+X>pZW3<(Y(Cr&UcQbmREPmo;p5w?#8_ ztbVL^KUj*GRxUUkDoUT<5IDHb3>&JIDHGU_E;aDk({epsRSwDQTyc~eGrjXfVV%P> z^GF30oIl**q$$PFsRk%Sst+;#$xP6^R_XuCGw|32k%Ld;KnZhZ?X~?EeWZw@+J+}> z-=8^IX89Vz!CNPFy@?cajaMA6xt3Yce%cR=8xXK>1CjlNjyU?d! zWK?J~*8QZ+q>L>u6mH&Q_tUe#J`y>1F|8c1)Wk}wZeVdpJTopt7NjeZ%FP|{sr^1g zV8M$utI#Cd{YW9uxmd$1j~r73h77P?c&}+fhSx_7jeO5G7kg;ZMX%H6nqk3@YNHZt znWJG*hkKJ!9tC41k+xK%8xFMD5+`QyBIVQM!6~rURfPl#9wXF|qi^G>vp)9Y3w41?TiH$m^0`?sWa}BgJ2;DeA|@kK z+Hdv>HG?chP2>90B>1kqZ?Hc`!>dyZLWS{Sv!wK%;c4v0MCt-ku(1qWyL_tUtwQj1|cx$N3)lpswfo=DFQ8TNGchSv17VDBj$#W6iY4YIxoWWrxiD= zN(Ws39`uy3C!WObM86@%p3>AY@WHtCGgGApAFS9)2(E^FqeUi&AwVxFfcmEVZQxHL zCPJ8HK7yMeGM)YhZ`!Hr&Jd@5!Yqt$EN}3!pJ)>WpP2f>!o2w46N4@i&9It-MiLnP z^2Qh@3E;{%0B1|)Szo+kwSq<`Bd#PMmUUMFWOBFIg%Gl>8MySEA6Z5(F z5_WH@CLYm@@*w{WtUxL{aDR`H8tF|+q;X!YgG)4i$L)V8=LeedGq8N^pP1e*F@HuZVmmHkLE?Q3XLt%h&o{qJ z7sv32z)feI@vZ!9T!@DaORd}hLNpEoQ9VJjn6gUZ=AmH@Qg3wDhQTZL#`D7 z`YO3%J`|NaIJkEK!sWn<(ppmU5bQNbsW?7bLDKBH69ES#GQCNx`nJ&MZ(Lx^D&1$B zp#qfg#OAC9isq-tMFH9aOcQYq_N47rv(qGYGZm_V;EApA{)EmSDD~L9zwfL))ViS^ zl-mxJXUV1dnn@cdpRZnGc%3oUk6nU>;jjcpW=ju)iOs!6#JWbH!fX!&vC<%0V0;&m zymlLf2(F;W1*A`tVdPoFY7D?&ZQ!JNHui3M;WaRNrRb0xf-fnQ9k&vV6(;z_y#yDYU*HVY*~)- zHmrx10V8hg_iLrW;X)MMeXE4$^5DN4)u-2ZY6z{AA;|+NQpb?)yI zvI4IPbCT0R?+xRBTr*&6f{p6vZBh#v@8v-_6as&&nx!L$mG9;P(X{-R0pmi$MP%NY zq$B0&waF^Jl^Bt_g~Zwq&!i6_82^IUZzvu&|h#2{*={fD0RX$lemp`W3K>+jBEG zjli(Kej>yn#GS)0UBTY4O;}^C$2=$;TRoxdYTf(H#(t&LjDMJIED%8OE-11<<;vXr zB3by7^DS6vrLgrmV<-bJ4TC$KtMd=3+k4y4q0{k!?HTt$(8D-FYR{-Um9C9_&h~_R zU<(3#wP;V9g#c6-#j3nd3eobA6yzq*8BoiPL1cH)+u;<$fOer>kywcL#Xuu z$f-Pirp)8y-ElW(OYEW^;>_9(9-1vSJG_;cMyNG;&NSlCUxFYdeCb8&#HW_(X^?MS z1(33BmazfXQrr2+bv8;S`~y@|p%P7W-0=hzt_Lo8O7;hc?aubs0H+liKFR#{bPt*_ zMJ_im2E_BHAqId@25&uJgyEvfNF0#7`iTeo-u_AkzQGZYdhEx_n7ed*oKhqs`w ztFUT9E&YPQX5eW4rav7BYZBG|bf_@f zq~NQ!77?lw&wd;(7$VqF+)5X04|kL_2CCz$lU3nz7J%6SAjGcqW_w<~X z+m=$LD-Bl_984Y!W^UNymctX5Hc-^lRjLvj2#cvXBqGgjK|PUr%!d*M@Z)5pnL9f& z7PZimN{1{B`Y?KE0Vj^b!v_)85f94jbah=$0V&tKQXqQcc+ELN zO{2N8G|#!ukB`m^u1T5c5&a0aYV`J`iB z-?W5287TO(%D6YyUV05UC6j}dQvuWy0|VeGP2BcZIgaMnSNR>jC|rn%SMB`(9lKd{ z^7oe&9&XBq2$FmqGIfxVMJO^737P_g40~&zF1hn)_>Wbtc1k}ZJ~M+YCEamD_#fdB zmH<)Z{x<7|;te_44W=&Y7Pg;jZyhA3x8IlDz_J>YH&8p4*CrC26|sSbk=Lrqz4OAD zFI{Z3*heQwG?2Fh>JGSep zJJ$?k09pS`?a=&~Du)3CHrsy#Izr2U_*G2+cvu1UI6IM-wjc!LLC*c5T#XDQXeMz5 z>vX(&@l==@cXchQ?55<$H>}tX-#~as|4aI7YS?v+hdWkg8MwFYfnN*Lf`BE=xRWqf z;sSD1x~ahq1c>C(?5g)QW<@-m(a8lPCCoI~g`2HcY7Qc^KNj zI~zH0`Kb;)1}gX&KOCQReJW_jUYhF&Eaw;hPz=pnLrLGrxNtF~omy159VGHxQ#^zrr{|<@1iF*ahXo13~_BS@92Sl#h2s8JiwAE;g+^&8Had($C%>YjcGE*8mZk zuE%(!=DEiSVYS10d@DW9FNTh>@56^^hD*Z=Y@O}BD>u~KnaPAuR2&9biZ~KaU&eBa zMur^%>Hp<*IVnZEqE|FV8Yo{BMHA+7;UvCHoz%~iNr>th9KpWg3Jq9Yf|sRA%nqIi z2N!N}`J71lWmWspEG|lNlrej?_)QtLQAX@95ka1ArEFpEW{CYIMpVB3Bk4X=?lhS_ z>oY3MGEI3})ykHGo>t>y-$W|HRPYKX z(PNnkN-}s8zd#z3BlhScC1#zf{A9_?*p`zuYKM5o3t|i_N8LYlj7n zBN&iSrBy)<9CYHZQPm^Isod!>K!veI#`D}iap44L087m?=(!ILgBb*{zYC15R>nSh zeyYaTGWrkC=-hy_1`6`3PR6?2sN=lA;Au&Ojnb5Ya%b!BEEX<`wn`QRTozf%3@* zM5Qa+kS%K7YL?Dw7GwBD0naDR}`R2XfR$FNKis7yjVHeJgdz{+t&3gMGv+85p5O#n)0B;Q z5VY0viPx`ARTlz@4ve&W*DaJFH)L!dUHus;Y|?K+4g`gV>rf>I(Zt8(#;3IR2hm4~ z8adPR0Y}^C)q|}2vFx?EUY?$&*1EB&LS*BHL@W0GUW*U(s1<(MPK8A}G$=S8c~}H9 z5SiVTldGSA-th;cxS^+rSn*^rUn4Uj`ve^xFj5Nxj}#QEOl3zOpN*z~22PO8d;u~K zc$JD1$6)#Zk`0071!U75Wc7&K8(8I zut(+`o9d3$J&emK>}z;VqiDAR3?78%NXBa04)T*Su5)w5&j66WTU*`##?D$@5?8Zp z!r~JObDTzj25|ZY^(FASN=H?MM9~XP<>|7J5}A~kUk6z*J{u>o1IP-XoKD316!Iw0 z7v+fNz##Z) zaPBUG_z6HjCXf}N*5!<6>KmCHPId~r2Mw05C({85Bn`IQ-r|oZOTNbpTy!6h0N?;2 z0z(U+Wvx;=k9XfTmRSnX3$t_#=9K-Cfv^CiNKCBjyBGJ#k_Al2`^Z}cz+dlHHANb} znlHR+2g$Elw?`G^_T_cGAgn+0HXDnmR^H|oOuBDQ)-OZr#DE%@YB*5O>avz&I!#p_Tmh%qR;EVmSt7v>&P>-Q!P>eg%yIlneQ zy({&m2@ShtDAU{vyPAOg0Fu#L>KOxe4U|*)fCvbg?czQWAqTzCsY9V|%QN^ppfg6O z4cA?W+`<;MgJvpBMRF7Ylx|mnHAcUcbDs&?h(`t}P|~04_FU-n01Np9x1(pTft41J z7FtOkEr;yOdsJ9kFC*oCMn>v^tMF)%niI77b|o}(EG({@9${zlg1A1xVknJzbd$w_ zOgg4B5X!?lz{`Gl{pYrx6qM`Wc_SoBa4}hnVz2beV?JFhULfjC$Pc}rq>fCO=4GCN zDYj5Dkp@$C#K<3x8+8HIx6j^$>IBDTC=t^OI;wvw$ksjaDY)FGO7J)!$}!au+rk}e zVv8tj08EhbJj2E$4H*=KcEF;0kd?%-$|?^JLycdR38#|wQ(Q$=2K1)e4APlc%v$G# zXN7Tnd?{MoRnXctu^hbJ!Ypyh=#1@^uyg4BIyiaka2;+AUmc{5mPPYjq#&+thNOv` zc4vfuiAHv``q3F*ar~f~vH?_%2f`jN2SZ|j!z8Ui<7!^%N#1)z?1Wu{o`|gu#|DQQ zD_TN48km9F6=e)1CiNuOF|O>&X2^COx)R&;`hxByX}5d|1~q)OO4^;03b!-Ns6W*%Xf%=X6<{Q#Ecwi&5p96~+tw`Q<*pezo{T{aAaOLvi(e!{n|J zvC9{j2O>b8o*mCTL=YL@S()Itw%r-ZJN6zp=VBShfkb=eBF(VJ3<)?)V-Gj^aW#+T zXrH3y99ju<3sXMR7L;%#G%vPed+1k$u}ecgBtY+>I=HO!^pJI#yAKJT&&$dwY)KX- za8G;hn>P4})tFCY%~D4fCl4!~&r!hq%AB*B;c=a=rF#1kjvB-S8_mYKfoGFB)G3;x zQuEDSll+W%q5~1Adht`N^IFW;fs*n36r8J*%|mqIgh{FY=7MJ2Wq(9y*hSx52*x$1 zg5(*|WcQTXTP=qCxGc(bUpmdd;~17&PK45BZdz!3!q`Kx;cw3V2M-tXzmT319|cC& zim}Q?T%7p4K47S($cP`iLuvX4Pl6BM1BxfUfIS}k(p;{E;Sz7(&EG4bsGE7f!c0Z~ z`Allg*;C;>^n!eWtjjg7TyH;G)Udbw5 zjbjY|CO*fp$$ElwcF$dkH&~P@vw{aLtGUH3ddr>5nnVhh9^DhwaeSBRty*Q-G?3gi zybGvv3Vu=pFNk2O=2p~ zf9;T3zIfg*Hw(zHDPM%57NG_BVj(?h3QP+?qL#oBfkEl^z)w(sfL9bxk+j*3b*u?*~83xX+-{Bs=z}a4iFY ze;!WlaYM_#NvN#D>7ATW*Y@oJ^VyIQffyCkVw!{lFH^YKqJ%Rpc2)ncpe&vX1y2Q0 zRP<3ouLo4X-J-&@?U$IPoCkwdnLx~XQu#gLhK*b8EwnT>|ABVBvI~$K=zX#tc1+dk z?r#AUQFNh5EzL0)i00n_q`P{WRDl@w1K)6W8y>F;r!Hn!hKpIlcjKBh>LSud+%-N_WFkV*@`BPa z_3WIUp0b?*$aR{mmiYR|N3!~;o($QZr}_ib}amc4%KX;zs@L&U+)wzqa&ru_eI3Ojv_?zl_ zA{jGXB`g}9a5bmX(Ec6`WRlG=GNTVP2yjjn19t&PkP)+RBAP)&&9s&57ub=MUsBGo zeo<8hLh2cFJv%i+I_~Dgc-(mWiRAM?j5zf>s`vzi8-}0L%1uB1w&b zXQW!&J$0D2GZJReQ$^i<6!RTU`S&nT@O{lS>(urEN@S=ZV5i7a;fwEpw{<#OdU=(& z@B=&r;D%fkj609-4%N>j#EwfdD%|#m3`{5YY)u#ur;7Ed=b*j(RADG7q&Z;Y^-(+l z$A)0TtdX6b>dixC;p!`i>y>QvR^BS7W%4Qa3o2sMK0_QpCI4d)T*hRCnA3s}&)XqgrL_{#K? zp*xczRml9j z(Re%y*^iALW8ITEW1SfV7&R0LYJxK88ge5fAus6x8V{D0=E&I>wgg(tOgic+EZrAg z+I)85tTF!ll%%8$N&cbnGos`*^NnXK)a!;$J=n<4MJbMfdhG@*!nUV(VG@eVbnOP@ zHx+RtzKshvT9e5vXBK`C1LDn;)vaxrsn6BY9`gk!4mAg7T%}ZX+WLW5D~_(;_N_{! zXsVof71pgfvqQCPE*D1e6<=Yk;6GdFN_iB+h*7g?i&Ttv<9)aHUfg(QZW=?);pPp% z8ENksi&K{#qKm9%%<&sK?C-G91G2P7Bt99-&CaNy?7jm(l zTcH+&JDDmlr_$HFks)1ZZsSH{UWO%;dJ+65k)m}d@c^!(gUzp3&6QId-}kzv_3TqR zXE8A?WaQOrNQL0mZO8O$*NJF&*Q+G*rBU9X$QYv1H&KF7z8-1d#(|+Z8&Vnx|DRmYP3%3V8wKiQN3N zfc7=>R=<=uUdO&AF%_U(dM!=}86B`TjiI=Rwhr)bzV^@8nb+XAd8}Beh%VLY2_5Gp zB!wO>_hhg;vU~RH+tMF^&hBCl0jz`ksMsJvmNU}hh4+f`(ND5|AcakxcyP#f0W|>q zUVcv1qS&ZE!7&KcZa|uL{h4Wtk4GdO2OI50B4f!M?+bGT@%kXMS)p;TGf*%eI9jL~ zn1vG4LH0fZt(B1fK++iiHK`8I!HA)1S-&5G6(V)NHJqmb9Kzl@rf_>2@8S?OHe<6v z)Swgf_U09bkCG5EfNqTuu&5O!QF+!>P!8b>QZlc%r=GFhq;3@YjSRyQvkfz2+i!ye z{Q{J09~AW^3%!Nb#1GIy;tmOkDrfFX57&IM1mbfAz_K7F;EZDDh@L%IHp0F}jYPOM znyL_ky)+?OHw%(o&`3xW`55 zzGJ@+^_f9@ImC$thK-tn#L2CPhEGqF*;$G{G$Inp56D!=HM2t%tZE}WtfBqR0<0QH z5jRo&$Y&u`3y{hId2eB#BlGnG_9Be-b<$lnzvaW*(@{%J@9|jN|RI@)<+ms%ecN_7yFYPU?T8pwL~lo6-NEX!H40YAMp2 zi&$iPURHH5eLpqV7Tv{l zqOQOPy-j=49TmSpumK%R4CG&-_gvxO*P7#x7og(m#%2kFDPmF`^$R&rL!9dfK@+(i z`h0OjsMhO3VGo+R>KX)k#3Wuugm-|A;8%)h&fV7Bb1Yt?8moPfBYY^-U2M@J$?TthLY|Sh6aN!>28ryKsrPu zloAQ0k)cz%MN|Z(L=cc}q*SDYAw>nG1wr{gvmQC;`}^;8uHCbHR+#z3^M2}n-H^Dn zGs{6nQp?kbN5%3{I*0<15^xJ<#TXb0xu+vtp3PyNLaE7%_)ZK^PZwu>7%DZgW9Yx54Y4G(cQZ`_Nj%4M&5Zpy;gZLtt_ z=>?I6VsOmh((>z+#Ex^k@a|#^;-M{ER4pBAdP_biG0+xPeh8tw5D?QcFm37E?gqam zPiUlWvvh8s|B~>qTIj7Eq0N<81*!BdqDAm@f>{K&A$CHYQyr>NmR*KfwQ#_Mj#z~q zqYB2fodx2kW({4h!Y=&~U7|!$MUqVkM1xQ>zr{&+Tno@8FKgrFMFc!l48dt6;at3l zzQcO=bkg(F+5T@r%i_mCWtH77x1lPa(63W~vBU(70;&`&)ln2VTzfc+|L zuRi_Mw>1#JC>d+i1(DtCRq7kF-w=poDf8to>9TFG8_45^q9pK(ULP)Ohfr9=LneJ= zJ0tu^5=7>#`XCczay$k0e2Sgk5q}{Fo{9KGl*Y7p`!g}3 z!KBdzmiQ*2>CE*RTGVI#IVAd*2}k#YdTl=q2U}awjA}Mtn|O7LEsK60X}%77A*HS? zYYf@)@3m@fhkgZF0r3x1McE=uicD*ql1@i|B+?w(vrmk`Kzvnf)^!K+{YI!9ULbDq z9JV5wv1{&~Tpm73w8AiExOm{46z$IHa7BLpml>oOuvCYCSio1V@=i6P1!8{UoUfh_ z{=N!+8{s^hnQ?toI2S_$WJ*F=2o<59CP5dm|CG_3_1t|z@V5s%uY~h^!jJZWeV;@q z-qPfRiJmF<>$%S01XPB^TexCNuwNf#>Iy)+O^EaZYmfsPJvVT^fel%_@;j|otK$!} za;U}5<5JI7f;-R8(6&1CCc~l`e>k2hvc%>}Xzz7c8C)%`NKjwno*RG-#HWi3a3uJ> zb%%Yq35he|xmdHf%L-H$WbF zw`KH(F$Z;zEJwBT@Dpm}0GlDQi}(slM~(wbUu5&^lvupC6gTHuiKrz;@6WeJUwn4^ za(k#f3`O{^jNdHas^ZVXg(pdm9XpkVbt_IPL%>pc|5CODX}e*W=RSB&d&9uJ-VILi zNL~BoHd2Bt}; zdBYiUw=uBxlVlb|Tl9*K!#a&HoNC2+L&$iN9TPdb zT|}WP?tkq+Jx~+s7AaKZ6e+WW%{9lFTif}8tT$j9s*`h?700s4|NQzaV&j+UV`Q%@ z3`StD$i*vJBMZ9RbGLTK?GxZp{xT~!eHc|>!|=3{xUGHezzU?N4OcjlnqU@LS8Yoc zmC?B%$^7d2WlcKlwn$P|*>Ue1?!O6#n}7&0R?d*rGh<&utZfG6dDSm3bhc~Lk^7}( zj%4h5%_I)hQ!38D6(_fClTD4sGKyTHNlONoNMfcP1(%~k>nlrQG+P(wqwek3ik;S< z>OF4x$Vv9Vl~E}=GUyEK(`j3G7&*4?(w@)O%qk8PFepNtDIBtWs@q#C+qF2wOs~l? z;QxKZzTW~*LJgJK#eU?p5$o?A2Ri zcXn(J#lnje$+Lb38?U~?B4x>00Sk9R9p%pTsaJwS?SpbzBAbsB)ljq#rfuz^zNUKi z@=|#s*Cm5wtj*aPB_iL(JGDQ2gmM&u>;zHCp3!Y{x4bdL^)%Z>?}1w#V0RJYrohu|1CEZKak98mLUmzfzG$6?1y zQeJf$RMx(-#1bhYU+dFlb81Bpg=7sIPaxcM+8KL2JsUiYKh8g8l_W5J4SkWtMu3?( z!B`VJ%P*&j(igf+QV$k2V%vP5-hcSavTz7Tn{m=IlX0%+<2V1*(2bAyJQA@S%Q zjITC_Rmt3$L@=l+xL<@`)7yi)zOlU;tMwS}#}!n~bu#AV(S}M5Qbq&e0#4$_r`?)~ z_2c||Vbi{j{ahcEN)W_uPDGcUxo$;A)cLa7XC?5PJ?IXW%Fklr$_}bsS+H(!k;-1A zVqMsv%)e6B1EaW`uCfQ(N>1%xQ*>93p4;|!vEjWV#*232xe@$DPHoY-z^$E3oppT53NWUua{D!4kh9Z@xeAd?c=vU_wW@R;* zg@px(!d;B^ubHbwUEf7UMl|2hx|99$K9iMD!2rkQ@xnUYVufWI4sr7F=_liNZFM{P z@z>2o2@S~%26Fs(bpxK2Wjbp8R{f-?Utw(~KV{!>9S3jg(2h*(V*dH2vs(Ll+H_;L zE^XdJA%=))-< z_f3dd?;W5-I?V~rDijh{=Ryw!)0y$V`wY{i7+}|;7?{5?^pVodkm1@;03-WHOhtOw z=dICn$}a~gGcO!HcK>PFjUi$QG&)Orm29yVy29+KDK_afHYM17BGwjAQ2$_MOFmk9 z*&9?L)lUDwn&aH5`gbeJ7COZ$*XJGaJKj*p?T90HIcSNdbrt*&G`Iz^b4S8>K7C@ZUlQ+%XvpN9H$O_=Xp`*D9-63oUQ^+^*)wM7k4fttIKrop62cZk*duph)c z6?iS3tdJG3tO~lZU<|VJx&gNZhJ;9uxJF~ZeJ5aWP;63 zMT{IJ%fLRk=B+JJoLnJGG=6=uB9~&dQQ5pgA$JF=a!$&Mk-`174PLV%I@`t@CCj4) z*K9JsRZ=}a-E22@@j-vcxU)ECLKloNZQ_Fa-R{deJF3=JYkMz_DW+;Ydt^t_Pb~5I zJ1Ud@Q9=XG?=B{?i5S=udiOj|D1GcDotNmFZj9_wOl1noTw>nRP9Y|)uw3_M$Q>P3 z2~~<>&Ncz9+x0rRlJ3d40#|E#YPAg6#Lm0zP(4rjV7P{)5o*32D0c1n(-Gl0$F=W` z*=j}j`y??q>!&ZU*L*Q;ei^YS=koP;Rd{X0lig%_2J!bhtqX`TMOiG)VTOh<8x7+IeIjHGro*Q?+b$J@)?OZoZ>7MgkW_MOecf?mi}9;$ z?o>OM~R^Ltc@{<+07L}$Pwgt!$t~Z7V?K<$ZW{)?-mACQ?zJ6N7 zxT)rFN$qvZ$J6O8EEyzTlE@|WMcqCcQStRA!h%-Q_D2p+?|x1+`4rnipQQHLOLsJu zVss>@&4^V-$ro`k-W&cY)^@bYk>qr_{z}?=F|?@7o)u|_e^9w*plhVztv&= z?T}>=N$5AW#O5N;{8iZf&YN(*YE9Q<7TGH}lsZ8B?H+)Qe$u}Gc`{jpcLt>sW$BS1 zt1st?`4ZeLV+L1H^_;xv1#3D_LUvqa z1*LK^kUHIp-zi1RjWBu9UM~|^zl;;ISseL;&92CAnZ!2D_v?IPuIuwKF3FYm1i7ak z-qAqFyI3#ZOJmX{&W7DM#Ca%~4K1--2?!FH?NSRMNB4 zv|njDfAgM?l?JbES#sq~QE{g_o|>ZS5DmrvIrA{f?DHD0gS{j}vo5&1MwUlnGc~x+ z%u!w?9}9JKAUWf~r{_ucW@xQERP~$dkiHM`lbpR;kJ`#>Gqg>RjR_0cDe)ECi3_1cpP z9QTAt-<8sA=@S*Y%FgQS+gzy{UA5tktkWWWQh0q=+$A+~qTrp)?A|UPnrR?_ z%vFL7JPH$xX4noyI?6r})>&NHI*=;2XqqB;;_>s4x4$;N*`kBa#v$BbM)2yF%saR~ z(yNRf1+{EO25dDhg!Zim0oU!D?|U58F>3#`nYPe&JCV5{2Z;(U*$TC_rZ8YP4_64O z311=ay46!hX1mq(P@ZWuVn5_B3xICu!rrFT;7GA+K;16mm+1VNn-!WD7`hAn=DIQ} z{I7Uodo3iDq=Y?Qf%!EDU7}+ufoGSJfT~zwa7~CR%8$phkTf!VI?Ap_j&fzSFN}O- z#r2EZ+3N(w!5<%QKO7QqOC-|ed%izRK$$D&bTu_f&D|Vyk!ue7D!03RC$kSnJ zYkzZrqPkgC@2PN4VW#2)gtOG>loN2G*D^O8*S8Yng3u|Wz=og`bB8HgCQm$Y9(vQn#G`z z$>QIj-gYVYxOF>^t^Zv3`8Ed1*|%A^LX154Tvi>tgq*1`p{EdHCAehYPW$^&$0|zp z*oL=9l=Z-8lV1Hcw_vdmi)y9wND&_Xl{zasvM^OX525g9Z!e-+kyftL&x*%dPfyJ} z%V3%l(8!Qgt}W!UyOJVx=jnFR)YG4MJh3_rZfKU)E0Z_^iM6XQg86LR;)JtzKkDul zQlh_gUL~_b-xs#A@klh&v}2yM*x~r5)^o4@Lz1Tv6w;{B|$4@R=}P+#4?sv}O3+u^S2~5~eLFk68m)mHa;dl{)SgT;9A+ z7L*|Lo3BFlV_2|Tym0)ZV`2`uPIVQFJdrO-^-Gse%XROgy3U=Ut{!i#Q4*F--z%RV z`$2nTarQWQ7_0wuW2LV^6*imPm?WiB_j#6aQ}va6K+Uc4n(s%cUO?M+WQtoAsRD_E*$ z3UA@cz>o83pDZ@H4!30Nc9;fqno_#Le;nCy=OwC;Hht zUBTFx5ZV{+x^?QGzpJ77dzf!Bk9Q0UafL-D5$2M*_NUVC&$PQHewPb1E+R=jjj|3J zMe*KoxX!fBwd9!4dhpOuWM+d0|5I9Zmv7?iJ!R6wUyRw>=d8@wAI}feXPmwuDxT!| z2{&FIGeA6l>OX@mWkO|hf~Ws3C-_Qp&jeT z)z)$$U9M~Hp{R|frJxW1g2?POj$gsO2EY&6JBb!%rv!bH%ddI|bh;?UQ{r52-!<>?WR z?F^5U(zFq&8Nm!IZ%H}uvql2vuG7e_vD84I5hcrNzY~6md-VK<@LXk#s#r%0hI&*; zB|Oq~t(tVcAUL6L0x!80RIka?lzmB*2~HC*{c4dsBOf~!KR(-oh^Tq&Y9V26e`*jF zSoUtAOx~Y5SoUToY&a$myl|F{eJQ-QD3dA3{r%0AN1c8WzRwK5dl)wHNE?cL_Z-lR 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℘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