[mir_onnx] Replace BiasAdd and Scale with Elementwise equivalents (#6298)
authorСергей Баранников/AI Tools Lab /SRR/Engineer/삼성전자 <s.barannikov@samsung.com>
Tue, 6 Aug 2019 18:49:35 +0000 (21:49 +0300)
committerAlexander Efimov/AI Tools Lab/./Samsung Electronics <a.efimov@samsung.com>
Tue, 6 Aug 2019 18:49:35 +0000 (21:49 +0300)
`BiasAdd` and `Scale` are restricted versions of equivalent Elementwise ops and are going to be removed.

Signed-off-by: Sergei Barannikov <s.barannikov@samsung.com>
compiler/mir-onnx-importer/ONNXHelpers.h
compiler/mir-onnx-importer/Op/BatchNormalization.cpp
compiler/mir-onnx-importer/Op/Conv.cpp
compiler/mir-onnx-importer/Op/Gemm.cpp
compiler/mir-onnx-importer/Op/Scale.cpp

index 9700c11..6c05362 100644 (file)
@@ -22,6 +22,7 @@
 #include "mir/ShapeRange.h"
 
 #include "mir/ops/TransposeOp.h"
+#include "mir/ops/ElementwiseOp.h"
 
 #include "onnx/onnx.pb.h"
 
@@ -144,6 +145,22 @@ inline mir::Operation::Output *convertMIRToONNX(mir::Graph *graph, mir::Operatio
       ->getOutput(0);
 }
 
+inline mir::Operation::Output *createAdd(mir::Graph *graph, mir::Operation::Output *arg1,
+                                         mir::Operation::Output *arg2)
+{
+  std::vector<mir::Operation::Output *> inputs{arg1, arg2};
+  return graph->create<mir::ops::ElementwiseOp>("", inputs, mir::ops::ElementwiseOp::OpType::add)
+      ->getOutput(0);
+}
+
+inline mir::Operation::Output *createMul(mir::Graph *graph, mir::Operation::Output *arg1,
+                                         mir::Operation::Output *arg2)
+{
+  std::vector<mir::Operation::Output *> inputs{arg1, arg2};
+  return graph->create<mir::ops::ElementwiseOp>("", inputs, mir::ops::ElementwiseOp::OpType::mul)
+      ->getOutput(0);
+}
+
 } // namespace mir_onnx
 
 #endif // __MIR_ONNX_HELPERS_H__
index 5fb587b..aac2a64 100644 (file)
@@ -21,9 +21,7 @@
 #include "mir/ShapeRange.h"
 #include "mir/Tensor.h"
 
-#include "mir/ops/BiasAddOp.h"
 #include "mir/ops/ConstantOp.h"
-#include "mir/ops/ScaleOp.h"
 
 #include <cmath>
 
@@ -53,7 +51,7 @@ BatchNormalizationNodeConverter::convert(const onnx::NodeProto &onnx_node,
 
   auto data = convertONNXToMIR(graph, inputs[0]);
   auto mean = createOp<mir::ops::ConstantOp>(graph, mean_tensor)->getOutput(0);
-  auto result = createOp<mir::ops::BiasAddOp>(graph, data, mean);
+  auto result = createAdd(graph, data, mean);
 
   // res2 = res1 * scale / (var + epsilon)
   mir::Tensor<float> multiplier(scale_tensor);
@@ -61,13 +59,13 @@ BatchNormalizationNodeConverter::convert(const onnx::NodeProto &onnx_node,
   for (auto &idx : mir::ShapeRange(scale_tensor.getShape()))
     multiplier.at(idx) /= std::sqrt(var_accessor.at(idx) + epsilon);
   auto scale = createOp<mir::ops::ConstantOp>(graph, scale_tensor)->getOutput(0);
-  result = createOp<mir::ops::ScaleOp>(graph, result->getOutput(0), scale);
+  result = createMul(graph, result, scale);
 
   // overall_res = res2 + bias
   auto bias = createOp<mir::ops::ConstantOp>(graph, bias_tensor)->getOutput(0);
-  result = createOp<mir::ops::BiasAddOp>(graph, result->getOutput(0), bias);
+  result = createAdd(graph, result, bias);
 
-  return {convertMIRToONNX(graph, result->getOutput(0))};
+  return {convertMIRToONNX(graph, result)};
 }
 
 } // namespace mir_onnx
index 879018f..6daa68e 100644 (file)
 
 #include "mir/TensorUtil.h"
 
-#include "mir/ops/BiasAddOp.h"
 #include "mir/ops/ConstantOp.h"
 #include "mir/ops/Conv2DOp.h"
 #include "mir/ops/DepthwiseConv2DOp.h"
+#include "mir/ops/ElementwiseOp.h"
 
 namespace mir_onnx
 {
@@ -52,7 +52,7 @@ ConvNodeConverter::convert(const onnx::NodeProto &onnx_node,
     num_groups = 1;
   bool is_depthwise = (num_groups != 1) && (in_group_size == 1) && (out_channels == num_groups);
 
-  mir::Operation *result;
+  mir::Operation::Output *result;
   auto transposed_input = convertONNXToMIR(graph, inputs[0]);
   if (is_depthwise)
   {
@@ -61,7 +61,8 @@ ConvNodeConverter::convert(const onnx::NodeProto &onnx_node,
     auto kernel = createOp<mir::ops::ConstantOp>(graph, transposed_tensor)->getOutput(0);
     result =
         createOp<mir::ops::DepthwiseConv2DOp>(graph, transposed_input, kernel, cdata.strides_shape,
-                                              cdata.padding_before, cdata.padding_after);
+                                              cdata.padding_before, cdata.padding_after)
+            ->getOutput(0);
   }
   else
   {
@@ -71,13 +72,16 @@ ConvNodeConverter::convert(const onnx::NodeProto &onnx_node,
     kernel_tensor = mir::transposeTensor<3, 0, 1, 2>(kernel_tensor);
     auto kernel = createOp<mir::ops::ConstantOp>(graph, kernel_tensor)->getOutput(0);
     result = createOp<mir::ops::Conv2DOp>(graph, transposed_input, kernel, cdata.strides_shape,
-                                          cdata.padding_before, cdata.padding_after);
+                                          cdata.padding_before, cdata.padding_after)
+                 ->getOutput(0);
   }
 
   if (inputs.size() > 2)
-    result = createOp<mir::ops::BiasAddOp>(graph, result->getOutput(0), inputs[2]);
+  {
+    result = createAdd(graph, result, inputs[2]);
+  }
 
-  return {convertMIRToONNX(graph, result->getOutput(0))};
+  return {convertMIRToONNX(graph, result)};
 }
 
 } // namespace mir_onnx
index d1b6adf..bff6bd2 100644 (file)
 #include "mir/TensorVariant.h"
 
 #include "mir/ops/ConstantOp.h"
-#include "mir/ops/ElementwiseOp.h"
 #include "mir/ops/GemmOp.h"
 #include "mir/ops/ReshapeOp.h"
-#include "mir/ops/ScaleOp.h"
 #include "mir/ops/TransposeOp.h"
 
 namespace mir_onnx
@@ -67,7 +65,7 @@ GemmNodeConverter::convert(const onnx::NodeProto &onnx_node,
   {
     auto alpha_tensor = createScalarTensor(alpha_val, input_a->getShape());
     auto alpha = createOp<mir::ops::ConstantOp>(graph, alpha_tensor)->getOutput(0);
-    input_a = createOp<mir::ops::ScaleOp>(graph, input_a, alpha)->getOutput(0);
+    input_a = createMul(graph, input_a, alpha);
   }
 
   // 2. Prepare input matrix B
@@ -90,9 +88,7 @@ GemmNodeConverter::convert(const onnx::NodeProto &onnx_node,
   }
   auto beta = createOp<mir::ops::ConstantOp>(graph, beta_tensor)->getOutput(0);
   std::vector<mir::Operation::Output *> mul_inputs = {beta, input_c};
-  auto c_mult =
-      createOp<mir::ops::ElementwiseOp>(graph, mul_inputs, mir::ops::ElementwiseOp::OpType::mul)
-          ->getOutput(0);
+  auto c_mult = createMul(graph, beta, input_c);
   assert(c_mult->getShape() == mult_a_b);
   auto result = createOp<mir::ops::GemmOp>(graph, input_a, input_b, c_mult);
   return {result->getOutput(0)};
index f888a53..188c3df 100644 (file)
@@ -19,7 +19,6 @@
 #include "ONNXHelpers.h"
 
 #include "mir/ops/ConstantOp.h"
-#include "mir/ops/ScaleOp.h"
 
 namespace mir_onnx
 {
@@ -36,8 +35,8 @@ ScaleNodeConverter::convert(const onnx::NodeProto &onnx_node,
   const auto &shape = inputs[0]->getShape();
   auto scale_tensor = createScalarTensor(scale_val, shape);
   auto scale = createOp<mir::ops::ConstantOp>(graph, scale_tensor)->getOutput(0);
-  auto result = createOp<mir::ops::ScaleOp>(graph, inputs[0], scale);
-  return {result->getOutput(0)};
+  auto result = createMul(graph, inputs[0], scale);
+  return {result};
 }
 
 } // namespace mir_onnx