diff --git a/src/common/low_precision_transformations/src/network_helper.cpp b/src/common/low_precision_transformations/src/network_helper.cpp index d0a7470a6cf..f2ea9cbc61f 100644 --- a/src/common/low_precision_transformations/src/network_helper.cpp +++ b/src/common/low_precision_transformations/src/network_helper.cpp @@ -691,6 +691,15 @@ size_t NetworkHelper::calculateLevels( float& dequantizationSub, float& updatedOutputLowValue, float& updatedOutputHighValue) { + if (combinedIntervalHigh == combinedIntervalLow) { + // degenerate case: quantization to a point + dequantizationMul = 1.f; + dequantizationSub = 0.f; + updatedOutputLowValue = combinedIntervalLow; + updatedOutputHighValue = combinedIntervalHigh; + return 1ull; + } + const float maxOutputInterval = combinedIntervalHigh - combinedIntervalLow; // FQ -> SUB_quantization -> MUL_quantization -[INT8]-> SUB_dequantization -> MUL_dequantization -> const float quantizationMul = (dataPrecisionMax - dataPrecisionMin) / maxOutputInterval; @@ -882,38 +891,27 @@ std::tuple, std::shared_ptr> NetworkHelper::decompos std::vector shifts(outputSize, 0.f); std::vector scales(outputSize); - // compute dequantizations (in double for INT32) - if (precision == element::i32 || precision == element::u32) { - for (size_t i = 0; i < outputSize; ++i) { - if (outputHighValues[i] != outputLowValues[i]) { + for (size_t i = 0; i < outputSize; ++i) { + if (outputHighValues[i] != outputLowValues[i]) { + // compute dequantizations (in double for INT32) + if (precision == element::i32 || precision == element::u32) { shifts[i] = static_cast( (static_cast(min) * outputHighValues[i] - static_cast(max) * outputLowValues[i]) / (static_cast(outputHighValues[i]) - outputLowValues[i])); scales[i] = static_cast( (static_cast(outputHighValues[i]) - outputLowValues[i]) / (static_cast(max) - min)); - if (shifts[i] == -0.f) { - shifts[i] = 0.f; - } } else { - scales[i] = outputHighValues[i]; - minValues[i] = 1.f; - maxValues[i] = 1.f; - } - } - } else { - for (size_t i = 0; i < outputSize; ++i) { - if (outputHighValues[i] != outputLowValues[i]) { shifts[i] = (min * outputHighValues[i] - max * outputLowValues[i]) / (outputHighValues[i] - outputLowValues[i]); scales[i] = (outputHighValues[i] - outputLowValues[i]) / (max - min); - if (shifts[i] == -0.f) { - shifts[i] = 0.f; - } - } else { - scales[i] = outputHighValues[i]; - minValues[i] = 1.f; - maxValues[i] = 1.f; } + if (shifts[i] == -0.f) { + shifts[i] = 0.f; + } + } else { + scales[i] = 1.f; + minValues[i] = outputHighValues[i]; + maxValues[i] = outputHighValues[i]; } } @@ -981,15 +979,12 @@ std::tuple, std::shared_ptr> NetworkHelper::decompos std::shared_ptr convert2; if (updatePrecision) { std::shared_ptr convert; - std::shared_ptr newFqConstant = ov::as_type_ptr(newFQ); - if (ov::is_type(newFQ)) { - convert = foldConvert(newFQ->output(0), precision); - } else if (ov::is_type(newFQ)) { + if (ov::is_type(newFQ)) { newFQ = setOutDataPrecision(ov::as_type_ptr(newFQ), precision); convert = newFQ; } else { - THROW_IE_LPT_EXCEPTION(*newFQ) << "unexpected operation type"; + convert = foldConvert(newFQ->output(0), precision); } convert2 = std::make_shared(convert, element::f32); diff --git a/src/plugins/intel_cpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp b/src/plugins/intel_cpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp index 5ab2357dd05..b611a0edb76 100644 --- a/src/plugins/intel_cpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp +++ b/src/plugins/intel_cpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp @@ -141,6 +141,14 @@ const std::vector params false, "Convolution", "f32" + }, + { + { 256ul, ov::Shape { 1, 1, 1, 1 }, { 0.f }, { 0.f }, { 0.f }, { 0.f } }, + false, + { 255ul, ov::Shape { 1, 1, 1, 1 }, { 0.f }, { 254.f }, { -12.7f }, { 12.7f } }, + false, + "Convolution", + "u8" } }; diff --git a/src/plugins/intel_gpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp b/src/plugins/intel_gpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp index 9817ca7239d..5ee51c51199 100644 --- a/src/plugins/intel_gpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp +++ b/src/plugins/intel_gpu/tests/functional/shared_tests_instances/low_precision_transformations/convolution_transformation.cpp @@ -110,6 +110,14 @@ const std::vector params false, "Convolution", "FP32" + }, + { + { 256ul, ov::Shape { 1, 1, 1, 1 }, { 0.f }, { 0.f }, { 0.f }, { 0.f } }, + false, + { 255ul, ov::Shape { 1, 1, 1, 1 }, { 0.f }, { 254.f }, { -12.7f }, { 12.7f } }, + false, + "Convolution", + "u8" } };