From bc05b1c0709022e901c6fdb05fbe2cbdcd0861ba Mon Sep 17 00:00:00 2001 From: Alexander Lyulkov Date: Wed, 1 May 2024 12:57:03 +0300 Subject: [PATCH 1/6] Fixed OpenVINO gemm layer --- modules/dnn/src/layers/gemm_layer.cpp | 85 ++++++++++++++++----------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/modules/dnn/src/layers/gemm_layer.cpp b/modules/dnn/src/layers/gemm_layer.cpp index bbbb10d2dfb1..f770e4e8bda1 100644 --- a/modules/dnn/src/layers/gemm_layer.cpp +++ b/modules/dnn/src/layers/gemm_layer.cpp @@ -289,48 +289,63 @@ class GemmLayerImpl CV_FINAL : public GemmLayer { virtual Ptr initNgraph(const std::vector >& inputs, const std::vector >& nodes) CV_OVERRIDE { - auto ieInpNode = nodes[0].dynamicCast()->node; - std::shared_ptr matmul; - - if (nodes.size() == 2) - { - auto& inp2 = nodes[1].dynamicCast()->node; - matmul = std::make_shared(ieInpNode, inp2, trans_a, trans_b); - } + auto nodeA = nodes[0].dynamicCast()->node; + std::shared_ptr nodeAB; + + if (const_B) + nodeAB = std::make_shared( + nodeA, + std::make_shared(ov::element::f32, getShape(blobs[0]), blobs[0].data), + trans_a, + trans_b); else + nodeAB = std::make_shared( + nodeA, + nodes[1].dynamicCast()->node, + trans_a, + trans_b); + + if (alpha != 1.0f) { - std::shared_ptr ieWeights = std::make_shared(ov::element::f32, getShape(blobs[0]), blobs[0].data); - - int flatten_axis = ieInpNode.get_shape().size() - ieWeights->get_shape().size(); - if (flatten_axis > 0) { - std::vector shape(1 + flatten_axis, 0); - shape[shape.size() - 1] = -1; - ieInpNode = std::make_shared( - ieInpNode, - std::make_shared(ov::element::i32, ov::Shape{shape.size()}, shape.data()), - true - ); - } - matmul = std::make_shared(ieInpNode, ieWeights, trans_a, trans_b); - } - if (alpha != 1.0f) { - matmul = std::make_shared(matmul, + nodeAB = std::make_shared( + nodeAB, std::make_shared(ov::element::f32, ov::Shape{1}, &alpha) ); } - if (have_bias && const_C) { - Mat bias = blobs.back(); - auto shape = bias.total() == bias.size[0] ? ov::Shape{bias.total()} : getShape(bias); - std::shared_ptr bias_node = std::make_shared(ov::element::f32, shape, bias.data); - if (beta != 1.0f) { - bias_node = std::make_shared(bias_node, - std::make_shared(ov::element::f32, ov::Shape{1}, &beta) - ); - } - matmul = std::make_shared(matmul, bias_node, ov::op::AutoBroadcastType::NUMPY); + if (!have_bias) + return Ptr(new InfEngineNgraphNode(nodeAB)); + + std::shared_ptr nodeGemm; + if (beta != 1.0f) + { + std::shared_ptr nodeC; + if (const_C) + nodeC = std::make_shared( + std::make_shared(ov::element::f32, getShape(blobs.back()), blobs.back().data), + std::make_shared(ov::element::f32, ov::Shape{1}, &beta)); + else + nodeC = std::make_shared( + nodes.back().dynamicCast()->node, + std::make_shared(ov::element::f32, ov::Shape{1}, &beta)); + + nodeGemm = std::make_shared(nodeAB, nodeC, ov::op::AutoBroadcastType::NUMPY); + } + else + { + if (const_C) + nodeGemm = std::make_shared( + nodeAB, + std::make_shared(ov::element::f32, getShape(blobs.back()), blobs.back().data), + ov::op::AutoBroadcastType::NUMPY); + else + nodeGemm = std::make_shared( + nodeAB, + nodes.back().dynamicCast()->node, + ov::op::AutoBroadcastType::NUMPY); } - return Ptr(new InfEngineNgraphNode(matmul)); + + return Ptr(new InfEngineNgraphNode(nodeGemm)); } #endif // HAVE_DNN_NGRAPH From 9a477eb930d5b7bc7ff426599ea96ca19fe2e19e Mon Sep 17 00:00:00 2001 From: Alexander Lyulkov Date: Fri, 3 May 2024 10:09:07 +0300 Subject: [PATCH 2/6] Enabled more gemm conformance tests --- .../test/test_onnx_conformance_layer_parser_denylist.inl.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp b/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp index 68f49e5fa4d1..76ed6c323b88 100644 --- a/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp +++ b/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp @@ -121,8 +121,8 @@ "test_gemm_all_attributes", "test_gemm_alpha", "test_gemm_beta", -"test_gemm_default_matrix_bias", -"test_gemm_default_no_bias", +// "test_gemm_default_matrix_bias", +// "test_gemm_default_no_bias", "test_gemm_default_scalar_bias", "test_gemm_default_single_elem_vector_bias", "test_gemm_default_vector_bias", From f9852fdad2348d9e9d85630153e5daa4ffa4517b Mon Sep 17 00:00:00 2001 From: Alexander Lyulkov Date: Fri, 3 May 2024 13:15:16 +0300 Subject: [PATCH 3/6] empty commit --- modules/dnn/src/layers/gemm_layer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/dnn/src/layers/gemm_layer.cpp b/modules/dnn/src/layers/gemm_layer.cpp index f770e4e8bda1..7224e60e2fe9 100644 --- a/modules/dnn/src/layers/gemm_layer.cpp +++ b/modules/dnn/src/layers/gemm_layer.cpp @@ -315,7 +315,6 @@ class GemmLayerImpl CV_FINAL : public GemmLayer { if (!have_bias) return Ptr(new InfEngineNgraphNode(nodeAB)); - std::shared_ptr nodeGemm; if (beta != 1.0f) { From 7b25f3995e22f385d809d66533dfab7dfde95c8c Mon Sep 17 00:00:00 2001 From: Alexander Lyulkov Date: Fri, 3 May 2024 13:15:29 +0300 Subject: [PATCH 4/6] empty commit --- modules/dnn/src/layers/gemm_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/dnn/src/layers/gemm_layer.cpp b/modules/dnn/src/layers/gemm_layer.cpp index 7224e60e2fe9..f770e4e8bda1 100644 --- a/modules/dnn/src/layers/gemm_layer.cpp +++ b/modules/dnn/src/layers/gemm_layer.cpp @@ -315,6 +315,7 @@ class GemmLayerImpl CV_FINAL : public GemmLayer { if (!have_bias) return Ptr(new InfEngineNgraphNode(nodeAB)); + std::shared_ptr nodeGemm; if (beta != 1.0f) { From c2b8084ec5df903e873f7a0eb6567168f46a32ac Mon Sep 17 00:00:00 2001 From: Alexander Lyulkov Date: Wed, 8 May 2024 16:50:50 +0300 Subject: [PATCH 5/6] Fixed gemm layer --- modules/dnn/src/layers/gemm_layer.cpp | 65 ++++++++++++--------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/modules/dnn/src/layers/gemm_layer.cpp b/modules/dnn/src/layers/gemm_layer.cpp index f770e4e8bda1..ac0914c2c210 100644 --- a/modules/dnn/src/layers/gemm_layer.cpp +++ b/modules/dnn/src/layers/gemm_layer.cpp @@ -289,62 +289,53 @@ class GemmLayerImpl CV_FINAL : public GemmLayer { virtual Ptr initNgraph(const std::vector >& inputs, const std::vector >& nodes) CV_OVERRIDE { - auto nodeA = nodes[0].dynamicCast()->node; - std::shared_ptr nodeAB; - + ov::Output nodeA = nodes[0].dynamicCast()->node; + ov::Output nodeB; if (const_B) - nodeAB = std::make_shared( - nodeA, - std::make_shared(ov::element::f32, getShape(blobs[0]), blobs[0].data), - trans_a, - trans_b); + nodeB = std::make_shared(ov::element::f32, getShape(blobs[0]), blobs[0].data); else - nodeAB = std::make_shared( + nodeB = nodes[1].dynamicCast()->node; + + int flatten_axis = nodeA.get_shape().size() - nodeB.get_shape().size(); + if (flatten_axis > 0) { + std::vector shape(1 + flatten_axis, 0); + shape[shape.size() - 1] = -1; + nodeA = std::make_shared( nodeA, - nodes[1].dynamicCast()->node, - trans_a, - trans_b); + std::make_shared(ov::element::i32, ov::Shape{shape.size()}, shape.data()), + true); + } + std::shared_ptr nodeAB = std::make_shared(nodeA, nodeB, trans_a, trans_b); if (alpha != 1.0f) { nodeAB = std::make_shared( nodeAB, - std::make_shared(ov::element::f32, ov::Shape{1}, &alpha) - ); + std::make_shared(ov::element::f32, ov::Shape{1}, &alpha)); } if (!have_bias) return Ptr(new InfEngineNgraphNode(nodeAB)); - std::shared_ptr nodeGemm; - if (beta != 1.0f) + ov::Output nodeC; + if (const_C) { - std::shared_ptr nodeC; - if (const_C) - nodeC = std::make_shared( - std::make_shared(ov::element::f32, getShape(blobs.back()), blobs.back().data), - std::make_shared(ov::element::f32, ov::Shape{1}, &beta)); - else - nodeC = std::make_shared( - nodes.back().dynamicCast()->node, - std::make_shared(ov::element::f32, ov::Shape{1}, &beta)); - - nodeGemm = std::make_shared(nodeAB, nodeC, ov::op::AutoBroadcastType::NUMPY); + auto shape_C = blobs.back().total() == blobs.back().size[0] ? ov::Shape{blobs.back().total()} : getShape(blobs.back()); + nodeC = std::make_shared(ov::element::f32, shape_C, blobs.back().data); } else { - if (const_C) - nodeGemm = std::make_shared( - nodeAB, - std::make_shared(ov::element::f32, getShape(blobs.back()), blobs.back().data), - ov::op::AutoBroadcastType::NUMPY); - else - nodeGemm = std::make_shared( - nodeAB, - nodes.back().dynamicCast()->node, - ov::op::AutoBroadcastType::NUMPY); + nodeC = nodes.back().dynamicCast()->node; + } + + if (beta != 1.0f) + { + nodeC = std::make_shared( + nodeC, + std::make_shared(ov::element::f32, ov::Shape{1}, &beta)); } + auto nodeGemm = std::make_shared(nodeAB, nodeC, ov::op::AutoBroadcastType::NUMPY); return Ptr(new InfEngineNgraphNode(nodeGemm)); } #endif // HAVE_DNN_NGRAPH From 9ae67a882866ebe939e90f1a76e724cbf8d2fc07 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Mon, 13 May 2024 16:40:22 +0300 Subject: [PATCH 6/6] Code review fixes. --- .../test/test_onnx_conformance_layer_parser_denylist.inl.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp b/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp index 76ed6c323b88..cb008e9670c4 100644 --- a/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp +++ b/modules/dnn/test/test_onnx_conformance_layer_parser_denylist.inl.hpp @@ -121,8 +121,6 @@ "test_gemm_all_attributes", "test_gemm_alpha", "test_gemm_beta", -// "test_gemm_default_matrix_bias", -// "test_gemm_default_no_bias", "test_gemm_default_scalar_bias", "test_gemm_default_single_elem_vector_bias", "test_gemm_default_vector_bias",