[nnpackage-run] Backend resolve for operation type (#8919)
author오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Mon, 18 Nov 2019 05:57:36 +0000 (14:57 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Mon, 18 Nov 2019 05:57:36 +0000 (14:57 +0900)
Can resolve backend for each operation type using environment variable
- Support conv, depthwise conv, transpose conv, mean, average pool, max pool, instance norm, add
- Update api operation map for instance norm and add operation backend set

Signed-off-by: Hyeongseok Oh <hseok82.oh@samsung.com>
runtime/neurun/api/src/nnfw_api_internal.cc
tests/tools/nnpackage_run/src/nnpackage_run.cc

index a40c611..ccd5c58 100644 (file)
@@ -381,7 +381,7 @@ static std::string get_op_backend_string(std::string op)
       {"TRANSPOSE_CONV", "OP_BACKEND_TransposeConv"},      {"CONV_2D", "OP_BACKEND_Conv2D"},
       {"DEPTHWISE_CONV_2D", "OP_BACKEND_DepthwiseConv2D"}, {"MEAN", "OP_BACKEND_Mean"},
       {"AVERAGE_POOL_2D", "OP_BACKEND_AvgPool2D"},         {"MAX_POOL_2D", "OP_BACKEND_MaxPool2D"},
-  };
+      {"INSTANCE_NORM", "OP_BACKEND_InstanceNorm"},        {"ADD", "OP_BACKEND_Add"}};
 
   auto n = operation_map.find(op);
 
index b28d764..f2a5277 100644 (file)
@@ -26,6 +26,7 @@
 #include <cstdlib>
 #include <iostream>
 #include <stdexcept>
+#include <unordered_map>
 
 #define NNPR_ENSURE_STATUS(a)        \
   do                                 \
@@ -65,6 +66,28 @@ std::vector<float> randomData(RandomGenerator &randgen, uint64_t size)
 
 static const char *h5_value_grpname = "value";
 
+NNFW_STATUS resolve_op_backend(nnfw_session *session)
+{
+  static std::unordered_map<std::string, std::string> operation_map = {
+      {"TRANSPOSE_CONV", "OP_BACKEND_TransposeConv"},      {"CONV_2D", "OP_BACKEND_Conv2D"},
+      {"DEPTHWISE_CONV_2D", "OP_BACKEND_DepthwiseConv2D"}, {"MEAN", "OP_BACKEND_Mean"},
+      {"AVERAGE_POOL_2D", "OP_BACKEND_AvgPool2D"},         {"MAX_POOL_2D", "OP_BACKEND_MaxPool2D"},
+      {"INSTANCE_NORM", "OP_BACKEND_InstanceNorm"},        {"ADD", "OP_BACKEND_Add"}};
+
+  for (auto i : operation_map)
+  {
+    char *default_backend = std::getenv(i.second.c_str());
+    if (default_backend)
+    {
+      NNFW_STATUS return_result = nnfw_set_op_backend(session, i.first.c_str(), default_backend);
+      if (return_result == NNFW_STATUS_ERROR)
+        return return_result;
+    }
+  }
+
+  return NNFW_STATUS_NO_ERROR;
+}
+
 int main(const int argc, char **argv)
 {
   NNPackageRun::Args args(argc, argv);
@@ -75,6 +98,8 @@ int main(const int argc, char **argv)
   char *default_backend = std::getenv("OP_BACKEND_ALLOPS");
   if (default_backend)
     NNPR_ENSURE_STATUS(nnfw_set_default_backend(session, default_backend));
+  NNPR_ENSURE_STATUS(resolve_op_backend(session));
+
   NNPR_ENSURE_STATUS(nnfw_load_model_from_file(session, nnpackage_path.c_str()));
 
   uint32_t num_inputs;