[CONFORMANCE] Move testsRunner to new subgraphsDumper (#18129)

* New Subgraph Dumper -> Cache + Meta

* iCache tests

* tests_meta

* OpCache tests

* Move & refactor matchers

* fix all tests and refactor meta

* Prepare for review

* Add caching types

* Model testing + improvement

* Add ignored ports. Add tests for node utils

* [CONFORMANCE] MOVE conformance runner to new subgraphsDumper

* fix build

* Fix compilation error

* fix compilation of deprecated subgraphs dumper

* fix build

* arm

* fix win?

* temp commit

* revert

* Add w/a to save const

* Update constant.hpp

* Update constant.hpp

* fix ci build

* cleanup

* Update model.hpp

* Update data_utils.hpp

* Update generate_inputs.cpp

* fix compilation

* Fix update cache with partial shape is 0

* Fix tests

* fix some problems

* tmp disable tests

* TMP disable

* Add skip tests config to subgraphs dumper tests

* Remove extra changes

* Fix build

* One more commit

* Mere

* Remove extra

* Skip one test
This commit is contained in:
Irina Efode 2023-07-28 21:04:44 +04:00 committed by GitHub
parent 94887bed38
commit 6a94ae3409
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 222 additions and 198 deletions

View File

@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
#
set(TARGET_NAME subgraphsDumper)
set(TARGET_NAME subgraphsDumper_deprecated)
list(APPEND LIBRARIES
gflags

View File

@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
#
set(TARGET_NAME subgraphsDumperTests)
set(TARGET_NAME subgraphsDumperTests_deprecated)
addIeTargetTest(
NAME ${TARGET_NAME}

View File

@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
#
set(TARGET_NAME subgraphs_dumper)
set(TARGET_NAME subgraphsDumper)
list(APPEND LIBRARIES
gflags
@ -21,8 +21,8 @@ addIeTargetTest(
PRIVATE
${LIBRARIES}
DEPENDENCIES
ov_frontends
${DEPENDENCIES}
ADD_CPPLINT
)
ie_faster_build(${TARGET_NAME} UNITY)
ie_faster_build(${TARGET_NAME} UNITY)

View File

@ -5,7 +5,6 @@
#pragma once
#include "cache/cache.hpp"
#include "cache/meta/input_info.hpp"
#include "matchers/subgraph/manager.hpp"
#include "matchers/subgraph/subgraph.hpp"

View File

@ -8,7 +8,6 @@
#include "cache/meta/input_info.hpp"
#include "functional_test_utils/node_utils.hpp"
#include "functional_test_utils/summary/op_info.hpp"
#include "openvino/openvino.hpp"
#include "openvino/pass/manager.hpp"
#include "openvino/pass/constant_folding.hpp"

View File

@ -23,25 +23,26 @@ bool ICache::serialize_model(const std::pair<std::shared_ptr<ov::Model>, MetaInf
std::map<std::shared_ptr<ov::Node>, std::shared_ptr<ov::Node>> nodes;
ov::ParameterVector param_vector;
for (const auto& op : model->get_ordered_ops()) {
std::shared_ptr<ov::op::v0::Parameter> param = nullptr;
if (ov::op::util::is_parameter(op)) {
auto param = std::dynamic_pointer_cast<ov::op::v0::Parameter>(op);
param_vector.push_back(param);
}
if (ov::op::util::is_constant(op)) {
param = std::dynamic_pointer_cast<ov::op::v0::Parameter>(op);
} else if (ov::op::util::is_constant(op)) {
auto op_to_replace = std::dynamic_pointer_cast<ov::op::v0::Constant>(op);
if (op_to_replace->get_byte_size() > 1024) {
auto param = std::make_shared<ov::op::v0::Parameter>(
op_to_replace->get_output_element_type(0), op_to_replace->get_output_partial_shape(0));
nodes.insert({ op_to_replace, param });
param = std::make_shared<ov::op::v0::Parameter>(
op_to_replace->get_output_element_type(0), op_to_replace->get_output_partial_shape(0));
param->set_friendly_name(op_to_replace->get_friendly_name());
param_vector.push_back(param);
nodes.insert({ op_to_replace, param });
}
}
}
for (const auto& node : nodes) {
model->replace_node(node.first, node.second);
if (param != nullptr) {
param_vector.push_back(param);
}
}
if (!nodes.empty()) {
for (const auto& node : nodes) {
model->replace_node(node.first, node.second);
}
model = std::make_shared<ov::Model>(model->get_results(), param_vector);
}
@ -64,7 +65,7 @@ bool ICache::serialize_model(const std::pair<std::shared_ptr<ov::Model>, MetaInf
meta.serialize(meta_path);
return true;
} catch (std::exception &e) {
std::cout << "Failed to serialize model: " << model_name
std::cout << "[ ERROR ] Failed to serialize model: " << model_name
<< ". Exception: " << e.what() << std::endl;
ov::test::utils::removeIRFiles(xml_path, bin_path);
ov::test::utils::removeFile(meta_path);

View File

@ -19,6 +19,7 @@ std::shared_ptr<GraphCache> GraphCache::m_cache_instance = nullptr;
void GraphCache::update_cache(const std::shared_ptr<ov::Model>& model,
const std::string& model_meta_data,
bool extract_body) {
std::cout << "[ INFO ][ GRAPH CACHE ] Processing model: " << model_meta_data << std::endl;
auto model_total_op = model->get_ops().size() - model->get_output_size() - model->inputs().size();
auto extracted_patterns = m_manager.extract(model, extract_body);
if (extracted_patterns.empty()) {

View File

@ -20,6 +20,7 @@ std::shared_ptr<OpCache> OpCache::m_cache_instance = nullptr;
void OpCache::update_cache(const std::shared_ptr<ov::Model>& model,
const std::string& model_path,
bool extract_body) {
std::cout << "[ INFO ][ OP CACHE ] Processing model: " << model_path << std::endl;
size_t model_op_cnt = model->get_ops().size() - model->get_output_size() - model->inputs().size();
for (const auto& op : model->get_ordered_ops()) {
if (std::dynamic_pointer_cast<ov::op::v0::Parameter>(op) ||
@ -63,8 +64,8 @@ void OpCache::update_cache(const std::shared_ptr<ov::Node>& node,
cloned_node->set_friendly_name(ov::test::functional::get_node_version(cloned_node));
for (auto &&it : m_ops_cache) {
if (m_manager.match(it.first, cloned_node)) {
std::cout << "Match " << cloned_node->get_type_info().name << " " << cloned_node->get_friendly_name() <<
" with " << it.first->get_friendly_name() << std::endl;
// std::cout << "Match " << cloned_node->get_type_info().name << " " << cloned_node->get_friendly_name() <<
// " with " << it.first->get_friendly_name() << std::endl;
find_op_in_cache = it.first;
break;
}
@ -84,16 +85,18 @@ void OpCache::update_cache(const std::shared_ptr<ov::Node>& node,
size_t priority = get_node_priority_by_version(cloned_node);
auto meta = MetaInfo(model_path, get_input_info_by_node(cloned_node), model_op_cnt, priority);
if (find_op_in_cache != nullptr) {
std::cout << "[ INFO ][ OP CACHE ] Update cache node: " << cloned_node->get_type_info().name <<
" " << find_op_in_cache->get_friendly_name() << std::endl;
m_ops_cache[find_op_in_cache].update(model_path, get_input_info_by_node(cloned_node), model_op_cnt, ignored_input_names);
}
if (find_op_in_cache > cloned_node) {
std::cout << "Update cache node: " << cloned_node->get_type_info().name << " " << find_op_in_cache->get_friendly_name() << std::endl;
meta = m_ops_cache[find_op_in_cache];
m_ops_cache.erase(find_op_in_cache);
find_op_in_cache = nullptr;
}
if (find_op_in_cache == nullptr) {
std::cout << "Insert node: " << cloned_node->get_type_info().name << " " << cloned_node->get_friendly_name() << " to Cache" << std::endl;
std::cout << "[ INFO ][ OP CACHE ] Insert node: " << cloned_node->get_type_info().name <<
" " << cloned_node->get_friendly_name() << " to Cache" << std::endl;
m_ops_cache.insert({ cloned_node, meta });
}
}

View File

@ -29,15 +29,19 @@ int main(int argc, char *argv[]) {
try {
models = find_models(dirs, FLAGS_path_regex);
} catch (std::runtime_error& e) {
std::cout << "Try 'subgraphdumper -h' for more information. \nException: " << e.what() << std::endl;
std::cout << "[ INFO ] Try 'subgraphsDumper -h' for more information. \nException: " << e.what() << std::endl;
return 1;
}
std::vector<std::shared_ptr<ICache>> caches;
if (FLAGS_cache_type == "OP" || FLAGS_cache_type.empty()) {
std::cout << "[ INFO ] OpCache is enabled!" << std::endl;
caches.push_back(OpCache::get());
} else if (FLAGS_cache_type == "GRAPH" || FLAGS_cache_type.empty()) {
caches.push_back(GraphCache::get());
}
if (FLAGS_cache_type == "GRAPH" || FLAGS_cache_type.empty()) {
// todo: iefode: to check and enable it in CI
// std::cout << "[ INFO ] GraphCache is enabled!" << std::endl;
// caches.push_back(GraphCache::get());
}
for (auto& cache : caches) {

View File

@ -4,9 +4,7 @@
#include "openvino/op/convolution.hpp"
#include "openvino/op/group_conv.hpp"
#include "common_test_utils/graph_comparator.hpp"
#include "matchers/single_op/single_op.hpp"
using namespace ov::tools::subgraph_dumper;

View File

@ -69,7 +69,7 @@ FusedNamesExtractor::extract(const std::shared_ptr<ov::Model> &model,
try {
matched_patterns.push_back(generate_model(nodes, start_node, checked_ops));
} catch(std::exception& e) {
std::cout << e.what() << std::endl;
std::cout << "[ ERROR ] Impossible to generate network and add to GraphCache: " <<e.what() << std::endl;
}
start_node = nullptr;
nodes.clear();
@ -78,7 +78,7 @@ FusedNamesExtractor::extract(const std::shared_ptr<ov::Model> &model,
try {
matched_patterns.push_back(generate_model(nodes, start_node, checked_ops));
} catch(std::exception& e) {
std::cout << e.what() << std::endl;
std::cout << "[ ERROR ] Impossible to generate network and add to GraphCache: " << e.what() << std::endl;
}
return matched_patterns;
}

View File

@ -96,7 +96,7 @@ RepeatPatternExtractor::extract(const std::shared_ptr<ov::Model> &model,
generate_model(nodes[i], ordered_ops[start_node_idx[i]], checked_ops));
nodes[i].clear();
} catch(std::exception& e) {
std::cout << e.what() << std::endl;
std::cout << "[ ERROR ] Impossible to generate network and add to GraphCache: " << e.what() << std::endl;
}
}
if (is_extract_body) {

View File

@ -12,12 +12,11 @@ inline std::unordered_map<std::string, std::shared_ptr<ov::Node>>
update_nodes(const std::set<std::shared_ptr<ov::Node>>& nodes,
const std::shared_ptr<ov::Node>& start_node) {
std::unordered_map<std::string, std::shared_ptr<ov::Node>> model_map;
auto cloned_op = clone_node(start_node, true, false, "Op_" + std::to_string(model_map.size()));
model_map.insert({ start_node->get_friendly_name(), cloned_op });
std::shared_ptr<ov::Node> cloned_op = nullptr;
for (const auto& op : nodes) {
if (ov::op::util::is_parameter(op) || ov::op::util::is_constant(op) ||
ov::op::util::is_output(op) || op == start_node) {
ov::op::util::is_output(op)) {
continue;
}
cloned_op = clone_node(op, true, false, "Op_" + std::to_string(model_map.size()));
@ -26,16 +25,15 @@ update_nodes(const std::set<std::shared_ptr<ov::Node>>& nodes,
for (const auto& op : nodes) {
if (ov::op::util::is_parameter(op) || ov::op::util::is_constant(op) ||
ov::op::util::is_output(op) || op == start_node) {
ov::op::util::is_output(op)) {
continue;
}
auto op_name = op->get_friendly_name();
cloned_op = model_map[op->get_friendly_name()];
size_t inputs_size = op->inputs().size();
ov::OutputVector in_out_vector(inputs_size);
bool is_input_filled = false;
int filled_input_idx = -1;
for (size_t in_idx = 0; in_idx < inputs_size; ++in_idx) {
bool is_this_input_filled = false;
auto in_node = op->get_input_node_ptr(in_idx)->shared_from_this();
for (size_t in_out_idx = 0; in_out_idx < in_node->outputs().size(); ++in_out_idx) {
for (const auto& target_input : in_node->output(in_out_idx).get_target_inputs()) {
@ -45,20 +43,24 @@ update_nodes(const std::set<std::shared_ptr<ov::Node>>& nodes,
in_out_vector[in_idx] = model_map.count(in_node_name) ?
model_map.at(in_node_name)->output(in_out_idx) :
cloned_op->get_input_node_ptr(in_idx)->output(0);
is_this_input_filled = true;
if (model_map.count(in_node_name)) {
filled_input_idx++;
}
break;
}
}
if (is_this_input_filled) {
is_input_filled = true;
if (filled_input_idx == in_idx) {
break;
}
}
}
if (!is_input_filled && op_name != start_node->get_friendly_name()) {
// todo: iefode: check this code
if (filled_input_idx < 0 && op_name != start_node->get_friendly_name()) {
model_map.erase(op_name);
} else {
} else if (filled_input_idx >= 0) {
auto name = cloned_op->get_friendly_name();
model_map[op_name] = cloned_op->clone_with_new_inputs(in_out_vector);
model_map[op_name]->set_friendly_name(name);
}
}
return model_map;
@ -68,11 +70,13 @@ std::pair<std::shared_ptr<ov::Model>, std::map<std::string, InputInfo>>
generate_model(const std::set<std::shared_ptr<ov::Node>>& nodes,
const std::shared_ptr<ov::Node>& start_node,
std::unordered_set<std::string>& checked_ops) {
if (nodes.size() < 2) {
throw std::runtime_error("Incorrect node number to create model");
}
auto model_map = update_nodes(nodes, start_node);
if (model_map.size() < 2) {
throw std::runtime_error("Incorrect node number to create model");
}
ov::OutputVector results;
std::map<std::string, InputInfo> input_info;
for (const auto& op : model_map) {
@ -122,7 +126,7 @@ std::vector<std::string> find_models(const std::vector<std::string> &dirs, const
try {
models.emplace_back(file);
} catch (std::exception& e) {
std::cout << "Impossible to read model: " << file << std::endl << "Exception: " << e.what();
std::cout << "[ ERROR ] Impossible to read model: " << file << std::endl << "Exception: " << e.what();
}
}
}
@ -143,7 +147,6 @@ std::map<ModelCacheStatus, std::vector<std::string>> cache_models(
for (auto& cache : caches) {
for (const auto& model : models) {
if (ov::util::file_exists(model)) {
std::cout << "Processing model: " << model << std::endl;
ModelCacheStatus model_status = ModelCacheStatus::SUCCEED;
try {
std::shared_ptr<ov::Model> function = core->read_model(model);
@ -152,12 +155,12 @@ std::map<ModelCacheStatus, std::vector<std::string>> cache_models(
cache->update_cache(function, model, extract_body);
}
} catch (std::exception &e) {
std::cout << "Model processing failed with exception:" << std::endl << e.what() << std::endl;
std::cout << "[ ERROR ] Model processing failed with exception:" << std::endl << e.what() << std::endl;
model_status = ModelCacheStatus::NOT_FULLY_CACHED;
}
} catch (std::exception &e) {
model_status = ModelCacheStatus::NOT_READ;
std::cout << "Model reading failed with exception:" << std::endl << e.what() << std::endl;
std::cout << "[ ERROR ] Model reading failed with exception:" << std::endl << e.what() << std::endl;
}
cache_status[model_status].push_back(model);
}

View File

@ -14,6 +14,8 @@ std::map<std::string, InputInfo> get_input_info_by_node(const std::shared_ptr<ov
std::shared_ptr<ov::Node> input_node = node->get_input_node_shared_ptr(port_id);
std::string input_name = input_node->get_friendly_name();
if (std::dynamic_pointer_cast<ov::op::v0::Constant>(input_node)) {
if (ov::shape_size(input_node->get_output_shape(0)) == 0)
continue;
auto const_node =
std::dynamic_pointer_cast<ov::op::v0::Constant>(input_node);
in_info.is_const = true;
@ -124,7 +126,7 @@ std::shared_ptr<ov::Node> clone_node(std::shared_ptr<ov::Node> node,
}
if (!has_parameters && !is_copy_const_node) {
auto cloned_node = clone_node(node, true, true);
std::cout << "The operation: " + node->get_friendly_name() + " does not have parameters! Replace first input to parameter!" << std::endl;
// std::cout << "The operation: " + node->get_friendly_name() + " does not have parameters! Replace first input to parameter!" << std::endl;
auto param =
std::make_shared<ov::op::v0::Parameter>(cloned_node->get_input_element_type(0), cloned_node->get_input_partial_shape(0));
std::string param_name = node_name + "_0";

View File

@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
#
set(TARGET_NAME subgraphs_dumper_tests)
set(TARGET_NAME subgraphsDumperTests)
addIeTargetTest(
NAME ${TARGET_NAME}

View File

@ -0,0 +1,16 @@
// Copyright (C) 2018-2023 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#pragma once
#include "gtest/gtest.h"
#include "functional_test_utils/skip_tests_config.hpp"
// ======================= ExtractorsManagerTest Unit tests =======================
class SubgraphsDumperBaseTest : public ::testing::Test {
protected:
void SetUp() override {
SKIP_IF_CURRENT_TEST_IS_DISABLED();
}
};

View File

@ -4,8 +4,6 @@
#include <memory>
#include "gtest/gtest.h"
#include "openvino/op/ops.hpp"
#include "openvino/util/file_util.hpp"
#include "openvino/openvino.hpp"
@ -16,9 +14,11 @@
#include "cache/cache.hpp"
#include "cache/meta/meta_info.hpp"
#include "base_test.hpp"
namespace {
class ICacheUnitTest : public ::testing::Test,
class ICacheUnitTest : public SubgraphsDumperBaseTest,
public virtual ov::tools::subgraph_dumper::ICache {
protected:
std::shared_ptr<ov::Model> test_model;
@ -27,6 +27,7 @@ protected:
std::string test_artifacts_dir;
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
model_name = "test_model";
test_artifacts_dir = "test_artifacts";
test_model_path = ov::util::path_join({ test_artifacts_dir, model_name + ".xml" });

View File

@ -4,8 +4,6 @@
#include <memory>
#include "gtest/gtest.h"
#include "openvino/op/ops.hpp"
#include "openvino/util/file_util.hpp"
#include "openvino/op/util/op_types.hpp"
@ -18,6 +16,7 @@
#include "test_models/model_0.hpp"
#include "test_models/model_1.hpp"
#include "test_models/model_2.hpp"
#include "base_test.hpp"
namespace {
@ -25,12 +24,13 @@ using namespace ov::tools::subgraph_dumper;
// ====================== Graph Cache Functional tests ==============================
class GraphCacheFuncTest : public ::testing::Test {
class GraphCacheFuncTest : public SubgraphsDumperBaseTest {
protected:
std::shared_ptr<ov::Model> test_model;
std::string test_artifacts_dir, test_model_name, test_model_path;
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
test_model_name = "test_model_name";
test_artifacts_dir = ov::util::path_join({ov::test::utils::getCurrentWorkingDir(), "test_artifacts"});
test_model_path = ov::util::path_join({test_artifacts_dir, test_model_name + ".xml"});
@ -63,7 +63,7 @@ TEST_F(GraphCacheFuncTest, get_graph_cache_twice) {
TEST_F(GraphCacheFuncTest, update_cache) {
auto graph_cache = ov::tools::subgraph_dumper::GraphCache::get();
ASSERT_NO_THROW(graph_cache->update_cache(test_model, test_model_path, true));
graph_cache->update_cache(test_model, test_model_path, true);
ASSERT_NO_THROW(graph_cache->update_cache(test_model, test_model_path, true));
}

View File

@ -4,7 +4,6 @@
#include <memory>
#include "gtest/gtest.h"
#include "pugixml.hpp"
#include "openvino/openvino.hpp"
@ -14,13 +13,15 @@
#include "cache/meta/meta_info.hpp"
#include "base_test.hpp"
namespace {
using namespace ov::tools::subgraph_dumper;
// ======================== Input Info Unit tests =============================================
class InputInfoUnitTest : public ::testing::Test {};
class InputInfoUnitTest : public SubgraphsDumperBaseTest {};
TEST_F(InputInfoUnitTest, constructor) {
ASSERT_NO_THROW(auto in_info = InputInfo());
@ -58,7 +59,7 @@ TEST_F(ModelInfoFuncTest, constructor) {
// ======================== Meta Info Functional tests =============================================
class MetaInfoFuncTest : public ::testing::Test {
class MetaInfoFuncTest : public SubgraphsDumperBaseTest {
protected:
std::string test_model_path, test_model_name;
std::map<std::string, InputInfo> test_in_info;
@ -66,6 +67,7 @@ protected:
std::string test_artifacts_dir;
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
test_model_path = "test_model_path.xml";
test_model_name = ov::test::utils::replaceExt(test_model_path, "");
test_in_info = {{ "test_in_0", InputInfo(DEFAULT_MIN_VALUE, 1, true) }};
@ -195,10 +197,11 @@ TEST_F(MetaInfoUnitTest, get_model_name_by_path) {
}
TEST_F(MetaInfoUnitTest, get_graph_priority) {
auto meta = MetaInfo(test_model_name, test_in_info);
this->update(test_model_name, meta.get_input_info());
ASSERT_NO_THROW(this->get_abs_graph_priority());
ASSERT_NO_THROW(this->get_graph_priority());
ASSERT_TRUE(this->get_graph_priority() >= 0 && this->get_graph_priority() <= 1);
ASSERT_NO_THROW(this->get_abs_graph_priority());
ASSERT_EQ(this->get_abs_graph_priority(), 5);
}
} // namespace

View File

@ -4,8 +4,6 @@
#include <memory>
#include "gtest/gtest.h"
#include "openvino/op/ops.hpp"
#include "openvino/util/file_util.hpp"
@ -15,18 +13,21 @@
#include "cache/op_cache.hpp"
#include "utils/node.hpp"
#include "base_test.hpp"
namespace {
using namespace ov::tools::subgraph_dumper;
// ====================== Operation Cache Functional tests ==============================
class OpCacheFuncTest : public ::testing::Test {
class OpCacheFuncTest : public SubgraphsDumperBaseTest {
protected:
std::shared_ptr<ov::Model> test_model;
std::string test_artifacts_dir, test_model_name, test_model_path;
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
test_model_name = "test_model_name";
test_artifacts_dir = ov::util::path_join({ov::test::utils::getCurrentWorkingDir(), "test_artifacts"});
test_model_path = ov::util::path_join({test_artifacts_dir, test_model_name + ".xml"});

View File

@ -2,18 +2,18 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "matchers/single_op/convolutions.hpp"
#include "openvino/op/ops.hpp"
#include "base_test.hpp"
namespace {
using namespace ov::tools::subgraph_dumper;
class ConvolutionMatcherTest : public ::testing::Test {
class ConvolutionMatcherTest : public SubgraphsDumperBaseTest {
protected:
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
matcher = ConvolutionsMatcher();
}

View File

@ -2,19 +2,18 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "openvino/op/ops.hpp"
#include "matchers/single_op/single_op.hpp"
#include "base_test.hpp"
namespace {
using namespace ov::tools::subgraph_dumper;
class SingleOpMatcherTest : public ::testing::Test {
class SingleOpMatcherTest : public SubgraphsDumperBaseTest {
protected:
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
matcher = SingleOpMatcher();
}

View File

@ -2,27 +2,28 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "openvino/op/abs.hpp"
#include "openvino/op/parameter.hpp"
#include "matchers/single_op/manager.hpp"
#include "matchers/single_op/single_op.hpp"
#include "base_test.hpp"
namespace {
using namespace ov::tools::subgraph_dumper;
// ======================= MatcherManager Unit tests =======================
class MatchersManagerTest : public MatchersManager,
public ::testing::Test {
public SubgraphsDumperBaseTest {
protected:
MatchersManager::MatchersMap test_map;
std::shared_ptr<ov::op::v0::Abs> test_abs;
std::shared_ptr<ov::op::v0::Parameter> test_parameter;
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
test_map = {
{ "test_matcher", SingleOpMatcher::Ptr(new SingleOpMatcher) },
};

View File

@ -2,9 +2,9 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "matchers/single_op/single_op.hpp"
#include "openvino/op/ops.hpp"
#include "base_test.hpp"
namespace {
@ -13,9 +13,10 @@ using namespace ngraph;
using ov::element::Type_t;
using namespace ov::tools::subgraph_dumper;
class MatcherConfigTest : public ::testing::Test {
class MatcherConfigTest : public SubgraphsDumperBaseTest {
protected:
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
const auto const1 = std::make_shared<v0::Constant>(Type_t::f32, Shape({5, 5}), 1);
const auto const2 = std::make_shared<v0::Constant>(Type_t::f32, Shape({5, 5}), 2);
node = std::make_shared<v1::Add>(const1, const2);

View File

@ -4,14 +4,13 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "matchers/subgraph/fused_names.hpp"
#include "utils/model.hpp"
#include "test_models/model_0.hpp"
#include "test_models/model_1.hpp"
#include "test_models/model_2.hpp"
#include "base_test.hpp"
namespace {
@ -20,19 +19,33 @@ using namespace ov::tools::subgraph_dumper;
// ======================= ExtractorsManagerTest Unit tests =======================
class FusedNamesExtractorTest : public FusedNamesExtractor,
public ::testing::Test {
public SubgraphsDumperBaseTest {
protected:
bool is_match(const std::shared_ptr<ov::Model>& model) {
auto compiled_names = extract_compiled_model_names(model);
std::set<std::string> diff;
for (const auto& op : model->get_ordered_ops()) {
auto op_name = op->get_friendly_name();
if (!compiled_names.count(op_name)) {
diff.insert(op_name);
size_t graph_cnt = 0;
{
auto compiled_names = extract_compiled_model_names(model);
std::vector<size_t> op_cnt;
for (const auto& op : model->get_ordered_ops()) {
if (this->is_node_to_skip(op)) {
op_cnt.push_back(1);
continue;
}
auto op_name = op->get_friendly_name();
if (!compiled_names.count(op_name)) {
op_cnt.push_back(1);
} else if (op_cnt.size() > 0) {
++op_cnt[op_cnt.size() - 1];
}
}
for (const auto& cnt : op_cnt) {
if (cnt > 1) {
++graph_cnt;
}
}
}
auto models = this->extract(model);
return diff.size() == 0 ? true : models.size() + 2 == diff.size();
return models.size() == graph_cnt;
}
};

View File

@ -2,11 +2,9 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "matchers/subgraph/manager.hpp"
#include "matchers/subgraph/subgraph.hpp"
#include "base_test.hpp"
#include "openvino/op/abs.hpp"
#include "openvino/op/relu.hpp"
@ -19,9 +17,10 @@ using namespace ov::tools::subgraph_dumper;
// ======================= ExtractorsManagerTest Unit tests =======================
class ExtractorsManagerTest : public ExtractorsManager,
public ::testing::Test {
public SubgraphsDumperBaseTest {
protected:
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
test_map = {
{ "test_matcher", SubgraphExtractor::Ptr(new SubgraphExtractor) },
};

View File

@ -7,6 +7,7 @@
#include "matchers/subgraph/repeat_pattern.hpp"
#include "utils/model.hpp"
#include "base_test.hpp"
#include "test_models/model_0.hpp"
#include "test_models/model_1.hpp"
#include "test_models/model_2.hpp"
@ -18,7 +19,7 @@ using namespace ov::tools::subgraph_dumper;
// ======================= ExtractorsManagerTest Unit tests =======================
class RepeatPatternExtractorTest : public RepeatPatternExtractor,
public ::testing::Test {
public SubgraphsDumperBaseTest {
protected:
bool is_match(const std::list<ExtractedPattern>& models,
const std::vector<std::shared_ptr<ov::Model>>& ref_models) {

View File

@ -2,9 +2,8 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "matchers/subgraph/subgraph.hpp"
#include "base_test.hpp"
#include "openvino/op/abs.hpp"
#include "openvino/op/relu.hpp"
@ -17,9 +16,10 @@ using namespace ov::tools::subgraph_dumper;
// ======================= ExtractorsManagerTest Unit tests =======================
class SubgraphExtractorTest : public SubgraphExtractor,
public ::testing::Test {
public SubgraphsDumperBaseTest {
protected:
void SetUp() override {
SubgraphsDumperBaseTest::SetUp();
{
std::shared_ptr<ov::op::v0::Parameter> test_parameter =
std::make_shared<ov::op::v0::Parameter>(ov::element::f32, ov::Shape{1, 2});

View File

@ -0,0 +1,15 @@
// Copyright (C) 2018-2023 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "functional_test_utils/skip_tests_config.hpp"
std::vector<std::string> disabledTestPatterns() {
std::vector<std::string> retVector{
// todo: enable these tests with graph cache enabling
R"(.*RepeatPatternExtractorTest.*extract_1.*)",
R"(.*ModelUtilsTest.*generate_.*)",
R"(.*GraphCacheFuncTest.*update_cache.*)",
};
return retVector;
}

View File

@ -2,63 +2,38 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "openvino/op/util/op_types.hpp"
#include "utils/model.hpp"
#include "matchers/subgraph/subgraph.hpp"
#include "test_models/model_0.hpp"
#include "test_models/model_1.hpp"
#include "test_models/model_2.hpp"
#include "base_test.hpp"
namespace {
using namespace ov::tools::subgraph_dumper;
inline std::pair<std::shared_ptr<ov::Node>, std::set<std::shared_ptr<ov::Node>>>
using ModelUtilsTest = SubgraphsDumperBaseTest;
std::pair<std::shared_ptr<ov::Node>, std::set<std::shared_ptr<ov::Node>>>
get_functional_ops(const std::shared_ptr<ov::Model>& model) {
std::shared_ptr<ov::Node> start_node = nullptr;
// todo: check get_ordered_ops (work diffent compilation by compilation) and remove his code after
std::set<std::shared_ptr<ov::Node>> nodes;
std::vector<std::shared_ptr<ov::Node>> nodes_tmp;
std::vector<std::shared_ptr<ov::Node>> layer;
for (const auto& res : model->get_results()) {
for (size_t i = 0; i < res->inputs().size(); ++i) {
layer.push_back(res->get_input_node_shared_ptr(i));
}
}
while (!layer.empty()) {
std::vector<std::shared_ptr<ov::Node>> prev_layer;
nodes_tmp.insert(nodes_tmp.begin(), layer.begin(), layer.end());
for (const auto& op : layer) {
for (size_t i = 0; i < op->inputs().size(); ++i)
prev_layer.push_back(op->get_input_node_shared_ptr(i));
}
layer = prev_layer;
}
for (const auto& node : nodes_tmp) {
if (ov::op::util::is_parameter(node) || ov::op::util::is_output(node)) {
for (const auto& op : model->get_ordered_ops()) {
if (ov::op::util::is_parameter(op) || ov::op::util::is_output(op)) {
continue;
}
if (start_node == nullptr) {
start_node = node;
start_node = op;
}
nodes.insert(node);
nodes.insert(op);
}
// for (const auto& op : model->get_ordered_ops()) {
// if (ov::op::util::is_parameter(op) || ov::op::util::is_output(op)) {
// continue;
// }
// if (start_node == nullptr) {
// start_node = op;
// }
// nodes.insert(op);
// }
return { start_node, nodes };
}
TEST(ModelUtilsTest, generate_0) {
TEST_F(ModelUtilsTest, generate_0) {
Model_0 test;
std::shared_ptr<ov::Model> test_model = test.get(), recovered_model;
{
@ -78,7 +53,7 @@ TEST(ModelUtilsTest, generate_0) {
}
}
TEST(ModelUtilsTest, generate_1) {
TEST_F(ModelUtilsTest, generate_1) {
Model_1 test;
std::shared_ptr<ov::Model> test_model = test.get(), recovered_model;
{
@ -98,7 +73,7 @@ TEST(ModelUtilsTest, generate_1) {
}
}
TEST(ModelUtilsTest, generate_2) {
TEST_F(ModelUtilsTest, generate_2) {
Model_2 test;
std::shared_ptr<ov::Model> test_model = test.get(), recovered_model;
{

View File

@ -2,17 +2,16 @@
// SPDX-License-Identifier: Apache-2.0
//
#include "gtest/gtest.h"
#include "utils/node.hpp"
#include "openvino/op/ops.hpp"
#include "base_test.hpp"
namespace {
using namespace ov::tools::subgraph_dumper;
using NodeUtilsTest = SubgraphsDumperBaseTest;
TEST(NodeUtilsTest, get_const_ranges) {
TEST_F(NodeUtilsTest, get_const_ranges) {
std::vector<float> values = {-1, -2.05, -3.65, 0, 5, 7};
auto const_node = std::make_shared<ov::op::v0::Constant>(ov::element::Type_t::f32, ov::Shape({2, 3}), values);
auto range = get_const_ranges<float>(const_node);
@ -20,7 +19,7 @@ TEST(NodeUtilsTest, get_const_ranges) {
ASSERT_EQ(range, range_ref);
}
TEST(NodeUtilsTest, get_input_info_by_node) {
TEST_F(NodeUtilsTest, get_input_info_by_node) {
std::vector<float> values = {-1, -2.05, -3.65, 0, 5, 7};
auto const_node = std::make_shared<ov::op::v0::Constant>(ov::element::Type_t::f32, ov::Shape({2, 3}), values);
const_node->set_friendly_name("const_0");
@ -36,7 +35,7 @@ TEST(NodeUtilsTest, get_input_info_by_node) {
ASSERT_EQ(ref_test_info, orig_test_info);
}
TEST(NodeUtilsTest, clone_node) {
TEST_F(NodeUtilsTest, clone_node) {
std::vector<float> values(512, 1.f);
auto const_node = std::make_shared<ov::op::v0::Constant>(ov::element::Type_t::f32, ov::Shape({2, 256}), values);
const_node->set_friendly_name("const_0");
@ -65,7 +64,7 @@ TEST(NodeUtilsTest, clone_node) {
}
}
TEST(NodeUtilsTest, generate_model_by_node) {
TEST_F(NodeUtilsTest, generate_model_by_node) {
std::vector<float> values = {-1, -2.05, -3.65, 0, 5, 7};
auto const_node = std::make_shared<ov::op::v0::Constant>(ov::element::Type_t::f32, ov::Shape({2, 3}), values);
const_node->set_friendly_name("const_0");
@ -93,7 +92,7 @@ TEST(NodeUtilsTest, generate_model_by_node) {
ASSERT_EQ(res_0->get_element_type(), ov::element::Type_t::f32);
}
TEST(NodeUtilsTest, get_max_ops_versions) {
TEST_F(NodeUtilsTest, get_max_ops_versions) {
std::map<std::string, std::string> max_ops_versions;
ASSERT_NO_THROW(max_ops_versions = get_max_ops_versions());
@ -109,7 +108,7 @@ TEST(NodeUtilsTest, get_max_ops_versions) {
ASSERT_EQ(max_ops_versions[shapeOf_0->get_type_info().name], "3");
}
TEST(NodeUtilsTest, get_node_priority_by_version) {
TEST_F(NodeUtilsTest, get_node_priority_by_version) {
auto param = std::make_shared<ov::op::v0::Parameter>(ov::element::u8, ov::PartialShape{1, 3, 16, 16});
auto one_opset_node = std::make_shared<ov::op::v0::Convert>(param, ov::element::u16);

View File

@ -9,11 +9,13 @@ addIeTarget(
TYPE STATIC
ROOT "${CMAKE_CURRENT_SOURCE_DIR}/include"
ADDITIONAL_SOURCE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/src
${OpenVINO_SOURCE_DIR}/src/tests/functional/plugin/conformance/subgraphs_dumper_new/include/cache/meta/
${CMAKE_CURRENT_SOURCE_DIR}/src
ADD_CPPLINT
INCLUDES
PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/include"
${CMAKE_CURRENT_SOURCE_DIR}/include
${OpenVINO_SOURCE_DIR}/src/tests/functional/plugin/conformance/subgraphs_dumper_new/include/cache/meta/
LINK_LIBRARIES
PUBLIC
gflags

View File

@ -9,15 +9,19 @@
#include <pugixml.hpp>
#include "shared_test_classes/base/utils/ranges.hpp"
#include "shared_test_classes/base/utils/generate_inputs.hpp"
#include "ngraph_functions/builders.hpp"
#include "common_test_utils/file_utils.hpp"
#include "common_test_utils/data_utils.hpp"
#include "common_test_utils/ov_tensor_utils.hpp"
#include "common_test_utils/common_utils.hpp"
#include "common_test_utils/graph_comparator.hpp"
#include "functional_test_utils/crash_handler.hpp"
#include "functional_test_utils/summary/op_info.hpp"
#include "functional_test_utils/skip_tests_config.hpp"
#include "input_info.hpp"
#include "conformance.hpp"
#include "read_ir_test/read_ir.hpp"
@ -25,6 +29,10 @@
#include <setjmp.h>
#include "openvino/pass/manager.hpp"
#include "openvino/pass/constant_folding.hpp"
#include "openvino/runtime/common.hpp"
namespace ov {
namespace test {
namespace conformance {
@ -199,68 +207,44 @@ void ReadIRTest::SetUp() {
if (ov::test::utils::fileExists(metaFile)) {
pugi::xml_document doc;
doc.load_file(metaFile.c_str());
auto models = doc.child("meta_info").child("models");
size_t model_len = 0, occurance = 0;
for (const auto &model : models.children("model")) {
ocurance_in_models.push_back({model.attribute("name").as_string(), model.attribute("count").as_uint()});
model_len++;
occurance += model.attribute("count").as_uint();
}
rel_influence_coef = doc.child("meta_info").child("graph_priority").attribute("value").as_double();
// TODO: remove after cache update w/a
if (rel_influence_coef == 0) {
rel_influence_coef = 1.f;
}
auto portsInfo = doc.child("meta_info").child("ports_info");
auto getPortInfo = [&](size_t id) {
LayerTestsUtils::PortInfo info;
for (const auto &p : portsInfo.children()) {
if (p.attribute("id").as_uint() == id) {
info.convert_to_const = p.attribute("convert_to_const").as_bool();
if (std::strcmp(p.attribute("min").as_string(), "undefined") != 0) {
info.min = p.attribute("min").as_double();
} else {
info.min = -10;
}
if (std::strcmp(p.attribute("max").as_string(), "undefined") != 0) {
info.max = p.attribute("max").as_double();
} else {
info.max = 10;
}
break;
}
auto input_info_xml = doc.child("meta_info").child("input_info");
std::map<std::string, ov::tools::subgraph_dumper::InputInfo> input_info;
for (const auto &input : input_info_xml.children()) {
auto in_name = std::string(input.attribute("id").value());
ov::tools::subgraph_dumper::InputInfo in_info;
in_info.is_const = input.attribute("convert_to_const").as_bool();
if (std::string(input.attribute("min").value()) != "undefined") {
in_info.ranges.min = input.attribute("min").as_double();
}
return info;
};
auto params = function->get_parameters();
for (const auto &param : params) {
auto idx = -1;
for (size_t i = 0; i < param->get_output_size(); i++) {
for (const auto &node : param->get_output_target_inputs(i)) {
const auto nodePtr = node.get_node()->shared_from_this();
for (size_t port = 0; port < nodePtr->get_input_size(); ++port) {
if (nodePtr->get_input_node_ptr(port)->shared_from_this() == param->shared_from_this()) {
idx = port;
break;
}
}
}
if (std::string(input.attribute("max").value()) != "undefined") {
in_info.ranges.max = input.attribute("max").as_double();
}
EXPECT_GE(idx, 0);
auto info = getPortInfo(idx);
if (info.convert_to_const) {
const auto constant = ngraph::builder::makeConstant(param->get_element_type(),
param->get_shape(),
std::vector<double>{},
true,
info.max,
info.min,
1);
ov::replace_node(param, constant);
function->remove_parameter(param);
input_info.insert({in_name, in_info});
}
auto inputMap = utils::getInputMap();
std::vector<std::shared_ptr<ov::op::v0::Parameter>> parameter_to_remove;
for (const auto& param : function->get_parameters()) {
auto in_info = input_info.find(param->get_friendly_name())->second;
if (!in_info.is_const) {
continue;
}
utils::ConstRanges::set(in_info.ranges.min, in_info.ranges.max);
// auto next_node = param->get_default_output().get_node_shared_ptr();
auto next_node = param->get_default_output().get_target_inputs().begin()->get_node()->shared_from_this();
auto it = inputMap.find(next_node->get_type_info());
auto tensor = it->second(next_node, function->get_parameter_index(param), param->get_element_type(), param->get_shape());
auto const_node = std::make_shared<ov::op::v0::Constant>(tensor);
ov::replace_node(param, const_node);
parameter_to_remove.push_back(param);
utils::ConstRanges::reset();
}
for (const auto& param : parameter_to_remove) {
function->remove_parameter(param);
}
}

View File

@ -7,6 +7,8 @@
#include "ie_core.hpp"
#include "ngraph/node.hpp"
#include "shared_test_classes/base/utils/ranges.hpp"
namespace ov {
namespace test {
namespace utils {

View File

@ -14,6 +14,8 @@
#include "shared_test_classes/base/utils/generate_inputs.hpp"
#include "shared_test_classes/base/utils/ranges.hpp"
#include "openvino/pass/constant_folding.hpp"
namespace ov {
namespace test {
namespace utils {
@ -506,8 +508,6 @@ ov::runtime::Tensor generate(const std::shared_ptr<ngraph::op::v1::ReduceLogical
return LogicalOp::generate(elemType, targetShape);
}
ov::runtime::Tensor generate(const std::shared_ptr<ngraph::op::v3::Bucketize>& node,
size_t port,
const ov::element::Type& elemType,

View File

@ -29,6 +29,8 @@ inline std::string get_node_version(const std::shared_ptr<ov::Node>& node, const
} // namespace test
} // namespace ov
// todo: remove these structure after remove old subgraphs dumper
namespace LayerTestsUtils {
struct ModelInfo {

View File

@ -180,7 +180,7 @@ def create_hash(in_dir_path: Path, operations=dict()):
pass
except:
logger.error(f"Impossible to create hash for {model_path}")
ports_info = ET.parse(meta_path).getroot().find("ports_info")
ports_info = ET.parse(meta_path).getroot().find("input_info")
str_to_hash += ET.tostring(ports_info).decode('utf8').replace('\t', '')
old_name = model_path