You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

graph_var_manager.cc 37 kB

5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. /**
  2. * Copyright 2019-2020 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "graph/manager/graph_var_manager.h"
  17. #include "graph/debug/ge_attr_define.h"
  18. #include "graph/manager/graph_mem_allocator.h"
  19. #include "graph/manager/rdma_pool_allocator.h"
  20. #include "graph/manager/trans_var_data_utils.h"
  21. #include "graph/utils/type_utils.h"
  22. using std::map;
  23. using std::string;
  24. using std::vector;
  25. namespace ge {
  26. VarResource::VarResource(uint64_t session_id) : session_id_(session_id) {}
  27. VarResource::~VarResource() {
  28. var_offset_map_.clear();
  29. var_addr_mgr_map_.clear();
  30. cur_var_tensor_desc_map_.clear();
  31. var_broad_cast_info_.clear();
  32. }
  33. ge::Status VarResource::GetVarAddr(const std::string &var_name, const ge::GeTensorDesc &tensor_desc, uint8_t **dev_ptr,
  34. rtMemType_t &memory_type) {
  35. if (dev_ptr == nullptr) {
  36. GELOGE(FAILED, "[GetVarAddr] dev_ptr is null!");
  37. return FAILED;
  38. }
  39. std::string var_key = VarKey(var_name, tensor_desc);
  40. GELOGD("VarResource::GetVarAddr , var_key = %s", var_key.c_str());
  41. auto iter = var_addr_mgr_map_.find(var_key);
  42. if (iter == var_addr_mgr_map_.end()) {
  43. GELOGE(FAILED, "VarResource::GetVarAddr failed, var_key %s", var_key.c_str());
  44. return FAILED;
  45. }
  46. *dev_ptr = iter->second.address;
  47. memory_type = iter->second.memory_type;
  48. return SUCCESS;
  49. }
  50. void VarResource::GetAllVarAddrMgr(std::unordered_map<std::string, VarAddrMgr> &var_addr_mgr_map) {
  51. var_addr_mgr_map = var_addr_mgr_map_;
  52. }
  53. void VarResource::SetVarAddr(const std::string &var_name, const ge::GeTensorDesc &tensor_desc, uint8_t *dev_ptr,
  54. rtMemType_t memory_type) {
  55. std::string var_key = VarKey(var_name, tensor_desc);
  56. GELOGI("VarResource::SetVarAddr , var_key = %s, mem_type:%u", var_key.c_str(), memory_type);
  57. if (var_addr_mgr_map_.count(var_key) == 0) {
  58. GELOGI("SetVarAddr node_name %s, tensor_desc type %s, format %s", var_name.c_str(),
  59. TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(),
  60. TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str());
  61. VarAddrMgr var_addr_mgr;
  62. var_addr_mgr.address = dev_ptr;
  63. var_addr_mgr.tensor_desc = tensor_desc;
  64. var_addr_mgr_map_[var_key] = var_addr_mgr;
  65. }
  66. cur_var_tensor_desc_map_[var_name] = tensor_desc;
  67. }
  68. ge::Status VarResource::SaveVarAddr(const std::string &var_name, const ge::GeTensorDesc &tensor_desc, uint8_t *address,
  69. rtMemType_t memory_type) {
  70. std::string var_key = VarKey(var_name, tensor_desc);
  71. GELOGD("VarResource::SaveVarAddr, var_key = %s", var_key.c_str());
  72. if (var_addr_mgr_map_.count(var_key) == 0) {
  73. uint64_t logic_address = static_cast<uint64_t>(reinterpret_cast<std::uintptr_t>(address));
  74. if (memory_type != RT_MEMORY_RDMA_HBM) {
  75. logic_address += VarManager::Instance(session_id_)->GetVarMemLogicBase();
  76. }
  77. GELOGI("SaveVarAddr node_name %s, tensor_desc format %s, type %s.", var_name.c_str(),
  78. TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str(),
  79. TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str());
  80. VarAddrMgr var_addr_mgr;
  81. var_addr_mgr.address = reinterpret_cast<uint8_t *>(static_cast<std::uintptr_t>(logic_address));
  82. var_addr_mgr.offset = static_cast<uint64_t>(reinterpret_cast<std::uintptr_t>(address));
  83. var_addr_mgr.tensor_desc = tensor_desc;
  84. var_addr_mgr.memory_type = memory_type;
  85. var_addr_mgr_map_[var_key] = var_addr_mgr;
  86. var_offset_map_[logic_address] = memory_type;
  87. return SUCCESS;
  88. }
  89. GELOGE(FAILED, "VarResource::SaveVarAddr, var_key %s save addr conflict", var_key.c_str());
  90. return FAILED;
  91. }
  92. bool VarResource::IsVarExist(const std::string &var_name, const ge::GeTensorDesc &tensor_desc) {
  93. std::string var_key = VarKey(var_name, tensor_desc);
  94. return var_addr_mgr_map_.count(var_key) != 0;
  95. }
  96. bool VarResource::IsVarExist(const std::string &var_name) { return cur_var_tensor_desc_map_.count(var_name) != 0; }
  97. std::string VarResource::VarKey(const std::string &var_name, const ge::GeTensorDesc &tensor_desc) {
  98. std::string var_key(var_name);
  99. var_key.append(std::to_string(static_cast<int32_t>(tensor_desc.GetFormat())))
  100. .append("_")
  101. .append(std::to_string(static_cast<int32_t>(tensor_desc.GetDataType())));
  102. return var_key;
  103. }
  104. ge::Status VarResource::GetCurVarDesc(const std::string &var_name, ge::GeTensorDesc &tensor_desc) {
  105. if (cur_var_tensor_desc_map_.count(var_name) == 0) {
  106. return FAILED;
  107. }
  108. tensor_desc = cur_var_tensor_desc_map_[var_name];
  109. return SUCCESS;
  110. }
  111. ge::Status VarResource::RenewCurVarDesc(const std::string &var_name, const ge::OpDescPtr &op_desc) {
  112. if (cur_var_tensor_desc_map_.count(var_name) == 0) {
  113. GELOGI("There is no this node[%s] in var tensor_desc map. so no need renew!", var_name.c_str());
  114. return SUCCESS;
  115. }
  116. if (op_desc == nullptr) {
  117. GELOGE(FAILED, "[RenewCurVarDesc] renew var desc fail! input opdesc is null!");
  118. return FAILED;
  119. }
  120. ge::GeTensorDesc curr_desc;
  121. ge::Status ret = GetCurVarDesc(var_name, curr_desc);
  122. if (ret != SUCCESS) {
  123. GELOGE(FAILED, "[RenewCurVarDesc] Get var desc fail!");
  124. return FAILED;
  125. }
  126. std::string key = VarKey(var_name, curr_desc);
  127. curr_desc.SetOriginFormat((op_desc->GetOutputDesc(0)).GetOriginFormat());
  128. curr_desc.SetFormat((op_desc->GetOutputDesc(0)).GetFormat());
  129. cur_var_tensor_desc_map_[var_name] = curr_desc;
  130. auto iter = var_addr_mgr_map_.find(key);
  131. if (iter == var_addr_mgr_map_.end()) {
  132. GELOGE(FAILED, "[RenewCurVarDesc] can't find ele with key [%s]", key.c_str());
  133. return FAILED;
  134. }
  135. auto val = iter->second;
  136. val.tensor_desc.SetOriginFormat((op_desc->GetOutputDesc(0)).GetOriginFormat());
  137. val.tensor_desc.SetFormat((op_desc->GetOutputDesc(0)).GetFormat());
  138. var_addr_mgr_map_.erase(iter);
  139. key = VarKey(var_name, curr_desc);
  140. var_addr_mgr_map_[key] = val;
  141. return SUCCESS;
  142. }
  143. void VarResource::SaveBroadCastInfo(uint32_t graph_id, const VarBroadCastInfo &broad_cast_info) {
  144. var_broad_cast_info_[graph_id][broad_cast_info.var_name] = broad_cast_info;
  145. }
  146. ge::Status VarResource::GetBroadCastInfo(uint32_t graph_id, const string &var_name, VarBroadCastInfo &broad_cast_info) {
  147. if (var_broad_cast_info_.count(graph_id) == 0 || var_broad_cast_info_[graph_id].count(var_name) == 0) {
  148. return FAILED;
  149. }
  150. broad_cast_info = var_broad_cast_info_[graph_id][var_name];
  151. return SUCCESS;
  152. }
  153. ge::Status VarResource::SyncVarData2BroadCast(uint32_t graph_id, const std::string &var_name,
  154. const GeTensorDesc &var_tensor_desc, uint8_t *base_ptr) {
  155. GE_CHECK_NOTNULL(base_ptr);
  156. GELOGI("SyncVarData2BroadCast graph_id: %u, var_name: %s.", graph_id, var_name.c_str());
  157. VarBroadCastInfo var_broadcast_info = var_broad_cast_info_[graph_id][var_name];
  158. uint8_t *dst_addr = base_ptr + var_broadcast_info.input_offset;
  159. return ge::TransVarDataUtils::SyncVarData2BroadCast(var_name, var_tensor_desc, dst_addr,
  160. var_broadcast_info.input_size, session_id_);
  161. }
  162. ge::Status VarResource::SyncBroadCastData2Var(uint32_t graph_id, const std::string &var_name,
  163. const GeTensorDesc &var_tensor_desc, uint8_t *base_ptr) {
  164. GELOGI("SyncBroadCastData2Var var_name: %s", var_name.c_str());
  165. VarBroadCastInfo var_broadcast_info = var_broad_cast_info_[graph_id][var_name];
  166. // subgraph base_ptr could be nullptr, task it as base 0
  167. uint8_t *dst_addr = base_ptr + var_broadcast_info.output_offset;
  168. return ge::TransVarDataUtils::SyncBroadCastData2Var(dst_addr, var_broadcast_info.output_size, var_name,
  169. var_tensor_desc, session_id_);
  170. }
  171. ge::Status VarResource::SyncVarData(uint32_t graph_id, const std::string &var_name,
  172. const GeTensorDesc &var_tensor_desc, uint8_t *base_ptr) {
  173. return SyncVarData2BroadCast(graph_id, var_name, var_tensor_desc, base_ptr);
  174. }
  175. bool VarResource::IsVarAddr(const int64_t &offset) { return var_offset_map_.count(offset) > 0; }
  176. rtMemType_t VarResource::GetVarMemType(const int64_t &offset) {
  177. if (var_offset_map_.count(offset) > 0) {
  178. return var_offset_map_[offset];
  179. }
  180. return RT_MEMORY_RESERVED;
  181. }
  182. VarTransRoad *VarResource::GetTransRoad(const std::string &var_name) {
  183. auto iter = var_to_trans_road_.find(var_name);
  184. if (iter == var_to_trans_road_.end()) {
  185. return nullptr;
  186. } else {
  187. return &(iter->second);
  188. }
  189. }
  190. Status VarResource::GetChangedGraphId(const std::string &var_name, uint32_t &graph_id) {
  191. auto iter = var_names_to_changed_graph_id_.find(var_name);
  192. if (iter == var_names_to_changed_graph_id_.end()) {
  193. return FAILED;
  194. } else {
  195. graph_id = iter->second;
  196. return SUCCESS;
  197. }
  198. }
  199. Status VarResource::GetAllocatedGraphId(const std::string &var_name, uint32_t &graph_id) {
  200. auto iter = var_names_to_allocated_graph_id_.find(var_name);
  201. if (iter == var_names_to_allocated_graph_id_.end()) {
  202. return FAILED;
  203. } else {
  204. graph_id = iter->second;
  205. return SUCCESS;
  206. }
  207. }
  208. Status VarResource::SetAllocatedGraphId(const std::string &var_name, uint32_t graph_id) {
  209. if (GetAllocatedGraphId(var_name, graph_id) == SUCCESS) {
  210. GELOGW("VarManager var[%s] has been allocated in graph[%d]", var_name.c_str(), graph_id);
  211. return SUCCESS;
  212. }
  213. var_names_to_allocated_graph_id_[var_name] = graph_id;
  214. return SUCCESS;
  215. }
  216. MemResource::MemResource() : total_size_(0), var_mem_size_(0) {}
  217. MemResource *MemResource::BuildMemResourceFromType(rtMemType_t mem_type) {
  218. switch (mem_type) {
  219. case RT_MEMORY_HBM:
  220. return new (std::nothrow) HbmMemResource();
  221. case RT_MEMORY_RDMA_HBM:
  222. return new (std::nothrow) RdmaMemResource();
  223. default:
  224. return nullptr;
  225. }
  226. }
  227. Status HbmMemResource::AssignVarMem(const std::string &var_name, uint64_t size, uint64_t session_id,
  228. size_t &mem_offset) {
  229. size = (size + kSessionMemAlignSize - 1) / kSessionMemAlignSize * kSessionMemAlignSize;
  230. uint64_t real_size = size;
  231. total_size_ = VarManager::Instance(session_id)->GetVarMemMaxSize();
  232. if (total_size_ < var_mem_size_) {
  233. GELOGE(PARAM_INVALID, "total_size_: %lu is smaller than var_mem_size_: %lu", total_size_, var_mem_size_);
  234. return PARAM_INVALID;
  235. }
  236. uint64_t free_size = total_size_ - var_mem_size_;
  237. if (free_size < (size + kSessionMemAlignSize * kSessionMemAlignUnit)) {
  238. GELOGE(PARAM_INVALID, "Out of memory : current var size[%lu] exceeds total var size[%lu]",
  239. size + kSessionMemAlignSize * kSessionMemAlignUnit + var_mem_size_, total_size_);
  240. return PARAM_INVALID;
  241. }
  242. mem_offset = var_mem_size_;
  243. // offset for next, align 512 BYTE
  244. size = size + kSessionMemAlignSize;
  245. var_mem_size_ = var_mem_size_ + size;
  246. // align 512 BYTE
  247. var_mem_size_ = var_mem_size_ + kSessionMemAlignSize;
  248. GELOGI(
  249. "[IMAS]AssignVarMem Set session_%lu name[%s] output[%d]"
  250. "offset to [%zu] size[%lu] realsize[%lu].",
  251. session_id, var_name.c_str(), 0, mem_offset, (var_mem_size_ - mem_offset), real_size);
  252. return SUCCESS;
  253. }
  254. Status RdmaMemResource::AssignVarMem(const std::string &var_name, uint64_t size, uint64_t session_id, size_t &address) {
  255. uint8_t *buffer = MemManager::Instance().RdmaPoolInstance(RT_MEMORY_HBM).Malloc(size);
  256. if (buffer == nullptr) {
  257. GELOGE(MEMALLOC_FAILED, "Failed to malloc rdma memory for node %s, size = %lu", var_name.c_str(), size);
  258. return MEMALLOC_FAILED;
  259. }
  260. address = static_cast<size_t>(reinterpret_cast<uintptr_t>(buffer));
  261. var_mem_size_ += size;
  262. GELOGI("[IMAS]AssignVarMem Set session_%lu name[%s] output[%d] addr to [%p] size[%lu].",
  263. session_id, var_name.c_str(), 0, buffer, size);
  264. return SUCCESS;
  265. }
  266. uint64_t MemResource::GetVarMemSize() const { return var_mem_size_; }
  267. void MemResource::UpdateVarMemSize(int64_t mem_size) { var_mem_size_ = mem_size; };
  268. VarManager::VarManager(uint64_t session_id)
  269. : version_(SessionVersion::OTHER_VERSION),
  270. session_id_(session_id),
  271. device_id_(0),
  272. job_id_(0),
  273. graph_mem_max_size_(kGraphMemoryManagerMallocMaxSize),
  274. var_mem_max_size_(kMemoryVarManagerMallocSize),
  275. var_mem_logic_base_(kMemoryVarLogicBase),
  276. use_max_mem_size_(kUseMaxMemorySize) {}
  277. VarManager *VarManager::Instance(uint64_t session_id) {
  278. GELOGD("VarManager::Instance, session id = %lu", session_id);
  279. return VarManagerPool::Instance().GetVarManager(session_id);
  280. }
  281. void VarManager::Destory() {
  282. std::lock_guard<std::recursive_mutex> lock(mutex_);
  283. GELOGI("VarManager::Destory, session id = %lu.", session_id_);
  284. version_ = SessionVersion::OTHER_VERSION;
  285. device_id_ = 0;
  286. session_id_ = 0;
  287. for (auto &memory_resource : mem_resource_map_) {
  288. if (memory_resource.second != nullptr) {
  289. delete memory_resource.second;
  290. memory_resource.second = nullptr;
  291. }
  292. }
  293. mem_resource_map_.clear();
  294. }
  295. ge::Status VarManager::Init(const uint32_t &version, const uint64_t &session_id, const uint32_t &device_id,
  296. const uint64_t &job_id) {
  297. std::lock_guard<std::recursive_mutex> lock(mutex_);
  298. GELOGI("VarManager::Init, session id = %lu.", session_id);
  299. if (var_resource_ == nullptr) {
  300. version_ = version;
  301. device_id_ = device_id;
  302. session_id_ = session_id;
  303. job_id_ = job_id;
  304. var_resource_ = std::unique_ptr<VarResource>(new (std::nothrow) VarResource(session_id_));
  305. if (var_resource_ == nullptr) {
  306. GELOGW("VarManager init failed session id = %lu.", session_id);
  307. return ge::INTERNAL_ERROR;
  308. }
  309. } else {
  310. GELOGW("VarManager::has been inited, session id = %lu.", session_id);
  311. }
  312. return SUCCESS;
  313. }
  314. const uint64_t &VarManager::SessionId() const {
  315. std::lock_guard<std::recursive_mutex> lock(mutex_);
  316. return session_id_;
  317. }
  318. const uint32_t &VarManager::DeviceId() const {
  319. std::lock_guard<std::recursive_mutex> lock(mutex_);
  320. return device_id_;
  321. }
  322. const uint64_t &VarManager::JobId() const {
  323. std::lock_guard<std::recursive_mutex> lock(mutex_);
  324. return job_id_;
  325. }
  326. ge::Status VarManager::SetVarAddr(const std::string &var_name, const ge::GeTensorDesc &tensor_desc, uint8_t *dev_ptr,
  327. rtMemType_t memory_type) {
  328. GELOGI("VarManager::SetVarAddr var_name = %s, data_type = %s, data_format = %s.", var_name.c_str(),
  329. ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(),
  330. ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str());
  331. std::lock_guard<std::recursive_mutex> lock(mutex_);
  332. if (var_resource_ == nullptr) {
  333. GELOGW("VarManager has not been init.");
  334. return ge::INTERNAL_ERROR;
  335. }
  336. var_resource_->SetVarAddr(var_name, tensor_desc, dev_ptr, memory_type);
  337. return ge::SUCCESS;
  338. }
  339. ge::Status VarManager::SaveVarAddr(const std::string &var_name, const ge::GeTensorDesc &tensor_desc, uint8_t *address,
  340. rtMemType_t memory_type) {
  341. GELOGI("VarManager::SaveVarAddr var_name = %s, data_type = %s, data_format = %s.", var_name.c_str(),
  342. ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(),
  343. ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str());
  344. std::lock_guard<std::recursive_mutex> lock(mutex_);
  345. if (var_resource_ == nullptr) {
  346. GELOGW("VarManager has not been init.");
  347. return ge::INTERNAL_ERROR;
  348. }
  349. var_resource_->SaveVarAddr(var_name, tensor_desc, address, memory_type);
  350. return ge::SUCCESS;
  351. }
  352. ge::Status VarManager::GetVarAddr(const std::string &var_name, const ge::GeTensorDesc &tensor_desc, uint8_t **dev_ptr,
  353. rtMemType_t &memory_type) {
  354. std::lock_guard<std::recursive_mutex> lock(mutex_);
  355. GELOGD("VarManager::GetVarAddr var_name = %s, data_type = %s, data_format = %s", var_name.c_str(),
  356. ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(),
  357. ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str());
  358. if (var_resource_ == nullptr) {
  359. GELOGW("VarManager has not been init.");
  360. return ge::INTERNAL_ERROR;
  361. }
  362. auto ret = var_resource_->GetVarAddr(var_name, tensor_desc, dev_ptr, memory_type);
  363. if (ret != SUCCESS) {
  364. GELOGW("GetVarAddr fail.");
  365. return ge::INTERNAL_ERROR;
  366. }
  367. return SUCCESS;
  368. }
  369. ge::Status VarManager::GetVarAddr(const std::string &var_name, const ge::GeTensorDesc &tensor_desc, uint8_t **dev_ptr) {
  370. std::lock_guard<std::recursive_mutex> lock(mutex_);
  371. rtMemType_t memory_type = RT_MEMORY_HBM;
  372. return GetVarAddr(var_name, tensor_desc, dev_ptr, memory_type);
  373. }
  374. void VarManager::GetAllVarAddrMgr(std::unordered_map<std::string, VarAddrMgr> &var_addr_mgr_map) {
  375. var_resource_->GetAllVarAddrMgr(var_addr_mgr_map);
  376. }
  377. int64_t VarManager::GetVarMemSize(rtMemType_t memory_type) {
  378. std::lock_guard<std::recursive_mutex> lock(mutex_);
  379. MemResource *mem_resource = nullptr;
  380. auto iter = mem_resource_map_.find(memory_type);
  381. if (iter == mem_resource_map_.end()) {
  382. return 0;
  383. } else {
  384. mem_resource = iter->second;
  385. }
  386. if (mem_resource == nullptr) {
  387. GELOGE(ge::INTERNAL_ERROR, "MemResource is invalid.");
  388. return 0;
  389. }
  390. return mem_resource->GetVarMemSize();
  391. }
  392. Status VarManager::UpdateVarMemSize(rtMemType_t memory_type, int64_t mem_size) {
  393. std::lock_guard<std::recursive_mutex> lock(mutex_);
  394. MemResource *mem_resource = nullptr;
  395. auto iter = mem_resource_map_.find(memory_type);
  396. if (iter == mem_resource_map_.end()) {
  397. mem_resource = MemResource::BuildMemResourceFromType(memory_type);
  398. if (mem_resource == nullptr) {
  399. GELOGE(ge::INTERNAL_ERROR, "Alloc MemResource failed, memory_type = %u.", memory_type);
  400. return ge::INTERNAL_ERROR;
  401. } else {
  402. mem_resource_map_[memory_type] = mem_resource;
  403. }
  404. } else {
  405. mem_resource = iter->second;
  406. }
  407. if (mem_resource == nullptr) {
  408. GELOGE(ge::INTERNAL_ERROR, "MemResource is invalid.");
  409. return FAILED;
  410. }
  411. mem_resource->UpdateVarMemSize(mem_size);
  412. return SUCCESS;
  413. }
  414. ge::Status VarManager::AssignVarMem(const std::string &var_name, const ge::GeTensorDesc &tensor_desc,
  415. rtMemType_t memory_type) {
  416. std::lock_guard<std::recursive_mutex> lock(mutex_);
  417. GELOGI("VarManager::AssignVarMem var_name = %s, data_type = %s, data_format = %s.", var_name.c_str(),
  418. ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(),
  419. ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str());
  420. int64_t tensor_desc_size = 0;
  421. size_t mem_offset = 0;
  422. ge::Status result = TensorUtils::GetSize(tensor_desc, tensor_desc_size);
  423. if (result != ge::SUCCESS) {
  424. GELOGE(result, "get size from TensorDesc failed");
  425. return result;
  426. }
  427. MemResource *mem_resource = nullptr;
  428. auto it = mem_resource_map_.find(memory_type);
  429. if (it == mem_resource_map_.end()) {
  430. mem_resource = MemResource::BuildMemResourceFromType(memory_type);
  431. if (mem_resource == nullptr) {
  432. GELOGE(ge::INTERNAL_ERROR, "Alloc MemResource failed, memory_type = %u.", memory_type);
  433. return ge::INTERNAL_ERROR;
  434. } else {
  435. mem_resource_map_[memory_type] = mem_resource;
  436. }
  437. } else {
  438. mem_resource = it->second;
  439. }
  440. if (mem_resource == nullptr) {
  441. GELOGE(ge::INTERNAL_ERROR, "MemResource is invalid, memory_type = %u.", memory_type);
  442. return ge::INTERNAL_ERROR;
  443. }
  444. result = mem_resource->AssignVarMem(var_name, tensor_desc_size, session_id_, mem_offset);
  445. if (result != SUCCESS) {
  446. GELOGE(ge::INTERNAL_ERROR, "AssignVarMem by offset failed.");
  447. return ge::INTERNAL_ERROR;
  448. }
  449. if (var_resource_ == nullptr) {
  450. GELOGW("VarManager has not been init.");
  451. return ge::INTERNAL_ERROR;
  452. }
  453. result = var_resource_->SaveVarAddr(
  454. var_name, tensor_desc, reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type);
  455. if (result != SUCCESS) {
  456. GELOGE(ge::INTERNAL_ERROR, "AssignVarMem by offset failed.");
  457. return ge::INTERNAL_ERROR;
  458. }
  459. result = var_resource_->GetVarAddr(
  460. var_name, tensor_desc, reinterpret_cast<uint8_t **>(reinterpret_cast<uintptr_t>(&mem_offset)), memory_type);
  461. if (result != SUCCESS) {
  462. GELOGE(ge::INTERNAL_ERROR, "GetVarAddr by offset failed.");
  463. return ge::INTERNAL_ERROR;
  464. }
  465. ge::GeTensorDesc cur_tensor_desc;
  466. result = var_resource_->GetCurVarDesc(var_name, cur_tensor_desc);
  467. if (result != SUCCESS) {
  468. var_resource_->SetVarAddr(var_name, tensor_desc,
  469. reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type);
  470. return SUCCESS;
  471. }
  472. if (cur_tensor_desc.GetFormat() != tensor_desc.GetFormat() ||
  473. cur_tensor_desc.GetDataType() != tensor_desc.GetDataType() ||
  474. cur_tensor_desc.GetShape().GetDims() != tensor_desc.GetShape().GetDims()) {
  475. GELOGI("var %s assigned new memory (format, data type, shape) (%s, %s, %zu) from (%s, %s, %zu)", var_name.c_str(),
  476. ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(),
  477. ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str(),
  478. tensor_desc.GetShape().GetDims().size(),
  479. ge::TypeUtils::DataTypeToSerialString(cur_tensor_desc.GetDataType()).c_str(),
  480. ge::TypeUtils::FormatToSerialString(cur_tensor_desc.GetFormat()).c_str(),
  481. cur_tensor_desc.GetShape().GetDims().size());
  482. var_resource_->SetVarAddr(var_name, tensor_desc,
  483. reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type);
  484. }
  485. return SUCCESS;
  486. }
  487. bool VarManager::IsVarExist(const std::string &var_name, const ge::GeTensorDesc &tensor_desc) {
  488. std::lock_guard<std::recursive_mutex> lock(mutex_);
  489. GELOGD("VarManager::IsVarExist var_name = %s, data_type = %s, data_format = %s", var_name.c_str(),
  490. ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str(),
  491. ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str());
  492. if (var_resource_ == nullptr) {
  493. GELOGW("VarManager has not been init.");
  494. return false;
  495. }
  496. return var_resource_->IsVarExist(var_name, tensor_desc);
  497. }
  498. bool VarManager::IsVarExist(const std::string &var_name) {
  499. std::lock_guard<std::recursive_mutex> lock(mutex_);
  500. if (var_resource_ == nullptr) {
  501. GELOGW("VarManager has not been init.");
  502. return false;
  503. }
  504. return var_resource_->IsVarExist(var_name);
  505. }
  506. ge::Status VarManager::SyncVarData(uint32_t graph_id, const std::string &var_name, const GeTensorDesc &var_tensor_desc,
  507. uint8_t *base_ptr) {
  508. std::lock_guard<std::recursive_mutex> lock(mutex_);
  509. if (var_resource_ == nullptr) {
  510. GELOGW("VarManager has not been init.");
  511. return ge::INTERNAL_ERROR;
  512. }
  513. return var_resource_->SyncVarData(graph_id, var_name, var_tensor_desc, base_ptr);
  514. }
  515. ge::Status VarManager::GetCurVarDesc(const std::string &var_name, ge::GeTensorDesc &tensor_desc) {
  516. std::lock_guard<std::recursive_mutex> lock(mutex_);
  517. GELOGI("VarManager::GetCurVarDesc var_name = %s.", var_name.c_str());
  518. if (var_resource_ == nullptr) {
  519. GELOGW("VarManager has not been init.");
  520. return ge::INTERNAL_ERROR;
  521. }
  522. return var_resource_->GetCurVarDesc(var_name, tensor_desc);
  523. }
  524. ge::Status VarManager::SaveBroadCastInfo(uint32_t graph_id, const VarBroadCastInfo &broad_cast_info) {
  525. std::lock_guard<std::recursive_mutex> lock(mutex_);
  526. GELOGI(
  527. "VarManager::SaveBroadCastInfo var_name = %s, broadcast name = %s, "
  528. "idx = %d, input_offset = %ld, input_size = %lu, output_offset = %ld, "
  529. "output_size = %lu",
  530. broad_cast_info.var_name.c_str(), broad_cast_info.broadcast_name.c_str(), broad_cast_info.idx,
  531. broad_cast_info.input_offset, broad_cast_info.input_size, broad_cast_info.output_offset,
  532. broad_cast_info.output_size);
  533. if (var_resource_ == nullptr) {
  534. GELOGW("VarManager has not been init.");
  535. return ge::INTERNAL_ERROR;
  536. }
  537. var_resource_->SaveBroadCastInfo(graph_id, broad_cast_info);
  538. return SUCCESS;
  539. }
  540. ge::Status VarManager::GetBroadCastInfo(uint32_t graph_id, const string &var_name, VarBroadCastInfo &broad_cast_info) {
  541. std::lock_guard<std::recursive_mutex> lock(mutex_);
  542. if (var_resource_ == nullptr) {
  543. GELOGW("VarManager has not been init.");
  544. return ge::INTERNAL_ERROR;
  545. }
  546. return var_resource_->GetBroadCastInfo(graph_id, var_name, broad_cast_info);
  547. }
  548. ge::Status VarManager::RenewCurVarDesc(const std::string &var_name, ge::OpDescPtr op_desc) {
  549. std::lock_guard<std::recursive_mutex> lock(mutex_);
  550. GELOGD("VarManager::RenewCurVarDesc var_name = %s.", var_name.c_str());
  551. if (var_resource_ == nullptr) {
  552. GELOGE(ge::INTERNAL_ERROR, "VarManager has not been init.");
  553. return ge::INTERNAL_ERROR;
  554. }
  555. return var_resource_->RenewCurVarDesc(var_name, std::move(op_desc));
  556. }
  557. ge::Status VarManager::SyncBroadCastData2Var(uint32_t graph_id, const std::string &var_name,
  558. const GeTensorDesc &var_tensor_desc, uint8_t *base_ptr) {
  559. std::lock_guard<std::recursive_mutex> lock(mutex_);
  560. if (var_resource_ == nullptr) {
  561. GELOGW("VarManager has not been init.");
  562. return ge::INTERNAL_ERROR;
  563. }
  564. return var_resource_->SyncBroadCastData2Var(graph_id, var_name, var_tensor_desc, base_ptr);
  565. }
  566. bool VarManager::IsVarAddr(const int64_t &offset) {
  567. std::lock_guard<std::recursive_mutex> lock(mutex_);
  568. if (var_resource_ == nullptr) {
  569. GELOGD("VarManager has not been init.");
  570. return false;
  571. }
  572. return var_resource_->IsVarAddr(offset);
  573. }
  574. rtMemType_t VarManager::GetVarMemType(const int64_t &offset) {
  575. std::lock_guard<std::recursive_mutex> lock(mutex_);
  576. if (var_resource_ == nullptr) {
  577. GELOGW("VarManager has not been init.");
  578. return RT_MEMORY_RESERVED;
  579. }
  580. return var_resource_->GetVarMemType(offset);
  581. }
  582. ge::Status VarManager::MallocVarMemory(size_t memory_size) {
  583. std::lock_guard<std::recursive_mutex> lock(mutex_);
  584. uint8_t *var_mem_base = nullptr;
  585. string memory_key = std::to_string(session_id_);
  586. // malloc variable memory
  587. size_t var_memory_size = memory_size;
  588. // align 512 BYTE
  589. var_memory_size = (var_memory_size + kSessionMemAlignSize - 1) / kSessionMemAlignSize * kSessionMemAlignSize;
  590. const string purpose("variables and constant op memory in training network.");
  591. var_mem_base = MemManager::Instance(RT_MEMORY_HBM)->MallocMemory(purpose, memory_key, var_memory_size);
  592. if (var_mem_base == nullptr) {
  593. GELOGE(ge::INTERNAL_ERROR,
  594. "VarManager::MallocVarMemory failed "
  595. "session_id = %s",
  596. memory_key.c_str());
  597. return ge::INTERNAL_ERROR;
  598. }
  599. return SUCCESS;
  600. }
  601. uint8_t *VarManager::GetVarMemoryBase(rtMemType_t memory_type) {
  602. std::lock_guard<std::recursive_mutex> lock(mutex_);
  603. if (memory_type == RT_MEMORY_RDMA_HBM) {
  604. return MemManager::Instance().RdmaPoolInstance(RT_MEMORY_HBM).GetRdmaBaseAddr();
  605. }
  606. string memory_key = std::to_string(session_id_);
  607. return MemManager::Instance(memory_type)->GetMemoryAddr(memory_key);
  608. }
  609. uint8_t *VarManager::GetVarMemoryAddr(uint8_t *logic_addr, rtMemType_t memory_type) {
  610. std::lock_guard<std::recursive_mutex> lock(mutex_);
  611. if (memory_type == RT_MEMORY_RDMA_HBM) {
  612. return logic_addr;
  613. }
  614. string mem_key = std::to_string(session_id_);
  615. uint8_t *mem_base = MemManager::Instance(memory_type)->GetMemoryAddr(mem_key);
  616. if (mem_base == nullptr) {
  617. return nullptr;
  618. }
  619. uint8_t *mem_addr =
  620. logic_addr + reinterpret_cast<intptr_t>(mem_base) - VarManager::Instance(session_id_)->GetVarMemLogicBase();
  621. return mem_addr;
  622. }
  623. ge::Status VarManager::FreeVarMemory() {
  624. std::lock_guard<std::recursive_mutex> lock(mutex_);
  625. string memory_key = std::to_string(SessionId());
  626. return MemManager::Instance(RT_MEMORY_HBM)->FreeMemory(memory_key);
  627. }
  628. ge::Status VarManager::SetTransRoad(const std::string &var_name, const VarTransRoad &trans_road) {
  629. std::lock_guard<std::recursive_mutex> lock(mutex_);
  630. if (var_resource_ == nullptr) {
  631. GELOGW("VarManager has not been init.");
  632. return ge::INTERNAL_ERROR;
  633. }
  634. return var_resource_->SetTransRoad(var_name, trans_road);
  635. }
  636. VarTransRoad *VarManager::GetTransRoad(const std::string &var_name) {
  637. std::lock_guard<std::recursive_mutex> lock(mutex_);
  638. if (var_resource_ == nullptr) {
  639. GELOGW("VarManager has not been init.");
  640. return nullptr;
  641. }
  642. return var_resource_->GetTransRoad(var_name);
  643. }
  644. Status VarManager::SetChangedGraphId(const std::string &var_name, uint32_t graph_id) {
  645. std::lock_guard<std::recursive_mutex> lock(mutex_);
  646. if (var_resource_ == nullptr) {
  647. GELOGW("VarManager has not been init.");
  648. return INTERNAL_ERROR;
  649. }
  650. return var_resource_->SetChangedGraphId(var_name, graph_id);
  651. }
  652. Status VarManager::GetChangedGraphId(const std::string &var_name, uint32_t &graph_id) {
  653. std::lock_guard<std::recursive_mutex> lock(mutex_);
  654. if (var_resource_ == nullptr) {
  655. GELOGW("VarManager has not been init.");
  656. return INTERNAL_ERROR;
  657. }
  658. return var_resource_->GetChangedGraphId(var_name, graph_id);
  659. }
  660. Status VarManager::SetMemoryMallocSize(const map<string, string> &options) {
  661. auto it = options.find(GRAPH_MEMORY_MAX_SIZE);
  662. if (it == options.end()) {
  663. graph_mem_max_size_ = kGraphMemoryManagerMallocMaxSize;
  664. } else {
  665. string graph_memory_manager_malloc_max_size = it->second;
  666. ge::Status ret = ParseMemoryMallocSize(graph_memory_manager_malloc_max_size, graph_mem_max_size_);
  667. if (ret != SUCCESS) {
  668. GELOGE(ge::GE_GRAPH_OPTIONS_INVALID, "Parse graph memory manager malloc max size failed.");
  669. return ge::GE_GRAPH_OPTIONS_INVALID;
  670. }
  671. GELOGI("The max size for graph mem is set to %zu", graph_mem_max_size_);
  672. }
  673. it = options.find(VARIABLE_MEMORY_MAX_SIZE);
  674. if (it == options.end()) {
  675. var_mem_max_size_ = kMemoryVarManagerMallocSize;
  676. } else {
  677. string memory_var_manager_malloc_size = it->second;
  678. ge::Status ret = ParseMemoryMallocSize(memory_var_manager_malloc_size, var_mem_max_size_);
  679. if (ret != SUCCESS) {
  680. GELOGE(ge::GE_GRAPH_OPTIONS_INVALID, "Parse memory var manager malloc size failed.");
  681. return ge::GE_GRAPH_OPTIONS_INVALID;
  682. }
  683. }
  684. var_mem_logic_base_ = graph_mem_max_size_ + kGraphMemoryBuffer;
  685. if (var_mem_logic_base_ > kMaxMemorySize) {
  686. GELOGE(ge::GE_GRAPH_OPTIONS_INVALID, "kMemoryVarLogicBase : %zu can not exceed max memory size : %zu.",
  687. var_mem_logic_base_, kMaxMemorySize);
  688. return ge::GE_GRAPH_OPTIONS_INVALID;
  689. }
  690. use_max_mem_size_ = graph_mem_max_size_ + var_mem_max_size_;
  691. if (use_max_mem_size_ > kMaxMemorySize) {
  692. GELOGE(ge::GE_GRAPH_OPTIONS_INVALID, "kUseMaxMemorySize : %zu can not exceed max memory size : %zu.",
  693. use_max_mem_size_, kMaxMemorySize);
  694. return ge::GE_GRAPH_OPTIONS_INVALID;
  695. }
  696. GELOGI("Set memory malloc size successfully");
  697. return SUCCESS;
  698. }
  699. Status VarManager::ParseMemoryMallocSize(string &memory_size, size_t &result) {
  700. if (memory_size.empty()) {
  701. GELOGE(GE_GRAPH_OPTIONS_INVALID, "Memory malloc size input is empty.");
  702. return GE_GRAPH_OPTIONS_INVALID;
  703. }
  704. // split string by '*'
  705. vector<string> splits;
  706. std::istringstream str(memory_size);
  707. string str_split;
  708. while (getline(str, str_split, '*')) {
  709. splits.emplace_back(str_split);
  710. }
  711. result = 1;
  712. for (string split : splits) {
  713. // Trim
  714. auto it = split.find_first_not_of(" ");
  715. if (it != string::npos) {
  716. split.erase(0, it);
  717. }
  718. it = split.find_last_not_of(" ");
  719. if (it != string::npos) {
  720. split.erase(it + 1);
  721. }
  722. for (char c : split) {
  723. if (!isdigit(c)) {
  724. GELOGE(GE_GRAPH_OPTIONS_INVALID, "Memory malloc size input contains non digit.");
  725. return GE_GRAPH_OPTIONS_INVALID;
  726. }
  727. }
  728. uint64_t num = std::strtoul(split.c_str(), nullptr, 0);
  729. GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(result, static_cast<uint32_t>(num)),
  730. GELOGE(FAILED, "Input memory size is out of range.");
  731. return FAILED);
  732. if ((num > kMaxMemorySize) || (result * static_cast<size_t>(num) > kMaxMemorySize)) {
  733. GELOGE(FAILED, "Input memory size can not exceed max memory size : %zu.", kMaxMemorySize);
  734. return FAILED;
  735. }
  736. result *= static_cast<size_t>(num);
  737. }
  738. return SUCCESS;
  739. }
  740. void VarManager::RemoveChangedGraphId(const std::string &var_name) {
  741. std::lock_guard<std::recursive_mutex> lock(mutex_);
  742. if (var_resource_ == nullptr) {
  743. GELOGW("VarManager has not been init.");
  744. return;
  745. }
  746. var_resource_->RemoveChangedGraphId(var_name);
  747. }
  748. Status VarManager::SetAllocatedGraphId(const std::string &var_name, uint32_t graph_id) {
  749. std::lock_guard<std::recursive_mutex> lock(mutex_);
  750. if (var_resource_ == nullptr) {
  751. GELOGW("VarManager has not been init.");
  752. return INTERNAL_ERROR;
  753. }
  754. return var_resource_->SetAllocatedGraphId(var_name, graph_id);
  755. }
  756. Status VarManager::GetAllocatedGraphId(const std::string &var_name, uint32_t &graph_id) {
  757. std::lock_guard<std::recursive_mutex> lock(mutex_);
  758. if (var_resource_ == nullptr) {
  759. GELOGW("VarManager has not been init.");
  760. return INTERNAL_ERROR;
  761. }
  762. return var_resource_->GetAllocatedGraphId(var_name, graph_id);
  763. }
  764. void VarManager::RemoveAllocatedGraphId(const std::string &var_name) {
  765. std::lock_guard<std::recursive_mutex> lock(mutex_);
  766. if (var_resource_ == nullptr) {
  767. GELOGW("VarManager has not been init.");
  768. return;
  769. }
  770. var_resource_->RemoveAllocatedGraphId(var_name);
  771. }
  772. Status VarManager::GetAllVariables(std::map<std::string, GeTensorDesc> &all_variables) {
  773. std::lock_guard<std::recursive_mutex> lock(mutex_);
  774. if (var_resource_ == nullptr) {
  775. GELOGW("VarManager has not been inited.");
  776. return INTERNAL_ERROR;
  777. }
  778. auto new_variable_desc = var_resource_->GetAllVarDesc();
  779. if (new_variable_desc.size() == 0) {
  780. GELOGW("VarManager don't have variables.");
  781. return INTERNAL_ERROR;
  782. }
  783. for (auto iter = new_variable_desc.begin(); iter != new_variable_desc.end(); ++iter) {
  784. auto trans_road = var_resource_->GetTransRoad(iter->first);
  785. if (trans_road == nullptr || trans_road->empty()) {
  786. GELOGI("The variable %s does not have any trans road", iter->first.c_str());
  787. all_variables[iter->first] = iter->second;
  788. continue;
  789. }
  790. // get origin trans info : the first trans node info
  791. auto origin_trans_node_info = trans_road->at(0);
  792. all_variables[iter->first] = origin_trans_node_info.input;
  793. }
  794. return SUCCESS;
  795. }
  796. VarManagerPool::~VarManagerPool() { Destory(); }
  797. VarManagerPool &VarManagerPool::Instance() {
  798. static VarManagerPool var_manager_pool;
  799. return var_manager_pool;
  800. }
  801. void VarManagerPool::Destory() noexcept {
  802. std::lock_guard<std::mutex> lock(var_manager_mutex_);
  803. for (auto &it : var_manager_map_) {
  804. VarManager *var_manager = it.second;
  805. if (var_manager != nullptr) {
  806. var_manager->Destory();
  807. delete var_manager;
  808. var_manager = nullptr;
  809. }
  810. }
  811. var_manager_map_.clear();
  812. }
  813. ge::Status VarManagerPool::Init() const { return SUCCESS; }
  814. VarManager *VarManagerPool::GetVarManager(uint64_t session_id) {
  815. std::lock_guard<std::mutex> lock(var_manager_mutex_);
  816. auto it = var_manager_map_.find(session_id);
  817. if (it != var_manager_map_.end()) {
  818. GELOGD("VarManagerPool::GetVarManager");
  819. return it->second;
  820. }
  821. VarManager *var_manager = new (std::nothrow) VarManager(session_id);
  822. if (var_manager == nullptr) {
  823. GELOGE(INTERNAL_ERROR,
  824. "VarManager::Instance find session by "
  825. "session_id[%lu] failed.",
  826. session_id);
  827. static VarManager new_var_manager(0);
  828. return &new_var_manager;
  829. }
  830. var_manager_map_[session_id] = var_manager;
  831. return var_manager;
  832. }
  833. void VarManagerPool::RemoveVarManager(uint64_t session_id) {
  834. VarManager *var_manager = nullptr;
  835. {
  836. std::lock_guard<std::mutex> lock(var_manager_mutex_);
  837. auto it = var_manager_map_.find(session_id);
  838. if (it != var_manager_map_.end()) {
  839. var_manager = it->second;
  840. var_manager_map_.erase(it);
  841. }
  842. }
  843. if (var_manager != nullptr) {
  844. var_manager->Destory();
  845. delete var_manager;
  846. var_manager = nullptr;
  847. }
  848. }
  849. } // namespace ge

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示