diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2022-10-27 11:37:29 +0100 |
---|---|---|
committer | TeresaARM <teresa.charlinreyes@arm.com> | 2022-10-28 10:23:36 +0000 |
commit | 4d85adf436092d01ca0957967156e36060e8be68 (patch) | |
tree | ad13e2320c98f93c058b0cd43186005e7258d1ee /delegate | |
parent | 0f86ecfce593a302ebd2baf8b70c9f6f50616f81 (diff) | |
download | armnn-4d85adf436092d01ca0957967156e36060e8be68.tar.gz |
IVGCVSW-7296 REDUCE_PROD tests fail when using Tf 2.10
* In TF what ArmNN calls quantized data types can be non-quantized as well.
* This patch creates 2 models:
* ArmNN: model where int8 and uint8 will always be quantized, but scale can be 1 and offset 0
* TFLite: model where int8 and uint8 can be quantized and non-quantized
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Change-Id: Id960f2f30988f2bbec88cb4e0c52c189ac957bae
Diffstat (limited to 'delegate')
-rw-r--r-- | delegate/src/test/ReduceTest.cpp | 18 | ||||
-rw-r--r-- | delegate/src/test/ReduceTestHelper.hpp | 97 |
2 files changed, 74 insertions, 41 deletions
diff --git a/delegate/src/test/ReduceTest.cpp b/delegate/src/test/ReduceTest.cpp index b81c5df592..9c11c8736c 100644 --- a/delegate/src/test/ReduceTest.cpp +++ b/delegate/src/test/ReduceTest.cpp @@ -354,8 +354,7 @@ TEST_CASE ("Sum_Fp32_GpuAcc_Test") TEST_SUITE("Prod_CpuRefTests") { -TEST_CASE ("Prod_Uint8_KeepDims_CpuRef_Test" - * doctest::skip(true) ) +TEST_CASE ("Prod_Uint8_KeepDims_CpuRef_Test") { std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef}; std::vector<uint8_t> expectedOutputValues { 4, 6, 3 }; @@ -364,8 +363,7 @@ TEST_CASE ("Prod_Uint8_KeepDims_CpuRef_Test" expectedOutputValues); } -TEST_CASE ("Prod_Fp32_CpuRef_Test" - * doctest::skip(true) ) +TEST_CASE ("Prod_Fp32_CpuRef_Test") { std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef}; std::vector<float> expectedOutputValues { 10010.0f, 11022.0f, 12036.0f }; @@ -379,8 +377,7 @@ TEST_CASE ("Prod_Fp32_CpuRef_Test" TEST_SUITE("Prod_CpuAccTests") { -TEST_CASE ("Prod_Uint8_KeepDims_CpuAcc_Test" - * doctest::skip(true) ) +TEST_CASE ("Prod_Uint8_KeepDims_CpuAcc_Test" ) { std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc}; std::vector<uint8_t> expectedOutputValues { 4, 6, 3 }; @@ -389,8 +386,7 @@ TEST_CASE ("Prod_Uint8_KeepDims_CpuAcc_Test" expectedOutputValues); } -TEST_CASE ("Prod_Fp32_CpuAcc_Test" - * doctest::skip(true) ) +TEST_CASE ("Prod_Fp32_CpuAcc_Test") { std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc}; std::vector<float> expectedOutputValues { 10010.0f, 11022.0f, 12036.0f }; @@ -404,8 +400,7 @@ TEST_CASE ("Prod_Fp32_CpuAcc_Test" TEST_SUITE("Prod_GpuAccTests") { -TEST_CASE ("Prod_Uint8_KeepDims_GpuAcc_Test" - * doctest::skip(true) ) +TEST_CASE ("Prod_Uint8_KeepDims_GpuAcc_Test") { std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc}; std::vector<uint8_t> expectedOutputValues { 4, 6, 3 }; @@ -414,8 +409,7 @@ TEST_CASE ("Prod_Uint8_KeepDims_GpuAcc_Test" expectedOutputValues); } -TEST_CASE ("Prod_Fp32_GpuAcc_Test" - * doctest::skip(true) ) +TEST_CASE ("Prod_Fp32_GpuAcc_Test") { std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc}; std::vector<float> expectedOutputValues { 10010.0f, 11022.0f, 12036.0f }; diff --git a/delegate/src/test/ReduceTestHelper.hpp b/delegate/src/test/ReduceTestHelper.hpp index b41fcfa39b..5457adbd0f 100644 --- a/delegate/src/test/ReduceTestHelper.hpp +++ b/delegate/src/test/ReduceTestHelper.hpp @@ -24,14 +24,15 @@ namespace { std::vector<char> CreateReduceTfLiteModel(tflite::BuiltinOperator reduceOperatorCode, - tflite::TensorType tensorType, - std::vector<int32_t>& input0TensorShape, - std::vector<int32_t>& input1TensorShape, - const std::vector <int32_t>& outputTensorShape, - std::vector<int32_t>& axisData, - const bool keepDims, - float quantScale = 1.0f, - int quantOffset = 0) + tflite::TensorType tensorType, + std::vector<int32_t>& input0TensorShape, + std::vector<int32_t>& input1TensorShape, + const std::vector <int32_t>& outputTensorShape, + std::vector<int32_t>& axisData, + const bool keepDims, + float quantScale = 1.0f, + int quantOffset = 0, + bool kTfLiteNoQuantizationForQuantized = false) { using namespace tflite; flatbuffers::FlatBufferBuilder flatBufferBuilder; @@ -42,12 +43,38 @@ std::vector<char> CreateReduceTfLiteModel(tflite::BuiltinOperator reduceOperator flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(axisData.data()), sizeof(int32_t) * axisData.size())); - auto quantizationParameters = - CreateQuantizationParameters(flatBufferBuilder, - 0, - 0, - flatBufferBuilder.CreateVector<float>({ quantScale }), - flatBufferBuilder.CreateVector<int64_t>({ quantOffset })); + flatbuffers::Offset<tflite::QuantizationParameters> quantizationParametersAxis + = CreateQuantizationParameters(flatBufferBuilder); + + flatbuffers::Offset<tflite::QuantizationParameters> quantizationParameters; + + if (kTfLiteNoQuantizationForQuantized) + { + if ((quantScale == 1 || quantScale == 0) && quantOffset == 0) + { + // Creates quantization parameter with quantization.type = kTfLiteNoQuantization + quantizationParameters = CreateQuantizationParameters(flatBufferBuilder); + } + else + { + // Creates quantization parameter with quantization.type != kTfLiteNoQuantization + quantizationParameters = CreateQuantizationParameters( + flatBufferBuilder, + 0, + 0, + flatBufferBuilder.CreateVector<float>({quantScale}), + flatBufferBuilder.CreateVector<int64_t>({quantOffset})); + } + } + else + { + quantizationParameters = CreateQuantizationParameters( + flatBufferBuilder, + 0, + 0, + flatBufferBuilder.CreateVector<float>({quantScale}), + flatBufferBuilder.CreateVector<int64_t>({quantOffset})); + } std::array<flatbuffers::Offset<Tensor>, 3> tensors; tensors[0] = CreateTensor(flatBufferBuilder, @@ -64,7 +91,7 @@ std::vector<char> CreateReduceTfLiteModel(tflite::BuiltinOperator reduceOperator ::tflite::TensorType_INT32, 1, flatBufferBuilder.CreateString("axis"), - quantizationParameters); + quantizationParametersAxis); // Create output tensor tensors[2] = CreateTensor(flatBufferBuilder, @@ -75,7 +102,7 @@ std::vector<char> CreateReduceTfLiteModel(tflite::BuiltinOperator reduceOperator flatBufferBuilder.CreateString("output"), quantizationParameters); - // Create operator. Reduce operations MIN, MAX, SUM, MEAN uses ReducerOptions. + // Create operator. Reduce operations MIN, MAX, SUM, MEAN, PROD uses ReducerOptions. tflite::BuiltinOptions operatorBuiltinOptionsType = tflite::BuiltinOptions_ReducerOptions; flatbuffers::Offset<void> operatorBuiltinOptions = CreateReducerOptions(flatBufferBuilder, keepDims).Union(); @@ -131,27 +158,39 @@ void ReduceTest(tflite::BuiltinOperator reduceOperatorCode, int quantOffset = 0) { using namespace tflite; - std::vector<char> modelBuffer = CreateReduceTfLiteModel(reduceOperatorCode, - tensorType, - input0Shape, - input1Shape, - expectedOutputShape, - input1Values, - keepDims, - quantScale, - quantOffset); - - const Model* tfLiteModel = GetModel(modelBuffer.data()); + std::vector<char> modelBufferArmNN = CreateReduceTfLiteModel(reduceOperatorCode, + tensorType, + input0Shape, + input1Shape, + expectedOutputShape, + input1Values, + keepDims, + quantScale, + quantOffset, + false); + std::vector<char> modelBufferTFLite = CreateReduceTfLiteModel(reduceOperatorCode, + tensorType, + input0Shape, + input1Shape, + expectedOutputShape, + input1Values, + keepDims, + quantScale, + quantOffset, + true); + + const Model* tfLiteModelArmNN = GetModel(modelBufferArmNN.data()); + const Model* tfLiteModelTFLite = GetModel(modelBufferTFLite.data()); // Create TfLite Interpreters std::unique_ptr<Interpreter> armnnDelegateInterpreter; - CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver()) + CHECK(InterpreterBuilder(tfLiteModelArmNN, ::tflite::ops::builtin::BuiltinOpResolver()) (&armnnDelegateInterpreter) == kTfLiteOk); CHECK(armnnDelegateInterpreter != nullptr); CHECK(armnnDelegateInterpreter->AllocateTensors() == kTfLiteOk); std::unique_ptr<Interpreter> tfLiteInterpreter; - CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver()) + CHECK(InterpreterBuilder(tfLiteModelTFLite, ::tflite::ops::builtin::BuiltinOpResolver()) (&tfLiteInterpreter) == kTfLiteOk); CHECK(tfLiteInterpreter != nullptr); CHECK(tfLiteInterpreter->AllocateTensors() == kTfLiteOk); |