Browse Source

offline dynamic shape inference support

tags/v1.3.0
lichun 3 years ago
parent
commit
26ef975200
9 changed files with 118 additions and 37 deletions
  1. +6
    -5
      ge/common/helper/model_helper.cc
  2. +39
    -0
      ge/executor/ge_executor.cc
  3. +44
    -17
      ge/generator/ge_generator.cc
  4. +1
    -1
      ge/graph/build/graph_builder.cc
  5. +9
    -7
      ge/hybrid/model/node_item.cc
  6. +2
    -0
      inc/framework/generator/ge_generator.h
  7. +6
    -0
      tests/ut/ge/executor/ge_executor_unittest.cc
  8. +11
    -0
      tests/ut/ge/generator/ge_generator_unittest.cc
  9. +0
    -7
      tests/ut/ge/graph/load/model_helper_unittest.cc

+ 6
- 5
ge/common/helper/model_helper.cc View File

@@ -87,12 +87,13 @@ Status ModelHelper::SaveSizeToModelDef(const GeModelPtr &ge_model) {


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");
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), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(*(ge_model.get()), "om_info_list", om_info),
GELOGE(FAILED, "SetListInt of om_info_list failed."); GELOGE(FAILED, "SetListInt of om_info_list failed.");


+ 39
- 0
ge/executor/ge_executor.cc View File

@@ -30,6 +30,8 @@
#include "single_op/single_op_manager.h" #include "single_op/single_op_manager.h"
#include "graph/load/model_manager/davinci_model.h" #include "graph/load/model_manager/davinci_model.h"
#include "opskernel_manager/ops_kernel_builder_manager.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::string;
using std::vector; using std::vector;
@@ -199,6 +201,33 @@ bool IsDynmaicDimsSizeMatchModel(const vector<uint64_t> cur_dynamic_dims,
namespace ge { namespace ge {
bool GeExecutor::isInit_ = false; 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<string, string> option_tmp;
option_tmp.emplace(std::pair<string, string>(string("ge.opsProtoLibPath"), opsproto_path));
(void)manager->Initialize(option_tmp);
}

GeExecutor::GeExecutor() {} GeExecutor::GeExecutor() {}


Status GeExecutor::Initialize() { Status GeExecutor::Initialize() {
@@ -208,6 +237,16 @@ Status GeExecutor::Initialize() {
return ge::SUCCESS; return ge::SUCCESS;
} }


OpTilingManager::GetInstance().LoadSo();

Status init_hostcpu_engine_status = HostCpuEngine::GetInstance().Initialize();
if (init_hostcpu_engine_status != SUCCESS) {
GELOGE(init_hostcpu_engine_status, "Failed to initialize HostCpuEngine");
return init_hostcpu_engine_status;
}

InitOpsProtoManager();

std::vector<rtMemType_t> mem_type(1, RT_MEMORY_HBM); std::vector<rtMemType_t> mem_type(1, RT_MEMORY_HBM);
mem_type.push_back(RT_MEMORY_P2P_DDR); mem_type.push_back(RT_MEMORY_P2P_DDR);
auto ret = MemManager::Instance().Initialize(mem_type); auto ret = MemManager::Instance().Initialize(mem_type);


+ 44
- 17
ge/generator/ge_generator.cc View File

@@ -565,6 +565,44 @@ bool GeGenerator::Impl::SetOmSystemInfo(AttrHolder &obj) {
return true; return true;
} }


Status GeGenerator::SetModelNameForDump(const 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 = MakeShared<GeModel>();
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<string, GeModelPtr> 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<GeTensor> &inputs, Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_prefix, const vector<GeTensor> &inputs,
ModelBufferData &model, bool is_offline) { ModelBufferData &model, bool is_offline) {
rtContext_t ctx = nullptr; rtContext_t ctx = nullptr;
@@ -599,20 +637,10 @@ 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());
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<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 cannot be null");
ge_model->SetName(model_name);
ret = impl_->SaveRootModel(file_name_prefix, ge_root_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");
@@ -882,13 +910,12 @@ Status GeGenerator::Impl::SaveRootModel(const string &file_name_prefix, GeRootMo
"ge root model has no sub model") "ge root model has no sub model")
GeModelPtr model_root = nullptr; GeModelPtr model_root = nullptr;
if (is_unknown_shape) { 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());
auto name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel();
model_root = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()];
} else { } else {
model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second; model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second;
} }
GE_CHECK_NOTNULL(model_root);
// set atc version // set atc version
if (!SetAtcVersionInfo(*(model_root.get()))) { if (!SetAtcVersionInfo(*(model_root.get()))) {
GELOGW("SetPackageVersionInfo of atc failed!"); GELOGW("SetPackageVersionInfo of atc failed!");


+ 1
- 1
ge/graph/build/graph_builder.cc View File

@@ -387,7 +387,7 @@ static Status InsertMemcpyNode(const ComputeGraphPtr &graph, const OutDataAnchor
GE_CHECK_NOTNULL(out_anchor); GE_CHECK_NOTNULL(out_anchor);
NodePtr in_node = out_anchor->GetOwnerNode(); NodePtr in_node = out_anchor->GetOwnerNode();
GE_CHECK_NOTNULL(in_node); 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)) OpDescPtr op_desc = op_desc_builder.AddInput("x", in_node->GetOpDesc()->GetOutputDesc(0))
.AddOutput("y", in_node->GetOpDesc()->GetOutputDesc(0)) .AddOutput("y", in_node->GetOpDesc()->GetOutputDesc(0))
.Build(); .Build();


+ 9
- 7
ge/hybrid/model/node_item.cc View File

@@ -149,14 +149,16 @@ Status NodeItem::InitInputsAndOutputs() {
if (AttrUtils::GetInt(op_desc, ::ge::ATTR_STAGE_LEVEL, group)) { 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); GELOGD("[%s] Got stage level from op_desc = %d", op_desc->GetName().c_str(), group);
} else { } 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 {
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);
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 { } else {
GELOGD("[%s] Node do not set stage level", op_desc->GetName().c_str());
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());
}
} }
} }
} }


+ 2
- 0
inc/framework/generator/ge_generator.h View File

@@ -29,6 +29,7 @@
#include "graph/op_desc.h" #include "graph/op_desc.h"
#include "graph/detail/attributes_holder.h" #include "graph/detail/attributes_holder.h"
#include "omg/omg_inner_types.h" #include "omg/omg_inner_types.h"
#include "model/ge_root_model.h"


namespace ge { namespace ge {
class GE_FUNC_VISIBILITY GeGenerator { 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, const string &model_file_name, OpEngineType engine_type, ModelBufferData &model_buff,
bool is_offline = true); bool is_offline = true);
Status CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, const vector<GeTensor> &outputs); Status CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, const vector<GeTensor> &outputs);
Status SetModelNameForDump(const GeRootModelPtr &ge_root_model);


class Impl; class Impl;




+ 6
- 0
tests/ut/ge/executor/ge_executor_unittest.cc View File

@@ -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.LoadSingleOp(model_name, model_data, nullptr, nullptr), ACL_ERROR_GE_INTERNAL_ERROR);
EXPECT_EQ(exeutor.LoadDynamicSingleOp(model_name, model_data, nullptr, nullptr), PARAM_INVALID); 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 } // namespace ge

+ 11
- 0
tests/ut/ge/generator/ge_generator_unittest.cc View File

@@ -25,6 +25,7 @@
#include "graph/utils/graph_utils.h" #include "graph/utils/graph_utils.h"
#include "../graph/passes/graph_builder_utils.h" #include "../graph/passes/graph_builder_utils.h"
#include "../graph/manager/graph_manager.h" #include "../graph/manager/graph_manager.h"
#include "all_ops.h"


using namespace std; using namespace std;


@@ -110,4 +111,14 @@ TEST_F(UtestGeGenerator, test_graph_manager) {
graph_partitioner.graph_2_subgraph_list_.insert({sub_graph, {sgi, sgi_gelocal}}); graph_partitioner.graph_2_subgraph_list_.insert({sub_graph, {sgi, sgi_gelocal}});
EXPECT_EQ(graph_manager.ConvertGraphToFile(root_graph, graph_partitioner, "./"), GRAPH_SUCCESS); EXPECT_EQ(graph_manager.ConvertGraphToFile(root_graph, graph_partitioner, "./"), GRAPH_SUCCESS);
} }

TEST_F(UtestGeGenerator, test_set_model_name) {
GeGenerator generator;
generator.Initialize({});
GeRootModelPtr ge_root_model = make_shared<GeRootModel>(GeRootModel());
ComputeGraphPtr graph = make_shared<ComputeGraph>(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);
}
} // namespace ge } // namespace ge

+ 0
- 7
tests/ut/ge/graph/load/model_helper_unittest.cc View File

@@ -36,13 +36,6 @@ class UtestModelHelper : public testing::Test {
void TearDown() override {} void TearDown() override {}
}; };
TEST_F(UtestModelHelper, save_size_to_modeldef_failed)
{
GeModelPtr ge_model = ge::MakeShared<ge::GeModel>();
ModelHelper model_helper;
EXPECT_EQ(ACL_ERROR_GE_MEMORY_ALLOCATION, model_helper.SaveSizeToModelDef(ge_model));
}
TEST_F(UtestModelHelper, save_size_to_modeldef) TEST_F(UtestModelHelper, save_size_to_modeldef)
{ {
GeModelPtr ge_model = ge::MakeShared<ge::GeModel>(); GeModelPtr ge_model = ge::MakeShared<ge::GeModel>();


Loading…
Cancel
Save