From 63dd0685fce0eaaf788d0e6cd5ee1950775c6e1f Mon Sep 17 00:00:00 2001 From: Pavel Esir Date: Mon, 13 Feb 2023 05:00:29 +0100 Subject: [PATCH] [IE][nG][LoadTime] speed up constant folding (#15476) * speed up constant folding and improved load time for FP16 * fix unit-tests * added OPENVINO_SUPPRESS_DEPRECATED_START * new evaluate for Convert; added constructor for Constant; constant copying by reference during constant_fold * removed deprecation macro from Convert evaluate * returned back Convert evaluate to old HostTensorPtr because it's used in tests accuracy comparator --- src/core/include/openvino/op/constant.hpp | 4 ++++ src/core/src/node.cpp | 8 +++----- src/core/src/op/constant.cpp | 11 +++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/core/include/openvino/op/constant.hpp b/src/core/include/openvino/op/constant.hpp index a603c6d7d67..b9976269abf 100644 --- a/src/core/include/openvino/op/constant.hpp +++ b/src/core/include/openvino/op/constant.hpp @@ -30,6 +30,10 @@ public: /// \param tensor The tensor with data Constant(const std::shared_ptr& tensor); + /// \brief Initialize a constant from ov::Tensor + /// \param tensor The ov::Tensor with data + Constant(const ov::Tensor& tensor); + /// \brief Constructs a tensor constant. /// /// \param type The element type of the tensor constant. diff --git a/src/core/src/node.cpp b/src/core/src/node.cpp index c78cca9434b..ca789560aca 100644 --- a/src/core/src/node.cpp +++ b/src/core/src/node.cpp @@ -794,8 +794,8 @@ bool ov::Node::constant_fold(OutputVector& output_values, const OutputVector& in for (const auto& input : input_values) { nodes.push_back(input.get_node_shared_ptr()); auto constant = ov::as_type_ptr(input.get_node_shared_ptr()); - auto tensor = ov::Tensor(input.get_element_type(), input.get_shape()); - std::copy_n(constant->get_data_ptr(), constant->get_byte_size(), static_cast(tensor.data())); + void* data = (void*)constant->get_data_ptr(); + auto tensor = ov::Tensor(input.get_element_type(), input.get_shape(), data); input_tensors.push_back(tensor); } @@ -807,9 +807,7 @@ bool ov::Node::constant_fold(OutputVector& output_values, const OutputVector& in OPENVINO_SUPPRESS_DEPRECATED_START if (evaluate(output_tensors, input_tensors)) { for (size_t i = 0; i < output_tensors.size(); ++i) { - output_values[i] = make_shared(output_tensors[i].get_element_type(), - output_tensors[i].get_shape(), - output_tensors[i].data()); + output_values[i] = make_shared(output_tensors[i]); copy_runtime_info(nodes, output_values[i].get_node_shared_ptr()); } return true; diff --git a/src/core/src/op/constant.cpp b/src/core/src/op/constant.cpp index 42b99b11a56..4d695cd7d58 100644 --- a/src/core/src/op/constant.cpp +++ b/src/core/src/op/constant.cpp @@ -50,6 +50,17 @@ ov::op::v0::Constant::Constant(const shared_ptr& tensor constructor_validate_and_infer_types(); } +ov::op::v0::Constant::Constant(const ov::Tensor& tensor) { + m_element_type = tensor.get_element_type(); + m_shape = tensor.get_shape(); + // Share data from ov::Tensor + m_data = make_shared>(static_cast(tensor.data()), + tensor.get_byte_size(), + tensor); + + constructor_validate_and_infer_types(); +} + ov::op::v0::Constant::Constant(const element::Type& type, const ov::Shape& shape, const std::vector& values)