From 3e97d12fe2c443721b763ae837e668d53b178152 Mon Sep 17 00:00:00 2001 From: Tingqian Li Date: Tue, 5 Jul 2022 15:50:35 +0800 Subject: [PATCH] [Transformation] transform ConvertLike into Convert when applicable (#7543) * [Transformation] transform ConvertLike into Convert when applicable Signed-off-by: Li, Tingqian * Remove xfail markup for onnx castlike cpu tests Signed-off-by: Li, Tingqian * remove un-used xfail Signed-off-by: Li, Tingqian * Enable ConvertLike cpu functional test Signed-off-by: Li, Tingqian * remove unnecessary headers * move to common transformation Signed-off-by: Li, Tingqian * remove test * fix pytest CI issue * minor fix after rebase * fix clang format check * fix failed tests --- src/bindings/python/tests/__init__.py | 1 - .../python/tests/test_onnx/test_backend.py | 12 -- .../python/tests_compatibility/__init__.py | 1 - .../test_onnx/test_backend.py | 12 -- .../op_conversions/convert_convertlike.hpp | 22 ++++ .../common_optimizations.cpp | 2 + .../op_conversions/convert_convertlike.cpp | 45 ++++++++ .../ngraph_reader/convert_like_tests.cpp | 109 ------------------ .../convert_convertlike.cpp | 104 +++++++++++++++++ 9 files changed, 173 insertions(+), 135 deletions(-) create mode 100644 src/common/transformations/include/transformations/op_conversions/convert_convertlike.hpp create mode 100644 src/common/transformations/src/transformations/op_conversions/convert_convertlike.cpp delete mode 100644 src/tests/functional/inference_engine/ngraph_reader/convert_like_tests.cpp create mode 100644 src/tests/functional/inference_engine/transformations/common_optimizations/convert_convertlike.cpp diff --git a/src/bindings/python/tests/__init__.py b/src/bindings/python/tests/__init__.py index a300186a551..65d39f8cbe9 100644 --- a/src/bindings/python/tests/__init__.py +++ b/src/bindings/python/tests/__init__.py @@ -120,7 +120,6 @@ xfail_issue_63043 = xfail_test(reason="Recurrent node expects constants as W, R, xfail_issue_63044 = xfail_test(reason="ONNX opset 14 operation: Trilu") skip_rng_tests = pytest.mark.skip(reason="Tests use random number generator with no seed.") -xfail_issue_63136 = xfail_test(reason="Unsupported operation: CastLike") xfail_issue_63137 = xfail_test(reason="Unsupported operations: OptionalHasElement, OptionalGetElement") xfail_issue_63138 = xfail_test(reason="Missing ONNX Shape-15 support") xfail_issue_68212 = xfail_test(reason="Unsupported reading model with bytes streams") diff --git a/src/bindings/python/tests/test_onnx/test_backend.py b/src/bindings/python/tests/test_onnx/test_backend.py index a7234f09a8f..99fa071c51c 100644 --- a/src/bindings/python/tests/test_onnx/test_backend.py +++ b/src/bindings/python/tests/test_onnx/test_backend.py @@ -41,7 +41,6 @@ from tests import ( xfail_issue_63039, xfail_issue_63043, xfail_issue_63044, - xfail_issue_63136, xfail_issue_63137, xfail_issue_63138, xfail_issue_69444, @@ -327,17 +326,6 @@ tests_expected_to_fail = [ "OnnxBackendNodeModelTest.test_bernoulli_seed_cpu", "OnnxBackendNodeModelTest.test_bernoulli_seed_expanded_cpu", ), - ( - xfail_issue_63136, - "OnnxBackendNodeModelTest.test_castlike_BFLOAT16_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_DOUBLE_to_FLOAT16_cpu", - "OnnxBackendNodeModelTest.test_castlike_DOUBLE_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT16_to_DOUBLE_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT16_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_BFLOAT16_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_DOUBLE_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT16_cpu", - ), ( xfail_issue_63137, "OnnxBackendNodeModelTest.test_optional_get_element_cpu", diff --git a/src/bindings/python/tests_compatibility/__init__.py b/src/bindings/python/tests_compatibility/__init__.py index 03abebd5af4..1c7553c678f 100644 --- a/src/bindings/python/tests_compatibility/__init__.py +++ b/src/bindings/python/tests_compatibility/__init__.py @@ -130,7 +130,6 @@ xfail_issue_63043 = xfail_test(reason="Recurrent node expects constants as W, R, xfail_issue_63044 = xfail_test(reason="ONNX opset 14 operation: Trilu") skip_rng_tests = pytest.mark.skip(reason="Tests use random number generator with no seed.") -xfail_issue_63136 = xfail_test(reason="Unsupported operation: CastLike") xfail_issue_63137 = xfail_test(reason="Unsupported operations: OptionalHasElement, OptionalGetElement") xfail_issue_63138 = xfail_test(reason="Missing ONNX Shape-15 support") diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_backend.py b/src/bindings/python/tests_compatibility/test_onnx/test_backend.py index e6eb50a54eb..faa88574cf5 100644 --- a/src/bindings/python/tests_compatibility/test_onnx/test_backend.py +++ b/src/bindings/python/tests_compatibility/test_onnx/test_backend.py @@ -40,7 +40,6 @@ from tests_compatibility import ( xfail_issue_63039, xfail_issue_63043, xfail_issue_63044, - xfail_issue_63136, xfail_issue_63137, xfail_issue_63138, xfail_issue_69444, @@ -326,17 +325,6 @@ tests_expected_to_fail = [ "OnnxBackendNodeModelTest.test_bernoulli_seed_cpu", "OnnxBackendNodeModelTest.test_bernoulli_seed_expanded_cpu", ), - ( - xfail_issue_63136, - "OnnxBackendNodeModelTest.test_castlike_BFLOAT16_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_DOUBLE_to_FLOAT16_cpu", - "OnnxBackendNodeModelTest.test_castlike_DOUBLE_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT16_to_DOUBLE_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT16_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_BFLOAT16_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_DOUBLE_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT16_cpu", - ), ( xfail_issue_63137, "OnnxBackendNodeModelTest.test_optional_get_element_cpu", diff --git a/src/common/transformations/include/transformations/op_conversions/convert_convertlike.hpp b/src/common/transformations/include/transformations/op_conversions/convert_convertlike.hpp new file mode 100644 index 00000000000..61c7a783fc7 --- /dev/null +++ b/src/common/transformations/include/transformations/op_conversions/convert_convertlike.hpp @@ -0,0 +1,22 @@ +// Copyright (C) 2018-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +namespace ngraph { +namespace pass { + +class TRANSFORMATIONS_API ConvertConvertLike; + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::ConvertConvertLike : public ngraph::pass::MatcherPass { +public: + NGRAPH_RTTI_DECLARATION; + ConvertConvertLike(); +}; 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 8f5e4b87de5..4c7a61ef0eb 100644 --- a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -69,6 +69,7 @@ #include "transformations/op_conversions/batch_norm_decomposition.hpp" #include "transformations/op_conversions/bidirectional_sequences_decomposition.hpp" #include "transformations/op_conversions/convert_broadcast_to_tiles.hpp" +#include "transformations/op_conversions/convert_convertlike.hpp" #include "transformations/op_conversions/convert_deformable_conv_v8_to_v1.hpp" #include "transformations/op_conversions/convert_depth_to_space.hpp" #include "transformations/op_conversions/convert_divide.hpp" @@ -154,6 +155,7 @@ bool ngraph::pass::CommonOptimizations::run_on_model(const std::shared_ptradd_matcher(); decomp->add_matcher(); decomp->add_matcher(); + decomp->add_matcher(); decomp->add_matcher(); decomp->add_matcher(); decomp->add_matcher(); diff --git a/src/common/transformations/src/transformations/op_conversions/convert_convertlike.cpp b/src/common/transformations/src/transformations/op_conversions/convert_convertlike.cpp new file mode 100644 index 00000000000..296024eb828 --- /dev/null +++ b/src/common/transformations/src/transformations/op_conversions/convert_convertlike.cpp @@ -0,0 +1,45 @@ +// Copyright (C) 2018-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "transformations/op_conversions/convert_convertlike.hpp" + +#include +#include +#include +#include +#include + +#include "itt.hpp" + +NGRAPH_RTTI_DEFINITION(ngraph::pass::ConvertConvertLike, "ConvertConvertLike", 0); + +using namespace ngraph; + +ngraph::pass::ConvertConvertLike::ConvertConvertLike() { + MATCHER_SCOPE(ConvertConvertLike); + + auto convertlike = pattern::wrap_type(); + + matcher_pass_callback callback = [](pattern::Matcher& m) { + auto cvtlike = std::dynamic_pointer_cast(m.get_match_root()); + if (!cvtlike) { + return false; + } + + auto like = cvtlike->input_value(1); + const element::Type& dest_type = like.get_element_type(); + if (dest_type == element::dynamic || dest_type == element::undefined) + return false; + + auto cvt = std::make_shared(cvtlike->input_value(0), dest_type); + + cvt->set_friendly_name(cvtlike->get_friendly_name()); + copy_runtime_info(cvtlike, cvt); + replace_node(cvtlike, cvt); + return true; + }; + + auto m = std::make_shared(convertlike, matcher_name); + this->register_matcher(m, callback); +} diff --git a/src/tests/functional/inference_engine/ngraph_reader/convert_like_tests.cpp b/src/tests/functional/inference_engine/ngraph_reader/convert_like_tests.cpp deleted file mode 100644 index d807882e556..00000000000 --- a/src/tests/functional/inference_engine/ngraph_reader/convert_like_tests.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (C) 2018-2022 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -#include -#include "ngraph_reader_tests.hpp" - -TEST_F(NGraphReaderTests, ReadConvertLikeNetwork) { - std::string model = R"V0G0N( - - - - - - - 256 - 56 - - - - - - - - 256 - 56 - - - - - - - 256 - 56 - - - 256 - 56 - - - - - 256 - 56 - - - - - - - 256 - 56 - - - - - - - - - - -)V0G0N"; - std::string modelV7 = R"V0G0N( - - - - - - 256 - 56 - - - - - - - 256 - 56 - - - - - - - 256 - 56 - - - 256 - 56 - - - - - 256 - 56 - - - - - - - - - -)V0G0N"; - compareIRs(model, modelV7); -} diff --git a/src/tests/functional/inference_engine/transformations/common_optimizations/convert_convertlike.cpp b/src/tests/functional/inference_engine/transformations/common_optimizations/convert_convertlike.cpp new file mode 100644 index 00000000000..a8e40308cfd --- /dev/null +++ b/src/tests/functional/inference_engine/transformations/common_optimizations/convert_convertlike.cpp @@ -0,0 +1,104 @@ +// Copyright (C) 2018-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "common_test_utils/ngraph_test_utils.hpp" + +using namespace testing; + +TEST(TransformationTests, ConvertConvertLike) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto like = ngraph::opset8::Constant::create(ngraph::element::i32, ngraph::Shape{1}, {1}); + auto cvtlike = std::make_shared(data, like); + + f = std::make_shared(ngraph::NodeVector{cvtlike}, ngraph::ParameterVector{data}); + + ngraph::pass::Manager m; + m.register_pass(); + m.register_pass(); + m.run_passes(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto cvt = std::make_shared(data, ngraph::element::i32); + + f_ref = std::make_shared(ngraph::NodeVector{cvt}, ngraph::ParameterVector{data}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, ConvertConvertLike2) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto data2 = std::make_shared(ngraph::element::i8, ngraph::Shape{1}); + auto constant = ngraph::opset8::Constant::create(ngraph::element::i8, ngraph::Shape{}, {1}); + auto like = std::make_shared(data2, constant); + auto cvtlike = std::make_shared(data, like); + + f = std::make_shared(ngraph::NodeVector{cvtlike}, ngraph::ParameterVector{data, data2}); + + ngraph::pass::Manager m; + m.register_pass(); + m.register_pass(); + m.run_passes(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto cvt = std::make_shared(data, ngraph::element::i8); + + f_ref = std::make_shared(ngraph::NodeVector{cvt}, ngraph::ParameterVector{data}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, ConvertConvertLike_Negative) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto like = std::make_shared(ngraph::element::dynamic, ngraph::Shape{1}); + auto cvtlike = std::make_shared(data, like); + + f = std::make_shared(ngraph::NodeVector{cvtlike}, ngraph::ParameterVector{data, like}); + + ngraph::pass::Manager m; + m.register_pass(); + m.register_pass(); + m.run_passes(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto like = std::make_shared(ngraph::element::dynamic, ngraph::Shape{1}); + auto cvtlike = std::make_shared(data, like); + + f_ref = std::make_shared(ngraph::NodeVector{cvtlike}, ngraph::ParameterVector{data, like}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} \ No newline at end of file