diff --git a/src/common/transformations/src/transformations/op_conversions/convert_topk11_downgrade.cpp b/src/common/transformations/src/transformations/op_conversions/convert_topk11_downgrade.cpp index e54b9dacd78..5eff705bbc4 100644 --- a/src/common/transformations/src/transformations/op_conversions/convert_topk11_downgrade.cpp +++ b/src/common/transformations/src/transformations/op_conversions/convert_topk11_downgrade.cpp @@ -18,11 +18,13 @@ ov::pass::ConvertTopK11ToTopK3::ConvertTopK11ToTopK3() { const matcher_pass_callback callback = [=](pattern::Matcher& m) { const auto topk_v11 = std::dynamic_pointer_cast(m.get_match_root()); - if (!topk_v11 || topk_v11->get_stable() || transformation_callback(topk_v11)) { + if (!topk_v11 || transformation_callback(topk_v11)) { return false; } - // downgrade only if the stable sort is NOT required + // downgrade even if stable attribute is True + // this is needed to provide backward-compatibility + // and operation working in the plugins that have not yet added stable mode const auto topk_v3 = std::make_shared(topk_v11->input_value(0), topk_v11->input_value(1), diff --git a/src/common/transformations/tests/op_conversions/convert_topk11_downgrade_test.cpp b/src/common/transformations/tests/op_conversions/convert_topk11_downgrade_test.cpp index 15bde748c5b..65fe2db35a7 100644 --- a/src/common/transformations/tests/op_conversions/convert_topk11_downgrade_test.cpp +++ b/src/common/transformations/tests/op_conversions/convert_topk11_downgrade_test.cpp @@ -47,18 +47,34 @@ TEST_F(TransformationTestsF, ConvertTopK11ToTopK3) { } } -TEST_F(TransformationTestsF, ConvertTopK11ToTopK3_fail) { - const auto input = std::make_shared(ov::element::i32, ov::Shape{2, 3, 4}); - const auto k = std::make_shared(ov::element::i8, ov::Shape{}); - const auto topk = std::make_shared(input, - k, - -2, - ov::op::TopKMode::MAX, - ov::op::TopKSortType::SORT_VALUES, - ov::element::i64, - true); // stable sort on - topk->set_friendly_name("topk11"); +TEST_F(TransformationTestsF, ConvertTopK11ToTopK3StableMode) { + { + const auto input = std::make_shared(ov::element::i32, ov::Shape{2, 3, 4}); + const auto k = std::make_shared(ov::element::i8, ov::Shape{}); + const auto topk = std::make_shared(input, + k, + -2, + ov::op::TopKMode::MAX, + ov::op::TopKSortType::SORT_VALUES, + ov::element::i64, + true); + topk->set_friendly_name("topk11"); - function = std::make_shared(topk->outputs(), ov::ParameterVector{input, k}); - manager.register_pass(); + function = std::make_shared(topk->outputs(), ov::ParameterVector{input, k}); + manager.register_pass(); + } + + { + const auto input = std::make_shared(ov::element::i32, ov::Shape{2, 3, 4}); + const auto k = std::make_shared(ov::element::i8, ov::Shape{}); + const auto topk = std::make_shared(input, + k, + -2, + ov::op::TopKMode::MAX, + ov::op::TopKSortType::SORT_VALUES, + ov::element::i64); + topk->set_friendly_name("topk11"); + + function_ref = std::make_shared(topk->outputs(), ov::ParameterVector{input, k}); + } } diff --git a/src/frontends/tensorflow_common/src/op/top_k.cpp b/src/frontends/tensorflow_common/src/op/top_k.cpp index 42c38975cdc..f1f709c214f 100644 --- a/src/frontends/tensorflow_common/src/op/top_k.cpp +++ b/src/frontends/tensorflow_common/src/op/top_k.cpp @@ -3,10 +3,10 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/opsets/opset11.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::opset11; namespace ov { namespace frontend { @@ -23,10 +23,12 @@ OutputVector translate_top_k_base_op(const NodeContext& node, const ov::Outputoutputs(); } + OutputVector translate_top_k_op(const NodeContext& node) { // retrieve k attribute auto k = node.get_attribute("k"); @@ -39,7 +41,6 @@ OutputVector translate_top_k_v2_op(const NodeContext& node) { auto k_input = node.get_input(1); return translate_top_k_base_op(node, k_input, 1); } - } // namespace op } // namespace tensorflow } // namespace frontend diff --git a/tests/layer_tests/tensorflow_tests/test_tf_TopKV2.py b/tests/layer_tests/tensorflow_tests/test_tf_TopKV2.py index 21528d33000..a061a357b10 100644 --- a/tests/layer_tests/tensorflow_tests/test_tf_TopKV2.py +++ b/tests/layer_tests/tensorflow_tests/test_tf_TopKV2.py @@ -36,13 +36,11 @@ class TestTopKV2(CommonTFLayerTest): dict(input_shape=[10], input_type=tf.float32, k=5, sorted=True, is_first_output=True, is_second_output=False), dict(input_shape=[2, 3, 10], input_type=tf.int32, k=10, sorted=True, is_first_output=True, is_second_output=False), - # Currently, OpenVINO TopK supports only TensorFlow TopK with sorted=True and the first output - # For other cases, we need to introduce new version of TopK in OpenVINO opset due to multiple misalignments - # described in 88024 + # Expect stable mode support by the CPU plugin. See 101503 pytest.param(dict(input_shape=[4, 12], input_type=tf.float32, k=10, sorted=True, is_first_output=True, - is_second_output=True), marks=pytest.mark.xfail(reason="88024")), + is_second_output=True), marks=pytest.mark.xfail(reason="101503")), pytest.param(dict(input_shape=[5, 10], input_type=tf.int32, k=8, sorted=False, is_first_output=True, - is_second_output=True), marks=pytest.mark.xfail(reason="88024")), + is_second_output=True), marks=pytest.mark.xfail(reason="101503")), ] @pytest.mark.parametrize("params", test_basic)