From 05df6d57aee65bae998604ab7c82d64e4a229c47 Mon Sep 17 00:00:00 2001 From: "wangwenhua1@huawei.com" Date: Tue, 22 Dec 2020 15:47:01 +0800 Subject: [PATCH] display model info --- ge/common/helper/model_helper.cc | 17 ++++++- ge/generator/ge_generator.cc | 70 +++++++++++++++++++++++++++++ ge/offline/main.cc | 32 ++++++++++++- ge/session/omg.cc | 57 ++++++++++++++++++++--- inc/external/ge/ge_api_types.h | 3 ++ inc/framework/omg/omg.h | 4 +- inc/framework/omg/omg_inner_types.h | 9 ++-- 7 files changed, 178 insertions(+), 14 deletions(-) diff --git a/ge/common/helper/model_helper.cc b/ge/common/helper/model_helper.cc index aacef88c..5b23d6b4 100644 --- a/ge/common/helper/model_helper.cc +++ b/ge/common/helper/model_helper.cc @@ -87,7 +87,9 @@ Status ModelHelper::SaveModelDef(std::shared_ptr &om_file_save model_tmp->SetGraph(ge_model->GetGraph()); model_tmp->SetVersion(ge_model->GetVersion()); model_tmp->SetAttr(ge_model->MutableAttrMap()); - + GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(ge_model, "modeldef_size", model_buffer.GetSize()), + GELOGE(FAILED, "SetInt of modeldef_size failed."); + return FAILED); (void)model_tmp->Save(model_buffer); GELOGD("MODEL_DEF size is %zu", model_buffer.GetSize()); @@ -105,6 +107,9 @@ Status ModelHelper::SaveModelWeights(std::shared_ptr &om_file_ const GeModelPtr &ge_model, size_t model_index) { auto ge_model_weight = ge_model->GetWeight(); GELOGD("WEIGHTS_DATA size is %zu, %p", ge_model_weight.GetSize(), ge_model_weight.GetData()); + GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(ge_model, "weight_data_size", ge_model_weight.GetSize()), + GELOGE(FAILED, "SetInt of weight_data_size failed."); + return FAILED); // weight is not necessary if (ge_model_weight.GetSize() > 0) { GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, @@ -119,6 +124,9 @@ Status ModelHelper::SaveModelTbeKernel(std::shared_ptr &om_fil const GeModelPtr &ge_model, size_t model_index) { TBEKernelStore tbe_kernel_store = ge_model->GetTBEKernelStore(); GELOGD("TBE_KERNELS size is %zu", tbe_kernel_store.DataSize()); + GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(ge_model, "tbe_kernels_size", tbe_kernel_store.DataSize()), + GELOGE(FAILED, "SetInt of tbe_kernels_size failed."); + return FAILED); if (tbe_kernel_store.DataSize() > 0) { GE_CHK_STATUS_RET( SaveModelPartition(om_file_save_helper, ModelPartitionType::TBE_KERNELS, @@ -135,6 +143,9 @@ Status ModelHelper::SaveModelCustAICPU(std::shared_ptr &om_fil const GeModelPtr &ge_model, size_t model_index) { CustAICPUKernelStore cust_aicpu_kernel_store = ge_model->GetCustAICPUKernelStore(); GELOGD("cust aicpu kernels size is %zu", cust_aicpu_kernel_store.DataSize()); + GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(ge_model, "cust_aicpu_kernel_store_size", cust_aicpu_kernel_store.DataSize()), + GELOGE(FAILED, "SetInt of tbe_kernels_size failed."); + return FAILED); if (cust_aicpu_kernel_store.DataSize() > 0) { GE_CHK_STATUS_RET(SaveModelPartition(om_file_save_helper, ModelPartitionType::CUST_AICPU_KERNELS, @@ -167,6 +178,10 @@ Status ModelHelper::SaveModelTaskDef(std::shared_ptr &om_file_ GELOGD("TASK_INFO op_size:%d, stream_num:%u", model_task_def->op().size(), model_task_def->stream_num()); GELOGD("TASK_INFO size is %zu", partition_task_size); + GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(ge_model, "task_info_size", partition_task_size), + GELOGE(FAILED, "SetInt of task_info_size failed."); + return FAILED); + if (SaveModelPartition(om_file_save_helper, ModelPartitionType::TASK_INFO, task_buffer.GetData(), partition_task_size, model_index) != SUCCESS) { GELOGE(PARAM_INVALID, "Add model task def partition failed"); diff --git a/ge/generator/ge_generator.cc b/ge/generator/ge_generator.cc index acb029e9..d10d5673 100644 --- a/ge/generator/ge_generator.cc +++ b/ge/generator/ge_generator.cc @@ -318,6 +318,8 @@ class GeGenerator::Impl { bool GetVersionFromPath(const std::string &file_path, std::string &version); bool SetAtcVersionInfo(AttrHolder &obj); bool SetOppVersionInfo(AttrHolder &obj); + bool SetOmSystemInfo(AttrHolder &obj); + void DisplayModelInfo(AttrHolder &obj); }; Status GeGenerator::Initialize(const map &options) { @@ -528,6 +530,70 @@ bool GeGenerator::Impl::SetOppVersionInfo(AttrHolder &obj) { return true; } +bool GeGenerator::Impl::SetOmSystemInfo(AttrHolder &obj) { + std::string soc_version; + (void)ge::GetContext().GetOption(ge::SOC_VERSION, soc_version); + GELOGI("SetOmSystemInfo soc_version: %s", soc_version.c_str()); + if (!ge::AttrUtils::SetStr(obj, "soc_version", soc_version)) { + GELOGW("SetStr of soc_version failed."); + return false; + } + std::string framework_type; + (void)ge::GetContext().GetOption(ge::FRAMEWORK_TYPE, framework_type); + GELOGI("SetOmSystemInfo framework_type: %s", framework_type.c_str()); + if (!ge::AttrUtils::SetStr(obj, "framework_type", framework_type)) { + GELOGW("SetStr of framework_type failed."); + return false; + } + return true; +} + +void GeGenerator::Impl::DisplayModelInfo(AttrHolder &obj) { + std::string display_model; + (void)ge::GetContext().GetOption(ge::DISPLAY_MODEL_INFO, display_model); + if (display_model != "1") { + GELOGD("display_model not 1"); + return; + } + // + int64_t memory_size; + (void)ge::AttrUtils::GetInt(obj, ATTR_MODEL_MEMORY_SIZE, memory_size); + int64_t weight_size; + (void)ge::AttrUtils::GetInt(obj, ATTR_MODEL_WEIGHT_SIZE, weight_size); + int64_t stream_num; + (void)ge::AttrUtils::GetInt(obj, ATTR_MODEL_STREAM_NUM, stream_num); + int64_t event_num; + (void)ge::AttrUtils::GetInt(obj, ATTR_MODEL_EVENT_NUM, event_num); + std::cout << ATTR_MODEL_MEMORY_SIZE << "[" << memory_size << "], " << ATTR_MODEL_WEIGHT_SIZE << "[" << weight_size << + "], " << ATTR_MODEL_STREAM_NUM << "[" << stream_num << "], " << ATTR_MODEL_EVENT_NUM << "[" << event_num << "]." + << std::endl; + + // + std::string atc_version; + (void)ge::AttrUtils::GetStr(obj, ATTR_MODEL_ATC_VERSION, atc_version); + std::string soc_version; + (void)ge::AttrUtils::GetStr(obj, "soc_version", soc_version); + std::string framework_type; + (void)ge::AttrUtils::GetStr(obj, "framework_type", framework_type); + std::cout << ATTR_MODEL_ATC_VERSION << "[" << atc_version << "], " << "soc_version" << "[" << soc_version << + "], " << "framework_type" << "[" << framework_type << "]." << std::endl; + + // + int64_t modeldef_size; + (void)ge::AttrUtils::GetInt(obj, "modeldef_size", modeldef_size); + int64_t weight_data_size; + (void)ge::AttrUtils::GetInt(obj, "weight_data_size", weight_data_size); + int64_t tbe_kernels_size; + (void)ge::AttrUtils::GetInt(obj, "tbe_kernels_size", tbe_kernels_size); + int64_t cust_aicpu_kernel_store_size; + (void)ge::AttrUtils::GetInt(obj, "cust_aicpu_kernel_store_size", cust_aicpu_kernel_store_size); + int64_t task_info_size; + (void)ge::AttrUtils::GetInt(obj, "task_info_size", task_info_size); + std::cout << "modeldef_size" << "[" << modeldef_size << "], " << "weight_data_size" << "[" << weight_data_size << + "], " << "tbe_kernels_size" << "[" << tbe_kernels_size << "], " << "cust_aicpu_kernel_store_size" << "[" << + cust_aicpu_kernel_store_size << "], " << "task_info_size" << "[" << task_info_size << "]." << std::endl; +} + Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_prefix, const vector &inputs, ModelBufferData &model, bool is_offline) { rtContext_t ctx = nullptr; @@ -786,6 +852,9 @@ Status GeGenerator::Impl::SaveModel(const string &file_name_prefix, GeModelPtr & if (!SetOppVersionInfo(*(model.get()))) { GELOGW("SetPackageVersionInfo of ops failed!"); } + if (!SetOmSystemInfo(*(model.get()))) { + GELOGW("SetOmsystemInfo failed!"); + } ModelHelper model_helper; model_helper.SetSaveMode(is_offline_); Status ret = model_helper.SaveToOmModel(model, save_param_, file_name_prefix, model_buff); @@ -793,6 +862,7 @@ Status GeGenerator::Impl::SaveModel(const string &file_name_prefix, GeModelPtr & GELOGE(ret, "Save to om model failed"); return ret; } + DisplayModelInfo(*(model.get())); return SUCCESS; } diff --git a/ge/offline/main.cc b/ge/offline/main.cc index b7188a85..0b4ea7f7 100755 --- a/ge/offline/main.cc +++ b/ge/offline/main.cc @@ -202,6 +202,8 @@ DEFINE_string(mdl_bank_path, "", "Optional; model bank path"); DEFINE_string(op_bank_path, "", "Optional; op bank path"); +DEFINE_string(display_model_info, "0", "Optional; display model info"); + class GFlagUtils { public: /** @@ -307,7 +309,8 @@ class GFlagUtils { " --op_compiler_cache_dir Set the save path of operator compilation cache files.\n" "Default value: $HOME/atc_data/kernel_cache\n" " --op_compiler_cache_mode Set the operator compilation cache mode." - "Options are disable(default), enable and force(force to refresh the cache)"); + "Options are disable(default), enable and force(force to refresh the cache)" + " --display_model_info enable for display model inf; 0(default): close display, 1: open display"); gflags::ParseCommandLineNonHelpFlags(&argc, &argv, true); // Using gflags to analyze input parameters @@ -853,7 +856,7 @@ domi::Status GenerateInfershapeJson() { static Status ConvertModelToJson(int fwk_type, const string &model_file, const string &json_file) { Status ret = ge::SUCCESS; if (fwk_type == -1) { - ret = ge::ConvertOmModelToJson(model_file.c_str(), json_file.c_str()); + ret = ge::ConvertOm(model_file.c_str(), json_file.c_str(), true); return ret; } @@ -1162,6 +1165,8 @@ domi::Status GenerateOmModel() { options.insert(std::pair(string(ge::MDL_BANK_PATH_FLAG), FLAGS_mdl_bank_path)); options.insert(std::pair(string(ge::OP_BANK_PATH_FLAG), FLAGS_op_bank_path)); + + options.insert(std::pair(string(ge::DISPLAY_MODEL_INFO), FLAGS_display_model_info)); // set enable scope fusion passes SetEnableScopeFusionPasses(FLAGS_enable_scope_fusion_passes); // print atc option map @@ -1187,6 +1192,26 @@ domi::Status ConvertModelToJson() { return domi::SUCCESS; } +domi::Status DisplayModelInfo() { + // No model path passed in + GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(FLAGS_om == "", + ErrorManager::GetInstance().ATCReportErrMessage("E10004", {"parameter"}, {"om"}); + return ge::FAILED, + "Input parameter[--om]'s value is empty!!"); + + // Check if the model path is valid + GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( + FLAGS_om != "" && !ge::CheckInputPathValid(FLAGS_om, "--om"), + return ge::FAILED, + "model file path is invalid: %s.", FLAGS_om.c_str()); + + if (FLAGS_framework == -1) { + return ge::ConvertOm(FLAGS_om.c_str(), "", false); + } + + return ge::FAILED; +} + bool CheckRet(domi::Status ret) { if (ret != domi::SUCCESS) { if (FLAGS_mode == ONLY_PRE_CHECK) { @@ -1330,6 +1355,9 @@ int main(int argc, char* argv[]) { } else if (FLAGS_mode == ge::RunMode::PBTXT_TO_JSON) { GE_CHK_BOOL_EXEC(ConvertPbtxtToJson() == domi::SUCCESS, ret = domi::FAILED; break, "ATC convert pbtxt to json execute failed!!"); + } else if (FLAGS_mode == ge::RunMode::DISPLAY_OM_INFO) { + GE_CHK_BOOL_EXEC(DisplayModelInfo() == domi::SUCCESS, ret = domi::FAILED; + break, "ATC ConvertJson execute failed!!"); } else { ErrorManager::GetInstance().ATCReportErrMessage( "E10001", {"parameter", "value", "reason"}, {"--mode", std::to_string(FLAGS_mode), kModeSupport}); diff --git a/ge/session/omg.cc b/ge/session/omg.cc index 7ff52e82..36d171cd 100755 --- a/ge/session/omg.cc +++ b/ge/session/omg.cc @@ -869,9 +869,50 @@ void GetGroupName(ge::proto::ModelDef &model_def) { }); } -FMK_FUNC_HOST_VISIBILITY Status ConvertOmModelToJson(const char *model_file, const char *json_file) { +FMK_FUNC_HOST_VISIBILITY void PrintModelInfo(ge::proto::ModelDef *model_def) { + auto model_attr_map = model_def->mutable_attr(); + auto iter = model_attr_map->find(ATTR_MODEL_MEMORY_SIZE); + auto memory_size = (iter != model_attr_map->end()) ? iter->second.i() : -1; + iter = model_attr_map->find(ATTR_MODEL_WEIGHT_SIZE); + auto weight_size = (iter != model_attr_map->end()) ? iter->second.i() : -1; + iter = model_attr_map->find(ATTR_MODEL_STREAM_NUM); + auto stream_num = (iter != model_attr_map->end()) ? iter->second.i() : -1; + iter = model_attr_map->find(ATTR_MODEL_EVENT_NUM); + auto event_num = (iter != model_attr_map->end()) ? iter->second.i() : -1; + std::cout << ATTR_MODEL_MEMORY_SIZE << "[" << memory_size << "], " << ATTR_MODEL_WEIGHT_SIZE << "[" << weight_size << + "], " << ATTR_MODEL_STREAM_NUM << "[" << stream_num << "], " << ATTR_MODEL_EVENT_NUM << "[" << event_num << "]." + << std::endl; + + iter = model_attr_map->find(ATTR_MODEL_ATC_VERSION); + auto atc_version = (iter != model_attr_map->end()) ? iter->second.s() : ""; + iter = model_attr_map->find("soc_version"); + auto soc_version = (iter != model_attr_map->end()) ? iter->second.s() : ""; + iter = model_attr_map->find("framework_type"); + auto framework_type = (iter != model_attr_map->end()) ? iter->second.s() : ""; + std::cout << ATTR_MODEL_ATC_VERSION << "[" << atc_version << "], " << "soc_version" << "[" << soc_version << + "], " << "framework_type" << "[" << framework_type << "]." << std::endl; + + iter = model_attr_map->find("modeldef_size"); + auto modeldef_size = (iter != model_attr_map->end()) ? iter->second.i() : -1; + iter = model_attr_map->find("weight_data_size"); + auto weight_data_size = (iter != model_attr_map->end()) ? iter->second.i() : -1; + iter = model_attr_map->find("tbe_kernels_size"); + auto tbe_kernels_size = (iter != model_attr_map->end()) ? iter->second.i() : -1; + iter = model_attr_map->find("cust_aicpu_kernel_store_size"); + auto cust_aicpu_kernel_store_size = (iter != model_attr_map->end()) ? iter->second.i() : -1; + iter = model_attr_map->find("task_info_size"); + auto task_info_size = (iter != model_attr_map->end()) ? iter->second.i() : -1; + + std::cout << "modeldef_size" << "[" << modeldef_size << "], " << "weight_data_size" << "[" << weight_data_size << + "], " << "tbe_kernels_size" << "[" << tbe_kernels_size << "], " << "cust_aicpu_kernel_store_size" << "[" << + cust_aicpu_kernel_store_size << "], " << "task_info_size" << "[" << task_info_size << "]." << std::endl; +} + +FMK_FUNC_HOST_VISIBILITY Status ConvertOm(const char *model_file, const char *json_file, bool is_covert_to_json) { GE_CHECK_NOTNULL(model_file); - GE_CHECK_NOTNULL(json_file); + if (is_covert_to_json) { + GE_CHECK_NOTNULL(json_file); + } ge::ModelData model; // Mode 2 does not need to verify the priority, and a default value of 0 is passed @@ -917,12 +958,16 @@ FMK_FUNC_HOST_VISIBILITY Status ConvertOmModelToJson(const char *model_file, con // De serialization bool flag = ReadProtoFromArray(ir_part.data, ir_part.size, &model_def); if (flag) { - GetGroupName(model_def); + if (is_covert_to_json) { + GetGroupName(model_def); - json j; - Pb2Json::Message2Json(model_def, kOmBlackFields, j, true); + json j; + Pb2Json::Message2Json(model_def, kOmBlackFields, j, true); - ret = ModelSaver::SaveJsonToFile(json_file, j); + ret = ModelSaver::SaveJsonToFile(json_file, j); + } else { + PrintModelInfo(&model_def); + } } else { ret = INTERNAL_ERROR; GELOGE(ret, "ReadProtoFromArray failed."); diff --git a/inc/external/ge/ge_api_types.h b/inc/external/ge/ge_api_types.h index 59e8808b..ed9fc71e 100644 --- a/inc/external/ge/ge_api_types.h +++ b/inc/external/ge/ge_api_types.h @@ -291,6 +291,9 @@ const std::string OP_DEBUG_LEVEL = "ge.opDebugLevel"; // Configure model bank path const std::string MDL_BANK_PATH_FLAG = "ge.mdl_bank_path"; +// Configure display_model_info flag +const std::string DISPLAY_MODEL_INFO = "ge.display_model_info"; + // Configure op bank path const std::string OP_BANK_PATH_FLAG = "ge.op_bank_path"; const std::string OP_BANK_UPDATE_FLAG = "ge.op_bank_update"; diff --git a/inc/framework/omg/omg.h b/inc/framework/omg/omg.h index e7ca05f7..62332b8d 100644 --- a/inc/framework/omg/omg.h +++ b/inc/framework/omg/omg.h @@ -73,7 +73,7 @@ Status ParseGraph(ge::Graph &graph, const std::map &atc_params, * @param [key] encrypted key * @return Status result code */ -Status ConvertOmModelToJson(const char *model_file, const char *json_file); +Status ConvertOm(const char *model_file, const char *json_file, bool is_covert_to_json); Status ConvertPbtxtToJson(const char *model_file, const char *json_file); /** @@ -103,6 +103,8 @@ void GetOutputNodesNameAndIndex(std::vector> &ou void UpdateOmgCtxWithParserCtx(); void UpdateParserCtxWithOmgCtx(); + +void PrintModelInfo(ge::proto::ModelDef *model_def); } // namespace ge namespace domi { diff --git a/inc/framework/omg/omg_inner_types.h b/inc/framework/omg/omg_inner_types.h index 454890aa..abae1fbb 100644 --- a/inc/framework/omg/omg_inner_types.h +++ b/inc/framework/omg/omg_inner_types.h @@ -43,10 +43,11 @@ namespace ge { * @brief run model */ enum RunMode { - GEN_OM_MODEL = 0, // generate offline model file - MODEL_TO_JSON = 1, // convert to JSON file - ONLY_PRE_CHECK = 3, // only for pre-check - PBTXT_TO_JSON = 5 // pbtxt to json + GEN_OM_MODEL = 0, // generate offline model file + MODEL_TO_JSON = 1, // convert to JSON file + ONLY_PRE_CHECK = 3, // only for pre-check + PBTXT_TO_JSON = 5, // pbtxt to json + DISPLAY_OM_INFO = 6 // display model info }; ///