[IE][VPU]: Implement HSwish layer with tests (#2775)
authorMaksim Doronin <maksim.doronin@intel.com>
Tue, 27 Oct 2020 21:38:10 +0000 (00:38 +0300)
committerGitHub <noreply@github.com>
Tue, 27 Oct 2020 21:38:10 +0000 (00:38 +0300)
* Implement HSwish layer with tests
* Disable HSwish decomposition by a predicate
* Update vpu firmware

inference-engine/cmake/vpu_dependencies.cmake
inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp
inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp
inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp
inference-engine/src/vpu/graph_transformer/src/stages/hswish.cpp [new file with mode: 0644]
inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/activation.cpp

index 1485a27..75a0325 100644 (file)
@@ -19,7 +19,7 @@ set(VPU_SUPPORTED_FIRMWARES usb-ma2450 usb-ma2x8x pcie-ma248x)
 # Default packages
 #
 
-set(FIRMWARE_PACKAGE_VERSION 1430)
+set(FIRMWARE_PACKAGE_VERSION 1440)
 set(VPU_CLC_MA2X8X_VERSION "movi-cltools-20.09.1")
 
 #
index 3cddc33..2a78093 100644 (file)
@@ -156,6 +156,7 @@ public:
     void parseSwish(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
     void parseActivation(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
     void parseLogicalNot(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
+    void parseHSwish(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
 
     //
     // Special layers
index da7b73a..f8119f3 100644 (file)
@@ -171,6 +171,7 @@ VPU_DECLARE_ENUM(StageType,
     StridedSlice = 133,
     SoftPlus = 134,
     Swish = 135,
+    HSwish = 137,
 )
 
 //
index f24125a..110eab4 100644 (file)
@@ -128,6 +128,7 @@ FrontEnd::FrontEnd(StageBuilder::Ptr stageBuilder, const ie::ICore* core)
         {"SoftPlus",                                           LAYER_PARSER(parseSoftPlus)},
         {"Swish",                                              LAYER_PARSER(parseSwish)},
         {"Activation",                                         LAYER_PARSER(parseActivation)},
+        {"HSwish",                                             LAYER_PARSER(parseHSwish)},
     }} {
         VPU_THROW_UNLESS(_core != nullptr, "Argument core is null");
     }
@@ -153,7 +154,8 @@ ie::ICNNNetwork::Ptr FrontEnd::convertNetwork(ie::ICNNNetwork& network) {
         const bool casesWithDynamicOrStaticUsage =
             std::dynamic_pointer_cast<const ngraph::opset3::Gelu>(node) ||
             std::dynamic_pointer_cast<const ngraph::opset4::SoftPlus>(node) ||
-            std::dynamic_pointer_cast<const ngraph::opset5::Minimum>(node);
+            std::dynamic_pointer_cast<const ngraph::opset5::Minimum>(node) ||
+            std::dynamic_pointer_cast<const ngraph::opset5::HSwish>(node);
 
         const bool casesWithOnlyDynamicUsage =
             (std::dynamic_pointer_cast<const ngraph::opset3::MatMul>(node) ||
@@ -177,6 +179,7 @@ ie::ICNNNetwork::Ptr FrontEnd::convertNetwork(ie::ICNNNetwork& network) {
     manager.register_pass<ngraph::pass::ConvertOpSet3ToOpSet2>();
     manager.register_pass<ngraph::pass::ConvertOpSet2ToOpSet1>();
     manager.register_pass<ngraph::pass::ConvertOpSet1ToLegacy>();
+
     manager.set_callback(transformationsPredicate);
     manager.run_passes(nGraphFunc);
 
diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/hswish.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/hswish.cpp
new file mode 100644 (file)
index 0000000..88e30ba
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright (C) 2020 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+//
+
+#include <vpu/frontend/frontend.hpp>
+#include <vpu/stages/post_op_stage.hpp>
+
+namespace vpu {
+
+namespace {
+
+class HSwishStage final : public PostOpStage {
+public:
+    using PostOpStage::PostOpStage;
+
+private:
+    StagePtr cloneImpl() const override {
+        return std::make_shared<HSwishStage >(*this);
+    }
+
+    void serializeParamsImpl(BlobSerializer&) const override {
+    }
+};
+
+}  // namespace
+
+void FrontEnd::parseHSwish(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const {
+    VPU_THROW_UNLESS((inputs.size() == 1),
+                     "HSwish stage with name {} must have only 1 input, "
+                     "actually provided {}", layer->name, inputs.size());
+    VPU_THROW_UNLESS(outputs.size() == 1,
+                     "HSwish stage with name {} must have only 1 output, "
+                     "actually provided {}", layer->name, outputs.size());
+
+    model->addNewStage<HSwishStage>(layer->name, StageType::HSwish, layer, inputs, outputs);
+}
+
+}  // namespace vpu
index 3adbc72..8128f3a 100644 (file)
@@ -24,7 +24,8 @@ const std::map<ActivationTypes, std::vector<std::vector<float>>> activationTypes
         {Gelu,     {}},
         {Mish,     {}},
         {SoftPlus, {}},
-        {Swish,    {{0.05f}, {0.8f}, {1.0f}, {15.0f}}}
+        {Swish,    {{0.05f}, {0.8f}, {1.0f}, {15.0f}}},
+        {HSwish,   {}},
 };
 
 std::map<std::vector<size_t>, std::vector<std::vector<size_t>>> basic = {