From 68398abce9122366c69894ee3e6603708f70ad1d Mon Sep 17 00:00:00 2001 From: cc <52520497+juncaipeng@users.noreply.github.com> Date: Mon, 4 Jan 2021 14:20:21 +0800 Subject: [PATCH] [Inference] zero_copy_tensor supports int8_t (#30053) * zero_copy_tensor supports int8_t --- .../inference/api/details/zero_copy_tensor.cc | 9 ++ paddle/fluid/inference/api/paddle_api.h | 1 + .../fluid/inference/tests/api/tester_helper.h | 111 +++++++----------- paddle/fluid/pybind/inference_api.cc | 9 ++ 4 files changed, 62 insertions(+), 68 deletions(-) diff --git a/paddle/fluid/inference/api/details/zero_copy_tensor.cc b/paddle/fluid/inference/api/details/zero_copy_tensor.cc index 46755eeda6..bf63d40438 100644 --- a/paddle/fluid/inference/api/details/zero_copy_tensor.cc +++ b/paddle/fluid/inference/api/details/zero_copy_tensor.cc @@ -165,10 +165,14 @@ template PD_INFER_DECL void ZeroCopyTensor::copy_from_cpu( const int32_t *data); template PD_INFER_DECL void ZeroCopyTensor::copy_from_cpu( const uint8_t *data); +template PD_INFER_DECL void ZeroCopyTensor::copy_from_cpu( + const int8_t *data); + template PD_INFER_DECL void ZeroCopyTensor::copy_to_cpu(float *data); template PD_INFER_DECL void ZeroCopyTensor::copy_to_cpu(int64_t *data); template PD_INFER_DECL void ZeroCopyTensor::copy_to_cpu(int32_t *data); template PD_INFER_DECL void ZeroCopyTensor::copy_to_cpu(uint8_t *data); +template PD_INFER_DECL void ZeroCopyTensor::copy_to_cpu(int8_t *data); template PD_INFER_DECL float *ZeroCopyTensor::data(PaddlePlace *place, int *size) const; @@ -178,6 +182,9 @@ template PD_INFER_DECL int32_t *ZeroCopyTensor::data( PaddlePlace *place, int *size) const; template PD_INFER_DECL uint8_t *ZeroCopyTensor::data( PaddlePlace *place, int *size) const; +template PD_INFER_DECL int8_t *ZeroCopyTensor::data(PaddlePlace *place, + int *size) const; + template PD_INFER_DECL float *ZeroCopyTensor::mutable_data( PaddlePlace place); template PD_INFER_DECL int64_t *ZeroCopyTensor::mutable_data( @@ -186,6 +193,8 @@ template PD_INFER_DECL int32_t *ZeroCopyTensor::mutable_data( PaddlePlace place); template PD_INFER_DECL uint8_t *ZeroCopyTensor::mutable_data( PaddlePlace place); +template PD_INFER_DECL int8_t *ZeroCopyTensor::mutable_data( + PaddlePlace place); void *ZeroCopyTensor::FindTensor() const { PADDLE_ENFORCE_EQ( diff --git a/paddle/fluid/inference/api/paddle_api.h b/paddle/fluid/inference/api/paddle_api.h index 55699a795f..0262ab5451 100644 --- a/paddle/fluid/inference/api/paddle_api.h +++ b/paddle/fluid/inference/api/paddle_api.h @@ -39,6 +39,7 @@ enum PaddleDType { INT64, INT32, UINT8, + INT8, // TODO(Superjomn) support more data types if needed. }; diff --git a/paddle/fluid/inference/tests/api/tester_helper.h b/paddle/fluid/inference/tests/api/tester_helper.h index c9292ddc71..170b915ec7 100644 --- a/paddle/fluid/inference/tests/api/tester_helper.h +++ b/paddle/fluid/inference/tests/api/tester_helper.h @@ -257,40 +257,29 @@ void CompareResult(const std::vector &outputs, EXPECT_GT(size, 0UL); EXPECT_EQ(size, ref_size); EXPECT_EQ(out.dtype, ref_out.dtype); + +#define COMPARE(paddle_type, type, func) \ + case paddle_type: { \ + type *pdata = static_cast(out.data.data()); \ + type *pdata_ref = static_cast(ref_out.data.data()); \ + for (size_t j = 0; j < size; ++j) { \ + func(pdata_ref[j], pdata[j]); \ + } \ + break; \ + } + switch (out.dtype) { - case PaddleDType::INT64: { - int64_t *pdata = static_cast(out.data.data()); - int64_t *pdata_ref = static_cast(ref_out.data.data()); - for (size_t j = 0; j < size; ++j) { - EXPECT_EQ(pdata_ref[j], pdata[j]); - } - break; - } - case PaddleDType::FLOAT32: { - float *pdata = static_cast(out.data.data()); - float *pdata_ref = static_cast(ref_out.data.data()); - for (size_t j = 0; j < size; ++j) { - CheckError(pdata_ref[j], pdata[j]); - } - break; - } - case PaddleDType::INT32: { - int32_t *pdata = static_cast(out.data.data()); - int32_t *pdata_ref = static_cast(ref_out.data.data()); - for (size_t j = 0; j < size; ++j) { - EXPECT_EQ(pdata_ref[j], pdata[j]); - } - break; - } - case PaddleDType::UINT8: { - uint8_t *pdata = static_cast(out.data.data()); - uint8_t *pdata_ref = static_cast(ref_out.data.data()); - for (size_t j = 0; j < size; ++j) { - EXPECT_EQ(pdata_ref[j], pdata[j]); - } - break; - } + COMPARE(PaddleDType::INT64, int64_t, EXPECT_EQ); + COMPARE(PaddleDType::FLOAT32, float, CheckError); + COMPARE(PaddleDType::INT32, int32_t, EXPECT_EQ); + COMPARE(PaddleDType::UINT8, uint8_t, EXPECT_EQ); + COMPARE(PaddleDType::INT8, int8_t, EXPECT_EQ); + default: + PADDLE_THROW(platform::errors::InvalidArgument( + "VarMessageToVarType: Unsupported dtype %d", + static_cast(out.dtype))); } +#undef COMPARE } } @@ -306,44 +295,30 @@ void CompareResult(const std::vector &outputs, EXPECT_GT(size, 0UL); int ref_size = 0; // this is the number of elements not memory size PaddlePlace place; + +#define COMPARE(paddle_type, type, func) \ + case paddle_type: { \ + type *pdata = static_cast(out.data.data()); \ + type *pdata_ref = ref_out.data(&place, &ref_size); \ + EXPECT_EQ(size, static_cast(ref_size)); \ + for (size_t j = 0; j < size; ++j) { \ + func(pdata_ref[j], pdata[j]); \ + } \ + break; \ + } + switch (out.dtype) { - case PaddleDType::INT64: { - int64_t *pdata = static_cast(out.data.data()); - int64_t *pdata_ref = ref_out.data(&place, &ref_size); - EXPECT_EQ(size, static_cast(ref_size)); - for (size_t j = 0; j < size; ++j) { - EXPECT_EQ(pdata_ref[j], pdata[j]); - } - break; - } - case PaddleDType::FLOAT32: { - float *pdata = static_cast(out.data.data()); - float *pdata_ref = ref_out.data(&place, &ref_size); - EXPECT_EQ(size, static_cast(ref_size)); - for (size_t j = 0; j < size; ++j) { - CheckError(pdata_ref[j], pdata[j]); - } - break; - } - case PaddleDType::INT32: { - int32_t *pdata = static_cast(out.data.data()); - int32_t *pdata_ref = ref_out.data(&place, &ref_size); - EXPECT_EQ(size, static_cast(ref_size)); - for (size_t j = 0; j < size; ++j) { - EXPECT_EQ(pdata_ref[j], pdata[j]); - } - break; - } - case PaddleDType::UINT8: { - uint8_t *pdata = static_cast(out.data.data()); - uint8_t *pdata_ref = ref_out.data(&place, &ref_size); - EXPECT_EQ(size, static_cast(ref_size)); - for (size_t j = 0; j < size; ++j) { - EXPECT_EQ(pdata_ref[j], pdata[j]); - } - break; - } + COMPARE(PaddleDType::INT64, int64_t, EXPECT_EQ); + COMPARE(PaddleDType::FLOAT32, float, CheckError); + COMPARE(PaddleDType::INT32, int32_t, EXPECT_EQ); + COMPARE(PaddleDType::UINT8, uint8_t, EXPECT_EQ); + COMPARE(PaddleDType::INT8, int8_t, EXPECT_EQ); + default: + PADDLE_THROW(platform::errors::InvalidArgument( + "VarMessageToVarType: Unsupported dtype %d", + static_cast(out.dtype))); } +#undef COMPARE } } diff --git a/paddle/fluid/pybind/inference_api.cc b/paddle/fluid/pybind/inference_api.cc index 389beb4105..61b5c4899e 100644 --- a/paddle/fluid/pybind/inference_api.cc +++ b/paddle/fluid/pybind/inference_api.cc @@ -199,6 +199,9 @@ py::array ZeroCopyTensorToNumpy(ZeroCopyTensor &tensor) { // NOLINT case PaddleDType::UINT8: tensor.copy_to_cpu(static_cast(array.mutable_data())); break; + case PaddleDType::INT8: + tensor.copy_to_cpu(static_cast(array.mutable_data())); + break; default: PADDLE_THROW(platform::errors::Unimplemented( "Unsupported data type. Now only supports INT32, INT64, UINT8 and " @@ -223,6 +226,12 @@ py::array PaddleInferTensorToNumpy(paddle_infer::Tensor &tensor) { // NOLINT case PaddleDType::FLOAT32: tensor.CopyToCpu(static_cast(array.mutable_data())); break; + case PaddleDType::UINT8: + tensor.CopyToCpu(static_cast(array.mutable_data())); + break; + case PaddleDType::INT8: + tensor.CopyToCpu(static_cast(array.mutable_data())); + break; default: PADDLE_THROW(platform::errors::Unimplemented( "Unsupported data type. Now only supports INT32, INT64 and "