[nnpkg_run] verify input and output before prepare and run (#6857)
author이상규/On-Device Lab(SR)/Principal Engineer/삼성전자 <sg5.lee@samsung.com>
Fri, 23 Aug 2019 05:35:32 +0000 (01:35 -0400)
committer이한종/On-Device Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Fri, 23 Aug 2019 05:35:32 +0000 (14:35 +0900)
Check input number and input/output types first so that we can do
early exit before prepare.

Signed-off-by: Sanggyu Lee <sg5.lee@samsung.com>
tests/tools/nnpackage_run/src/nnpackage_run.cc

index 7e0419b..a3ac592 100644 (file)
@@ -78,15 +78,10 @@ int main(const int argc, char **argv)
   NNPR_ENSURE_STATUS(nnfw_create_session(&session));
   NNPR_ENSURE_STATUS(nnfw_load_model_from_file(session, nnpackage_path.c_str()));
 
-  uint64_t prepare_ms = NowMicros();
-  NNPR_ENSURE_STATUS(nnfw_prepare(session));
-  prepare_ms = NowMicros() - prepare_ms;
-
-  // Set input (with random values)
   uint32_t num_inputs;
   NNPR_ENSURE_STATUS(nnfw_input_size(session, &num_inputs));
 
-  std::vector<std::vector<float>> inputs(num_inputs);
+  // verify input and output
 
   if (num_inputs == 0)
   {
@@ -95,17 +90,54 @@ int main(const int argc, char **argv)
     exit(1);
   }
 
+  auto verifyInputTypes = [session]() {
+    uint32_t sz;
+    NNPR_ENSURE_STATUS(nnfw_input_size(session, &sz));
+    for (uint32_t i = 0; i < sz; ++i)
+    {
+      nnfw_tensorinfo ti;
+      NNPR_ENSURE_STATUS(nnfw_input_tensorinfo(session, i, &ti));
+      if (ti.dtype != NNFW_TYPE_TENSOR_FLOAT32)
+      {
+        std::cerr << "Only float 32bit is supported." << std::endl;
+        exit(-1);
+      }
+    }
+  };
+
+  auto verifyOutputTypes = [session]() {
+    uint32_t sz;
+    NNPR_ENSURE_STATUS(nnfw_output_size(session, &sz));
+
+    for (uint32_t i = 0; i < sz; ++i)
+    {
+      nnfw_tensorinfo ti;
+      NNPR_ENSURE_STATUS(nnfw_output_tensorinfo(session, i, &ti));
+      if (ti.dtype != NNFW_TYPE_TENSOR_FLOAT32)
+      {
+        std::cerr << "Only float 32bit is supported." << std::endl;
+        exit(-1);
+      }
+    }
+  };
+
+  verifyInputTypes();
+  verifyOutputTypes();
+
+  // prepare execution
+
+  uint64_t prepare_ms = NowMicros();
+  NNPR_ENSURE_STATUS(nnfw_prepare(session));
+  prepare_ms = NowMicros() - prepare_ms;
+
+  // Set input (with random values)
+  std::vector<std::vector<float>> inputs(num_inputs);
   const int seed = 1; /* TODO Add an option for seed value */
   RandomGenerator randgen{seed, 0.0f, 2.0f};
   for (uint32_t i = 0; i < num_inputs; ++i)
   {
     nnfw_tensorinfo ti;
     NNPR_ENSURE_STATUS(nnfw_input_tensorinfo(session, i, &ti));
-    if (ti.dtype != NNFW_TYPE_TENSOR_FLOAT32)
-    {
-      std::cerr << "Only float 32bit is supported." << std::endl;
-      exit(-1);
-    }
     auto input_num_elements = num_elems(&ti);
     inputs[i] = randomData(randgen, input_num_elements);
     NNPR_ENSURE_STATUS(nnfw_set_input(session, i, NNFW_TYPE_TENSOR_FLOAT32, inputs[i].data(),
@@ -121,11 +153,6 @@ int main(const int argc, char **argv)
   {
     nnfw_tensorinfo ti;
     NNPR_ENSURE_STATUS(nnfw_output_tensorinfo(session, i, &ti));
-    if (ti.dtype != NNFW_TYPE_TENSOR_FLOAT32)
-    {
-      std::cerr << "Only float 32bit is supported." << std::endl;
-      exit(-1);
-    }
     auto output_num_elements = num_elems(&ti);
     outputs[i].resize(output_num_elements);
     NNPR_ENSURE_STATUS(nnfw_set_output(session, i, NNFW_TYPE_TENSOR_FLOAT32, outputs[i].data(),