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