[FIX] Handle newly added extended metasize field
authorDongju Chae <dongju.chae@samsung.com>
Wed, 14 Jul 2021 03:03:10 +0000 (12:03 +0900)
committer채동주/On-Device Lab(SR)/Staff Engineer/삼성전자 <dongju.chae@samsung.com>
Wed, 14 Jul 2021 11:03:17 +0000 (20:03 +0900)
This patch handles extended metasize field which was newly
added to npubinfmt.h.

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
include/host/libnpuhost.h
src/core/ne-model.h
src/host/ne-host.cc
tests/unittests/ne_core_buffer_test.cc
tests/unittests/ne_core_model_test.cc
tests/unittests/ne_core_segment_table_test.cc
utils/model_inspect/model_inspect.cc

index de35675..5a664bc 100644 (file)
@@ -114,16 +114,32 @@ int getNPU_dspmSize (npudev_h dev, uint32_t *dspm);
 /**
  * @brief Get metadata for NPU model
  * @param[in] model The path of model binary file
- * @param[in] need_extra whether you want to extract the extra data in metadata
+ * @param[in] need_extended whether you want to extract the extended metadata in metadata
  * @return the metadata structure to be filled if no error, otherwise NULL
  *
- * @note For most npu-engine users, the extra data is not useful because it will be
- *       used for second-party users (e.g., compiler, simulator).
- *       Also, the caller needs to free the metadata.
- *
- * @note the caller needs to free the metadata
+ * @note For most npu-engine users, the extended metadata is not useful because
+ *       it will be used for second-party users (e.g., compiler, simulator).
+ * @note the caller needs to free the metadata.
+ */
+npubin_meta *getNPUmodel_metadata (const char *model, bool need_extended);
+
+/**
+ * @brief Get total metadata size including extended metadata
+ * @param[in] meta the extracted metadata
+ * @return total metadata size
  */
-npubin_meta *getNPUmodel_metadata (const char *model, bool need_extra);
+static inline uint64_t
+getNPUmodel_metasize (npubin_meta *meta) {
+  if (meta == nullptr)
+    return 0;
+
+  uint64_t extended_metasize = meta->extended_metasize;
+  /* for backward compatibility */
+  if (extended_metasize == 0)
+    extended_metasize = NPUBIN_META_EXTENDED_SIZE (meta->magiccode);
+
+  return NPUBIN_META_SIZE + extended_metasize;
+}
 
 /**
  * @brief Send the NN model to NPU.
index 19244ed..3acb677 100644 (file)
@@ -110,11 +110,13 @@ class Metadata {
   uint64_t getProgramSize () const { return meta_->program_size; }
   uint64_t getWeightSize () const { return meta_->weight_size; }
   uint64_t getBufferSize () const { return meta_->buffer_size; }
-  uint32_t getMetaSize () const {
-    return NPUBIN_META_TOTAL_SIZE (meta_->magiccode);
+  uint64_t getMetaSize () const {
+    return NPUBIN_META_SIZE + getMetaExtendedSize ();
   }
-  uint32_t getMetaExtendedSize () const {
-    return NPUBIN_META_EXTENDED_SIZE (meta_->magiccode);
+  uint64_t getMetaExtendedSize () const {
+    if (meta_->extended_metasize == 0)
+      return NPUBIN_META_EXTENDED_SIZE (meta_->magiccode);
+    return meta_->extended_metasize;
   }
   uint32_t getTops () const { return NPU_VERSION_TOPS (getNPUVersion ()); }
 
index 3137832..aa2011f 100644 (file)
@@ -607,6 +607,7 @@ getNPU_deviceStatus (npudev_h dev, npu_status *status, uint32_t *num_requests) {
 npubin_meta *
 getNPUmodel_metadata (const char *model, bool need_extended) {
   npubin_meta *meta;
+  uint64_t extended_metasize;
   FILE *fp;
   size_t ret;
 
@@ -636,11 +637,18 @@ getNPUmodel_metadata (const char *model, bool need_extended) {
     goto exit_free;
   }
 
-  if (need_extended && NPUBIN_META_NUM_EXTENDED (meta->magiccode) > 0) {
+  extended_metasize = meta->extended_metasize;
+  if (extended_metasize == 0)
+    extended_metasize = NPUBIN_META_EXTENDED_SIZE (meta->magiccode);
+  if (extended_metasize > UINT32_MAX) {
+    logwarn (TAG, "extended metasize is too large: %u\n", extended_metasize);
+    extended_metasize = 0;
+  }
+
+  if (need_extended && extended_metasize > 0) {
     npubin_meta *new_meta;
 
-    new_meta =
-        (npubin_meta *) malloc (NPUBIN_META_TOTAL_SIZE (meta->magiccode));
+    new_meta = (npubin_meta *) malloc (NPUBIN_META_SIZE + extended_metasize);
     if (!new_meta) {
       logerr (TAG, "Failed to allocate extended metadata\n");
       goto exit_free;
@@ -649,9 +657,8 @@ getNPUmodel_metadata (const char *model, bool need_extended) {
     memcpy (new_meta, meta, NPUBIN_META_SIZE);
     free (meta);
     meta = nullptr;
-    ret = fread (new_meta->reserved_extended, 1,
-                 NPUBIN_META_EXTENDED_SIZE (new_meta->magiccode), fp);
-    if (ret != NPUBIN_META_EXTENDED_SIZE (new_meta->magiccode)) {
+    ret = fread (new_meta->reserved_extended, 1, extended_metasize, fp);
+    if (ret != extended_metasize) {
       logerr (TAG, "Invalid extended metadata provided\n");
       free (new_meta);
       goto exit_err;
index 2ab7c42..102b6c8 100644 (file)
@@ -93,7 +93,7 @@ TEST (ne_core_buffer_test, buffer_primitives) {
   EXPECT_EQ (buffer->getInputTensor (0)->getSize (), exp_size_v1);
   EXPECT_EQ (buffer->getOutputTensor (0)->getSize (), exp_size_v1);
 
-  npubin_meta data;
+  npubin_meta data = {0};
   /** with metadata v1 */
   uint32_t input_size = 1024;
   uint32_t output_size = 2048;
@@ -176,7 +176,7 @@ TEST (ne_core_buffer_test, buffer_get_tensor_n) {
   uint32_t input_num = 2;
   uint32_t output_num = 3;
 
-  npubin_meta data;
+  npubin_meta data = {0};
   fill_test_metadata_v2 (data, input_num, output_num);
   ASSERT_EQ (buffer->alloc (data.buffer_size), 0);
 
index 73eb130..47fa129 100644 (file)
@@ -27,7 +27,7 @@ TEST (ne_core_model_test, model_primitives) {
   EXPECT_GT (model->getID (), (uint32_t) 0);
 
   /** make dummy metadata */
-  npubin_meta data;
+  npubin_meta data = {0};
   data.magiccode = NPUBIN_MAGICCODE | 0x1; /* v1 */
   data.size = 4096;
   data.buffer_size = 4096;
@@ -105,7 +105,7 @@ TEST (ne_core_model_test, model_primitives_invalid_args_n) {
   EXPECT_NE (model->setMetadata (nullptr), 0);
 
   /** make dummy metadata */
-  npubin_meta data;
+  npubin_meta data = {0};
   data.magiccode = NPUBIN_MAGICCODE | 0x1; /* v1 */
   data.size = 4096;
   data.buffer_size = 4096;
@@ -155,7 +155,7 @@ TEST (ne_core_model_test, model_set_metadata_n) {
   std::unique_ptr<Model> model (new Model (new HWmemDevice));
 
   /** start with the valid metadata */
-  npubin_meta data;
+  npubin_meta data = {0};
   data.magiccode = NPUBIN_MAGICCODE | 0x1; /* v1 */
   data.size = 8192;
   data.program_size = 2048;
@@ -244,7 +244,7 @@ TEST (ne_core_model_test, metadata_primitives_v1) {
   std::unique_ptr<Model> model (new Model (new HWmemDevice));
 
   /** make dummy metadata v1 */
-  npubin_meta data;
+  npubin_meta data = {0};
   const uint32_t exp_meta_size_v1 = 4096;
   const uint32_t exp_num_tensors_v1 = 1;
 
@@ -312,7 +312,7 @@ TEST (ne_core_model_test, metadata_primitives_v2) {
   std::unique_ptr<Model> model (new Model (new HWmemDevice));
 
   /** make dummy metadata v2 */
-  npubin_meta data;
+  npubin_meta data = {0};
 
   data.magiccode = NPUBIN_MAGICCODE | 0x2; /* v2 */
   data.size = 8192;
@@ -380,7 +380,7 @@ TEST (ne_core_model_test, metadata_primitives_v3) {
   std::unique_ptr<Model> model (new Model (new HWmemDevice));
 
   /** make dummy metadata v3 */
-  npubin_meta data;
+  npubin_meta data = {0};
 
   data.magiccode = NPUBIN_MAGICCODE | 0x3; /* v3 */
   data.size = 8192;
index 63faefd..a395d56 100644 (file)
@@ -73,7 +73,7 @@ TEST (ne_core_segment_table_test, create_segments) {
   std::unique_ptr<Model> model (new Model (new HWmemDevice));
   model->setDriverAPI (api.get ());
 
-  npubin_meta meta;
+  npubin_meta meta = {0};
   create_metadata_v3 (meta);
   ASSERT_EQ (model->setMetadata (&meta), 0);
   ASSERT_EQ (model->alloc (meta.size), 0);
@@ -110,7 +110,7 @@ TEST (ne_core_segment_table_test, primitives_n) {
   std::unique_ptr<Model> model (new Model (new HWmemDevice));
   model->setDriverAPI (api.get ());
 
-  npubin_meta meta;
+  npubin_meta meta = {0};
   create_metadata_v3 (meta);
   ASSERT_EQ (model->setMetadata (&meta), 0);
   ASSERT_EQ (model->alloc (meta.size), 0);
@@ -141,7 +141,7 @@ TEST (ne_core_segment_table_test, create_segments_n) {
   std::unique_ptr<Model> model (new Model (new HWmemDevice));
   model->setDriverAPI (api.get ());
 
-  npubin_meta meta;
+  npubin_meta meta = {0};
   create_metadata_v3 (meta);
   ASSERT_EQ (model->setMetadata (&meta), 0);
   ASSERT_EQ (model->alloc (meta.size), 0);
index 4796bc9..2c3238f 100644 (file)
@@ -141,8 +141,7 @@ Inspector::show_common () {
             << "\n";
   std::cout << "  model format: " << NPUBIN_VERSION (meta_->magiccode) << "\n";
   std::cout << "  model size: " << meta_->size << "\n";
-  std::cout << "  - metadata size: "
-            << NPUBIN_META_TOTAL_SIZE (meta_->magiccode) << "\n";
+  std::cout << "  - metadata size: " << getNPUmodel_metasize (meta_) << "\n";
   std::cout << "  - program size: " << meta_->program_size << "\n";
   std::cout << "  - weight size: " << meta_->weight_size << "\n";
   std::cout << "\n";
@@ -304,7 +303,7 @@ Inspector::show_v3 () {
 
 void
 Inspector::dump () {
-  size_t size_metadata = NPUBIN_META_TOTAL_SIZE (meta_->magiccode);
+  size_t size_metadata = getNPUmodel_metasize (meta_);
 
   if (dump_meta_) {
     std::ofstream ofs (dump_output_ + "/metadata.bin", std::ios::binary);