From cadee843b8b118952ea5b56e484482f249e86eb3 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Fri, 27 Oct 2017 13:08:27 +0800 Subject: [PATCH] follow comments --- paddle/framework/ddim.cc | 8 ++++++ paddle/framework/ddim.h | 1 + paddle/operators/conv_cudnn_op.cu | 38 ++++++++++---------------- paddle/operators/pool_cudnn_op.cu | 25 ++++++----------- paddle/operators/pool_cudnn_op.h | 3 -- paddle/operators/pool_op.cc | 22 +++++++-------- paddle/operators/pool_with_index_op.cc | 14 ++++------ python/paddle/v2/framework/layers.py | 4 +-- 8 files changed, 49 insertions(+), 66 deletions(-) diff --git a/paddle/framework/ddim.cc b/paddle/framework/ddim.cc index a335786753..239ae5e123 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 4a871bb0a9..2a5e2d2b69 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 366d0323b8..e2eb157f40 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 2db4837c8c..bc29be18e7 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 8940967ab7..5adf27f5bc 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 c159f6305c..c4ab29e4d5 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 d1225eca2b..ea21845751 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 6894c40c3a..3619fd3395 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 }) -- GitLab