diff --git a/src/plugins/hetero/executable_network.cpp b/src/plugins/hetero/executable_network.cpp index 6c587add0a7..58e1c87d726 100644 --- a/src/plugins/hetero/executable_network.cpp +++ b/src/plugins/hetero/executable_network.cpp @@ -39,6 +39,7 @@ #include "plugin.hpp" #include +#include #include #include #include @@ -47,6 +48,7 @@ #include #include #include +#include // clang-format on using namespace InferenceEngine; @@ -58,17 +60,22 @@ using namespace InferenceEngine::HeteroConfigParams; template using NodeMap = std::unordered_map; -HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwork& network, +HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwork& originalNetwork, const Engine::Configs& config, Engine* plugin) : InferenceEngine::ExecutableNetworkThreadSafeDefault(nullptr, std::make_shared()), _heteroPlugin{plugin}, - _name{network.getName()}, + _name{originalNetwork.getName()}, _config{config} { - auto function = network.getFunction(); - IE_ASSERT(function != nullptr); - auto clonedFunction = ngraph::clone_function(*function); + auto clonned_network = InferenceEngine::details::cloneNetwork(originalNetwork); + auto clonned_function = clonned_network.getFunction(); + IE_ASSERT(clonned_function != nullptr); + + ngraph::pass::Manager manager; + manager.register_pass(); + manager.run_passes(clonned_function); + bool dumpDotFile = false; if (std::getenv("OPENVINO_HETERO_VISUALIZE")) { dumpDotFile = true; @@ -78,7 +85,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwo } QueryNetworkResult queryNetworkResult; - auto orderedOps = clonedFunction->get_ordered_ops(); + auto orderedOps = clonned_function->get_ordered_ops(); bool allEmpty = true; // Get user defined affinity for (auto&& node : orderedOps) { @@ -97,7 +104,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwo it = _config.find(ov::device::priorities.name()); } if (it != _config.end()) { - queryNetworkResult = _heteroPlugin->QueryNetwork(network, _config); + queryNetworkResult = _heteroPlugin->QueryNetwork(clonned_network, _config); } else { IE_THROW() << "The '" << ov::device::priorities.name() << "' option was not defined for heterogeneous plugin"; @@ -113,7 +120,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwo }; // Set results, constants and parameters affinity - for (auto&& node : clonedFunction->get_ops()) { + for (auto&& node : clonned_function->get_ops()) { if (ngraph::op::is_constant(node) || ngraph::op::is_output(node) || ngraph::op::is_parameter(node)) { if (!contains(queryNetworkResult.supportedLayersMap, node->get_friendly_name())) { auto& nodeWithAffinityName = @@ -194,7 +201,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwo colorIndex++; } }} - .run_on_model(ngraph::clone_function(*function)); + .run_on_model(ngraph::clone_function(*clonned_function)); } NodeMap nodeInputDependencies; @@ -327,7 +334,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwo itLabel->pop_back(); (*itLabel) += label; }} - .run_on_model(std::const_pointer_cast(function)); + .run_on_model(std::const_pointer_cast(clonned_function)); } // Break graph using insertion of result parameter split @@ -444,8 +451,8 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::CNNNetwo std::move(std::begin(newOrderedSubgraphs), std::end(newOrderedSubgraphs), std::back_inserter(orderedSubgraphs)); } while (!allSubgraphs.empty()); - InputsDataMap externalInputsData = network.getInputsInfo(); - OutputsDataMap externalOutputsData = network.getOutputsInfo(); + InputsDataMap externalInputsData = clonned_network.getInputsInfo(); + OutputsDataMap externalOutputsData = clonned_network.getOutputsInfo(); _networks.resize(orderedSubgraphs.size()); std::vector> subFunctions(orderedSubgraphs.size()); int id = 0;