diff --git a/paddle/framework/ddim.cc b/paddle/framework/ddim.cc index a3357867530c110df16a5f3ec8c799735206cc71..239ae5e1233c7f5c506930df374b5d0cc8de7c8d 100644 --- a/paddle/framework/ddim.cc +++ b/paddle/framework/ddim.cc @@ -195,6 +195,14 @@ std::vector vectorize(const DDim& ddim) { return result; } +// NOTE: framework::vectorize converts to type int64_t +// which does not fit cudnn inputs. +std::vector vectorize2int(const DDim& ddim) { + std::vector temp = vectorize(ddim); + std::vector result(temp.begin(), temp.end()); + return result; +} + struct ProductVisitor : public boost::static_visitor { template int64_t operator()(const Dim& dim) { diff --git a/paddle/framework/ddim.h b/paddle/framework/ddim.h index 4a871bb0a91ed4050847509cc3f24218bcd57142..2a5e2d2b6948b045642dbac5e83992a048ecb63d 100644 --- a/paddle/framework/ddim.h +++ b/paddle/framework/ddim.h @@ -93,6 +93,7 @@ int64_t get(const DDim& dim, int idx); void set(DDim& dim, int idx, int val); std::vector vectorize(const DDim& ddim); +std::vector vectorize2int(const DDim& ddim); int64_t product(const DDim& ddim); diff --git a/paddle/operators/conv_cudnn_op.cu b/paddle/operators/conv_cudnn_op.cu index 366d0323b840c338dd6ba5b28bdb29fd135fe91a..e2eb157f40c0039f87c41d28f8732cd4901a046d 100644 --- a/paddle/operators/conv_cudnn_op.cu +++ b/paddle/operators/conv_cudnn_op.cu @@ -31,16 +31,6 @@ using CUDADeviceContext = platform::CUDADeviceContext; static constexpr size_t kCONV_CUDNN_WORKSPACE_LIMIT_BYTES = 1024 * 1024 * 1024; -// NOTE: framework::vectorize converts to type int64_t -// which does not fit cudnn inputs. -std::vector Dims2Vector(const framework::DDim& dims) { - std::vector ret; - for (int i = 0; i < dims.size(); i++) { - ret.push_back(dims[i]); - } - return ret; -} - template class CudnnConvOpKernel : public framework::OpKernel { public: @@ -68,12 +58,12 @@ class CudnnConvOpKernel : public framework::OpKernel { ScopedConvolutionDescriptor conv_desc; DataLayout layout = DataLayout::kNCHW; - cudnnTensorDescriptor_t cudnn_input_desc = - input_desc.descriptor(layout, Dims2Vector(input->dims()), groups); - cudnnTensorDescriptor_t cudnn_output_desc = - output_desc.descriptor(layout, Dims2Vector(output->dims()), groups); - cudnnFilterDescriptor_t cudnn_filter_desc = - filter_desc.descriptor(layout, Dims2Vector(filter->dims()), groups); + cudnnTensorDescriptor_t cudnn_input_desc = input_desc.descriptor( + layout, framework::vectorize2int(input->dims()), groups); + cudnnTensorDescriptor_t cudnn_output_desc = output_desc.descriptor( + layout, framework::vectorize2int(output->dims()), groups); + cudnnFilterDescriptor_t cudnn_filter_desc = filter_desc.descriptor( + layout, framework::vectorize2int(filter->dims()), groups); cudnnConvolutionDescriptor_t cudnn_conv_desc = conv_desc.descriptor(paddings, strides, dilations); @@ -156,13 +146,13 @@ class CudnnConvGradOpKernel : public framework::OpKernel { ScopedConvolutionDescriptor conv_desc; DataLayout layout = DataLayout::kNCHW; - cudnnTensorDescriptor_t cudnn_input_desc = - input_desc.descriptor(layout, Dims2Vector(input->dims()), groups); + cudnnTensorDescriptor_t cudnn_input_desc = input_desc.descriptor( + layout, framework::vectorize2int(input->dims()), groups); cudnnTensorDescriptor_t cudnn_output_grad_desc = - output_grad_desc.descriptor(layout, Dims2Vector(output_grad->dims()), - groups); - cudnnFilterDescriptor_t cudnn_filter_desc = - filter_desc.descriptor(layout, Dims2Vector(filter->dims()), groups); + output_grad_desc.descriptor( + layout, framework::vectorize2int(output_grad->dims()), groups); + cudnnFilterDescriptor_t cudnn_filter_desc = filter_desc.descriptor( + layout, framework::vectorize2int(filter->dims()), groups); cudnnTensorDescriptor_t cudnn_input_grad_desc = nullptr; cudnnFilterDescriptor_t cudnn_filter_grad_desc = nullptr; @@ -192,7 +182,7 @@ class CudnnConvGradOpKernel : public framework::OpKernel { auto handle = ctx.cuda_device_context().cudnn_handle(); if (input_grad) { cudnn_input_grad_desc = input_grad_desc.descriptor( - layout, Dims2Vector(input_grad->dims()), groups); + layout, framework::vectorize2int(input_grad->dims()), groups); PADDLE_ENFORCE( platform::dynload::cudnnGetConvolutionBackwardDataAlgorithm( handle, cudnn_filter_desc, @@ -213,7 +203,7 @@ class CudnnConvGradOpKernel : public framework::OpKernel { if (filter_grad) { cudnn_filter_grad_desc = filter_grad_desc.descriptor( - layout, Dims2Vector(filter_grad->dims()), groups); + layout, framework::vectorize2int(filter_grad->dims()), groups); PADDLE_ENFORCE( platform::dynload::cudnnGetConvolutionBackwardFilterAlgorithm( handle, cudnn_input_desc, cudnn_output_grad_desc, cudnn_conv_desc, diff --git a/paddle/operators/pool_cudnn_op.cu b/paddle/operators/pool_cudnn_op.cu index 2db4837c8cb01abdc5d18de83509ac9dc209b7cf..bc29be18e76fde19c10c32e0299c395a150d8c40 100644 --- a/paddle/operators/pool_cudnn_op.cu +++ b/paddle/operators/pool_cudnn_op.cu @@ -24,15 +24,6 @@ using ScopedPoolingDescriptor = platform::ScopedPoolingDescriptor; using DataLayout = platform::DataLayout; using PoolingMode = platform::PoolingMode; -// NOTE: copy from conv_cudnn -std::vector Dims2VectorPool(const framework::DDim &dims) { - std::vector ret; - for (int i = 0; i < dims.size(); i++) { - ret.push_back(dims[i]); - } - return ret; -} - template class PoolCudnnOpKernel : public framework::OpKernel { public: @@ -62,10 +53,10 @@ class PoolCudnnOpKernel : public framework::OpKernel { ScopedPoolingDescriptor pool_desc; DataLayout layout = DataLayout::kNCHW; - cudnnTensorDescriptor_t cudnn_input_desc = - input_desc.descriptor(layout, Dims2VectorPool(input->dims())); - cudnnTensorDescriptor_t cudnn_output_desc = - output_desc.descriptor(layout, Dims2VectorPool(output->dims())); + cudnnTensorDescriptor_t cudnn_input_desc = input_desc.descriptor( + layout, framework::vectorize2int(input->dims())); + cudnnTensorDescriptor_t cudnn_output_desc = output_desc.descriptor( + layout, framework::vectorize2int(output->dims())); PoolingMode pooling_mode; if (pooling_type == "max") { @@ -120,10 +111,10 @@ class PoolCudnnGradOpKernel : public framework::OpKernel { ScopedPoolingDescriptor pool_desc; DataLayout layout = DataLayout::kNCHW; - cudnnTensorDescriptor_t cudnn_input_desc = - input_desc.descriptor(layout, Dims2VectorPool(input->dims())); - cudnnTensorDescriptor_t cudnn_output_desc = - output_desc.descriptor(layout, Dims2VectorPool(output->dims())); + cudnnTensorDescriptor_t cudnn_input_desc = input_desc.descriptor( + layout, framework::vectorize2int(input->dims())); + cudnnTensorDescriptor_t cudnn_output_desc = output_desc.descriptor( + layout, framework::vectorize2int(output->dims())); PoolingMode pooling_mode; if (pooling_type == "max") { diff --git a/paddle/operators/pool_cudnn_op.h b/paddle/operators/pool_cudnn_op.h index 8940967ab7a70c342bad7e1237f7215e5742e84f..5adf27f5bccae8542719612320bc6dbe21007634 100644 --- a/paddle/operators/pool_cudnn_op.h +++ b/paddle/operators/pool_cudnn_op.h @@ -1,11 +1,8 @@ /* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/paddle/operators/pool_op.cc b/paddle/operators/pool_op.cc index c159f6305c78d082622a6b24bee695d6998a564e..c4ab29e4d5f7c02d97a2185a58fdcd48de822d2d 100644 --- a/paddle/operators/pool_op.cc +++ b/paddle/operators/pool_op.cc @@ -81,8 +81,8 @@ Pool2dOpMaker::Pool2dOpMaker(framework::OpProto *proto, "width of feature."); AddAttr("poolingType", - "(string), poolingType of pooling operator." - "Str constant equal to 'max' or 'avg'.") + "(string), pooling type, can be \"max\" for max-pooling " + "and \"avg\" for average-pooling.") .InEnum({"max", "avg"}); AddAttr>( "ksize", @@ -90,10 +90,9 @@ Pool2dOpMaker::Pool2dOpMaker(framework::OpProto *proto, "If globalPooling = true, ksize is ignored and need not be " "specified."); // TODO(Chengduo): Add checker. (Currently, // TypedAttrChecker don't support vector type.) - AddAttr( - "globalPooling", - "(bool default: false), whether to use the global pooling." - "If globalPooling = true, ksize is ignored and need not be specified.") + AddAttr("globalPooling", + "(bool default: false), whether to use the global pooling." + "If globalPooling = true, ksize is ignored.") .SetDefault(false); AddAttr>( "strides", @@ -143,8 +142,8 @@ Pool3dOpMaker::Pool3dOpMaker(framework::OpProto *proto, "width of feature."); AddAttr("poolingType", - "(string), poolingType of pooling operator." - "Str constant equal to 'max' or 'avg'.") + "(string), pooling type, can be \"max\" for max-pooling " + "and \"avg\" for average-pooling.") .InEnum({"max", "avg"}); AddAttr>( "ksize", @@ -153,10 +152,9 @@ Pool3dOpMaker::Pool3dOpMaker(framework::OpProto *proto, "If globalPooling = true, ksize is ignored and need not be " "specified."); // TODO(Chengduo): Add checker. (Currently, // TypedAttrChecker don't support vector type.) - AddAttr( - "globalPooling", - "(bool default: false), whether to use the global pooling." - "If globalPooling = true, ksize is ignored and need not be specified.") + AddAttr("globalPooling", + "(bool default: false), whether to use the global pooling." + "If globalPooling = true, ksize is ignored.") .SetDefault(false); AddAttr>("strides", "(vector, default:{1,1,1}), strides(depth, height, " diff --git a/paddle/operators/pool_with_index_op.cc b/paddle/operators/pool_with_index_op.cc index d1225eca2b1d8752556a6f688146489eab0dc413..ea21845751bee523fbbb85f7fdbeea7bcc586997 100644 --- a/paddle/operators/pool_with_index_op.cc +++ b/paddle/operators/pool_with_index_op.cc @@ -109,10 +109,9 @@ class MaxPool2dWithIndexOpMaker : public framework::OpProtoAndCheckerMaker { "If globalPooling = true, ksize is ignored and need not be " "specified."); // TODO(Chengduo): Add checker. (Currently, // TypedAttrChecker don't support vector type.) - AddAttr( - "globalPooling", - "(bool default: false), whether to use the global pooling." - "If globalPooling = true, ksize is ignored and need not be specified.") + AddAttr("globalPooling", + "(bool default: false), whether to use the global pooling." + "If globalPooling = true, ksize is ignored.") .SetDefault(false); AddAttr>( "strides", @@ -178,10 +177,9 @@ class MaxPool3dWithIndexOpMaker : public framework::OpProtoAndCheckerMaker { "If globalPooling = true, ksize is ignored and need not be " "specified."); // TODO(Chengduo): Add checker. (Currently, // TypedAttrChecker don't support vector type.) - AddAttr( - "globalPooling", - "(bool default: false), whether to use the global pooling." - "If globalPooling = true, ksize is ignored and need not be specified.") + AddAttr("globalPooling", + "(bool default: false), whether to use the global pooling." + "If globalPooling = true, ksize is ignored.") .SetDefault(false); AddAttr>("strides", "(vector, default:{1,1,1}), strides(depth, " diff --git a/python/paddle/v2/framework/layers.py b/python/paddle/v2/framework/layers.py index 6894c40c3a6514f448133f029c4de8cc30405515..3619fd3395034e3fce9abad44dc8ac83513464c5 100644 --- a/python/paddle/v2/framework/layers.py +++ b/python/paddle/v2/framework/layers.py @@ -266,9 +266,9 @@ def pool2d(input, inputs={"X": input}, outputs={"Out": pool_out}, attrs={ - "pooling_type": pool_type, + "poolingType": pool_type, "ksize": pool_size, - "global_pooling": global_pooling, + "globalPooling": global_pooling, "strides": pool_stride, "paddings": pool_padding })