From d2a1b83027ae4c28eb137f6ded1df8989dd0304b Mon Sep 17 00:00:00 2001 From: lichun Date: Thu, 11 Mar 2021 18:47:07 +0800 Subject: [PATCH 1/7] dynamic shape inference support --- ge/common/helper/model_helper.cc | 11 ++-- ge/executor/ge_executor.cc | 39 ++++++++++++ ge/generator/ge_generator.cc | 61 +++++++++++++------ ge/graph/build/graph_builder.cc | 2 +- .../ut/ge/graph/load/model_helper_unittest.cc | 7 --- 5 files changed, 90 insertions(+), 30 deletions(-) diff --git a/ge/common/helper/model_helper.cc b/ge/common/helper/model_helper.cc index 02c0a8f0..74238bc1 100644 --- a/ge/common/helper/model_helper.cc +++ b/ge/common/helper/model_helper.cc @@ -87,12 +87,13 @@ Status ModelHelper::SaveSizeToModelDef(const GeModelPtr &ge_model) { std::shared_ptr model_task_def = ge_model->GetModelTaskDefPtr(); if (model_task_def == nullptr) { - GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Create model task def ptr failed"); - return ACL_ERROR_GE_MEMORY_ALLOCATION; + GELOGD("SaveSizeToModelDef task_info_size is 0."); + om_info.push_back(0); + } else { + size_t partition_task_size = model_task_def->ByteSizeLong(); + GELOGD("SaveSizeToModelDef task_info_size is %zu", partition_task_size); + om_info.push_back(partition_task_size); } - size_t partition_task_size = model_task_def->ByteSizeLong(); - GELOGD("SaveSizeToModelDef task_info_size is %zu", partition_task_size); - om_info.push_back(partition_task_size); GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(*(ge_model.get()), "om_info_list", om_info), GELOGE(FAILED, "SetListInt of om_info_list failed."); diff --git a/ge/executor/ge_executor.cc b/ge/executor/ge_executor.cc index 44b2dbfa..c69a9d1e 100755 --- a/ge/executor/ge_executor.cc +++ b/ge/executor/ge_executor.cc @@ -30,6 +30,8 @@ #include "single_op/single_op_manager.h" #include "graph/load/model_manager/davinci_model.h" #include "opskernel_manager/ops_kernel_builder_manager.h" +#include "graph/opsproto_manager.h" +#include "ge_local_engine/engine/host_cpu_engine.h" using std::string; using std::vector; @@ -199,6 +201,33 @@ bool IsDynmaicDimsSizeMatchModel(const vector cur_dynamic_dims, namespace ge { bool GeExecutor::isInit_ = false; +static void InitOpsProtoManager() { + string opsproto_path; + const char *path_env = std::getenv("ASCEND_OPP_PATH"); + if (path_env != nullptr) { + string path = path_env; + string file_path = RealPath(path.c_str()); + if (file_path.empty()) { + GELOGE(FAILED, "[Check][EnvPath]ASCEND_OPP_PATH path [%s] is invalid.", path.c_str()); + REPORT_INPUT_ERROR("E68016", {"ASCEND_OPP_PATH", path}); + return; + } + opsproto_path = (path + "/op_proto/custom/" + ":") + (path + "/op_proto/built-in/"); + GELOGI("Get opsproto so path from env : %s", path.c_str()); + } else { + string path_base = PluginManager::GetPath(); + GELOGI("path_base is %s", path_base.c_str()); + path_base = path_base.substr(0, path_base.rfind('/')); + path_base = path_base.substr(0, path_base.rfind('/') + 1); + opsproto_path = (path_base + "ops/op_proto/custom/" + ":") + (path_base + "ops/op_proto/built-in/"); + } + GELOGI("Get opsproto path is %s", opsproto_path.c_str()); + OpsProtoManager *manager = OpsProtoManager::Instance(); + map option_tmp; + option_tmp.emplace(std::pair(string("ge.opsProtoLibPath"), opsproto_path)); + (void)manager->Initialize(option_tmp); +} + GeExecutor::GeExecutor() {} Status GeExecutor::Initialize() { @@ -208,6 +237,16 @@ Status GeExecutor::Initialize() { return ge::SUCCESS; } + OpTilingManager::GetInstance().LoadSo(); + + Status initHostCpuEngineStatus = HostCpuEngine::GetInstance().Initialize(); + if (initHostCpuEngineStatus != SUCCESS) { + GELOGE(initHostCpuEngineStatus, "Failed to initialize HostCpuEngine"); + return initHostCpuEngineStatus; + } + + InitOpsProtoManager(); + std::vector mem_type(1, RT_MEMORY_HBM); mem_type.push_back(RT_MEMORY_P2P_DDR); auto ret = MemManager::Instance().Initialize(mem_type); diff --git a/ge/generator/ge_generator.cc b/ge/generator/ge_generator.cc index 938a8bc6..3f934fdb 100644 --- a/ge/generator/ge_generator.cc +++ b/ge/generator/ge_generator.cc @@ -556,6 +556,44 @@ bool GeGenerator::Impl::SetOmSystemInfo(AttrHolder &obj) { return true; } +static Status SetModelNameForDump(GeRootModelPtr ge_root_model) { + bool is_unknown_shape = false; + Status ret = ge_root_model->CheckIsUnknownShape(is_unknown_shape); + if (ret != SUCCESS) { + GELOGE(FAILED, "[Check][IsUnknownShape]Check root model is unknown shape failed, model id:%u", + ge_root_model->GetModelId()); + REPORT_CALL_ERROR("E19999", "Check root model is unknown shape failed, model id:%zu", + ge_root_model->GetModelId()); + return FAILED; + } + GeModelPtr model_root = nullptr; + if (is_unknown_shape) { + model_root = make_shared(); + GE_CHECK_NOTNULL(model_root); + model_root->SetGraph(GraphUtils::CreateGraphFromComputeGraph(ge_root_model->GetRootGraph())); + ge_root_model->SetSubgraphInstanceNameToModel(ge_root_model->GetRootGraph()->GetName(), model_root); + } + + ModelHelper model_helper; + string model_name; + GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); + 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, "[Check][GetModelNameStep]Get model_name failed. Param --output is invalid, root graph name: %s", + ge_root_model->GetRootGraph()->GetName().c_str()); + REPORT_CALL_ERROR("E19999", "Get model_name failed. Param --output is invalid,", + "root graph name: %s", ge_root_model->GetRootGraph()->GetName().c_str()); + return PARAM_INVALID; + } + map name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel(); + GeModelPtr &ge_model = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()]; + GE_CHECK_NOTNULL(ge_model); + ge_model->SetName(model_name); + return SUCCESS; +} + Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_prefix, const vector &inputs, ModelBufferData &model, bool is_offline) { rtContext_t ctx = nullptr; @@ -590,20 +628,10 @@ Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_pr } GE_CHECK_NOTNULL(ge_root_model); - 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; + ret = SetModelNameForDump(ge_root_model); + if (ret != SUCCESS) { + return ret; } - map 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 cannot be null"); - ge_model->SetName(model_name); ret = impl_->SaveRootModel(file_name_prefix, ge_root_model, model); if (ret != SUCCESS) { GELOGE(ret, "Save model failed"); @@ -873,13 +901,12 @@ Status GeGenerator::Impl::SaveRootModel(const string &file_name_prefix, GeRootMo "ge root model has no sub model") GeModelPtr model_root = nullptr; if (is_unknown_shape) { - model_root = make_shared(); - 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()); + auto name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel(); + model_root = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()]; } else { model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second; } + GE_CHECK_NOTNULL(model_root); // set atc version if (!SetAtcVersionInfo(*(model_root.get()))) { GELOGW("SetPackageVersionInfo of atc failed!"); diff --git a/ge/graph/build/graph_builder.cc b/ge/graph/build/graph_builder.cc index 0883d895..791d301c 100644 --- a/ge/graph/build/graph_builder.cc +++ b/ge/graph/build/graph_builder.cc @@ -387,7 +387,7 @@ static Status InsertMemcpyNode(const ComputeGraphPtr &graph, const OutDataAnchor GE_CHECK_NOTNULL(out_anchor); NodePtr in_node = out_anchor->GetOwnerNode(); GE_CHECK_NOTNULL(in_node); - OpDescBuilder op_desc_builder(name, MEMCPYADDRASYNC); + OpDescBuilder op_desc_builder(name, MEMCPYASYNC); OpDescPtr op_desc = op_desc_builder.AddInput("x", in_node->GetOpDesc()->GetOutputDesc(0)) .AddOutput("y", in_node->GetOpDesc()->GetOutputDesc(0)) .Build(); diff --git a/tests/ut/ge/graph/load/model_helper_unittest.cc b/tests/ut/ge/graph/load/model_helper_unittest.cc index 03605dc7..8fd8f014 100644 --- a/tests/ut/ge/graph/load/model_helper_unittest.cc +++ b/tests/ut/ge/graph/load/model_helper_unittest.cc @@ -36,13 +36,6 @@ class UtestModelHelper : public testing::Test { void TearDown() override {} }; -TEST_F(UtestModelHelper, save_size_to_modeldef_failed) -{ - GeModelPtr ge_model = ge::MakeShared(); - ModelHelper model_helper; - EXPECT_EQ(ACL_ERROR_GE_MEMORY_ALLOCATION, model_helper.SaveSizeToModelDef(ge_model)); -} - TEST_F(UtestModelHelper, save_size_to_modeldef) { GeModelPtr ge_model = ge::MakeShared(); From 45175feca9f8676c8c881b15e0b8e98e29aecf31 Mon Sep 17 00:00:00 2001 From: lichun Date: Fri, 12 Mar 2021 09:39:33 +0800 Subject: [PATCH 2/7] dynamic shape inference support --- ge/generator/ge_generator.cc | 2 +- inc/framework/generator/ge_generator.h | 2 ++ tests/ut/ge/executor/ge_executor_unittest.cc | 6 ++++++ tests/ut/ge/generator/ge_generator_unittest.cc | 8 ++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ge/generator/ge_generator.cc b/ge/generator/ge_generator.cc index 3f934fdb..e4151af5 100644 --- a/ge/generator/ge_generator.cc +++ b/ge/generator/ge_generator.cc @@ -556,7 +556,7 @@ bool GeGenerator::Impl::SetOmSystemInfo(AttrHolder &obj) { return true; } -static Status SetModelNameForDump(GeRootModelPtr ge_root_model) { +Status GeGenerator::SetModelNameForDump(GeRootModelPtr ge_root_model) { bool is_unknown_shape = false; Status ret = ge_root_model->CheckIsUnknownShape(is_unknown_shape); if (ret != SUCCESS) { diff --git a/inc/framework/generator/ge_generator.h b/inc/framework/generator/ge_generator.h index 2d7d007b..f8cc2264 100644 --- a/inc/framework/generator/ge_generator.h +++ b/inc/framework/generator/ge_generator.h @@ -29,6 +29,7 @@ #include "graph/op_desc.h" #include "graph/detail/attributes_holder.h" #include "omg/omg_inner_types.h" +#include "model/ge_root_model.h" namespace ge { class GE_FUNC_VISIBILITY GeGenerator { @@ -98,6 +99,7 @@ class GE_FUNC_VISIBILITY GeGenerator { const string &model_file_name, OpEngineType engine_type, ModelBufferData &model_buff, bool is_offline = true); Status CheckForSingleOp(OpDescPtr &op_desc, const vector &inputs, const vector &outputs); + Status SetModelNameForDump(GeRootModelPtr ge_root_model); class Impl; diff --git a/tests/ut/ge/executor/ge_executor_unittest.cc b/tests/ut/ge/executor/ge_executor_unittest.cc index a98f9290..a4606320 100644 --- a/tests/ut/ge/executor/ge_executor_unittest.cc +++ b/tests/ut/ge/executor/ge_executor_unittest.cc @@ -39,4 +39,10 @@ TEST_F(UtestGeExecutor, test_single_op_exec) { EXPECT_EQ(exeutor.LoadSingleOp(model_name, model_data, nullptr, nullptr), ACL_ERROR_GE_INTERNAL_ERROR); EXPECT_EQ(exeutor.LoadDynamicSingleOp(model_name, model_data, nullptr, nullptr), PARAM_INVALID); } + +TEST_F(UtestGeExecutor, test_ge_initialize) { + GeExecutor executor; + EXPECT_EQ(executor.Initialize(), SUCCESS); + EXPECT_EQ(executor.Initialize(), SUCCESS); +} } // namespace ge \ No newline at end of file diff --git a/tests/ut/ge/generator/ge_generator_unittest.cc b/tests/ut/ge/generator/ge_generator_unittest.cc index 3daa5592..215aa742 100644 --- a/tests/ut/ge/generator/ge_generator_unittest.cc +++ b/tests/ut/ge/generator/ge_generator_unittest.cc @@ -20,6 +20,7 @@ #define protected public #include "generator/ge_generator.h" #include "graph/utils/tensor_utils.h" +#include "all_ops.h" using namespace std; @@ -71,4 +72,11 @@ TEST_F(UtestGeGenerator, test_build_single_op_online) { ModelBufferData model_buffer; EXPECT_EQ(generator.BuildSingleOpModel(op_desc, inputs, outputs, ENGINE_AIVECTOR, model_buffer), FAILED); } + +TEST_F(UtestGeGenerator, test_set_model_name) { + GeGenerator generator; + generator.Initialize({}); + GeRootModelPtr ge_root_model = make_shared(new (std::nothrow) GeRootModel()); + EXPECT_EQ(generator.SetModelNameForDump(ge_root_model)); +} } // namespace ge From 9acb99c1108882710b7e38054e3f91b20ac1f502 Mon Sep 17 00:00:00 2001 From: lichun Date: Fri, 12 Mar 2021 11:09:18 +0800 Subject: [PATCH 3/7] dynamic shape inference support --- tests/ut/ge/generator/ge_generator_unittest.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/ut/ge/generator/ge_generator_unittest.cc b/tests/ut/ge/generator/ge_generator_unittest.cc index 215aa742..022fd611 100644 --- a/tests/ut/ge/generator/ge_generator_unittest.cc +++ b/tests/ut/ge/generator/ge_generator_unittest.cc @@ -76,7 +76,10 @@ TEST_F(UtestGeGenerator, test_build_single_op_online) { TEST_F(UtestGeGenerator, test_set_model_name) { GeGenerator generator; generator.Initialize({}); - GeRootModelPtr ge_root_model = make_shared(new (std::nothrow) GeRootModel()); - EXPECT_EQ(generator.SetModelNameForDump(ge_root_model)); + GeRootModelPtr ge_root_model = make_shared(GeRootModel()); + ComputeGraphPtr graph = make_shared(ComputeGraph()); + (void)AttrUtils::SetBool(graph, "_dynamic_shape_partitioned", true); + ge_root_model->root_graph_ = std::move(graph); + EXPECT_EQ(generator.SetModelNameForDump(ge_root_model), SUCCESS); } } // namespace ge From 3e7dcdc123266687c354350a4b11427869925429 Mon Sep 17 00:00:00 2001 From: lichun Date: Fri, 12 Mar 2021 11:33:24 +0800 Subject: [PATCH 4/7] dynamic shape inference support --- tests/ut/ge/generator/ge_generator_unittest.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ut/ge/generator/ge_generator_unittest.cc b/tests/ut/ge/generator/ge_generator_unittest.cc index 022fd611..5cf5038b 100644 --- a/tests/ut/ge/generator/ge_generator_unittest.cc +++ b/tests/ut/ge/generator/ge_generator_unittest.cc @@ -77,7 +77,7 @@ TEST_F(UtestGeGenerator, test_set_model_name) { GeGenerator generator; generator.Initialize({}); GeRootModelPtr ge_root_model = make_shared(GeRootModel()); - ComputeGraphPtr graph = make_shared(ComputeGraph()); + ComputeGraphPtr graph = make_shared(ComputeGraph("graph")); (void)AttrUtils::SetBool(graph, "_dynamic_shape_partitioned", true); ge_root_model->root_graph_ = std::move(graph); EXPECT_EQ(generator.SetModelNameForDump(ge_root_model), SUCCESS); From 645f2abfee3b7de38185ad7d7b3fbd6f4ea3f7e1 Mon Sep 17 00:00:00 2001 From: lichun Date: Fri, 12 Mar 2021 11:57:37 +0800 Subject: [PATCH 5/7] dynamic shape inference support --- tests/ut/ge/generator/ge_generator_unittest.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ut/ge/generator/ge_generator_unittest.cc b/tests/ut/ge/generator/ge_generator_unittest.cc index 5cf5038b..066577df 100644 --- a/tests/ut/ge/generator/ge_generator_unittest.cc +++ b/tests/ut/ge/generator/ge_generator_unittest.cc @@ -76,7 +76,7 @@ TEST_F(UtestGeGenerator, test_build_single_op_online) { TEST_F(UtestGeGenerator, test_set_model_name) { GeGenerator generator; generator.Initialize({}); - GeRootModelPtr ge_root_model = make_shared(GeRootModel()); + GeRootModelPtr ge_root_model = make_shared(GeRootModel()); ComputeGraphPtr graph = make_shared(ComputeGraph("graph")); (void)AttrUtils::SetBool(graph, "_dynamic_shape_partitioned", true); ge_root_model->root_graph_ = std::move(graph); From 9ac8c3e181df5626d03b7ec32ce1d7adbce9b69c Mon Sep 17 00:00:00 2001 From: lichun Date: Sat, 13 Mar 2021 10:21:47 +0800 Subject: [PATCH 6/7] dynamic shape inference support --- ge/hybrid/model/node_item.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ge/hybrid/model/node_item.cc b/ge/hybrid/model/node_item.cc index 100530fc..d2aa4a1f 100644 --- a/ge/hybrid/model/node_item.cc +++ b/ge/hybrid/model/node_item.cc @@ -152,11 +152,13 @@ Status NodeItem::InitInputsAndOutputs() { if (AttrUtils::GetInt(node->GetOwnerComputeGraph(), ::ge::ATTR_STAGE_LEVEL, group)) { GELOGD("[%s] Got stage level from parent graph = %d", op_desc->GetName().c_str(), group); } else { - auto parent_node = node->GetOwnerComputeGraph()->GetParentNode(); - if ((parent_node != nullptr) && (AttrUtils::GetInt(parent_node->GetOpDesc(), ::ge::ATTR_STAGE_LEVEL, group))) { - GELOGD("[%s] Got stage level from parent node = %d", op_desc->GetName().c_str(), group); - } else { - GELOGD("[%s] Node do not set stage level", op_desc->GetName().c_str()); + if (node->GetOwnerComputeGraph() != nullptr) { + auto parent_node = node->GetOwnerComputeGraph()->GetParentNode(); + if ((parent_node != nullptr) && (AttrUtils::GetInt(parent_node->GetOpDesc(), ::ge::ATTR_STAGE_LEVEL, group))) { + GELOGD("[%s] Got stage level from parent node = %d", op_desc->GetName().c_str(), group); + } else { + GELOGD("[%s] Node do not set stage level", op_desc->GetName().c_str()); + } } } } From 68892200697f395202d664fe64bbe96d05deaaf3 Mon Sep 17 00:00:00 2001 From: lichun Date: Sat, 13 Mar 2021 11:21:55 +0800 Subject: [PATCH 7/7] dynamic shape inference support --- ge/hybrid/model/node_item.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ge/hybrid/model/node_item.cc b/ge/hybrid/model/node_item.cc index d2aa4a1f..805064be 100644 --- a/ge/hybrid/model/node_item.cc +++ b/ge/hybrid/model/node_item.cc @@ -149,10 +149,10 @@ Status NodeItem::InitInputsAndOutputs() { if (AttrUtils::GetInt(op_desc, ::ge::ATTR_STAGE_LEVEL, group)) { GELOGD("[%s] Got stage level from op_desc = %d", op_desc->GetName().c_str(), group); } else { - if (AttrUtils::GetInt(node->GetOwnerComputeGraph(), ::ge::ATTR_STAGE_LEVEL, group)) { - GELOGD("[%s] Got stage level from parent graph = %d", op_desc->GetName().c_str(), group); - } else { - if (node->GetOwnerComputeGraph() != nullptr) { + if (node->GetOwnerComputeGraph() != nullptr) { + if (AttrUtils::GetInt(node->GetOwnerComputeGraph(), ::ge::ATTR_STAGE_LEVEL, group)) { + GELOGD("[%s] Got stage level from parent graph = %d", op_desc->GetName().c_str(), group); + } else { auto parent_node = node->GetOwnerComputeGraph()->GetParentNode(); if ((parent_node != nullptr) && (AttrUtils::GetInt(parent_node->GetOpDesc(), ::ge::ATTR_STAGE_LEVEL, group))) { GELOGD("[%s] Got stage level from parent node = %d", op_desc->GetName().c_str(), group);