From: 이상규/On-Device Lab(SR)/Principal Engineer/삼성전자 Date: Fri, 23 Aug 2019 06:53:13 +0000 (-0400) Subject: [nnpkg_run] implement load (#6689) X-Git-Tag: accepted/tizen/unified/20190903.052428~170 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ff1cff503fbd0caae290caed0e2a09c6ef4c7cfe;p=platform%2Fcore%2Fml%2Fnnfw.git [nnpkg_run] implement load (#6689) `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 --- diff --git a/tests/tools/nnpackage_run/src/nnpackage_run.cc b/tests/tools/nnpackage_run/src/nnpackage_run.cc index a3ac592..eee0361 100644 --- a/tests/tools/nnpackage_run/src/nnpackage_run.cc +++ b/tests/tools/nnpackage_run/src/nnpackage_run.cc @@ -51,16 +51,16 @@ uint64_t num_elems(const nnfw_tensorinfo *ti) return n; }; -std::vector randomData(RandomGenerator &randgen, const uint64_t size) +std::vector randomData(RandomGenerator &randgen, uint64_t size) { std::vector vec(size); for (uint64_t i = 0; i < size; i++) - { vec[i] = randgen.generate(); - } 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> 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> 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());