[CPU] Fix for Int8 models serialization issues (#7554)

This commit is contained in:
Vladislav Volkov 2021-09-24 09:24:35 +03:00 committed by GitHub
parent 3d07763835
commit f8f6e57c39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 102 additions and 8 deletions

View File

@ -10,6 +10,8 @@
#include <ngraph/ngraph.hpp> #include <ngraph/ngraph.hpp>
#include <ngraph_ops/type_relaxed.hpp> #include <ngraph_ops/type_relaxed.hpp>
#include <ngraph_ops/nms_ie_internal.hpp>
#include <ngraph_ops/nms_static_shape_ie.hpp>
#include <mutex> #include <mutex>
@ -95,9 +97,22 @@ std::map<std::string, ngraph::OpSet> MKLDNNExtension::getOpSets() {
return opset; return opset;
}; };
auto ie_internal_opset = []() {
ngraph::OpSet opset;
#define NGRAPH_OP(NAME, NAMESPACE) opset.insert<NAMESPACE::NAME>();
NGRAPH_OP(NonMaxSuppressionIEInternal, ngraph::op::internal)
NGRAPH_OP(NmsStaticShapeIE<ov::op::v8::MulticlassNms>, ngraph::op::internal)
NGRAPH_OP(NmsStaticShapeIE<ov::op::v8::MatrixNms>, ngraph::op::internal)
#undef NGRAPH_OP
return opset;
};
static std::map<std::string, ngraph::OpSet> opsets = { static std::map<std::string, ngraph::OpSet> opsets = {
{ "cpu_plugin_opset", cpu_plugin_opset() }, { "cpu_plugin_opset", cpu_plugin_opset() },
{ "type_relaxed_opset", type_relaxed_opset() } { "type_relaxed_opset", type_relaxed_opset() },
{ "ie_internal_opset", ie_internal_opset() },
}; };
return opsets; return opsets;

View File

@ -11,7 +11,7 @@ MKLDNNPlugin::FullyConnectedNode::FullyConnectedNode(const ngraph::Output<Node>&
const ngraph::Shape& output_shape, const ngraph::Shape& output_shape,
const ngraph::element::Type output_type) const ngraph::element::Type output_type)
: Op({A, B}), m_output_shape(output_shape), m_output_type(output_type) { : Op({A, B}), m_output_shape(output_shape), m_output_type(output_type) {
constructor_validate_and_infer_types(); validate_and_infer_types();
} }
MKLDNNPlugin::FullyConnectedNode::FullyConnectedNode(const ngraph::Output<Node>& A, MKLDNNPlugin::FullyConnectedNode::FullyConnectedNode(const ngraph::Output<Node>& A,
@ -20,15 +20,15 @@ MKLDNNPlugin::FullyConnectedNode::FullyConnectedNode(const ngraph::Output<Node>&
const ngraph::Shape& output_shape, const ngraph::Shape& output_shape,
const ngraph::element::Type output_type) const ngraph::element::Type output_type)
: Op({A, B, C}), m_output_shape(output_shape), m_output_type(output_type) { : Op({A, B, C}), m_output_shape(output_shape), m_output_type(output_type) {
constructor_validate_and_infer_types(); validate_and_infer_types();
} }
std::shared_ptr<ngraph::Node> MKLDNNPlugin::FullyConnectedNode::clone_with_new_inputs(const ngraph::OutputVector& new_args) const { std::shared_ptr<ngraph::Node> MKLDNNPlugin::FullyConnectedNode::clone_with_new_inputs(const ngraph::OutputVector& new_args) const {
check_new_args_count(this, new_args); check_new_args_count(this, new_args);
if (new_args.size() == 2) { if (new_args.size() == 2) {
return std::make_shared<MKLDNNPlugin::FullyConnectedNode>(new_args.at(0), new_args.at(1), m_output_shape); return std::make_shared<MKLDNNPlugin::FullyConnectedNode>(new_args.at(0), new_args.at(1), m_output_shape, m_output_type);
} else if (new_args.size() == 3) { } else if (new_args.size() == 3) {
return std::make_shared<MKLDNNPlugin::FullyConnectedNode>(new_args.at(0), new_args.at(1), new_args.at(2), m_output_shape); return std::make_shared<MKLDNNPlugin::FullyConnectedNode>(new_args.at(0), new_args.at(1), new_args.at(2), m_output_shape, m_output_type);
} }
throw ngraph::ngraph_error("Unsupported number of arguments for FullyConnected operation"); throw ngraph::ngraph_error("Unsupported number of arguments for FullyConnected operation");
@ -42,5 +42,6 @@ void MKLDNNPlugin::FullyConnectedNode::validate_and_infer_types() {
bool MKLDNNPlugin::FullyConnectedNode::visit_attributes(ngraph::AttributeVisitor &visitor) { bool MKLDNNPlugin::FullyConnectedNode::visit_attributes(ngraph::AttributeVisitor &visitor) {
visitor.on_attribute("out-size", m_output_size); visitor.on_attribute("out-size", m_output_size);
visitor.on_attribute("out-shape", m_output_shape); visitor.on_attribute("out-shape", m_output_shape);
visitor.on_attribute("out-type", m_output_type);
return true; return true;
} }

View File

@ -10,7 +10,7 @@ MKLDNNPlugin::LeakyReluNode::LeakyReluNode(const ngraph::Output<ngraph::Node> &d
const float &negative_slope, const float &negative_slope,
const ngraph::element::Type output_type) const ngraph::element::Type output_type)
: Op({data}), m_negative_slope(negative_slope), m_output_type(output_type) { : Op({data}), m_negative_slope(negative_slope), m_output_type(output_type) {
constructor_validate_and_infer_types(); validate_and_infer_types();
} }
std::shared_ptr<ngraph::Node> MKLDNNPlugin::LeakyReluNode::clone_with_new_inputs(const ngraph::OutputVector& new_args) const { std::shared_ptr<ngraph::Node> MKLDNNPlugin::LeakyReluNode::clone_with_new_inputs(const ngraph::OutputVector& new_args) const {
@ -27,5 +27,6 @@ void MKLDNNPlugin::LeakyReluNode::validate_and_infer_types() {
bool MKLDNNPlugin::LeakyReluNode::visit_attributes(ngraph::AttributeVisitor &visitor) { bool MKLDNNPlugin::LeakyReluNode::visit_attributes(ngraph::AttributeVisitor &visitor) {
visitor.on_attribute("negative_slope", m_negative_slope); visitor.on_attribute("negative_slope", m_negative_slope);
visitor.on_attribute("out-type", m_output_type);
return true; return true;
} }

View File

@ -12,7 +12,7 @@ MKLDNNPlugin::PowerStaticNode::PowerStaticNode(const ngraph::Output<Node> &data,
const float &shift, const float &shift,
const ngraph::element::Type output_type) const ngraph::element::Type output_type)
: Op({data}), scale(scale), power(power), shift(shift), m_output_type(output_type) { : Op({data}), scale(scale), power(power), shift(shift), m_output_type(output_type) {
constructor_validate_and_infer_types(); validate_and_infer_types();
} }
std::shared_ptr<ngraph::Node> MKLDNNPlugin::PowerStaticNode::clone_with_new_inputs(const ngraph::OutputVector &new_args) const { std::shared_ptr<ngraph::Node> MKLDNNPlugin::PowerStaticNode::clone_with_new_inputs(const ngraph::OutputVector &new_args) const {
@ -31,5 +31,6 @@ bool MKLDNNPlugin::PowerStaticNode::visit_attributes(ngraph::AttributeVisitor &v
visitor.on_attribute("scale", scale); visitor.on_attribute("scale", scale);
visitor.on_attribute("power", power); visitor.on_attribute("power", power);
visitor.on_attribute("shift", shift); visitor.on_attribute("shift", shift);
visitor.on_attribute("out-type", m_output_type);
return true; return true;
} }

View File

@ -8,7 +8,7 @@ constexpr ngraph::NodeTypeInfo MKLDNNPlugin::SwishNode::type_info;
MKLDNNPlugin::SwishNode::SwishNode(const ngraph::Output<ngraph::Node> & input, const float alpha) MKLDNNPlugin::SwishNode::SwishNode(const ngraph::Output<ngraph::Node> & input, const float alpha)
: Op({input}), m_alpha(alpha) { : Op({input}), m_alpha(alpha) {
constructor_validate_and_infer_types(); validate_and_infer_types();
} }
std::shared_ptr<ngraph::Node> MKLDNNPlugin::SwishNode::clone_with_new_inputs(const ngraph::OutputVector& new_args) const { std::shared_ptr<ngraph::Node> MKLDNNPlugin::SwishNode::clone_with_new_inputs(const ngraph::OutputVector& new_args) const {

View File

@ -56,6 +56,8 @@ public:
OPENVINO_OP("FrameworkNode", "util"); OPENVINO_OP("FrameworkNode", "util");
BWDCMP_RTTI_DECLARATION; BWDCMP_RTTI_DECLARATION;
FrameworkNode() = default;
explicit FrameworkNode(const OutputVector& inputs, size_t output_size = 1); explicit FrameworkNode(const OutputVector& inputs, size_t output_size = 1);
void validate_and_infer_types() override; void validate_and_infer_types() override;

View File

@ -21,6 +21,8 @@ public:
OPENVINO_OP("NonMaxSuppressionIEInternal", "util"); OPENVINO_OP("NonMaxSuppressionIEInternal", "util");
BWDCMP_RTTI_DECLARATION; BWDCMP_RTTI_DECLARATION;
NonMaxSuppressionIEInternal() = default;
NonMaxSuppressionIEInternal(const Output<Node>& boxes, NonMaxSuppressionIEInternal(const Output<Node>& boxes,
const Output<Node>& scores, const Output<Node>& scores,
const Output<Node>& max_output_boxes_per_class, const Output<Node>& max_output_boxes_per_class,

View File

@ -22,6 +22,8 @@ class NmsStaticShapeIE : public BaseNmsOp {
public: public:
NGRAPH_RTTI_DECLARATION; NGRAPH_RTTI_DECLARATION;
NmsStaticShapeIE() = default;
using Attributes = typename BaseNmsOp::Attributes; using Attributes = typename BaseNmsOp::Attributes;
/// \brief Constructs a NmsStaticShapeIE operation /// \brief Constructs a NmsStaticShapeIE operation
@ -38,6 +40,16 @@ public:
std::shared_ptr<Node> clone_with_new_inputs(const OutputVector& new_args) const override { std::shared_ptr<Node> clone_with_new_inputs(const OutputVector& new_args) const override {
return std::make_shared<NmsStaticShapeIE>(new_args.at(0), new_args.at(1), this->m_attrs); return std::make_shared<NmsStaticShapeIE>(new_args.at(0), new_args.at(1), this->m_attrs);
} }
private:
typedef struct {} init_rt_result;
init_rt_result init_rt_info() {
BaseNmsOp::get_rt_info()["opset"] = std::make_shared<ngraph::VariantWrapper<std::string>>("ie_internal_opset");
return {};
}
init_rt_result init_rt = init_rt_info();
}; };
template <typename BaseNmsOp> template <typename BaseNmsOp>

View File

@ -3,8 +3,12 @@
// //
#include "behavior/caching/caching_tests.hpp" #include "behavior/caching/caching_tests.hpp"
#include <ngraph_ops/nms_ie_internal.hpp>
#include <ngraph_ops/framework_node.hpp>
#include <ngraph_ops/nms_static_shape_ie.hpp>
using namespace LayerTestsDefinitions; using namespace LayerTestsDefinitions;
using namespace ngraph;
namespace { namespace {
static const std::vector<ngraph::element::Type> precisionsCPU = { static const std::vector<ngraph::element::Type> precisionsCPU = {
@ -22,6 +26,54 @@ namespace {
1, 2 1, 2
}; };
static const std::vector<ngraph::element::Type> precisionsCPUInternal = {
ngraph::element::f32
};
static const std::vector<std::size_t> batchSizesCPUInternal = {
1
};
static std::shared_ptr<ngraph::Function> simple_function_non_max_supression_internal(ngraph::element::Type, size_t) {
auto boxes = std::make_shared<opset1::Parameter>(element::f32, Shape{1, 1000, 4});
auto scores = std::make_shared<opset1::Parameter>(element::f32, Shape{1, 1, 1000});
auto max_output_boxes_per_class = opset1::Constant::create(element::i32, Shape{1}, {10});
auto iou_threshold = opset1::Constant::create(element::f32, Shape{1}, {0.75});
auto score_threshold = opset1::Constant::create(element::f32, Shape{1}, {0.7});
auto nms = std::make_shared<op::internal::NonMaxSuppressionIEInternal>(boxes, scores, max_output_boxes_per_class,
iou_threshold, score_threshold, 0, true, element::i32);
auto res = std::make_shared<ngraph::opset6::Result>(nms);
auto func = std::make_shared<Function>(NodeVector{nms}, ParameterVector{boxes, scores});
return func;
}
static std::shared_ptr<ngraph::Function> simple_function_matrix_nms_internal(ngraph::element::Type, size_t) {
auto boxes = std::make_shared<opset1::Parameter>(element::f32, Shape{1, 1000, 4});
auto scores = std::make_shared<opset1::Parameter>(element::f32, Shape{1, 1, 1000});
auto nms = std::make_shared<op::internal::NmsStaticShapeIE<ov::op::v8::MatrixNms>>(boxes, scores, ov::op::v8::MatrixNms::Attributes());
auto res = std::make_shared<ngraph::opset6::Result>(nms);
auto func = std::make_shared<Function>(NodeVector{nms}, ParameterVector{boxes, scores});
return func;
}
static std::shared_ptr<ngraph::Function> simple_function_multiclass_nms_internal(ngraph::element::Type, size_t) {
auto boxes = std::make_shared<opset1::Parameter>(element::f32, Shape{1, 1000, 4});
auto scores = std::make_shared<opset1::Parameter>(element::f32, Shape{1, 1, 1000});
auto nms = std::make_shared<op::internal::NmsStaticShapeIE<ov::op::v8::MulticlassNms>>(boxes, scores, ov::op::v8::MulticlassNms::Attributes());
auto res = std::make_shared<ngraph::opset6::Result>(nms);
auto func = std::make_shared<Function>(NodeVector{nms}, ParameterVector{boxes, scores});
return func;
}
static std::vector<nGraphFunctionWithName> internal_functions_cpu() {
std::vector<nGraphFunctionWithName> funcs = {
nGraphFunctionWithName { simple_function_non_max_supression_internal, "NonMaxSuppressionIEInternal"},
nGraphFunctionWithName { simple_function_matrix_nms_internal, "NmsStaticShapeIE_MatrixNms"},
nGraphFunctionWithName { simple_function_multiclass_nms_internal, "NmsStaticShapeIE_MulticlassNms"},
};
return funcs;
}
INSTANTIATE_TEST_SUITE_P(smoke_CachingSupportCase_CPU, LoadNetworkCacheTestBase, INSTANTIATE_TEST_SUITE_P(smoke_CachingSupportCase_CPU, LoadNetworkCacheTestBase,
::testing::Combine( ::testing::Combine(
::testing::ValuesIn(LoadNetworkCacheTestBase::getStandardFunctions()), ::testing::ValuesIn(LoadNetworkCacheTestBase::getStandardFunctions()),
@ -29,4 +81,12 @@ namespace {
::testing::ValuesIn(batchSizesCPU), ::testing::ValuesIn(batchSizesCPU),
::testing::Values(CommonTestUtils::DEVICE_CPU)), ::testing::Values(CommonTestUtils::DEVICE_CPU)),
LoadNetworkCacheTestBase::getTestCaseName); LoadNetworkCacheTestBase::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CachingSupportCase_CPU_Internal, LoadNetworkCacheTestBase,
::testing::Combine(
::testing::ValuesIn(internal_functions_cpu()),
::testing::ValuesIn(precisionsCPUInternal),
::testing::ValuesIn(batchSizesCPUInternal),
::testing::Values(CommonTestUtils::DEVICE_CPU)),
LoadNetworkCacheTestBase::getTestCaseName);
} // namespace } // namespace