/** * Copyright 2019-2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include "mmpa/mmpa_api.h" #include "common/debug/log.h" #include "common/debug/memory_dumper.h" #include "common/types.h" #include "common/util.h" #include "common/string_util.h" #include "common/properties_manager.h" #include "common/model_parser/base.h" #include "graph/model.h" #include "cce/dnn.h" #include "ge/ge_api_types.h" #include "framework/common/ge_types.h" #include "graph/utils/op_desc_utils.h" #include "common/profiling/profiling_manager.h" using domi::domiTensorFormat_t; using namespace cce; using namespace ge; struct PROC_PARAM { uint8_t *model_name; // ISV Ek buffer uint8_t *model_key; uint32_t model_key_len; // ISV root certificate buffer uint8_t *root_cert; uint32_t root_cert_len; // ISV private key buffer uint8_t *pri_key; uint32_t pri_key_len; // Raw AI Module Image buffer uint8_t *ai_image; uint32_t ai_image_len; // ISV HW key buffer uint8_t *hw_key; uint32_t hw_key_len; }; #ifdef __cplusplus extern "C" { #endif using namespace ge; namespace { const char FMK_STATUS_FILE_DIR_ENV[] = "FMK_STATUS_FILE_DIR"; const char JOBSTATE_FILE_NAME[] = "jobstateupdate_framework"; const char HCOM_DETECT_FILE_NAME[] = "hcom_detection_result"; const char FILE_SEPARATE[] = "/"; } // namespace #ifdef __cplusplus } #endif namespace ge { struct GeModelPartition { ModelPartitionType type_ = MODEL_DEF; uint8_t *data_ = nullptr; size_t size_ = 0; GeModelPartition() = default; GeModelPartition(const GeModelPartition &partition){}; GeModelPartition &operator=(const GeModelPartition &partition) = delete; ~GeModelPartition() { if (data_ != nullptr) { delete[] data_; data_ = nullptr; } } Status SetData(uint8_t *data, size_t size) { size_ = size; data_ = new (std::nothrow) uint8_t[size](); errno_t err; err = memcpy_s(data_, size_, data, size); if (err) { GELOGE(ge::FAILED, "[GeModel Partition] Error occur when copy GeModel Partition data."); return FAILED; } return SUCCESS; } Status SetType(ModelPartitionType type) { type_ = type; return SUCCESS; } }; struct OmFileContext { vector partition_datas_; vector partition_table_; uint32_t model_data_len_; }; class SubGraphInfo; using SubGraphInfoPtr = std::shared_ptr; using GeModelPartitionPtr = std::shared_ptr; using ModelPtr = std::shared_ptr; class GeModel { public: explicit GeModel(const ModelPtr &model_ptr); ~GeModel() = default; GeModel(const GeModel &other) = delete; GeModel &operator=(const GeModel &other) = delete; ModelPtr GetModelPtr() const; Status AddPartition(uint8_t *data, size_t size, ModelPartitionType type); Status GetPartition(ModelPartitionType type, GeModelPartitionPtr &partition); uint8_t GetPlatformType() const; void SetPlatformType(const uint8_t platform_type) { platform_type_ = platform_type; } private: std::map partitions_; ModelPtr model_ = nullptr; uint8_t platform_type_ = {0}; }; using GeModelPtr = std::shared_ptr; GeModel::GeModel(const ModelPtr &model_ptr) { this->model_ = model_ptr; } ModelPtr GeModel::GetModelPtr() const { return this->model_; } uint8_t GeModel::GetPlatformType() const { return platform_type_; } Status GeModel::AddPartition(uint8_t *data, size_t size, ModelPartitionType type) { if (size == 0) { return FAILED; } if (data == nullptr) { return FAILED; } auto iter = partitions_.find(type); if (iter != partitions_.end()) { return FAILED; } GeModelPartitionPtr partition = nullptr; GE_MAKE_SHARED(partition = std::make_shared(), return FAILED); Status ret = partition->SetType(type); if (ret != SUCCESS) { return FAILED; } ret = partition->SetData(data, size); if (ret != SUCCESS) { return FAILED; } partitions_.insert(std::pair(type, partition)); return SUCCESS; } Status GeModel::GetPartition(ModelPartitionType type, GeModelPartitionPtr &partition) { auto iter = partitions_.find(type); if (iter == partitions_.end()) { return FAILED; } partition = iter->second; return SUCCESS; } class OmFileSaveHelper { public: OmFileSaveHelper(); ~OmFileSaveHelper(); vector &GetModelPartitions(); ModelPartitionTable *GetPartitionTable(); ModelFileHeader model_header_; ModelFileHeader &GetModelFileHeader() { return model_header_; } void AddPartition(GeModelPartition &partition); private: OmFileContext context_; }; OmFileSaveHelper::OmFileSaveHelper() {} OmFileSaveHelper::~OmFileSaveHelper() {} vector &OmFileSaveHelper::GetModelPartitions() { static std::vector tmp; return tmp; } ModelPartitionTable *OmFileSaveHelper::GetPartitionTable() { return nullptr; } FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void OmFileSaveHelper::AddPartition(GeModelPartition &partition) { context_.partition_datas_.push_back(partition); context_.model_data_len_ += partition.size_; } class ModelBuilder { public: ModelBuilder(ge::ComputeGraphPtr compute_graph, const std::vector &subgraphs, const std::map &stream_max_parallel_num, bool hcom_parallel, int mode); virtual ~ModelBuilder(); Status BuildModel(ge::Model &model_def); Status SaveWeightsToModel(ge::Model &model); Status SaveDataToModel(ge::Model &model, ge::GeModel &ge_model); Status PreBuildModel(); Status BuildModelForGetTask(ge::Model &model_def); ge::Buffer GetWeightBuffer() const; void SetModelVersion(ge::Model &model_def); public: ge::Buffer weight_buffer_; }; ModelBuilder::ModelBuilder(ge::ComputeGraphPtr compute_graph, const std::vector &subgraphs, const std::map &stream_max_parallel_num, bool hcom_parallel, int mode) { weight_buffer_ = ge::Buffer(4100000); } ModelBuilder::~ModelBuilder() {} Status ModelBuilder::SaveWeightsToModel(ge::Model &model) { return SUCCESS; } Status ModelBuilder::BuildModel(ge::Model &model_def) { return SUCCESS; } Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { return SUCCESS; } Status ModelBuilder::PreBuildModel() { return SUCCESS; } Status ModelBuilder::BuildModelForGetTask(ge::Model &model_def) { return SUCCESS; } void ModelBuilder::SetModelVersion(ge::Model &model_def) { return; } ge::Buffer ModelBuilder::GetWeightBuffer() const { return ge::Buffer(4100000); } } // namespace ge using ProcParam = struct PROC_PARAM; namespace ge { #include FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NCHW_DIM_N = 0; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NCHW_DIM_C = 1; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NCHW_DIM_H = 2; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NCHW_DIM_W = 3; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NHWC_DIM_N = 0; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NHWC_DIM_H = 1; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NHWC_DIM_W = 2; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY extern const uint32_t NHWC_DIM_C = 3; const uint32_t MODEL_FILE_MAGIC_NUM = 0x444F4D49; const uint32_t MODEL_FILE_HEAD_LEN = 256; const uint32_t MODEL_VERSION = 0x10000000; const int MAX_FILE_SIZE_LIMIT = INT_MAX; bool FC_WEIGHT_COMPRESS_FLAG = false; bool ReadBytesFromBinaryFile(const char *file_name, char **buffer, int &length) { length = 10; *buffer = new (std::nothrow) char[10](); GE_CHK_BOOL_TRUE_EXEC_RET_STATUS(*buffer == nullptr, false, "new an object failed."); return true; } bool ReadProtoFromText(const char *file, google::protobuf::Message *message) { GE_CHK_BOOL_TRUE_EXEC_WITH_LOG((nullptr == file || nullptr == message), return false, "incorrect parameter. nullptr == file || nullptr == message"); string real_path = RealPath(file); GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(real_path.empty(), return false, "proto file path '%s' not valid", file); GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(GetFileLength(real_path.c_str()) == -1, return false, "file size not valid."); std::ifstream fs(real_path.c_str(), std::ifstream::in); if (!fs.is_open()) { GELOGE(ge::FAILED, "proto file '%s' open fail.", file); return false; } google::protobuf::io::IstreamInputStream input(&fs); bool ret = google::protobuf::TextFormat::Parse(&input, message); GE_IF_BOOL_EXEC(ret != true, GELOGI("call [google::protobuf::TextFormat::Parse] func ret fail, please check your text file.")); fs.close(); return ret; } uint64_t GetCurrentTimestap() { return 0; } // get length of file long GetFileLength(const std::string &input_file) { GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(input_file.empty(), return -1, "input_file path is null."); string real_path = RealPath(input_file.c_str()); GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(real_path.empty(), return -1, "input_file path '%s' not valid", input_file.c_str()); unsigned long long file_length = 0; GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(mmGetFileSize(input_file.c_str(), &file_length) != EN_OK, return -1, "open file failed."); GE_CHK_BOOL_TRUE_EXEC_WITH_LOG((file_length <= 0), return -1, "file length <= 0, not valid."); GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(file_length > MAX_FILE_SIZE_LIMIT, return -1, "file size %ld is out of limit: %d.", file_length, MAX_FILE_SIZE_LIMIT); return file_length; } string RealPath(const char *path) { string s = path; if (s.size() >= PATH_MAX) { return ""; } if (s == "." || s == "1") { return path; // for insert_aipp_op unittest } else if (s.substr(0, 3) == "llt") { return path; } else { return "22"; } } bool CheckInputPathValid(const string &file_path) { return true; } bool ReadProtoFromArray(const void *data, int size, Message *proto) { return true; } struct ModelPartition { ModelPartitionType type; uint8_t *data = 0; uint32_t size = 0; }; class InsertNewOpUtil { public: InsertNewOpUtil(); ~InsertNewOpUtil(); Status InsertNewOps(const ComputeGraphPtr &graph); Status InsertAippOps(ge::ComputeGraphPtr graph, std::string &aipp_config_path); Status Parse(const char *conf_path); }; InsertNewOpUtil::InsertNewOpUtil() {} Status InsertNewOpUtil::InsertNewOps(const ComputeGraphPtr &graph) { return SUCCESS; } Status InsertNewOpUtil::InsertAippOps(ge::ComputeGraphPtr graph, std::string &aipp_config_path) { return SUCCESS; } Status InsertNewOpUtil::Parse(const char *conf_path) { return SUCCESS; } Status InitOME() { return SUCCESS; } class GraphOptimizer { public: Status Optimize(); Status OptimizeAfterCal(); Status AdjustDataOpDesc(); Status InsertTransOp(); Status FusionFmkop(); Status Optimize4Cloud(); Status Optimize4FlowCtrl(); Status OptimizeBeforeBuild(); }; Status GraphOptimizer::Optimize() { return SUCCESS; } Status Init(Options options) { return SUCCESS; } Status Shutdown(Options options) { return SUCCESS; } class Session { public: // singleton static Session *Instance(); const uint32_t &DeviceId() const; }; const uint32_t &Session::DeviceId() const { return 0; } Session *Session::Instance() { static Session instance; return &instance; } struct OmgContext { domiTensorFormat_t format; // get input format from cmd std::unordered_map input_nodes_format_map; std::vector output_formats; // user-designate input dims std::vector>> user_input_dims; // global input dims std::unordered_map> input_dims; // solve rename op e.g: Detectionoutput:SsdDetectiontOutput std::map op_conf_map; // save output node of network: key is op name, value = index, index is the output index of op std::map> out_nodes_map; // user-designate out nodes (this is used for determing the orders) std::vector> user_out_nodes; // save the path of cutsom_aicpu std::vector aicpu_op_run_paths; // save ddk std::string ddk_version; // save format domiTensorFormat_t net_format; FrameworkType type; // RunMode run_mode; bool train_flag = false; std::string output_type; /// save the name of network /// eg:faster-rcnn, based on FirstStageProcessor after scope_fusion is faster-rcnn /// then reorder conv+reshape of FirstStageBoxPredictor/BoxEncodingPredictor /// need to delete op of reshape std::string net_name; }; } // namespace ge namespace domi { ge::OmgContext &GetContext() { static ge::OmgContext tmp; return tmp; } } // namespace domi namespace ge { class OpUtils { public: static Status InitTensorDescriptor(const GeTensorDesc &tensor, ccTensorDescriptor_t &cc_tensor); static Status InitTensorDescriptor(int32_t format, int32_t data_type, const std::vector &dim, ccTensorDescriptor_t &cc_tensor, uint32_t real_dim_cnt); static void DestroyTensorDescriptor(ccTensorDescriptor_t &cc_tensor); }; Status OpUtils::InitTensorDescriptor(const GeTensorDesc &tensor, ccTensorDescriptor_t &cc_tensor) { ccCreatePoolingMaskDescriptor(&cc_tensor); return SUCCESS; } Status OpUtils::InitTensorDescriptor(int32_t format, int32_t data_type, const std::vector &dim, ccTensorDescriptor_t &cc_tensor, uint32_t real_dim_cnt) { Status ret = SUCCESS; return ret; } class FileSaver { public: Status SaveToFile(const string &file_path, ModelFileHeader &model_file_header, ModelPartitionTable &model_partition_table, const std::vector &partition_datas); Status SaveToFileWithEncrypt(const std::string file_path, const ProcParam proc_param, const ModelFileHeader *model_file_header, bool check_sum); }; Status FileSaver::SaveToFile(const string &file_path, ModelFileHeader &model_file_header, ModelPartitionTable &model_partition_table, const std::vector &partition_datas) { return SUCCESS; } Status FileSaver::SaveToFileWithEncrypt(const std::string file_path, const ProcParam proc_param, const ModelFileHeader *model_file_header, bool check_sum) { return SUCCESS; } class ModelSaver : public FileSaver {}; FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void OpUtils::DestroyTensorDescriptor( ccTensorDescriptor_t &cc_tensor) { if (nullptr != cc_tensor) { ccStatus_t ret = ccDestroyTensorDescriptor(&cc_tensor); GE_LOGE_IF(CC_STATUS_SUCCESS != ret, "ccDestroyTensorDescriptor failed. ret = %d", ret); cc_tensor = nullptr; } } } // namespace ge namespace domi { class OpRegistrationData {}; class OpRegistry { public: static OpRegistry *Instance(); std::vector registration_datas; ImplyType GetImplyType(const std::string &op_type); void GetOpTypeByImplyType(std::vector &vec_op_type, const ImplyType &imply_type); }; OpRegistry *OpRegistry::Instance() { static OpRegistry instance; return &instance; } void OpRegistry::GetOpTypeByImplyType(std::vector &vec_op_type, const ImplyType &imply_type) { if (imply_type == ImplyType::AI_CPU) { vec_op_type.push_back("square"); } } class OpRegistrationTbe { public: static OpRegistrationTbe *Instance(); bool Finalize(OpRegistrationData ®_data, bool is_train); }; OpRegistrationTbe *OpRegistrationTbe::Instance() { static OpRegistrationTbe instance; return &instance; } bool OpRegistrationTbe::Finalize(OpRegistrationData ®_data, bool is_train) { return true; } } // namespace domi namespace ge { class GraphPrepare { private: Status OptimizeForPreprocess(ge::ComputeGraphPtr &compute_graph); }; Status GraphPrepare::OptimizeForPreprocess(ge::ComputeGraphPtr &compute_graph) { return SUCCESS; } } // namespace ge namespace ge { Status GetOriginalType(const ge::NodePtr &node, string &type) { type = node->GetType(); GE_IF_BOOL_EXEC(type != FRAMEWORKOP, return SUCCESS); ge::AttrUtils::GetStr(node->GetOpDesc(), "original_type", type); return SUCCESS; } Status SetCycleEvent(const ge::NodePtr &node) { return SUCCESS; } Status SetStreamLabel(const ge::NodePtr &node, const std::string &label) { GE_CHECK_NOTNULL(node); OpDescPtr tmp_desc = AttrUtils::CloneOpDesc(node->GetOpDesc()); GE_CHECK_NOTNULL(tmp_desc); if (!AttrUtils::SetStr(tmp_desc, "_stream_label", label)) { GELOGE(ge::FAILED, "Op :%s set ATTR_NAME_STREAM_LABEL failed", node->GetName().c_str()); return FAILED; } return SUCCESS; } Status SetActiveLabelList(const ge::NodePtr &node, const std::vector &label) { GE_CHECK_NOTNULL(node); OpDescPtr tmp_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(tmp_desc); // add list of active_label if (!AttrUtils::SetListStr(tmp_desc, "_active_label", label)) { GELOGE(ge::FAILED, "Op: %s set ATTR_NAME_ACTIVE_LABEL_LIST failed", node->GetName().c_str()); return FAILED; } return SUCCESS; } Status SetSwitchBranchNodeLabel(const ge::NodePtr &node, const std::string &branch_label) { GE_CHECK_NOTNULL(node); OpDescPtr tmp_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(tmp_desc); // add branch_label of switch if (!AttrUtils::SetStr(tmp_desc, "_switch_branch_node_label", branch_label)) { GELOGE(ge::FAILED, "Op :%s set ATTR_NAME_SWITCH_BRANCH_NODE_LABEL failed", node->GetName().c_str()); return FAILED; } return SUCCESS; } Status SetSwitchTrueBranchFlag(const ge::NodePtr &node, bool value) { GE_CHECK_NOTNULL(node); OpDescPtr tmp_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(tmp_desc); // add switch_true_branch_flag if (!AttrUtils::SetBool(tmp_desc, "_switch_true_branch_flag", value)) { GELOGE(ge::FAILED, "Op :%s set ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG failed", node->GetName().c_str()); return FAILED; } return SUCCESS; } Status SetOriginalNodeName(const ge::NodePtr &node, const std::string &orig_name) { GE_CHECK_NOTNULL(node); OpDescPtr tmp_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(tmp_desc); // record original_node_name if (!AttrUtils::SetStr(tmp_desc, "_original_node_name", orig_name)) { GELOGE(ge::FAILED, "Op :%s set ATTR_NAME_ORIG_NODE_NAME failed", node->GetName().c_str()); return FAILED; } return SUCCESS; } Status SetCyclicDependenceFlag(const ge::NodePtr &node) { GE_CHECK_NOTNULL(node); OpDescPtr tmp_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(tmp_desc); // add cyclic_dependence_flag if (!AttrUtils::SetBool(tmp_desc, "_cyclic_dependence_flag", true)) { GELOGE(ge::FAILED, "Op :%s set ATTR_NAME_CYCLIC_DEPENDENCE_FLAG failed", node->GetName().c_str()); return FAILED; } return SUCCESS; } Status SetNextIteration(const ge::NodePtr &node, const std::string &next) { GE_CHECK_NOTNULL(node); OpDescPtr tmp_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(tmp_desc); if (!AttrUtils::SetStr(tmp_desc, "_next_iteration_node", next)) { GELOGE(ge::FAILED, "Op: %s set ATTR_NAME_NEXT_ITERATION failed", node->GetName().c_str()); return FAILED; } return SUCCESS; } } // namespace ge namespace cce { bool ccGetFuncState(ccFuncParamType_t type) { return true; } } // namespace cce namespace ge { Status UnloadModel(uint32_t model_id) { return SUCCESS; } Status GetInputOutputDescInfo(uint32_t model_id, vector &input_desc, vector &output_desc) { return SUCCESS; } Status DataInput(const InputData *input_data, OutputData *output_data) { return SUCCESS; } /* class ModelManager { public: static std::shared_ptr GetInstance(); static void FinalizeForPtr(ModelManager *) {} Status DataInputTensor(uint32_t model_id, const std::vector &inputs, std::vector &outputs); Status DataInput(const InputData &input_data, OutputData &output_data); Status GetInputOutputDescInfo(const uint32_t model_id, std::vector &input_desc, std::vector &output_desc); Status GetInputOutputDescInfo(const uint32_t model_id, std::vector &input_desc, std::vector &output_desc, std::vector &input_formats, std::vector &output_formats); Status GetInputOutputDescInfoForZeroCopy(const uint32_t model_id, std::vector &input_desc, std::vector &output_desc, std::vector &input_formats, std::vector &output_formats); Status Stop(uint32_t model_id); Status Unload(uint32_t model_id); Status LoadModelOnline(uint32_t &model_id, std::shared_ptr &model, std::shared_ptr listener); Status Start(uint32_t model_id); Status GetMaxUsedMemory(const uint32_t model_id, uint64_t &max_size); Status LoadModelOffline(uint32_t &model_id, const ModelData &model, std::shared_ptr listener = nullptr, void *dev_ptr = nullptr, size_t mem_size = 0, void *weight_ptr = nullptr, size_t weight_size = 0); Status LoadModelWithQ(uint32_t &model_id, const ModelData &model_data, const std::vector &input_queue_ids, const std::vector &output_queue_ids); Status HandleCommand(const Command &command); Status ExecuteModel(uint32_t model_id, rtStream_t stream, bool async_mode, const InputData &input_data, OutputData &output_data); void DestroyAicpuSession(uint64_t session_id); }; void ModelManager::DestroyAicpuSession(uint64_t session_id) {} std::shared_ptr ModelManager::GetInstance() { static std::shared_ptr instance_ptr = shared_ptr(new ModelManager(), ModelManager::FinalizeForPtr); return instance_ptr; } Status ModelManager::DataInputTensor(uint32_t model_id, const std::vector &inputs, std::vector &outputs) { return SUCCESS; } Status ModelManager::DataInput(const InputData &input_data, OutputData &output_data) { return SUCCESS; } Status ModelManager::GetInputOutputDescInfo(const uint32_t model_id, std::vector &input_desc, std::vector &output_desc, std::vector &input_formats, std::vector &output_formats) { return SUCCESS; } Status ModelManager::GetInputOutputDescInfo(const uint32_t model_id, std::vector &input_desc, std::vector &output_desc) { return SUCCESS; } Status ModelManager::GetInputOutputDescInfoForZeroCopy(const uint32_t model_id, std::vector &input_desc, std::vector &output_desc, std::vector &input_formats, std::vector &output_formats) { return SUCCESS; } Status ModelManager::Stop(uint32_t model_id) { return SUCCESS; } Status ModelManager::Unload(uint32_t model_id) { return SUCCESS; } Status ModelManager::LoadModelOnline(uint32_t &model_id, std::shared_ptr &model, std::shared_ptr listener) { return SUCCESS; } Status ModelManager::Start(uint32_t model_id) { return SUCCESS; } Status ModelManager::GetMaxUsedMemory(const uint32_t model_id, uint64_t &max_size) { return SUCCESS; } Status ModelManager::LoadModelOffline(uint32_t &model_id, const ModelData &model, shared_ptr listener, void *dev_ptr, size_t mem_size, void *weight_ptr, size_t weight_size) { return SUCCESS; } Status ModelManager::LoadModelWithQ(uint32_t &model_id, const ModelData &model_data, const std::vector &input_queue_ids, const std::vector &output_queue_ids) { return SUCCESS; } Status ModelManager::HandleCommand(const Command &command) { return SUCCESS; } Status ModelManager::ExecuteModel(uint32_t model_id, rtStream_t stream, bool async_mode, const InputData &input_data, OutputData &output_data) { return SUCCESS; } */ } // namespace ge namespace ge { enum JobState { JOBSTATE_WAITING = 1, JOBSTATE_RUNNING, JOBSTATE_KILLING, JOBSTATE_SUCCEED, JOBSTATE_FAILED, JOBSTATE_KILLED, JOBSTATE_UNKOWN }; enum JobSubState { JOBSUBSTATE_ENV_INIT = 201, JOBSUBSTATE_ENV_FIN, JOBSUBSTATE_RESOUCE_ALLOC, JOBSUBSTATE_MODEL_COMPILE, JOBSUBSTATE_GRAPH_PREPARE, JOBSUBSTATE_GRAPH_SPLIT, JOBSUBSTATE_GRAPH_OPTIMIZE, JOBSUBSTATE_GRAPH_BUILD, JOBSUBSTATE_GRAPH_LOAD, JOBSUBSTATE_GRAPH_EXEC, JOBSUBSTATE_GRAPH_UNLOAD, JOBSUBSTATE_OTHER }; enum ErrorModule { ERROR_MODULE_DRIVER = 0x01, ERROR_MODULE_RUNTIME = 0x04, ERROR_MODULE_CCE = 0x06, ERROR_MODULE_FMK = 0x08, ERROR_MODULE_HCCL = 0x12 }; class CsaInteract { public: CsaInteract &GetInstance(); void WriteErrorCode(uint32_t module_ret_errcode, ErrorModule error_module, JobSubState job_sub_state); void Init(int32_t dev_index, int64_t job_id); Status WriteJobState(JobState job_state, JobSubState job_sub_state = JOBSUBSTATE_OTHER, uint32_t module_ret_errcode = SUCCESS, ErrorModule error_module = ERROR_MODULE_FMK); // device index int32_t dev_index_; // job id int64_t job_id_; // is initialization complete bool is_init_; // current job state JobState curr_state_; // job state file std::string job_state_file_; // network connectivity detect file std::string hcom_detect_file_; // identification of internal errors that occurred during the training bool is_have_internal_error_; }; CsaInteract &CsaInteract::GetInstance() { static CsaInteract instance; return instance; } void CsaInteract::Init(int32_t dev_index, int64_t job_id) { if (!is_init_) { dev_index_ = dev_index; job_id_ = job_id; string csa_path_prefix; if (std::getenv(FMK_STATUS_FILE_DIR_ENV) != nullptr) { csa_path_prefix = std::getenv(FMK_STATUS_FILE_DIR_ENV); } if (!csa_path_prefix.empty()) { std::string job_state_file = csa_path_prefix + std::to_string(dev_index_) + FILE_SEPARATE + JOBSTATE_FILE_NAME; std::string hcom_detect_file = csa_path_prefix + std::to_string(dev_index_) + FILE_SEPARATE + HCOM_DETECT_FILE_NAME; job_state_file_ = RealPath(job_state_file.c_str()); hcom_detect_file_ = RealPath(hcom_detect_file.c_str()); } is_init_ = true; } } void CsaInteract::WriteErrorCode(uint32_t module_ret_errcode, ErrorModule error_module, JobSubState job_sub_state) {} } // namespace ge Status ModelParserBase::LoadFromFile(const char *model_path, const char *key, int32_t priority, ge::ModelData &model_data) { return SUCCESS; } Status CsaInteract::WriteJobState(JobState job_state, JobSubState job_sub_state, uint32_t module_ret_errcode, ErrorModule error_module) { return SUCCESS; } namespace ge { static std::map data_type_to_length = { {DT_BOOL, sizeof(bool)}, {DT_INT64, sizeof(int64_t)}, {DT_UINT64, sizeof(int64_t)}, {DT_FLOAT, sizeof(float)}, {DT_INT32, sizeof(int32_t)}, {DT_UINT32, sizeof(int32_t)}, {DT_INT8, sizeof(char)}, {DT_UINT8, sizeof(char)}, {DT_INT16, sizeof(int16_t)}, {DT_UINT16, sizeof(int16_t)}, {DT_FLOAT16, sizeof(int16_t)}, {DT_DOUBLE, sizeof(double)}, }; class TypeUtils { public: static bool GetDataTypeLength(ge::DataType data_type, uint32_t &length); static bool CheckUint64MulOverflow(uint64_t a, uint32_t b); }; bool TypeUtils::GetDataTypeLength(ge::DataType data_type, uint32_t &length) { auto it = data_type_to_length.find(data_type); if (it != data_type_to_length.end()) { length = it->second; return true; } else { return false; } } bool TypeUtils::CheckUint64MulOverflow(uint64_t a, uint32_t b) { // Not overflow if (a == 0) { return false; } if ((ULLONG_MAX / a) >= b) { return false; } return true; } } // namespace ge