From 8e28cacc94257e59ed7647d1496dcb5c88bf629e Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 18 Dec 2020 17:32:51 +0800 Subject: [PATCH 1/3] For dynamic shape complie. --- ge/graph/build/graph_builder.cc | 68 +++++++++++++++++++++++++++++---- ge/graph/build/model_builder.h | 4 +- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/ge/graph/build/graph_builder.cc b/ge/graph/build/graph_builder.cc index 87d2a206..1e84ee1a 100644 --- a/ge/graph/build/graph_builder.cc +++ b/ge/graph/build/graph_builder.cc @@ -14,6 +14,7 @@ * limitations under the License. */ +#include "graph/build/memory/graph_mem_assigner.h" #include "graph/build/graph_builder.h" #include "common/ge/ge_util.h" #include "common/helper/model_helper.h" @@ -272,18 +273,65 @@ Status GraphBuilder::BuildForKnownShapeGraph(ComputeGraphPtr &comp_graph, std::v Status GraphBuilder::BuildForUnknownShapeGraph(ComputeGraphPtr &comp_graph, GeModelPtr &ge_model_ptr, uint64_t session_id) { + ModelPtr model_ptr = MakeShared(); + if (model_ptr == nullptr) { + return MEMALLOC_FAILED; + } + + Graph2SubGraphInfoList subgraph_map; + ge::ModelBuilder builder(session_id, com_graph, subgraph_map, stream_max_parallel_num_, hcom_parallel_, build_mode_); + GE_CHK_STATUS_RET(builder.RreBuildModel(), "Failed to pre build model."); + GELOGI("Begin to build unknown shape graph[%s].", comp_graph->GetName().c_str()); GE_TIMESTAMP_START(CalcOpParam); GE_CHK_STATUS_RET(CalcOpParam(comp_graph), "Graph[%s] builder CalcOpParam() return fail.", comp_graph->GetName().c_str()); GE_TIMESTAMP_END(CalcOpParam, "GraphBuilder::CalcOpParam"); GE_DUMP(comp_graph, "AfterCalcOpParam"); - Graph2SubGraphInfoList subgraph_map; - ge::ModelBuilder builder(session_id, comp_graph, subgraph_map, stream_max_parallel_num_, hcom_parallel_, build_mode_); - ModelPtr model_ptr = MakeShared(); - if (model_ptr == nullptr) { - return MEMALLOC_FAILED; + + + for (auto &node : comp_graph->GetsDirectNode()) { + GE_CHECK_NOTNULL(node); + auto op_desc = node->GetOpDesc(); + GE_CHECK_NOTNULL(op_desc); + auto num_inputs = op_desc->GetInputsSize(); + std::vector input_offsets(num_inputs, 0); + int valid_input_index = -1; + for (uint32_t i = 0; i < node->GetAllInDataAnchorsSize(); ++i) { + auto in_anchor = node->GetInDataAnchor(i); + auto peer_out_anchor = in_anchor->GetPeerOutAnchor(); + if (peer_out_anchor == nullptr) { + continue; + } + ++valid_input_index; + auto peer_node = peer_out_anchor->GetOwnerNode(); + if (peer_node == nullptr) { + continue; + } + + if (peer_node->GetType() != CONSTANT) { + continue; + } + + std::vector weight = OpDescUtils::MutableWeights(peer_node); + if (weight.empty()) { + GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); + return FAILED; + } + GeTensorPtr weight = weights[0]; + GE_CHECK_NOTNULL(weight); + int64_t input_offset = 0; + (void) TensorUtils::GetDataOffset(weight->MutableTensorDesc(), input_offset); + input_offsetp[valid_input_index] = input_offset; + GELOGD("[%s] input[%u] is const, offset = %ld", node->GetName().c_str(), valid_input_index, input_offset); + } + + op_desc->SetInputOffset(input_offsets); + std::vector output_offsets(op_desc->GetOutputsSize(), 0); + op_desc->SetOutputOffset(output_offsets); } + GE_CHK_STATUS_RET(builder.MergeWeights(), "Failed to merge weights."); + GE_TIMESTAMP_START(BuildModelForGetDynShapeTask); GE_CHK_STATUS_RET(builder.BuildModelForGetDynShapeTask(*model_ptr), "Graph[%s] builder BuildModelForGetDynShapeTask() return fail.", comp_graph->GetName().c_str()); @@ -375,10 +423,14 @@ Status GraphBuilder::BuildForDynamicShapeGraph(ComputeGraphPtr &comp_graph, op_desc->GetName().c_str()); } } - // - for (auto &sub_graph : comp_graph->GetAllSubgraphs()) { + auto all_graphs = comp_graph->GetAllSubgraphs(); + if (all_graphs.empty()) { + all_graphs.push_back(comp_graph); + } + for (auto &sub_graph : all_graphs) { // exclude functional subgraph in known subgraph - if (sub_graph->GetParentGraph() != comp_graph && !sub_graph->GetParentGraph()->GetGraphUnknownFlag()) { + if (sub_graph->GetParentGraph() != nullptr && sub_graph->GetParentGraph() != comp_graph && + !sub_graph->GetParentGraph()->GetGraphUnknownFlag()) { continue; } diff --git a/ge/graph/build/model_builder.h b/ge/graph/build/model_builder.h index e75521c7..5cfcc241 100644 --- a/ge/graph/build/model_builder.h +++ b/ge/graph/build/model_builder.h @@ -55,13 +55,13 @@ class ModelBuilder { ge::Buffer GetWeightBuffer() const; + Status MergeWeights(); + protected: void AddNodeInputProperty(); void ClearOriginalFormat(); - Status MergeWeights(); - private: bool SetInputConst(const OpDescPtr &op_desc, const NodePtr &src_node, size_t index, vector &is_input_const); From a1f23dd1d09e9000756b5184c3930b8900c55ffe Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 18 Dec 2020 17:44:54 +0800 Subject: [PATCH 2/3] For dynamic shape complie. --- ge/graph/build/graph_builder.cc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ge/graph/build/graph_builder.cc b/ge/graph/build/graph_builder.cc index 1e84ee1a..c7a18350 100644 --- a/ge/graph/build/graph_builder.cc +++ b/ge/graph/build/graph_builder.cc @@ -198,10 +198,8 @@ Status GraphBuilder::Build(ComputeGraphPtr &comp_graph, std::vectorGetGraphUnknownFlag()) { GE_CHK_STATUS_RET( BuildForDynamicShapeGraph(comp_graph, subgraph_ptr_list, ge_root_model_ptr, ge_model_ptr, session_id), "Build for dynamic shape graph failed."); @@ -290,7 +288,7 @@ Status GraphBuilder::BuildForUnknownShapeGraph(ComputeGraphPtr &comp_graph, GeMo GE_DUMP(comp_graph, "AfterCalcOpParam"); - for (auto &node : comp_graph->GetsDirectNode()) { + for (auto &node : comp_graph->GetsDirectNode()) { GE_CHECK_NOTNULL(node); auto op_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(op_desc); @@ -313,8 +311,8 @@ Status GraphBuilder::BuildForUnknownShapeGraph(ComputeGraphPtr &comp_graph, GeMo continue; } - std::vector weight = OpDescUtils::MutableWeights(peer_node); - if (weight.empty()) { + std::vector weights = OpDescUtils::MutableWeights(peer_node); + if (weights.empty()) { GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); return FAILED; } @@ -322,7 +320,7 @@ Status GraphBuilder::BuildForUnknownShapeGraph(ComputeGraphPtr &comp_graph, GeMo GE_CHECK_NOTNULL(weight); int64_t input_offset = 0; (void) TensorUtils::GetDataOffset(weight->MutableTensorDesc(), input_offset); - input_offsetp[valid_input_index] = input_offset; + input_offsets[valid_input_index] = input_offset; GELOGD("[%s] input[%u] is const, offset = %ld", node->GetName().c_str(), valid_input_index, input_offset); } From 159633f73d0fcb300fc9336baeb5b7a31cc79fb1 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 18 Dec 2020 20:36:27 +0800 Subject: [PATCH 3/3] For dynamic shape complie. --- ge/graph/build/graph_builder.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ge/graph/build/graph_builder.cc b/ge/graph/build/graph_builder.cc index c7a18350..76eea96a 100644 --- a/ge/graph/build/graph_builder.cc +++ b/ge/graph/build/graph_builder.cc @@ -277,7 +277,7 @@ Status GraphBuilder::BuildForUnknownShapeGraph(ComputeGraphPtr &comp_graph, GeMo } Graph2SubGraphInfoList subgraph_map; - ge::ModelBuilder builder(session_id, com_graph, subgraph_map, stream_max_parallel_num_, hcom_parallel_, build_mode_); + ge::ModelBuilder builder(session_id, comp_graph, subgraph_map, stream_max_parallel_num_, hcom_parallel_, build_mode_); GE_CHK_STATUS_RET(builder.RreBuildModel(), "Failed to pre build model."); GELOGI("Begin to build unknown shape graph[%s].", comp_graph->GetName().c_str()); @@ -288,7 +288,7 @@ Status GraphBuilder::BuildForUnknownShapeGraph(ComputeGraphPtr &comp_graph, GeMo GE_DUMP(comp_graph, "AfterCalcOpParam"); - for (auto &node : comp_graph->GetsDirectNode()) { + for (auto &node : comp_graph->GetDirectNode()) { GE_CHECK_NOTNULL(node); auto op_desc = node->GetOpDesc(); GE_CHECK_NOTNULL(op_desc);