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