diff --git a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fully_connected_transformation.cpp b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fully_connected_transformation.cpp index 51de438b786..2544cd68274 100644 --- a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fully_connected_transformation.cpp +++ b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fully_connected_transformation.cpp @@ -22,7 +22,7 @@ const std::vector dimensions = { const std::vector trasformationParamValues = { LayerTestsUtils::LayerTransformationParamsFactory::createParams(), - // LayerTestsUtils::LayerTransformationParamsFactory::createParamsI8I8(), + LayerTestsUtils::LayerTransformationParamsFactory::createParamsI8I8(), LayerTestsUtils::LayerTransformationParamsFactory::createParamsU8I8() }; diff --git a/inference-engine/tests/functional/plugin/shared/src/low_precision_transformations/fully_connected_transformation.cpp b/inference-engine/tests/functional/plugin/shared/src/low_precision_transformations/fully_connected_transformation.cpp index 843438a4c72..d51d4b3237c 100644 --- a/inference-engine/tests/functional/plugin/shared/src/low_precision_transformations/fully_connected_transformation.cpp +++ b/inference-engine/tests/functional/plugin/shared/src/low_precision_transformations/fully_connected_transformation.cpp @@ -41,12 +41,16 @@ void FullyConnectedTransformation::SetUp() { auto ngPrecision = FuncTestUtils::PrecisionUtils::convertIE2nGraphPrc(netPrecision); const auto paramNode = std::make_shared(ngPrecision, ngraph::Shape(inputShape)); + const std::vector constShapes(inputShape.size(), 1ul); const auto fakeQuantizeOnAcitvations = ngraph::builder::makeFakeQuantize( - paramNode, ngPrecision, 256ul, { 1ul }, + paramNode, ngPrecision, 256ul, constShapes, { 0.f }, { 255.f / 4.f }, { 0.f }, { 255.f / 4.f }); fakeQuantizeOnAcitvations->set_friendly_name("fakeQuantizeOnAcitvations"); - auto weightsConst = std::make_shared(ngPrecision, ngraph::Shape{ inputShape[1], inputShape[1] }, std::vector({ 1.f })); + auto weightsConst = std::make_shared( + ngPrecision, + ngraph::Shape { inputShape[inputShape.size() - 1ul], inputShape[inputShape.size() - 1ul] }, + std::vector({ 1.f })); const auto fakeQuantizeOnWeights = ngraph::builder::makeFakeQuantize( weightsConst, ngPrecision, 256ul, { 1ul, 1ul }, { -128.f / 8.f }, { 127.f / 8.f }, { -128.f / 8.f }, { 127.f / 8.f }); @@ -90,10 +94,22 @@ void FullyConnectedTransformation::validate() { const InferenceEngine::CNNLayerPtr layer = InferenceEngine::details::CNNNetworkHelper::getParent(*outputLayer); if (params.updatePrecisions) { + const bool asymmetricQuantizationOnData = std::all_of( + params.precisionsOnActivations.begin(), + params.precisionsOnActivations.end(), + [](const InferenceEngine::Precision precision) { return precision != InferenceEngine::Precision::U8; }); + + const bool asymmetricQuantizationOnWeights = std::all_of( + params.precisionsOnWeights.begin(), + params.precisionsOnWeights.end(), + [](const InferenceEngine::Precision precision) { return precision != InferenceEngine::Precision::I8; }); + checkPrecisions( *layer, - { { InferenceEngine::Precision::U8 }, { InferenceEngine::Precision::I8 }, { netPrecision } }, - { getDeviceInternalPrecision(netPrecision) }); + { { params.precisionsOnActivations[0] }, { params.precisionsOnWeights[0] }, { netPrecision } }, + { getDeviceInternalPrecision(netPrecision) }, + asymmetricQuantizationOnData, + asymmetricQuantizationOnWeights); } else { checkPrecisions(*layer, netPrecision); } @@ -104,10 +120,6 @@ void FullyConnectedTransformation::validate() { TEST_P(FullyConnectedTransformation, CompareWithRefImpl) { Run(); - - if (targetDevice == std::string{CommonTestUtils::DEVICE_GPU}) { - PluginCache::get().reset(); - } }; } // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.cpp b/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.cpp index 1b120f2b3f0..50eb8a8b878 100644 --- a/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.cpp +++ b/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.cpp @@ -108,35 +108,49 @@ void LayerTransformation::checkPrecisions(const InferenceEngine::CNNLayer& layer void LayerTransformation::checkPrecisions( const InferenceEngine::CNNLayer& layer, const std::vector>& expectedInputPrecisions, - const std::vector& expectedOutputPrecisions) { + const std::vector& expectedOutputPrecisions, + const bool asymmetricQuantizationOnData, + const bool asymmetricQuantizationOnWeights) { EXPECT_EQ(expectedInputPrecisions.size(), layer.insData.size()) << "insert data count is no expected: " << layer.insData.size(); - for (size_t inputIndex = 0ul; inputIndex < layer.insData.size(); ++inputIndex) { - const std::vector& precisions = expectedInputPrecisions[inputIndex]; - const InferenceEngine::DataPtr insData = layer.insData[inputIndex].lock(); - EXPECT_TRUE(insData != nullptr) << "insert data is nullable"; - const InferenceEngine::Precision actualPrecision = insData->getTensorDesc().getPrecision(); + const auto checkPrecision = []( + const InferenceEngine::CNNLayer& layer, + const std::vector& expectedPrecisions, + const size_t index, + const bool input) { + const InferenceEngine::DataPtr data = input ? layer.insData[index].lock() : layer.outData[index]; + EXPECT_TRUE(data != nullptr) << "data is nullable"; + const InferenceEngine::Precision actualPrecision = data->getTensorDesc().getPrecision(); EXPECT_FALSE(std::all_of( - precisions.begin(), - precisions.end(), + expectedPrecisions.begin(), + expectedPrecisions.end(), [&](const InferenceEngine::Precision precision) { return getDeviceInternalPrecision(precision) != actualPrecision; })) << - "expected input precisions on " << inputIndex << " input port " << precisions << + "expected precisions on " << index << (input ? " input" : " output") << " port " << expectedPrecisions << " actual precision " << actualPrecision; + }; + + if (asymmetricQuantizationOnData || asymmetricQuantizationOnWeights) { + if (asymmetricQuantizationOnData) { + const InferenceEngine::CNNLayerPtr parentOnData = InferenceEngine::details::CNNNetworkHelper::getParent(layer, 0); + checkPrecision(*parentOnData, expectedInputPrecisions[0], 0, true); + } else { + checkPrecision(layer, expectedInputPrecisions[0], 0, true); + } + + if (asymmetricQuantizationOnWeights) { + const InferenceEngine::CNNLayerPtr parentOnWeights = InferenceEngine::details::CNNNetworkHelper::getParent(layer, 1); + checkPrecision(*parentOnWeights, expectedInputPrecisions[1], 1, true); + } else { + checkPrecision(layer, expectedInputPrecisions[1], 1, true); + } + } else { + for (size_t inputIndex = 0ul; inputIndex < layer.insData.size(); ++inputIndex) { + checkPrecision(layer, expectedInputPrecisions[inputIndex], inputIndex, true); + } } - { - const InferenceEngine::DataPtr outData = layer.outData[0]; - EXPECT_TRUE(outData != nullptr) << "output data is nullable"; - const InferenceEngine::Precision actualPrecision = outData->getTensorDesc().getPrecision(); - - EXPECT_FALSE(std::all_of( - expectedOutputPrecisions.begin(), - expectedOutputPrecisions.end(), - [&](const InferenceEngine::Precision expectedPrecision) { return getDeviceInternalPrecision(expectedPrecision) != actualPrecision; })) << - "expected output precisions " << expectedOutputPrecisions << - " actual precision " << actualPrecision; - } + checkPrecision(layer, expectedOutputPrecisions, 0, false); } std::pair LayerTransformation::getQuantizationInterval(const InferenceEngine::Precision precision) { diff --git a/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.hpp b/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.hpp index 4c57490049f..5c139fef1b7 100644 --- a/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.hpp +++ b/inference-engine/tests/ie_test_utils/functional_test_utils/low_precision_transformations/layer_transformation.hpp @@ -56,7 +56,9 @@ protected: static void checkPrecisions( const InferenceEngine::CNNLayer& layer, const std::vector>& expectedInputPrecisions, - const std::vector& expectedOutputPrecisions); + const std::vector& expectedOutputPrecisions, + const bool asymmetricQuantizationOnData = false, + const bool asymmetricQuantizationOnWeights = false); static std::pair getQuantizationInterval(const InferenceEngine::Precision precision);