1be168c0dSopenharmony_ciFrom decd3c1abfadace6022cc1baf1fa9505e1af1ca2 Mon Sep 17 00:00:00 2001
2be168c0dSopenharmony_ciFrom: chengfeng27 <chengfeng27@huawei.com>
3be168c0dSopenharmony_ciDate: Fri, 20 Sep 2024 11:49:09 +0800
4be168c0dSopenharmony_ciSubject: [PATCH] GetNNTensor unordered_map crash
5be168c0dSopenharmony_ci
6be168c0dSopenharmony_ci---
7be168c0dSopenharmony_ci .../src/litert/cxx_api/model/model_impl.cc    |   6 +-
8be168c0dSopenharmony_ci .../litert/delegate/nnrt/nnrt_allocator.cc    | 114 +++++++++++++-----
9be168c0dSopenharmony_ci .../src/litert/delegate/nnrt/nnrt_allocator.h |  14 ++-
10be168c0dSopenharmony_ci .../litert/delegate/nnrt/nnrt_model_kernel.cc |  16 +--
11be168c0dSopenharmony_ci mindspore/lite/src/litert/lite_session.cc     |   4 +
12be168c0dSopenharmony_ci mindspore/lite/src/tensor.cc                  |   8 ++
13be168c0dSopenharmony_ci 6 files changed, 114 insertions(+), 48 deletions(-)
14be168c0dSopenharmony_ci
15be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/cxx_api/model/model_impl.cc b/mindspore/lite/src/litert/cxx_api/model/model_impl.cc
16be168c0dSopenharmony_ciindex 6a73a927..b7fa3c65 100644
17be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/cxx_api/model/model_impl.cc
18be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/cxx_api/model/model_impl.cc
19be168c0dSopenharmony_ci@@ -321,7 +321,11 @@ Status ModelImpl::Build() {
20be168c0dSopenharmony_ci 
21be168c0dSopenharmony_ci static void ResetTensorData(std::vector<void *> old_data, const std::vector<lite::Tensor *> &tensors) {
22be168c0dSopenharmony_ci   for (size_t j = 0; j < old_data.size(); j++) {
23be168c0dSopenharmony_ci-    tensors.at(j)->set_data(old_data.at(j));
24be168c0dSopenharmony_ci+    auto tensor = tensors.at(j);
25be168c0dSopenharmony_ci+    if (old_data.at(j) != tensor->data()) {
26be168c0dSopenharmony_ci+      tensor->FreeData();
27be168c0dSopenharmony_ci+    }
28be168c0dSopenharmony_ci+    tensor->set_data(old_data.at(j));
29be168c0dSopenharmony_ci   }
30be168c0dSopenharmony_ci }
31be168c0dSopenharmony_ci 
32be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc
33be168c0dSopenharmony_ciindex 4910343f..c160315e 100644
34be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc
35be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc
36be168c0dSopenharmony_ci@@ -25,53 +25,100 @@
37be168c0dSopenharmony_ci 
38be168c0dSopenharmony_ci namespace mindspore {
39be168c0dSopenharmony_ci namespace lite {
40be168c0dSopenharmony_ci-NNRTAllocator::~NNRTAllocator() {
41be168c0dSopenharmony_ci+std::shared_ptr<NNRTAllocator> NNRTAllocator::GetInstance() {
42be168c0dSopenharmony_ci+  static std::shared_ptr<NNRTAllocator> instance(new (std::nothrow) NNRTAllocator());
43be168c0dSopenharmony_ci+  return instance;
44be168c0dSopenharmony_ci+}
45be168c0dSopenharmony_ci+
46be168c0dSopenharmony_ci+void NNRTAllocator::ClearFreeList() {
47be168c0dSopenharmony_ci   std::lock_guard<std::mutex> locker(mutex_);
48be168c0dSopenharmony_ci-  for (auto &it : allocated_list_) {
49be168c0dSopenharmony_ci+  for (auto &it : free_list_) {
50be168c0dSopenharmony_ci     auto membuf = it.second;
51be168c0dSopenharmony_ci+    if (membuf == nullptr) {
52be168c0dSopenharmony_ci+      MS_LOG(ERROR) << "membuf in free_list_ is nullptr.";
53be168c0dSopenharmony_ci+      continue;
54be168c0dSopenharmony_ci+    }
55be168c0dSopenharmony_ci     OH_NNTensor_Destroy(&membuf->tensor_);
56be168c0dSopenharmony_ci     OH_NNTensorDesc_Destroy(&membuf->tensor_desc_);
57be168c0dSopenharmony_ci     delete membuf;
58be168c0dSopenharmony_ci+    membuf = nullptr;
59be168c0dSopenharmony_ci+  }
60be168c0dSopenharmony_ci+  free_list_.clear();
61be168c0dSopenharmony_ci+}
62be168c0dSopenharmony_ci+
63be168c0dSopenharmony_ci+void NNRTAllocator::FreeAllocatedTensor(void *data) {
64be168c0dSopenharmony_ci+  std::lock_guard<std::mutex> locker(mutex_);
65be168c0dSopenharmony_ci+  auto iter = allocated_list_.find(data);
66be168c0dSopenharmony_ci+  if (iter == allocated_list_.end()) {
67be168c0dSopenharmony_ci+    return;
68be168c0dSopenharmony_ci+  }
69be168c0dSopenharmony_ci+  auto membuf = iter->second;
70be168c0dSopenharmony_ci+  if (membuf == nullptr) {
71be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "membuf in allocated_list_ is nullptr, data: " << data;
72be168c0dSopenharmony_ci+    return;
73be168c0dSopenharmony_ci+  }
74be168c0dSopenharmony_ci+  membuf->ref_count_ = 0;
75be168c0dSopenharmony_ci+  (void)allocated_list_.erase(iter);
76be168c0dSopenharmony_ci+  OH_NNTensor_Destroy(&membuf->tensor_);
77be168c0dSopenharmony_ci+  OH_NNTensorDesc_Destroy(&membuf->tensor_desc_);
78be168c0dSopenharmony_ci+  delete membuf;
79be168c0dSopenharmony_ci+  membuf = nullptr;
80be168c0dSopenharmony_ci+}
81be168c0dSopenharmony_ci+
82be168c0dSopenharmony_ci+NNRTAllocator::~NNRTAllocator() {
83be168c0dSopenharmony_ci+  std::lock_guard<std::mutex> locker(mutex_);
84be168c0dSopenharmony_ci+  for (auto &it : allocated_list_) {
85be168c0dSopenharmony_ci+    auto membuf = it.second;
86be168c0dSopenharmony_ci+    if (membuf != nullptr) {
87be168c0dSopenharmony_ci+      MS_LOG(ERROR) << "NN_Tensor is not released, may lead to memory leak, data ptr: " << membuf->data << ", size: "
88be168c0dSopenharmony_ci+                    << membuf->size;
89be168c0dSopenharmony_ci+    }
90be168c0dSopenharmony_ci   }
91be168c0dSopenharmony_ci-  allocated_list_.clear();
92be168c0dSopenharmony_ci 
93be168c0dSopenharmony_ci   for (auto &it : free_list_) {
94be168c0dSopenharmony_ci     auto membuf = it.second;
95be168c0dSopenharmony_ci-    OH_NNTensor_Destroy(&membuf->tensor_);
96be168c0dSopenharmony_ci-    OH_NNTensorDesc_Destroy(&membuf->tensor_desc_);
97be168c0dSopenharmony_ci-    delete membuf;
98be168c0dSopenharmony_ci+    if (membuf != nullptr) {
99be168c0dSopenharmony_ci+      MS_LOG(ERROR) << "NN_Tensor is not released, may lead to memory leak, data ptr: " << membuf->data << ", size: "
100be168c0dSopenharmony_ci+                    << membuf->size;
101be168c0dSopenharmony_ci+    }
102be168c0dSopenharmony_ci   }
103be168c0dSopenharmony_ci-  free_list_.clear();
104be168c0dSopenharmony_ci }
105be168c0dSopenharmony_ci 
106be168c0dSopenharmony_ci-NN_TensorDesc *NNRTAllocator::CreateNNRtTensorDesc(const std::vector<int> &shape, const TypeId data_type,
107be168c0dSopenharmony_ci-                                                   const Format format, const std::string &name) {
108be168c0dSopenharmony_ci-  auto tensor_desc = OH_NNTensorDesc_Create();
109be168c0dSopenharmony_ci-  if (tensor_desc == nullptr) {
110be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNTensorDesc_Create failed, i = " << index_;
111be168c0dSopenharmony_ci-    return nullptr;
112be168c0dSopenharmony_ci-  }
113be168c0dSopenharmony_ci+OH_NN_ReturnCode NNRTAllocator::SetTensorDesc(NN_TensorDesc *tensor_desc, const std::vector<int> &shape,
114be168c0dSopenharmony_ci+                                              const TypeId data_type, const Format format, const std::string &name) {
115be168c0dSopenharmony_ci   OH_NN_ReturnCode ret = OH_NNTensorDesc_SetShape(tensor_desc, shape.data(), shape.size());
116be168c0dSopenharmony_ci   if (ret != OH_NN_SUCCESS) {
117be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNTensorDesc_SetShape failed, i = " << index_ << ", shape: " << shape;
118be168c0dSopenharmony_ci-    OH_NNTensorDesc_Destroy(&tensor_desc);
119be168c0dSopenharmony_ci-    return nullptr;
120be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetShape failed, shape: " << shape << ", name: " << name;
121be168c0dSopenharmony_ci+    return ret;
122be168c0dSopenharmony_ci   }
123be168c0dSopenharmony_ci   ret = OH_NNTensorDesc_SetDataType(tensor_desc, CastToNNRtDataType(data_type));
124be168c0dSopenharmony_ci   if (ret != OH_NN_SUCCESS) {
125be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNTensorDesc_SetDataType failed, i = " << index_ << ", data_type: " << data_type;
126be168c0dSopenharmony_ci-    OH_NNTensorDesc_Destroy(&tensor_desc);
127be168c0dSopenharmony_ci-    return nullptr;
128be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetDataType failed, data_type: " << data_type << ", name: " << name;
129be168c0dSopenharmony_ci+    return ret;
130be168c0dSopenharmony_ci   }
131be168c0dSopenharmony_ci   ret = OH_NNTensorDesc_SetFormat(tensor_desc, CastToNNRtFormat(format));
132be168c0dSopenharmony_ci   if (ret != OH_NN_SUCCESS) {
133be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNTensorDesc_SetFormat failed, i = " << index_ << ", format: " << format;
134be168c0dSopenharmony_ci-    OH_NNTensorDesc_Destroy(&tensor_desc);
135be168c0dSopenharmony_ci-    return nullptr;
136be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetFormat failed, format: " << format << ", name: " << name;
137be168c0dSopenharmony_ci+    return ret;
138be168c0dSopenharmony_ci   }
139be168c0dSopenharmony_ci   ret = OH_NNTensorDesc_SetName(tensor_desc, name.c_str());
140be168c0dSopenharmony_ci   if (ret != OH_NN_SUCCESS) {
141be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNTensorDesc_SetName failed, i = " << index_ << ", name: " << name;
142be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetName failed, name: " << name;
143be168c0dSopenharmony_ci+    return ret;
144be168c0dSopenharmony_ci+  }
145be168c0dSopenharmony_ci+  return ret;
146be168c0dSopenharmony_ci+}
147be168c0dSopenharmony_ci+
148be168c0dSopenharmony_ci+NN_TensorDesc *NNRTAllocator::CreateNNRtTensorDesc(const std::vector<int> &shape, const TypeId data_type,
149be168c0dSopenharmony_ci+                                                   const Format format, const std::string &name) {
150be168c0dSopenharmony_ci+  auto tensor_desc = OH_NNTensorDesc_Create();
151be168c0dSopenharmony_ci+  if (tensor_desc == nullptr) {
152be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_Create failed, name: " << name;
153be168c0dSopenharmony_ci+    return nullptr;
154be168c0dSopenharmony_ci+  }
155be168c0dSopenharmony_ci+  OH_NN_ReturnCode ret = SetTensorDesc(tensor_desc, shape, data_type, format, name);
156be168c0dSopenharmony_ci+  if (ret != OH_NN_SUCCESS) {
157be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "SetTensorDesc failed, name: " << name;
158be168c0dSopenharmony_ci     OH_NNTensorDesc_Destroy(&tensor_desc);
159be168c0dSopenharmony_ci     return nullptr;
160be168c0dSopenharmony_ci   }
161be168c0dSopenharmony_ci@@ -82,12 +129,17 @@ void *NNRTAllocator::MallocByDesc(size_t size, const std::vector<int> &shape, co
162be168c0dSopenharmony_ci                                   const Format format, const std::string &name) {
163be168c0dSopenharmony_ci   std::lock_guard<std::mutex> locker(mutex_);
164be168c0dSopenharmony_ci   auto iter = free_list_.lower_bound(size);
165be168c0dSopenharmony_ci-  if (iter != free_list_.end()) {
166be168c0dSopenharmony_ci+  if (iter != free_list_.end() && (size == iter->second->size)) {
167be168c0dSopenharmony_ci     auto membuf = iter->second;
168be168c0dSopenharmony_ci-    membuf->ref_count_ = 0;
169be168c0dSopenharmony_ci-    (void)free_list_.erase(iter);
170be168c0dSopenharmony_ci-    allocated_list_[membuf->data] = membuf;
171be168c0dSopenharmony_ci-    return membuf->data;
172be168c0dSopenharmony_ci+    OH_NN_ReturnCode ret = SetTensorDesc(membuf->tensor_desc_, shape, data_type, format, name);
173be168c0dSopenharmony_ci+    if (ret != OH_NN_SUCCESS) {
174be168c0dSopenharmony_ci+      MS_LOG(ERROR) << "SetTensorDesc failed, name: " << name;
175be168c0dSopenharmony_ci+    } else {
176be168c0dSopenharmony_ci+      membuf->ref_count_ = 0;
177be168c0dSopenharmony_ci+      (void)free_list_.erase(iter);
178be168c0dSopenharmony_ci+      allocated_list_[membuf->data] = membuf;
179be168c0dSopenharmony_ci+      return membuf->data;
180be168c0dSopenharmony_ci+    }
181be168c0dSopenharmony_ci   }
182be168c0dSopenharmony_ci 
183be168c0dSopenharmony_ci   auto membuf = new (std::nothrow) MemBuf();
184be168c0dSopenharmony_ci@@ -104,14 +156,14 @@ void *NNRTAllocator::MallocByDesc(size_t size, const std::vector<int> &shape, co
185be168c0dSopenharmony_ci   }
186be168c0dSopenharmony_ci   membuf->tensor_ = OH_NNTensor_Create(device_id_, membuf->tensor_desc_);
187be168c0dSopenharmony_ci   if (membuf->tensor_ == nullptr) {
188be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNTensor_CreateWithSize failed, i = " << index_;
189be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensor_CreateWithSize failed, name: " << name;
190be168c0dSopenharmony_ci     OH_NNTensorDesc_Destroy(&membuf->tensor_desc_);
191be168c0dSopenharmony_ci     delete membuf;
192be168c0dSopenharmony_ci     return nullptr;
193be168c0dSopenharmony_ci   }
194be168c0dSopenharmony_ci   membuf->data = OH_NNTensor_GetDataBuffer(membuf->tensor_);
195be168c0dSopenharmony_ci   if (membuf->data == nullptr) {
196be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNTensor_GetDataBuffer failed, i = " << index_;
197be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensor_GetDataBuffer failed, name: " << name;
198be168c0dSopenharmony_ci     OH_NNTensor_Destroy(&membuf->tensor_);
199be168c0dSopenharmony_ci     OH_NNTensorDesc_Destroy(&membuf->tensor_desc_);
200be168c0dSopenharmony_ci     delete membuf;
201be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h
202be168c0dSopenharmony_ciindex ef27f307..9d7fa3c0 100644
203be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h
204be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h
205be168c0dSopenharmony_ci@@ -31,31 +31,35 @@ struct OH_NNExecutor;
206be168c0dSopenharmony_ci 
207be168c0dSopenharmony_ci namespace mindspore {
208be168c0dSopenharmony_ci namespace lite {
209be168c0dSopenharmony_ci-enum MemoryCategory { NNRT_INPUT, NNRT_OUTPUT };
210be168c0dSopenharmony_ci 
211be168c0dSopenharmony_ci class NNRTAllocator : public Allocator {
212be168c0dSopenharmony_ci  public:
213be168c0dSopenharmony_ci-  NNRTAllocator(OH_NNExecutor *executor, int index, size_t device_id, MemoryCategory memory_category)
214be168c0dSopenharmony_ci-      : index_(index), device_id_(device_id), memory_category_(memory_category), executor_(executor) {}
215be168c0dSopenharmony_ci+  NNRTAllocator() {}
216be168c0dSopenharmony_ci   ~NNRTAllocator() override;
217be168c0dSopenharmony_ci-
218be168c0dSopenharmony_ci+  static std::shared_ptr<NNRTAllocator> GetInstance();
219be168c0dSopenharmony_ci   void *Malloc(size_t size) override;
220be168c0dSopenharmony_ci   void *MallocByDesc(size_t size, const std::vector<int> &shape, const TypeId data_type, const Format format,
221be168c0dSopenharmony_ci                      const std::string &name);
222be168c0dSopenharmony_ci   NN_TensorDesc *CreateNNRtTensorDesc(const std::vector<int> &shape, const TypeId data_type, const Format format,
223be168c0dSopenharmony_ci                                       const std::string &name);
224be168c0dSopenharmony_ci+  OH_NN_ReturnCode SetTensorDesc(NN_TensorDesc *tensor_desc, const std::vector<int> &shape, const TypeId data_type,
225be168c0dSopenharmony_ci+                                 const Format format, const std::string &name);
226be168c0dSopenharmony_ci   void Free(void *ptr) override;
227be168c0dSopenharmony_ci   int RefCount(void *ptr) override;
228be168c0dSopenharmony_ci   int SetRefCount(void *ptr, int ref_count) override;
229be168c0dSopenharmony_ci   int DecRefCount(void *ptr, int ref_count) override;
230be168c0dSopenharmony_ci   int IncRefCount(void *ptr, int ref_count) override;
231be168c0dSopenharmony_ci   NN_Tensor *GetNNTensor(void *ptr) {
232be168c0dSopenharmony_ci+    std::lock_guard<std::mutex> locker(mutex_);
233be168c0dSopenharmony_ci     auto iter = allocated_list_.find(ptr);
234be168c0dSopenharmony_ci     if (iter != allocated_list_.end()) {
235be168c0dSopenharmony_ci       return iter->second->tensor_;
236be168c0dSopenharmony_ci     }
237be168c0dSopenharmony_ci     return nullptr;
238be168c0dSopenharmony_ci   }
239be168c0dSopenharmony_ci+  void SetDeviceId(size_t id) { device_id_ = id; }
240be168c0dSopenharmony_ci+  void ClearFreeList();
241be168c0dSopenharmony_ci+  void FreeAllocatedTensor(void *data);
242be168c0dSopenharmony_ci 
243be168c0dSopenharmony_ci  private:
244be168c0dSopenharmony_ci   struct MemBuf {
245be168c0dSopenharmony_ci@@ -66,9 +70,7 @@ class NNRTAllocator : public Allocator {
246be168c0dSopenharmony_ci     size_t size{0};
247be168c0dSopenharmony_ci   };
248be168c0dSopenharmony_ci 
249be168c0dSopenharmony_ci-  int index_{0};
250be168c0dSopenharmony_ci   size_t device_id_{0};
251be168c0dSopenharmony_ci-  MemoryCategory memory_category_{NNRT_INPUT};
252be168c0dSopenharmony_ci   OH_NNExecutor *executor_{nullptr};
253be168c0dSopenharmony_ci   std::mutex mutex_;
254be168c0dSopenharmony_ci   // <membuf->memory_->data, membuf>
255be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc
256be168c0dSopenharmony_ciindex 1411020b..26c4633a 100644
257be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc
258be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc
259be168c0dSopenharmony_ci@@ -24,20 +24,16 @@ constexpr auto kDynamicDims = "DynamicDims";
260be168c0dSopenharmony_ci }
261be168c0dSopenharmony_ci 
262be168c0dSopenharmony_ci int NNRTModelKernel::Prepare() {
263be168c0dSopenharmony_ci+  auto nnrt_allocator = lite::NNRTAllocator::GetInstance();
264be168c0dSopenharmony_ci+  if (nnrt_allocator == nullptr) {
265be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "Get NNRTAllocator failed";
266be168c0dSopenharmony_ci+    return lite::RET_NULL_PTR;
267be168c0dSopenharmony_ci+  }
268be168c0dSopenharmony_ci+  nnrt_allocator->SetDeviceId(nnrt_device_info_.device_id_);
269be168c0dSopenharmony_ci   for (size_t i = 0; i < inputs_.size(); i++) {
270be168c0dSopenharmony_ci-    auto nnrt_allocator = std::make_shared<lite::NNRTAllocator>(oh_nn_executor_, i, nnrt_device_info_.device_id_, lite::NNRT_INPUT);
271be168c0dSopenharmony_ci-    if (nnrt_allocator == nullptr) {
272be168c0dSopenharmony_ci-      MS_LOG(ERROR) << "Create NNRTAllocator failed";
273be168c0dSopenharmony_ci-      return lite::RET_NULL_PTR;
274be168c0dSopenharmony_ci-    }
275be168c0dSopenharmony_ci     inputs_[i].SetAllocator(nnrt_allocator);
276be168c0dSopenharmony_ci   }
277be168c0dSopenharmony_ci   for (size_t i = 0; i < outputs_.size(); i++) {
278be168c0dSopenharmony_ci-    auto nnrt_allocator = std::make_shared<lite::NNRTAllocator>(oh_nn_executor_, i, nnrt_device_info_.device_id_, lite::NNRT_OUTPUT);
279be168c0dSopenharmony_ci-    if (nnrt_allocator == nullptr) {
280be168c0dSopenharmony_ci-      MS_LOG(ERROR) << "Create NNRTAllocator failed";
281be168c0dSopenharmony_ci-      return lite::RET_NULL_PTR;
282be168c0dSopenharmony_ci-    }
283be168c0dSopenharmony_ci     outputs_[i].SetAllocator(nnrt_allocator);
284be168c0dSopenharmony_ci   }
285be168c0dSopenharmony_ci   return lite::RET_OK;
286be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/lite_session.cc b/mindspore/lite/src/litert/lite_session.cc
287be168c0dSopenharmony_ciindex f635c8d2..7502ec27 100644
288be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/lite_session.cc
289be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/lite_session.cc
290be168c0dSopenharmony_ci@@ -69,6 +69,7 @@
291be168c0dSopenharmony_ci #include "src/litert/runtime_packed_node_pass.h"
292be168c0dSopenharmony_ci #ifdef SUPPORT_NNRT
293be168c0dSopenharmony_ci #include "src/litert/delegate/nnrt/nnrt_delegate.h"
294be168c0dSopenharmony_ci+#include "src/litert/delegate/nnrt/nnrt_allocator.h"
295be168c0dSopenharmony_ci #endif
296be168c0dSopenharmony_ci 
297be168c0dSopenharmony_ci using AbstractBaseModel = mindspore::infer::AbstractBaseModel;
298be168c0dSopenharmony_ci@@ -1280,6 +1281,9 @@ LiteSession::~LiteSession() {
299be168c0dSopenharmony_ci   }
300be168c0dSopenharmony_ci   delete (model_);
301be168c0dSopenharmony_ci   model_ = nullptr;
302be168c0dSopenharmony_ci+#ifdef SUPPORT_NNRT
303be168c0dSopenharmony_ci+  NNRTAllocator::GetInstance()->ClearFreeList();
304be168c0dSopenharmony_ci+#endif
305be168c0dSopenharmony_ci   is_running_.store(false);
306be168c0dSopenharmony_ci }
307be168c0dSopenharmony_ci 
308be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/tensor.cc b/mindspore/lite/src/tensor.cc
309be168c0dSopenharmony_ciindex 9d9a1491..6e97750a 100644
310be168c0dSopenharmony_ci--- a/mindspore/lite/src/tensor.cc
311be168c0dSopenharmony_ci+++ b/mindspore/lite/src/tensor.cc
312be168c0dSopenharmony_ci@@ -112,8 +112,16 @@ Tensor *Tensor::CopyTensor(const Tensor &src_tensor, bool copy_data, AllocatorPt
313be168c0dSopenharmony_ci }
314be168c0dSopenharmony_ci 
315be168c0dSopenharmony_ci Tensor::~Tensor() {
316be168c0dSopenharmony_ci+#ifdef SUPPORT_NNRT
317be168c0dSopenharmony_ci+  void *allocated_data = this->tensor_c_.data_;
318be168c0dSopenharmony_ci+#endif
319be168c0dSopenharmony_ci   FreeData();
320be168c0dSopenharmony_ci   this->tensor_c_.data_ = nullptr;
321be168c0dSopenharmony_ci+#ifdef SUPPORT_NNRT
322be168c0dSopenharmony_ci+  if (this->own_data_ && IS_NNRT_ALLOCATOR(allocator_)) {
323be168c0dSopenharmony_ci+    NNRTAllocator::GetInstance()->FreeAllocatedTensor(allocated_data);
324be168c0dSopenharmony_ci+  }
325be168c0dSopenharmony_ci+#endif
326be168c0dSopenharmony_ci }
327be168c0dSopenharmony_ci 
328be168c0dSopenharmony_ci bool Tensor::operator==(const Tensor &tensor) {
329be168c0dSopenharmony_ci-- 
330be168c0dSopenharmony_ci2.17.1
331be168c0dSopenharmony_ci
332