From 0e749b8b158c2763f55abf28f995a120fdaca8de Mon Sep 17 00:00:00 2001 From: Gleb Kazantaev Date: Fri, 19 Nov 2021 13:04:49 +0300 Subject: [PATCH] Reduce number of Function Validations (#8668) --- .../src/cldnn_engine/cldnn_transformations_pipeline.cpp | 3 +++ inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp | 2 ++ .../common_optimizations/common_optimizations.cpp | 2 ++ .../common_optimizations/moc_transformations.cpp | 8 +++++++- .../common_optimizations/simplify_shape_of_sub_graph.cpp | 6 ++++++ .../opset_conversions/convert_opset2_to_opset1.cpp | 1 + .../opset_conversions/convert_opset3_to_opset2.cpp | 1 + ngraph/core/include/openvino/pass/manager.hpp | 5 ++--- ngraph/core/src/pass/manager.cpp | 4 ++++ 9 files changed, 28 insertions(+), 4 deletions(-) diff --git a/inference-engine/src/cldnn_engine/cldnn_transformations_pipeline.cpp b/inference-engine/src/cldnn_engine/cldnn_transformations_pipeline.cpp index d1c0eb38a01..68353d8268b 100644 --- a/inference-engine/src/cldnn_engine/cldnn_transformations_pipeline.cpp +++ b/inference-engine/src/cldnn_engine/cldnn_transformations_pipeline.cpp @@ -110,6 +110,8 @@ void TransformationsPipeline::apply(std::shared_ptr func) { bool enableInt8; { ngraph::pass::Manager manager; + manager.set_per_pass_validation(false); + enableInt8 = config.enableInt8 && ngraph::pass::low_precision::LowPrecision::isFunctionQuantized(func); if (enableInt8) { manager.register_pass( @@ -160,6 +162,7 @@ void TransformationsPipeline::apply(std::shared_ptr func) { {ngraph::element::u4, ngraph::element::u8}, }; + manager.register_pass(); manager.register_pass(convert_precision_list); auto pass_config = manager.get_pass_config(); diff --git a/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp b/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp index a9005f628f6..268d3c056b0 100644 --- a/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp +++ b/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp @@ -129,6 +129,7 @@ Engine::~Engine() { static void TransformationUpToCPUSpecificOpSet(std::shared_ptr nGraphFunc, const bool _enableLPT) { ngraph::pass::Manager manager; + manager.set_per_pass_validation(false); manager.register_pass(); const bool useLpt = @@ -187,6 +188,7 @@ static void TransformationUpToCPUSpecificOpSet(std::shared_ptr manager.register_pass( std::vector{ ngraph::element::i8, ngraph::element::u8, ngraph::element::i4, ngraph::element::u4 }); } + manager.register_pass(); manager.register_pass(precisions); manager.register_pass(); diff --git a/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp b/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp index 7e22faf8b1f..cbb589c3e98 100644 --- a/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -96,6 +96,7 @@ NGRAPH_RTTI_DEFINITION(ngraph::pass::CommonOptimizations, "CommonOptimizations", bool ngraph::pass::CommonOptimizations::run_on_function(std::shared_ptr f) { RUN_ON_FUNCTION_SCOPE(CommonOptimizations); ngraph::pass::Manager manager(get_pass_config()); + manager.set_per_pass_validation(false); manager.register_pass(); @@ -186,6 +187,7 @@ bool ngraph::pass::CommonOptimizations::run_on_function(std::shared_ptr(); + manager.register_pass(); manager.run_passes(f); diff --git a/inference-engine/src/transformations/src/transformations/common_optimizations/moc_transformations.cpp b/inference-engine/src/transformations/src/transformations/common_optimizations/moc_transformations.cpp index 88f68a22082..223b2400576 100644 --- a/inference-engine/src/transformations/src/transformations/common_optimizations/moc_transformations.cpp +++ b/inference-engine/src/transformations/src/transformations/common_optimizations/moc_transformations.cpp @@ -68,6 +68,7 @@ bool ngraph::pass::MOCTransformations::run_on_function(std::shared_ptr(); if (m_low_precision_enabled) { @@ -79,10 +80,15 @@ bool ngraph::pass::MOCTransformations::run_on_function(std::shared_ptr(); manager.register_pass(); + manager.register_pass(); + // FusedFilteringBoxesBySize transformation has the complex pattern // which can be affected by further transformations. So we have to - // execute it at the beginning of the pipeline. + // execute it at the beginning of the pipeline. Also, this pass resolves + // dynamism, so we have to execute type/shape propagation after. manager.register_pass(); + manager.register_pass(); + manager.register_pass(); manager.register_pass(); if (!m_use_shapes) { diff --git a/inference-engine/src/transformations/src/transformations/common_optimizations/simplify_shape_of_sub_graph.cpp b/inference-engine/src/transformations/src/transformations/common_optimizations/simplify_shape_of_sub_graph.cpp index b7affe594a9..4718a22a5b0 100644 --- a/inference-engine/src/transformations/src/transformations/common_optimizations/simplify_shape_of_sub_graph.cpp +++ b/inference-engine/src/transformations/src/transformations/common_optimizations/simplify_shape_of_sub_graph.cpp @@ -293,12 +293,18 @@ NGRAPH_RTTI_DEFINITION(ngraph::pass::SimplifyShapeOfSubGraph, "SimplifyShapeOfSu bool ngraph::pass::SimplifyShapeOfSubGraph::run_on_function(std::shared_ptr f) { RUN_ON_FUNCTION_SCOPE(SimplifyShapeOfSubGraph); ngraph::pass::Manager manager; + manager.set_per_pass_validation(false); manager.register_pass(); manager.register_pass(); manager.register_pass(); + // GatherNopElimination depends on shape, so it requires shape propagation + // if previous transformations has resolved some dynamic shapes. + manager.register_pass(); manager.register_pass(); manager.register_pass(); manager.register_pass(); + // TODO: potentially this Validate is not needed but it requires additional validation + manager.register_pass(); manager.run_passes(f); return false; } diff --git a/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset2_to_opset1.cpp b/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset2_to_opset1.cpp index 7a7360a818a..a1cbe5cbf18 100644 --- a/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset2_to_opset1.cpp +++ b/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset2_to_opset1.cpp @@ -18,6 +18,7 @@ NGRAPH_RTTI_DEFINITION(ngraph::pass::ConvertOpSet2ToOpSet1, "ConvertOpSet2ToOpSe bool ngraph::pass::ConvertOpSet2ToOpSet1::run_on_function(std::shared_ptr f) { RUN_ON_FUNCTION_SCOPE(ConvertOpSet2ToOpSet1); ngraph::pass::Manager manager(get_pass_config()); + manager.set_per_pass_validation(false); manager.register_pass(); manager.register_pass(); diff --git a/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset3_to_opset2.cpp b/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset3_to_opset2.cpp index 16b11265f63..22b39ceefbb 100644 --- a/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset3_to_opset2.cpp +++ b/inference-engine/src/transformations/src/transformations/opset_conversions/convert_opset3_to_opset2.cpp @@ -21,6 +21,7 @@ NGRAPH_RTTI_DEFINITION(ngraph::pass::ConvertOpSet3ToOpSet2, "ConvertOpSet3ToOpSe bool ngraph::pass::ConvertOpSet3ToOpSet2::run_on_function(std::shared_ptr f) { RUN_ON_FUNCTION_SCOPE(ConvertOpSet3ToOpSet2); ngraph::pass::Manager manager(get_pass_config()); + manager.set_per_pass_validation(false); manager.register_pass(); manager.register_pass(); diff --git a/ngraph/core/include/openvino/pass/manager.hpp b/ngraph/core/include/openvino/pass/manager.hpp index d285371de32..c299da6706a 100644 --- a/ngraph/core/include/openvino/pass/manager.hpp +++ b/ngraph/core/include/openvino/pass/manager.hpp @@ -55,9 +55,8 @@ public: /// \brief Set flag to enable/disable running Validate pass after executing /// each registered pass /// \param new_state Value "true" enables Validate pass run; "false", otherwise - void set_per_pass_validation(bool new_state) { - m_per_pass_validation = new_state; - } + void set_per_pass_validation(bool new_state); + /// \brief Callback is a lambda function that can be used by registered transformations. /// The main purpose of this callback is to provide a way for plugins to disable/enable /// transformations based on some conditions. In some cases plugins may want not to diff --git a/ngraph/core/src/pass/manager.cpp b/ngraph/core/src/pass/manager.cpp index 3048d65b79b..68dad2ab736 100644 --- a/ngraph/core/src/pass/manager.cpp +++ b/ngraph/core/src/pass/manager.cpp @@ -44,6 +44,10 @@ ov::pass::Manager::~Manager() = default; ov::pass::Manager::Manager(std::shared_ptr pass_config) : m_pass_config(std::move(pass_config)) {} +void ov::pass::Manager::set_per_pass_validation(bool new_state) { + m_per_pass_validation = new_state; +} + void ov::pass::Manager::run_passes(shared_ptr func) { NGRAPH_SUPPRESS_DEPRECATED_START OV_ITT_SCOPED_TASK(ov::itt::domains::nGraph, "pass::Manager::run_passes");