From 98e88bee52276a0a068eadfb92caeedf68d31a52 Mon Sep 17 00:00:00 2001 From: Nikolay Shchegolev Date: Wed, 12 Jul 2023 16:59:07 +0400 Subject: [PATCH] [CPU] Support Pad-12. (#18407) --- src/plugins/intel_cpu/src/nodes/pad.cpp | 53 ++++++------ src/plugins/intel_cpu/src/nodes/pad.h | 6 +- .../functional/single_layer_tests/pad.cpp | 86 ++++++++++--------- .../src/base/utils/compare_results.cpp | 1 + 4 files changed, 74 insertions(+), 72 deletions(-) diff --git a/src/plugins/intel_cpu/src/nodes/pad.cpp b/src/plugins/intel_cpu/src/nodes/pad.cpp index 9066c6a855b..fe6a9ffb1f3 100644 --- a/src/plugins/intel_cpu/src/nodes/pad.cpp +++ b/src/plugins/intel_cpu/src/nodes/pad.cpp @@ -3,16 +3,13 @@ // #include "pad.h" -#include -#include -#include -#include -#include + #include "ie_parallel.hpp" #include "common/cpu_memcpy.h" #include "utils/bfloat16.hpp" #include -#include +#include +#include #include using namespace dnnl; @@ -23,21 +20,21 @@ namespace ov { namespace intel_cpu { namespace node { -bool Pad::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool Pad::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { try { - auto pad = ov::as_type_ptr(op); - if (!pad) { - errorMessage = "Only opset1 Pad operation is supported"; + if (!one_of(op->get_type_info(), op::v1::Pad::get_type_info_static(), op::v12::Pad::get_type_info_static())) { + errorMessage = "Only Pad operations from opset1 and opset12 are supported"; return false; } + auto pad = ov::as_type(op.get()); const auto pad_mode = pad->get_pad_mode(); if (!one_of(pad_mode, - ngraph::op::PadMode::CONSTANT, - ngraph::op::PadMode::EDGE, - ngraph::op::PadMode::REFLECT, - ngraph::op::PadMode::SYMMETRIC)) { - errorMessage = "Has unsupported pad_mode: " + ngraph::as_string(pad_mode); + op::PadMode::CONSTANT, + op::PadMode::EDGE, + op::PadMode::REFLECT, + op::PadMode::SYMMETRIC)) { + errorMessage = "Has unsupported pad_mode: " + ov::as_string(pad_mode); return false; } } catch (...) { @@ -46,8 +43,8 @@ bool Pad::isSupportedOperation(const std::shared_ptr& op, st return true; } -Pad::Pad(const std::shared_ptr& op, const GraphContext::CPtr context) - : Node(op, context, NgraphShapeInferFactory(op, PortMask(PADS_BEGIN_ID, PADS_END_ID))) { +Pad::Pad(const std::shared_ptr& op, const GraphContext::CPtr context) + : Node(op, context, NgraphShapeInferFactory(op, PortMask(PADS_BEGIN_ID, PADS_END_ID))) { std::string errorMessage; if (!isSupportedOperation(op, errorMessage)) { IE_THROW(NotImplemented) << errorMessage; @@ -63,19 +60,19 @@ Pad::Pad(const std::shared_ptr& op, const GraphContext::CPtr conte if (srcDimsRank != dstDimsRank) IE_THROW() << errorPrefix << "has incorrect number of input/output dimensions!"; - auto pad = ov::as_type_ptr(op); + auto pad = ov::as_type(op.get()); if (!pad) { IE_THROW() << errorPrefix << "couldn't be casted to op of opset1"; } - shapeHasDataDependency = !ov::is_type(op->get_input_node_shared_ptr(PADS_BEGIN_ID)) || - !ov::is_type(op->get_input_node_shared_ptr(PADS_END_ID)); + shapeHasDataDependency = !ov::is_type(op->get_input_node_shared_ptr(PADS_BEGIN_ID)) || + !ov::is_type(op->get_input_node_shared_ptr(PADS_END_ID)); auto fillingInParameters = [&](VectorIdxs& parameter, const size_t type) { if (type < PADS_BEGIN_ID) return; - const auto constNode = ov::as_type_ptr(op->get_input_node_shared_ptr(type)); + const auto constNode = ov::as_type_ptr(op->get_input_node_shared_ptr(type)); if (constNode) { auto pad_data = constNode->cast_vector(); for (const auto& value : pad_data) { @@ -91,25 +88,25 @@ Pad::Pad(const std::shared_ptr& op, const GraphContext::CPtr conte const auto pad_mode = pad->get_pad_mode(); isPadValueSpecified = pad->get_input_size() == 4; - if (pad_mode == ngraph::op::PadMode::CONSTANT) { + if (pad_mode == op::PadMode::CONSTANT) { attrs.padMode = CONSTANT; if (isPadValueSpecified && op->get_input_node_shared_ptr(PAD_VALUE_ID)->get_type_info() == ov::op::v0::Constant::get_type_info_static()) { - if (!ngraph::is_scalar(pad->get_input_shape(PAD_VALUE_ID))) + if (!ov::is_scalar(pad->get_input_shape(PAD_VALUE_ID))) IE_THROW() << errorPrefix << "has non scalar 'pad_value' input"; attrs.padValue = - ov::as_type_ptr(pad->get_input_node_shared_ptr(PAD_VALUE_ID)) + ov::as_type_ptr(pad->get_input_node_shared_ptr(PAD_VALUE_ID)) ->cast_vector()[0]; attrs.constPadValue = true; } - } else if (pad_mode == ngraph::op::PadMode::EDGE) { + } else if (pad_mode == op::PadMode::EDGE) { attrs.padMode = EDGE; - } else if (pad_mode == ngraph::op::PadMode::REFLECT) { + } else if (pad_mode == op::PadMode::REFLECT) { attrs.padMode = REFLECT; - } else if (pad_mode == ngraph::op::PadMode::SYMMETRIC) { + } else if (pad_mode == op::PadMode::SYMMETRIC) { attrs.padMode = SYMMETRIC; } else { - IE_THROW() << errorPrefix << "has unsupported pad_mode: " + ngraph::as_string(pad_mode); + IE_THROW() << errorPrefix << "has unsupported pad_mode: " + ov::as_string(pad_mode); } } diff --git a/src/plugins/intel_cpu/src/nodes/pad.h b/src/plugins/intel_cpu/src/nodes/pad.h index 5f670643d19..42b0648b029 100644 --- a/src/plugins/intel_cpu/src/nodes/pad.h +++ b/src/plugins/intel_cpu/src/nodes/pad.h @@ -4,9 +4,7 @@ #pragma once -#include #include -#include namespace ov { namespace intel_cpu { @@ -14,9 +12,9 @@ namespace node { class Pad : public Node { public: - Pad(const std::shared_ptr& op, const GraphContext::CPtr context); + Pad(const std::shared_ptr& op, const GraphContext::CPtr context); - static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; + static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; void getSupportedDescriptors() override; void initSupportedPrimitiveDescriptors() override; void createPrimitive() override; diff --git a/src/plugins/intel_cpu/tests/functional/single_layer_tests/pad.cpp b/src/plugins/intel_cpu/tests/functional/single_layer_tests/pad.cpp index 1ab58890d05..91a0bd2ba15 100644 --- a/src/plugins/intel_cpu/tests/functional/single_layer_tests/pad.cpp +++ b/src/plugins/intel_cpu/tests/functional/single_layer_tests/pad.cpp @@ -6,11 +6,11 @@ #include "test_utils/cpu_test_utils.hpp" #include "shared_test_classes/base/ov_subgraph.hpp" #include +#include using namespace InferenceEngine; using namespace CPUTestUtils; -using namespace ov; -using namespace test; +using namespace ov::test; namespace CPULayerTestsDefinitions { @@ -21,7 +21,7 @@ using PadLayerCPUTestParamSet = std::tuple< std::vector, // padsBegin std::vector, // padsEnd float, // argPadValue - ngraph::helpers::PadMode, // padMode + ov::op::PadMode, // padMode CPUSpecificParams >; @@ -33,7 +33,7 @@ public: ngraph::helpers::InputLayerType secondaryInputType; ElementType elementType; std::vector padsBegin, padsEnd; - ngraph::helpers::PadMode padMode; + ov::op::PadMode padMode; float argPadValue; CPUSpecificParams cpuParams; std::tie(shapes, secondaryInputType, elementType, padsBegin, padsEnd, argPadValue, padMode, cpuParams) = obj.param; @@ -48,7 +48,7 @@ public: results << "Prc=" << elementType << "_"; results << "padsBegin=" << CommonTestUtils::vec2str(padsBegin) << "_"; results << "padsEnd=" << CommonTestUtils::vec2str(padsEnd) << "_"; - if (padMode == ngraph::helpers::PadMode::CONSTANT) { + if (padMode == ov::op::PadMode::CONSTANT) { results << "Value=" << argPadValue << "_"; } results << "PadMode=" << padMode << "_"; @@ -58,7 +58,7 @@ public: } protected: - void generate_inputs(const std::vector& targetInputStaticShapes) override { + void generate_inputs(const std::vector& targetInputStaticShapes) override { std::vector inputValues = {padsBegin.data(), padsEnd.data(), &padValue}; inputs.clear(); @@ -67,7 +67,7 @@ protected: const auto& funcInput = funcInputs[i]; ov::Tensor tensor; if (i == 0) { - tensor = ov::test::utils::create_and_fill_tensor(funcInput.get_element_type(), targetInputStaticShapes[i], 10, 1, 1); + tensor = utils::create_and_fill_tensor(funcInput.get_element_type(), targetInputStaticShapes[i], 10, 1, 1); } else { if (funcInput.get_node()->get_friendly_name() == "pad_value") tensor = ov::Tensor{funcInput.get_element_type(), ov::Shape{}, &padValue}; @@ -80,8 +80,8 @@ protected: void SetUp() override { InputShape shapes; ngraph::helpers::InputLayerType secondaryInputType; - ngraph::helpers::PadMode padMode; - ov::element::Type dataType; + ov::op::PadMode padMode; + ElementType dataType; CPUSpecificParams cpuParams; std::tie(shapes, secondaryInputType, dataType, padsBegin, padsEnd, padValue, padMode, cpuParams) = this->GetParam(); @@ -95,23 +95,29 @@ protected: targetShapes.push_back({}); } auto params = ngraph::builder::makeDynamicParams(dataType, inputDynamicShapes); - std::shared_ptr pad; + std::shared_ptr pad; if (secondaryInputType == ngraph::helpers::InputLayerType::PARAMETER) { ov::Shape inShape = {padsBegin.size()}; - auto beginNode = std::make_shared(ov::element::i64, inShape); - auto endNode = std::make_shared(ov::element::i64, inShape); - std::shared_ptr valueNode = nullptr; - params.push_back(std::dynamic_pointer_cast(beginNode)); - params.push_back(std::dynamic_pointer_cast(endNode)); - if (padMode == ngraph::helpers::PadMode::CONSTANT) { - valueNode = std::make_shared(dataType, ov::Shape{}); - params.push_back(std::dynamic_pointer_cast(valueNode)); + auto beginNode = std::make_shared(ElementType::i64, inShape); + auto endNode = std::make_shared(ElementType::i64, inShape); + std::shared_ptr valueNode = nullptr; + params.push_back(beginNode); + params.push_back(endNode); + if (padMode == ov::op::PadMode::CONSTANT) { + valueNode = std::make_shared(dataType, ov::Shape{}); + params.push_back(valueNode); params.back()->set_friendly_name("pad_value"); + pad = std::make_shared(params[0], beginNode, endNode, valueNode, padMode); + } else { + pad = std::make_shared(params[0], beginNode, endNode, padMode); } - pad = ngraph::builder::makePad(params[0], beginNode, endNode, valueNode, padMode); } else { - pad = ngraph::builder::makePad(params[0], padsBegin, padsEnd, padValue, padMode); + auto padsBeginNode = std::make_shared(ElementType::i64, ov::Shape{padsBegin.size()}, padsBegin.data()); + auto padsEndNode = std::make_shared(ElementType::i64, ov::Shape{padsEnd.size()}, padsEnd.data()); + auto argPadValueNode = std::make_shared(params[0]->get_element_type(), ov::Shape{}, &padValue); + + pad = std::make_shared(params[0], padsBeginNode, padsEndNode, argPadValueNode, padMode); } function = makeNgraphFunction(inType, params, pad, "Pad"); } @@ -157,10 +163,10 @@ const std::vector inputLayerTypesBlocked = { const std::vector argPadValue = {0.f, 2.5f}; -const std::vector padMode = { - ngraph::helpers::PadMode::EDGE, - ngraph::helpers::PadMode::REFLECT, - ngraph::helpers::PadMode::SYMMETRIC +const std::vector padMode = { + ov::op::PadMode::EDGE, + ov::op::PadMode::REFLECT, + ov::op::PadMode::SYMMETRIC }; /* *======================* Static Shapes Tests 4D *======================* */ @@ -198,7 +204,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4DConstBlocked_Smoke), ::testing::ValuesIn(padsEnd4DConstBlocked_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams4DBlocked)), PadLayerCPUTest::getTestCaseName ); @@ -213,7 +219,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4D_Smoke), ::testing::ValuesIn(padsEnd4D_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::Values(cpuParams_nhwc)), PadLayerCPUTest::getTestCaseName ); @@ -258,7 +264,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4DConstBlocked_Full), ::testing::ValuesIn(padsEnd4DConstBlocked_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams4DBlocked)), PadLayerCPUTest::getTestCaseName ); @@ -273,7 +279,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4D_Full), ::testing::ValuesIn(padsEnd4D_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::Values(cpuParams_nhwc)), PadLayerCPUTest::getTestCaseName ); @@ -338,7 +344,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4D_Smoke), ::testing::ValuesIn(padsEnd4D_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams4DDynamic)), PadLayerCPUTest::getTestCaseName ); @@ -353,7 +359,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4DConstBlocked_Smoke), ::testing::ValuesIn(padsEnd4DConstBlocked_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams4DBlocked)), PadLayerCPUTest::getTestCaseName ); @@ -398,7 +404,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4D_Full), ::testing::ValuesIn(padsEnd4D_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams4DDynamic)), PadLayerCPUTest::getTestCaseName ); @@ -413,7 +419,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin4DConstBlocked_Full), ::testing::ValuesIn(padsEnd4DConstBlocked_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams4DBlocked)), PadLayerCPUTest::getTestCaseName ); @@ -485,7 +491,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5DConstBlocked_Smoke), ::testing::ValuesIn(padsEnd5DConstBlocked_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams5DBlocked)), PadLayerCPUTest::getTestCaseName ); @@ -500,7 +506,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5D_Smoke), ::testing::ValuesIn(padsEnd5D_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::Values(cpuParams_ndhwc)), PadLayerCPUTest::getTestCaseName ); @@ -545,7 +551,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5DConstBlocked_Full), ::testing::ValuesIn(padsEnd5DConstBlocked_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams5DBlocked)), PadLayerCPUTest::getTestCaseName ); @@ -560,7 +566,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5D_Full), ::testing::ValuesIn(padsEnd5D_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::Values(cpuParams_ndhwc)), PadLayerCPUTest::getTestCaseName ); @@ -625,7 +631,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5D_Smoke), ::testing::ValuesIn(padsEnd5D_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams5DDynamic)), PadLayerCPUTest::getTestCaseName ); @@ -640,7 +646,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5DConstBlocked_Smoke), ::testing::ValuesIn(padsEnd5DConstBlocked_Smoke), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams5DBlocked)), PadLayerCPUTest::getTestCaseName ); @@ -685,7 +691,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5D_Full), ::testing::ValuesIn(padsEnd5D_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams5DDynamic)), PadLayerCPUTest::getTestCaseName ); @@ -700,7 +706,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(padsBegin5DConstBlocked_Full), ::testing::ValuesIn(padsEnd5DConstBlocked_Full), ::testing::ValuesIn(argPadValue), - ::testing::Values(ngraph::helpers::PadMode::CONSTANT), + ::testing::Values(ov::op::PadMode::CONSTANT), ::testing::ValuesIn(CPUParams5DBlocked)), PadLayerCPUTest::getTestCaseName ); diff --git a/src/tests/functional/shared_test_classes/src/base/utils/compare_results.cpp b/src/tests/functional/shared_test_classes/src/base/utils/compare_results.cpp index 76a6be2b779..43ab82af73a 100644 --- a/src/tests/functional/shared_test_classes/src/base/utils/compare_results.cpp +++ b/src/tests/functional/shared_test_classes/src/base/utils/compare_results.cpp @@ -81,6 +81,7 @@ CompareMap getCompareMap() { #include "openvino/opsets/opset9_tbl.hpp" #include "openvino/opsets/opset10_tbl.hpp" #include "openvino/opsets/opset11_tbl.hpp" +#include "openvino/opsets/opset12_tbl.hpp" #include "ov_ops/opset_private_tbl.hpp" #undef _OPENVINO_OP_REG