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