[nnpkg_run] implement load (#6689)
author이상규/On-Device Lab(SR)/Principal Engineer/삼성전자 <sg5.lee@samsung.com>
Fri, 23 Aug 2019 06:53:13 +0000 (02:53 -0400)
committer이춘석/On-Device Lab(SR)/Staff Engineer/삼성전자 <chunseok.lee@samsung.com>
Fri, 23 Aug 2019 06:53:13 +0000 (15:53 +0900)
`load` is implemented.
Inputs are filled from input file in h5 format.
The inputs[i] will have its data from DATASET `i` from h5 file.

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

index a3ac592..eee0361 100644 (file)
@@ -51,16 +51,16 @@ uint64_t num_elems(const nnfw_tensorinfo *ti)
   return n;
 };
 
-std::vector<float> randomData(RandomGenerator &randgen, const uint64_t size)
+std::vector<float> randomData(RandomGenerator &randgen, uint64_t size)
 {
   std::vector<float> vec(size);
   for (uint64_t i = 0; i < size; i++)
-  {
     vec[i] = randgen.generate<float>();
-  }
   return vec;
 }
 
+static const char *h5_value_grpname = "value";
+
 int dump(const std::string filename)
 {
   hid_t file_id;
@@ -130,21 +130,85 @@ int main(const int argc, char **argv)
   NNPR_ENSURE_STATUS(nnfw_prepare(session));
   prepare_ms = NowMicros() - prepare_ms;
 
-  // Set input (with random values)
+  // prepare input
+
   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));
-    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(),
-                                      sizeof(float) * input_num_elements));
-  }
 
-  // Set output
+  auto loadInputs = [session, num_inputs, &inputs](std::string filename) {
+    hid_t file_id = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+    if (file_id < 0)
+    {
+      std::cerr << "error during opening file " << filename << "." << std::endl;
+      exit(-1);
+    }
+    hid_t valgrp_id = H5Gopen(file_id, h5_value_grpname, H5P_DEFAULT);
+    if (valgrp_id < 0)
+    {
+      std::cerr << "error during opening group " << h5_value_grpname << "." << std::endl;
+      H5Fclose(file_id);
+      exit(-1);
+    }
+    for (uint32_t i = 0; i < num_inputs; ++i)
+    {
+      nnfw_tensorinfo ti;
+      NNPR_ENSURE_STATUS(nnfw_input_tensorinfo(session, i, &ti));
+
+      hid_t dset_id = H5Dopen(valgrp_id, std::to_string(i).c_str(), H5P_DEFAULT);
+      if (dset_id < 0)
+      {
+        std::cerr << "error during opening dataset " << std::to_string(i) << "." << std::endl;
+        H5Gclose(valgrp_id);
+        H5Fclose(file_id);
+        exit(-1);
+      }
+
+      // check type
+      hid_t type = H5Dget_type(dset_id);
+      if (!H5Tequal(type, H5T_IEEE_F32BE))
+      {
+        std::cerr << "h5 input has non-float32 type. nnpkg_run supports float32 only." << std::endl;
+        H5Dclose(dset_id);
+        H5Gclose(valgrp_id);
+        H5Fclose(file_id);
+        exit(-1);
+      }
+      // allocate memory for data
+      auto sz = num_elems(&ti);
+      inputs[i].resize(sz);
+      // read data
+      H5Dread(dset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, inputs[i].data());
+
+      NNPR_ENSURE_STATUS(nnfw_set_input(session, i, NNFW_TYPE_TENSOR_FLOAT32, inputs[i].data(),
+                                        sizeof(float) * num_elems(&ti)));
+      // clean up
+      H5Dclose(dset_id);
+    }
+    H5Gclose(valgrp_id);
+    H5Fclose(file_id);
+  };
+
+  auto generateInputs = [session, num_inputs, &inputs]() {
+    // generate random data
+    const int seed = 1;
+    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));
+      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(),
+                                        sizeof(float) * input_num_elements));
+    }
+  };
+
+  if (!args.getLoadFilename().empty())
+    loadInputs(args.getLoadFilename());
+  else
+    generateInputs();
+
+  // prepare output
+
   uint32_t num_outputs = 0;
   NNPR_ENSURE_STATUS(nnfw_output_size(session, &num_outputs));
   std::vector<std::vector<float>> outputs(num_outputs);
@@ -163,7 +227,8 @@ int main(const int argc, char **argv)
   NNPR_ENSURE_STATUS(nnfw_run(session));
   run_ms = NowMicros() - run_ms;
 
-  // Dump output tensors
+  // dump output tensors
+
   if (!args.getDumpFilename().empty())
     dump(args.getDumpFilename());