From eb058ac96931b14b63a7c27babddf58cb00df560 Mon Sep 17 00:00:00 2001 From: chenyemeng Date: Thu, 26 Nov 2020 10:24:16 +0800 Subject: [PATCH 1/5] rm empty_tensor inputs for merge --- ge/graph/passes/merge_pass.cc | 27 +++++++++++++++++++++++++++ ge/graph/passes/merge_pass.h | 1 + 2 files changed, 28 insertions(+) diff --git a/ge/graph/passes/merge_pass.cc b/ge/graph/passes/merge_pass.cc index d2340037..c6bae2a2 100644 --- a/ge/graph/passes/merge_pass.cc +++ b/ge/graph/passes/merge_pass.cc @@ -34,6 +34,11 @@ using domi::SUCCESS; namespace ge { const int kValueIndexOutputIndex = 1; +bool IsEmptyTensor(const GeShape &shpae) { + const auto &dims = shape.GetDims(); + return std::any_of(dims.begin(), dims.end(), [](int64_t dim) { return dim == 0; }); +} + Status MergePass::Run(NodePtr &node) { GELOGD("MergePass running"); if (node == nullptr) { @@ -53,6 +58,11 @@ Status MergePass::Run(NodePtr &node) { return PARAM_INVALID; } + if (OptimizeEmptyTensorInput(node) != SUCCESS) { + GELOGE(FAILED, "[%s] remove empty_tensor inputs failed.", node->GetName().c_str()); + return FAILED; + } + auto in_data_nodes = node->GetInDataNodes(); switch (in_data_nodes.size()) { case 0: { @@ -202,4 +212,21 @@ bool MergePass::IsMergeInputNeedOptimized(NodePtr &node) const { } return true; } + +Status MergePass::OptimizeEmptyTensorInput(const NodePtr &node) const { + for (const auto &in_data_anchor : node->GetAllInDataAnchors()) { + const auto &peer_data_anchor = in_data_anchor->GetPeerOutAnchor(); + if (peer_data_anchor == nullptr) { + continue; + } + const auto &op_desc = peer_data_anchor->GetOwnerNode()->GetOpDesc(); + if (op_desc == nullptr) { + continue; + } + if (IsEmptyTensor(op_desc->GetOutputDesc(peer_data_anchor->GetIdx()).GetShape())) { + return GraphUtils::RemoveEdge(peer_data_anchor, in_data_anchor) == GRAPH_SUCCESS ? SUCCESS : FAILED; + } + } + return SUCCESS; +} } // namespace ge diff --git a/ge/graph/passes/merge_pass.h b/ge/graph/passes/merge_pass.h index 2cdb5022..c297a86e 100755 --- a/ge/graph/passes/merge_pass.h +++ b/ge/graph/passes/merge_pass.h @@ -29,6 +29,7 @@ class MergePass : public BaseNodePass { Status ChangeIndexToConstant(NodePtr &node, int &value_index); Status CreateConstByValue(NodePtr &node, int value_index, OpDescPtr &op_desc); bool IsMergeInputNeedOptimized(NodePtr &node) const; + static Status OptimizeEmptyTensorInput(const NodePtr &node) const; }; } // namespace ge #endif // GE_GRAPH_PASSES_MERGE_PASS_H_ From 17d1e9dac5b581bbcc9a0648a27297a20808231e Mon Sep 17 00:00:00 2001 From: chenyemeng Date: Thu, 26 Nov 2020 10:46:48 +0800 Subject: [PATCH 2/5] rm empty_tensor inputs for merge --- ge/graph/passes/merge_pass.cc | 2 +- ge/graph/passes/merge_pass.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ge/graph/passes/merge_pass.cc b/ge/graph/passes/merge_pass.cc index c6bae2a2..a65c32fd 100644 --- a/ge/graph/passes/merge_pass.cc +++ b/ge/graph/passes/merge_pass.cc @@ -213,7 +213,7 @@ bool MergePass::IsMergeInputNeedOptimized(NodePtr &node) const { return true; } -Status MergePass::OptimizeEmptyTensorInput(const NodePtr &node) const { +Status MergePass::OptimizeEmptyTensorInput(const NodePtr &node) { for (const auto &in_data_anchor : node->GetAllInDataAnchors()) { const auto &peer_data_anchor = in_data_anchor->GetPeerOutAnchor(); if (peer_data_anchor == nullptr) { diff --git a/ge/graph/passes/merge_pass.h b/ge/graph/passes/merge_pass.h index c297a86e..464f2172 100755 --- a/ge/graph/passes/merge_pass.h +++ b/ge/graph/passes/merge_pass.h @@ -29,7 +29,7 @@ class MergePass : public BaseNodePass { Status ChangeIndexToConstant(NodePtr &node, int &value_index); Status CreateConstByValue(NodePtr &node, int value_index, OpDescPtr &op_desc); bool IsMergeInputNeedOptimized(NodePtr &node) const; - static Status OptimizeEmptyTensorInput(const NodePtr &node) const; + static Status OptimizeEmptyTensorInput(const NodePtr &node); }; } // namespace ge #endif // GE_GRAPH_PASSES_MERGE_PASS_H_ From a910c80fbf6e3efd98ddf96fd7d231fef4678492 Mon Sep 17 00:00:00 2001 From: chenyemeng Date: Thu, 26 Nov 2020 11:00:18 +0800 Subject: [PATCH 3/5] rm empty_tensor inputs for merge --- ge/graph/passes/merge_pass.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ge/graph/passes/merge_pass.cc b/ge/graph/passes/merge_pass.cc index a65c32fd..fb485e2b 100644 --- a/ge/graph/passes/merge_pass.cc +++ b/ge/graph/passes/merge_pass.cc @@ -34,7 +34,7 @@ using domi::SUCCESS; namespace ge { const int kValueIndexOutputIndex = 1; -bool IsEmptyTensor(const GeShape &shpae) { +bool IsEmptyTensor(const GeShape &shape) { const auto &dims = shape.GetDims(); return std::any_of(dims.begin(), dims.end(), [](int64_t dim) { return dim == 0; }); } From ec4ada340ac5f271c12ab5f52b889ebd40ea938d Mon Sep 17 00:00:00 2001 From: chenyemeng Date: Thu, 26 Nov 2020 15:22:53 +0800 Subject: [PATCH 4/5] rm empty_tensor inputs for merge --- ge/graph/passes/merge_pass.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ge/graph/passes/merge_pass.cc b/ge/graph/passes/merge_pass.cc index fb485e2b..a50893a9 100644 --- a/ge/graph/passes/merge_pass.cc +++ b/ge/graph/passes/merge_pass.cc @@ -219,12 +219,18 @@ Status MergePass::OptimizeEmptyTensorInput(const NodePtr &node) { if (peer_data_anchor == nullptr) { continue; } - const auto &op_desc = peer_data_anchor->GetOwnerNode()->GetOpDesc(); - if (op_desc == nullptr) { + if ((peer_data_anchor->GetOwnerNode() == nullptr) || + (peer_data_anchor->GetOwnerNode()->GetOpDesc() == nullptr)) { continue; } + const auto &op_desc = peer_data_anchor->GetOwnerNode()->GetOpDesc(); if (IsEmptyTensor(op_desc->GetOutputDesc(peer_data_anchor->GetIdx()).GetShape())) { - return GraphUtils::RemoveEdge(peer_data_anchor, in_data_anchor) == GRAPH_SUCCESS ? SUCCESS : FAILED; + if (GraphUtils::RemoveEdge(peer_data_anchor, in_data_anchor) != GRAPH_SUCCESS) { + GELOGE(FAILED, "Remove data edge %s:%d->%s:%d failed.", + op_desc->GetName().c_str(), peer_data_anchor->GetIdx(), + node->GetName().c_str(), in_data_anchor->GetIdx()); + return FAILED; + } } } return SUCCESS; From 680e63f88c1d1bdcd689079c0ae4e931483deb6d Mon Sep 17 00:00:00 2001 From: chenyemeng Date: Thu, 26 Nov 2020 16:05:13 +0800 Subject: [PATCH 5/5] rm empty_tensor inputs for merge --- ge/graph/passes/merge_pass.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ge/graph/passes/merge_pass.cc b/ge/graph/passes/merge_pass.cc index a50893a9..0b367614 100644 --- a/ge/graph/passes/merge_pass.cc +++ b/ge/graph/passes/merge_pass.cc @@ -231,6 +231,9 @@ Status MergePass::OptimizeEmptyTensorInput(const NodePtr &node) { node->GetName().c_str(), in_data_anchor->GetIdx()); return FAILED; } + GELOGD("Remove data edge %s:%d->%s:%d", + op_desc->GetName().c_str(), peer_data_anchor->GetIdx(), + node->GetName().c_str(), in_data_anchor->GetIdx()); } } return SUCCESS;