From 0d3517923493a0b5e8747865fc40c9dfa0698697 Mon Sep 17 00:00:00 2001 From: Andrew Bakalin Date: Fri, 14 Aug 2020 18:10:57 +0300 Subject: [PATCH] [IE][VPU][GT]: Add pass for marking fast stages (#1579) It was discovered that it is sometimes useful to mark fast stages (e.g. stages that process less than 100 elements) in order to be able to parse them from final performance report and estimate its contribution into performance. * Added pass for marking fast stages * Introduced unit tests --- .../include/vpu/middleend/pass_manager.hpp | 1 + .../src/middleend/pass_manager.cpp | 3 ++ .../src/middleend/passes/mark_fast_stages.cpp | 35 ++++++++++++ .../passes_tests/mark_fast_stages.cpp | 62 ++++++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 inference-engine/src/vpu/graph_transformer/src/middleend/passes/mark_fast_stages.cpp create mode 100644 inference-engine/tests/unit/vpu/middleend_tests/passes_tests/mark_fast_stages.cpp diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp index 7f7f39e..fe13947 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp @@ -218,6 +218,7 @@ public: // Pass::Ptr dumpModel(const std::string& postfix); + Pass::Ptr markFastStages(); // // Dilation Conv NCE passes diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp index 9a37b70..b7dbbf7 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp @@ -341,6 +341,9 @@ PassSet::Ptr PassManager::buildMiddleEnd() { ADD_PASS(countStagesInLoops); ADD_DUMP_PASS("countStagesInLoops"); + ADD_PASS(markFastStages); + ADD_DUMP_PASS("markFastStages"); + // // Final check // diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/mark_fast_stages.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/mark_fast_stages.cpp new file mode 100644 index 0000000..2be1ca7 --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/mark_fast_stages.cpp @@ -0,0 +1,35 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +namespace vpu { + +namespace { + +class PassImpl final : public Pass { +public: + void run(const Model& model) override { + VPU_PROFILE(markFastStages); + + for (const auto& stage : model->getStages()) { + const auto& outputs = stage->outputs(); + const auto isStageFast = std::all_of(outputs.begin(), outputs.end(), [](const Data& output) { + return output->desc().totalDimSize() <= 100; + }); + + if (isStageFast) { + stage->appendNamePostfix("@fast-stage"); + } + } + } +}; + +} // namespace + +Pass::Ptr PassManager::markFastStages() { + return std::make_shared(); +} + +} // namespace vpu diff --git a/inference-engine/tests/unit/vpu/middleend_tests/passes_tests/mark_fast_stages.cpp b/inference-engine/tests/unit/vpu/middleend_tests/passes_tests/mark_fast_stages.cpp new file mode 100644 index 0000000..a853286 --- /dev/null +++ b/inference-engine/tests/unit/vpu/middleend_tests/passes_tests/mark_fast_stages.cpp @@ -0,0 +1,62 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "graph_transformer_tests.hpp" + +namespace vpu { + +namespace ie = InferenceEngine; + +class MarkFastStagesTests : public GraphTransformerTest { +protected: + void SetUp() override { + ASSERT_NO_FATAL_FAILURE(GraphTransformerTest::SetUp()); + ASSERT_NO_FATAL_FAILURE(InitCompileEnv()); + ASSERT_NO_FATAL_FAILURE(InitPipeline()); + + _testModel = CreateTestModel(); + } + + void Compile() { + _pipeline.run(_testModel.getBaseModel()); + } + + void InitPipeline() { + _pipeline = PassSet(); + _pipeline.addPass(passManager->dumpModel("before-mark-fast-stages")); + _pipeline.addPass(passManager->initialCheck()); + _pipeline.addPass(passManager->markFastStages()); + _pipeline.addPass(passManager->dumpModel("after-mark-fast-stages")); + } + +protected: + PassSet _pipeline; + TestModel _testModel; +}; + +TEST_F(MarkFastStagesTests, FastStageIsMarked) { + const DataDesc desc{1}; + + _testModel.createInputs({desc}); + _testModel.createOutputs({desc}); + + auto stage = _testModel.addStage({InputInfo::fromNetwork()}, {OutputInfo::fromNetwork()}); + ASSERT_NO_THROW(Compile()); + + ASSERT_NE(stage->name().find("@fast-stage"), std::string::npos); +} + +TEST_F(MarkFastStagesTests, SlowStageIsNotMarked) { + const DataDesc desc{1000}; + + _testModel.createInputs({desc}); + _testModel.createOutputs({desc}); + + auto stage = _testModel.addStage({InputInfo::fromNetwork()}, {OutputInfo::fromNetwork()}); + ASSERT_NO_THROW(Compile()); + + ASSERT_EQ(stage->name().find("@fast-stage"), std::string::npos); +} + +} // namespace vpu -- 2.7.4