1be168c0dSopenharmony_ciFrom e2a0f324927dc96219d065043631931abe995e6f Mon Sep 17 00:00:00 2001
2be168c0dSopenharmony_ciFrom: chengfeng27 <chengfeng27@huawei.com>
3be168c0dSopenharmony_ciDate: Tue, 6 Feb 2024 01:19:45 +0800
4be168c0dSopenharmony_ciSubject: [PATCH] fix npu infer memory leak, delete liteGraph, destroy
5be168c0dSopenharmony_ci NNExecutor
6be168c0dSopenharmony_ci
7be168c0dSopenharmony_ci---
8be168c0dSopenharmony_ci .../src/litert/delegate/nnrt/nnrt_delegate.cc | 42 +++++++++++++++++++
9be168c0dSopenharmony_ci .../src/litert/delegate/nnrt/nnrt_delegate.h  |  2 +
10be168c0dSopenharmony_ci .../litert/delegate/nnrt/nnrt_model_kernel.h  |  4 +-
11be168c0dSopenharmony_ci 3 files changed, 45 insertions(+), 3 deletions(-)
12be168c0dSopenharmony_ci
13be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc b/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc
14be168c0dSopenharmony_ciindex 9f012e76..ca195af4 100644
15be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc
16be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc
17be168c0dSopenharmony_ci@@ -131,6 +131,7 @@ Status NNRTDelegate::BuildKirinNPUModel(DelegateModel<schema::Primitive> *model)
18be168c0dSopenharmony_ci   } else {
19be168c0dSopenharmony_ci     SetKirinModelInputsAndOutputs(nn_model);
20be168c0dSopenharmony_ci     auto ret = OH_NNModel_BuildFromMetaGraph(nn_model, meta_graph_, extensions.data(), extensions.size());
21be168c0dSopenharmony_ci+    FreeLiteGraph(&lite_graph_);
22be168c0dSopenharmony_ci     if (ret != OH_NN_SUCCESS) {
23be168c0dSopenharmony_ci       MS_LOG(ERROR) << "Build NNModel failed, ret: " << ret;
24be168c0dSopenharmony_ci       OH_NNModel_Destroy(&nn_model);
25be168c0dSopenharmony_ci@@ -209,6 +210,8 @@ Status NNRTDelegate::CreateFullModelKernel(DelegateModel<schema::Primitive> *mod
26be168c0dSopenharmony_ci     MS_LOG(ERROR) << "new NNRTModelKernel failed";
27be168c0dSopenharmony_ci     return kLiteError;
28be168c0dSopenharmony_ci   }
29be168c0dSopenharmony_ci+  nn_executor_list_.push_back(nn_executor);
30be168c0dSopenharmony_ci+
31be168c0dSopenharmony_ci   model->Replace(model->BeginKernelIterator(), model->EndKernelIterator(), nnrt_model_kernel);
32be168c0dSopenharmony_ci   return kSuccess;
33be168c0dSopenharmony_ci }
34be168c0dSopenharmony_ci@@ -618,6 +621,7 @@ Status NNRTDelegate::CreateNNRTSubgraphKernels(DelegateModel<schema::Primitive>
35be168c0dSopenharmony_ci       MS_LOG(ERROR) << "new NNRTModelKernel failed";
36be168c0dSopenharmony_ci       return kLiteError;
37be168c0dSopenharmony_ci     }
38be168c0dSopenharmony_ci+    nn_executor_list_.push_back(nn_executor);
39be168c0dSopenharmony_ci     OH_NNCompilation_Destroy(&nn_compilation);
40be168c0dSopenharmony_ci     OH_NNModel_Destroy(&nn_model);
41be168c0dSopenharmony_ci     nnrt_subgraph_kernels->push_back(nnrt_model_kernel);
42be168c0dSopenharmony_ci@@ -817,7 +821,45 @@ void NNRTDelegate::ShallowCopyLiteGraph(const lite::LiteGraph &lite_graph) {
43be168c0dSopenharmony_ci   MS_LOG(INFO) << "ShallowCopyLiteGraph success.";
44be168c0dSopenharmony_ci }
45be168c0dSopenharmony_ci 
46be168c0dSopenharmony_ci+void NNRTDelegate::FreeLiteGraph(lite::LiteGraph **liteGraph) {
47be168c0dSopenharmony_ci+  if (liteGraph != nullptr && *liteGraph != nullptr) {
48be168c0dSopenharmony_ci+    MS_LOG(INFO) << "start to free LiteGraph.";
49be168c0dSopenharmony_ci+    auto graph = *liteGraph;
50be168c0dSopenharmony_ci+    graph->name_.clear();
51be168c0dSopenharmony_ci+    graph->input_indices_.clear();
52be168c0dSopenharmony_ci+    graph->output_indices_.clear();
53be168c0dSopenharmony_ci+    MS_LOG(INFO) << "Destroying  nodes.";
54be168c0dSopenharmony_ci+    // node
55be168c0dSopenharmony_ci+    for (size_t idx = 0; idx < graph->all_nodes_.size(); idx++) {
56be168c0dSopenharmony_ci+      if (graph->all_nodes_[idx] != nullptr) {
57be168c0dSopenharmony_ci+        delete graph->all_nodes_[idx];
58be168c0dSopenharmony_ci+        graph->all_nodes_[idx] = nullptr;
59be168c0dSopenharmony_ci+      }
60be168c0dSopenharmony_ci+    }
61be168c0dSopenharmony_ci+    MS_LOG(INFO) << "Destroying  subgraphs.";
62be168c0dSopenharmony_ci+    // subgraph
63be168c0dSopenharmony_ci+    for (size_t idx = 0; idx < graph->sub_graphs_.size(); idx++) {
64be168c0dSopenharmony_ci+      if (graph->sub_graphs_[idx] != nullptr) {
65be168c0dSopenharmony_ci+        delete graph->sub_graphs_[idx];
66be168c0dSopenharmony_ci+        graph->sub_graphs_[idx] = nullptr;
67be168c0dSopenharmony_ci+      }
68be168c0dSopenharmony_ci+    }
69be168c0dSopenharmony_ci+    // graph
70be168c0dSopenharmony_ci+    delete graph;
71be168c0dSopenharmony_ci+    *liteGraph = nullptr;
72be168c0dSopenharmony_ci+  } else {
73be168c0dSopenharmony_ci+    MS_LOG(WARNING) << "nnrt_lite_graph is nullptr, no need to free.";
74be168c0dSopenharmony_ci+  }
75be168c0dSopenharmony_ci+}
76be168c0dSopenharmony_ci+
77be168c0dSopenharmony_ci NNRTDelegate::~NNRTDelegate() {
78be168c0dSopenharmony_ci+  for (size_t i = 0; i < nn_executor_list_.size(); i++) {
79be168c0dSopenharmony_ci+    if (nn_executor_list_[i] != nullptr) {
80be168c0dSopenharmony_ci+      MS_LOG(INFO) << "start NNExecutor Destroy.";
81be168c0dSopenharmony_ci+      OH_NNExecutor_Destroy(&(nn_executor_list_[i]));
82be168c0dSopenharmony_ci+      MS_LOG(INFO) << "Destroy NNExecutor Finish.";
83be168c0dSopenharmony_ci+    }
84be168c0dSopenharmony_ci+  }
85be168c0dSopenharmony_ci   if (lite_graph_ != nullptr) {
86be168c0dSopenharmony_ci     MS_LOG(ERROR) << "Delete NNRTDelegate.";
87be168c0dSopenharmony_ci   }
88be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.h b/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.h
89be168c0dSopenharmony_ciindex 52626339..4cf357d6 100644
90be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.h
91be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.h
92be168c0dSopenharmony_ci@@ -46,6 +46,7 @@ class NNRTDelegate : public Delegate {
93be168c0dSopenharmony_ci   Status Init() override { return kSuccess; }
94be168c0dSopenharmony_ci   Status Build(DelegateModel<schema::Primitive> *model) override;
95be168c0dSopenharmony_ci   void ShallowCopyLiteGraph(const lite::LiteGraph &liteGraph);
96be168c0dSopenharmony_ci+  void FreeLiteGraph(lite::LiteGraph **liteGraph);
97be168c0dSopenharmony_ci   void SetMetaGraph(const void *meta_graph) {
98be168c0dSopenharmony_ci     meta_graph_ = meta_graph;
99be168c0dSopenharmony_ci   }
100be168c0dSopenharmony_ci@@ -88,6 +89,7 @@ class NNRTDelegate : public Delegate {
101be168c0dSopenharmony_ci   const void *meta_graph_ = nullptr;
102be168c0dSopenharmony_ci   std::string cache_path_ = "";
103be168c0dSopenharmony_ci   uint32_t cache_version_ = 0;
104be168c0dSopenharmony_ci+  std::vector<OH_NNExecutor *> nn_executor_list_;
105be168c0dSopenharmony_ci };
106be168c0dSopenharmony_ci }  // namespace lite
107be168c0dSopenharmony_ci }  // namespace mindspore
108be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h
109be168c0dSopenharmony_ciindex 4f2d4f19..33df925c 100644
110be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h
111be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h
112be168c0dSopenharmony_ci@@ -44,9 +44,7 @@ class NNRTModelKernel : public kernel::Kernel {
113be168c0dSopenharmony_ci   int PrepareInputs();
114be168c0dSopenharmony_ci   int TransferOutputs();
115be168c0dSopenharmony_ci   ~NNRTModelKernel() override {
116be168c0dSopenharmony_ci-    MS_LOG(INFO) << "start NNExecutor Destroy.";
117be168c0dSopenharmony_ci-    OH_NNExecutor_Destroy(&oh_nn_executor);
118be168c0dSopenharmony_ci-    MS_LOG(INFO) << "start NNExecutor Finish.";
119be168c0dSopenharmony_ci+    MS_LOG(INFO) << "NNRTModelKernel Destroy.";
120be168c0dSopenharmony_ci   }
121be168c0dSopenharmony_ci 
122be168c0dSopenharmony_ci  protected:
123be168c0dSopenharmony_ci-- 
124be168c0dSopenharmony_ci2.17.1
125be168c0dSopenharmony_ci
126