[IE][VPU][GT]: Add pass for marking fast stages (#1579)
authorAndrew Bakalin <andrew.bakalin@intel.com>
Fri, 14 Aug 2020 15:10:57 +0000 (18:10 +0300)
committerGitHub <noreply@github.com>
Fri, 14 Aug 2020 15:10:57 +0000 (18:10 +0300)
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

inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp
inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp
inference-engine/src/vpu/graph_transformer/src/middleend/passes/mark_fast_stages.cpp [new file with mode: 0644]
inference-engine/tests/unit/vpu/middleend_tests/passes_tests/mark_fast_stages.cpp [new file with mode: 0644]

index 7f7f39e..fe13947 100644 (file)
@@ -218,6 +218,7 @@ public:
     //
 
     Pass::Ptr dumpModel(const std::string& postfix);
+    Pass::Ptr markFastStages();
 
     //
     // Dilation Conv NCE  passes
index 9a37b70..b7dbbf7 100644 (file)
@@ -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 (file)
index 0000000..2be1ca7
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright (C) 2020 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+//
+
+#include <vpu/middleend/pass_manager.hpp>
+
+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<PassImpl>();
+}
+
+}  // 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 (file)
index 0000000..a853286
--- /dev/null
@@ -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