From 1c1600b88a4c6fa07d85b14016f0621829ba488f Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Tue, 26 Aug 2025 03:59:11 +0300 Subject: [PATCH 01/11] Fix memory issue while compiling keras models --- .../common_optimizations/common_optimizations.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp index cb2c9b7dffa2d4..42dd1cf9769f65 100644 --- a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -188,6 +188,7 @@ bool ov::pass::CommonOptimizations::run_on_model(const std::shared_ptrset_name("ov::pass::CommonDecompositions"); + REGISTER_PASS(manager, SimplifyShapeOfSubGraph, true) // CF is required after all decompositions REGISTER_PASS(manager, ConstantFolding) From 47a76cea9050d21a6445db8250b9376382e9a4f6 Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Tue, 26 Aug 2025 14:33:36 +0300 Subject: [PATCH 02/11] update to the effective pass --- .../common_optimizations/common_optimizations.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp index 42dd1cf9769f65..d3f403a3620f0d 100644 --- a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -47,6 +47,7 @@ #include "transformations/common_optimizations/reduce_merge.hpp" #include "transformations/common_optimizations/relu_fake_quantize_fusion.hpp" #include "transformations/common_optimizations/remove_filtering_boxes_by_size.hpp" +#include "transformations/common_optimizations/shared_ops_optimization.hpp" #include "transformations/common_optimizations/simplify_shape_of_sub_graph.hpp" #include "transformations/common_optimizations/skip_gather_before_transpose_and_reshape.hpp" #include "transformations/common_optimizations/softmax_fusion.hpp" @@ -188,7 +189,7 @@ bool ov::pass::CommonOptimizations::run_on_model(const std::shared_ptrset_name("ov::pass::CommonDecompositions"); - REGISTER_PASS(manager, SimplifyShapeOfSubGraph, true) + REGISTER_PASS(manager, NopElimination, true) // CF is required after all decompositions REGISTER_PASS(manager, ConstantFolding) From 36228a46813a3f46bac4141f91f993d3bf89a0c0 Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Tue, 26 Aug 2025 18:08:02 +0300 Subject: [PATCH 03/11] test added --- .../common_optimizations/nop_elimination.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/common/transformations/tests/common_optimizations/nop_elimination.cpp b/src/common/transformations/tests/common_optimizations/nop_elimination.cpp index 9d97126b322874..b0c8aa009d21d9 100644 --- a/src/common/transformations/tests/common_optimizations/nop_elimination.cpp +++ b/src/common/transformations/tests/common_optimizations/nop_elimination.cpp @@ -19,6 +19,7 @@ #include "openvino/op/ops.hpp" #include "openvino/pass/constant_folding.hpp" #include "openvino/pass/manager.hpp" +#include "transformations/common_optimizations/common_optimizations.hpp" #include "transformations/init_node_info.hpp" #include "transformations/rt_info/fused_names_attribute.hpp" #include "transformations/utils/utils.hpp" @@ -26,6 +27,24 @@ using namespace ov; using namespace std; +TEST(nop_elimination, shared_const_einsum_after_common_optimizations) { + auto const_data = op::v0::Constant::create(element::f32, Shape{2, 2}, {1, 2, 3, 4}); + + auto einsum1 = std::make_shared(OutputVector{const_data}, "ii->i"); + auto einsum2 = std::make_shared(OutputVector{const_data}, "ii->i"); + + auto model = std::make_shared(OutputVector{einsum1, einsum2}, ov::ParameterVector{}); + + ov::pass::Manager pass_manager; + pass_manager.register_pass(); + pass_manager.run_passes(model); + + auto einsum1_const = einsum1->input_value(0).get_node_shared_ptr(); + auto einsum2_const = einsum2->input_value(0).get_node_shared_ptr(); + + ASSERT_EQ(einsum1_const, einsum2_const); +} + TEST(nop_elimination, eliminate_convert) { std::shared_ptr f; { From 8d755478915a67d3154351e81eeb1e0c149e9356 Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Wed, 27 Aug 2025 16:58:10 +0300 Subject: [PATCH 04/11] modify RoPETestChatGLMSlice test --- .../plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp b/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp index e9677efd80fa21..5ea9343cdc8fce 100644 --- a/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp +++ b/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp @@ -77,7 +77,7 @@ TEST_P(RoPETestChatGLMSlice, CompareWithRefs) { SKIP_IF_CURRENT_TEST_IS_DISABLED(); run(); auto function = compiledModel.get_runtime_model(); - CheckNumberOfNodesWithType(function, {"RoPE"}, 1); + CheckNumberOfNodesWithType(function, {"RoPE"}, 0); }; TEST_P(RoPETestQwen7bSlice, CompareWithRefs) { From 1ca33b37c95e56fbb7e3f09e9bea967123e013f3 Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Thu, 28 Aug 2025 00:08:21 +0300 Subject: [PATCH 05/11] modify rope glmshapes --- .../fuse_rotary_positional_embeddings.cpp | 6 ++---- .../plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp index a311703cf57167..befed71ca6f006 100644 --- a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp @@ -79,11 +79,9 @@ bool ov::pass::RoPEFusion::run_on_model(const std::shared_ptr& model) } static std::shared_ptr gen_chatglm_const() { - using namespace pattern; + using namespace ov::pass::pattern; - auto pred = value_matches("-1, head_cnt, 1, ndims/2, 1") || value_matches("1, -1, head_cnt, ndims/2, 1") || - value_matches("0, 0, 0, ndims/2, 1"); - return wrap_type(pred); + return wrap_type(); } ov::pass::RoPEFusionFlux::RoPEFusionFlux() { diff --git a/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp b/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp index 5ea9343cdc8fce..e9677efd80fa21 100644 --- a/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp +++ b/src/tests/functional/plugin/shared/include/subgraph_tests/rotary_pos_emb.hpp @@ -77,7 +77,7 @@ TEST_P(RoPETestChatGLMSlice, CompareWithRefs) { SKIP_IF_CURRENT_TEST_IS_DISABLED(); run(); auto function = compiledModel.get_runtime_model(); - CheckNumberOfNodesWithType(function, {"RoPE"}, 0); + CheckNumberOfNodesWithType(function, {"RoPE"}, 1); }; TEST_P(RoPETestQwen7bSlice, CompareWithRefs) { From f59fc21575e115392505288112acc114bc1a4a3d Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Thu, 28 Aug 2025 03:32:29 +0300 Subject: [PATCH 06/11] update rope --- .../fuse_rotary_positional_embeddings.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp index befed71ca6f006..298115b4c65160 100644 --- a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp @@ -81,7 +81,9 @@ bool ov::pass::RoPEFusion::run_on_model(const std::shared_ptr& model) static std::shared_ptr gen_chatglm_const() { using namespace ov::pass::pattern; - return wrap_type(); + auto pred = value_matches("-1, batch, head_cnt, ndims/2, 1") || value_matches("0, 0, 0, ndims/2, 1") || + value_matches("1, -1, head_cnt, ndims/2, 1"); + return wrap_type(pred); } ov::pass::RoPEFusionFlux::RoPEFusionFlux() { @@ -694,16 +696,16 @@ ov::pass::RoPEFusionChatGLM::RoPEFusionChatGLM(int split_output_id, const bool s std::shared_ptr reshape0 = nullptr; if (support_2d_rope) { auto const_target_shape0 = - pattern::wrap_type(pattern::value_matches("0, head_cnt, 0, ndims/2, 2")); + pattern::wrap_type(pattern::value_matches("0, head_cnt_pos3, 0, ndims/2, 2")); reshape0 = pattern::wrap_type({slice0 | var_split0->output(0), const_target_shape0}, {{"special_zero", true}}); } else { auto concat0 = pattern::wrap_type({seq_length, {-1}, {"head_cnt"}, {"ndims/2"}, {2}}, {{"axis", 0}}); auto const_target_shape1 = - pattern::wrap_type(pattern::value_matches("0, 0, head_cnt, ndims/2, 2")); + pattern::wrap_type(pattern::value_matches("0, 0, head_cnt_pos4, ndims/2, 2")); auto const_target_shape2 = - pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt, ndims/2, 2")); + pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt_pos5, ndims/2, 2")); reshape0 = pattern::wrap_type( {slice0 | var_split0->output(0), concat0 | const_target_shape1 | const_target_shape2}); } @@ -770,14 +772,15 @@ ov::pass::RoPEFusionChatGLM::RoPEFusionChatGLM(int split_output_id, const bool s if (support_2d_rope) { // [batch, head_cnt, length, half_rotary_dims, 2] const_target_shape6 = - pattern::wrap_type(pattern::value_matches("batch, head_cnt, seq_len, ndims") || - pattern::value_matches("0, head_cnt, 0, ndims")); + pattern::wrap_type(pattern::value_matches("batch, head_cnt_pos6, seq_len, ndims") || + pattern::value_matches("0, head_cnt_pos7, 0, ndims")); reshape2 = pattern::wrap_type({concat2, concat3 | const_target_shape6}, {{"special_zero", true}}); } else { // [length, batch, head_cnt, half_rotary_dims, 2] - auto const_target_shape7 = pattern::wrap_type(pattern::value_matches("0, 0, head_cnt, ndims")); + auto const_target_shape7 = + pattern::wrap_type(pattern::value_matches("0, 0, head_cnt_pos9, ndims")); const_target_shape6 = - pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt, ndims")); + pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt_pos8, ndims")); reshape2 = pattern::wrap_type({concat2, concat3 | const_target_shape6 | const_target_shape7}, {{"special_zero", true}}); } From 93f64b705d68ab253f75f6bdfbe694a16610134e Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Thu, 28 Aug 2025 03:43:20 +0300 Subject: [PATCH 07/11] update rope --- .../fuse_rotary_positional_embeddings.cpp | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp index 298115b4c65160..0c3e656afe4385 100644 --- a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp @@ -79,10 +79,10 @@ bool ov::pass::RoPEFusion::run_on_model(const std::shared_ptr& model) } static std::shared_ptr gen_chatglm_const() { - using namespace ov::pass::pattern; + using namespace pattern; - auto pred = value_matches("-1, batch, head_cnt, ndims/2, 1") || value_matches("0, 0, 0, ndims/2, 1") || - value_matches("1, -1, head_cnt, ndims/2, 1"); + auto pred = value_matches("-1, batch, head_cnt, ndims/2, 1") || value_matches("1, -1, head_cnt, ndims/2, 1") || + value_matches("0, 0, 0, ndims/2, 1"); return wrap_type(pred); } @@ -696,16 +696,16 @@ ov::pass::RoPEFusionChatGLM::RoPEFusionChatGLM(int split_output_id, const bool s std::shared_ptr reshape0 = nullptr; if (support_2d_rope) { auto const_target_shape0 = - pattern::wrap_type(pattern::value_matches("0, head_cnt_pos3, 0, ndims/2, 2")); + pattern::wrap_type(pattern::value_matches("0, head_cnt, 0, ndims/2, 2")); reshape0 = pattern::wrap_type({slice0 | var_split0->output(0), const_target_shape0}, {{"special_zero", true}}); } else { auto concat0 = pattern::wrap_type({seq_length, {-1}, {"head_cnt"}, {"ndims/2"}, {2}}, {{"axis", 0}}); auto const_target_shape1 = - pattern::wrap_type(pattern::value_matches("0, 0, head_cnt_pos4, ndims/2, 2")); + pattern::wrap_type(pattern::value_matches("0, 0, head_cnt, ndims/2, 2")); auto const_target_shape2 = - pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt_pos5, ndims/2, 2")); + pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt, ndims/2, 2")); reshape0 = pattern::wrap_type( {slice0 | var_split0->output(0), concat0 | const_target_shape1 | const_target_shape2}); } @@ -772,15 +772,14 @@ ov::pass::RoPEFusionChatGLM::RoPEFusionChatGLM(int split_output_id, const bool s if (support_2d_rope) { // [batch, head_cnt, length, half_rotary_dims, 2] const_target_shape6 = - pattern::wrap_type(pattern::value_matches("batch, head_cnt_pos6, seq_len, ndims") || - pattern::value_matches("0, head_cnt_pos7, 0, ndims")); + pattern::wrap_type(pattern::value_matches("batch, head_cnt, seq_len, ndims") || + pattern::value_matches("0, head_cnt, 0, ndims")); reshape2 = pattern::wrap_type({concat2, concat3 | const_target_shape6}, {{"special_zero", true}}); } else { // [length, batch, head_cnt, half_rotary_dims, 2] - auto const_target_shape7 = - pattern::wrap_type(pattern::value_matches("0, 0, head_cnt_pos9, ndims")); + auto const_target_shape7 = pattern::wrap_type(pattern::value_matches("0, 0, head_cnt, ndims")); const_target_shape6 = - pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt_pos8, ndims")); + pattern::wrap_type(pattern::value_matches("seq_len, batch, head_cnt, ndims")); reshape2 = pattern::wrap_type({concat2, concat3 | const_target_shape6 | const_target_shape7}, {{"special_zero", true}}); } From 0838fd2670ede8a943133f6f6cd751e6bfc7d6d0 Mon Sep 17 00:00:00 2001 From: Mohamed-Ashraf273 Date: Thu, 28 Aug 2025 10:21:17 +0300 Subject: [PATCH 08/11] remove unused include --- .../common_optimizations/common_optimizations.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp index d3f403a3620f0d..45ff591fe1a722 100644 --- a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -47,7 +47,6 @@ #include "transformations/common_optimizations/reduce_merge.hpp" #include "transformations/common_optimizations/relu_fake_quantize_fusion.hpp" #include "transformations/common_optimizations/remove_filtering_boxes_by_size.hpp" -#include "transformations/common_optimizations/shared_ops_optimization.hpp" #include "transformations/common_optimizations/simplify_shape_of_sub_graph.hpp" #include "transformations/common_optimizations/skip_gather_before_transpose_and_reshape.hpp" #include "transformations/common_optimizations/softmax_fusion.hpp" From 30971ef8a03c08369e5689336c459d77b3f627db Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf <117025882+Mohamed-Ashraf273@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:07:49 +0300 Subject: [PATCH 09/11] Update fuse_rotary_positional_embeddings.cpp Co-authored-by: Andrii Staikov --- .../fuse_rotary_positional_embeddings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp index 504079675827fc..2ef71be57e9a1b 100644 --- a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp @@ -79,8 +79,8 @@ bool ov::pass::RoPEFusion::run_on_model(const std::shared_ptr& model) static std::shared_ptr gen_chatglm_const() { using namespace pattern; - auto pred = value_matches("-1, batch, head_cnt, ndims/2, 1") || value_matches("1, -1, head_cnt, ndims/2, 1") || - value_matches("0, 0, 0, ndims/2, 1"); + auto pred = value_matches("-1, head_cnt, 1,, ndims/2, 1") || value_matches("1, -1, head_cnt, ndims/2, 1") || + value_matches("0, 0, 0, ndims/2, 1") || value_matches("-1, batch, head_cnt, ndims/2, 1"); return wrap_type(pred); } From 12ad1f772efe2502a77aef6cfe974e889809eee6 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf <117025882+Mohamed-Ashraf273@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:26:19 +0300 Subject: [PATCH 10/11] Fix value_matches syntax in gen_chatglm_const function --- .../common_optimizations/fuse_rotary_positional_embeddings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp index 2ef71be57e9a1b..19de411c4a3d88 100644 --- a/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/fuse_rotary_positional_embeddings.cpp @@ -79,7 +79,7 @@ bool ov::pass::RoPEFusion::run_on_model(const std::shared_ptr& model) static std::shared_ptr gen_chatglm_const() { using namespace pattern; - auto pred = value_matches("-1, head_cnt, 1,, ndims/2, 1") || value_matches("1, -1, head_cnt, ndims/2, 1") || + auto pred = value_matches("-1, head_cnt, 1, ndims/2, 1") || value_matches("1, -1, head_cnt, ndims/2, 1") || value_matches("0, 0, 0, ndims/2, 1") || value_matches("-1, batch, head_cnt, ndims/2, 1"); return wrap_type(pred); } From 2faf98ad36f3f8e7439d60a512c78f58dec0d2af Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf <117025882+Mohamed-Ashraf273@users.noreply.github.com> Date: Sat, 30 Aug 2025 00:56:17 +0300 Subject: [PATCH 11/11] Add DeReshapeMatMul and DeReshapeFullyConnected passes --- .../common_optimizations/common_optimizations.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp index 45ff591fe1a722..e1e55967000657 100644 --- a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -120,6 +120,7 @@ #include "transformations/op_conversions/softmax_decomposition.hpp" #include "transformations/op_conversions/softsign_decomposition.hpp" #include "transformations/op_conversions/unique_decomposition.hpp" +#include "transformations/symbolic_transformations/dereshape_matmul.hpp" #include "transformations/symbolic_transformations/symbolic_optimizations.hpp" bool ov::pass::CommonOptimizations::run_on_model(const std::shared_ptr& f) { @@ -189,6 +190,8 @@ bool ov::pass::CommonOptimizations::run_on_model(const std::shared_ptrset_name("ov::pass::CommonDecompositions"); REGISTER_PASS(manager, NopElimination, true) + REGISTER_PASS(manager, DeReshapeMatMul) + REGISTER_PASS(manager, DeReshapeFullyConnected) // CF is required after all decompositions REGISTER_PASS(manager, ConstantFolding)