From: @yskhhh Reviewed-by: @xchu42,@wqtshg,@ji_chen Signed-off-by: @ji_chentags/v1.2.0
| @@ -24,6 +24,7 @@ set(SRC_LIST | |||||
| "helper/om_file_helper.cc" | "helper/om_file_helper.cc" | ||||
| "helper/model_helper.cc" | "helper/model_helper.cc" | ||||
| "../model/ge_model.cc" | "../model/ge_model.cc" | ||||
| "../model/ge_root_model.cc" | |||||
| "auth/file_saver.cc" | "auth/file_saver.cc" | ||||
| "fp16_t.cc" | "fp16_t.cc" | ||||
| "math/fp16_math.cc" | "math/fp16_math.cc" | ||||
| @@ -258,6 +258,65 @@ FileSaver::SaveToFile(const string &file_path, ModelFileHeader &file_header, Mod | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status | |||||
| FileSaver::SaveToFile(const string &file_path, ModelFileHeader &file_header, | |||||
| vector<ModelPartitionTable *> &model_partition_tables, | |||||
| const vector<vector<ModelPartition>> &all_partition_datas) { | |||||
| file_header.is_encrypt = ModelEncryptType::UNENCRYPTED; | |||||
| const Status ret = SaveWithFileHeader(file_path, file_header, model_partition_tables, all_partition_datas); | |||||
| GE_CHK_BOOL_RET_STATUS(ret == SUCCESS, FAILED, "save file failed, file_path:%s, file header len:%u.", | |||||
| file_path.c_str(), file_header.length); | |||||
| return SUCCESS; | |||||
| } | |||||
| Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, | |||||
| vector<ModelPartitionTable *> &model_partition_tables, | |||||
| const vector<vector<ModelPartition>> &all_partition_datas) { | |||||
| GE_CHK_BOOL_EXEC(model_partition_tables.size() == all_partition_datas.size(), | |||||
| return PARAM_INVALID, | |||||
| "model table size %zu does not match partition size %zu", | |||||
| model_partition_tables.size(), all_partition_datas.size()) | |||||
| for (size_t index = 0; index < model_partition_tables.size(); ++index) { | |||||
| auto &cur_partiton_data = all_partition_datas[index]; | |||||
| auto &cur_model_partition_table = *model_partition_tables[index]; | |||||
| GE_CHK_BOOL_RET_STATUS(!cur_partiton_data.empty() && cur_model_partition_table.num != 0 | |||||
| && cur_model_partition_table.num == cur_partiton_data.size(), FAILED, | |||||
| "Invalid param:partition data size is (%u), model_partition_table.num is (%zu).", | |||||
| cur_model_partition_table.num, cur_partiton_data.size()); | |||||
| } | |||||
| // Open file | |||||
| int32_t fd = 0; | |||||
| GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(OpenFile(fd, file_path) != SUCCESS, return FAILED); | |||||
| Status ret = SUCCESS; | |||||
| do { | |||||
| // Write file header | |||||
| GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
| WriteData(static_cast<const void *>(&file_header), sizeof(ModelFileHeader), fd) != SUCCESS, ret = FAILED; | |||||
| break); | |||||
| for (size_t index = 0; index < model_partition_tables.size(); ++index) { | |||||
| // Write model partition table | |||||
| auto &cur_tabel = *model_partition_tables[index]; | |||||
| uint32_t table_size = static_cast<uint32_t>(SIZE_OF_MODEL_PARTITION_TABLE(cur_tabel)); | |||||
| GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
| WriteData(static_cast<const void *>(&cur_tabel), table_size, fd) != SUCCESS, ret = FAILED; break); | |||||
| // Write partition data | |||||
| auto &cur_partition_datas = all_partition_datas[index]; | |||||
| for (const auto &partition_data : cur_partition_datas) { | |||||
| GELOGI("GC:size[%zu]", partition_data.size); | |||||
| GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
| WriteData(static_cast<const void *>(partition_data.data), partition_data.size, fd) != SUCCESS, ret = FAILED; | |||||
| break); | |||||
| } | |||||
| } | |||||
| } while (0); | |||||
| // Close file | |||||
| GE_CHK_BOOL_RET_STATUS(mmClose(fd) == EN_OK, FAILED, "Close file failed."); | |||||
| return ret; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(const string &file_path, const void *data, | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(const string &file_path, const void *data, | ||||
| int len) { | int len) { | ||||
| if (data == nullptr || len <= 0) { | if (data == nullptr || len <= 0) { | ||||
| @@ -74,6 +74,10 @@ class FileSaver { | |||||
| ModelPartitionTable &model_partition_table, | ModelPartitionTable &model_partition_table, | ||||
| const std::vector<ModelPartition> &partition_datas); | const std::vector<ModelPartition> &partition_datas); | ||||
| static Status SaveToFile(const string &file_path, ModelFileHeader &file_header, | |||||
| vector<ModelPartitionTable *> &model_partition_tables, | |||||
| const vector<vector<ModelPartition>> &all_partition_datas); | |||||
| static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | ||||
| ModelPartitionTable &model_partition_table, | ModelPartitionTable &model_partition_table, | ||||
| const std::vector<ModelPartition> &partitionDatas, | const std::vector<ModelPartition> &partitionDatas, | ||||
| @@ -108,6 +112,9 @@ class FileSaver { | |||||
| static Status SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, | static Status SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, | ||||
| ModelPartitionTable &model_partition_table, | ModelPartitionTable &model_partition_table, | ||||
| const std::vector<ModelPartition> &partition_datas); | const std::vector<ModelPartition> &partition_datas); | ||||
| static Status SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, | |||||
| vector<ModelPartitionTable *> &model_partition_tables, | |||||
| const vector<vector<ModelPartition>> &all_partition_datas); | |||||
| }; | }; | ||||
| } // namespace ge | } // namespace ge | ||||
| #endif // GE_COMMON_AUTH_FILE_SAVER_H_ | #endif // GE_COMMON_AUTH_FILE_SAVER_H_ | ||||
| @@ -7,6 +7,7 @@ GE_COMMON_LOCAL_SRC_FILES := \ | |||||
| helper/om_file_helper.cc \ | helper/om_file_helper.cc \ | ||||
| helper/model_helper.cc \ | helper/model_helper.cc \ | ||||
| ../model/ge_model.cc \ | ../model/ge_model.cc \ | ||||
| ../model/ge_root_model.cc \ | |||||
| auth/file_saver.cc \ | auth/file_saver.cc \ | ||||
| fp16_t.cc \ | fp16_t.cc \ | ||||
| math/fp16_math.cc \ | math/fp16_math.cc \ | ||||
| @@ -32,6 +32,7 @@ using domi::ModelTaskDef; | |||||
| namespace { | namespace { | ||||
| const int64_t kOriginalOmPartitionNum = 1; | const int64_t kOriginalOmPartitionNum = 1; | ||||
| const uint32_t kStatiOmFileModelNum = 1; | |||||
| } | } | ||||
| @@ -39,7 +40,7 @@ namespace ge { | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelHelper::~ModelHelper() { (void)ReleaseLocalModelData(); } | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelHelper::~ModelHelper() { (void)ReleaseLocalModelData(); } | ||||
| Status ModelHelper::SaveModelPartition(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, ModelPartitionType type, | Status ModelHelper::SaveModelPartition(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, ModelPartitionType type, | ||||
| const uint8_t *data, size_t size) { | |||||
| const uint8_t *data, size_t size, size_t model_index) { | |||||
| if (size < 1 || size > UINT32_MAX) { | if (size < 1 || size > UINT32_MAX) { | ||||
| GELOGE(PARAM_INVALID, "Add model partition failed, partition size %zu invalid", size); | GELOGE(PARAM_INVALID, "Add model partition failed, partition size %zu invalid", size); | ||||
| if (size > UINT32_MAX) { | if (size > UINT32_MAX) { | ||||
| @@ -68,25 +69,16 @@ Status ModelHelper::SaveModelPartition(std::shared_ptr<OmFileSaveHelper> &om_fil | |||||
| partition_model.data = const_cast<uint8_t *>(data); | partition_model.data = const_cast<uint8_t *>(data); | ||||
| partition_model.size = static_cast<uint32_t>(size); | partition_model.size = static_cast<uint32_t>(size); | ||||
| partition_model.type = type; | partition_model.type = type; | ||||
| if (om_file_save_helper->AddPartition(partition_model) != SUCCESS) { | |||||
| if (om_file_save_helper->AddPartition(partition_model, model_index) != SUCCESS) { | |||||
| GELOGE(PARAM_INVALID, "Add model partition failed, partition size %zu", size); | GELOGE(PARAM_INVALID, "Add model partition failed, partition size %zu", size); | ||||
| return PARAM_INVALID; | return PARAM_INVALID; | ||||
| } | } | ||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmModel(const GeModelPtr &ge_model, | |||||
| const SaveParam &save_param, | |||||
| const std::string &output_file, | |||||
| ModelBufferData& model) { | |||||
| if (output_file.empty()) { | |||||
| GELOGE(FAILED, "GraphBuilder SaveModel received invalid file name prefix"); | |||||
| return FAILED; | |||||
| } | |||||
| GE_IF_BOOL_EXEC(ge_model == nullptr, GELOGE(FAILED, "Ge_model is nullptr"); return FAILED); | |||||
| std::shared_ptr<OmFileSaveHelper> om_file_save_helper = ge::MakeShared<OmFileSaveHelper>(); | |||||
| GE_CHECK_NOTNULL(om_file_save_helper); | |||||
| Status ModelHelper::SaveModelDef(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, | |||||
| const GeModelPtr &ge_model, ge::Buffer &model_buffer, size_t model_index) { | |||||
| ModelPtr model_tmp = ge::MakeShared<ge::Model>(ge_model->GetName(), ge_model->GetPlatformVersion()); | ModelPtr model_tmp = ge::MakeShared<ge::Model>(ge_model->GetName(), ge_model->GetPlatformVersion()); | ||||
| if (model_tmp == nullptr) { | if (model_tmp == nullptr) { | ||||
| GELOGE(FAILED, "Create Model %s Ptr failed", ge_model->GetName().c_str()); | GELOGE(FAILED, "Create Model %s Ptr failed", ge_model->GetName().c_str()); | ||||
| @@ -96,16 +88,21 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmMod | |||||
| model_tmp->SetVersion(ge_model->GetVersion()); | model_tmp->SetVersion(ge_model->GetVersion()); | ||||
| model_tmp->SetAttr(ge_model->MutableAttrMap()); | model_tmp->SetAttr(ge_model->MutableAttrMap()); | ||||
| ge::Buffer model_buffer; | |||||
| (void)model_tmp->Save(model_buffer); | (void)model_tmp->Save(model_buffer); | ||||
| GELOGD("MODEL_DEF size is %zu", model_buffer.GetSize()); | GELOGD("MODEL_DEF size is %zu", model_buffer.GetSize()); | ||||
| if (model_buffer.GetSize() > 0) { | if (model_buffer.GetSize() > 0) { | ||||
| if (SaveModelPartition(om_file_save_helper, ModelPartitionType::MODEL_DEF, model_buffer.GetData(), | if (SaveModelPartition(om_file_save_helper, ModelPartitionType::MODEL_DEF, model_buffer.GetData(), | ||||
| model_buffer.GetSize()) != SUCCESS) { | |||||
| model_buffer.GetSize(), model_index) != SUCCESS) { | |||||
| GELOGE(PARAM_INVALID, "Add model graph partition failed"); | GELOGE(PARAM_INVALID, "Add model graph partition failed"); | ||||
| return PARAM_INVALID; | return PARAM_INVALID; | ||||
| } | } | ||||
| } | } | ||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::SaveModelWeights(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, | |||||
| const GeModelPtr &ge_model, size_t model_index) { | |||||
| auto ge_model_weight = ge_model->GetWeight(); | auto ge_model_weight = ge_model->GetWeight(); | ||||
| GELOGD("WEIGHTS_DATA size is %zu, %p", ge_model_weight.GetSize(), ge_model_weight.GetData()); | GELOGD("WEIGHTS_DATA size is %zu, %p", ge_model_weight.GetSize(), ge_model_weight.GetData()); | ||||
| // weight is not necessary | // weight is not necessary | ||||
| @@ -113,31 +110,44 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmMod | |||||
| GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, | GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, | ||||
| ModelPartitionType::WEIGHTS_DATA, | ModelPartitionType::WEIGHTS_DATA, | ||||
| ge_model_weight.GetData(), | ge_model_weight.GetData(), | ||||
| ge_model_weight.GetSize()), "Add weight partition failed"); | |||||
| ge_model_weight.GetSize(), model_index), "Add weight partition failed"); | |||||
| } | } | ||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::SaveModelTbeKernel(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, | |||||
| const GeModelPtr &ge_model, size_t model_index) { | |||||
| TBEKernelStore tbe_kernel_store = ge_model->GetTBEKernelStore(); | TBEKernelStore tbe_kernel_store = ge_model->GetTBEKernelStore(); | ||||
| GELOGD("TBE_KERNELS size is %zu", tbe_kernel_store.DataSize()); | GELOGD("TBE_KERNELS size is %zu", tbe_kernel_store.DataSize()); | ||||
| if (tbe_kernel_store.DataSize() > 0) { | if (tbe_kernel_store.DataSize() > 0) { | ||||
| GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, | GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, | ||||
| ModelPartitionType::TBE_KERNELS, | ModelPartitionType::TBE_KERNELS, | ||||
| tbe_kernel_store.Data(), | |||||
| tbe_kernel_store.DataSize()), "Add tbe kernel partition failed"); | |||||
| ge_model->GetTBEKernelStore().Data(), | |||||
| ge_model->GetTBEKernelStore().DataSize(), model_index), | |||||
| "Add tbe kernel partition failed"); | |||||
| } | } | ||||
| // no need to check value, DATA->NetOutput | // no need to check value, DATA->NetOutput | ||||
| (void)tbe_kernel_store.Load(tbe_kernel_store.Data(), tbe_kernel_store.DataSize()); | (void)tbe_kernel_store.Load(tbe_kernel_store.Data(), tbe_kernel_store.DataSize()); | ||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::SaveModelCustAICPU(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, | |||||
| const GeModelPtr &ge_model, size_t model_index) { | |||||
| CustAICPUKernelStore cust_aicpu_kernel_store = ge_model->GetCustAICPUKernelStore(); | CustAICPUKernelStore cust_aicpu_kernel_store = ge_model->GetCustAICPUKernelStore(); | ||||
| GELOGD("cust aicpu kernels size is %zu", cust_aicpu_kernel_store.DataSize()); | GELOGD("cust aicpu kernels size is %zu", cust_aicpu_kernel_store.DataSize()); | ||||
| if (cust_aicpu_kernel_store.DataSize() > 0) { | if (cust_aicpu_kernel_store.DataSize() > 0) { | ||||
| GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, | GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, | ||||
| ModelPartitionType::CUST_AICPU_KERNELS, | ModelPartitionType::CUST_AICPU_KERNELS, | ||||
| cust_aicpu_kernel_store.Data(), | |||||
| cust_aicpu_kernel_store.DataSize()), | |||||
| ge_model->GetCustAICPUKernelStore().Data(), | |||||
| cust_aicpu_kernel_store.DataSize(), model_index), | |||||
| "Add cust aicpu kernel partition failed"); | "Add cust aicpu kernel partition failed"); | ||||
| } | } | ||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::SaveModelTaskDef(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, | |||||
| const GeModelPtr &ge_model, ge::Buffer &task_buffer, size_t model_index) { | |||||
| std::shared_ptr<ModelTaskDef> model_task_def = ge_model->GetModelTaskDefPtr(); | std::shared_ptr<ModelTaskDef> model_task_def = ge_model->GetModelTaskDefPtr(); | ||||
| if (model_task_def == nullptr) { | if (model_task_def == nullptr) { | ||||
| GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Create model task def ptr failed"); | GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Create model task def ptr failed"); | ||||
| @@ -146,9 +156,9 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmMod | |||||
| size_t partition_task_size = model_task_def->ByteSizeLong(); | size_t partition_task_size = model_task_def->ByteSizeLong(); | ||||
| GE_IF_BOOL_EXEC(partition_task_size == 0 || partition_task_size > INT_MAX, | GE_IF_BOOL_EXEC(partition_task_size == 0 || partition_task_size > INT_MAX, | ||||
| GELOGE(FAILED, "Model_def's byte size (%zu) is invalid!", partition_task_size); | GELOGE(FAILED, "Model_def's byte size (%zu) is invalid!", partition_task_size); | ||||
| return FAILED); | |||||
| return FAILED); | |||||
| ge::Buffer task_buffer(partition_task_size); | |||||
| task_buffer = ge::Buffer(partition_task_size); | |||||
| if (task_buffer.GetSize() == 0) { | if (task_buffer.GetSize() == 0) { | ||||
| GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Alloc model task def buffer failed"); | GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Alloc model task def buffer failed"); | ||||
| return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
| @@ -159,14 +169,20 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmMod | |||||
| GELOGD("TASK_INFO size is %zu", partition_task_size); | GELOGD("TASK_INFO size is %zu", partition_task_size); | ||||
| if (SaveModelPartition(om_file_save_helper, ModelPartitionType::TASK_INFO, task_buffer.GetData(), | if (SaveModelPartition(om_file_save_helper, ModelPartitionType::TASK_INFO, task_buffer.GetData(), | ||||
| partition_task_size) != SUCCESS) { | |||||
| partition_task_size, model_index) != SUCCESS) { | |||||
| GELOGE(PARAM_INVALID, "Add model task def partition failed"); | GELOGE(PARAM_INVALID, "Add model task def partition failed"); | ||||
| return PARAM_INVALID; | return PARAM_INVALID; | ||||
| } | } | ||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::SaveModelHeader(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, | |||||
| const GeModelPtr &ge_model, size_t model_num) { | |||||
| // Save target/version to model_header | // Save target/version to model_header | ||||
| ModelFileHeader &model_header = om_file_save_helper->GetModelFileHeader(); | ModelFileHeader &model_header = om_file_save_helper->GetModelFileHeader(); | ||||
| model_header.platform_type = ge_model->GetPlatformType(); | model_header.platform_type = ge_model->GetPlatformType(); | ||||
| model_header.om_ir_version = ge_model->GetVersion(); | model_header.om_ir_version = ge_model->GetVersion(); | ||||
| model_header.model_num = model_num; | |||||
| std::string platform_version = ge_model->GetPlatformVersion(); | std::string platform_version = ge_model->GetPlatformVersion(); | ||||
| errno_t err; | errno_t err; | ||||
| @@ -188,8 +204,142 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmMod | |||||
| } | } | ||||
| string model_name = reinterpret_cast<char *>(model_header.name); | string model_name = reinterpret_cast<char *>(model_header.name); | ||||
| GELOGD("Model name save:%s", model_name.c_str()); | GELOGD("Model name save:%s", model_name.c_str()); | ||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::SaveAllModelPartiton(std::shared_ptr<OmFileSaveHelper>& om_file_save_helper, | |||||
| const GeModelPtr &ge_model, ge::Buffer &model_buffer, | |||||
| ge::Buffer &task_buffer, size_t model_index) { | |||||
| if (SaveModelDef(om_file_save_helper, ge_model, model_buffer, model_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "save model def failed"); | |||||
| return FAILED; | |||||
| } | |||||
| if (SaveModelWeights(om_file_save_helper, ge_model, model_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "save model weights failed"); | |||||
| return FAILED; | |||||
| } | |||||
| if (SaveModelTbeKernel(om_file_save_helper, ge_model, model_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "save model tbe kernel failed"); | |||||
| return FAILED; | |||||
| } | |||||
| if (SaveModelCustAICPU(om_file_save_helper, ge_model, model_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "save model cust ai cpu failed"); | |||||
| return FAILED; | |||||
| } | |||||
| if (SaveModelTaskDef(om_file_save_helper, ge_model, task_buffer, model_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "save task def failed"); | |||||
| return FAILED; | |||||
| } | |||||
| return SUCCESS; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmModel(const GeModelPtr &ge_model, | |||||
| const SaveParam &save_param, | |||||
| const std::string &output_file, | |||||
| ModelBufferData& model) { | |||||
| if (output_file.empty()) { | |||||
| GELOGE(FAILED, "GraphBuilder SaveModel received invalid file name prefix"); | |||||
| return FAILED; | |||||
| } | |||||
| Status ret = om_file_save_helper->SaveModel(save_param, output_file.c_str(), model, is_offline_); | |||||
| GE_IF_BOOL_EXEC(ge_model == nullptr, GELOGE(FAILED, "Ge_model is nullptr"); return FAILED); | |||||
| std::shared_ptr<OmFileSaveHelper> om_file_save_helper = ge::MakeShared<OmFileSaveHelper>(); | |||||
| GE_CHECK_NOTNULL(om_file_save_helper); | |||||
| ge::Buffer model_buffer; | |||||
| ge::Buffer task_buffer; | |||||
| auto ret = SaveAllModelPartiton(om_file_save_helper, ge_model, model_buffer, task_buffer); | |||||
| if (ret != SUCCESS) { | |||||
| GELOGE(ret, "save all model partition failed"); | |||||
| return ret; | |||||
| } | |||||
| ret = SaveModelHeader(om_file_save_helper, ge_model); | |||||
| if (ret != SUCCESS) { | |||||
| GELOGE(ret, "save model header failed"); | |||||
| return ret; | |||||
| } | |||||
| ret = om_file_save_helper->SaveModel(save_param, output_file.c_str(), model, is_offline_); | |||||
| if (ret != SUCCESS) { | |||||
| GELOGE(FAILED, "OmFileSaveHelper SaveModel return fail."); | |||||
| return ret; | |||||
| } | |||||
| return SUCCESS; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmRootModel( | |||||
| const GeRootModelPtr &ge_root_model, | |||||
| const SaveParam &save_param, | |||||
| const std::string &output_file, | |||||
| ModelBufferData& model, | |||||
| bool is_unknown_shape) { | |||||
| GE_CHECK_NOTNULL(ge_root_model); | |||||
| GE_IF_BOOL_EXEC(ge_root_model == nullptr, GELOGE(FAILED, "Ge_root_model is nullptr"); return FAILED); | |||||
| auto &name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel(); | |||||
| GE_IF_BOOL_EXEC(name_to_ge_model.empty(), GELOGE(FAILED, "Ge_root_model has no sub model"); return FAILED); | |||||
| GE_IF_BOOL_EXEC(output_file.empty(), | |||||
| GELOGE(FAILED, "GraphBuilder SaveModel received invalid file name prefix"); | |||||
| return FAILED); | |||||
| if (!is_unknown_shape) { | |||||
| auto &model_root = name_to_ge_model.begin()->second; | |||||
| return SaveToOmModel(model_root, save_param, output_file, model); | |||||
| } | |||||
| std::shared_ptr<OmFileSaveHelper> om_file_save_helper = ge::MakeShared<OmFileSaveHelper>(); | |||||
| GE_CHECK_NOTNULL(om_file_save_helper); | |||||
| auto &first_ge_model = name_to_ge_model.at(ge_root_model->GetRootGraph()->GetName()); | |||||
| // ge root model must be the first to be loaded | |||||
| vector<string> model_names{ge_root_model->GetRootGraph()->GetName()}; | |||||
| for (auto &item : name_to_ge_model) { | |||||
| if (item.first != model_names.front()) { | |||||
| model_names.emplace_back(item.first); | |||||
| } | |||||
| } | |||||
| vector<ge::Buffer> model_buffers(model_names.size()); | |||||
| vector<ge::Buffer> task_buffers(model_names.size()); | |||||
| size_t cur_index = 0; | |||||
| if (model_names.size() > 1) { | |||||
| GELOGD("only save first model MODEL_DEF"); | |||||
| if (SaveModelDef(om_file_save_helper, first_ge_model, model_buffers[cur_index], cur_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "save model def failed"); | |||||
| return FAILED; | |||||
| } | |||||
| ++cur_index; | |||||
| } | |||||
| for (; cur_index < model_names.size(); ++cur_index) { | |||||
| auto model_name = model_names[cur_index]; | |||||
| GELOGD("cur model %s index is %zu", model_name.c_str(), cur_index); | |||||
| const GeModelPtr &ge_model = name_to_ge_model.at(model_name); | |||||
| auto ret = SaveAllModelPartiton(om_file_save_helper, ge_model, model_buffers[cur_index], | |||||
| task_buffers[cur_index], cur_index); | |||||
| if (ret != SUCCESS) { | |||||
| GELOGE(INTERNAL_ERROR, "Save model %s failed", model_name.c_str()); | |||||
| return INTERNAL_ERROR; | |||||
| } | |||||
| } | |||||
| auto ret = SaveModelHeader(om_file_save_helper, first_ge_model, model_names.size()); | |||||
| if (ret != SUCCESS) { | |||||
| GELOGE(INTERNAL_ERROR, "Save model %s header failed", first_ge_model->GetName().c_str()); | |||||
| return INTERNAL_ERROR; | |||||
| } | |||||
| ret = om_file_save_helper->SaveRootModel(save_param, output_file.c_str(), model, is_offline_); | |||||
| if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
| GELOGE(FAILED, "OmFileSaveHelper SaveModel return fail."); | GELOGE(FAILED, "OmFileSaveHelper SaveModel return fail."); | ||||
| return FAILED; | return FAILED; | ||||
| @@ -288,7 +438,6 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::LoadModel(c | |||||
| } | } | ||||
| file_header_ = reinterpret_cast<ModelFileHeader *>(model_data.model_data); | file_header_ = reinterpret_cast<ModelFileHeader *>(model_data.model_data); | ||||
| OmFileLoadHelper om_load_helper; | OmFileLoadHelper om_load_helper; | ||||
| status = om_load_helper.Init(model_addr_tmp_, model_len_tmp_); | status = om_load_helper.Init(model_addr_tmp_, model_len_tmp_); | ||||
| if (status != SUCCESS) { | if (status != SUCCESS) { | ||||
| @@ -310,7 +459,61 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::LoadModel(c | |||||
| GELOGE(status, "GenerateGeModel failed"); | GELOGE(status, "GenerateGeModel failed"); | ||||
| return status; | return status; | ||||
| } | } | ||||
| GELOGD("in ModelHelper::LoadModel, is_assign_model_ is setted to true!"); | |||||
| is_assign_model_ = true; | |||||
| return SUCCESS; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::LoadRootModel(const ge::ModelData &model_data) { | |||||
| if (model_data.model_data == nullptr || model_data.model_len == 0) { | |||||
| GELOGE(GE_EXEC_MODEL_DATA_SIZE_INVALID, "Model_data is nullptr, or model_data_size is 0"); | |||||
| return GE_EXEC_MODEL_DATA_SIZE_INVALID; | |||||
| } | |||||
| if (is_assign_model_) { | |||||
| GELOGE(GE_EXEC_LOAD_MODEL_REPEATED, "Model helper has already loaded!"); | |||||
| return GE_EXEC_LOAD_MODEL_REPEATED; | |||||
| } | |||||
| if (ReleaseLocalModelData() != SUCCESS) { | |||||
| GELOGE(INTERNAL_ERROR, "ReleaseLocalModelData failed."); | |||||
| return INTERNAL_ERROR; | |||||
| } | |||||
| Status status = ge::DavinciModelParser::ParseModelContent(model_data, model_addr_tmp_, model_len_tmp_); | |||||
| if (status != SUCCESS) { | |||||
| GELOGE(status, "Parse model content failed!"); | |||||
| return status; | |||||
| } | |||||
| file_header_ = reinterpret_cast<ModelFileHeader *>(model_data.model_data); | |||||
| //model verison 1.0 file header does not have model_num member | |||||
| is_unknown_shape_model_ = file_header_->version >= ge::MODEL_VERSION && | |||||
| file_header_->model_num > kStatiOmFileModelNum; | |||||
| GELOGD("cur om model is ge root model or no %d, model version %zu", is_unknown_shape_model_, file_header_->version); | |||||
| OmFileLoadHelper om_load_helper; | |||||
| if (is_unknown_shape_model_) { | |||||
| auto model_num = file_header_->model_num; | |||||
| status = om_load_helper.Init(model_addr_tmp_, model_len_tmp_, model_num); | |||||
| } else { | |||||
| status = om_load_helper.Init(model_addr_tmp_, model_len_tmp_); | |||||
| } | |||||
| if (status != SUCCESS) { | |||||
| GELOGE(status, "Om_load_helper init failed"); | |||||
| model_addr_tmp_ = nullptr; | |||||
| return status; | |||||
| } | |||||
| // Encrypt model need to del temp model/no encrypt model don't need to del model | |||||
| model_addr_tmp_ = nullptr; | |||||
| status = GenerateGeRootModel(om_load_helper); | |||||
| if (status != SUCCESS) { | |||||
| GELOGE(status, "GenerateGeRootModel failed"); | |||||
| return status; | |||||
| } | |||||
| GELOGD("in ModelHelper::LoadRootModel, is_assign_model_ is setted to true!"); | |||||
| is_assign_model_ = true; | is_assign_model_ = true; | ||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| @@ -341,6 +544,61 @@ Status ModelHelper::GenerateGeModel(OmFileLoadHelper &om_load_helper) { | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status ModelHelper::GenerateGeRootModel(OmFileLoadHelper &om_load_helper) { | |||||
| GELOGD("Begin to generate ge root model"); | |||||
| root_model_ = ge::MakeShared<ge::GeRootModel>(); | |||||
| GE_CHECK_NOTNULL(root_model_); | |||||
| if (!is_unknown_shape_model_) { | |||||
| if (GenerateGeModel(om_load_helper) != SUCCESS) { | |||||
| GELOGE(FAILED, "GenerateGeModel failed"); | |||||
| return FAILED; | |||||
| } | |||||
| GE_CHECK_NOTNULL(model_); | |||||
| root_model_->SetRootGraph(GraphUtils::GetComputeGraph(model_->GetGraph())); | |||||
| return SUCCESS; | |||||
| } | |||||
| bool is_first_model = true; | |||||
| for (size_t mode_index = 0; mode_index < file_header_->model_num; ++mode_index) { | |||||
| GeModelPtr cur_model = ge::MakeShared<ge::GeModel>(); | |||||
| Status ret = LoadModelData(om_load_helper, cur_model, mode_index); | |||||
| if (ret != SUCCESS) { | |||||
| return GE_EXEC_LOAD_MODEL_PARTITION_FAILED; | |||||
| } | |||||
| if (is_first_model) { | |||||
| is_first_model = false; | |||||
| root_model_->SetRootGraph(GraphUtils::GetComputeGraph(cur_model->GetGraph())); | |||||
| root_model_->SetModelId(cur_model->GetModelId()); | |||||
| model_ = cur_model; | |||||
| continue; | |||||
| } | |||||
| ret = LoadWeights(om_load_helper, cur_model, mode_index); | |||||
| if (ret != SUCCESS) { | |||||
| return GE_EXEC_LOAD_WEIGHT_PARTITION_FAILED; | |||||
| } | |||||
| ret = LoadTBEKernelStore(om_load_helper, cur_model, mode_index); | |||||
| if (ret != SUCCESS) { | |||||
| return GE_EXEC_LOAD_KERNEL_PARTITION_FAILED; | |||||
| } | |||||
| ret = LoadCustAICPUKernelStore(om_load_helper, cur_model, mode_index); | |||||
| if (ret != SUCCESS) { | |||||
| return GE_EXEC_LOAD_KERNEL_PARTITION_FAILED; | |||||
| } | |||||
| ret = LoadTask(om_load_helper, cur_model, mode_index); | |||||
| if (ret != SUCCESS) { | |||||
| return GE_EXEC_LOAD_TASK_PARTITION_FAILED; | |||||
| } | |||||
| root_model_->SetSubgraphInstanceNameToModel(cur_model->GetName(), cur_model); | |||||
| } | |||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::LoadModelData(OmFileLoadHelper &om_load_helper) { | Status ModelHelper::LoadModelData(OmFileLoadHelper &om_load_helper) { | ||||
| ModelPartition partition_model_def; | ModelPartition partition_model_def; | ||||
| // no need to check value, DATA->NetOutput | // no need to check value, DATA->NetOutput | ||||
| @@ -366,6 +624,28 @@ void ModelHelper::SetModelToGeModel(ge::Model &model) { | |||||
| model_->SetAttr(model.MutableAttrMap()); | model_->SetAttr(model.MutableAttrMap()); | ||||
| } | } | ||||
| Status ModelHelper::LoadModelData(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index) { | |||||
| ModelPartition partition_model_def; | |||||
| // no need to check value, DATA->NetOutput | |||||
| om_load_helper.GetModelPartition(ModelPartitionType::MODEL_DEF, partition_model_def, mode_index); | |||||
| GELOGD("Model_def partition addr:%p,size:%u", partition_model_def.data, partition_model_def.size); | |||||
| ge::Model model; | |||||
| if (ge::Model::Load(partition_model_def.data, partition_model_def.size, model) != SUCCESS) { | |||||
| GELOGE(INTERNAL_ERROR, "Load model failed."); | |||||
| return INTERNAL_ERROR; | |||||
| } | |||||
| cur_model->SetGraph(model.GetGraph()); | |||||
| cur_model->SetName(model.GetName()); | |||||
| cur_model->SetVersion(model.GetVersion()); | |||||
| cur_model->SetPlatformVersion(model.GetPlatformVersion()); | |||||
| cur_model->SetAttr(model.MutableAttrMap()); | |||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::LoadWeights(OmFileLoadHelper &om_load_helper) { | Status ModelHelper::LoadWeights(OmFileLoadHelper &om_load_helper) { | ||||
| ModelPartition partition; | ModelPartition partition; | ||||
| if (om_load_helper.GetModelPartition(ModelPartitionType::WEIGHTS_DATA, partition) != SUCCESS) { | if (om_load_helper.GetModelPartition(ModelPartitionType::WEIGHTS_DATA, partition) != SUCCESS) { | ||||
| @@ -379,6 +659,19 @@ Status ModelHelper::LoadWeights(OmFileLoadHelper &om_load_helper) { | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status ModelHelper::LoadWeights(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index) { | |||||
| ModelPartition partition; | |||||
| if (om_load_helper.GetModelPartition(ModelPartitionType::WEIGHTS_DATA, partition, mode_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "Get weight model partition failed."); | |||||
| return FAILED; | |||||
| } | |||||
| ge::Buffer weight = ge::Buffer::CopyFrom(partition.data, partition.size); | |||||
| cur_model->SetWeight(weight); | |||||
| GELOGD("GetWeight size:%u", partition.size); | |||||
| return SUCCESS; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::LoadTask(OmFileLoadHelper &om_load_helper) { | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::LoadTask(OmFileLoadHelper &om_load_helper) { | ||||
| ModelPartition task_partition; | ModelPartition task_partition; | ||||
| if (om_load_helper.GetModelPartition(ModelPartitionType::TASK_INFO, task_partition) != SUCCESS) { | if (om_load_helper.GetModelPartition(ModelPartitionType::TASK_INFO, task_partition) != SUCCESS) { | ||||
| @@ -398,6 +691,27 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::LoadTask(Om | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::LoadTask(OmFileLoadHelper &om_load_helper, | |||||
| GeModelPtr &cur_model, | |||||
| size_t mode_index) { | |||||
| ModelPartition task_partition; | |||||
| if (om_load_helper.GetModelPartition(ModelPartitionType::TASK_INFO, task_partition, mode_index) != SUCCESS) { | |||||
| GELOGE(FAILED, "Get task model partition failed."); | |||||
| return FAILED; | |||||
| } | |||||
| std::shared_ptr<ModelTaskDef> task = ge::MakeShared<ModelTaskDef>(); | |||||
| GE_CHECK_NOTNULL(task); | |||||
| if (task_partition.size != 0) { | |||||
| if (!ReadProtoFromArray(task_partition.data, task_partition.size, task.get())) { | |||||
| GELOGE(INTERNAL_ERROR, "ReadProtoFromArray failed."); | |||||
| return INTERNAL_ERROR; | |||||
| } | |||||
| GELOGD("TASK_INFO op_size:%zu, stream_num:%u", task->op().size(), task->stream_num()); | |||||
| } | |||||
| cur_model->SetModelTaskDef(task); | |||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::LoadTBEKernelStore(OmFileLoadHelper &om_load_helper) { | Status ModelHelper::LoadTBEKernelStore(OmFileLoadHelper &om_load_helper) { | ||||
| // Load tbe kernels | // Load tbe kernels | ||||
| ModelPartition partition_kernel_def; | ModelPartition partition_kernel_def; | ||||
| @@ -414,6 +728,23 @@ Status ModelHelper::LoadTBEKernelStore(OmFileLoadHelper &om_load_helper) { | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status ModelHelper::LoadTBEKernelStore(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index) { | |||||
| // Load tbe kernels | |||||
| ModelPartition partition_kernel_def; | |||||
| TBEKernelStore kernel_store; | |||||
| if (om_load_helper.GetModelPartition(ModelPartitionType::TBE_KERNELS, partition_kernel_def, mode_index) == | |||||
| SUCCESS) { | |||||
| GELOGD("Kernels partition size:%u", partition_kernel_def.size); | |||||
| if (kernel_store.Load(partition_kernel_def.data, partition_kernel_def.size)) { | |||||
| GELOGD("Load tbe kernels success"); | |||||
| } else { | |||||
| GELOGW("Load tbe kernels failed"); | |||||
| } | |||||
| } | |||||
| cur_model->SetTBEKernelStore(kernel_store); | |||||
| return SUCCESS; | |||||
| } | |||||
| Status ModelHelper::LoadCustAICPUKernelStore(OmFileLoadHelper &om_load_helper) { | Status ModelHelper::LoadCustAICPUKernelStore(OmFileLoadHelper &om_load_helper) { | ||||
| // Load cust aicpu kernels | // Load cust aicpu kernels | ||||
| ModelPartition partition_kernel_def; | ModelPartition partition_kernel_def; | ||||
| @@ -421,19 +752,39 @@ Status ModelHelper::LoadCustAICPUKernelStore(OmFileLoadHelper &om_load_helper) { | |||||
| if (om_load_helper.GetModelPartition(ModelPartitionType::CUST_AICPU_KERNELS, partition_kernel_def) == SUCCESS) { | if (om_load_helper.GetModelPartition(ModelPartitionType::CUST_AICPU_KERNELS, partition_kernel_def) == SUCCESS) { | ||||
| GELOGD("Kernels partition size:%u", partition_kernel_def.size); | GELOGD("Kernels partition size:%u", partition_kernel_def.size); | ||||
| if (kernel_store.Load(partition_kernel_def.data, partition_kernel_def.size)) { | if (kernel_store.Load(partition_kernel_def.data, partition_kernel_def.size)) { | ||||
| GELOGI("Load cust aicpu kernels success"); | |||||
| GELOGD("Load cust aicpu kernels success"); | |||||
| } else { | |||||
| GELOGW("Load cust aicpu kernels failed"); | |||||
| } | } | ||||
| } | } | ||||
| model_->SetCustAICPUKernelStore(kernel_store); | model_->SetCustAICPUKernelStore(kernel_store); | ||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status ModelHelper::LoadCustAICPUKernelStore(OmFileLoadHelper &om_load_helper, | |||||
| GeModelPtr &cur_model, size_t mode_index) { | |||||
| // Load cust aicpu kernels | |||||
| ModelPartition partition_kernel_def; | |||||
| CustAICPUKernelStore kernel_store; | |||||
| if (om_load_helper.GetModelPartition(ModelPartitionType::CUST_AICPU_KERNELS, partition_kernel_def, mode_index) | |||||
| == SUCCESS) { | |||||
| GELOGD("Kernels partition size:%u", partition_kernel_def.size); | |||||
| if (kernel_store.Load(partition_kernel_def.data, partition_kernel_def.size)) { | |||||
| GELOGD("Load cust aicpu kernels success"); | |||||
| } else { | |||||
| GELOGW("Load cust aicpu kernels failed"); | |||||
| } | |||||
| } | |||||
| cur_model->SetCustAICPUKernelStore(kernel_store); | |||||
| return SUCCESS; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY GeModelPtr ModelHelper::GetGeModel() { | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY GeModelPtr ModelHelper::GetGeModel() { | ||||
| if (model_ != nullptr) { | if (model_ != nullptr) { | ||||
| return model_; | return model_; | ||||
| } | } | ||||
| GELOGI("Model has not been loaded!"); | |||||
| GELOGD("Model has not been loaded!"); | |||||
| std::shared_ptr<ge::GeModel> out_model = ge::MakeShared<ge::GeModel>(); | std::shared_ptr<ge::GeModel> out_model = ge::MakeShared<ge::GeModel>(); | ||||
| if (out_model == nullptr) { | if (out_model == nullptr) { | ||||
| return nullptr; | return nullptr; | ||||
| @@ -441,6 +792,20 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY GeModelPtr ModelHelper::GetGeMo | |||||
| return out_model; | return out_model; | ||||
| } | } | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY GeRootModelPtr ModelHelper::GetGeRootModel() { | |||||
| if (root_model_ != nullptr) { | |||||
| return root_model_; | |||||
| } | |||||
| GELOGD("Model has not been loaded!"); | |||||
| std::shared_ptr<ge::GeRootModel> out_model = ge::MakeShared<ge::GeRootModel>(); | |||||
| if (out_model == nullptr) { | |||||
| return nullptr; | |||||
| } | |||||
| return out_model; | |||||
| } | |||||
| Status ModelHelper::ReleaseLocalModelData() noexcept { | Status ModelHelper::ReleaseLocalModelData() noexcept { | ||||
| Status result = SUCCESS; | Status result = SUCCESS; | ||||
| if (model_addr_tmp_ != nullptr) { | if (model_addr_tmp_ != nullptr) { | ||||
| @@ -52,6 +52,17 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileLoadHelper::Init(u | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileLoadHelper::Init(uint8_t *model_data, | |||||
| uint32_t model_data_size, | |||||
| uint32_t model_num) { | |||||
| Status status = LoadModelPartitionTable(model_data, model_data_size, model_num); | |||||
| if (status != SUCCESS) { | |||||
| return status; | |||||
| } | |||||
| is_inited_ = true; | |||||
| return SUCCESS; | |||||
| } | |||||
| // Use both | // Use both | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileLoadHelper::GetModelPartition(ModelPartitionType type, | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileLoadHelper::GetModelPartition(ModelPartitionType type, | ||||
| ModelPartition &partition) { | ModelPartition &partition) { | ||||
| @@ -79,6 +90,37 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileLoadHelper::GetMod | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileLoadHelper::GetModelPartition(ModelPartitionType type, | |||||
| ModelPartition &partition, | |||||
| size_t model_index) { | |||||
| if (!is_inited_) { | |||||
| GELOGE(PARAM_INVALID, "OmFileLoadHelper has not been initialized!"); | |||||
| return PARAM_INVALID; | |||||
| } | |||||
| if (model_index >= model_contexts_.size()) { | |||||
| GELOGE(PARAM_INVALID, "cur index : %zu, model_contexts size:%zu", model_index, model_contexts_.size()); | |||||
| return PARAM_INVALID; | |||||
| } | |||||
| auto &cur_ctx = model_contexts_[model_index]; | |||||
| bool found = false; | |||||
| for (ModelPartition &part : cur_ctx.partition_datas_) { | |||||
| if (part.type == type) { | |||||
| partition = part; | |||||
| found = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (!found) { | |||||
| if (type != ModelPartitionType::TBE_KERNELS && type != ModelPartitionType::WEIGHTS_DATA && | |||||
| type != ModelPartitionType::CUST_AICPU_KERNELS) { | |||||
| GELOGE(FAILED, "GetModelPartition:type:%d is not in partition_datas!", static_cast<int>(type)); | |||||
| return FAILED; | |||||
| } | |||||
| } | |||||
| return SUCCESS; | |||||
| } | |||||
| Status OmFileLoadHelper::CheckModelValid(const ge::ModelData &model) const { | Status OmFileLoadHelper::CheckModelValid(const ge::ModelData &model) const { | ||||
| // Parameter validity check | // Parameter validity check | ||||
| if (model.model_data == nullptr) { | if (model.model_data == nullptr) { | ||||
| @@ -148,6 +190,61 @@ Status OmFileLoadHelper::LoadModelPartitionTable(uint8_t *model_data, const uint | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status OmFileLoadHelper::LoadModelPartitionTable(uint8_t *model_data, uint32_t model_data_size, uint32_t model_num) { | |||||
| if (model_data == nullptr) { | |||||
| GELOGE(PARAM_INVALID, "Param model_data must not be null!"); | |||||
| return PARAM_INVALID; | |||||
| } | |||||
| uint32_t cur_offset = 0; | |||||
| for (uint32_t index = 0; index < model_num; ++index) { | |||||
| // Init partition table | |||||
| auto partition_table = reinterpret_cast<ModelPartitionTable *>(model_data + cur_offset); | |||||
| size_t partition_table_size = SIZE_OF_MODEL_PARTITION_TABLE(*partition_table); | |||||
| cur_offset += partition_table_size; | |||||
| GELOGD("Cur model index %zu: ModelPartitionTable num :%u, " | |||||
| "ModelFileHeader length :%zu, ModelPartitionTable length :%zu", | |||||
| index, partition_table->num, sizeof(ModelFileHeader), partition_table_size); | |||||
| if (model_data_size <= cur_offset) { | |||||
| GELOGE(GE_EXEC_MODEL_DATA_SIZE_INVALID, "invalid model data, partition_table->num:%u, model data size %u", | |||||
| partition_table->num, model_data_size); | |||||
| return GE_EXEC_MODEL_DATA_SIZE_INVALID; | |||||
| } | |||||
| for (uint32_t i = 0; i < partition_table->num; i++) { | |||||
| ModelPartition partition; | |||||
| partition.size = partition_table->partition[i].mem_size; | |||||
| partition.data = model_data + cur_offset; | |||||
| partition.type = partition_table->partition[i].type; | |||||
| if (index >= model_contexts_.size()) { | |||||
| if (index != model_contexts_.size()) { | |||||
| GELOGE(FAILED, "cur index is %zu make model_contexts_ overflow", index); | |||||
| return FAILED; | |||||
| } | |||||
| OmFileContext tmp_ctx; | |||||
| tmp_ctx.partition_datas_.push_back(partition); | |||||
| model_contexts_.push_back(tmp_ctx); | |||||
| } else { | |||||
| model_contexts_[index].partition_datas_.push_back(partition); | |||||
| } | |||||
| if (partition.size > model_data_size || cur_offset > model_data_size - partition.size) { | |||||
| GELOGE(GE_EXEC_MODEL_DATA_SIZE_INVALID, "The partition size %zu is greater than the model data size %u.", | |||||
| partition.size + cur_offset, model_data_size); | |||||
| return GE_EXEC_MODEL_DATA_SIZE_INVALID; | |||||
| } | |||||
| cur_offset += partition.size; | |||||
| GELOGD("Partition, type:%d, size:%u, model_index:%zu", static_cast<int>(partition.type), partition.size, index); | |||||
| } | |||||
| } | |||||
| if (cur_offset != model_data_size) { | |||||
| GELOGE(FAILED, "do not get the complete model, read end offset:%zu, all size:%zu", cur_offset, model_data_size); | |||||
| return FAILED; | |||||
| } | |||||
| return SUCCESS; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY const std::vector<ModelPartition> | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY const std::vector<ModelPartition> | ||||
| &OmFileSaveHelper::GetModelPartitions() const { | &OmFileSaveHelper::GetModelPartitions() const { | ||||
| return context_.partition_datas_; | return context_.partition_datas_; | ||||
| @@ -172,6 +269,28 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelPartitionTable *OmFileSave | |||||
| return partition_table; | return partition_table; | ||||
| } | } | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelPartitionTable *OmFileSaveHelper::GetPartitionTable( | |||||
| size_t cur_ctx_index) { | |||||
| auto &cur_ctx = model_contexts_[cur_ctx_index]; | |||||
| auto partition_size = static_cast<uint32_t>(cur_ctx.partition_datas_.size()); | |||||
| // Build ModelPartitionTable, flex array | |||||
| cur_ctx.partition_table_.clear(); | |||||
| cur_ctx.partition_table_.resize(sizeof(ModelPartitionTable) + sizeof(ModelPartitionMemInfo) * partition_size, 0); | |||||
| auto partition_table = reinterpret_cast<ModelPartitionTable *>(cur_ctx.partition_table_.data()); | |||||
| partition_table->num = partition_size; | |||||
| uint32_t mem_offset = 0; | |||||
| for (uint32_t i = 0; i < partition_size; i++) { | |||||
| ModelPartition partition = cur_ctx.partition_datas_[i]; | |||||
| partition_table->partition[i] = {partition.type, mem_offset, partition.size}; | |||||
| mem_offset += partition.size; | |||||
| GELOGD("Partition, type:%d, size:%u", static_cast<int>(partition.type), partition.size); | |||||
| } | |||||
| return partition_table; | |||||
| } | |||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileSaveHelper::AddPartition(ModelPartition &partition) { | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileSaveHelper::AddPartition(ModelPartition &partition) { | ||||
| if (ge::CheckUint32AddOverflow(context_.model_data_len_, partition.size) != SUCCESS) { | if (ge::CheckUint32AddOverflow(context_.model_data_len_, partition.size) != SUCCESS) { | ||||
| GELOGE(FAILED, "UINT32 %u and %u addition can result in overflow!", context_.model_data_len_, partition.size); | GELOGE(FAILED, "UINT32 %u and %u addition can result in overflow!", context_.model_data_len_, partition.size); | ||||
| @@ -182,6 +301,27 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status OmFileSaveHelper::AddPar | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status OmFileSaveHelper::AddPartition(ModelPartition &partition, size_t cur_index) { | |||||
| if (ge::CheckUint32AddOverflow(context_.model_data_len_, partition.size) != SUCCESS) { | |||||
| GELOGE(FAILED, "UINT32 %u and %u addition can result in overflow!", context_.model_data_len_, partition.size); | |||||
| return FAILED; | |||||
| } | |||||
| if (cur_index >= model_contexts_.size()) { | |||||
| if (cur_index != model_contexts_.size()) { | |||||
| GELOGE(FAILED, "cur index is %zu make model_contexts_ overflow", cur_index); | |||||
| return FAILED; | |||||
| } | |||||
| OmFileContext tmp_ctx; | |||||
| tmp_ctx.model_data_len_ += partition.size; | |||||
| tmp_ctx.partition_datas_.push_back(partition); | |||||
| model_contexts_.push_back(tmp_ctx); | |||||
| } else { | |||||
| model_contexts_[cur_index].model_data_len_ += partition.size; | |||||
| model_contexts_[cur_index].partition_datas_.push_back(partition); | |||||
| } | |||||
| return SUCCESS; | |||||
| } | |||||
| Status OmFileSaveHelper::SaveModel(const SaveParam &save_param, const char *output_file, ModelBufferData &model, | Status OmFileSaveHelper::SaveModel(const SaveParam &save_param, const char *output_file, ModelBufferData &model, | ||||
| bool is_offline) { | bool is_offline) { | ||||
| (void)save_param.cert_file; | (void)save_param.cert_file; | ||||
| @@ -198,6 +338,10 @@ Status OmFileSaveHelper::SaveModel(const SaveParam &save_param, const char *outp | |||||
| Status OmFileSaveHelper::SaveModelToFile(const char *output_file, ModelBufferData &model, bool is_offline) { | Status OmFileSaveHelper::SaveModelToFile(const char *output_file, ModelBufferData &model, bool is_offline) { | ||||
| #if !defined(NONSUPPORT_SAVE_TO_FILE) | #if !defined(NONSUPPORT_SAVE_TO_FILE) | ||||
| if (context_.partition_datas_.empty()) { | |||||
| GE_CHK_BOOL_EXEC(!model_contexts_.empty(), return FAILED, "mode contexts empty"); | |||||
| context_ = model_contexts_.front(); | |||||
| } | |||||
| uint32_t model_data_len = context_.model_data_len_; | uint32_t model_data_len = context_.model_data_len_; | ||||
| if (model_data_len == 0) { | if (model_data_len == 0) { | ||||
| GELOGE(domi::PARAM_INVALID, "Model data len error! should not be 0"); | GELOGE(domi::PARAM_INVALID, "Model data len error! should not be 0"); | ||||
| @@ -231,4 +375,53 @@ Status OmFileSaveHelper::SaveModelToFile(const char *output_file, ModelBufferDat | |||||
| return SUCCESS; | return SUCCESS; | ||||
| #endif | #endif | ||||
| } | } | ||||
| Status OmFileSaveHelper::SaveRootModel(const SaveParam &save_param, const char *output_file, | |||||
| ModelBufferData &model, bool is_offline) { | |||||
| (void)save_param.cert_file; | |||||
| (void)save_param.ek_file; | |||||
| (void)save_param.encode_mode; | |||||
| (void)save_param.hw_key_file; | |||||
| (void)save_param.pri_key_file; | |||||
| #if !defined(NONSUPPORT_SAVE_TO_FILE) | |||||
| vector<ModelPartitionTable *> model_partition_tabels; | |||||
| vector<vector<ModelPartition>> all_model_partitions; | |||||
| for (size_t ctx_index = 0; ctx_index < model_contexts_.size(); ++ctx_index) { | |||||
| auto &cur_ctx = model_contexts_[ctx_index]; | |||||
| uint32_t cur_model_data_len = cur_ctx.model_data_len_; | |||||
| if (cur_model_data_len == 0) { | |||||
| GELOGE(domi::PARAM_INVALID, "Model data len error! should not be 0"); | |||||
| return domi::PARAM_INVALID; | |||||
| } | |||||
| auto tmp_table = GetPartitionTable(ctx_index); | |||||
| if (tmp_table == nullptr) { | |||||
| GELOGE(ge::GE_GRAPH_SAVE_FAILED, "SaveModelToFile execute failed: partition_table is NULL."); | |||||
| return ge::GE_GRAPH_SAVE_FAILED; | |||||
| } | |||||
| uint32_t size_of_table = SIZE_OF_MODEL_PARTITION_TABLE(*tmp_table); | |||||
| FMK_UINT32_ADDCHECK(size_of_table, cur_model_data_len) | |||||
| FMK_UINT32_ADDCHECK(size_of_table + cur_model_data_len, model_header_.length) | |||||
| model_header_.length += size_of_table + cur_model_data_len; | |||||
| model_partition_tabels.push_back(tmp_table); | |||||
| all_model_partitions.push_back(cur_ctx.partition_datas_); | |||||
| GELOGD("sizeof(ModelPartitionTable):%u, cur_model_data_len:%u, cur_context_index:%zu", | |||||
| size_of_table, cur_model_data_len, ctx_index); | |||||
| } | |||||
| Status ret; | |||||
| if (is_offline) { | |||||
| ret = FileSaver::SaveToFile(output_file, model_header_, model_partition_tabels, all_model_partitions); | |||||
| } else { | |||||
| GELOGW("do not support save ge root model to buff now"); | |||||
| return FAILED; | |||||
| } | |||||
| if (ret == SUCCESS) { | |||||
| GELOGD("Save model success without encrypt."); | |||||
| } | |||||
| return ret; | |||||
| #else | |||||
| return SUCCESS; | |||||
| #endif | |||||
| } | |||||
| } // namespace ge | } // namespace ge | ||||
| @@ -801,7 +801,7 @@ const uint32_t XRGB_CHN_NUM = 4; | |||||
| /// | /// | ||||
| const bool DEFAULT_GLOBAL_POOLING = false; | const bool DEFAULT_GLOBAL_POOLING = false; | ||||
| const uint32_t MODEL_VERSION = 0x10000000; ///< Model version 1.0/// | |||||
| const uint32_t MODEL_VERSION = 0x20000000; ///< Model version 2.0/// | |||||
| // Eltwise's input size | // Eltwise's input size | ||||
| const int ELTWISE_MIN_INPUT_SIZE = 2; | const int ELTWISE_MIN_INPUT_SIZE = 2; | ||||
| @@ -240,6 +240,8 @@ class GeGenerator::Impl { | |||||
| Status SaveModel(const string &file_name_prefix, GeModelPtr &models, ModelBufferData &model); | Status SaveModel(const string &file_name_prefix, GeModelPtr &models, ModelBufferData &model); | ||||
| Status SaveRootModel(const string &file_name_prefix, GeRootModelPtr &model, ModelBufferData &model_buff); | |||||
| Status SaveParams(GeModelPtr &ge_model, const string &type, const map<string, GeAttrValue> &attrs, | Status SaveParams(GeModelPtr &ge_model, const string &type, const map<string, GeAttrValue> &attrs, | ||||
| const vector<GeTensor> &inputs, const vector<GeTensor> &outputs); | const vector<GeTensor> &inputs, const vector<GeTensor> &outputs); | ||||
| @@ -505,19 +507,7 @@ Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_pr | |||||
| GE_CHECK_NOTNULL(ge_root_model); | GE_CHECK_NOTNULL(ge_root_model); | ||||
| GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); | GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); | ||||
| ModelHelper model_helper; | |||||
| string model_name = ""; | |||||
| Status name_ret = model_helper.GetModelNameFromMergedGraphName(ge_root_model->GetRootGraph()->GetName(), model_name); | |||||
| if (name_ret != SUCCESS) { | |||||
| ErrorManager::GetInstance().ATCReportErrMessage("E10000", {"parameter"}, {"output"}); | |||||
| GELOGE(FAILED, "Get model_name failed. Param --output is invalid"); | |||||
| return PARAM_INVALID; | |||||
| } | |||||
| map<string, GeModelPtr> name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel(); | |||||
| GeModelPtr &ge_model = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()]; | |||||
| GE_RETURN_WITH_LOG_IF_FALSE(ge_model != nullptr, "ge_model can not be null"); | |||||
| ge_model->SetName(model_name); | |||||
| ret = impl_->SaveModel(file_name_prefix, ge_model, model); | |||||
| ret = impl_->SaveRootModel(file_name_prefix, ge_root_model, model); | |||||
| if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
| GELOGE(ret, "Save model failed"); | GELOGE(ret, "Save model failed"); | ||||
| if (impl_->graph_manager_.Finalize() != SUCCESS) { | if (impl_->graph_manager_.Finalize() != SUCCESS) { | ||||
| @@ -712,6 +702,44 @@ Status GeGenerator::Impl::SaveModel(const string &file_name_prefix, GeModelPtr & | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status GeGenerator::Impl::SaveRootModel(const string &file_name_prefix, GeRootModelPtr &ge_root_model, | |||||
| ModelBufferData &model_buff) { | |||||
| bool is_unknown_shape = false; | |||||
| auto ret = ge_root_model->CheckIsUnknownShape(is_unknown_shape); | |||||
| if (ret != SUCCESS) { | |||||
| GELOGE(FAILED, "Check root model is unkonwn shape failed"); | |||||
| return FAILED; | |||||
| } | |||||
| GELOGD("begin save root model, cur model is unkonwn shape model ? : %d", is_unknown_shape); | |||||
| GE_CHK_BOOL_EXEC(!ge_root_model->GetSubgraphInstanceNameToModel().empty(), return FAILED, | |||||
| "ge root model has no sub model") | |||||
| GeModelPtr model_root = nullptr; | |||||
| if (is_unknown_shape) { | |||||
| model_root = make_shared<GeModel>(); | |||||
| model_root->SetGraph(GraphUtils::CreateGraphFromComputeGraph(ge_root_model->GetRootGraph())); | |||||
| ge_root_model->SetSubgraphInstanceNameToModel(ge_root_model->GetRootGraph()->GetName(), model_root); | |||||
| model_root->SetName(ge_root_model->GetRootGraph()->GetName()); | |||||
| } else { | |||||
| model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second; | |||||
| } | |||||
| // set atc version | |||||
| if (!SetAtcVersionInfo(*(model_root.get()))) { | |||||
| GELOGW("SetPackageVersionInfo of atc failed!"); | |||||
| } | |||||
| // set opp version | |||||
| if (!SetOppVersionInfo(*(model_root.get()))) { | |||||
| GELOGW("SetPackageVersionInfo of ops failed!"); | |||||
| } | |||||
| ModelHelper model_helper; | |||||
| model_helper.SetSaveMode(is_offline_); | |||||
| ret = model_helper.SaveToOmRootModel(ge_root_model, save_param_, file_name_prefix, model_buff, is_unknown_shape); | |||||
| if (ret != SUCCESS) { | |||||
| GELOGE(ret, "Save to om model failed"); | |||||
| return ret; | |||||
| } | |||||
| return SUCCESS; | |||||
| } | |||||
| Status GeGenerator::Impl::BuildModel(const Graph &graph, const vector<GeTensor> &inputs, | Status GeGenerator::Impl::BuildModel(const Graph &graph, const vector<GeTensor> &inputs, | ||||
| GeRootModelPtr &ge_root_model) { | GeRootModelPtr &ge_root_model) { | ||||
| static std::atomic<GraphId> atomic_graph_id(0); | static std::atomic<GraphId> atomic_graph_id(0); | ||||
| @@ -23,6 +23,7 @@ | |||||
| namespace ge { | namespace ge { | ||||
| class GeRootModel { | class GeRootModel { | ||||
| public: | public: | ||||
| GeRootModel() = default; | |||||
| explicit GeRootModel(ComputeGraphPtr &root_graph) : root_graph_(root_graph), model_id_(INVALID_MODEL_ID) {}; | explicit GeRootModel(ComputeGraphPtr &root_graph) : root_graph_(root_graph), model_id_(INVALID_MODEL_ID) {}; | ||||
| ~GeRootModel() = default; | ~GeRootModel() = default; | ||||
| @@ -35,11 +36,11 @@ class GeRootModel { | |||||
| void SetModelId(uint32_t model_id) { model_id_ = model_id; } | void SetModelId(uint32_t model_id) { model_id_ = model_id; } | ||||
| uint32_t GetModelId() const { return model_id_; } | uint32_t GetModelId() const { return model_id_; } | ||||
| Status CheckIsUnknownShape(bool &is_dynamic_shape); | Status CheckIsUnknownShape(bool &is_dynamic_shape); | ||||
| void SetRootGraph(ComputeGraphPtr graph) { root_graph_ = graph; } | |||||
| private: | private: | ||||
| ComputeGraphPtr root_graph_; | |||||
| ComputeGraphPtr root_graph_ = nullptr; | |||||
| std::map<std::string, GeModelPtr> subgraph_instance_name_to_model_; | std::map<std::string, GeModelPtr> subgraph_instance_name_to_model_; | ||||
| uint32_t model_id_; | |||||
| uint32_t model_id_ = 0; | |||||
| }; | }; | ||||
| } // namespace ge | } // namespace ge | ||||
| using GeRootModelPtr = std::shared_ptr<ge::GeRootModel>; | using GeRootModelPtr = std::shared_ptr<ge::GeRootModel>; | ||||
| @@ -25,6 +25,7 @@ | |||||
| #include "common/types.h" | #include "common/types.h" | ||||
| #include "graph/model.h" | #include "graph/model.h" | ||||
| #include "model/ge_model.h" | #include "model/ge_model.h" | ||||
| #include "model/ge_root_model.h" | |||||
| namespace ge { | namespace ge { | ||||
| class ModelHelper { | class ModelHelper { | ||||
| @@ -32,17 +33,22 @@ class ModelHelper { | |||||
| ModelHelper() = default; | ModelHelper() = default; | ||||
| ~ModelHelper(); | ~ModelHelper(); | ||||
| Status SaveToOmModel(const GeModelPtr &ge_model, const SaveParam &save_param, | |||||
| const std::string &output_file, ge::ModelBufferData &model); | |||||
| Status SaveOriginalGraphToOmModel(const ge::Graph& graph, const std::string& output_file); | |||||
| Status SaveToOmModel(const GeModelPtr &ge_model, const SaveParam &save_param, const std::string &output_file, | |||||
| ge::ModelBufferData &model); | |||||
| Status SaveToOmRootModel(const GeRootModelPtr &ge_root_model, const SaveParam &save_param, const string &output_file, | |||||
| ModelBufferData &model, bool is_unknown_shape); | |||||
| Status SaveOriginalGraphToOmModel(const ge::Graph &graph, const std::string &output_file); | |||||
| Status LoadModel(const ge::ModelData &model_data); | Status LoadModel(const ge::ModelData &model_data); | ||||
| Status GetModelBufferData(ge::ModelBufferData& model); | |||||
| Status LoadRootModel(const ge::ModelData &model_data); | |||||
| Status GetModelBufferData(ge::ModelBufferData &model); | |||||
| const ModelFileHeader* GetFileHeader() const { return file_header_; } | |||||
| const ModelFileHeader *GetFileHeader() const { return file_header_; } | |||||
| GeModelPtr GetGeModel(); | GeModelPtr GetGeModel(); | ||||
| GeRootModelPtr GetGeRootModel(); | |||||
| void SetSaveMode(bool val) { is_offline_ = val; } | void SetSaveMode(bool val) { is_offline_ = val; } | ||||
| bool GetSaveMode(void) const { return is_offline_; } | bool GetSaveMode(void) const { return is_offline_; } | ||||
| bool GetModelType() const { return is_unknown_shape_model_; }; | |||||
| Status GetBaseNameFromFileName(const std::string &file_name, std::string &base_name); | Status GetBaseNameFromFileName(const std::string &file_name, std::string &base_name); | ||||
| Status GetModelNameFromMergedGraphName(const std::string &graph_name, std::string &model_name); | Status GetModelNameFromMergedGraphName(const std::string &graph_name, std::string &model_name); | ||||
| @@ -50,24 +56,46 @@ class ModelHelper { | |||||
| private: | private: | ||||
| bool is_assign_model_ = false; | bool is_assign_model_ = false; | ||||
| bool is_offline_ = true; | bool is_offline_ = true; | ||||
| ModelFileHeader* file_header_ = nullptr; | |||||
| bool is_unknown_shape_model_ = false; | |||||
| ModelFileHeader *file_header_ = nullptr; | |||||
| // Encrypted model need delete temp model and unencrypted model need not delete model | // Encrypted model need delete temp model and unencrypted model need not delete model | ||||
| uint8_t *model_addr_tmp_ = nullptr; | uint8_t *model_addr_tmp_ = nullptr; | ||||
| uint32_t model_len_tmp_ = 0; | uint32_t model_len_tmp_ = 0; | ||||
| GeModelPtr model_; | GeModelPtr model_; | ||||
| GeRootModelPtr root_model_; | |||||
| ModelHelper(const ModelHelper&); | |||||
| ModelHelper& operator=(const ModelHelper&); | |||||
| Status GenerateGeModel(OmFileLoadHelper& om_load_helper); | |||||
| Status LoadModelData(OmFileLoadHelper& om_load_helper); | |||||
| void SetModelToGeModel(ge::Model& model); | |||||
| Status LoadWeights(OmFileLoadHelper& om_load_helper); | |||||
| Status LoadTask(OmFileLoadHelper& om_load_helper); | |||||
| Status LoadTBEKernelStore(OmFileLoadHelper& om_load_helper); | |||||
| Status LoadCustAICPUKernelStore(OmFileLoadHelper& om_load_helper); | |||||
| ModelHelper(const ModelHelper &); | |||||
| ModelHelper &operator=(const ModelHelper &); | |||||
| Status GenerateGeModel(OmFileLoadHelper &om_load_helper); | |||||
| Status GenerateGeRootModel(OmFileLoadHelper &om_load_helper); | |||||
| Status LoadModelData(OmFileLoadHelper &om_load_helper); | |||||
| void SetModelToGeModel(ge::Model &model); | |||||
| Status LoadModelData(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index); | |||||
| Status LoadWeights(OmFileLoadHelper &om_load_helper); | |||||
| Status LoadWeights(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index); | |||||
| Status LoadTask(OmFileLoadHelper &om_load_helper); | |||||
| Status LoadTask(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index); | |||||
| Status LoadTBEKernelStore(OmFileLoadHelper &om_load_helper); | |||||
| Status LoadTBEKernelStore(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index); | |||||
| Status LoadCustAICPUKernelStore(OmFileLoadHelper &om_load_helper); | |||||
| Status LoadCustAICPUKernelStore(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index); | |||||
| Status ReleaseLocalModelData() noexcept; | Status ReleaseLocalModelData() noexcept; | ||||
| Status SaveModelPartition(std::shared_ptr<OmFileSaveHelper>& om_file_save_helper, | |||||
| ModelPartitionType type, const uint8_t* data, size_t size); | |||||
| Status SaveModelPartition(std::shared_ptr<OmFileSaveHelper> &om_file_save_helper, ModelPartitionType type, | |||||
| const uint8_t *data, size_t size, size_t model_index); | |||||
| Status SaveModelDef(shared_ptr<OmFileSaveHelper> &om_file_save_helper, const GeModelPtr &ge_model, | |||||
| Buffer &model_buffer, size_t model_index = 0); | |||||
| Status SaveModelWeights(shared_ptr<OmFileSaveHelper> &om_file_save_helper, const GeModelPtr &ge_model, | |||||
| size_t model_index = 0); | |||||
| Status SaveModelTbeKernel(shared_ptr<OmFileSaveHelper> &om_file_save_helper, const GeModelPtr &ge_model, | |||||
| size_t model_index = 0); | |||||
| Status SaveModelCustAICPU(shared_ptr<OmFileSaveHelper> &om_file_save_helper, const GeModelPtr &ge_model, | |||||
| size_t model_index = 0); | |||||
| Status SaveModelTaskDef(shared_ptr<OmFileSaveHelper> &om_file_save_helper, const GeModelPtr &ge_model, | |||||
| Buffer &task_buffer, size_t model_index = 0); | |||||
| Status SaveModelHeader(shared_ptr<OmFileSaveHelper> &om_file_save_helper, const GeModelPtr &ge_model, | |||||
| size_t model_num = 1); | |||||
| Status SaveAllModelPartiton(shared_ptr<OmFileSaveHelper> &om_file_save_helper, const GeModelPtr &ge_model, | |||||
| Buffer &model_buffer, Buffer &task_buffer, size_t model_index = 0); | |||||
| }; | }; | ||||
| } // namespace ge | } // namespace ge | ||||
| #endif // INC_FRAMEWORK_COMMON_HELPER_MODEL_HELPER_H_ | #endif // INC_FRAMEWORK_COMMON_HELPER_MODEL_HELPER_H_ | ||||
| @@ -32,14 +32,14 @@ using std::vector; | |||||
| namespace ge { | namespace ge { | ||||
| struct ModelPartition { | struct ModelPartition { | ||||
| ModelPartitionType type; | ModelPartitionType type; | ||||
| uint8_t* data = 0; | |||||
| uint8_t *data = 0; | |||||
| uint32_t size = 0; | uint32_t size = 0; | ||||
| }; | }; | ||||
| struct OmFileContext { | struct OmFileContext { | ||||
| std::vector<ModelPartition> partition_datas_; | std::vector<ModelPartition> partition_datas_; | ||||
| std::vector<char> partition_table_; | std::vector<char> partition_table_; | ||||
| uint32_t model_data_len_; | |||||
| uint32_t model_data_len_ = 0; | |||||
| }; | }; | ||||
| struct SaveParam { | struct SaveParam { | ||||
| @@ -57,15 +57,23 @@ class OmFileLoadHelper { | |||||
| Status Init(uint8_t *model_data, const uint32_t model_data_size); | Status Init(uint8_t *model_data, const uint32_t model_data_size); | ||||
| Status Init(uint8_t *model_data, const uint32_t model_data_size, uint32_t model_num); | |||||
| Status GetModelPartition(ModelPartitionType type, ModelPartition &partition); | Status GetModelPartition(ModelPartitionType type, ModelPartition &partition); | ||||
| Status GetModelPartition(ModelPartitionType type, ModelPartition &partition, size_t model_index); | |||||
| OmFileContext context_; | OmFileContext context_; | ||||
| vector<OmFileContext> model_contexts_; | |||||
| private: | private: | ||||
| Status CheckModelValid(const ge::ModelData &model) const; | Status CheckModelValid(const ge::ModelData &model) const; | ||||
| Status LoadModelPartitionTable(uint8_t *model_data, const uint32_t model_data_size); | Status LoadModelPartitionTable(uint8_t *model_data, const uint32_t model_data_size); | ||||
| Status LoadModelPartitionTable(uint8_t *model_data, const uint32_t model_data_size, uint32_t model_num); | |||||
| bool is_inited_{false}; | bool is_inited_{false}; | ||||
| }; | }; | ||||
| @@ -79,15 +87,23 @@ class OmFileSaveHelper { | |||||
| Status AddPartition(ModelPartition &partition); | Status AddPartition(ModelPartition &partition); | ||||
| Status AddPartition(ModelPartition &partition, size_t cur_index); | |||||
| const std::vector<ModelPartition> &GetModelPartitions() const; | const std::vector<ModelPartition> &GetModelPartitions() const; | ||||
| Status SaveModel(const SaveParam &save_param, const char *target_file, | |||||
| ge::ModelBufferData& model, bool is_offline = true); | |||||
| Status SaveModel(const SaveParam &save_param, const char *target_file, ge::ModelBufferData &model, | |||||
| bool is_offline = true); | |||||
| Status SaveModelToFile(const char *output_file, ge::ModelBufferData &model, bool is_offline = true); | Status SaveModelToFile(const char *output_file, ge::ModelBufferData &model, bool is_offline = true); | ||||
| vector<OmFileContext> model_contexts_; | |||||
| ModelFileHeader model_header_; | ModelFileHeader model_header_; | ||||
| OmFileContext context_; | OmFileContext context_; | ||||
| ModelPartitionTable *GetPartitionTable(size_t cur_ctx_index); | |||||
| Status SaveRootModel(const SaveParam &save_param, const char *output_file, ModelBufferData &model, bool is_offline); | |||||
| }; | }; | ||||
| } // namespace ge | } // namespace ge | ||||
| #endif // INC_FRAMEWORK_COMMON_HELPER_OM_FILE_HELPER_H_ | #endif // INC_FRAMEWORK_COMMON_HELPER_OM_FILE_HELPER_H_ | ||||
| @@ -529,7 +529,7 @@ REGISTER_OPTYPE_DECLARE(HVDWAIT, "HorovodWait"); | |||||
| // aicpu op for online_infer dynamic_dims | // aicpu op for online_infer dynamic_dims | ||||
| REGISTER_OPTYPE_DECLARE(GETDYNAMICDIMS, "GetDynamicDims"); | REGISTER_OPTYPE_DECLARE(GETDYNAMICDIMS, "GetDynamicDims"); | ||||
| enum InputMode { INPUT = 0, CONST_INPUT}; | |||||
| enum InputMode { INPUT = 0, CONST_INPUT }; | |||||
| // Definition of the processing status enum of the process module | // Definition of the processing status enum of the process module | ||||
| enum ModelProcessState { | enum ModelProcessState { | ||||
| @@ -605,7 +605,7 @@ static constexpr uint32_t MODEL_FILE_CHECKSUM_LENGTH = 64; | |||||
| /// | /// | ||||
| /// @brief length of the reserved field in the model file header | /// @brief length of the reserved field in the model file header | ||||
| /// | /// | ||||
| static constexpr uint32_t MODEL_FILE_RESERVED_LENGTH = 79; | |||||
| static constexpr uint32_t MODEL_FILE_RESERVED_LENGTH = 75; | |||||
| /// | /// | ||||
| /// @ingroup domi_omg | /// @ingroup domi_omg | ||||
| @@ -843,9 +843,10 @@ struct ModelFileHeader { | |||||
| uint32_t ops = 0; // Computing power (Kops) | uint32_t ops = 0; // Computing power (Kops) | ||||
| uint8_t userdefineinfo[USER_DEFINE_INFO_LENGTH] = {0}; // User-defined information. The value contains 32 characters | uint8_t userdefineinfo[USER_DEFINE_INFO_LENGTH] = {0}; // User-defined information. The value contains 32 characters | ||||
| uint32_t om_ir_version = 0; | uint32_t om_ir_version = 0; | ||||
| uint32_t model_num = 0; | |||||
| uint8_t platform_version[PLATFORM_VERSION_LEN] = {0}; | uint8_t platform_version[PLATFORM_VERSION_LEN] = {0}; | ||||
| uint8_t platform_type = {0}; | uint8_t platform_type = {0}; | ||||
| uint8_t reserved[MODEL_FILE_RESERVED_LENGTH] = {0}; // Reserved field 79 | |||||
| uint8_t reserved[MODEL_FILE_RESERVED_LENGTH] = {0}; // Reserved field 75 | |||||
| }; | }; | ||||
| static constexpr uint8_t TARGET_TYPE_LTTE_8BIT = 0; | static constexpr uint8_t TARGET_TYPE_LTTE_8BIT = 0; | ||||