未验证 提交 7b46fb0f 编写于 作者: Y yukavio 提交者: GitHub

fix generate_proposals and affine grid error info (#27636)

上级 6d9ae660
...@@ -26,8 +26,12 @@ template <typename T> ...@@ -26,8 +26,12 @@ template <typename T>
class CUDNNAffineGridOpKernel : public framework::OpKernel<T> { class CUDNNAffineGridOpKernel : public framework::OpKernel<T> {
public: public:
void Compute(const framework::ExecutionContext& ctx) const override { void Compute(const framework::ExecutionContext& ctx) const override {
PADDLE_ENFORCE(platform::is_gpu_place(ctx.GetPlace()), PADDLE_ENFORCE_EQ(
"It must use CUDAPlace."); platform::is_gpu_place(ctx.GetPlace()), true,
platform::errors::InvalidArgument("Only "
"support for CUDAPlace.Please switch "
"your context from CPUPlace to "
"CUDAPlace or update your cudnn."));
auto& dev_ctx = ctx.template device_context<platform::CUDADeviceContext>(); auto& dev_ctx = ctx.template device_context<platform::CUDADeviceContext>();
auto handle = dev_ctx.cudnn_handle(); auto handle = dev_ctx.cudnn_handle();
auto* theta = ctx.Input<Tensor>("Theta"); auto* theta = ctx.Input<Tensor>("Theta");
...@@ -56,8 +60,11 @@ class CUDNNAffineGridOpKernel : public framework::OpKernel<T> { ...@@ -56,8 +60,11 @@ class CUDNNAffineGridOpKernel : public framework::OpKernel<T> {
cudnnSpatialTransformerDescriptor_t cudnn_st_desc = cudnnSpatialTransformerDescriptor_t cudnn_st_desc =
st_desc.descriptor<T>(4, h_size_data); st_desc.descriptor<T>(4, h_size_data);
PADDLE_ENFORCE(platform::dynload::cudnnSpatialTfGridGeneratorForward( PADDLE_ENFORCE_EQ(
handle, cudnn_st_desc, theta_data, output_data)); platform::dynload::cudnnSpatialTfGridGeneratorForward(
handle, cudnn_st_desc, theta_data, output_data),
0, platform::errors::Fatal("Some errors has occurred "
"during forward computation in cudnn."));
} }
}; };
...@@ -65,8 +72,12 @@ template <typename T> ...@@ -65,8 +72,12 @@ template <typename T>
class CUDNNAffineGridGradOpKernel : public framework::OpKernel<T> { class CUDNNAffineGridGradOpKernel : public framework::OpKernel<T> {
public: public:
void Compute(const framework::ExecutionContext& ctx) const override { void Compute(const framework::ExecutionContext& ctx) const override {
PADDLE_ENFORCE(platform::is_gpu_place(ctx.GetPlace()), PADDLE_ENFORCE_EQ(platform::is_gpu_place(ctx.GetPlace()), true,
"It must use CUDAPlace."); platform::errors::InvalidArgument(
"Only "
"support for CUDAPlace. Please switch "
"your context from CPUPlace to "
"CUDAPlace or update your cudnn."));
auto& dev_ctx = ctx.template device_context<platform::CUDADeviceContext>(); auto& dev_ctx = ctx.template device_context<platform::CUDADeviceContext>();
auto handle = dev_ctx.cudnn_handle(); auto handle = dev_ctx.cudnn_handle();
auto output_grad = ctx.Input<Tensor>(framework::GradVarName("Output")); auto output_grad = ctx.Input<Tensor>(framework::GradVarName("Output"));
...@@ -95,8 +106,12 @@ class CUDNNAffineGridGradOpKernel : public framework::OpKernel<T> { ...@@ -95,8 +106,12 @@ class CUDNNAffineGridGradOpKernel : public framework::OpKernel<T> {
const T* output_grad_data = output_grad->data<T>(); const T* output_grad_data = output_grad->data<T>();
T* theta_grad_data = theta_grad->mutable_data<T>(ctx.GetPlace()); T* theta_grad_data = theta_grad->mutable_data<T>(ctx.GetPlace());
PADDLE_ENFORCE(platform::dynload::cudnnSpatialTfGridGeneratorBackward( PADDLE_ENFORCE_EQ(
handle, cudnn_st_desc, output_grad_data, theta_grad_data)); platform::dynload::cudnnSpatialTfGridGeneratorBackward(
handle, cudnn_st_desc, output_grad_data, theta_grad_data),
0,
"Some errors "
"has occurred during forward computation in cudnn;");
} }
}; };
......
...@@ -247,8 +247,6 @@ static void NMS(const platform::CUDADeviceContext &ctx, const Tensor &proposals, ...@@ -247,8 +247,6 @@ static void NMS(const platform::CUDADeviceContext &ctx, const Tensor &proposals,
const Tensor &sorted_indices, const T nms_threshold, const Tensor &sorted_indices, const T nms_threshold,
Tensor *keep_out) { Tensor *keep_out) {
int boxes_num = proposals.dims()[0]; int boxes_num = proposals.dims()[0];
PADDLE_ENFORCE_EQ(boxes_num, sorted_indices.dims()[0]);
const int col_blocks = DIVUP(boxes_num, kThreadsPerBlock); const int col_blocks = DIVUP(boxes_num, kThreadsPerBlock);
dim3 blocks(DIVUP(boxes_num, kThreadsPerBlock), dim3 blocks(DIVUP(boxes_num, kThreadsPerBlock),
DIVUP(boxes_num, kThreadsPerBlock)); DIVUP(boxes_num, kThreadsPerBlock));
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import paddle
import numpy as np import numpy as np
from paddle import fluid, nn from paddle import fluid, nn
import paddle.fluid.dygraph as dg import paddle.fluid.dygraph as dg
...@@ -42,7 +43,7 @@ class AffineGridTestCase(unittest.TestCase): ...@@ -42,7 +43,7 @@ class AffineGridTestCase(unittest.TestCase):
self.theta = np.random.randn(*(self.theta_shape)).astype(self.dtype) self.theta = np.random.randn(*(self.theta_shape)).astype(self.dtype)
def fluid_layer(self, place): def fluid_layer(self, place):
# align_corners = True paddle.enable_static()
main = fluid.Program() main = fluid.Program()
start = fluid.Program() start = fluid.Program()
with fluid.unique_name.guard(): with fluid.unique_name.guard():
...@@ -57,6 +58,7 @@ class AffineGridTestCase(unittest.TestCase): ...@@ -57,6 +58,7 @@ class AffineGridTestCase(unittest.TestCase):
return y_np return y_np
def functional(self, place): def functional(self, place):
paddle.enable_static()
main = fluid.Program() main = fluid.Program()
start = fluid.Program() start = fluid.Program()
with fluid.unique_name.guard(): with fluid.unique_name.guard():
...@@ -74,6 +76,7 @@ class AffineGridTestCase(unittest.TestCase): ...@@ -74,6 +76,7 @@ class AffineGridTestCase(unittest.TestCase):
return y_np return y_np
def paddle_dygraph_layer(self): def paddle_dygraph_layer(self):
paddle.disable_static()
theta_var = dg.to_variable( theta_var = dg.to_variable(
self.theta) if not self.invalid_theta else "invalid" self.theta) if not self.invalid_theta else "invalid"
output_shape = dg.to_variable( output_shape = dg.to_variable(
...@@ -88,8 +91,7 @@ class AffineGridTestCase(unittest.TestCase): ...@@ -88,8 +91,7 @@ class AffineGridTestCase(unittest.TestCase):
place = fluid.CPUPlace() place = fluid.CPUPlace()
result1 = self.fluid_layer(place) result1 = self.fluid_layer(place)
result2 = self.functional(place) result2 = self.functional(place)
with dg.guard(place): result3 = self.paddle_dygraph_layer()
result3 = self.paddle_dygraph_layer()
if self.align_corners: if self.align_corners:
np.testing.assert_array_almost_equal(result1, result2) np.testing.assert_array_almost_equal(result1, result2)
np.testing.assert_array_almost_equal(result2, result3) np.testing.assert_array_almost_equal(result2, result3)
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
import unittest import unittest
import numpy as np import numpy as np
from op_test import OpTest from op_test import OpTest
import paddle
def AffineGrid(theta, size, align_corners): def AffineGrid(theta, size, align_corners):
...@@ -113,4 +114,5 @@ class TestAffineGridOpCase4(TestAffineGridOp): ...@@ -113,4 +114,5 @@ class TestAffineGridOpCase4(TestAffineGridOp):
if __name__ == '__main__': if __name__ == '__main__':
paddle.enable_static()
unittest.main() unittest.main()
...@@ -18,6 +18,7 @@ import unittest ...@@ -18,6 +18,7 @@ import unittest
import numpy as np import numpy as np
import sys import sys
import math import math
import paddle
import paddle.fluid as fluid import paddle.fluid as fluid
from op_test import OpTest from op_test import OpTest
from test_multiclass_nms_op import nms from test_multiclass_nms_op import nms
...@@ -370,4 +371,5 @@ class TestGenerateProposalsOpNoBoxLeft(TestGenerateProposalsOp): ...@@ -370,4 +371,5 @@ class TestGenerateProposalsOpNoBoxLeft(TestGenerateProposalsOp):
if __name__ == '__main__': if __name__ == '__main__':
paddle.enable_static()
unittest.main() unittest.main()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册