[CPU] Support Pad-12. (#18407)

This commit is contained in:
Nikolay Shchegolev
2023-07-12 16:59:07 +04:00
committed by GitHub
parent 4c948ab6f8
commit 98e88bee52
4 changed files with 74 additions and 72 deletions

View File

@@ -3,16 +3,13 @@
//
#include "pad.h"
#include <string>
#include <cmath>
#include <dnnl_types.h>
#include <dnnl_extension_utils.h>
#include <limits>
#include "ie_parallel.hpp"
#include "common/cpu_memcpy.h"
#include "utils/bfloat16.hpp"
#include <selective_build.h>
#include <ngraph/opsets/opset1.hpp>
#include <openvino/op/constant.hpp>
#include <openvino/op/pad.hpp>
#include <openvino/core/type/float16.hpp>
using namespace dnnl;
@@ -23,21 +20,21 @@ namespace ov {
namespace intel_cpu {
namespace node {
bool Pad::isSupportedOperation(const std::shared_ptr<const ngraph::Node>& op, std::string& errorMessage) noexcept {
bool Pad::isSupportedOperation(const std::shared_ptr<const ov::Node>& op, std::string& errorMessage) noexcept {
try {
auto pad = ov::as_type_ptr<const ngraph::opset1::Pad>(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<const op::util::PadBase>(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<const ngraph::Node>& op, st
return true;
}
Pad::Pad(const std::shared_ptr<ngraph::Node>& op, const GraphContext::CPtr context)
: Node(op, context, NgraphShapeInferFactory(op, PortMask(PADS_BEGIN_ID, PADS_END_ID))) {
Pad::Pad(const std::shared_ptr<ov::Node>& 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<ngraph::Node>& op, const GraphContext::CPtr conte
if (srcDimsRank != dstDimsRank)
IE_THROW() << errorPrefix << "has incorrect number of input/output dimensions!";
auto pad = ov::as_type_ptr<const ngraph::opset1::Pad>(op);
auto pad = ov::as_type<const op::util::PadBase>(op.get());
if (!pad) {
IE_THROW() << errorPrefix << "couldn't be casted to op of opset1";
}
shapeHasDataDependency = !ov::is_type<ov::op::v0::Constant>(op->get_input_node_shared_ptr(PADS_BEGIN_ID)) ||
!ov::is_type<ov::op::v0::Constant>(op->get_input_node_shared_ptr(PADS_END_ID));
shapeHasDataDependency = !ov::is_type<op::v0::Constant>(op->get_input_node_shared_ptr(PADS_BEGIN_ID)) ||
!ov::is_type<op::v0::Constant>(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<const ngraph::opset1::Constant>(op->get_input_node_shared_ptr(type));
const auto constNode = ov::as_type_ptr<const op::v0::Constant>(op->get_input_node_shared_ptr(type));
if (constNode) {
auto pad_data = constNode->cast_vector<int32_t>();
for (const auto& value : pad_data) {
@@ -91,25 +88,25 @@ Pad::Pad(const std::shared_ptr<ngraph::Node>& 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<const ngraph::opset1::Constant>(pad->get_input_node_shared_ptr(PAD_VALUE_ID))
ov::as_type_ptr<const op::v0::Constant>(pad->get_input_node_shared_ptr(PAD_VALUE_ID))
->cast_vector<float>()[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);
}
}

View File

@@ -4,9 +4,7 @@
#pragma once
#include <ie_common.h>
#include <node.h>
#include <string>
namespace ov {
namespace intel_cpu {
@@ -14,9 +12,9 @@ namespace node {
class Pad : public Node {
public:
Pad(const std::shared_ptr<ngraph::Node>& op, const GraphContext::CPtr context);
Pad(const std::shared_ptr<ov::Node>& op, const GraphContext::CPtr context);
static bool isSupportedOperation(const std::shared_ptr<const ngraph::Node>& op, std::string& errorMessage) noexcept;
static bool isSupportedOperation(const std::shared_ptr<const ov::Node>& op, std::string& errorMessage) noexcept;
void getSupportedDescriptors() override;
void initSupportedPrimitiveDescriptors() override;
void createPrimitive() override;

View File

@@ -6,11 +6,11 @@
#include "test_utils/cpu_test_utils.hpp"
#include "shared_test_classes/base/ov_subgraph.hpp"
#include <common_test_utils/ov_tensor_utils.hpp>
#include <openvino/op/pad.hpp>
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<int64_t>, // padsBegin
std::vector<int64_t>, // 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<int64_t> 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<ngraph::Shape>& targetInputStaticShapes) override {
void generate_inputs(const std::vector<ov::Shape>& targetInputStaticShapes) override {
std::vector<void*> 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<ngraph::Node> pad;
std::shared_ptr<ov::Node> pad;
if (secondaryInputType == ngraph::helpers::InputLayerType::PARAMETER) {
ov::Shape inShape = {padsBegin.size()};
auto beginNode = std::make_shared<ngraph::opset1::Parameter>(ov::element::i64, inShape);
auto endNode = std::make_shared<ngraph::opset1::Parameter>(ov::element::i64, inShape);
std::shared_ptr<ngraph::opset1::Parameter> valueNode = nullptr;
params.push_back(std::dynamic_pointer_cast<ngraph::opset3::Parameter>(beginNode));
params.push_back(std::dynamic_pointer_cast<ngraph::opset3::Parameter>(endNode));
if (padMode == ngraph::helpers::PadMode::CONSTANT) {
valueNode = std::make_shared<ngraph::opset1::Parameter>(dataType, ov::Shape{});
params.push_back(std::dynamic_pointer_cast<ngraph::opset3::Parameter>(valueNode));
auto beginNode = std::make_shared<ov::op::v0::Parameter>(ElementType::i64, inShape);
auto endNode = std::make_shared<ov::op::v0::Parameter>(ElementType::i64, inShape);
std::shared_ptr<ov::op::v0::Parameter> valueNode = nullptr;
params.push_back(beginNode);
params.push_back(endNode);
if (padMode == ov::op::PadMode::CONSTANT) {
valueNode = std::make_shared<ov::op::v0::Parameter>(dataType, ov::Shape{});
params.push_back(valueNode);
params.back()->set_friendly_name("pad_value");
pad = std::make_shared<ov::op::v12::Pad>(params[0], beginNode, endNode, valueNode, padMode);
} else {
pad = std::make_shared<ov::op::v12::Pad>(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<ov::op::v0::Constant>(ElementType::i64, ov::Shape{padsBegin.size()}, padsBegin.data());
auto padsEndNode = std::make_shared<ov::op::v0::Constant>(ElementType::i64, ov::Shape{padsEnd.size()}, padsEnd.data());
auto argPadValueNode = std::make_shared<ov::op::v0::Constant>(params[0]->get_element_type(), ov::Shape{}, &padValue);
pad = std::make_shared<ov::op::v12::Pad>(params[0], padsBeginNode, padsEndNode, argPadValueNode, padMode);
}
function = makeNgraphFunction(inType, params, pad, "Pad");
}
@@ -157,10 +163,10 @@ const std::vector<ngraph::helpers::InputLayerType> inputLayerTypesBlocked = {
const std::vector<float> argPadValue = {0.f, 2.5f};
const std::vector<ngraph::helpers::PadMode> padMode = {
ngraph::helpers::PadMode::EDGE,
ngraph::helpers::PadMode::REFLECT,
ngraph::helpers::PadMode::SYMMETRIC
const std::vector<ov::op::PadMode> 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
);

View File

@@ -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