From 68a97d3ce13cf0dd5874d569a0ef020e540a1773 Mon Sep 17 00:00:00 2001 From: Vladislav Golubev Date: Wed, 26 Jun 2024 15:30:20 +0200 Subject: [PATCH] [CPU] Avoid unnecessary reordering for nodes with several consumers before output & updated FC bf16 config --- src/plugins/intel_cpu/src/graph.cpp | 11 +++ .../fullyconnected_implementations.cpp | 3 +- .../classes/convolution.cpp | 8 +- .../single_layer_tests/group_convolution.cpp | 16 +--- .../src/classes/fuse_transpose_reorder.cpp | 9 +- .../src/common/matmul_decompress_convert.cpp | 94 +++++++------------ .../src/x64/matmul_quantized_subgraph.cpp | 9 +- .../tests/functional/utils/cpu_test_utils.cpp | 49 ++++++---- .../tests/functional/utils/cpu_test_utils.hpp | 7 ++ .../functional/utils/fusing_test_utils.cpp | 10 +- 10 files changed, 91 insertions(+), 125 deletions(-) diff --git a/src/plugins/intel_cpu/src/graph.cpp b/src/plugins/intel_cpu/src/graph.cpp index 01371d64b779a0..bd48ed63a91318 100644 --- a/src/plugins/intel_cpu/src/graph.cpp +++ b/src/plugins/intel_cpu/src/graph.cpp @@ -244,6 +244,17 @@ void Graph::Replicate(const std::shared_ptr& model, const auto parentEdge = outputNode->getParentEdgeAt(0); const auto parent = parentEdge->getParent(); parent->setOriginalOutputPrecisionAtPort(parentEdge->getInputNum(), precToSet); + // If the parent has consumers except Output, precToSet is propagated to consumer's inputs + // to avoid precision mismatch (which leads to reorder insertion and unnecessary performance overheads) + if (parent->getChildEdges().size() > 1) { + for (size_t i = 0; i < parent->getChildEdges().size(); ++i) { + const auto childEdge = parent->getChildEdgeAt(i); + // Consumers from other parent's output shouldn't be changed + if (childEdge->getInputNum() != parentEdge->getInputNum()) + continue; + childEdge->getChild()->setOriginalInputPrecisionAtPort(childEdge->getOutputNum(), precToSet); + } + } } } } diff --git a/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp b/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp index 3b702844850744..d930ea94748787 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp @@ -62,13 +62,12 @@ struct Require { // clang-format off static const TypeMapping dnnlFCTypeMapping { // {src, wei, bia, dst} pt - {{_bf16, _bf16 | _f32, _any, _bf16 | _f32}, pt(bypass(), bypass(), use<3>(), bypass())}, + {{_bf16, _bf16 | _f32 | _f16, _any, _bf16 | _f32}, pt(bypass(), bypass(), use<3>(), bypass())}, {{_f16, _f16, _any, _f16 | _f32}, pt(bypass(), bypass(), use<3>(), bypass())}, // integer precision outputs are not supported for float precision inputs {{_f32 | _bf16 | _f16, _any, _any, _i8 | _u8}, pt(bypass(), bypass(), use<0>(), use<0>())}, // compresses float weights which do not match input data precision {{_f32, _half_float, _any, _any | _any}, pt(bypass(), bypass(), use<0>(), use<0>())}, - {{_bf16, _f16, _any, _any | _any}, pt(bypass(), bypass(), use<0>(), use<0>())}, {{_f16, _bf16, _any, _any | _any}, pt(bypass(), bypass(), use<0>(), use<0>())}, // quantization configuration // int8 inner_product does not support f16 output and bias diff --git a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/convolution.cpp b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/convolution.cpp index ed7fdcff0479d8..d1aa8c6c6a89b2 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/convolution.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/convolution.cpp @@ -77,13 +77,7 @@ void ConvolutionLayerCPUTest::checkBiasFusing(ov::CompiledModel& execNet) const bool foundConv = false; for (const auto& node : execGraph->get_ops()) { const auto& rtInfo = node->get_rt_info(); - auto getExecValue = [&rtInfo](const std::string& paramName) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - - if (getExecValue(ov::exec_model_info::LAYER_TYPE) == "Convolution") { + if (getRuntimeValue(rtInfo, ov::exec_model_info::LAYER_TYPE) == "Convolution") { foundConv = true; ASSERT_EQ(3, node->inputs().size()); break; diff --git a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/group_convolution.cpp b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/group_convolution.cpp index 7d9173e472e089..7e79a6e2dc7562 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/group_convolution.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/group_convolution.cpp @@ -96,13 +96,8 @@ class GroupConvolutionLayerCPUTest : public testing::WithParamInterfaceget_ops()) { const auto& rtInfo = node->get_rt_info(); - auto getExecValue = [&rtInfo](const std::string& paramName) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - if (getExecValue(ov::exec_model_info::LAYER_TYPE) == "Convolution") { + if (getRuntimeValue(rtInfo, ov::exec_model_info::LAYER_TYPE) == "Convolution") { foundConv = true; ASSERT_EQ(3, node->inputs().size()); break; @@ -228,13 +223,8 @@ TEST_P(ExpectFallbackGroupConvolutionLayerCPUTest, CompareWithRefs) { auto function = compiledModel.get_runtime_model(); for (const auto& node : function->get_ops()) { const auto& rtInfo = node->get_rt_info(); - auto getExecValue = [&rtInfo](const std::string& paramName) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - if ("Convolution" == getExecValue(ov::exec_model_info::LAYER_TYPE)) { - auto primType = getExecValue(ov::exec_model_info::IMPL_TYPE); + if ("Convolution" == getRuntimeValue(rtInfo, ov::exec_model_info::LAYER_TYPE)) { + auto primType = getRuntimeValue(rtInfo, ov::exec_model_info::IMPL_TYPE); ASSERT_TRUE(selectedType != primType) << "primType is unexpected: " << primType; } } diff --git a/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/classes/fuse_transpose_reorder.cpp b/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/classes/fuse_transpose_reorder.cpp index 7b7c14c20b7701..e960cc5b85031a 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/classes/fuse_transpose_reorder.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/classes/fuse_transpose_reorder.cpp @@ -31,13 +31,8 @@ void FuseTransposeAndReorderTest::check_transpose_count(size_t expectedTranspose ASSERT_NE(nullptr, runtime_model); size_t actual_transpose_count = 0; for (const auto &node : runtime_model->get_ops()) { - const auto & rtInfo = node->get_rt_info(); - auto getExecValue = [&rtInfo](const std::string & paramName) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - if (getExecValue(ov::exec_model_info::LAYER_TYPE) == "Transpose") { + const auto& rtInfo = node->get_rt_info(); + if (getRuntimeValue(rtInfo, ov::exec_model_info::LAYER_TYPE) == "Transpose") { actual_transpose_count++; } } diff --git a/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/common/matmul_decompress_convert.cpp b/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/common/matmul_decompress_convert.cpp index aa68ca17db7375..65d1c2186811f5 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/common/matmul_decompress_convert.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/common/matmul_decompress_convert.cpp @@ -100,24 +100,11 @@ class MatMulDecompressConvertTest : public testing::WithParamInterface std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - - const auto execFunction = compiledModel.get_runtime_model(); - ASSERT_NE(nullptr, execFunction); - for (const auto& fcNode : execFunction->get_ops()) { - if (getExecValue(fcNode->get_rt_info(), ov::exec_model_info::LAYER_TYPE) == "FullyConnected") { - const auto& constNode = fcNode->get_input_node_shared_ptr(1); - ov::element::Type expectedType( - getExecValue(constNode->get_rt_info(), ov::exec_model_info::OUTPUT_PRECISIONS)); - ASSERT_EQ(expectedType, expectedWeiElemType); - } - } - } - void SetUp() override { targetDevice = ov::test::utils::DEVICE_CPU; @@ -196,23 +164,23 @@ class MatMulDecompressConvertTest : public testing::WithParamInterfacesecond.as() == ov::element::bf16) { - convertOutType = inType = outType = netType = ElementType::bf16; + netType = ElementType::bf16; weiConstElemType = (weiConstElemType != ElementType::f32) ? weiConstElemType : ElementType::bf16; - } else { - inType = outType = netType; + // Reorder between parameter and FullyConnected + // Note: reorder between FC and Result is not needed since FC primitive supports f32 output natively + reorderCount++; } std::string cpuNodeType = "FullyConnected"; - selectedType = makeSelectedTypeStr(selectedType, outType); + selectedType = makeSelectedTypeStr(selectedType, netType); ov::ParameterVector params{std::make_shared(inType, inShapeA)}; std::shared_ptr inputB = ov::test::utils::make_constant(weiConstElemType, inShapeB.get_shape()); - if (weiConstElemType == ElementType::f16 || weiConstElemType == ElementType::bf16) { - inputB = std::make_shared(inputB, convertOutType); + if (weiConstElemType != inType) { + inputB = std::make_shared(inputB, inType); mark_as_decompression(inputB); } expectedWeiConstElemType = weiConstElemType; @@ -223,18 +191,22 @@ class MatMulDecompressConvertTest : public testing::WithParamInterface> inputShapes3D = { {{{-1, -1, -1}, {{1, 2, 3}, {1, 5, 3}}}, {{1, 3, 4}, {{1, 3, 4}, {1, 3, 4}}}}, }; -ov::AnyMap emptyConfig = {/* empty config */}; - std::vector filter_additional_config_bf16() { std::vector additionalConfig; - if (ov::with_cpu_x86_avx512_core()) { + if (ov::with_cpu_x86_bfloat16()) { additionalConfig.push_back({{ov::hint::inference_precision(ov::element::bf16)}}); } return additionalConfig; @@ -307,7 +277,7 @@ std::vector filter_specific_params_bf16() { const auto testParams2D_FP32_smoke = ::testing::Combine(::testing::ValuesIn(inputShapes2D), ::testing::ValuesIn(transposeParams), ::testing::Values(ElementType::f32), - ::testing::Values(emptyConfig), + ::testing::Values(CPUTestUtils::empty_plugin_config), ::testing::ValuesIn(filter_specific_params(true))); INSTANTIATE_TEST_SUITE_P(smoke_FC_2D_FP32, @@ -318,7 +288,7 @@ INSTANTIATE_TEST_SUITE_P(smoke_FC_2D_FP32, const auto testParams2D_smoke = ::testing::Combine(::testing::ValuesIn(inputShapes2D), ::testing::ValuesIn(transposeParams), ::testing::Values(ElementType::f16, ElementType::bf16), - ::testing::Values(emptyConfig), + ::testing::Values(CPUTestUtils::empty_plugin_config), ::testing::ValuesIn(filter_specific_params(false))); INSTANTIATE_TEST_SUITE_P(smoke_FC_2D, @@ -340,7 +310,7 @@ INSTANTIATE_TEST_SUITE_P(smoke_FC_2D_BF16, const auto testParams3D_FP32_smoke = ::testing::Combine(::testing::ValuesIn(inputShapes3D), ::testing::ValuesIn(transposeParams), ::testing::Values(ElementType::f32), - ::testing::Values(emptyConfig), + ::testing::Values(CPUTestUtils::empty_plugin_config), ::testing::ValuesIn(filter_specific_params(true))); INSTANTIATE_TEST_SUITE_P(smoke_FC_3D_FP32, @@ -351,7 +321,7 @@ INSTANTIATE_TEST_SUITE_P(smoke_FC_3D_FP32, const auto testParams3D_smoke = ::testing::Combine(::testing::ValuesIn(inputShapes3D), ::testing::ValuesIn(transposeParams), ::testing::Values(ElementType::f16, ElementType::bf16), - ::testing::Values(emptyConfig), + ::testing::Values(CPUTestUtils::empty_plugin_config), ::testing::ValuesIn(filter_specific_params(false))); INSTANTIATE_TEST_SUITE_P(smoke_FC_3D, @@ -460,26 +430,26 @@ class MatMulDecompressConvertTest2 : public MatMulDecompressConvertTest { configuration.insert(additionalConfig.begin(), additionalConfig.end()); - ElementType netType = ElementType::f32; - ElementType convertOutType = ElementType::f32; + inType = outType = netType = ElementType::f32; auto it = additionalConfig.find(ov::hint::inference_precision.name()); if (it != additionalConfig.end() && it->second.as() == ov::element::bf16) { - convertOutType = inType = outType = netType = ElementType::bf16; + netType = ElementType::bf16; weiConstElemType = (weiConstElemType != ElementType::f32) ? weiConstElemType : ElementType::bf16; - } else { - inType = outType = netType; + // Reorder between parameter and FullyConnected + // Note: reorder between FC and Result is not needed since FC primitive supports f32 output natively + reorderCount++; } std::string cpuNodeType = "FullyConnected"; - selectedType = makeSelectedTypeStr(selectedType, outType); + selectedType = makeSelectedTypeStr(selectedType, netType); ov::ParameterVector params; for (auto&& shape : {inShapeFC0, inShapeFC1}) { params.push_back(std::make_shared(inType, shape)); } std::shared_ptr inputWeights = ov::test::utils::make_constant(weiConstElemType, inShapeWeights.get_shape()); - if (weiConstElemType == ElementType::f16) { - inputWeights = std::make_shared(inputWeights, convertOutType); + if (weiConstElemType != inType) { + inputWeights = std::make_shared(inputWeights, inType); mark_as_decompression(inputWeights); } expectedWeiConstElemType = weiConstElemType; @@ -505,7 +475,7 @@ const auto testParams2D_FP16_2_smoke = ::testing::Combine(::testing::Values(static_shapes_to_test_representation({{2, 3}, {2, 3}, {3, 4}})), ::testing::Values(std::pair{false, true}), ::testing::Values(ElementType::f16), - ::testing::Values(emptyConfig), + ::testing::Values(CPUTestUtils::empty_plugin_config), ::testing::ValuesIn(filter_specific_params(false))); INSTANTIATE_TEST_SUITE_P(smoke_FC_2D_FP16_2, @@ -644,7 +614,7 @@ const auto testParams2D_FP16_3_smoke = ::testing::Combine(::testing::Values(static_shapes_to_test_representation({{1, 16, 32}, {32, 64}})), ::testing::Values(std::pair{false, false}), ::testing::Values(ElementType::f16), - ::testing::Values(emptyConfig), + ::testing::Values(CPUTestUtils::empty_plugin_config), ::testing::ValuesIn(filter_specific_params(false))); INSTANTIATE_TEST_SUITE_P(smoke_FC_2D_FP16_3, diff --git a/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/x64/matmul_quantized_subgraph.cpp b/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/x64/matmul_quantized_subgraph.cpp index c1a65af4729890..015e87d0b01539 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/x64/matmul_quantized_subgraph.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/subgraph_tests/src/x64/matmul_quantized_subgraph.cpp @@ -108,14 +108,9 @@ class MatmulBrgemmInt8Test : public testing::WithParamInterface function, const std::string& nodeName) { ASSERT_NE(nullptr, function); for (const auto &node : function->get_ops()) { - const auto & rtInfo = node->get_rt_info(); - auto getExecValue = [&rtInfo](const std::string & paramName) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; + const auto& rtInfo = node->get_rt_info(); if (node->get_friendly_name() == nodeName) { - auto primType = getExecValue(ov::exec_model_info::IMPL_TYPE); + auto primType = getRuntimeValue(rtInfo, ov::exec_model_info::IMPL_TYPE); ASSERT_TRUE(primTypeCheck(primType)) << "primType is unexpected: " << primType << " Expected: " << selectedType; ASSERT_EQ(node->get_output_element_type(0), outType); ASSERT_EQ(node->get_input_element_type(0), inType); diff --git a/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.cpp b/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.cpp index 0c6c6cae2373b5..224e88f6725943 100644 --- a/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.cpp +++ b/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.cpp @@ -119,6 +119,12 @@ ov::PrimitivesPriority CPUTestsBase::impls2primProiority(const std::vectorsecond.as(); +} + void CPUTestsBase::CheckPluginRelatedResults(const ov::CompiledModel& execNet, const std::set& nodeType) const { if (!execNet || nodeType.empty()) @@ -138,12 +144,7 @@ void CPUTestsBase::CheckPluginRelatedResultsImpl(const std::shared_ptrget_ops()) { const auto& rtInfo = node->get_rt_info(); - auto getExecValue = [&rtInfo](const std::string& paramName) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - auto getExecValueOutputsLayout = [](const std::shared_ptr& node) -> std::string { + auto getRuntimeValueOutputsLayout = [](const std::shared_ptr& node) -> std::string { auto rtInfo = node->get_rt_info(); auto it = rtInfo.find(ov::exec_model_info::OUTPUT_LAYOUTS); OPENVINO_ASSERT(rtInfo.end() != it); @@ -163,7 +164,7 @@ void CPUTestsBase::CheckPluginRelatedResultsImpl(const std::shared_ptrget_input_size()); ASSERT_LE(outFmts.size(), node->get_output_size()); for (size_t i = 0; i < inFmts.size(); i++) { @@ -172,7 +173,7 @@ void CPUTestsBase::CheckPluginRelatedResultsImpl(const std::shared_ptrget_output_tensor(0).get_partial_shape(); - auto actualInputMemoryFormat = getExecValueOutputsLayout(parentNode); + auto actualInputMemoryFormat = getRuntimeValueOutputsLayout(parentNode); if (!should_be_skipped(shape, inFmts[i])) { ASSERT_EQ(inFmts[i], cpu_str2fmt(actualInputMemoryFormat.c_str())); @@ -192,7 +193,7 @@ void CPUTestsBase::CheckPluginRelatedResultsImpl(const std::shared_ptrget_output_partial_shape(i); if (should_be_skipped(shape, outFmts[i])) @@ -216,7 +217,7 @@ void CPUTestsBase::CheckPluginRelatedResultsImpl(const std::shared_ptr func ASSERT_NE(nullptr, function); size_t actualNodeCount = 0; for (const auto& node : function->get_ops()) { - const auto& rtInfo = node->get_rt_info(); - auto getExecValue = [&rtInfo](const std::string& paramName) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - - if (nodeTypes.count(getExecValue(ov::exec_model_info::LAYER_TYPE))) { + if (nodeTypes.count(getRuntimeValue(node->get_rt_info(), ov::exec_model_info::LAYER_TYPE))) { actualNodeCount++; } } @@ -537,4 +531,21 @@ bool containsSupportedFormatsOnly(const std::vector& format return true; } +void CheckNodePrecisionsWithType(const ov::CompiledModel& compiledModel, + const std::string& nodeType, + const ov::element::TypeVector& inPrecisions, + const ov::element::TypeVector& outPrecisions) { + const auto function = compiledModel.get_runtime_model(); + ASSERT_NE(nullptr, function); + for (const auto& node : function->get_ops()) { + if (getRuntimeValue(node->get_rt_info(), ov::exec_model_info::LAYER_TYPE) == nodeType) { + ASSERT_EQ(inPrecisions.size(), node->get_input_size()); + ASSERT_EQ(outPrecisions.size(), node->get_output_size()); + for (size_t i = 0; i < inPrecisions.size(); ++i) + ASSERT_EQ(inPrecisions[i], node->get_input_element_type(i)) << "i = " << i; + for (size_t i = 0; i < outPrecisions.size(); ++i) + ASSERT_EQ(outPrecisions[i], node->get_output_element_type(i)) << "i = " << i; + } + } +} } // namespace CPUTestUtils diff --git a/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.hpp b/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.hpp index 1a77918142e0d1..50bc1debf8d4d9 100644 --- a/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.hpp +++ b/src/plugins/intel_cpu/tests/functional/utils/cpu_test_utils.hpp @@ -189,4 +189,11 @@ bool containsNonSupportedFormat(const std::vector& formats, const std::vector& non_supported_f); bool containsSupportedFormatsOnly(const std::vector& formats, const std::vector& supported_f); + +void CheckNodePrecisionsWithType(const ov::CompiledModel& compiledModel, + const std::string& nodeType, + const ov::element::TypeVector& inPrecisions, + const ov::element::TypeVector& outPrecisions); + +std::string getRuntimeValue(const ov::Node::RTMap& rtInfo, const std::string& paramName); } // namespace CPUTestUtils diff --git a/src/plugins/intel_cpu/tests/functional/utils/fusing_test_utils.cpp b/src/plugins/intel_cpu/tests/functional/utils/fusing_test_utils.cpp index d34594ea9bcf1c..0aa74acd0c71f2 100644 --- a/src/plugins/intel_cpu/tests/functional/utils/fusing_test_utils.cpp +++ b/src/plugins/intel_cpu/tests/functional/utils/fusing_test_utils.cpp @@ -41,16 +41,10 @@ void CpuTestWithFusing::CheckFusingResults(const std::shared_ptrget_ops()) { const auto &rtInfo = op->get_rt_info(); - auto getExecValue = [](const std::string ¶mName, const ov::Node::RTMap& rtInfo) -> std::string { - auto it = rtInfo.find(paramName); - OPENVINO_ASSERT(rtInfo.end() != it); - return it->second.as(); - }; - - auto layerType = getExecValue("layerType", rtInfo); + const auto layerType = CPUTestUtils::getRuntimeValue(rtInfo, ov::exec_model_info::LAYER_TYPE); if (nodeType.count(layerType)) { isNodeFound = true; - auto originalLayersNames = getExecValue("originalLayersNames", rtInfo); + auto originalLayersNames = CPUTestUtils::getRuntimeValue(rtInfo, ov::exec_model_info::ORIGINAL_NAMES); std::string opFriendlyName = op->get_friendly_name(); ASSERT_TRUE(originalLayersNames.find(opFriendlyName) != std::string::npos) << "Operation name " << opFriendlyName << " has not been found in originalLayersNames!";