From 1b89ecdbae4ad9189e24f4a8146e29614f521e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Do=C5=82bniak?= Date: Fri, 24 Mar 2023 03:06:22 +0100 Subject: [PATCH] Interpolate v11 usage in ONNX FE (#16463) --- .../onnx/frontend/src/default_opset.hpp | 4 +- .../onnx/frontend/src/op/hardmax.cpp | 22 +++---- src/frontends/onnx/frontend/src/op/resize.cpp | 65 ++++++------------- src/frontends/onnx/frontend/src/op/topk.cpp | 33 +++++----- .../onnx/frontend/src/op/upsample.cpp | 50 ++++---------- .../src/utils/arg_min_max_factory.cpp | 20 +++--- .../onnx/tests/runtime/ie/unit_test.manifest | 1 + .../runtime/interpreter/unit_test.manifest | 3 - 8 files changed, 73 insertions(+), 125 deletions(-) diff --git a/src/frontends/onnx/frontend/src/default_opset.hpp b/src/frontends/onnx/frontend/src/default_opset.hpp index 2044f25dac1..f286ef62fd7 100644 --- a/src/frontends/onnx/frontend/src/default_opset.hpp +++ b/src/frontends/onnx/frontend/src/default_opset.hpp @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 // -#include "ngraph/opsets/opset10.hpp" +#include "ngraph/opsets/opset11.hpp" namespace ngraph { namespace onnx_import { -namespace default_opset = ngraph::opset10; +namespace default_opset = ngraph::opset11; } } // namespace ngraph diff --git a/src/frontends/onnx/frontend/src/op/hardmax.cpp b/src/frontends/onnx/frontend/src/op/hardmax.cpp index 5e726e2458b..eb9b421cd71 100644 --- a/src/frontends/onnx/frontend/src/op/hardmax.cpp +++ b/src/frontends/onnx/frontend/src/op/hardmax.cpp @@ -4,8 +4,6 @@ #include "op/hardmax.hpp" -#include - #include "exceptions.hpp" #include "ngraph/builder/reshape.hpp" #include "ngraph/op/one_hot.hpp" @@ -39,11 +37,11 @@ OutputVector hardmax(const Node& node) { const auto indices_axis = 1; const auto topk = - std::make_shared(coerced_tensor, - default_opset::Constant::create(ngraph::element::i64, Shape{}, {1}), - indices_axis, - ov::opset11::TopK::Mode::MAX, - ov::opset11::TopK::SortType::NONE); + std::make_shared(coerced_tensor, + default_opset::Constant::create(ngraph::element::i64, Shape{}, {1}), + indices_axis, + default_opset::TopK::Mode::MAX, + default_opset::TopK::SortType::NONE); const auto on_value = default_opset::Constant::create(ngraph::element::i64, Shape{}, {1}); const auto off_value = default_opset::Constant::create(ngraph::element::i64, Shape{}, {0}); @@ -73,11 +71,11 @@ OutputVector hardmax(const Node& node) { row_size = ngraph::onnx_import::reshape::interpret_as_scalar(row_size); const auto topk = - std::make_shared(input, - default_opset::Constant::create(ngraph::element::i64, Shape{}, {1}), - axis, - ov::opset11::TopK::Mode::MAX, - ov::opset11::TopK::SortType::NONE); + std::make_shared(input, + default_opset::Constant::create(ngraph::element::i64, Shape{}, {1}), + axis, + default_opset::TopK::Mode::MAX, + default_opset::TopK::SortType::NONE); const auto on_value = default_opset::Constant::create(ngraph::element::i64, Shape{}, {1}); const auto off_value = default_opset::Constant::create(ngraph::element::i64, Shape{}, {0}); diff --git a/src/frontends/onnx/frontend/src/op/resize.cpp b/src/frontends/onnx/frontend/src/op/resize.cpp index f81f8a8eece..cff54093cec 100644 --- a/src/frontends/onnx/frontend/src/op/resize.cpp +++ b/src/frontends/onnx/frontend/src/op/resize.cpp @@ -24,12 +24,12 @@ static const std::unordered_set supported_transforms = {"half_pixel "asymmetric", "tf_half_pixel_for_nn"}; -using InterpolateMode = ngraph::op::v4::Interpolate::InterpolateMode; +using InterpolateMode = default_opset::Interpolate::InterpolateMode; static const std::map interp_mode_map = {{"nearest", static_cast(InterpolateMode::NEAREST)}, {"linear", static_cast(InterpolateMode::LINEAR_ONNX)}, {"cubic", static_cast(InterpolateMode::CUBIC)}}; -using Transform_mode = ngraph::op::v4::Interpolate::CoordinateTransformMode; +using Transform_mode = default_opset::Interpolate::CoordinateTransformMode; static const std::map transform_mode_map = { {"half_pixel", static_cast(Transform_mode::HALF_PIXEL)}, {"pytorch_half_pixel", static_cast(Transform_mode::PYTORCH_HALF_PIXEL)}, @@ -37,7 +37,7 @@ static const std::map transform_mode_map = { {"asymmetric", static_cast(Transform_mode::ASYMMETRIC)}, {"tf_half_pixel_for_nn", static_cast(Transform_mode::TF_HALF_PIXEL_FOR_NN)}}; -using Nearest_mode = ngraph::op::v4::Interpolate::NearestMode; +using Nearest_mode = default_opset::Interpolate::NearestMode; static const std::map nearest_mode_map = { {"round_prefer_floor", static_cast(Nearest_mode::ROUND_PREFER_FLOOR)}, {"round_prefer_ceil", static_cast(Nearest_mode::ROUND_PREFER_CEIL)}, @@ -57,9 +57,9 @@ static int mode_as_int(const std::map& converting_map, const s return result; } -using InterpolateV4Attrs = ngraph::op::v4::Interpolate::InterpolateAttrs; +using InterpolateAttrs = default_opset::Interpolate::InterpolateAttrs; -InterpolateV4Attrs get_resize_attrs(const onnx_import::Node& node) { +InterpolateAttrs get_resize_attrs(const onnx_import::Node& node) { auto get_str_attr = [&node](const std::string& name, const std::string& default_value) { return node.get_attribute_value(name, default_value); }; @@ -98,43 +98,17 @@ InterpolateV4Attrs get_resize_attrs(const onnx_import::Node& node) { supported_modes_str); } - InterpolateV4Attrs attrs; + InterpolateAttrs attrs; attrs.mode = static_cast(mode_as_int(interp_mode_map, mode)); attrs.coordinate_transformation_mode = static_cast(mode_as_int(transform_mode_map, transform_mode)); attrs.nearest_mode = static_cast(mode_as_int(nearest_mode_map, nearest_mode)); attrs.antialias = false; attrs.cube_coeff = node.get_attribute_value("cubic_coeff_a", -0.75); - - auto zero_pad = std::vector(1, 0); - - attrs.pads_begin = zero_pad; - attrs.pads_end = zero_pad; + attrs.pads_begin = {0}; + attrs.pads_end = {0}; return attrs; } - -std::shared_ptr calculate_output_shape_based_on_scales(const Output& data, - const Output& scales) { - const auto shape_of_data = std::make_shared(std::make_shared(data), - scales.get_element_type()); - const auto multiply = std::make_shared(shape_of_data, scales); - const auto output_shape = std::make_shared(multiply, ngraph::element::i64); - - return output_shape; -} - -std::shared_ptr calculate_scales_based_on_sizes(const Output& data, - const Output& sizes) { - const float epsilon = 1.0e-5f; - const auto shape_of_data = - std::make_shared(std::make_shared(data), ngraph::element::f32); - const auto converted_sizes = std::make_shared(sizes, ngraph::element::f32); - const auto divide = std::make_shared(converted_sizes, shape_of_data); - const auto eps_node = std::make_shared(ngraph::element::f32, Shape{}, epsilon); - const auto scales = std::make_shared(divide, eps_node); - - return scales; -} } // namespace namespace set_11 { @@ -149,16 +123,12 @@ OutputVector resize(const onnx_import::Node& node) { if (inputs.size() == 4 && !ngraph::op::is_null(inputs[3])) { attrs.shape_calculation_mode = default_opset::Interpolate::ShapeCalcMode::SIZES; const auto& sizes = inputs.at(3); - const auto scales = calculate_scales_based_on_sizes(data, sizes); - - return {std::make_shared(data, sizes, scales, attrs)}; + return {std::make_shared(data, sizes, attrs)}; + } else { + attrs.shape_calculation_mode = default_opset::Interpolate::ShapeCalcMode::SCALES; + const auto& scales = inputs.at(2); + return {std::make_shared(data, scales, attrs)}; } - - attrs.shape_calculation_mode = default_opset::Interpolate::ShapeCalcMode::SCALES; - - const auto& scales = inputs.at(2); - const auto output_shape = calculate_output_shape_based_on_scales(data, scales); - return {std::make_shared(data, output_shape, scales, attrs)}; } } // namespace set_11 @@ -169,6 +139,7 @@ OutputVector resize(const onnx_import::Node& node) { const auto& scales = inputs.at(1); auto attrs = get_resize_attrs(node); + attrs.shape_calculation_mode = default_opset::Interpolate::ShapeCalcMode::SIZES; if (attrs.mode == InterpolateMode::NEAREST) { attrs.nearest_mode = Nearest_mode::FLOOR; @@ -177,8 +148,12 @@ OutputVector resize(const onnx_import::Node& node) { attrs.coordinate_transformation_mode = Transform_mode::ASYMMETRIC; } - const auto output_shape = calculate_output_shape_based_on_scales(data, scales); - return {std::make_shared(data, output_shape, scales, attrs)}; + const auto shape_of_data = std::make_shared(std::make_shared(data), + scales.get_element_type()); + const auto multiply = std::make_shared(shape_of_data, scales); + const auto output_shape = std::make_shared(multiply, ngraph::element::i64); + + return {std::make_shared(data, output_shape, attrs)}; } } // namespace set_1 diff --git a/src/frontends/onnx/frontend/src/op/topk.cpp b/src/frontends/onnx/frontend/src/op/topk.cpp index dc33b103613..df884eaa54c 100644 --- a/src/frontends/onnx/frontend/src/op/topk.cpp +++ b/src/frontends/onnx/frontend/src/op/topk.cpp @@ -6,7 +6,6 @@ #include #include -#include #include "default_opset.hpp" #include "ngraph/node.hpp" @@ -38,12 +37,13 @@ OutputVector topk(const Node& node) { const auto k_node = node.get_attribute_as_constant("k"); const std::int64_t axis{node.get_attribute_value("axis", -1)}; - std::shared_ptr top_k = std::make_shared(data, - k_node, - axis, - ov::opset11::TopK::Mode::MAX, - ov::opset11::TopK::SortType::SORT_VALUES, - element::i64); + std::shared_ptr top_k = + std::make_shared(data, + k_node, + axis, + default_opset::TopK::Mode::MAX, + default_opset::TopK::SortType::SORT_VALUES, + element::i64); return {top_k->output(0), top_k->output(1)}; } @@ -55,12 +55,13 @@ OutputVector topk(const Node& node) { auto k = get_k(node); const std::int64_t axis{node.get_attribute_value("axis", -1)}; - std::shared_ptr top_k = std::make_shared(data, - k, - axis, - ov::opset11::TopK::Mode::MAX, - ov::opset11::TopK::SortType::SORT_VALUES, - element::i64); + std::shared_ptr top_k = + std::make_shared(data, + k, + axis, + default_opset::TopK::Mode::MAX, + default_opset::TopK::SortType::SORT_VALUES, + element::i64); return {top_k->output(0), top_k->output(1)}; } @@ -78,13 +79,13 @@ OutputVector topk(const Node& node) { const auto sorted = node.get_attribute_value("sorted", 1); // Map attribute values to nGraph enums - const auto sort_type = sorted ? ov::opset11::TopK::SortType::SORT_VALUES : ov::opset11::TopK::SortType::NONE; + const auto sort_type = sorted ? default_opset::TopK::SortType::SORT_VALUES : default_opset::TopK::SortType::NONE; const auto compute_max = static_cast(largest); - const auto mode = compute_max ? ov::opset11::TopK::Mode::MAX : ov::opset11::TopK::Mode::MIN; + const auto mode = compute_max ? default_opset::TopK::Mode::MAX : default_opset::TopK::Mode::MIN; std::shared_ptr top_k = - std::make_shared(data, k, axis, mode, sort_type, element::i64); + std::make_shared(data, k, axis, mode, sort_type, element::i64); return {top_k->output(0), top_k->output(1)}; } diff --git a/src/frontends/onnx/frontend/src/op/upsample.cpp b/src/frontends/onnx/frontend/src/op/upsample.cpp index 83766e36351..2da7bd407c7 100644 --- a/src/frontends/onnx/frontend/src/op/upsample.cpp +++ b/src/frontends/onnx/frontend/src/op/upsample.cpp @@ -38,34 +38,21 @@ void check_mode_support(const onnx_import::Node& node, const std::string& mode, } default_opset::Interpolate::InterpolateAttrs get_attributes(const std::string& mode) { - using InterpolateMode = default_opset::Interpolate::InterpolateMode; - using Transform_mode = default_opset::Interpolate::CoordinateTransformMode; - using ShapeCalcMode = default_opset::Interpolate::ShapeCalcMode; + const auto interpolate_mode = mode == "linear" || mode == "bilinear" + ? default_opset::Interpolate::InterpolateMode::LINEAR_ONNX + : default_opset::Interpolate::InterpolateMode::NEAREST; - const auto interpolate_mode = - (mode == "linear" || mode == "bilinear" ? InterpolateMode::LINEAR_ONNX : InterpolateMode::NEAREST); + auto attrs = default_opset::Interpolate::InterpolateAttrs(interpolate_mode, + default_opset::Interpolate::ShapeCalcMode::SCALES, + {0}, + {0}); - std::vector pad{0}; - auto attrs = default_opset::Interpolate::InterpolateAttrs(interpolate_mode, ShapeCalcMode::SCALES, pad, pad); - - if (attrs.mode == InterpolateMode::LINEAR_ONNX) - attrs.coordinate_transformation_mode = Transform_mode::ASYMMETRIC; + if (attrs.mode == default_opset::Interpolate::InterpolateMode::LINEAR_ONNX) { + attrs.coordinate_transformation_mode = default_opset::Interpolate::CoordinateTransformMode::ASYMMETRIC; + } return attrs; } - -OutputVector create_upsample_subgraph(const Output& data, - const Output& scales, - const std::string& mode) { - const auto shape_of_data = - std::make_shared(std::make_shared(data), ngraph::element::f32); - const auto multiply = std::make_shared(shape_of_data, scales); - const auto output_shape = std::make_shared(std::make_shared(multiply), - ngraph::element::i64); - - return {std::make_shared(data, output_shape, scales, get_attributes(mode))}; -} - } // namespace namespace set_1 { @@ -89,7 +76,7 @@ OutputVector upsample(const onnx_import::Node& node) { const auto scales_const = default_opset::Constant::create(ngraph::element::f32, Shape({scales.size()}), scales); - return create_upsample_subgraph(data, scales_const, mode); + return std::make_shared(data, scales_const, get_attributes(mode))->outputs(); } } // namespace set_1 @@ -110,7 +97,7 @@ OutputVector upsample(const onnx_import::Node& node) { const auto scales_const = default_opset::Constant::create(ngraph::element::f32, Shape({scales.size()}), scales); - return create_upsample_subgraph(data, scales_const, mode); + return std::make_shared(data, scales_const, get_attributes(mode))->outputs(); } } // namespace set_7 @@ -120,17 +107,8 @@ OutputVector upsample(const onnx_import::Node& node) { const auto mode = node.get_attribute_value("mode", "nearest"); check_mode_support(node, mode, version_9); - const auto inputs = node.get_ng_inputs(); - const auto& data = inputs.at(0); - const auto& scales = inputs.at(1); - - const auto& data_shape = data.get_partial_shape(); - const auto& scales_shape = scales.get_partial_shape(); - CHECK_VALID_NODE(node, - (scales_shape.is_static() || data_shape.rank().is_static()), - " Data rank or shape of Scales input is required to be static."); - - return create_upsample_subgraph(data, scales, mode); + const auto& inputs = node.get_ng_inputs(); + return std::make_shared(inputs.at(0), inputs.at(1), get_attributes(mode))->outputs(); } } // namespace set_9 diff --git a/src/frontends/onnx/frontend/src/utils/arg_min_max_factory.cpp b/src/frontends/onnx/frontend/src/utils/arg_min_max_factory.cpp index 9807367273e..d5a3fdb8270 100644 --- a/src/frontends/onnx/frontend/src/utils/arg_min_max_factory.cpp +++ b/src/frontends/onnx/frontend/src/utils/arg_min_max_factory.cpp @@ -4,8 +4,6 @@ #include "utils/arg_min_max_factory.hpp" -#include - #include "default_opset.hpp" #include "ngraph/opsets/opset1.hpp" #include "ngraph/validation_util.hpp" @@ -20,14 +18,14 @@ ArgMinMaxFactory::ArgMinMaxFactory(const Node& node) m_select_last_index{node.get_attribute_value("select_last_index", 0)} {} std::shared_ptr ArgMinMaxFactory::make_arg_max() const { - return make_topk_subgraph(ov::opset11::TopK::Mode::MAX); + return make_topk_subgraph(default_opset::TopK::Mode::MAX); } std::shared_ptr ArgMinMaxFactory::make_arg_min() const { - return make_topk_subgraph(ov::opset11::TopK::Mode::MIN); + return make_topk_subgraph(default_opset::TopK::Mode::MIN); } -std::shared_ptr ArgMinMaxFactory::make_topk_subgraph(ov::opset11::TopK::Mode mode) const { +std::shared_ptr ArgMinMaxFactory::make_topk_subgraph(default_opset::TopK::Mode mode) const { const auto k_node = default_opset::Constant::create(ngraph::element::i64, Shape{}, {1}); if (m_select_last_index == 1) { @@ -61,11 +59,11 @@ std::shared_ptr ArgMinMaxFactory::make_topk_subgraph(ov::opset11:: const auto axis_node = default_opset::Constant::create(ngraph::element::i64, Shape{1}, {normalized_axis}); const auto reverse = std::make_shared(m_input_node, axis_node, opset1::Reverse::Mode::INDEX); - const auto topk = std::make_shared(reverse, - k_node, - normalized_axis, - mode, - ov::opset11::TopK::SortType::NONE); + const auto topk = std::make_shared(reverse, + k_node, + normalized_axis, + mode, + default_opset::TopK::SortType::NONE); const auto data_shape = std::make_shared(m_input_node); const auto dims_on_axis = std::make_shared( @@ -90,7 +88,7 @@ std::shared_ptr ArgMinMaxFactory::make_topk_subgraph(ov::opset11:: } const auto topk = - std::make_shared(m_input_node, k_node, m_axis, mode, ov::opset11::TopK::SortType::NONE); + std::make_shared(m_input_node, k_node, m_axis, mode, default_opset::TopK::SortType::NONE); const auto result = std::make_shared(topk->output(1), element::i64); diff --git a/src/frontends/onnx/tests/runtime/ie/unit_test.manifest b/src/frontends/onnx/tests/runtime/ie/unit_test.manifest index 6f2b254f64d..5a134066a6c 100644 --- a/src/frontends/onnx/tests/runtime/ie/unit_test.manifest +++ b/src/frontends/onnx/tests/runtime/ie/unit_test.manifest @@ -433,3 +433,4 @@ IE_CPU.onnx_model_top_k_repeating_unsorted # Accuracy regression - Ticket 105909 IE_CPU.onnx_model_attention_qkv_hidden_sizes + diff --git a/src/frontends/onnx/tests/runtime/interpreter/unit_test.manifest b/src/frontends/onnx/tests/runtime/interpreter/unit_test.manifest index a1da514732a..938e5870d0e 100644 --- a/src/frontends/onnx/tests/runtime/interpreter/unit_test.manifest +++ b/src/frontends/onnx/tests/runtime/interpreter/unit_test.manifest @@ -3,9 +3,6 @@ INTERPRETER.onnx_top_k_opset_10 # Temporarily disabled: INTERPRETER.onnx_resize11_scales_nearest_asymmetric_floor_dynamic_sizes INTERPRETER.onnx_resize11_up_sizes_cubic_half_pixel_dynamic_sizes -INTERPRETER.onnx_resize10_up_scales_const_nearest -INTERPRETER.onnx_resize10_up_scales_const_linear -INTERPRETER.onnx_resize10_down_scales_const_nearest # Failed in MacOS: INTERPRETER.onnx_resize11_sizes_nearest_asymmetric_floor