diff --git a/src/bindings/python/src/pyopenvino/graph/model.cpp b/src/bindings/python/src/pyopenvino/graph/model.cpp index 25e90d7dbf1..b2531304655 100644 --- a/src/bindings/python/src/pyopenvino/graph/model.cpp +++ b/src/bindings/python/src/pyopenvino/graph/model.cpp @@ -684,12 +684,9 @@ void regclass_graph_Model(py::module m) { :rtype: bool )"); - model.def( - "clone", - [](ov::Model& self) { - return ov::clone_model(self); - }, - R"( + model.def("clone", + &ov::Model::clone, + R"( Return a copy of self. :return: A copy of self. :rtype: openvino.runtime.Model diff --git a/src/core/include/openvino/core/model.hpp b/src/core/include/openvino/core/model.hpp index dbc61df62e7..566d79dcd89 100644 --- a/src/core/include/openvino/core/model.hpp +++ b/src/core/include/openvino/core/model.hpp @@ -111,6 +111,9 @@ public: /// Return the op that generates output i std::shared_ptr get_output_op(size_t i) const; + /// \brief Clones the original model + std::shared_ptr clone() const; + /// Model outputs std::vector> outputs(); ov::Output output(); diff --git a/src/core/src/model.cpp b/src/core/src/model.cpp index e1cb9a9954c..4ba4ed379a3 100644 --- a/src/core/src/model.cpp +++ b/src/core/src/model.cpp @@ -971,6 +971,10 @@ ov::Output ov::Model::add_output(const ov::Output& port) { return result->output(0); } +std::shared_ptr ov::Model::clone() const { + return ov::clone_model(*this); +} + namespace bs_util { static int64_t get_batch(const ov::Layout& layout, const ov::PartialShape& shape) { auto batch_idx = ov::layout::batch_idx(layout); diff --git a/src/core/tests/model.cpp b/src/core/tests/model.cpp index 2709c744fac..de7fcd47cdc 100644 --- a/src/core/tests/model.cpp +++ b/src/core/tests/model.cpp @@ -9,6 +9,7 @@ #include #include +#include "common_test_utils/graph_comparator.hpp" #include "openvino/core/partial_shape.hpp" #include "openvino/opsets/opset8.hpp" @@ -1863,3 +1864,71 @@ TEST(model, incompatible_layout) { verify_ex_set_layout_result_validate({1, 2, 3, 4}, "NDHWC"); verify_ex_set_layout_result_validate({1, 2, 3, 4}, "ND...HWC"); } + +TEST(model, clone_model_function) { + auto arg0 = std::make_shared(ov::element::f32, ov::PartialShape{1, 3, 3, 3}); + arg0->set_friendly_name("data"); + arg0->get_output_tensor(0).set_names({"input1"}); + + auto arg1 = std::make_shared(ov::element::f32, ov::PartialShape{1, 2, 3, 3}); + arg1->set_friendly_name("data1"); + arg1->get_output_tensor(0).set_names({"input2", "data1"}); + + auto concat = std::make_shared(ov::NodeVector{arg0, arg1}, 1); + concat->set_friendly_name("concat"); + concat->get_output_tensor(0).set_names({"concat_t"}); + auto result1 = std::make_shared(concat); + + auto shape_of = std::make_shared(concat); + shape_of->set_friendly_name("shape_of"); + shape_of->get_output_tensor(0).set_names({"shape_of_t", "identity"}); + auto result2 = std::make_shared(shape_of); + auto model = std::make_shared(ov::ResultVector{result1, result2}, ov::ParameterVector{arg0, arg1}); + + model->validate_nodes_and_infer_types(); + + auto input1 = model->input(0); + auto input2 = model->input("data1"); + + auto cloned_model = ov::clone_model(*model); + + const auto fc = FunctionsComparator::with_default() + .enable(FunctionsComparator::ATTRIBUTES) + .enable(FunctionsComparator::CONST_VALUES); + const auto res = fc.compare(model, cloned_model); + EXPECT_TRUE(res.valid) << res.message; +} + +TEST(model, clone_model) { + auto arg0 = std::make_shared(ov::element::f32, ov::PartialShape{1, 3, 3, 3}); + arg0->set_friendly_name("data"); + arg0->get_output_tensor(0).set_names({"input1"}); + + auto arg1 = std::make_shared(ov::element::f32, ov::PartialShape{1, 2, 3, 3}); + arg1->set_friendly_name("data1"); + arg1->get_output_tensor(0).set_names({"input2", "data1"}); + + auto concat = std::make_shared(ov::NodeVector{arg0, arg1}, 1); + concat->set_friendly_name("concat"); + concat->get_output_tensor(0).set_names({"concat_t"}); + auto result1 = std::make_shared(concat); + + auto shape_of = std::make_shared(concat); + shape_of->set_friendly_name("shape_of"); + shape_of->get_output_tensor(0).set_names({"shape_of_t", "identity"}); + auto result2 = std::make_shared(shape_of); + auto model = std::make_shared(ov::ResultVector{result1, result2}, ov::ParameterVector{arg0, arg1}); + + model->validate_nodes_and_infer_types(); + + auto input1 = model->input(0); + auto input2 = model->input("data1"); + + auto cloned_model = model->clone(); + + const auto fc = FunctionsComparator::with_default() + .enable(FunctionsComparator::ATTRIBUTES) + .enable(FunctionsComparator::CONST_VALUES); + const auto res = fc.compare(model, cloned_model); + EXPECT_TRUE(res.valid) << res.message; +}