From 801b5d4478338d99343d93ecd4bd0369c963c2fc Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 8 Jun 2018 00:32:03 +0000 Subject: [PATCH 1/6] enable cudnn for conv1d --- src/operator/nn/convolution.cc | 3 --- src/operator/nn/convolution.cu | 30 +++++++++++++----------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/operator/nn/convolution.cc b/src/operator/nn/convolution.cc index 0e8a929e1ba5..3b90ce9a47eb 100644 --- a/src/operator/nn/convolution.cc +++ b/src/operator/nn/convolution.cc @@ -384,12 +384,9 @@ struct ConvolutionGrad { const char *op_name; std::vector operator()(const nnvm::NodePtr& n, const std::vector& ograds) const { - const ConvolutionParam& param = nnvm::get(n->attrs.parsed); std::vector heads(ograds.begin(), ograds.end()); heads.push_back(n->inputs[conv::kData]); heads.push_back(n->inputs[conv::kWeight]); - if (!param.no_bias) - heads.push_back(n->inputs[conv::kBias]); return MakeGradNode(op_name, n, heads, n->attrs.dict); } }; diff --git a/src/operator/nn/convolution.cu b/src/operator/nn/convolution.cu index 65a320ded169..4a9dd487b678 100644 --- a/src/operator/nn/convolution.cu +++ b/src/operator/nn/convolution.cu @@ -89,15 +89,20 @@ void ConvolutionCompute(const nnvm::NodeAttrs& attrs, const ConvolutionParam& param = nnvm::get(attrs.parsed); int dtype = inputs[conv::kData].type_flag_; - // If 1D convolution, use MXNet implementation - if (param.kernel.ndim() == 1) { - MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { - ConvolutionOp op; - op.Init(param); - op.Forward(ctx, inputs, req, outputs); - }) - return; +#if CUDNN_MAJOR < 5 + if (param_.layout.value() != kNCW && + param_.layout.value() != kNCHW && + param_.layout.value() != kNCDHW) + // Need CuDNN > 5.0 for layout support. use MXNet implementation + MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { + ConvolutionOp op; + op.Init(param); + op.Forward(ctx, inputs, req, outputs); + }) + return; } +#endif + #if MXNET_USE_CUDNN == 0 || CUDNN_MAJOR < 7 if (param.num_filter == param.num_group && param.layout.value() == mshadow::kNCHW && @@ -162,15 +167,6 @@ void ConvolutionGradCompute(const nnvm::NodeAttrs& attrs, const std::vector &in_grad = outputs; int dtype = out_grad.type_flag_; - // If 1D convolution, use MXNet implementation - if (param.kernel.ndim() == 1) { - MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { - ConvolutionOp op; - op.Init(param); - op.Backward(ctx, std::vector{out_grad}, in_data, req, in_grad); - }) - return; - } #if MXNET_USE_CUDNN == 0 || CUDNN_MAJOR < 7 if (param.num_filter == param.num_group && param.layout.value() == mshadow::kNCHW && From fab589bb4e03f349fca98584c811bf54376bfa6d Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 8 Jun 2018 01:28:48 +0000 Subject: [PATCH 2/6] add checks for backward --- src/operator/nn/convolution.cu | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/operator/nn/convolution.cu b/src/operator/nn/convolution.cu index 4a9dd487b678..4c09b9e57be5 100644 --- a/src/operator/nn/convolution.cu +++ b/src/operator/nn/convolution.cu @@ -167,6 +167,19 @@ void ConvolutionGradCompute(const nnvm::NodeAttrs& attrs, const std::vector &in_grad = outputs; int dtype = out_grad.type_flag_; +#if CUDNN_MAJOR < 5 + if (param_.layout.value() != kNCW && + param_.layout.value() != kNCHW && + param_.layout.value() != kNCDHW) + // Need CuDNN > 5.0 for layout support. use MXNet implementation + MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { + ConvolutionOp op; + op.Init(param); + op.Backward(ctx, inputs, req, outputs); + }) + return; + } +#endif #if MXNET_USE_CUDNN == 0 || CUDNN_MAJOR < 7 if (param.num_filter == param.num_group && param.layout.value() == mshadow::kNCHW && From e855e739ca2f975c4ff1e2332c468e74ab2560ef Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 8 Jun 2018 01:29:50 +0000 Subject: [PATCH 3/6] fix build --- src/operator/nn/convolution.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/operator/nn/convolution.cu b/src/operator/nn/convolution.cu index 4c09b9e57be5..2a39ff1e2299 100644 --- a/src/operator/nn/convolution.cu +++ b/src/operator/nn/convolution.cu @@ -175,7 +175,7 @@ void ConvolutionGradCompute(const nnvm::NodeAttrs& attrs, MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { ConvolutionOp op; op.Init(param); - op.Backward(ctx, inputs, req, outputs); + op.Backward(ctx, std::vector{out_grad}, in_data, req, in_grad); }) return; } From b75ecc42c6b2bcc5c626cc59039f2efdf3810d2f Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 8 Jun 2018 01:31:23 +0000 Subject: [PATCH 4/6] fix build --- src/operator/nn/convolution.cu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/operator/nn/convolution.cu b/src/operator/nn/convolution.cu index 2a39ff1e2299..c8f7d6cce2a6 100644 --- a/src/operator/nn/convolution.cu +++ b/src/operator/nn/convolution.cu @@ -92,7 +92,7 @@ void ConvolutionCompute(const nnvm::NodeAttrs& attrs, #if CUDNN_MAJOR < 5 if (param_.layout.value() != kNCW && param_.layout.value() != kNCHW && - param_.layout.value() != kNCDHW) + param_.layout.value() != kNCDHW) { // Need CuDNN > 5.0 for layout support. use MXNet implementation MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { ConvolutionOp op; @@ -170,7 +170,7 @@ void ConvolutionGradCompute(const nnvm::NodeAttrs& attrs, #if CUDNN_MAJOR < 5 if (param_.layout.value() != kNCW && param_.layout.value() != kNCHW && - param_.layout.value() != kNCDHW) + param_.layout.value() != kNCDHW) { // Need CuDNN > 5.0 for layout support. use MXNet implementation MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { ConvolutionOp op; From efc8a00eb23a7de9e203270731d61b421c0ef8e5 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 8 Jun 2018 01:46:11 +0000 Subject: [PATCH 5/6] fix lint --- src/operator/nn/convolution.cu | 40 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/operator/nn/convolution.cu b/src/operator/nn/convolution.cu index c8f7d6cce2a6..9f61212d5c78 100644 --- a/src/operator/nn/convolution.cu +++ b/src/operator/nn/convolution.cu @@ -90,16 +90,16 @@ void ConvolutionCompute(const nnvm::NodeAttrs& attrs, int dtype = inputs[conv::kData].type_flag_; #if CUDNN_MAJOR < 5 - if (param_.layout.value() != kNCW && - param_.layout.value() != kNCHW && - param_.layout.value() != kNCDHW) { - // Need CuDNN > 5.0 for layout support. use MXNet implementation - MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { - ConvolutionOp op; - op.Init(param); - op.Forward(ctx, inputs, req, outputs); - }) - return; + if (param_.layout.value() != kNCW && + param_.layout.value() != kNCHW && + param_.layout.value() != kNCDHW) { + // Need CuDNN > 5.0 for layout support. use MXNet implementation + MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { + ConvolutionOp op; + op.Init(param); + op.Forward(ctx, inputs, req, outputs); + }) + return; } #endif @@ -168,16 +168,16 @@ void ConvolutionGradCompute(const nnvm::NodeAttrs& attrs, int dtype = out_grad.type_flag_; #if CUDNN_MAJOR < 5 - if (param_.layout.value() != kNCW && - param_.layout.value() != kNCHW && - param_.layout.value() != kNCDHW) { - // Need CuDNN > 5.0 for layout support. use MXNet implementation - MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { - ConvolutionOp op; - op.Init(param); - op.Backward(ctx, std::vector{out_grad}, in_data, req, in_grad); - }) - return; + if (param_.layout.value() != kNCW && + param_.layout.value() != kNCHW && + param_.layout.value() != kNCDHW) { + // Need CuDNN > 5.0 for layout support. use MXNet implementation + MSHADOW_REAL_TYPE_SWITCH(dtype, DType, { + ConvolutionOp op; + op.Init(param); + op.Backward(ctx, std::vector{out_grad}, in_data, req, in_grad); + }) + return; } #endif #if MXNET_USE_CUDNN == 0 || CUDNN_MAJOR < 7 From 768693b6508369224fdea6060131df67df5ec20c Mon Sep 17 00:00:00 2001 From: Haibin Lin Date: Thu, 7 Jun 2018 23:40:14 -0700 Subject: [PATCH 6/6] Update convolution.cc --- src/operator/nn/convolution.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/operator/nn/convolution.cc b/src/operator/nn/convolution.cc index 3b90ce9a47eb..0e8a929e1ba5 100644 --- a/src/operator/nn/convolution.cc +++ b/src/operator/nn/convolution.cc @@ -384,9 +384,12 @@ struct ConvolutionGrad { const char *op_name; std::vector operator()(const nnvm::NodePtr& n, const std::vector& ograds) const { + const ConvolutionParam& param = nnvm::get(n->attrs.parsed); std::vector heads(ograds.begin(), ograds.end()); heads.push_back(n->inputs[conv::kData]); heads.push_back(n->inputs[conv::kWeight]); + if (!param.no_bias) + heads.push_back(n->inputs[conv::kBias]); return MakeGradNode(op_name, n, heads, n->attrs.dict); } };