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