[mir_caffe2] Switch to binary elementwise operations (#6410)
authorСергей Баранников/AI Tools Lab /SRR/Engineer/삼성전자 <s.barannikov@samsung.com>
Fri, 9 Aug 2019 09:32:24 +0000 (12:32 +0300)
committerAlexander Efimov/AI Tools Lab/./Samsung Electronics <a.efimov@samsung.com>
Fri, 9 Aug 2019 09:32:24 +0000 (12:32 +0300)
Switch to new binary elementwise operations.

Signed-off-by: Sergei Barannikov <s.barannikov@samsung.com>
compiler/mir-caffe2-importer/caffe2_op_creator.cpp
compiler/mir-caffe2-importer/caffe2_op_creator.h

index 2170470..1dc098a 100644 (file)
@@ -17,6 +17,7 @@
 #include "caffe2_op_creator.h"
 #include "caffe2_proto_helper.h"
 
+#include "mir/ops/AddOp.h"
 #include "mir/ops/BatchNormOp.h"
 #include "mir/ops/CappedReluOp.h"
 #include "mir/ops/ConcatOp.h"
@@ -24,9 +25,9 @@
 #include "mir/ops/Conv2DOp.h"
 #include "mir/ops/DepthwiseConv2DOp.h"
 #include "mir/ops/DropoutOp.h"
-#include "mir/ops/ElementwiseOp.h"
 #include "mir/ops/FullyConnectedOp.h"
 #include "mir/ops/InputOp.h"
+#include "mir/ops/MulOp.h"
 #include "mir/ops/PoolOp.h"
 #include "mir/ops/ReluOp.h"
 #include "mir/ops/ReshapeOp.h"
@@ -231,24 +232,6 @@ mir::Operation::Output *Caffe2OpCreator::convertMIRToCaffe(mir::Operation::Outpu
   return transpose->getOutput(0);
 }
 
-mir::Operation::Output *Caffe2OpCreator::createAdd(const std::string &name,
-                                                   mir::Operation::Output *arg1,
-                                                   mir::Operation::Output *arg2)
-{
-  std::vector<mir::Operation::Output *> inputs{arg1, arg2};
-  auto op = createOp<ops::ElementwiseOp>(name, inputs, ops::ElementwiseOp::OpType::add);
-  return op->getOutput(0);
-}
-
-mir::Operation::Output *Caffe2OpCreator::createMul(const std::string &name,
-                                                   mir::Operation::Output *arg1,
-                                                   mir::Operation::Output *arg2)
-{
-  std::vector<mir::Operation::Output *> inputs{arg1, arg2};
-  auto op = createOp<ops::ElementwiseOp>(name, inputs, ops::ElementwiseOp::OpType::mul);
-  return op->getOutput(0);
-}
-
 //
 // Check functions
 //
@@ -349,17 +332,13 @@ Caffe2OpCreator::convertAdd(const std::vector<mir::Operation::Output *> &inputs,
   if (getSingleArgument(op, "broadcast", 0) != 0)
   {
     // FIXME This only works when 'axis' == 1 and the second input is 1-D.
-    std::vector<mir::Operation::Output *> transposed_inputs{convertCaffeToMIR(inputs[0]),
-                                                            inputs[1]};
-    auto result = createOp<ops::ElementwiseOp>("Elementwise_Add", transposed_inputs,
-                                               ops::ElementwiseOp::OpType::add);
+    auto result = createOp<ops::AddOp>("", convertCaffeToMIR(inputs[0]), inputs[1])->getOutput(0);
 
-    return {convertMIRToCaffe(result->getOutput(0))};
+    return {convertMIRToCaffe(result)};
   }
 
-  auto result =
-      createOp<ops::ElementwiseOp>("Elementwise_Add", inputs, ops::ElementwiseOp::OpType::add);
-  return {result->getOutput(0)};
+  auto result = createOp<ops::AddOp>("", inputs[0], inputs[1])->getOutput(0);
+  return {result};
 }
 std::vector<mir::Operation::Output *>
 Caffe2OpCreator::convertAveragePool(const std::vector<mir::Operation::Output *> &inputs,
@@ -428,7 +407,7 @@ Caffe2OpCreator::convertConv(const std::vector<mir::Operation::Output *> &inputs
 
   if (op.input_size() > 2)
   {
-    result = createAdd("Bias_Add", result, inputs[2]);
+    result = createOp<ops::AddOp>("", result, inputs[2])->getOutput(0);
   }
 
   return {convertMIRToCaffe(result)};
@@ -480,7 +459,7 @@ Caffe2OpCreator::convertFC(const std::vector<mir::Operation::Output *> &inputs,
   auto reshape = createOp<ops::ReshapeOp>("Reshape", inputs[0], shape)->getOutput(0);
   auto weights = createOp<ops::ConstantOp>("Constant", weights_tensor)->getOutput(0);
   auto result = createOp<ops::FullyConnectedOp>("Fully_Connected", reshape, weights)->getOutput(0);
-  result = createAdd("Bias_Add", result, inputs[2]);
+  result = createOp<ops::AddOp>("", result, inputs[2])->getOutput(0);
 
   return {result};
 }
@@ -513,17 +492,13 @@ Caffe2OpCreator::convertMul(const std::vector<mir::Operation::Output *> &inputs,
   if (getSingleArgument(op, "broadcast", 0) != 0)
   {
     // FIXME This only works when `axis` == 1 and the second input is 1-D.
-    std::vector<mir::Operation::Output *> transposed_inputs{convertCaffeToMIR(inputs[0]),
-                                                            inputs[1]};
-    auto result = createOp<ops::ElementwiseOp>("Elementwise_Mul", transposed_inputs,
-                                               ops::ElementwiseOp::OpType::mul);
+    auto result = createOp<ops::MulOp>("", convertCaffeToMIR(inputs[0]), inputs[1])->getOutput(0);
 
-    return {convertMIRToCaffe(result->getOutput(0))};
+    return {convertMIRToCaffe(result)};
   }
 
-  auto result =
-      createOp<ops::ElementwiseOp>("Elementwise_Mul", inputs, ops::ElementwiseOp::OpType::mul);
-  return {result->getOutput(0)};
+  auto result = createOp<ops::MulOp>("", inputs[0], inputs[1])->getOutput(0);
+  return {result};
 }
 
 std::vector<mir::Operation::Output *>
@@ -601,18 +576,18 @@ Caffe2OpCreator::convertSpatialBN(const std::vector<mir::Operation::Output *> &i
     bias_data.at(idx) *= -1;
 
   auto mean = createOp<ops::ConstantOp>("Constant", mean_tensor)->getOutput(0);
-  auto result = createAdd("Bias_Add", convertCaffeToMIR(inputs[0]), mean);
+  auto result = createOp<ops::AddOp>("", convertCaffeToMIR(inputs[0]), mean)->getOutput(0);
 
   // res2 = res1 * scale / (var + epsilon)
   Tensor<float> multiplier(scale_tensor);
   for (auto &idx : ShapeRange(scale_tensor.getShape()))
     multiplier.at(idx) /= std::sqrt(*reinterpret_cast<float *>(var_tensor.at(idx)) + eps);
   auto scale = createOp<ops::ConstantOp>("Constant", scale_tensor)->getOutput(0);
-  result = createMul("Scale", result, scale);
+  result = createOp<ops::MulOp>("", result, scale)->getOutput(0);
 
   // overall_res = res2 + bias
   auto bias = createOp<ops::ConstantOp>("Constant", bias_tensor)->getOutput(0);
-  result = createAdd("Bias_Add", result, bias);
+  result = createOp<ops::AddOp>("", result, bias)->getOutput(0);
 
   return {convertMIRToCaffe(result)};
 }
@@ -620,13 +595,12 @@ Caffe2OpCreator::convertSpatialBN(const std::vector<mir::Operation::Output *> &i
 std::vector<mir::Operation::Output *>
 Caffe2OpCreator::convertSum(const std::vector<mir::Operation::Output *> &inputs)
 {
-  const auto &input_shape = inputs[0]->getShape();
-  for (auto &in : inputs)
-    assert(input_shape == in->getShape() && "All Sum inputs must have same shape");
-
-  auto op =
-      createOp<ops::ElementwiseOp>("Elementwise_Add", inputs, ops::ElementwiseOp::OpType::add);
-  return {op->getOutput(0)};
+  auto result = createOp<ops::AddOp>("", inputs[0], inputs[1])->getOutput(0);
+  for (int i = 2; i < static_cast<int>(inputs.size()); ++i)
+  {
+    result = createOp<ops::AddOp>("", result, inputs[i])->getOutput(0);
+  }
+  return {result};
 }
 
 std::vector<mir::Operation::Output *>
index 915dd83..41cda23 100644 (file)
@@ -110,12 +110,6 @@ private:
 
   mir::Operation::Output *convertMIRToCaffe(mir::Operation::Output *arg);
 
-  mir::Operation::Output *createAdd(const std::string &name, mir::Operation::Output *arg1,
-                                    mir::Operation::Output *arg2);
-
-  mir::Operation::Output *createMul(const std::string &name, mir::Operation::Output *arg1,
-                                    mir::Operation::Output *arg2);
-
   template <typename OpType, typename... Types>
   mir::Operation *createOp(const std::string &name, Types &&... args);
 };