Skip to content

Commit fb89d8b

Browse files
authored
[core] Save Parameter and Result ids ordered (#33083)
### Details: - Aligns xml ids of Parameters and Results with their order in the model. ### Tickets: - CVS-141255 --------- Signed-off-by: Tomasz Jankowski <tomasz1.jankowski@intel.com>
1 parent d7454b2 commit fb89d8b

File tree

2 files changed

+50
-8
lines changed

2 files changed

+50
-8
lines changed

src/core/src/xml_util/xml_serialize_util.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ struct Edge {
151151
};
152152

153153
const std::vector<Edge> create_edge_mapping(const std::unordered_map<ov::Node*, int>& layer_ids,
154-
const ov::Model& model) {
154+
const NodeVector& nodes) {
155155
std::vector<Edge> edges;
156-
for (const auto& node : model.get_ordered_ops()) {
156+
for (const auto& node : nodes) {
157157
if (ov::op::util::is_parameter(node)) {
158158
continue;
159159
}
@@ -301,10 +301,10 @@ std::string translate_type_name(const std::string& name) {
301301
return name;
302302
}
303303

304-
const std::unordered_map<ov::Node*, int> create_layer_ids(const ov::Model& model) {
304+
const std::unordered_map<ov::Node*, int> create_layer_ids(const NodeVector& nodes) {
305305
std::unordered_map<ov::Node*, int> layer_ids;
306306
int id = 0;
307-
for (const auto& node : model.get_ordered_ops()) {
307+
for (const auto& node : nodes) {
308308
layer_ids[node.get()] = id++;
309309
}
310310
return layer_ids;
@@ -948,8 +948,6 @@ void XmlSerializer::serialize(pugi::xml_node& net_xml, const ov::Model& model) {
948948
net_xml.append_attribute("version").set_value(static_cast<long long>(m_version));
949949
pugi::xml_node layers = net_xml.append_child("layers");
950950

951-
const std::unordered_map<ov::Node*, int> layer_ids = create_layer_ids(model);
952-
953951
const bool exec_graph = is_exec_graph(model);
954952

955953
auto sorted_ops = model.get_ordered_ops();
@@ -976,6 +974,7 @@ void XmlSerializer::serialize(pugi::xml_node& net_xml, const ov::Model& model) {
976974
}
977975
sorted_ops = std::move(result);
978976
}
977+
const std::unordered_map<ov::Node*, int> layer_ids = create_layer_ids(sorted_ops);
979978

980979
// Mark nodes that are only used by postponed_constant nodes
981980
std::unordered_set<ov::Node*> nodes_to_exclude;
@@ -1151,10 +1150,10 @@ void XmlSerializer::serialize(pugi::xml_node& net_xml, const ov::Model& model) {
11511150
}
11521151
}
11531152
// <edges>
1154-
const std::vector<Edge> edge_mapping = create_edge_mapping(layer_ids, model);
1153+
const std::vector<Edge> edge_mapping = create_edge_mapping(layer_ids, sorted_ops);
11551154
pugi::xml_node edges = net_xml.append_child("edges");
1156-
auto ordered_ops = model.get_ordered_ops();
11571155
for (auto e : edge_mapping) {
1156+
const auto& ordered_ops = sorted_ops;
11581157
// Skip edges that involve excluded nodes
11591158
if (nodes_to_exclude.count(ordered_ops[e.from_layer].get()) ||
11601159
nodes_to_exclude.count(ordered_ops[e.to_layer].get()) ||

src/core/tests/pass/serialization/deterministicity.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55
#include <gtest/gtest.h>
66

77
#include <fstream>
8+
#include <regex>
89

910
#include "common_test_utils/common_utils.hpp"
1011
#include "common_test_utils/file_utils.hpp"
1112
#include "common_test_utils/test_common.hpp"
13+
#include "openvino/op/add.hpp"
1214
#include "openvino/pass/serialize.hpp"
15+
#include "openvino/util/common_util.hpp"
1316
#include "openvino/util/file_util.hpp"
1417
#include "read_ir.hpp"
1518

19+
namespace ov::test {
20+
1621
class DeterministicityCommon {
1722
protected:
1823
std::string m_out_xml_path_1{};
@@ -350,3 +355,41 @@ TEST_P(SerializationDeterministicityInputOutputTest, FromOvModelBybPath) {
350355
INSTANTIATE_TEST_SUITE_P(DeterministicityInputOutput,
351356
SerializationDeterministicityInputOutputTest,
352357
::testing::Values(ov::pass::Serialize::Version::IR_V10, ov::pass::Serialize::Version::IR_V11));
358+
359+
TEST(DeterministicityInputOutput, LayerIdOrder) {
360+
const auto p1 = std::make_shared<op::v0::Parameter>(element::f32, Shape{1});
361+
const auto p2 = std::make_shared<op::v0::Parameter>(element::f32, Shape{1});
362+
const auto p3 = std::make_shared<op::v0::Parameter>(element::f32, Shape{1});
363+
const auto a1 = std::make_shared<op::v1::Add>(p3, p2);
364+
const auto a2 = std::make_shared<op::v1::Add>(p2, p1);
365+
const auto a3 = std::make_shared<op::v1::Add>(p1, p3);
366+
const auto r1 = std::make_shared<op::v0::Result>(a1);
367+
const auto r2 = std::make_shared<op::v0::Result>(a2);
368+
const auto r3 = std::make_shared<op::v0::Result>(a3);
369+
const auto model = std::make_shared<Model>(ResultVector{r3, r1, r2}, ParameterVector{p2, p3, p1}, "param_order");
370+
p2->set_friendly_name("expect id 0");
371+
p3->set_friendly_name("expect id 1");
372+
p1->set_friendly_name("expect id 2");
373+
r3->set_friendly_name("expect id 6");
374+
r1->set_friendly_name("expect id 7");
375+
r2->set_friendly_name("expect id 8");
376+
377+
std::stringstream xml, bin;
378+
ov::pass::Serialize(xml, bin).run_on_model(model);
379+
380+
// order matters
381+
constexpr auto expected_layer_id = util::make_array(R"(<layer id="0" name="expect id 0" type="Parameter")",
382+
R"(<layer id="1" name="expect id 1" type="Parameter")",
383+
R"(<layer id="2" name="expect id 2" type="Parameter")",
384+
R"(<layer id="6" name="expect id 6" type="Result")",
385+
R"(<layer id="7" name="expect id 7" type="Result")",
386+
R"(<layer id="8" name="expect id 8" type="Result")");
387+
const std::string xml_str = xml.str();
388+
std::string::size_type pos = 0;
389+
for (const auto& n : expected_layer_id) {
390+
const auto found = xml_str.find(n, pos);
391+
ASSERT_NE(found, std::string::npos) << "Not found: " << n;
392+
pos = found;
393+
}
394+
}
395+
} // namespace ov::test

0 commit comments

Comments
 (0)