@@ -189,7 +189,6 @@ set(TRAIN_SRC_LIST | |||
"graph/passes/atomic_addr_clean_pass.cc" | |||
"graph/passes/mark_same_addr_pass.cc" | |||
"graph/passes/mark_graph_unknown_status_pass.cc" | |||
"graph/passes/dynamic_single_op_reset_shape_pass.cc" | |||
"graph/passes/mark_agnostic_pass.cc" | |||
"graph/partition/dynamic_shape_partition.cc" | |||
"graph/partition/stage_partition.cc" | |||
@@ -495,7 +494,6 @@ set(INFER_SRC_LIST | |||
"graph/passes/atomic_addr_clean_pass.cc" | |||
"graph/passes/mark_same_addr_pass.cc" | |||
"graph/passes/mark_graph_unknown_status_pass.cc" | |||
"graph/passes/dynamic_single_op_reset_shape_pass.cc" | |||
"graph/passes/mark_agnostic_pass.cc" | |||
"graph/common/omg_util.cc" | |||
"graph/common/bcast.cc" | |||
@@ -111,7 +111,6 @@ OMG_HOST_SRC_FILES := \ | |||
graph/passes/atomic_addr_clean_pass.cc \ | |||
graph/passes/mark_same_addr_pass.cc \ | |||
graph/passes/mark_graph_unknown_status_pass.cc \ | |||
graph/passes/dynamic_single_op_reset_shape_pass.cc \ | |||
graph/passes/mark_agnostic_pass.cc \ | |||
graph/common/omg_util.cc \ | |||
graph/common/bcast.cc \ | |||
@@ -114,7 +114,6 @@ LIBGE_LOCAL_SRC_FILES := \ | |||
graph/passes/atomic_addr_clean_pass.cc \ | |||
graph/passes/mark_same_addr_pass.cc \ | |||
graph/passes/mark_graph_unknown_status_pass.cc \ | |||
graph/passes/dynamic_single_op_reset_shape_pass.cc \ | |||
graph/passes/mark_agnostic_pass.cc \ | |||
graph/partition/dynamic_shape_partition.cc \ | |||
graph/partition/stage_partition.cc \ | |||
@@ -48,7 +48,6 @@ const char *const kVectorEngine = "VectorEngine"; | |||
const char *const kAIcoreEngine = "AIcoreEngine"; | |||
const char *const kFileNameSuffix = "online"; | |||
const char *const kAicpuAllshape = "_AllShape"; | |||
const size_t kDynamicDimSize = 1; | |||
const int64_t kDynamicDimValue = -2; | |||
std::map<ge::OpEngineType, std::string> engine_type_map{ | |||
@@ -251,30 +250,6 @@ static void GetOpsProtoPath(string &opsproto_path) { | |||
opsproto_path = (path_base + "ops/op_proto/custom/" + ":") + (path_base + "ops/op_proto/built-in/"); | |||
} | |||
static Status CheckShapeReset(const OpDescPtr &op_desc, bool &change_shape_flag) { | |||
GE_CHECK_NOTNULL_EXEC(op_desc, return PARAM_INVALID); | |||
change_shape_flag = false; | |||
for (size_t i = 0; i < op_desc->GetAllInputsDesc().size(); i++) { | |||
auto input_desc = op_desc->MutableInputDesc(static_cast<uint32_t>(i)); | |||
GE_CHECK_NOTNULL(input_desc); | |||
// pass scalar input desc | |||
auto dims = input_desc->GetShape().GetDims(); | |||
if (dims.size() == kDynamicDimSize && dims[0] == kDynamicDimValue) { | |||
change_shape_flag = true; | |||
} | |||
} | |||
for (size_t i = 0; i < op_desc->GetAllOutputsDesc().size(); i++) { | |||
auto output_desc = op_desc->MutableOutputDesc(static_cast<uint32_t>(i)); | |||
GE_CHECK_NOTNULL(output_desc); | |||
// pass scalar output desc | |||
auto dims = output_desc->GetShape().GetDims(); | |||
if (dims.size() == kDynamicDimSize && dims[0] == kDynamicDimValue) { | |||
change_shape_flag = true; | |||
} | |||
} | |||
return SUCCESS; | |||
} | |||
static Status ResetTensorVecShape(const vector<GeTensor> &inputs, vector<GeTensor> &inputs_dynamic) { | |||
for (auto input : inputs) { | |||
auto input_desc = input.GetTensorDesc(); | |||
@@ -289,7 +264,7 @@ static Status ResetTensorVecShape(const vector<GeTensor> &inputs, vector<GeTenso | |||
bool is_const = false; | |||
(void)AttrUtils::GetBool(input_desc, CONST_ATTR_NAME_INPUT, is_const); | |||
if (!is_const && shape_ori.GetDims().size() > 0) { | |||
if (!is_const) { | |||
int64_t storage_format = FORMAT_NCHW; | |||
if (ge::AttrUtils::GetInt(desc, ge::ATTR_NAME_STORAGE_FORMAT, storage_format) && | |||
!ge::AttrUtils::SetListInt(desc, ge::ATTR_NAME_STORAGE_SHAPE, dynamic_shape_dims)) { | |||
@@ -723,10 +698,8 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in | |||
GELOGD("The opType in op_desc_tmp is [%s]", op_desc_tmp->GetType().c_str()); | |||
bool all_shape = false; | |||
bool dynamic_flag = false; | |||
(void)AttrUtils::GetBool(op_desc, kAicpuAllshape, all_shape); | |||
CheckShapeReset(op_desc, dynamic_flag); | |||
if (dynamic_flag || all_shape) { | |||
if (all_shape) { | |||
GELOGD("Get aicpu all_shape kernel!"); | |||
vector<GeTensor> inputs_dynamic; | |||
vector<GeTensor> outputs_dynamic; | |||
@@ -62,14 +62,14 @@ Status KernelExTaskInfo::InitTaskExtInfo(const std::string &ext_info, const OpDe | |||
auto input_desc = op_desc->MutableInputDesc(i); | |||
GE_CHECK_NOTNULL(input_desc); | |||
GE_CHK_STATUS_RET(ext_handle->UpdateInputShapeAndType(i, *input_desc), | |||
"Input[%zu] update input shape failed.", i); | |||
"Input[%u] update input shape failed.", i); | |||
} | |||
if (unknown_type != DEPEND_COMPUTE) { | |||
for (uint32_t j = 0; j < num_outputs; j++) { | |||
auto output_desc = op_desc->MutableOutputDesc(j); | |||
GE_CHECK_NOTNULL(output_desc); | |||
GE_CHK_STATUS_RET(ext_handle->UpdateOutputShapeAndType(j, *output_desc), | |||
"Output[%zu] update output shape failed.", j); | |||
"Output[%u] update output shape failed.", j); | |||
} | |||
} | |||
} | |||
@@ -994,13 +994,13 @@ Status KernelTaskInfo::InitAicpuTaskExtInfo(const std::string &ext_info) { | |||
auto input_desc = op_desc_->MutableInputDesc(i); | |||
GE_CHECK_NOTNULL(input_desc); | |||
GE_CHK_STATUS_RET(ext_handle->UpdateInputShapeAndType(i, *input_desc), | |||
"Input[%zu] update input shape failed.", i); | |||
"Input[%u] update input shape failed.", i); | |||
} | |||
for (uint32_t j = 0; j < num_outputs; j++) { | |||
auto output_desc = op_desc_->MutableOutputDesc(j); | |||
GE_CHECK_NOTNULL(output_desc); | |||
GE_CHK_STATUS_RET(ext_handle->UpdateOutputShapeAndType(j, *output_desc), | |||
"Output[%zu] update output shape failed.", j); | |||
"Output[%u] update output shape failed.", j); | |||
} | |||
} | |||
auto rt_ret = rtMalloc(&aicpu_ext_info_addr_, ext_handle->GetExtInfoLen(), RT_MEMORY_HBM); | |||
@@ -59,7 +59,6 @@ | |||
#include "graph/passes/iterator_op_pass.h" | |||
#include "graph/passes/link_gen_mask_nodes_pass.h" | |||
#include "graph/passes/mark_graph_unknown_status_pass.h" | |||
#include "graph/passes/dynamic_single_op_reset_shape_pass.h" | |||
#include "graph/passes/merge_pass.h" | |||
#include "graph/passes/merge_input_memcpy_pass.h" | |||
#include "graph/passes/merge_to_stream_merge_pass.h" | |||
@@ -643,22 +642,11 @@ Status GraphManager::ReplaceSubgraphWithOriGraph(const ComputeGraphPtr &compute_ | |||
Status GraphManager::SetSubgraph(uint64_t session_id, ComputeGraphPtr compute_graph, GraphPartitioner &partitioner) { | |||
GE_CHECK_NOTNULL(compute_graph); | |||
PassManager pass_for_dynamic_shape_reset_optimize; | |||
GE_CHK_STATUS_RET(pass_for_dynamic_shape_reset_optimize.AddPass( | |||
"SetSubgraph::AfterSetSubgraph::DynamicSingleOpResetShapePass", new (std::nothrow) DynamicSingleOpResetShapePass)) | |||
GE_TIMESTAMP_START(pass_for_dynamic_shape_reset_optimize); | |||
Status ret = pass_for_dynamic_shape_reset_optimize.Run(compute_graph); | |||
GE_TIMESTAMP_END(pass_for_dynamic_shape_reset_optimize, "SetSubgraph::AfterSetSubgraph"); | |||
if (ret != SUCCESS && ret != NOT_CHANGED) { | |||
GELOGE(ret, "Run passes when optimize subgraph failed"); | |||
return ret; | |||
} | |||
auto sub_graph_map = partitioner.GetSubGraphMap(); | |||
GELOGD("Directly optimize subgraph with build mode:%s, and step:%s.", | |||
options_.build_mode.c_str(), | |||
options_.build_step.c_str()); | |||
ret = OptimizeSubGraphWithMultiThreads(compute_graph, sub_graph_map, session_id); | |||
Status ret = OptimizeSubGraphWithMultiThreads(compute_graph, sub_graph_map, session_id); | |||
if (ret != SUCCESS) { | |||
GELOGE(ret, "Multiply optimize subgraph failed"); | |||
return ret; | |||
@@ -1,155 +0,0 @@ | |||
/** | |||
* Copyright 2020 Huawei Technologies Co., Ltd | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
#include "graph/passes/dynamic_single_op_reset_shape_pass.h" | |||
#include "common/ge_inner_error_codes.h" | |||
#include "graph/utils/node_utils.h" | |||
#include "graph/utils/graph_utils.h" | |||
#include "graph/utils/tensor_utils.h" | |||
#include "graph/utils/op_desc_utils.h" | |||
#include "graph/utils/type_utils.h" | |||
#include "graph/debug/ge_attr_define.h" | |||
namespace ge { | |||
namespace { | |||
const int64_t kDynamicShapeDim = -2; | |||
const char *const kEngineNameAiCpu = "DNN_VM_AICPU_ASCEND"; | |||
const char *const kEngineNameAiCpuTf = "DNN_VM_AICPU"; | |||
} // namespace | |||
Status DynamicSingleOpResetShapePass::Run(ComputeGraphPtr graph) { | |||
GE_CHECK_NOTNULL(graph); | |||
std::shared_ptr<GELib> instance = ge::GELib::GetInstance(); | |||
if (instance == nullptr || !instance->InitFlag()) { | |||
GELOGE(ge::GE_CLI_GE_NOT_INITIALIZED, "Run CompileNodesPass failed."); | |||
return ge::GE_CLI_GE_NOT_INITIALIZED; | |||
} | |||
// pass if graph has not aicpu node. | |||
bool is_not_aicpu = false; | |||
if (CheckAllAicpuNodes(graph, is_not_aicpu) != SUCCESS) { | |||
GELOGE(ge::GE_CLI_GE_NOT_INITIALIZED, "Check if graph has not aicpu node failed."); | |||
return ge::GE_CLI_GE_NOT_INITIALIZED; | |||
} | |||
if (is_not_aicpu) { | |||
GELOGI("The graph [%s] has not aicpu node, whose aicpu nodes would not be reset dynamic shape", | |||
graph->GetName().c_str()); | |||
return SUCCESS; | |||
} | |||
for (const auto &node : graph->GetDirectNode()) { | |||
GE_CHECK_NOTNULL(node->GetOpDesc()); | |||
// pass input and output node | |||
if (node->GetType() == DATA || node->GetType() == CONSTANT || node->GetType() == CONSTANTOP || | |||
node->GetType() == NETOUTPUT) { | |||
continue; | |||
} | |||
// pass node without attr: ATTR_SINGLE_OP_SCENE | |||
bool single_aicpu_unknown = false; | |||
if (!AttrUtils::GetBool(node->GetOpDesc(), ATTR_SINGLE_OP_SCENE, single_aicpu_unknown) || | |||
!single_aicpu_unknown) { | |||
continue; | |||
} | |||
// reset aicpu shape to unknown shape | |||
auto op_desc = node->GetOpDesc(); | |||
if (ResetOpShape(op_desc) != SUCCESS) { | |||
GELOGE(ge::GE_CLI_GE_NOT_INITIALIZED, "Reset node[%s] dynamic shapr failed.", node->GetName().c_str()); | |||
return ge::GE_CLI_GE_NOT_INITIALIZED; | |||
} | |||
GELOGD("Reset dynamic aicpu node [%s] shape success!", node->GetName().c_str()); | |||
} | |||
GELOGD("Reset dynamic aicpu nodes shape of graph [%s] success!", graph->GetName().c_str()); | |||
return SUCCESS; | |||
} | |||
Status DynamicSingleOpResetShapePass::CheckAllAicpuNodes(const ComputeGraphPtr &graph, bool &is_not_aicpu) { | |||
is_not_aicpu = false; | |||
for (const auto &node : graph->GetDirectNode()) { | |||
GE_CHECK_NOTNULL(node->GetOpDesc()); | |||
// pass input and output node | |||
if (node->GetType() == DATA || node->GetType() == CONSTANT || node->GetType() == CONSTANTOP || | |||
node->GetType() == NETOUTPUT) { | |||
continue; | |||
} | |||
// find if there are aicpu nodes. | |||
auto op_desc = node->GetOpDesc(); | |||
string engine_name = op_desc->GetOpEngineName(); | |||
if (engine_name.empty()) { | |||
GELOGE(GRAPH_FAILED, "Get engine failed of node[%s].", node->GetName().c_str()); | |||
return GRAPH_FAILED; | |||
} | |||
if (engine_name != kEngineNameAiCpu && engine_name != kEngineNameAiCpuTf) { | |||
is_not_aicpu = true; | |||
return SUCCESS; | |||
} | |||
} | |||
return SUCCESS; | |||
} | |||
bool DynamicSingleOpResetShapePass::CheckIfConstInput(const GeTensorDescPtr &input_tensor_desc) { | |||
bool is_const = false; | |||
(void)AttrUtils::GetBool(input_tensor_desc, CONST_ATTR_NAME_INPUT, is_const); | |||
return is_const; | |||
} | |||
Status DynamicSingleOpResetShapePass::ResetOpShape(OpDescPtr &op_desc) { | |||
GE_CHECK_NOTNULL(op_desc); | |||
std::vector<int64_t> dynamic_shape_dims = {kDynamicShapeDim}; | |||
GeShape dynamic_shape(dynamic_shape_dims); | |||
(void)ResetInputTensorShape(op_desc, dynamic_shape); | |||
(void)ResetOutputTensorShape(op_desc, dynamic_shape); | |||
return SUCCESS; | |||
} | |||
Status DynamicSingleOpResetShapePass::ResetInputTensorShape(OpDescPtr &op_desc, | |||
const GeShape &dynamic_shape) { | |||
GE_CHECK_NOTNULL(op_desc); | |||
for (size_t i = 0; i < op_desc->GetAllInputsDesc().size(); i++) { | |||
auto input_desc = op_desc->MutableInputDesc(static_cast<uint32_t>(i)); | |||
GE_CHECK_NOTNULL(input_desc); | |||
// pass scalar input desc | |||
auto dims_ori = input_desc->GetShape().GetDims(); | |||
if (dims_ori.size() == 0) { | |||
continue; | |||
} | |||
// pass const input | |||
if (CheckIfConstInput(input_desc)) { | |||
continue; | |||
} | |||
input_desc->SetShape(dynamic_shape); | |||
} | |||
return SUCCESS; | |||
} | |||
Status DynamicSingleOpResetShapePass::ResetOutputTensorShape(OpDescPtr &op_desc, const GeShape &dynamic_shape) { | |||
GE_CHECK_NOTNULL(op_desc); | |||
for (size_t i = 0; i < op_desc->GetAllOutputsDesc().size(); i++) { | |||
auto output_desc = op_desc->MutableOutputDesc(static_cast<uint32_t>(i)); | |||
GE_CHECK_NOTNULL(output_desc); | |||
// pass scalar input desc | |||
auto output_dims_ori = output_desc->GetShape().GetDims(); | |||
if (output_dims_ori.size() == 0) { | |||
continue; | |||
} | |||
output_desc->SetShape(dynamic_shape); | |||
} | |||
return SUCCESS; | |||
} | |||
} // namespace ge |
@@ -1,36 +0,0 @@ | |||
/** | |||
* Copyright 2020 Huawei Technologies Co., Ltd | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
#ifndef GE_GRAPH_PASSES_DYNAMIC_SINGLE_OP_RESET_SHAPE_PASS_H_ | |||
#define GE_GRAPH_PASSES_DYNAMIC_SINGLE_OP_RESET_SHAPE_PASS_H_ | |||
#include "graph/graph.h" | |||
#include "inc/graph_pass.h" | |||
#include "init/gelib.h" | |||
namespace ge { | |||
class DynamicSingleOpResetShapePass : public GraphPass { | |||
public: | |||
Status Run(ComputeGraphPtr graph) override; | |||
private: | |||
Status ResetOpShape(OpDescPtr &op_desc); | |||
Status ResetInputTensorShape(OpDescPtr &op_desc, const GeShape &dynamic_shape); | |||
Status ResetOutputTensorShape(OpDescPtr &op_desc, const GeShape &dynamic_shape); | |||
Status CheckAllAicpuNodes(const ComputeGraphPtr &graph, bool &is_not_aicpu); | |||
bool CheckIfConstInput(const GeTensorDescPtr &input_tensor_desc); | |||
}; | |||
} // namespace ge | |||
#endif // GE_GRAPH_PASSES_DYNAMIC_SINGLE_OP_RESET_SHAPE_PASS_H_ |
@@ -186,7 +186,6 @@ set(COMMON_SRC_FILES | |||
"${GE_CODE_DIR}/ge/graph/passes/atomic_addr_clean_pass.cc" | |||
"${GE_CODE_DIR}/ge/graph/passes/mark_same_addr_pass.cc" | |||
"${GE_CODE_DIR}/ge/graph/passes/mark_graph_unknown_status_pass.cc" | |||
"${GE_CODE_DIR}/ge/graph/passes/dynamic_single_op_reset_shape_pass.cc" | |||
"${GE_CODE_DIR}/ge/graph/passes/mark_agnostic_pass.cc" | |||
"${GE_CODE_DIR}/ge/graph/passes/dimension_compute_pass.cc" | |||
"${GE_CODE_DIR}/ge/graph/passes/dimension_adjust_pass.cc" | |||