From b0060848d6fb2d98ceb13c5f1b8911bcf84d67ce Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 22 Dec 2020 21:00:33 +0800 Subject: [PATCH 01/22] fix storage bug. --- ge/generator/ge_generator.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ge/generator/ge_generator.cc b/ge/generator/ge_generator.cc index c775c477..d162d58e 100644 --- a/ge/generator/ge_generator.cc +++ b/ge/generator/ge_generator.cc @@ -265,7 +265,7 @@ static Status CheckShapeReset(const OpDescPtr &op_desc, bool &change_shape_flag) return SUCCESS; } -static void ResetTensorVecShape(const vector &inputs, vector &inputs_dynamic) { +static Status ResetTensorVecShape(const vector &inputs, vector &inputs_dynamic) { for (auto input : inputs) { auto input_desc = input.GetTensorDesc(); GeShape shape_ori = input_desc.GetShape(); @@ -280,6 +280,12 @@ static void ResetTensorVecShape(const vector &inputs, vector bool is_const = false; (void)AttrUtils::GetBool(input_desc, CONST_ATTR_NAME_INPUT, is_const); if (!is_const && shape_ori.GetDims().size() > 0) { + 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)) { + GELOGE(FAILED, "Set attr ATTR_NAME_STORAGE_SHAPE fail."); + return FAILED; + } desc.SetShape(dynamic_shape); desc.SetShapeRange(dynamic_shape_range); } @@ -287,6 +293,7 @@ static void ResetTensorVecShape(const vector &inputs, vector inputTensor.SetTensorDesc(desc); inputs_dynamic.push_back(inputTensor); } + return SUCCESS; } class GeGenerator::Impl { @@ -684,8 +691,8 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector &in if (CheckShapeReset(op_desc, dynamic_flag) == SUCCESS && dynamic_flag) { vector inputs_dynamic; vector outputs_dynamic; - ResetTensorVecShape(inputs, inputs_dynamic); - ResetTensorVecShape(outputs, outputs_dynamic); + GE_CHK_STATUS_RET_NOLOG(ResetTensorVecShape(inputs, inputs_dynamic)); + GE_CHK_STATUS_RET_NOLOG(ResetTensorVecShape(outputs, outputs_dynamic)); GE_CHK_STATUS_RET_NOLOG( impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs_dynamic, outputs_dynamic)); } else { From 8869535a1e67f9928adeb7a28788b98ec35ce86e Mon Sep 17 00:00:00 2001 From: baker Date: Tue, 22 Dec 2020 21:25:42 +0800 Subject: [PATCH 02/22] update submodule --- metadef | 2 +- parser | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/metadef b/metadef index 2f774bcd..8c89c521 160000 --- a/metadef +++ b/metadef @@ -1 +1 @@ -Subproject commit 2f774bcd66b0d4b8d65b629f50148e9dd2248403 +Subproject commit 8c89c521f5d682327b2f975cf06f7093960eb2f0 diff --git a/parser b/parser index 89e2455f..54ec7731 160000 --- a/parser +++ b/parser @@ -1 +1 @@ -Subproject commit 89e2455f653807f7bb3177b9b5eb096100a600db +Subproject commit 54ec7731e3a2951191693e02ff3165220975ed0c From a5eecaf62de2cfa46861990f0b6c490d8ec0412e Mon Sep 17 00:00:00 2001 From: baker Date: Wed, 23 Dec 2020 10:22:37 +0800 Subject: [PATCH 03/22] report new api --- ge/graph/manager/graph_manager.cc | 15 +++++++++++---- ge/graph/manager/graph_manager.h | 3 ++- ge/graph/optimize/graph_optimize.cc | 7 +------ ge/graph/optimize/graph_optimize.h | 3 +-- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ge/graph/manager/graph_manager.cc b/ge/graph/manager/graph_manager.cc index 46799ba3..171f233f 100755 --- a/ge/graph/manager/graph_manager.cc +++ b/ge/graph/manager/graph_manager.cc @@ -534,7 +534,8 @@ Status GraphManager::OptimizeSubGraphWithMultiThreads(ComputeGraphPtr compute_gr (void) AttrUtils::SetStr(subgraph->GetSubGraph(), ATTR_NAME_OP_COMPILE_STRATEGY, op_compile_strategy); } std::future f = executor.commit(GraphManager::ProcessSubGraphWithMultiThreads, this, - compute_graph->GetGraphID(), subgraph, compute_graph, session_id, + compute_graph->GetGraphID(), subgraph, + compute_graph->GetName(), session_id, GetThreadLocalContext()); if (!f.valid()) { GELOGE(FAILED, "Future is invalid"); @@ -549,7 +550,8 @@ Status GraphManager::OptimizeSubGraphWithMultiThreads(ComputeGraphPtr compute_gr (void) AttrUtils::SetStr(subgraph->GetSubGraph(), ATTR_NAME_OP_COMPILE_STRATEGY, op_compile_strategy); } std::future f = executor.commit(GraphManager::ProcessSubGraphWithMultiThreads, this, - compute_graph->GetGraphID(), subgraph, compute_graph, session_id, + compute_graph->GetGraphID(), subgraph, + compute_graph->GetName(), session_id, GetThreadLocalContext()); if (!f.valid()) { GELOGE(FAILED, "Future is invalid"); @@ -2459,7 +2461,8 @@ Status GraphManager::CheckAndReleaseMemory(const GeModelPtr &ge_model, const Gra Status GraphManager::ProcessSubGraphWithMultiThreads(GraphManager *graph_manager, GraphId root_graph_id, const SubGraphInfoPtr &sub_graph_info_ptr, - const ComputeGraphPtr &compute_graph, uint64_t session_id, + const std::string &root_graph_name, + uint64_t session_id, const GEThreadLocalContext &ge_context) { if (sub_graph_info_ptr != nullptr && graph_manager != nullptr) { GetContext().SetSessionId(session_id); @@ -2476,9 +2479,13 @@ Status GraphManager::ProcessSubGraphWithMultiThreads(GraphManager *graph_manager GELOGE(FAILED, "Failed to set attr ATTR_NAME_ROOT_GRAPH_ID for subgraph, graph_id: %u.", root_graph_id); return FAILED; } + if (!AttrUtils::SetStr(*compute_graph_tmp, ATTR_NAME_ROOT_GRAPH_NAME, root_graph_name)) { + GELOGE(FAILED, "Failed to set attr ATTR_NAME_ROOT_GRAPH_NAME for subgraph, \ + root_graph_name: %s.", root_graph_name.c_str()); + return FAILED; + } compute_graph_tmp->SetSessionID(session_id); Status ret = graph_manager->GetCompilerStages(root_graph_id).optimizer.OptimizeSubGraph(compute_graph_tmp, - compute_graph, engine_name); if (ret != SUCCESS) { GELOGE(ret, "SubGraph optimize Failed %s", engine_name.c_str()); diff --git a/ge/graph/manager/graph_manager.h b/ge/graph/manager/graph_manager.h index feca02fc..d2887c4c 100644 --- a/ge/graph/manager/graph_manager.h +++ b/ge/graph/manager/graph_manager.h @@ -219,7 +219,8 @@ class GraphManager { static Status ProcessSubGraphWithMultiThreads(GraphManager *graph_manager, GraphId root_graph_id, const SubGraphInfoPtr &sub_graph_info_ptr, - const ComputeGraphPtr &compute_graph, uint64_t session_id, + const std::string &root_graph_name, + uint64_t session_id, const GEThreadLocalContext &ge_context); Status ParseInputsDims(const std::vector &input_tensor); void ParseInputsDimsForData(const std::vector &input_tensor); diff --git a/ge/graph/optimize/graph_optimize.cc b/ge/graph/optimize/graph_optimize.cc index c5ebfda6..c94408de 100644 --- a/ge/graph/optimize/graph_optimize.cc +++ b/ge/graph/optimize/graph_optimize.cc @@ -76,8 +76,7 @@ void AddNodeInputProperty(ComputeGraphPtr &compute_graph) { } } -Status GraphOptimize::OptimizeSubGraph(ComputeGraphPtr &compute_graph, const ComputeGraphPtr &parent_graph, - const std::string &engine_name) { +Status GraphOptimize::OptimizeSubGraph(ComputeGraphPtr &compute_graph, const std::string &engine_name) { if (compute_graph == nullptr) { GELOGE(GE_GRAPH_OPTIMIZE_COMPUTE_GRAPH_NULL, "[OptimizeSubGraph]: compute_graph is nullptr."); return GE_GRAPH_OPTIMIZE_COMPUTE_GRAPH_NULL; @@ -106,10 +105,6 @@ Status GraphOptimize::OptimizeSubGraph(ComputeGraphPtr &compute_graph, const Com for (auto iter = graph_optimizer.begin(); iter != graph_optimizer.end(); ++iter) { Status ret = (*iter)->OptimizeFusedGraphAfterGraphSlice(*(compute_graph)); if (ret != SUCCESS) { - auto root_graph = ge::GraphUtils::FindRootGraph(parent_graph); - if (root_graph != nullptr) { - ErrorManager::GetInstance().SaveMstuneCompileFailedMsg(root_graph->GetName()); - } GELOGE(ret, "[OptimizeSubGraph][OptimizeFusedGraphAfterGraphSlice]: graph optimize failed, ret:%d", ret); return ret; } diff --git a/ge/graph/optimize/graph_optimize.h b/ge/graph/optimize/graph_optimize.h index 969b4720..78d580b7 100755 --- a/ge/graph/optimize/graph_optimize.h +++ b/ge/graph/optimize/graph_optimize.h @@ -42,8 +42,7 @@ class GraphOptimize { ~GraphOptimize() = default; // subgraph optimize - Status OptimizeSubGraph(ComputeGraphPtr &compute_graph, const ComputeGraphPtr &parent_graph, - const std::string &engine_name); + Status OptimizeSubGraph(ComputeGraphPtr &compute_graph, const std::string &engine_name); // original graph optimize Status OptimizeOriginalGraph(ComputeGraphPtr &compute_graph); From e6da916294cdb029a43d2dfef4ecdf4e5e94500e Mon Sep 17 00:00:00 2001 From: lianghao Date: Wed, 23 Dec 2020 11:11:10 +0800 Subject: [PATCH 04/22] op_compiler_cache_dir --- ge/offline/main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ge/offline/main.cc b/ge/offline/main.cc index b7188a85..46d25d97 100755 --- a/ge/offline/main.cc +++ b/ge/offline/main.cc @@ -305,7 +305,7 @@ class GFlagUtils { " --debug_dir Set the save path of operator compilation intermediate files.\n" "Default value: ./kernel_meta\n" " --op_compiler_cache_dir Set the save path of operator compilation cache files.\n" - "Default value: $HOME/atc_data/kernel_cache\n" + "Default value: $HOME/atc_data\n" " --op_compiler_cache_mode Set the operator compilation cache mode." "Options are disable(default), enable and force(force to refresh the cache)"); From ce761cf8709e2fd6b061b1edb7a9bfc74469eda0 Mon Sep 17 00:00:00 2001 From: weiyang Date: Wed, 23 Dec 2020 14:49:16 +0800 Subject: [PATCH 05/22] fix --- ge/executor/ge_executor.cc | 4 ++-- ge/graph/load/graph_loader.cc | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ge/executor/ge_executor.cc b/ge/executor/ge_executor.cc index 18d78696..e506994e 100755 --- a/ge/executor/ge_executor.cc +++ b/ge/executor/ge_executor.cc @@ -569,7 +569,7 @@ Status GeExecutor::UnloadModel(uint32_t model_id) { Status ret = GraphLoader::DestroyAicpuSessionForInfer(model_id); if (ret != SUCCESS) { GELOGE(ret, "[GraphLoader] DestroyAicpuSessionForInfer failed. model id: %u", model_id); - return ACL_ERROR_GE_INTERNAL_ERROR; + return ret; } std::shared_ptr hybrid_davinci_model = @@ -587,7 +587,7 @@ Status GeExecutor::UnloadModel(uint32_t model_id) { ret = GraphLoader::UnloadModel(model_id); if (ret != SUCCESS) { GELOGE(ret, "[GraphLoader] DestroyAicpuSessionForInfer failed. model id: %u", model_id); - return ACL_ERROR_GE_UNLOAD_MODEL; + return ret; } return SUCCESS; } diff --git a/ge/graph/load/graph_loader.cc b/ge/graph/load/graph_loader.cc index cb68533e..93d1a1a9 100755 --- a/ge/graph/load/graph_loader.cc +++ b/ge/graph/load/graph_loader.cc @@ -176,8 +176,8 @@ Status GraphLoader::LoadModelFromData(uint32_t &model_id, const ModelData &model Status ret = model_manager->LoadModelOffline( model_id, model_data, nullptr, dev_ptr, mem_size, weight_ptr, weight_size); if (ret != SUCCESS) { - GELOGE(ACL_ERROR_GE_LOAD_MODEL, "Load model failed, model_id:%u.", model_id); - return ACL_ERROR_GE_LOAD_MODEL; + GELOGE(ret, "Load model failed, model_id:%u.", model_id); + return ret; } GELOGI("Load model success, model_id:%u.", model_id); return SUCCESS; @@ -202,8 +202,8 @@ Status GraphLoader::LoadModelWithQ(uint32_t &model_id, const ModelData &model_da GE_CHECK_NOTNULL(model_manager); Status ret = model_manager->LoadModelWithQ(model_id, model_data, input_queue_ids, output_queue_ids); if (ret != SUCCESS) { - GELOGE(ACL_ERROR_GE_LOAD_MODEL, "Load model with queue failed, model_id:%u.", model_id); - return ACL_ERROR_GE_LOAD_MODEL; + GELOGE(ret, "Load model with queue failed, model_id:%u.", model_id); + return ret; } GELOGI("Load model with queue success, model_id:%u.", model_id); From 5842afa61f66ed00838498c8c3471022946c879d Mon Sep 17 00:00:00 2001 From: y00500818 Date: Mon, 21 Dec 2020 20:17:27 +0800 Subject: [PATCH 06/22] add dt_variant type. --- ge/client/proto/ge_ir.proto | 1 + ge/common/ge/datatype_util.cc | 1 + ge/common/proto/ge_ir.proto | 1 + ge/executor/proto/dump_task.proto | 1 + ge/executor/proto/ge_ir.proto | 1 + ge/graph/load/new_model_manager/data_dumper.cc | 1 + ge/offline/proto/ge_ir.proto | 1 + ge/proto/dump_task.proto | 1 + ge/proto/ge_ir.proto | 1 + metadef | 2 +- parser | 2 +- tests/ut/ge/common/format_transfer_unittest.cc | 2 +- 12 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ge/client/proto/ge_ir.proto b/ge/client/proto/ge_ir.proto index e7bfe0cb..12989a54 100644 --- a/ge/client/proto/ge_ir.proto +++ b/ge/client/proto/ge_ir.proto @@ -30,6 +30,7 @@ enum DataType DT_RESOURCE = 23; // resource type DT_STRING_REF = 24; // string_ref type DT_DUAL = 25; /**< dual output type */ + DT_VARIANT = 26; // variant type } message AttrDef diff --git a/ge/common/ge/datatype_util.cc b/ge/common/ge/datatype_util.cc index 15234768..c051fe1d 100755 --- a/ge/common/ge/datatype_util.cc +++ b/ge/common/ge/datatype_util.cc @@ -62,6 +62,7 @@ std::map g_dump_data_type_map = { {ge::DT_RESOURCE, ge::proto::DT_RESOURCE}, {ge::DT_STRING_REF, ge::proto::DT_STRING_REF}, {ge::DT_STRING, ge::proto::DT_STRING}, + {ge::DT_VARIANT, ge::proto::DT_VARIANT}, }; } // namespace diff --git a/ge/common/proto/ge_ir.proto b/ge/common/proto/ge_ir.proto index e7bfe0cb..12989a54 100644 --- a/ge/common/proto/ge_ir.proto +++ b/ge/common/proto/ge_ir.proto @@ -30,6 +30,7 @@ enum DataType DT_RESOURCE = 23; // resource type DT_STRING_REF = 24; // string_ref type DT_DUAL = 25; /**< dual output type */ + DT_VARIANT = 26; // variant type } message AttrDef diff --git a/ge/executor/proto/dump_task.proto b/ge/executor/proto/dump_task.proto index b1e346cd..c2e4a0b8 100644 --- a/ge/executor/proto/dump_task.proto +++ b/ge/executor/proto/dump_task.proto @@ -28,6 +28,7 @@ enum OutputDataType { DT_RESOURCE = 23; DT_STRING_REF = 24; DT_DUAL = 25; + DT_VARIANT = 26; } enum OutputFormat { diff --git a/ge/executor/proto/ge_ir.proto b/ge/executor/proto/ge_ir.proto index e7bfe0cb..12989a54 100644 --- a/ge/executor/proto/ge_ir.proto +++ b/ge/executor/proto/ge_ir.proto @@ -30,6 +30,7 @@ enum DataType DT_RESOURCE = 23; // resource type DT_STRING_REF = 24; // string_ref type DT_DUAL = 25; /**< dual output type */ + DT_VARIANT = 26; // variant type } message AttrDef diff --git a/ge/graph/load/new_model_manager/data_dumper.cc b/ge/graph/load/new_model_manager/data_dumper.cc index 6f65e907..b33a062d 100644 --- a/ge/graph/load/new_model_manager/data_dumper.cc +++ b/ge/graph/load/new_model_manager/data_dumper.cc @@ -120,6 +120,7 @@ static int32_t GetIrDataType(ge::DataType data_type) { {ge::DT_RESOURCE, ge::proto::DT_RESOURCE}, {ge::DT_STRING_REF, ge::proto::DT_STRING_REF}, {ge::DT_STRING, ge::proto::DT_STRING}, + {ge::DT_VARIANT, ge::proto::DT_VARIANT}, }; auto iter = data_type_map.find(data_type); diff --git a/ge/offline/proto/ge_ir.proto b/ge/offline/proto/ge_ir.proto index e7bfe0cb..12989a54 100644 --- a/ge/offline/proto/ge_ir.proto +++ b/ge/offline/proto/ge_ir.proto @@ -30,6 +30,7 @@ enum DataType DT_RESOURCE = 23; // resource type DT_STRING_REF = 24; // string_ref type DT_DUAL = 25; /**< dual output type */ + DT_VARIANT = 26; // variant type } message AttrDef diff --git a/ge/proto/dump_task.proto b/ge/proto/dump_task.proto index b1e346cd..c2e4a0b8 100644 --- a/ge/proto/dump_task.proto +++ b/ge/proto/dump_task.proto @@ -28,6 +28,7 @@ enum OutputDataType { DT_RESOURCE = 23; DT_STRING_REF = 24; DT_DUAL = 25; + DT_VARIANT = 26; } enum OutputFormat { diff --git a/ge/proto/ge_ir.proto b/ge/proto/ge_ir.proto index e7bfe0cb..12989a54 100644 --- a/ge/proto/ge_ir.proto +++ b/ge/proto/ge_ir.proto @@ -30,6 +30,7 @@ enum DataType DT_RESOURCE = 23; // resource type DT_STRING_REF = 24; // string_ref type DT_DUAL = 25; /**< dual output type */ + DT_VARIANT = 26; // variant type } message AttrDef diff --git a/metadef b/metadef index 8c89c521..c14d2be3 160000 --- a/metadef +++ b/metadef @@ -1 +1 @@ -Subproject commit 8c89c521f5d682327b2f975cf06f7093960eb2f0 +Subproject commit c14d2be38171eed63416e71178774103faf1f5cd diff --git a/parser b/parser index 54ec7731..34559943 160000 --- a/parser +++ b/parser @@ -1 +1 @@ -Subproject commit 54ec7731e3a2951191693e02ff3165220975ed0c +Subproject commit 34559943b6cb645042a87d99bc88ead016b15b64 diff --git a/tests/ut/ge/common/format_transfer_unittest.cc b/tests/ut/ge/common/format_transfer_unittest.cc index 4fcfb378..fd2a296c 100644 --- a/tests/ut/ge/common/format_transfer_unittest.cc +++ b/tests/ut/ge/common/format_transfer_unittest.cc @@ -79,7 +79,7 @@ TEST_F(UtestFormatTransfer, get_size_by_data_type) { EXPECT_EQ(GetSizeByDataType(DT_STRING_REF), -1); EXPECT_EQ(GetSizeByDataType(DT_DUAL), 5); EXPECT_EQ(GetSizeByDataType(DT_UNDEFINED), -1); - EXPECT_EQ(DT_UNDEFINED, 26); + EXPECT_EQ(DT_UNDEFINED, 27); } } // namespace formats } // namespace ge From 62bb799d97158314e8dbc175d635847179ffc2f4 Mon Sep 17 00:00:00 2001 From: lwx897429 Date: Wed, 23 Dec 2020 12:35:35 +0800 Subject: [PATCH 07/22] Add keep_dtype attribute on operators to keep precision unchanged. --- .../node_executor/hccl/hccl_node_executor.cc | 3 +- ge/ir_build/atc_ir_common.cc | 12 ++ ge/ir_build/atc_ir_common.h | 1 + ge/offline/CMakeLists.txt | 1 + ge/offline/keep_dtype_option.cc | 107 ++++++++++++++++++ ge/offline/keep_dtype_option.h | 26 +++++ ge/offline/main.cc | 12 ++ ge/offline/module.mk | 3 + 8 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 ge/offline/keep_dtype_option.cc create mode 100644 ge/offline/keep_dtype_option.h diff --git a/ge/hybrid/node_executor/hccl/hccl_node_executor.cc b/ge/hybrid/node_executor/hccl/hccl_node_executor.cc index eebe2a81..94c734ca 100644 --- a/ge/hybrid/node_executor/hccl/hccl_node_executor.cc +++ b/ge/hybrid/node_executor/hccl/hccl_node_executor.cc @@ -96,7 +96,8 @@ Status HcclNodeTask::ExecuteAsync(TaskContext &context, std::function do op_info.root = root_id; auto callback = [this, op_desc](HcclResult status) { if (status != HCCL_SUCCESS) { - GELOGE(HCCL_E_INTERNAL, "node %s call HcomExecEnqueueOperation failed, ret: 0x%X", op_desc->GetName().c_str(), status); + GELOGE(HCCL_E_INTERNAL, "node %s call HcomExecEnqueueOperation failed, ret: 0x%X", + op_desc->GetName().c_str(), status); } std::lock_guard lock(this->hccl_mutex_); this->cond_.notify_all(); diff --git a/ge/ir_build/atc_ir_common.cc b/ge/ir_build/atc_ir_common.cc index 77d749de..5b82f8f2 100755 --- a/ge/ir_build/atc_ir_common.cc +++ b/ge/ir_build/atc_ir_common.cc @@ -51,6 +51,7 @@ const char *const kDigitError = "is not digit"; const char *const kCompressWeightError = "it must be appointed when appoint parameter[--optypelist_for_implmode]"; const char *const kSelectImplmodeError = "only support high_performance, high_precision"; const char *const kDynamicBatchSizeError = "It can only contains digit, \",\", \" \""; +const char *const kKeepDtypeError = "file not found"; vector SplitInputShape(const std::string &input_shape) { vector shape_pair_vec; @@ -439,6 +440,17 @@ Status CheckCompressWeightParamValid(const std::string enable_compress_weight, c return ge::SUCCESS; } +Status CheckKeepTypeParamValid(const std::string &keep_dtype) { + if ((!keep_dtype.empty()) && (!CheckInputPathValid(keep_dtype, "--keep_dtype"))) { + ErrorManager::GetInstance().ATCReportErrMessage( + "E10001", {"parameter", "value", "reason"}, {"--keep_dtype", keep_dtype, kKeepDtypeError}); + GELOGE(ge::PARAM_INVALID, "keep dtype config file not found, file_name:%s", keep_dtype.c_str()); + return ge::PARAM_INVALID; + } + + return ge::SUCCESS; +} + int CheckLogParamValidAndSetLogLevel(const std::string log) { int ret = -1; if (log == "default") { diff --git a/ge/ir_build/atc_ir_common.h b/ge/ir_build/atc_ir_common.h index b26c2f2b..9f6205be 100644 --- a/ge/ir_build/atc_ir_common.h +++ b/ge/ir_build/atc_ir_common.h @@ -76,6 +76,7 @@ Status CheckDisableReuseMemoryParamValid(const std::string disable_reuse_memory) Status CheckEnableSingleStreamParamValid(const std::string enable_single_stream); Status CheckImplmodeParamValid(const std::string &optypelist_for_implmode, std::string &op_select_implmode); Status CheckInputFormat(const string &input_format); +Status CheckKeepTypeParamValid(const std::string &keep_dtype); void PrintOptionMap(std::map &options, std::string tips); void EraseEndSemicolon(std::string ¶m); } diff --git a/ge/offline/CMakeLists.txt b/ge/offline/CMakeLists.txt index af259ecb..48c1cbe7 100644 --- a/ge/offline/CMakeLists.txt +++ b/ge/offline/CMakeLists.txt @@ -10,6 +10,7 @@ protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) set(SRC_LIST "main.cc" "single_op_parser.cc" + "keep_dtype_option.cc" "../session/omg.cc" "../ir_build/atc_ir_common.cc" ) diff --git a/ge/offline/keep_dtype_option.cc b/ge/offline/keep_dtype_option.cc new file mode 100644 index 00000000..348a6068 --- /dev/null +++ b/ge/offline/keep_dtype_option.cc @@ -0,0 +1,107 @@ +/** + * 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 "keep_dtype_option.h" +#include +#include +#include +#include +#include "graph/debug/ge_attr_define.h" +#include "framework/common/util.h" +#include "common/util/error_manager/error_manager.h" + +namespace ge { +namespace { +const size_t kMaxOpsNum = 10; +} // namespace +bool IsOriginalOpFind(OpDescPtr &op_desc, const std::string &op_name) { + std::vector original_op_names; + if (!AttrUtils::GetListStr(op_desc, ATTR_NAME_DATA_DUMP_ORIGIN_OP_NAMES, original_op_names)) { + return false; + } + + for (auto &origin_name : original_op_names) { + if (origin_name == op_name) { + return true; + } + } + + return false; +} + +void KeepDtypeReportError(const std::vector &invalid_list) { + std::stringstream error_ops; + for (size_t i = 0; i < invalid_list.size(); i++) { + if (i == kMaxOpsNum) { + error_ops << "..."; + break; + } + error_ops << invalid_list[i] << " "; + } + std::string err_msg = "config file contains "; + err_msg = err_msg.append(std::to_string(invalid_list.size())) + .append(" operators not in the graph, op names:") + .append(error_ops.str()); + ErrorManager::GetInstance().ATCReportErrMessage( + "E10042", {"parameter", "reason"}, {"keep_dtype", err_msg.c_str()}); + GELOGE(FAILED, "%s", err_msg.c_str()); +} + +Status DealKeepDtypeOption(const ComputeGraphPtr &graph, const std::string &keep_dtype) { + GE_CHECK_NOTNULL(graph); + if (keep_dtype.empty()) { + return SUCCESS; + } + std::string real_path = RealPath(keep_dtype.c_str()); + if (real_path.empty()) { + GELOGE(PARAM_INVALID, "Can not get real path for %s.", keep_dtype.c_str()); + return PARAM_INVALID; + } + std::ifstream ifs(real_path); + if (!ifs.is_open()) { + GELOGE(FAILED, "Open file %s failed", keep_dtype.c_str()); + return FAILED; + } + + std::string op_name; + std::vector invalid_list; + while (std::getline(ifs, op_name)) { + if (op_name.empty()) { + continue; + } + op_name = StringUtils::Trim(op_name); + bool is_find = false; + for (auto &node_ptr : graph->GetDirectNode()) { + auto op_desc = node_ptr->GetOpDesc(); + GE_CHECK_NOTNULL(op_desc); + + if ((op_desc->GetName() == op_name) || IsOriginalOpFind(op_desc, op_name)) { + is_find = true; + (void)AttrUtils::SetInt(op_desc, ATTR_NAME_KEEP_DTYPE, 1); + } + } + if (!is_find) { + invalid_list.push_back(op_name); + } + } + + if (!invalid_list.empty()) { + KeepDtypeReportError(invalid_list); + return PARAM_INVALID; + } + + return SUCCESS; +} +} // namespace ge diff --git a/ge/offline/keep_dtype_option.h b/ge/offline/keep_dtype_option.h new file mode 100644 index 00000000..2df2ed8c --- /dev/null +++ b/ge/offline/keep_dtype_option.h @@ -0,0 +1,26 @@ +/** + * 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 KEEP_DTYPE_OPTION_H_ +#define KEEP_DTYPE_OPTION_H_ + +#include +#include "graph/compute_graph.h" +#include "framework/common/ge_inner_error_codes.h" + +namespace ge { +Status DealKeepDtypeOption(const ComputeGraphPtr &graph, const std::string &keep_dtype); +} // namespace +#endif // KEEP_DTYPE_OPTION_H_ \ No newline at end of file diff --git a/ge/offline/main.cc b/ge/offline/main.cc index 46d25d97..6e2e18a6 100755 --- a/ge/offline/main.cc +++ b/ge/offline/main.cc @@ -43,6 +43,7 @@ #include "parser/common/register_tbe.h" #include "register/op_registry.h" #include "single_op_parser.h" +#include "keep_dtype_option.h" using domi::BuildMode; using domi::OpRegistrationData; @@ -109,6 +110,9 @@ DEFINE_string(precision_mode, "force_fp16", "Optional; precision mode." "Support force_fp16, allow_mix_precision, allow_fp32_to_fp16, must_keep_origin_dtype."); +DEFINE_string(keep_dtype, "", + "Optional; config file to specify the precision used by the operator during compilation."); + DEFINE_string(input_format, "", "Optional; input_format, format of input data, NCHW;NHWC." "Format:\"NHWC\""); @@ -421,6 +425,9 @@ class GFlagUtils { FLAGS_enable_compress_weight, FLAGS_compress_weight_conf) == ge::SUCCESS, ret = ge::FAILED, "check compress weight failed!"); + GE_CHK_BOOL_EXEC(ge::CheckKeepTypeParamValid(FLAGS_keep_dtype) == ge::SUCCESS, + ret = ge::FAILED, "check keep dtype failed!"); + GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( !ge::CheckOutputPathValid(FLAGS_check_report, "--check_report"), ret = ge::FAILED, "check_report file %s not found!!", FLAGS_check_report.c_str()); @@ -979,6 +986,11 @@ domi::Status GenerateModel(std::map &options, std::string output } } + Status ret = ge::DealKeepDtypeOption(ge::GraphUtils::GetComputeGraph(graph), FLAGS_keep_dtype); + if (ret != SUCCESS) { + return ret; + } + geRet = ge_generator.GenerateOfflineModel(graph, output, inputs); if (geRet != ge::SUCCESS) { DOMI_LOGE("GE GenerateOfflineModel execute failed"); diff --git a/ge/offline/module.mk b/ge/offline/module.mk index 5c7a919c..8aabb975 100755 --- a/ge/offline/module.mk +++ b/ge/offline/module.mk @@ -10,6 +10,7 @@ LOCAL_CFLAGS += -DPROTOBUF_INLINE_NOT_IN_HEADERS=0 -DCOMPILE_OMG_PACKAGE -O2 -Dg LOCAL_SRC_FILES := \ main.cc \ + keep_dtype_option.cc \ single_op_parser.cc \ ../session/omg.cc \ ../ir_build/atc_ir_common.cc \ @@ -63,6 +64,7 @@ LOCAL_CFLAGS += -DPROTOBUF_INLINE_NOT_IN_HEADERS=0 -DCOMPILE_OMG_PACKAGE -O2 -Dg LOCAL_SRC_FILES := \ main.cc \ + keep_dtype_option.cc \ single_op_parser.cc \ ../session/omg.cc \ ../ir_build/atc_ir_common.cc \ @@ -116,6 +118,7 @@ LOCAL_CFLAGS += -DPROTOBUF_INLINE_NOT_IN_HEADERS=0 -DCOMPILE_OMG_PACKAGE -O2 -Dg LOCAL_SRC_FILES := \ main.cc \ + keep_dtype_option.cc \ single_op_parser.cc \ ../session/omg.cc \ ../ir_build/atc_ir_common.cc \ From eed5c0e0bcec63bcb3ccbe0708ee7e599f721996 Mon Sep 17 00:00:00 2001 From: zhangxiaokun Date: Wed, 23 Dec 2020 18:06:48 +0800 Subject: [PATCH 08/22] TaskInfo not hold OpDesc. --- .../load/new_model_manager/davinci_model.cc | 2 + .../load/new_model_manager/davinci_model.h | 75 +++++++++- .../task_info/kernel_ex_task_info.cc | 39 +++--- .../task_info/kernel_ex_task_info.h | 3 +- .../task_info/kernel_task_info.cc | 132 ++++++++++-------- .../task_info/kernel_task_info.h | 23 +-- .../task_info/memcpy_async_task_info.cc | 50 +++---- .../task_info/memcpy_async_task_info.h | 3 +- 8 files changed, 190 insertions(+), 137 deletions(-) diff --git a/ge/graph/load/new_model_manager/davinci_model.cc b/ge/graph/load/new_model_manager/davinci_model.cc index 6c873fc2..fd842a4b 100755 --- a/ge/graph/load/new_model_manager/davinci_model.cc +++ b/ge/graph/load/new_model_manager/davinci_model.cc @@ -139,6 +139,7 @@ DavinciModel::DavinciModel(int32_t priority, const std::shared_ptr kernel_list; + std::vector arg_list; + std::vector dump_flag_list; + std::vector op_desc_list; + std::vector dump_args_list; + uint32_t last_dump_flag; + int64_t last_group_key; + uintptr_t last_dump_args; + OpDescPtr last_op; +}; + struct TaskMemInfo { int64_t input_size{0}; int64_t output_size{0}; @@ -98,7 +117,7 @@ enum ExecuteMode { // comments class DavinciModel { - public: +public: /// /// @ingroup ge /// @brief DavinciModel constructor @@ -204,13 +223,14 @@ class DavinciModel { // get total mem size size_t TotalMemSize() const { return runtime_param_.mem_size; } - const std::map &P2PMemInfos() const {return runtime_param_.memory_infos;} + const std::map &P2PMemInfos() const { return runtime_param_.memory_infos; } // model name string Name() const { return name_; } // om_name string OmName() const { return om_name_; } + // version uint32_t Version() const { return version_; } @@ -255,12 +275,16 @@ class DavinciModel { } return nullptr; } + // get task info for profiling const std::vector &GetTaskDescInfo() const { return task_desc_info_; } // get updated task info list std::vector GetTaskList() { return task_list_; } + // Modified from KernelTaskInfo. + SuperKernelTaskInfo &GetSupperKernelTaskInfo() { return skt_info_; } + /// /// @ingroup ge /// @brief get model input and output format @@ -421,6 +445,7 @@ class DavinciModel { const RuntimeParam &GetRuntimeParam() { return runtime_param_; } int32_t GetDataInputTid() const { return dataInputTid; } + void SetDataInputTid(int32_t data_input_tid) { dataInputTid = data_input_tid; } void DisableZeroCopy(const void *addr); @@ -459,6 +484,7 @@ class DavinciModel { } void SetEndGraphId(uint32_t task_id, uint32_t stream_id); + DavinciModel &operator=(const DavinciModel &model) = delete; DavinciModel(const DavinciModel &model) = delete; @@ -466,34 +492,46 @@ class DavinciModel { const map> &GetHcclFolowStream() { return main_follow_stream_mapping_; } + void SaveHcclFollowStream(int64_t main_stream_id, rtStream_t stream); void InitRuntimeParams(); + Status InitVariableMem(); void UpdateMemBase(uint8_t *mem_base) { runtime_param_.mem_base = mem_base; mem_base_ = mem_base; } + void SetTotalArgsSize(uint32_t args_size) { total_args_size_ += args_size; } + uint32_t GetTotalArgsSize() { return total_args_size_; } + void *GetCurrentArgsAddr(uint32_t offset) { void *cur_args = static_cast(args_) + offset; return cur_args; } + void SetTotalIOAddrs(vector &io_addrs) { total_io_addrs_.insert(total_io_addrs_.end(), io_addrs.begin(), io_addrs.end()); } + void SetHybridArgsSize(uint32_t args_size) { total_hybrid_args_size_ += args_size; } + uint32_t GetHybridArgsSize() { return total_hybrid_args_size_; } + void *GetCurrentHybridArgsAddr(uint32_t offset) { void *cur_args = static_cast(hybrid_addrs_) + offset; return cur_args; } + void SetTotalFixedAddrsSize(string tensor_name, int64_t fix_addr_size); + int64_t GetFixedAddrsSize(string tensor_name); + void *GetCurrentFixedAddr(int64_t offset) const { void *cur_addr = static_cast(fixed_addrs_) + offset; return cur_addr; @@ -505,30 +543,42 @@ class DavinciModel { } return UINT32_MAX; } + void SetKnownNode(bool known_node) { known_node_ = known_node; } + bool IsKnownNode() { return known_node_; } + Status MallocKnownArgs(); + Status UpdateKnownNodeArgs(const vector &inputs, const vector &outputs); + Status CreateKnownZeroCopyMap(const vector &inputs, const vector &outputs); + Status UpdateKnownZeroCopyAddr(vector &total_io_addrs); + void SetKnownNodeAddrNotChanged(bool base_addr_not_changed) { base_addr_not_changed_ = base_addr_not_changed; } Status GetOrigInputInfo(uint32_t index, OriginInputInfo &orig_input_info); + Status GetAllAippInputOutputDims(uint32_t index, std::vector &input_dims, std::vector &output_dims); + void SetModelDescVersion(bool is_new_model_desc) { is_new_model_desc_ = is_new_model_desc; } + // om file name void SetOmName(string om_name) { om_name_ = om_name; } void SetDumpProperties(const DumpProperties &dump_properties) { data_dumper_.SetDumpProperties(dump_properties); } + const DumpProperties &GetDumpProperties() const { return data_dumper_.GetDumpProperties(); } bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const { return data_dumper_.GetOpDescInfo(stream_id, task_id, op_desc_info); } + Status InitInputOutputForDynamic(const ComputeGraphPtr &compute_graph); - private: +private: // memory address of weights uint8_t *weights_mem_base_; uint8_t *var_mem_base_; @@ -592,6 +642,7 @@ class DavinciModel { Status SyncVarData(); Status InitWeightMem(void *dev_ptr, void *weight_ptr, size_t weight_size); + Status InitFeatureMapAndP2PMem(void *dev_ptr, size_t mem_size); void CreateInputDimsInfo(const OpDescPtr &op_desc, Format format, InputOutputDescInfo &input); @@ -610,7 +661,7 @@ class DavinciModel { uint8_t *MallocWeightsMem(size_t weights_size); - uint8_t* MallocP2PMem(size_t p2p_data_size); + uint8_t *MallocP2PMem(size_t p2p_data_size); void FreeFeatureMapMem(); @@ -702,6 +753,7 @@ class DavinciModel { Status InitTbeHandle(const OpDescPtr &op_desc); void StoreTbeHandle(const std::string &handle_key); + void CleanTbeHandle(); /// @@ -740,6 +792,7 @@ class DavinciModel { /// @return: 0 for success / others for fail /// Status BindOutputQueue(); + Status CpuModelPrepareOutput(uintptr_t addr, uint32_t size); /// @@ -777,7 +830,9 @@ class DavinciModel { Status CpuWaitEndGraph(); Status BindEnqueue(); + Status CpuModelEnqueue(uint32_t queue_id, uintptr_t out_mbuf); + /// /// @ingroup ge /// @brief definiteness queue schedule, repeat run model. @@ -786,6 +841,7 @@ class DavinciModel { Status CpuModelRepeat(); Status InitEntryTask(); + Status AddHeadStream(); /// @@ -813,6 +869,7 @@ class DavinciModel { void SetDataDumperArgs(const ComputeGraphPtr &compute_graph); Status InitModelProfile(); + Status SinkModelProfile(); Status SinkTimeProfile(const InputData ¤t_data); @@ -821,14 +878,21 @@ class DavinciModel { std::vector &outputs); void ParseAIPPInfo(std::string in_out_info, InputOutputDims &dims_info); + void SetLabelForDynamic(const NodePtr &node); void ParseDynamicOutShape(const std::vector &str_info, std::vector> &vec_info); + bool IsGetNextSinkDynamic(const OpDescPtr &op_desc); + void GetAllGearsInfo(const NodePtr &node); + Status GetGetDynamicDimsNodeInfo(const NodePtr &node); + Status GetGearAndRealOutSizeInfo(size_t input_count, const NodePtr &node); + Status GetRealOutputSizeOfMerge(size_t input_index, const NodePtr &merge_node); + Status GetGearAndRealOutShapeInfo(size_t input_count, const OpDescPtr &op_desc); bool is_weight_mem_has_inited_; @@ -996,6 +1060,9 @@ class DavinciModel { std::multimap op_id_map_; std::vector profile_list_; + + // For super kernel. + SuperKernelTaskInfo skt_info_; }; } // namespace ge #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_DAVINCI_MODEL_H_ diff --git a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc index e5574e47..f1354d8e 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc @@ -30,11 +30,7 @@ namespace ge { Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { GELOGI("KernelExTaskInfo Init Start."); - if (davinci_model == nullptr) { - GELOGE(PARAM_INVALID, "davinci_model is null!"); - return PARAM_INVALID; - } - + GE_CHECK_NOTNULL(davinci_model); davinci_model_ = davinci_model; Status ret = SetStream(task_def.stream_id(), davinci_model_->GetStreamList()); if (ret != SUCCESS) { @@ -51,7 +47,6 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin GELOGE(INTERNAL_ERROR, "Init aicpu task info error, index is out of range!"); return INTERNAL_ERROR; } - op_desc_ = op_desc; // 2. Reconstruct kernelExDef.args to STR_FWK_OP_KERNEL STR_FWK_OP_KERNEL fwk_op_kernel = {0}; @@ -79,8 +74,8 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin return RT_ERROR_TO_GE_STATUS(rt_ret);) } - GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, ext_info_addr_=%p", op_desc_->GetName().c_str(), - op_desc_->GetType().c_str(), ext_info.size(), ext_info_addr_); + GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, ext_info_addr_=%p", op_desc->GetName().c_str(), + op_desc->GetType().c_str(), ext_info.size(), ext_info_addr_); // 2.1 get loop cond variable for tensor array write uint64_t step_id_addr = 0; @@ -236,36 +231,38 @@ Status KernelExTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciMod return SUCCESS; } -Status KernelExTaskInfo::UpdateArgs() { - GELOGI("KernelExTaskInfo::UpdateArgs in."); +Status KernelExTaskInfo::SetIoAddr(const OpDescPtr &op_desc) { const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc_); - vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc_); - vector io_addrs; - if (!op_desc_->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { - io_addrs.insert(io_addrs.end(), input_data_addrs.begin(), input_data_addrs.end()); - io_addrs.insert(io_addrs.end(), output_data_addrs.begin(), output_data_addrs.end()); + vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc); + vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc); + if (!op_desc->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { + io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); + io_addrs_.insert(io_addrs_.end(), output_data_addrs.begin(), output_data_addrs.end()); } else { string peer_input_name; - if (AttrUtils::GetStr(op_desc_, ATTR_DYNAMIC_SHAPE_FIXED_ADDR, peer_input_name)) { + if (AttrUtils::GetStr(op_desc, ATTR_DYNAMIC_SHAPE_FIXED_ADDR, peer_input_name)) { uint32_t output_index = davinci_model_->GetFixedAddrOutputIndex(peer_input_name); if (output_index > output_data_addrs.size()) { GELOGE(FAILED, "The output data addr size[%zu] and output index[%u] are inconsistent.", output_data_addrs.size(), output_index); return FAILED; } - io_addrs.insert(io_addrs.end(), input_data_addrs.begin(), input_data_addrs.end()); + io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); for (size_t i = 0; i < output_data_addrs.size(); ++i) { if (i == output_index) { void *fixed_addr = davinci_model_->GetCurrentFixedAddr(fixed_addr_offset_); - io_addrs.emplace_back(fixed_addr); + io_addrs_.emplace_back(fixed_addr); continue; } - io_addrs.emplace_back(output_data_addrs[i]); + io_addrs_.emplace_back(output_data_addrs[i]); } } } - davinci_model_->SetTotalIOAddrs(io_addrs); + return SUCCESS; +} +Status KernelExTaskInfo::UpdateArgs() { + GELOGI("KernelExTaskInfo::UpdateArgs in."); + davinci_model_->SetTotalIOAddrs(io_addrs_); GELOGI("KernelExTaskInfo::UpdateArgs success."); return SUCCESS; } diff --git a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h index e4d3e6fd..86a27abf 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h @@ -59,6 +59,7 @@ class KernelExTaskInfo : public TaskInfo { }; private: Status CopyTaskInfo(const domi::KernelExDef &kernel_def, const RuntimeParam &rts_param, const OpDescPtr &op_desc); + Status SetIoAddr(const OpDescPtr &op_desc); uint32_t task_id_; uint32_t stream_id_; @@ -69,7 +70,7 @@ class KernelExTaskInfo : public TaskInfo { void *input_output_addr_; void *ext_info_addr_; void *dump_args_; - OpDescPtr op_desc_ = nullptr; + vector io_addrs_; uint32_t args_offset_ = 0; int64_t fixed_addr_offset_ = 0; }; diff --git a/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc b/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc index ce31ef30..620ddbbb 100755 --- a/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc @@ -53,9 +53,6 @@ const int kArgsAttrHandle = 4; } // namespace namespace ge { -KernelTaskInfo::SuperKernelTaskInfo KernelTaskInfo::skt_info_ = { - 0, 0, 0, 0, nullptr, nullptr, {}, {}, {}, {}, {}, RT_KERNEL_DEFAULT, kInvalidGroupKey, 0, nullptr}; - Status KernelTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { GE_CHECK_NOTNULL(davinci_model); davinci_model_ = davinci_model; @@ -137,6 +134,7 @@ Status KernelTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci ret = InitCceTask(kernel_def); } + SetIoAddrs(op_desc_); GELOGD("KernelTaskInfo init finish, result=%u.", ret); return ret; } @@ -148,9 +146,10 @@ Status KernelTaskInfo::SaveSKTDumpInfo() { return SUCCESS; } // all op in super kernel share one taskid and streamid - for (size_t i = 0; i < skt_info_.op_desc_list.size(); i++) { - davinci_model_->SaveDumpTask(skt_info_.last_task_id, skt_info_.last_stream_id, skt_info_.op_desc_list[i], - skt_info_.dump_args_list[i]); + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + for (size_t i = 0; i < skt_info.op_desc_list.size(); i++) { + davinci_model_->SaveDumpTask(skt_info.last_task_id, skt_info.last_stream_id, skt_info.op_desc_list[i], + skt_info.dump_args_list[i]); } return SUCCESS; } @@ -164,9 +163,10 @@ void KernelTaskInfo::UpdateSKTTaskId() { GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); return; } - skt_info_.last_task_id = task_id; - skt_info_.last_stream_id = stream_id; - skt_id_ = skt_info_.last_task_id; + SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + skt_info.last_task_id = task_id; + skt_info.last_stream_id = stream_id; + skt_id_ = skt_info.last_task_id; GELOGI("UpdateTaskId:UpdateSKTTaskId [%u],stream id [%u]", task_id, stream_id); } @@ -191,23 +191,25 @@ Status KernelTaskInfo::SKTFinalize() { UpdateSKTTaskId(); GE_CHK_STATUS_RET(SaveSKTDumpInfo(), "skt save dump info failed"); GELOGI("SuperKernel Distribute [skt_id:%u]", skt_id_); - skt_info_.kernel_list.clear(); - skt_info_.arg_list.clear(); - skt_info_.dump_flag_list.clear(); - skt_info_.op_desc_list.clear(); - skt_info_.dump_args_list.clear(); - skt_info_.last_stream = nullptr; - skt_info_.last_block_dim = 0; - skt_info_.last_sm_desc = sm_desc_; - skt_info_.last_group_key = kInvalidGroupKey; - skt_info_.last_dump_flag = RT_KERNEL_DEFAULT; - skt_info_.last_dump_args = 0; - skt_info_.last_op = nullptr; + SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + skt_info.kernel_list.clear(); + skt_info.arg_list.clear(); + skt_info.dump_flag_list.clear(); + skt_info.op_desc_list.clear(); + skt_info.dump_args_list.clear(); + skt_info.last_stream = nullptr; + skt_info.last_block_dim = 0; + skt_info.last_sm_desc = sm_desc_; + skt_info.last_group_key = kInvalidGroupKey; + skt_info.last_dump_flag = RT_KERNEL_DEFAULT; + skt_info.last_dump_args = 0; + skt_info.last_op = nullptr; return SUCCESS; } uint32_t KernelTaskInfo::GetDumpFlag() { - for (auto flag : skt_info_.dump_flag_list) { + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + for (auto flag : skt_info.dump_flag_list) { if (flag == RT_KERNEL_DUMPFLAG) { return RT_KERNEL_DUMPFLAG; } @@ -216,19 +218,20 @@ uint32_t KernelTaskInfo::GetDumpFlag() { } Status KernelTaskInfo::SuperKernelLaunch() { - if (skt_info_.kernel_list.empty()) { + SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + if (skt_info.kernel_list.empty()) { GELOGI("SuperKernelLaunch: Skt_kernel_list has no task, just return"); return SUCCESS; } rtError_t rt_ret; - auto &skt_kernel_list = skt_info_.kernel_list; - auto &skt_arg_list = skt_info_.arg_list; + auto &skt_kernel_list = skt_info.kernel_list; + auto &skt_arg_list = skt_info.arg_list; GELOGI("SuperKernelLaunch: Skt_kernel_list size[%zu] skt_arg_list[%zu]", skt_kernel_list.size(), skt_arg_list.size()); if (skt_kernel_list.size() == kSKTSingleSize && skt_arg_list.size() == kSKTSingleSize) { - rt_ret = rtKernelLaunchWithFlag(skt_info_.kernel_list[0], static_cast(skt_info_.last_block_dim), - skt_info_.arg_list[0], skt_info_.last_args_size, - static_cast(skt_info_.last_sm_desc), skt_info_.last_stream, - skt_info_.last_dump_flag); + rt_ret = rtKernelLaunchWithFlag(skt_info.kernel_list[0], static_cast(skt_info.last_block_dim), + skt_info.arg_list[0], skt_info.last_args_size, + static_cast(skt_info.last_sm_desc), skt_info.last_stream, + skt_info.last_dump_flag); if (rt_ret != RT_ERROR_NONE) { GELOGE(RT_FAILED, "SuperKernelLaunch: Call rt api failed, ret: 0x%X", rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret); @@ -247,14 +250,14 @@ Status KernelTaskInfo::SuperKernelLaunch() { } // Call the fuse API std::unique_ptr superKernel = nullptr; - ge_ret = factory->FuseKernels(skt_kernel_list, skt_arg_list, skt_info_.last_block_dim, superKernel); + ge_ret = factory->FuseKernels(skt_kernel_list, skt_arg_list, skt_info.last_block_dim, superKernel); if (ge_ret != SUCCESS) { GELOGE(ge_ret, "SuperKernelLaunch: fuse call failed"); return ge_ret; } // Launch a super kernel skt_dump_flag_ = GetDumpFlag(); - ge_ret = superKernel->Launch(skt_info_.last_stream, skt_dump_flag_); + ge_ret = superKernel->Launch(skt_info.last_stream, skt_dump_flag_); if (ge_ret != SUCCESS) { GELOGE(ge_ret, "SuperKernelLaunch: launch failed"); return ge_ret; @@ -269,23 +272,26 @@ Status KernelTaskInfo::SuperKernelLaunch() { } Status KernelTaskInfo::SaveSuperKernelInfo() { - skt_info_.kernel_list.push_back(stub_func_); - skt_info_.arg_list.push_back(args_); - skt_info_.last_stream = stream_; - skt_info_.last_block_dim = block_dim_; - skt_info_.last_args_size = args_size_; - skt_info_.last_sm_desc = sm_desc_; - skt_info_.last_dump_flag = dump_flag_; - skt_info_.dump_flag_list.push_back(dump_flag_); - skt_info_.op_desc_list.push_back(op_desc_); - skt_info_.dump_args_list.push_back(reinterpret_cast(skt_dump_args_)); - skt_info_.last_group_key = group_key_; - skt_info_.last_dump_args = reinterpret_cast(skt_dump_args_); - skt_info_.last_op = op_desc_; + SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + skt_info.kernel_list.push_back(stub_func_); + skt_info.arg_list.push_back(args_); + skt_info.last_stream = stream_; + skt_info.last_block_dim = block_dim_; + skt_info.last_args_size = args_size_; + skt_info.last_sm_desc = sm_desc_; + skt_info.last_dump_flag = dump_flag_; + skt_info.dump_flag_list.push_back(dump_flag_); + skt_info.op_desc_list.push_back(op_desc_); + skt_info.dump_args_list.push_back(reinterpret_cast(skt_dump_args_)); + skt_info.last_group_key = group_key_; + skt_info.last_dump_args = reinterpret_cast(skt_dump_args_); + skt_info.last_op = op_desc_; // last node in a stream, just launch if (IsMarkedLastNode()) { return SuperKernelLaunch(); } + + GELOGI("Save Current task [block_dim:%u, size:%zu].", block_dim_, skt_info.kernel_list.size()); return SUCCESS; } @@ -322,8 +328,9 @@ bool KernelTaskInfo::IsMarkedFirstNode() { // then may be saved to skt task list; else // call skt launch those saved tasks before bool KernelTaskInfo::FirstCallSKTLaunchCheck() { - return ((block_dim_ != skt_info_.last_block_dim) || (stream_ != skt_info_.last_stream) || - (has_group_key_ && (group_key_ != skt_info_.last_group_key))); + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + return ((block_dim_ != skt_info.last_block_dim) || (stream_ != skt_info.last_stream) || + (has_group_key_ && (group_key_ != skt_info.last_group_key))); } // current task has group_id or has n ATTR_N_BATCH_SPLIT then save it to skt task list; else @@ -362,7 +369,6 @@ Status KernelTaskInfo::SuperKernelDistribute() { GELOGE(ret, "Call SuperKernelLaunch failed!"); return ret; } - GELOGI("Save Current task [block_dim:%u, size:%zu].", block_dim_, skt_info_.kernel_list.size()); } return SUCCESS; } @@ -391,10 +397,11 @@ Status KernelTaskInfo::Distribute() { call_save_dump_ = true; } else { /* default: not skt launch */ + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); GELOGD( "KernelTaskInfo Distribute Start, sktenable:%d taskid:%u sktid:%u last_sktid:%u stubfunc_name:%s " "stubfunc:%p blockdim:%u stream:%p", - call_skt, task_id_, skt_id_, skt_info_.last_task_id, stub_func_name_.c_str(), stub_func_, block_dim_, stream_); + call_skt, task_id_, skt_id_, skt_info.last_task_id, stub_func_name_.c_str(), stub_func_, block_dim_, stream_); // l1 fusion enable and env flag open (kCloseSkt for skt debug) bool open_dump = false; auto all_dump_model = davinci_model_->GetDumpProperties().GetAllDumpModel(); @@ -422,23 +429,30 @@ Status KernelTaskInfo::Distribute() { "KernelTaskInfo Distribute Success. sktenable:%d taskid:%d sktid:%d stubfunc_name:%s stubfunc:%p " "blockdim:%d stream:%p", call_skt, task_id_, skt_id_, stub_func_name_.c_str(), stub_func_, block_dim_, stream_); + op_desc_.reset(); // Not hold OpDesc after distribute. return SUCCESS; } +void KernelTaskInfo::SetIoAddrs(const OpDescPtr &op_desc) { + const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); + vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc); + vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc); + + io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); + io_addrs_.insert(io_addrs_.end(), output_data_addrs.begin(), output_data_addrs.end()); + if (kernel_type_ == ccKernelType::TE) { + vector workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc); + io_addrs_.insert(io_addrs_.end(), workspace_data_addrs.begin(), workspace_data_addrs.end()); + } +} + Status KernelTaskInfo::UpdateArgs() { GELOGI("KernelTaskInfo::UpdateArgs in."); - const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc_); - vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc_); - vector io_addrs; - io_addrs.insert(io_addrs.end(), input_data_addrs.begin(), input_data_addrs.end()); - io_addrs.insert(io_addrs.end(), output_data_addrs.begin(), output_data_addrs.end()); if (kernel_type_ == ccKernelType::TE) { - vector workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc_); - io_addrs.insert(io_addrs.end(), workspace_data_addrs.begin(), workspace_data_addrs.end()); - davinci_model_->SetTotalIOAddrs(io_addrs); + davinci_model_->SetTotalIOAddrs(io_addrs_); } else if (kernel_type_ == ccKernelType::AI_CPU || kernel_type_ == ccKernelType::CUST_AI_CPU) { + vector io_addrs = io_addrs_; davinci_model_->UpdateKnownZeroCopyAddr(io_addrs); uintptr_t io_addr = reinterpret_cast(args_addr.get()) + sizeof(aicpu::AicpuParamHead); auto addrs_size = sizeof(uint64_t) * io_addrs.size(); @@ -854,14 +868,14 @@ Status KernelTaskInfo::InitAicpuTask(uint32_t op_index, const domi::KernelDef &k GELOGI("Do InitAicpuTask"); so_name_ = kernel_def.so_name(); kernel_name_ = kernel_def.kernel_name(); - GELOGI("node[%s] test so name %s, kernel name %s", op_desc_->GetName().c_str(), so_name_.c_str(), - kernel_name_.c_str()); OpDescPtr op_desc = davinci_model_->GetOpByIndex(op_index); if (op_desc == nullptr) { GELOGE(INTERNAL_ERROR, "index is out of range, index: %u", op_index); return INTERNAL_ERROR; } + GELOGI("node[%s] test so name %s, kernel name %s", op_desc->GetName().c_str(), so_name_.c_str(), + kernel_name_.c_str()); if (kernel_type_ == ccKernelType::CUST_AI_CPU) { bool loaded = false; diff --git a/ge/graph/load/new_model_manager/task_info/kernel_task_info.h b/ge/graph/load/new_model_manager/task_info/kernel_task_info.h index 7717edd3..f45cf1f3 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/kernel_task_info.h @@ -128,6 +128,7 @@ class KernelTaskInfo : public TaskInfo { Status SuperKernelDistribute(); bool IsL1FusionOp(const OpDescPtr &op_desc); + void SetIoAddrs(const OpDescPtr &op_desc); // For super kernel Status SaveSKTDumpInfo(); @@ -156,7 +157,8 @@ class KernelTaskInfo : public TaskInfo { ccKernelType kernel_type_; uint32_t dump_flag_; void *dump_args_; - OpDescPtr op_desc_; + OpDescPtr op_desc_; // Clear after distribute. + vector io_addrs_; DavinciModel *davinci_model_; uint32_t args_offset_ = 0; uint32_t hybrid_args_offset_ = 0; @@ -186,25 +188,6 @@ class KernelTaskInfo : public TaskInfo { void *output_addrs = nullptr; void *attr_handle = nullptr; } custom_info_; - - // For super kernel - static struct SuperKernelTaskInfo { - uint32_t last_block_dim; - uint32_t last_args_size; - uint32_t last_task_id; - uint32_t last_stream_id; - void *last_stream; - void *last_sm_desc; - std::vector kernel_list; - std::vector arg_list; - std::vector dump_flag_list; - std::vector op_desc_list; - std::vector dump_args_list; - uint32_t last_dump_flag; - int64_t last_group_key; - uintptr_t last_dump_args; - OpDescPtr last_op; - } skt_info_; }; } // namespace ge #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_KERNEL_TASK_INFO_H_ diff --git a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc index aa37dd07..8d0e9ec6 100755 --- a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc @@ -30,14 +30,14 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da return ret; } - memcpy_async_ = task_def.memcpy_async(); - count_ = memcpy_async_.count(); - kind_ = memcpy_async_.kind(); - dst_max_ = memcpy_async_.dst_max(); - OpDescPtr op_desc = davinci_model_->GetOpByIndex(memcpy_async_.op_index()); + const domi::MemcpyAsyncDef &memcpy_async = task_def.memcpy_async(); + count_ = memcpy_async.count(); + kind_ = memcpy_async.kind(); + dst_max_ = memcpy_async.dst_max(); + OpDescPtr op_desc = davinci_model_->GetOpByIndex(memcpy_async.op_index()); op_desc_ = op_desc; if (op_desc == nullptr) { - GELOGE(INTERNAL_ERROR, "Task op index:%u out of range", memcpy_async_.op_index()); + GELOGE(INTERNAL_ERROR, "Task op index:%u out of range", memcpy_async.op_index()); return INTERNAL_ERROR; } @@ -52,7 +52,7 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da } const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - ret = ModelUtils::GetRtAddress(rts_param, memcpy_async_.src(), src_); + ret = ModelUtils::GetRtAddress(rts_param, memcpy_async.src(), src_); if (ret != SUCCESS) { return ret; } @@ -61,23 +61,31 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da vector memory_type_list; (void)AttrUtils::GetListInt(op_desc, ATTR_NAME_OUTPUT_MEM_TYPE_LIST, memory_type_list); if (!memory_type_list.empty() && memory_type_list[0] == RT_MEMORY_TS_4G) { // TS Feature, Just one. - uint64_t mem_offset = memcpy_async_.dst() - rts_param.logic_mem_base; - dst_ = static_cast(rts_param.ts_mem_mall->Acquire(mem_offset, memcpy_async_.dst_max())); + uint64_t mem_offset = memcpy_async.dst() - rts_param.logic_mem_base; + dst_ = static_cast(rts_param.ts_mem_mall->Acquire(mem_offset, memcpy_async.dst_max())); if (dst_ == nullptr) { return FAILED; } } else { - ret = ModelUtils::GetRtAddress(rts_param, memcpy_async_.dst(), dst_); + ret = ModelUtils::GetRtAddress(rts_param, memcpy_async.dst(), dst_); if (ret != SUCCESS) { return ret; } } GELOGI("MemcpyAsyncTaskInfo Init Success, logic[0x%lx, 0x%lx], src:%p, dst:%p, max:%lu, count:%lu", - memcpy_async_.src(), memcpy_async_.dst(), src_, dst_, dst_max_, count_); + memcpy_async.src(), memcpy_async.dst(), src_, dst_, dst_max_, count_); davinci_model_->DisableZeroCopy(src_); davinci_model_->DisableZeroCopy(dst_); + + io_addrs_.emplace_back(reinterpret_cast(src_)); + if (op_desc->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { + void *fixed_addr = davinci_model_->GetCurrentFixedAddr(fixed_addr_offset_); + io_addrs_.emplace_back(fixed_addr); + } else { + io_addrs_.emplace_back(reinterpret_cast(dst_)); + } return SUCCESS; } @@ -118,25 +126,7 @@ Status MemcpyAsyncTaskInfo::CalculateArgs(const domi::TaskDef &task_def, Davinci Status MemcpyAsyncTaskInfo::UpdateArgs() { GELOGI("MemcpyAsyncTaskInfo::UpdateArgs in."); GE_CHECK_NOTNULL(davinci_model_); - Status ret = ModelUtils::GetRtAddress(davinci_model_->GetRuntimeParam(), memcpy_async_.src(), src_); - if (ret != SUCCESS) { - return ret; - } - - ret = ModelUtils::GetRtAddress(davinci_model_->GetRuntimeParam(), memcpy_async_.dst(), dst_); - if (ret != SUCCESS) { - return ret; - } - - vector io_addrs; - io_addrs.emplace_back(reinterpret_cast(src_)); - if (op_desc_->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { - void *fixed_addr = davinci_model_->GetCurrentFixedAddr(fixed_addr_offset_); - io_addrs.emplace_back(fixed_addr); - } else { - io_addrs.emplace_back(reinterpret_cast(dst_)); - } - davinci_model_->SetTotalIOAddrs(io_addrs); + davinci_model_->SetTotalIOAddrs(io_addrs_); GELOGI("MemcpyAsyncTaskInfo::UpdateArgs success."); return SUCCESS; diff --git a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h index 7e74ab6f..d7506840 100755 --- a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h @@ -44,11 +44,10 @@ class MemcpyAsyncTaskInfo : public TaskInfo { uint8_t *src_; uint64_t count_; uint32_t kind_; - OpDescPtr op_desc_; + vector io_addrs_; int64_t fixed_addr_offset_; DavinciModel *davinci_model_ = nullptr; uint32_t args_offset_ = 0; - domi::MemcpyAsyncDef memcpy_async_; }; } // namespace ge #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_MEMCPY_ASYNC_TASK_INFO_H_ From 1158bf03c81c27780de303450a71951137cffc46 Mon Sep 17 00:00:00 2001 From: zhangxiaokun Date: Wed, 23 Dec 2020 18:42:07 +0800 Subject: [PATCH 09/22] TaskInfo release OpDesc after distribute --- .../load/new_model_manager/davinci_model.h | 47 ++-------------- .../task_info/hccl_task_info.cc | 56 +++++++++---------- .../task_info/hccl_task_info.h | 4 +- .../task_info/kernel_ex_task_info.cc | 6 +- .../task_info/kernel_task_info.cc | 21 ++++--- .../task_info/kernel_task_info.h | 3 - .../task_info/memcpy_async_task_info.cc | 1 - 7 files changed, 46 insertions(+), 92 deletions(-) diff --git a/ge/graph/load/new_model_manager/davinci_model.h b/ge/graph/load/new_model_manager/davinci_model.h index c9e3aa10..9c494a78 100755 --- a/ge/graph/load/new_model_manager/davinci_model.h +++ b/ge/graph/load/new_model_manager/davinci_model.h @@ -77,7 +77,7 @@ struct timeInfo { }; // For super kernel -static struct SuperKernelTaskInfo { +struct SuperKernelTaskInfo { uint32_t last_block_dim; uint32_t last_args_size; uint32_t last_task_id; @@ -117,7 +117,7 @@ enum ExecuteMode { // comments class DavinciModel { -public: + public: /// /// @ingroup ge /// @brief DavinciModel constructor @@ -283,7 +283,7 @@ public: std::vector GetTaskList() { return task_list_; } // Modified from KernelTaskInfo. - SuperKernelTaskInfo &GetSupperKernelTaskInfo() { return skt_info_; } + SuperKernelTaskInfo &GetSuperKernelTaskInfo() { return skt_info_; } /// /// @ingroup ge @@ -445,7 +445,6 @@ public: const RuntimeParam &GetRuntimeParam() { return runtime_param_; } int32_t GetDataInputTid() const { return dataInputTid; } - void SetDataInputTid(int32_t data_input_tid) { dataInputTid = data_input_tid; } void DisableZeroCopy(const void *addr); @@ -484,7 +483,6 @@ public: } void SetEndGraphId(uint32_t task_id, uint32_t stream_id); - DavinciModel &operator=(const DavinciModel &model) = delete; DavinciModel(const DavinciModel &model) = delete; @@ -492,46 +490,34 @@ public: const map> &GetHcclFolowStream() { return main_follow_stream_mapping_; } - void SaveHcclFollowStream(int64_t main_stream_id, rtStream_t stream); void InitRuntimeParams(); - Status InitVariableMem(); void UpdateMemBase(uint8_t *mem_base) { runtime_param_.mem_base = mem_base; mem_base_ = mem_base; } - void SetTotalArgsSize(uint32_t args_size) { total_args_size_ += args_size; } - uint32_t GetTotalArgsSize() { return total_args_size_; } - void *GetCurrentArgsAddr(uint32_t offset) { void *cur_args = static_cast(args_) + offset; return cur_args; } - void SetTotalIOAddrs(vector &io_addrs) { total_io_addrs_.insert(total_io_addrs_.end(), io_addrs.begin(), io_addrs.end()); } - void SetHybridArgsSize(uint32_t args_size) { total_hybrid_args_size_ += args_size; } - uint32_t GetHybridArgsSize() { return total_hybrid_args_size_; } - void *GetCurrentHybridArgsAddr(uint32_t offset) { void *cur_args = static_cast(hybrid_addrs_) + offset; return cur_args; } - void SetTotalFixedAddrsSize(string tensor_name, int64_t fix_addr_size); - int64_t GetFixedAddrsSize(string tensor_name); - void *GetCurrentFixedAddr(int64_t offset) const { void *cur_addr = static_cast(fixed_addrs_) + offset; return cur_addr; @@ -543,42 +529,30 @@ public: } return UINT32_MAX; } - void SetKnownNode(bool known_node) { known_node_ = known_node; } - bool IsKnownNode() { return known_node_; } - Status MallocKnownArgs(); - Status UpdateKnownNodeArgs(const vector &inputs, const vector &outputs); - Status CreateKnownZeroCopyMap(const vector &inputs, const vector &outputs); - Status UpdateKnownZeroCopyAddr(vector &total_io_addrs); - void SetKnownNodeAddrNotChanged(bool base_addr_not_changed) { base_addr_not_changed_ = base_addr_not_changed; } Status GetOrigInputInfo(uint32_t index, OriginInputInfo &orig_input_info); - Status GetAllAippInputOutputDims(uint32_t index, std::vector &input_dims, std::vector &output_dims); - void SetModelDescVersion(bool is_new_model_desc) { is_new_model_desc_ = is_new_model_desc; } - // om file name void SetOmName(string om_name) { om_name_ = om_name; } void SetDumpProperties(const DumpProperties &dump_properties) { data_dumper_.SetDumpProperties(dump_properties); } - const DumpProperties &GetDumpProperties() const { return data_dumper_.GetDumpProperties(); } bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const { return data_dumper_.GetOpDescInfo(stream_id, task_id, op_desc_info); } - Status InitInputOutputForDynamic(const ComputeGraphPtr &compute_graph); -private: + private: // memory address of weights uint8_t *weights_mem_base_; uint8_t *var_mem_base_; @@ -753,7 +727,6 @@ private: Status InitTbeHandle(const OpDescPtr &op_desc); void StoreTbeHandle(const std::string &handle_key); - void CleanTbeHandle(); /// @@ -792,7 +765,6 @@ private: /// @return: 0 for success / others for fail /// Status BindOutputQueue(); - Status CpuModelPrepareOutput(uintptr_t addr, uint32_t size); /// @@ -830,9 +802,7 @@ private: Status CpuWaitEndGraph(); Status BindEnqueue(); - Status CpuModelEnqueue(uint32_t queue_id, uintptr_t out_mbuf); - /// /// @ingroup ge /// @brief definiteness queue schedule, repeat run model. @@ -841,7 +811,6 @@ private: Status CpuModelRepeat(); Status InitEntryTask(); - Status AddHeadStream(); /// @@ -869,7 +838,6 @@ private: void SetDataDumperArgs(const ComputeGraphPtr &compute_graph); Status InitModelProfile(); - Status SinkModelProfile(); Status SinkTimeProfile(const InputData ¤t_data); @@ -878,21 +846,14 @@ private: std::vector &outputs); void ParseAIPPInfo(std::string in_out_info, InputOutputDims &dims_info); - void SetLabelForDynamic(const NodePtr &node); void ParseDynamicOutShape(const std::vector &str_info, std::vector> &vec_info); - bool IsGetNextSinkDynamic(const OpDescPtr &op_desc); - void GetAllGearsInfo(const NodePtr &node); - Status GetGetDynamicDimsNodeInfo(const NodePtr &node); - Status GetGearAndRealOutSizeInfo(size_t input_count, const NodePtr &node); - Status GetRealOutputSizeOfMerge(size_t input_index, const NodePtr &merge_node); - Status GetGearAndRealOutShapeInfo(size_t input_count, const OpDescPtr &op_desc); bool is_weight_mem_has_inited_; diff --git a/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc b/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc index 4fb64aab..0d2a1288 100644 --- a/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc @@ -59,40 +59,40 @@ Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_m GELOGI("HcclTaskInfo Init, op_index is: %u", op_index); // Get HCCL op - op_desc_ = davinci_model->GetOpByIndex(op_index); - GE_CHECK_NOTNULL(op_desc_); + const auto op_desc = davinci_model->GetOpByIndex(op_index); + GE_CHECK_NOTNULL(op_desc); // Create the kernel hccl infos - CreateKernelHcclInfo(op_desc_); + CreateKernelHcclInfo(op_desc); // Initialize the hccl_type of all kernel hccl info HcomOmeUtil::GetHcclType(task_def, kernel_hccl_infos_); // Only in Horovod scenario should get the inputName and GeShape - ret = HcomOmeUtil::GetHorovodInputs(op_desc_, kernel_hccl_infos_); + ret = HcomOmeUtil::GetHorovodInputs(op_desc, kernel_hccl_infos_); if (ret != SUCCESS) { GELOGE(ret, "davinci_model: GetHorovodInputs fail! domi error: %u", ret); return ret; } - Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc_, kernel_hccl_infos_); + Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc, kernel_hccl_infos_); if (dmrt != SUCCESS) { GELOGE(dmrt, "davinci_model: GetHcomDataType fail! domi error: %u", dmrt); return dmrt; } - dmrt = HcomOmeUtil::GetHcclCount(op_desc_, kernel_hccl_infos_); + dmrt = HcomOmeUtil::GetHcclCount(op_desc, kernel_hccl_infos_); if (dmrt != SUCCESS) { GELOGE(dmrt, "davinci_model: GetHcomCount fail! domi error: %u", dmrt); return dmrt; } // Only HCOMBROADCAST and HVDCALLBACKBROADCAST need to get the rootId - dmrt = HcomOmeUtil::GetAllRootId(op_desc_, kernel_hccl_infos_); + dmrt = HcomOmeUtil::GetAllRootId(op_desc, kernel_hccl_infos_); if (dmrt != SUCCESS) { GELOGE(dmrt, "davinci_model: Get rootId fail! domi error: %u", dmrt); return dmrt; } // GE's new process: hccl declares the number of streams required, creates a stream by GE, and sends it to hccl - ret = SetFollowStream(op_desc_, davinci_model); + ret = SetFollowStream(op_desc, davinci_model); if (ret != SUCCESS) { GELOGE(ret, "SetStream Fail."); return ret; @@ -100,21 +100,28 @@ Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_m if (davinci_model_->IsKnownNode()) { args_ = davinci_model_->GetCurrentArgsAddr(args_offset_); - GELOGI("Known node %s args addr %p, offset %u.", op_desc_->GetName().c_str(), args_, args_offset_); + GELOGI("Known node %s args addr %p, offset %u.", op_desc->GetName().c_str(), args_, args_offset_); } - ret = SetAddrs(op_desc_, kernel_hccl_infos_); + ret = SetAddrs(op_desc, kernel_hccl_infos_); if (ret != SUCCESS) { GELOGE(ret, "Setaddrs Fail."); return ret; } // GE's new process: hccl declares the need for Workspace size, and GE allocates Workspace - ret = SetWorkspace(op_desc_, kernel_hccl_infos_); + ret = SetWorkspace(op_desc, kernel_hccl_infos_); if (ret != SUCCESS) { GELOGE(ret, "SetWorkspace Fail."); return ret; } + const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); + const auto input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc); + const auto output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc); + const auto workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc); + io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); + io_addrs_.insert(io_addrs_.end(), output_data_addrs.begin(), output_data_addrs.end()); + io_addrs_.insert(io_addrs_.end(), workspace_data_addrs.begin(), workspace_data_addrs.end()); GELOGI("HcclTaskInfo Init Success"); return SUCCESS; } @@ -231,18 +238,7 @@ Status HcclTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciModel * Status HcclTaskInfo::UpdateArgs() { GELOGI("HcclTaskInfo::UpdateArgs in."); - const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - input_data_addrs_ = ModelUtils::GetInputDataAddrs(rts_param, op_desc_); - output_data_addrs_ = ModelUtils::GetOutputDataAddrs(rts_param, op_desc_); - workspace_data_addrs_ = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc_); - - vector io_addrs; - io_addrs.insert(io_addrs.end(), input_data_addrs_.begin(), input_data_addrs_.end()); - io_addrs.insert(io_addrs.end(), output_data_addrs_.begin(), output_data_addrs_.end()); - io_addrs.insert(io_addrs.end(), workspace_data_addrs_.begin(), workspace_data_addrs_.end()); - - davinci_model_->SetTotalIOAddrs(io_addrs); - + davinci_model_->SetTotalIOAddrs(io_addrs_); GELOGI("HcclTaskInfo::UpdateArgs success."); return SUCCESS; } @@ -261,9 +257,11 @@ Status HcclTaskInfo::SetAddrs(const std::shared_ptr &op_desc, HcclReduceOp op_type = HCCL_REDUCE_SUM; GE_CHECK_NOTNULL(davinci_model_); GELOGI("Calc opType[%s] input address before. Node name[%s]", op_desc->GetType().c_str(), op_desc->GetName().c_str()); + vector input_data_addrs; + vector output_data_addrs; if (!davinci_model_->IsKnownNode()) { - input_data_addrs_ = ModelUtils::GetInputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); - output_data_addrs_ = ModelUtils::GetOutputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); + input_data_addrs = ModelUtils::GetInputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); + output_data_addrs = ModelUtils::GetOutputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); } void *input_data_addr = nullptr; void *output_data_addr = nullptr; @@ -275,8 +273,8 @@ Status HcclTaskInfo::SetAddrs(const std::shared_ptr &op_desc, output_data_addr = reinterpret_cast(reinterpret_cast(args_) + op_desc->GetInputsSize() + i); GELOGI("Hccl task info known input addr %p, output addr %p.", input_data_addr, output_data_addr); } else { - input_data_addr = input_data_addrs_.empty() ? nullptr : input_data_addrs_[i]; - output_data_addr = output_data_addrs_.empty() ? nullptr : output_data_addrs_[i]; + input_data_addr = input_data_addrs.empty() ? nullptr : input_data_addrs[i]; + output_data_addr = output_data_addrs.empty() ? nullptr : output_data_addrs[i]; } kernel_hccl_infos[i].inputDataAddr = input_data_addr; if (hccl_type == HCOMALLGATHER || hccl_type == HCOMRECEIVE || hccl_type == HVDCALLBACKALLGATHER) { @@ -366,8 +364,8 @@ Status HcclTaskInfo::SetWorkspace(const std::shared_ptr &op_desc, workspace_addr = reinterpret_cast(reinterpret_cast(args_) + op_desc->GetInputsSize() + op_desc->GetOutputsSize()); } else { - workspace_data_addrs_ = ModelUtils::GetWorkspaceDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); - workspace_addr = workspace_data_addrs_.empty() ? nullptr : workspace_data_addrs_[0]; + const auto workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); + workspace_addr = workspace_data_addrs.empty() ? nullptr : workspace_data_addrs[0]; } } } diff --git a/ge/graph/load/new_model_manager/task_info/hccl_task_info.h b/ge/graph/load/new_model_manager/task_info/hccl_task_info.h index f7ce3468..162b60da 100644 --- a/ge/graph/load/new_model_manager/task_info/hccl_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/hccl_task_info.h @@ -76,9 +76,7 @@ class HcclTaskInfo : public TaskInfo { uint32_t private_def_len_; static std::mutex hccl_follow_stream_mutex_; vector kernel_hccl_infos_; - vector input_data_addrs_; - vector output_data_addrs_; - vector workspace_data_addrs_; + vector io_addrs_; OpDescPtr op_desc_; void *args_; uint32_t args_offset_; diff --git a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc index f1354d8e..fc07415e 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc @@ -128,7 +128,7 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin return RT_ERROR_TO_GE_STATUS(rt_ret);) GELOGI("KernelExTaskInfo knonw node Init Success."); - return SUCCESS; + return SetIoAddr(op_desc); } // 3. Set workspaceaddr, inputOutputDataAddr @@ -192,7 +192,7 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin davinci_model_->SetZeroCopyAddr(op_desc, io_addrs, io_addrs.data(), input_output_addr_, addrs_size, 0); GELOGI("KernelExTaskInfo Init Success. session id: %lu", session_id); - return SUCCESS; + return SetIoAddr(op_desc); } Status KernelExTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciModel *davinci_model) { @@ -258,8 +258,10 @@ Status KernelExTaskInfo::SetIoAddr(const OpDescPtr &op_desc) { } } } + return SUCCESS; } + Status KernelExTaskInfo::UpdateArgs() { GELOGI("KernelExTaskInfo::UpdateArgs in."); davinci_model_->SetTotalIOAddrs(io_addrs_); diff --git a/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc b/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc index 620ddbbb..1906a0c9 100755 --- a/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc @@ -146,7 +146,7 @@ Status KernelTaskInfo::SaveSKTDumpInfo() { return SUCCESS; } // all op in super kernel share one taskid and streamid - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); for (size_t i = 0; i < skt_info.op_desc_list.size(); i++) { davinci_model_->SaveDumpTask(skt_info.last_task_id, skt_info.last_stream_id, skt_info.op_desc_list[i], skt_info.dump_args_list[i]); @@ -163,7 +163,7 @@ void KernelTaskInfo::UpdateSKTTaskId() { GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); return; } - SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); skt_info.last_task_id = task_id; skt_info.last_stream_id = stream_id; skt_id_ = skt_info.last_task_id; @@ -191,7 +191,7 @@ Status KernelTaskInfo::SKTFinalize() { UpdateSKTTaskId(); GE_CHK_STATUS_RET(SaveSKTDumpInfo(), "skt save dump info failed"); GELOGI("SuperKernel Distribute [skt_id:%u]", skt_id_); - SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); skt_info.kernel_list.clear(); skt_info.arg_list.clear(); skt_info.dump_flag_list.clear(); @@ -208,7 +208,7 @@ Status KernelTaskInfo::SKTFinalize() { } uint32_t KernelTaskInfo::GetDumpFlag() { - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); for (auto flag : skt_info.dump_flag_list) { if (flag == RT_KERNEL_DUMPFLAG) { return RT_KERNEL_DUMPFLAG; @@ -218,7 +218,7 @@ uint32_t KernelTaskInfo::GetDumpFlag() { } Status KernelTaskInfo::SuperKernelLaunch() { - SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); if (skt_info.kernel_list.empty()) { GELOGI("SuperKernelLaunch: Skt_kernel_list has no task, just return"); return SUCCESS; @@ -272,7 +272,7 @@ Status KernelTaskInfo::SuperKernelLaunch() { } Status KernelTaskInfo::SaveSuperKernelInfo() { - SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); skt_info.kernel_list.push_back(stub_func_); skt_info.arg_list.push_back(args_); skt_info.last_stream = stream_; @@ -328,7 +328,7 @@ bool KernelTaskInfo::IsMarkedFirstNode() { // then may be saved to skt task list; else // call skt launch those saved tasks before bool KernelTaskInfo::FirstCallSKTLaunchCheck() { - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); return ((block_dim_ != skt_info.last_block_dim) || (stream_ != skt_info.last_stream) || (has_group_key_ && (group_key_ != skt_info.last_group_key))); } @@ -397,7 +397,7 @@ Status KernelTaskInfo::Distribute() { call_save_dump_ = true; } else { /* default: not skt launch */ - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSupperKernelTaskInfo(); + const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); GELOGD( "KernelTaskInfo Distribute Start, sktenable:%d taskid:%u sktid:%u last_sktid:%u stubfunc_name:%s " "stubfunc:%p blockdim:%u stream:%p", @@ -803,7 +803,6 @@ Status KernelTaskInfo::InitCceTask(const domi::KernelDef &kernel_def) { GELOGE(FAILED, "flowtable is null."); return FAILED; } - flowtable_size_ = flowtable.size(); } // get smDesc stored in model @@ -899,8 +898,8 @@ Status KernelTaskInfo::InitAicpuTask(uint32_t op_index, const domi::KernelDef &k GELOGE(init_ret, "Init aicpu task ext info failed, ext_info size=%zu", ext_info.size()); return init_ret; } - GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, aicpu_ext_info_addr_=%p", op_desc_->GetName().c_str(), - op_desc_->GetType().c_str(), ext_info.size(), aicpu_ext_info_addr_); + GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, aicpu_ext_info_addr_=%p", op_desc->GetName().c_str(), + op_desc->GetType().c_str(), ext_info.size(), aicpu_ext_info_addr_); aicpu_param_head->extInfoAddr = reinterpret_cast(aicpu_ext_info_addr_); aicpu_param_head->extInfoLength = static_cast(ext_info.size()); diff --git a/ge/graph/load/new_model_manager/task_info/kernel_task_info.h b/ge/graph/load/new_model_manager/task_info/kernel_task_info.h index f45cf1f3..cb96797f 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/kernel_task_info.h @@ -38,7 +38,6 @@ class KernelTaskInfo : public TaskInfo { flowtable_(nullptr), block_dim_(0), args_size_(0), - flowtable_size_(0), task_id_(0), stream_id_(0), so_name_(""), @@ -46,7 +45,6 @@ class KernelTaskInfo : public TaskInfo { kernel_type_(ccKernelType::CCE_AI_CORE), dump_flag_(RT_KERNEL_DEFAULT), dump_args_(nullptr), - op_desc_(nullptr), davinci_model_(nullptr), skt_id_(0), stub_func_name_(""), @@ -149,7 +147,6 @@ class KernelTaskInfo : public TaskInfo { void *flowtable_; uint32_t block_dim_; uint32_t args_size_; - uint32_t flowtable_size_; uint32_t task_id_; uint32_t stream_id_; std::string so_name_; diff --git a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc index 8d0e9ec6..aa35f552 100755 --- a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc @@ -35,7 +35,6 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da kind_ = memcpy_async.kind(); dst_max_ = memcpy_async.dst_max(); OpDescPtr op_desc = davinci_model_->GetOpByIndex(memcpy_async.op_index()); - op_desc_ = op_desc; if (op_desc == nullptr) { GELOGE(INTERNAL_ERROR, "Task op index:%u out of range", memcpy_async.op_index()); return INTERNAL_ERROR; From bd743a288b73b64342889d90e2cd9e976abb3386 Mon Sep 17 00:00:00 2001 From: zhangxiaokun Date: Wed, 23 Dec 2020 18:50:16 +0800 Subject: [PATCH 10/22] TaskInfo release OpDesc after distribute. --- ge/graph/load/new_model_manager/davinci_model.h | 1 - ge/graph/load/new_model_manager/task_info/hccl_task_info.cc | 2 +- ge/graph/load/new_model_manager/task_info/hccl_task_info.h | 2 -- .../load/new_model_manager/task_info/kernel_ex_task_info.cc | 6 +++--- .../load/new_model_manager/task_info/kernel_ex_task_info.h | 2 +- .../new_model_manager/task_info/memcpy_async_task_info.cc | 1 + 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ge/graph/load/new_model_manager/davinci_model.h b/ge/graph/load/new_model_manager/davinci_model.h index 9c494a78..0fdccd84 100755 --- a/ge/graph/load/new_model_manager/davinci_model.h +++ b/ge/graph/load/new_model_manager/davinci_model.h @@ -616,7 +616,6 @@ class DavinciModel { Status SyncVarData(); Status InitWeightMem(void *dev_ptr, void *weight_ptr, size_t weight_size); - Status InitFeatureMapAndP2PMem(void *dev_ptr, size_t mem_size); void CreateInputDimsInfo(const OpDescPtr &op_desc, Format format, InputOutputDescInfo &input); diff --git a/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc b/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc index 0d2a1288..2d476662 100644 --- a/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc @@ -59,7 +59,7 @@ Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_m GELOGI("HcclTaskInfo Init, op_index is: %u", op_index); // Get HCCL op - const auto op_desc = davinci_model->GetOpByIndex(op_index); + const auto op_desc = davinci_model_->GetOpByIndex(op_index); GE_CHECK_NOTNULL(op_desc); // Create the kernel hccl infos diff --git a/ge/graph/load/new_model_manager/task_info/hccl_task_info.h b/ge/graph/load/new_model_manager/task_info/hccl_task_info.h index 162b60da..5498cf6c 100644 --- a/ge/graph/load/new_model_manager/task_info/hccl_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/hccl_task_info.h @@ -35,7 +35,6 @@ class HcclTaskInfo : public TaskInfo { ops_kernel_store_(nullptr), private_def_(nullptr), private_def_len_(0), - op_desc_(nullptr), args_(nullptr), args_offset_(0) {} @@ -77,7 +76,6 @@ class HcclTaskInfo : public TaskInfo { static std::mutex hccl_follow_stream_mutex_; vector kernel_hccl_infos_; vector io_addrs_; - OpDescPtr op_desc_; void *args_; uint32_t args_offset_; }; diff --git a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc index fc07415e..944423ab 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc @@ -128,7 +128,7 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin return RT_ERROR_TO_GE_STATUS(rt_ret);) GELOGI("KernelExTaskInfo knonw node Init Success."); - return SetIoAddr(op_desc); + return SetIoAddrs(op_desc); } // 3. Set workspaceaddr, inputOutputDataAddr @@ -192,7 +192,7 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin davinci_model_->SetZeroCopyAddr(op_desc, io_addrs, io_addrs.data(), input_output_addr_, addrs_size, 0); GELOGI("KernelExTaskInfo Init Success. session id: %lu", session_id); - return SetIoAddr(op_desc); + return SetIoAddrs(op_desc); } Status KernelExTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciModel *davinci_model) { @@ -231,7 +231,7 @@ Status KernelExTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciMod return SUCCESS; } -Status KernelExTaskInfo::SetIoAddr(const OpDescPtr &op_desc) { +Status KernelExTaskInfo::SetIoAddrs(const OpDescPtr &op_desc) { const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc); vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc); diff --git a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h index 86a27abf..cb7647dc 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h @@ -59,7 +59,7 @@ class KernelExTaskInfo : public TaskInfo { }; private: Status CopyTaskInfo(const domi::KernelExDef &kernel_def, const RuntimeParam &rts_param, const OpDescPtr &op_desc); - Status SetIoAddr(const OpDescPtr &op_desc); + Status SetIoAddrs(const OpDescPtr &op_desc); uint32_t task_id_; uint32_t stream_id_; diff --git a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc index aa35f552..6851b1bc 100755 --- a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc @@ -85,6 +85,7 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da } else { io_addrs_.emplace_back(reinterpret_cast(dst_)); } + return SUCCESS; } From acb3e2f6dda27421d10d5f99a91249589dd8ec84 Mon Sep 17 00:00:00 2001 From: wjm Date: Wed, 23 Dec 2020 20:50:16 +0800 Subject: [PATCH 11/22] fix case plugin error --- ge/graph/passes/data_pass.cc | 16 +++--- ge/graph/passes/multi_batch_clone_pass.cc | 50 +------------------ ge/graph/passes/multi_batch_clone_pass.h | 8 --- ge/graph/preprocess/multi_batch_copy_graph.cc | 2 + 4 files changed, 13 insertions(+), 63 deletions(-) diff --git a/ge/graph/passes/data_pass.cc b/ge/graph/passes/data_pass.cc index 5bbd2fb1..1c897214 100644 --- a/ge/graph/passes/data_pass.cc +++ b/ge/graph/passes/data_pass.cc @@ -185,13 +185,17 @@ Status DataPass::Run(ComputeGraphPtr compute_graph) { const auto &parent_graph = compute_graph->GetParentGraph(); GE_CHECK_NOTNULL(parent_graph); - for (const NodePtr &node : compute_graph->GetDirectNode()) { - GE_CHECK_NOTNULL(node->GetOpDesc()); - if ((node->GetType() == VARIABLE) || (node->GetType() == VARIABLEV2) || (node->GetType() == NETOUTPUT)) { - continue; - } + bool flag = false; + (void)AttrUtils::GetBool(compute_graph, "_no_reset_name", flag); + if (!flag) { + for (const NodePtr &node : compute_graph->GetDirectNode()) { + GE_CHECK_NOTNULL(node->GetOpDesc()); + if ((node->GetType() == VARIABLE) || (node->GetType() == VARIABLEV2) || (node->GetType() == NETOUTPUT)) { + continue; + } - node->GetOpDesc()->SetName(parent_node->GetName() + "_" + compute_graph->GetName() + "/" + node->GetName()); + node->GetOpDesc()->SetName(parent_node->GetName() + "_" + compute_graph->GetName() + "/" + node->GetName()); + } } return PostParseSubgraph(compute_graph, subgraph_name, parent_node); diff --git a/ge/graph/passes/multi_batch_clone_pass.cc b/ge/graph/passes/multi_batch_clone_pass.cc index 87d9749a..496ad214 100755 --- a/ge/graph/passes/multi_batch_clone_pass.cc +++ b/ge/graph/passes/multi_batch_clone_pass.cc @@ -578,6 +578,7 @@ Status MultiBatchClonePass::CreateSubgraphs(const ComputeGraphPtr &graph, const subgraph->SetName("Batch_" + std::to_string(i)); subgraph->SetParentNode(case_node_); subgraph->SetParentGraph(graph); + (void)AttrUtils::SetBool(subgraph, "_no_reset_name", true); graph->AddSubgraph(subgraph->GetName(), subgraph); all_branch_output_[subgraph] = subgraph->FindFirstNodeMatchType(NETOUTPUT); @@ -599,55 +600,6 @@ Status MultiBatchClonePass::CreateSubgraphs(const ComputeGraphPtr &graph, const } } - return PostProcSubgraph(graph); -} - -/// -/// @ingroup ge -/// @brief Assign parent index for branches. -/// @param [in] const ComputeGraphPtr &graph: Root/Case graph. -/// @return 0: SUCCESS / others: FAILED -/// -Status MultiBatchClonePass::PostProcSubgraph(const ComputeGraphPtr &graph) { - auto func_desc = case_node_->GetOpDesc(); - domi::ParseSubgraphFuncV2 parse_func_v2 = nullptr; - auto post_func = domi::OpRegistry::Instance()->GetParseSubgraphPostFunc(func_desc->GetType()); - if (post_func == nullptr) { - GELOGW("The subgraph post func for node %s type %s is null.", case_node_->GetName().c_str(), - case_node_->GetType().c_str()); - if (domi::OpRegistry::Instance()->GetParseSubgraphPostFunc(func_desc->GetType(), parse_func_v2) != SUCCESS || - parse_func_v2 == nullptr) { - GELOGW("The subgraph new post func v2 for node %s type %s is null", case_node_->GetName().c_str(), - case_node_->GetType().c_str()); - return FAILED; - } - } - - for (const auto &name : func_desc->GetSubgraphInstanceNames()) { - const auto &subgraph = graph->GetSubgraph(name); - if (subgraph == nullptr) { - GELOGE(FAILED, "Subgraph not found, name: %s", name.c_str()); - return FAILED; - } - - std::string subgraph_name; - GE_CHK_STATUS_RET(func_desc->GetSubgraphNameByInstanceName(subgraph->GetName(), subgraph_name), - "Subgraph: %s get subgraph name failed.", subgraph->GetName().c_str()); - - auto graph = GraphUtils::CreateGraphFromComputeGraph(subgraph); - Status ret = FAILED; - if (post_func != nullptr) { - ret = post_func(subgraph_name, graph); - } else if (parse_func_v2 != nullptr) { - ret = parse_func_v2(subgraph_name.c_str(), graph); - } - if (ret != SUCCESS) { - GELOGE(FAILED, "Failed to post-process subgraph %s on node %s type %s", graph.GetName().c_str(), - case_node_->GetName().c_str(), case_node_->GetType().c_str()); - return FAILED; - } - } - return SUCCESS; } diff --git a/ge/graph/passes/multi_batch_clone_pass.h b/ge/graph/passes/multi_batch_clone_pass.h index 1155dfc8..5921970a 100755 --- a/ge/graph/passes/multi_batch_clone_pass.h +++ b/ge/graph/passes/multi_batch_clone_pass.h @@ -131,14 +131,6 @@ class MultiBatchClonePass : public GraphPass { /// Status CreateSubgraphs(const ComputeGraphPtr &graph, const ComputeGraphPtr &branch); - /// - /// @ingroup ge - /// @brief Assign parent index for branches. - /// @param [in] const ComputeGraphPtr &graph: Root/Case graph. - /// @return 0: SUCCESS / others: FAILED - /// - Status PostProcSubgraph(const ComputeGraphPtr &graph); - /// /// @ingroup ge /// @brief Remove subgraph supend output anchor. diff --git a/ge/graph/preprocess/multi_batch_copy_graph.cc b/ge/graph/preprocess/multi_batch_copy_graph.cc index c8880b2e..754df184 100644 --- a/ge/graph/preprocess/multi_batch_copy_graph.cc +++ b/ge/graph/preprocess/multi_batch_copy_graph.cc @@ -29,6 +29,7 @@ #include "framework/omg/omg_inner_types.h" #include "graph/debug/ge_attr_define.h" #include "graph/ge_context.h" +#include "graph/passes/data_pass.h" #include "graph/passes/multi_batch_clone_pass.h" #include "graph/passes/prune_pass.h" #include "graph/preprocess/multi_batch_options.h" @@ -1697,6 +1698,7 @@ Status ProcessMultiBatch(ComputeGraphPtr &graph) { if (multi_batch_with_switchn == nullptr) { PassManager pass_manager; GE_CHK_STATUS_RET(pass_manager.AddPass("MultiBatchClonePass", new (std::nothrow) MultiBatchClonePass)); + GE_CHK_STATUS_RET(pass_manager.AddPass("DataPass", new (std::nothrow) DataPass)); return pass_manager.Run(graph); } } From 4f97bc9abdfc2d997fbf9406b07034fb168c9f98 Mon Sep 17 00:00:00 2001 From: wjm Date: Wed, 23 Dec 2020 21:00:20 +0800 Subject: [PATCH 12/22] fix case plugin error --- ge/graph/passes/data_pass.cc | 2 +- ge/graph/preprocess/multi_batch_copy_graph.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ge/graph/passes/data_pass.cc b/ge/graph/passes/data_pass.cc index 1c897214..2a689cd5 100644 --- a/ge/graph/passes/data_pass.cc +++ b/ge/graph/passes/data_pass.cc @@ -194,7 +194,7 @@ Status DataPass::Run(ComputeGraphPtr compute_graph) { continue; } - node->GetOpDesc()->SetName(parent_node->GetName() + "_" + compute_graph->GetName() + "/" + node->GetName()); + node->GetOpDesc()->SetName(parent_node->GetName() + "_" + compute_graph->GetName() + "/" + node->GetName()); } } diff --git a/ge/graph/preprocess/multi_batch_copy_graph.cc b/ge/graph/preprocess/multi_batch_copy_graph.cc index 754df184..4f7cd9fb 100644 --- a/ge/graph/preprocess/multi_batch_copy_graph.cc +++ b/ge/graph/preprocess/multi_batch_copy_graph.cc @@ -1698,7 +1698,7 @@ Status ProcessMultiBatch(ComputeGraphPtr &graph) { if (multi_batch_with_switchn == nullptr) { PassManager pass_manager; GE_CHK_STATUS_RET(pass_manager.AddPass("MultiBatchClonePass", new (std::nothrow) MultiBatchClonePass)); - GE_CHK_STATUS_RET(pass_manager.AddPass("DataPass", new (std::nothrow) DataPass)); + GE_CHK_STATUS_RET(pass_manager.AddPass("DataPass", new (std::nothrow) DataPass)); // 子图分配parent index return pass_manager.Run(graph); } } From 53980b864aad48fe17af7bbd8773b9146d90abd5 Mon Sep 17 00:00:00 2001 From: baker Date: Wed, 23 Dec 2020 15:19:21 +0800 Subject: [PATCH 13/22] atc --help --- ge/offline/main.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ge/offline/main.cc b/ge/offline/main.cc index 46d25d97..933ffbb6 100755 --- a/ge/offline/main.cc +++ b/ge/offline/main.cc @@ -282,11 +282,13 @@ class GFlagUtils { " --enable_compress_weight Enable compress weight. true: enable; false(default): disable\n" " --compress_weight_conf Config file to compress weight\n" " --buffer_optimize Set buffer optimize. \"l2_optimize\" (default). Set \"off_optimize\" to close\n" + " --mdl_bank_path Set the path of the custom repository generated after model tuning.\n" "\n[Operator Tuning]\n" " --precision_mode precision mode, support force_fp16(default), allow_mix_precision, " "allow_fp32_to_fp16, must_keep_origin_dtype.\n" " --auto_tune_mode Set tune mode. E.g.: \"GA,RL\", support configure multiple, spit by ,\n" - " --op_select_implmode Set op select implmode. Support high_precision, high_performance. " + " --op_bank_path Set the path of the custom repository generated after operator tuning with Auto Tune.\n" + " --op_select_implmode Set op select implmode. Support high_precision, high_performance. " "default: high_performance\n" " --optypelist_for_implmode Appoint which op to select implmode, cooperated with op_select_implmode.\n" " Separate multiple nodes with commas (,). Use double quotation marks (\") " From f91fdad16a52b541ed3d89e88661d0a88371c792 Mon Sep 17 00:00:00 2001 From: wjm Date: Thu, 24 Dec 2020 10:42:58 +0800 Subject: [PATCH 14/22] case plugin --- ge/graph/preprocess/multi_batch_copy_graph.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ge/graph/preprocess/multi_batch_copy_graph.cc b/ge/graph/preprocess/multi_batch_copy_graph.cc index 4f7cd9fb..eae97b04 100644 --- a/ge/graph/preprocess/multi_batch_copy_graph.cc +++ b/ge/graph/preprocess/multi_batch_copy_graph.cc @@ -1698,7 +1698,7 @@ Status ProcessMultiBatch(ComputeGraphPtr &graph) { if (multi_batch_with_switchn == nullptr) { PassManager pass_manager; GE_CHK_STATUS_RET(pass_manager.AddPass("MultiBatchClonePass", new (std::nothrow) MultiBatchClonePass)); - GE_CHK_STATUS_RET(pass_manager.AddPass("DataPass", new (std::nothrow) DataPass)); // 子图分配parent index + GE_CHK_STATUS_RET(pass_manager.AddPass("DataPass", new (std::nothrow) DataPass)); // set subgraph parent index return pass_manager.Run(graph); } } From 020080377ad5332407491afbf69c714206020be4 Mon Sep 17 00:00:00 2001 From: taoxudonghaha Date: Thu, 24 Dec 2020 14:59:37 +0800 Subject: [PATCH 15/22] add ut classify_rule --- classify_rule.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 classify_rule.txt diff --git a/classify_rule.txt b/classify_rule.txt new file mode 100644 index 00000000..5c88f67e --- /dev/null +++ b/classify_rule.txt @@ -0,0 +1,5 @@ +[graphengine] +ge +inc +metadef +parser From 0b542f8421110c44161fed84cf2e1a9697406b5c Mon Sep 17 00:00:00 2001 From: zhangxiaokun Date: Thu, 24 Dec 2020 15:40:42 +0800 Subject: [PATCH 16/22] Return when Task sink failed --- ge/common/helper/model_helper.cc | 16 +++++----------- ge/graph/load/new_model_manager/davinci_model.cc | 4 ++-- inc/framework/common/helper/model_helper.h | 2 +- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/ge/common/helper/model_helper.cc b/ge/common/helper/model_helper.cc index aacef88c..d89c326f 100644 --- a/ge/common/helper/model_helper.cc +++ b/ge/common/helper/model_helper.cc @@ -122,7 +122,7 @@ Status ModelHelper::SaveModelTbeKernel(std::shared_ptr &om_fil if (tbe_kernel_store.DataSize() > 0) { GE_CHK_STATUS_RET( SaveModelPartition(om_file_save_helper, ModelPartitionType::TBE_KERNELS, - ge_model->GetTBEKernelStore().Data(), ge_model->GetTBEKernelStore().DataSize(), + ge_model->GetTBEKernelStore().Data(), ge_model->GetTBEKernelStore().DataSize(), model_index), "Add tbe kernel partition failed"); } // no need to check value, DATA->NetOutput @@ -306,7 +306,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ModelHelper::SaveToOmRoo model_names.emplace_back(item.first); } } - + vector model_buffers(model_names.size()); vector task_buffers(model_names.size()); @@ -611,12 +611,11 @@ Status ModelHelper::LoadModelData(OmFileLoadHelper &om_load_helper) { return INTERNAL_ERROR; } - SetModelToGeModel(model); - + SetModelToGeModel(model_, model); return SUCCESS; } -void ModelHelper::SetModelToGeModel(ge::Model &model) { +void ModelHelper::SetModelToGeModel(GeModelPtr &ge_model, Model &model) { model_->SetGraph(model.GetGraph()); model_->SetName(model.GetName()); model_->SetVersion(model.GetVersion()); @@ -636,12 +635,7 @@ Status ModelHelper::LoadModelData(OmFileLoadHelper &om_load_helper, GeModelPtr & return INTERNAL_ERROR; } - cur_model->SetGraph(model.GetGraph()); - cur_model->SetName(model.GetName()); - cur_model->SetVersion(model.GetVersion()); - cur_model->SetPlatformVersion(model.GetPlatformVersion()); - cur_model->SetAttr(model.MutableAttrMap()); - + SetModelToGeModel(cur_model, model); return SUCCESS; } diff --git a/ge/graph/load/new_model_manager/davinci_model.cc b/ge/graph/load/new_model_manager/davinci_model.cc index fd842a4b..044531f6 100755 --- a/ge/graph/load/new_model_manager/davinci_model.cc +++ b/ge/graph/load/new_model_manager/davinci_model.cc @@ -682,7 +682,7 @@ Status DavinciModel::Init(void *dev_ptr, size_t mem_size, void *weight_ptr, size SetDataDumperArgs(compute_graph); GE_TIMESTAMP_START(DoTaskSink); - auto ret = DoTaskSink(); + GE_CHK_STATUS_RET(DoTaskSink(), "Task sink failed"); GE_TIMESTAMP_END(DoTaskSink, "GraphLoader::DoTaskSink"); auto all_dump_model = GetDumpProperties().GetAllDumpModel(); @@ -723,7 +723,7 @@ Status DavinciModel::Init(void *dev_ptr, size_t mem_size, void *weight_ptr, size } Shrink(); - return ret; + return SUCCESS; } Status DavinciModel::ReportProfilingData() { diff --git a/inc/framework/common/helper/model_helper.h b/inc/framework/common/helper/model_helper.h index 7867e63d..bc0444bc 100644 --- a/inc/framework/common/helper/model_helper.h +++ b/inc/framework/common/helper/model_helper.h @@ -69,7 +69,7 @@ class ModelHelper { Status GenerateGeModel(OmFileLoadHelper &om_load_helper); Status GenerateGeRootModel(OmFileLoadHelper &om_load_helper); Status LoadModelData(OmFileLoadHelper &om_load_helper); - void SetModelToGeModel(ge::Model &model); + void SetModelToGeModel(GeModelPtr &ge_model, Model &model); Status LoadModelData(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index); Status LoadWeights(OmFileLoadHelper &om_load_helper); Status LoadWeights(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index); From 10f986a1ee8c16542e1540fb5baf01c9ad3a6bd7 Mon Sep 17 00:00:00 2001 From: zhangxiaokun Date: Thu, 24 Dec 2020 15:45:09 +0800 Subject: [PATCH 17/22] return when task sink failed. --- ge/common/helper/model_helper.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ge/common/helper/model_helper.cc b/ge/common/helper/model_helper.cc index d89c326f..52917abe 100644 --- a/ge/common/helper/model_helper.cc +++ b/ge/common/helper/model_helper.cc @@ -616,11 +616,11 @@ Status ModelHelper::LoadModelData(OmFileLoadHelper &om_load_helper) { } void ModelHelper::SetModelToGeModel(GeModelPtr &ge_model, Model &model) { - model_->SetGraph(model.GetGraph()); - model_->SetName(model.GetName()); - model_->SetVersion(model.GetVersion()); - model_->SetPlatformVersion(model.GetPlatformVersion()); - model_->SetAttr(model.MutableAttrMap()); + ge_model->SetGraph(model.GetGraph()); + ge_model->SetName(model.GetName()); + ge_model->SetVersion(model.GetVersion()); + ge_model->SetPlatformVersion(model.GetPlatformVersion()); + ge_model->SetAttr(model.MutableAttrMap()); } Status ModelHelper::LoadModelData(OmFileLoadHelper &om_load_helper, GeModelPtr &cur_model, size_t mode_index) { From cdbef14012b2ef00e8dc5eeebd73c8891652bff6 Mon Sep 17 00:00:00 2001 From: l00444296 Date: Thu, 24 Dec 2020 20:51:07 +0800 Subject: [PATCH 18/22] Feature: repair dynamic_stitch_kernel folding bug --- ge/host_kernels/dynamic_stitch_kernel.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ge/host_kernels/dynamic_stitch_kernel.cc b/ge/host_kernels/dynamic_stitch_kernel.cc index d26237f4..32611b03 100644 --- a/ge/host_kernels/dynamic_stitch_kernel.cc +++ b/ge/host_kernels/dynamic_stitch_kernel.cc @@ -33,6 +33,8 @@ namespace { const int kDoubleAttrN = 2; const int kFirstOutputDescIdx = 0; const int kMergedShapeSecondDim = 1; +const size_t kNullTensorDimNum = 1; +const int64_t kNullTensorDimValue = 0; const std::set kSupportedTypeSet = {DT_INT8, DT_UINT8, DT_INT16, DT_UINT16, DT_INT32, DT_INT64, DT_BOOL, DT_FLOAT16, DT_FLOAT, DT_DOUBLE}; } // namespace @@ -177,7 +179,14 @@ Status DynamicStitchKernel::StitchDataFollowIndices(int64_t data_unit, const vec int64_t src_offset = 0; std::set indices_set; for (int i = 0; i < n_; i++) { - auto indices_shape_size = input[i]->GetTensorDesc().GetShape().GetShapeSize(); + GeShape indices_shape = input[i]->GetTensorDesc().GetShape(); + size_t indices_dim_num = indices_shape.GetDimNum(); + // skip null indices tensor + if (indices_dim_num == kNullTensorDimNum && indices_shape.GetDim(0) == kNullTensorDimValue) { + GELOGD("Input indices[%d] has null tensor, skip it.", i); + continue; + } + auto indices_shape_size = indices_shape.GetShapeSize(); // to normalize logic, assume scalar as vector with shape of [1]. indices_shape_size = (indices_shape_size == 0) ? 1 : indices_shape_size; // all index for input is less than size of input From 3e770244aad6a334a08bc3bc100e0c629f1d685f Mon Sep 17 00:00:00 2001 From: taoxiangdong Date: Thu, 24 Dec 2020 19:46:08 +0800 Subject: [PATCH 19/22] Check Aicpu op type list --- ge/graph/build/model_builder.cc | 53 +++++ ge/graph/build/model_builder.h | 6 + .../load/new_model_manager/davinci_model.cc | 2 + .../load/new_model_manager/model_manager.cc | 199 ++++++++++++++++++ .../load/new_model_manager/model_manager.h | 5 + ge/hybrid/model/hybrid_model_builder.cc | 26 +++ ge/hybrid/model/hybrid_model_builder.h | 1 + 7 files changed, 292 insertions(+) diff --git a/ge/graph/build/model_builder.cc b/ge/graph/build/model_builder.cc index 3be45895..77f8f237 100755 --- a/ge/graph/build/model_builder.cc +++ b/ge/graph/build/model_builder.cc @@ -582,9 +582,13 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { // Add TBE Kernels and custom aicpu op bin std::set tbe_name_set; std::set aicpu_name_set; + std::set aicpu_op_types; + std::set aicpu_tf_op_types; for (const ge::NodePtr &n : compute_graph_->GetNodes(compute_graph_->GetGraphUnknownFlag())) { auto node_op_desc = n->GetOpDesc(); GE_IF_BOOL_EXEC(node_op_desc == nullptr, continue); + // check aicpu op type + CollectCheckAicpuAttr(node_op_desc, aicpu_op_types, aicpu_tf_op_types); TBEKernelPtr tbe_kernel = node_op_desc->TryGetExtAttr(ge::OP_EXTATTR_NAME_TBE_KERNEL, TBEKernelPtr()); if (tbe_kernel == nullptr) { std::string kernel_name; @@ -606,6 +610,8 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { tbe_kernel_store_.AddTBEKernel(tbe_kernel); } + SetModelCheckAicpuAttr(model, aicpu_op_types, aicpu_tf_op_types); + for (const ge::NodePtr &n : compute_graph_->GetNodes(compute_graph_->GetGraphUnknownFlag())) { auto node_op_desc = n->GetOpDesc(); GE_IF_BOOL_EXEC(node_op_desc == nullptr, continue); @@ -797,4 +803,51 @@ Status ModelBuilder::CompileSingleOp() { GE_TIMESTAMP_CALLNUM_END(BatchCompileOp, "GraphBuild::CompileOp"); return ge::SUCCESS; } + +void ModelBuilder::CollectCheckAicpuAttr(const OpDescPtr &op_desc, std::set &aicpu_op_types, + std::set &aicpu_tf_op_types) { + std::string aicpu_optype; + bool has_attr_check_cpu = ge::AttrUtils::GetStr(op_desc, "needCheckCpu", aicpu_optype); + std::vector tf_optypes; + bool has_attr_check_tf = ge::AttrUtils::GetListStr(op_desc, "needCheckTf", tf_optypes); + if (has_attr_check_cpu && !aicpu_optype.empty()) { + aicpu_op_types.insert(aicpu_optype); + } + + if (has_attr_check_tf && !tf_optypes.empty()) { + aicpu_tf_op_types.insert(tf_optypes.begin(), tf_optypes.end()); + } + + return; +} + +void ModelBuilder::SetModelCheckAicpuAttr(ge::Model &model, std::set &aicpu_op_types, + std::set &aicpu_tf_op_types) { + std::vector aicpu_optype_list; + std::vector aicpu_tf_optype_list; + if (ge::AttrUtils::GetListStr(&model, "needCheckCpu", aicpu_optype_list)) { + GELOGI("Already have aicpu optype size: %zu", aicpu_optype_list.size()); + aicpu_op_types.insert(aicpu_optype_list.begin(), aicpu_optype_list.end()); + } + + if (ge::AttrUtils::GetListStr(&model, "needCheckTf", aicpu_tf_optype_list)) { + GELOGI("Already have aicpu tf optype size: %zu", aicpu_tf_optype_list.size()); + aicpu_tf_op_types.insert(aicpu_tf_optype_list.begin(), aicpu_tf_optype_list.end()); + } + + // reset list with set + aicpu_optype_list.assign(aicpu_op_types.begin(), aicpu_op_types.end()); + aicpu_tf_optype_list.assign(aicpu_tf_op_types.begin(), aicpu_tf_op_types.end()); + GELOGI( + "Check Aicpu op types ComputeGraph: %s aicpu_op_types: %zu, aicpu_optype_list: %zu, aicpu_tf_op_types: %zu, " + "aicpu_tf_optype_list:%zu.", + compute_graph_->GetName().c_str(), aicpu_op_types.size(), aicpu_optype_list.size(), aicpu_tf_op_types.size(), + aicpu_tf_optype_list.size()); + GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(&model, "needCheckCpu", aicpu_optype_list), return, + "Set attr needCheckCpu fail."); + + GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(&model, "needCheckTf", aicpu_tf_optype_list), return, + "Set attr needCheckTf fail."); + return; +} } // namespace ge diff --git a/ge/graph/build/model_builder.h b/ge/graph/build/model_builder.h index e75521c7..de079768 100644 --- a/ge/graph/build/model_builder.h +++ b/ge/graph/build/model_builder.h @@ -83,6 +83,12 @@ class ModelBuilder { Status CompileSingleOp(); + void CollectCheckAicpuAttr(const OpDescPtr &op_desc, std::set &aicpu_op_types, + std::set &aicpu_tf_op_types); + + void SetModelCheckAicpuAttr(ge::Model &model, std::set &aicpu_op_types, + std::set &aicpu_tf_op_types); + uint64_t session_id_; map mem_type_to_mem_offset_; diff --git a/ge/graph/load/new_model_manager/davinci_model.cc b/ge/graph/load/new_model_manager/davinci_model.cc index fd842a4b..ba78df7c 100755 --- a/ge/graph/load/new_model_manager/davinci_model.cc +++ b/ge/graph/load/new_model_manager/davinci_model.cc @@ -487,6 +487,8 @@ Status DavinciModel::DoTaskSink() { GE_CHK_STATUS_RET(ModelManager::GetInstance()->LaunchCustAicpuSo(), "Launch cust aicpu so failed."); + GE_CHK_STATUS_RET(ModelManager::GetInstance()->CheckAicpuOpList(ge_model_), "Check aicpu op type failed."); + GE_CHK_STATUS_RET(InitEntryTask(), "InitEntryTask failed."); GE_CHK_STATUS_RET(DistributeTask(), "Distribute failed."); diff --git a/ge/graph/load/new_model_manager/model_manager.cc b/ge/graph/load/new_model_manager/model_manager.cc index 0dbeb38e..4b0dbee0 100755 --- a/ge/graph/load/new_model_manager/model_manager.cc +++ b/ge/graph/load/new_model_manager/model_manager.cc @@ -18,6 +18,7 @@ #include +#include "aicpu/aicpu_schedule/aicpu_op_type_list.h" #include "common/dump/dump_manager.h" #include "common/l2_cache_optimize.h" #include "common/profiling/profiling_manager.h" @@ -30,6 +31,7 @@ #include "graph/load/new_model_manager/davinci_model_parser.h" #include "model/ge_root_model.h" #include "graph/common/local_context.h" +#include "graph/utils/attr_utils.h" #include "common/formats/utils/formats_trans_utils.h" #include "hybrid/hybrid_davinci_model.h" @@ -52,6 +54,7 @@ const char *const kDeleteCustOp = "deleteCustOp"; const int kTimeSpecNano = 1000000000; const int kTimeSpecMiro = 1000000; const int kSessionMaxBias = 100; +const int kOpNameMaxSize = 100; struct CustAicpuSoBuf { uint64_t kernelSoBuf; uint32_t kernelSoBufLen; @@ -1534,4 +1537,200 @@ Status ModelManager::EnableExceptionDump(const std::map &options return SUCCESS; } +Status ModelManager::LaunchKernelCheckAicpuOp(std::vector &aicpu_optype_list, + std::vector &aicpu_tf_optype_list) { + std::string kernel_name = "checkOpType"; + GELOGI("LaunchKernelCheckAicpuOpType in, kernel name %s", kernel_name.c_str()); + std::lock_guard lock(cust_aicpu_mutex_); + std::vector req_aicpu_op_info_list; + std::vector res_aicpu_op_info_list; + std::vector res_ret_code_list; + + if (aicpu_optype_list.empty() && aicpu_tf_optype_list.empty()) { + GELOGI("No need to check aicpu op type."); + return SUCCESS; + } + + vector allocated_mem; + rtError_t status; + rtStream_t stream = nullptr; + void *args = nullptr; + + void *d_req_op_list = nullptr; + void *d_res_op_list = nullptr; + void *d_ret_code_list = nullptr; + + size_t aicpu_op_nums = aicpu_optype_list.size(); + size_t tf_op_nums = aicpu_tf_optype_list.size(); + size_t op_nums = aicpu_op_nums + tf_op_nums; + // malloc sysOpInfoList in SysOpCheckInfo + status = rtMalloc(&d_req_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); + if (status != RT_ERROR_NONE) { + GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); + return RT_ERROR_TO_GE_STATUS(status); + } + allocated_mem.push_back(d_req_op_list); + + // malloc sysOpInfoList in SysOpCheckResp + status = rtMalloc(&d_res_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); + if (status != RT_ERROR_NONE) { + GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); + return RT_ERROR_TO_GE_STATUS(status); + } + allocated_mem.push_back(d_res_op_list); + + // malloc returnCodeList in SysOpCheckResp + status = rtMalloc(&d_ret_code_list, op_nums * sizeof(ReturnCode), RT_MEMORY_HBM); + if (status != RT_ERROR_NONE) { + GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); + return RT_ERROR_TO_GE_STATUS(status); + } + allocated_mem.push_back(d_ret_code_list); + + for (const auto &op_type : aicpu_optype_list) { + SysOpInfo op_info; + // malloc op_type name in SysOpInfo + void *d_op_type_name = nullptr; + status = rtMalloc(&d_op_type_name, op_type.length(), RT_MEMORY_HBM); + if (status != RT_ERROR_NONE) { + GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); + return RT_ERROR_TO_GE_STATUS(status); + } + allocated_mem.push_back(d_op_type_name); + GE_CHK_RT(rtMemcpy(d_op_type_name, op_type.length(), op_type.c_str(), op_type.length(), RT_MEMCPY_HOST_TO_DEVICE)); + op_info.opType = static_cast(reinterpret_cast(d_op_type_name)); + op_info.opLen = op_type.length(); + op_info.kernelsType = CPU_KERNEL; + req_aicpu_op_info_list.emplace_back(op_info); + } + + for (const auto &op_type : aicpu_tf_optype_list) { + SysOpInfo op_info; + // malloc op_type name in SysOpInfo + void *d_op_type_name = nullptr; + status = rtMalloc(&d_op_type_name, op_type.size(), RT_MEMORY_HBM); + if (status != RT_ERROR_NONE) { + GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); + return RT_ERROR_TO_GE_STATUS(status); + } + allocated_mem.push_back(d_op_type_name); + GE_CHK_RT(rtMemcpy(d_op_type_name, op_type.size(), op_type.c_str(), op_type.size(), RT_MEMCPY_HOST_TO_DEVICE)); + op_info.opType = static_cast(reinterpret_cast(d_op_type_name)); + op_info.opLen = op_type.size(); + op_info.kernelsType = TF_KERNEL; + req_aicpu_op_info_list.emplace_back(op_info); + } + GELOGI("Check aicpu op all attr size: %zu, real attr size: %zu.", op_nums, req_aicpu_op_info_list.size()); + GE_CHK_RT(rtMemcpy(d_req_op_list, sizeof(SysOpInfo) * req_aicpu_op_info_list.size(), req_aicpu_op_info_list.data(), + sizeof(SysOpInfo) * req_aicpu_op_info_list.size(), RT_MEMCPY_HOST_TO_DEVICE)); + + SysOpCheckInfo op_check_info_req = { 0 }; + SysOpCheckResp op_check_info_res = { 0 }; + op_check_info_req.opListNum = op_nums; + op_check_info_req.offSetLen = sizeof(SysOpCheckInfo); + op_check_info_req.sysOpInfoList = static_cast(reinterpret_cast(d_req_op_list)); + + op_check_info_res.opListNum = 0; + op_check_info_res.isWithoutJson = 0; + op_check_info_res.returnCodeList = static_cast(reinterpret_cast(d_ret_code_list)); + op_check_info_res.sysOpInfoList = static_cast(reinterpret_cast(d_res_op_list)); + + uint32_t args_size = sizeof(SysOpCheckInfo) + sizeof(SysOpCheckResp); + status = rtMalloc(&args, args_size, RT_MEMORY_HBM); + if (status != RT_ERROR_NONE) { + GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); + return RT_ERROR_TO_GE_STATUS(status); + } + allocated_mem.push_back(args); + GE_CHK_RT( + rtMemcpy(args, sizeof(SysOpCheckInfo), reinterpret_cast(&op_check_info_req), sizeof(SysOpCheckInfo), RT_MEMCPY_HOST_TO_DEVICE)); + GE_CHK_RT(rtMemcpy(reinterpret_cast(static_cast(static_cast(reinterpret_cast(args)) + op_check_info_req.offSetLen)), + sizeof(SysOpCheckResp), reinterpret_cast(&op_check_info_res), sizeof(SysOpCheckResp), RT_MEMCPY_HOST_TO_DEVICE)); + GE_CHK_RT(rtStreamCreate(&stream, 0)); + GE_CHK_RT(rtCpuKernelLaunch(nullptr, kernel_name.c_str(), 1, args, args_size, nullptr, stream)); + + status = rtStreamSynchronize(stream); + if (status != RT_ERROR_NONE) { + GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); + return RT_ERROR_TO_GE_STATUS(status); + } + + // Check the response + SysOpCheckResp *d_op_check_info_res = reinterpret_cast(reinterpret_cast(static_cast(static_cast(reinterpret_cast(args)) + op_check_info_req.offSetLen))); + (void)memset_s(&op_check_info_res, sizeof(SysOpCheckResp), 0, sizeof(SysOpCheckResp)); + GE_CHK_RT(rtMemcpy(&op_check_info_res, sizeof(SysOpCheckResp), d_op_check_info_res, sizeof(SysOpCheckResp), + RT_MEMCPY_DEVICE_TO_HOST)); + std::function callback = [&]() { + for (auto mem : allocated_mem) { + GE_CHK_RT(rtFree(mem)); + } + GE_CHK_RT(rtStreamDestroy(stream)); + }; + + if (op_check_info_res.isWithoutJson) { + GELOGI("No need to check aicpu in this scenoria."); + GE_MAKE_GUARD(release, callback); + return SUCCESS; + } + uint64_t res_op_nums = op_check_info_res.opListNum; + GELOGI("Check aicpu type, is without json: %d, res op num: %lu.", op_check_info_res.isWithoutJson, res_op_nums); + if (res_op_nums != 0) { + res_ret_code_list.clear(); + res_ret_code_list.resize(res_op_nums); + res_aicpu_op_info_list.clear(); + res_aicpu_op_info_list.resize(res_op_nums); + GE_CHK_RT(rtMemcpy(res_ret_code_list.data(), sizeof(ReturnCode) * res_op_nums, + reinterpret_cast(static_cast(op_check_info_res.returnCodeList)), + sizeof(ReturnCode) * res_op_nums, RT_MEMCPY_DEVICE_TO_HOST)); + GE_CHK_RT(rtMemcpy(res_aicpu_op_info_list.data(), sizeof(SysOpInfo) * res_op_nums, + reinterpret_cast(static_cast(op_check_info_res.sysOpInfoList)), + sizeof(SysOpInfo) * res_op_nums, RT_MEMCPY_DEVICE_TO_HOST)); + if (res_ret_code_list.size() != res_aicpu_op_info_list.size() || res_ret_code_list.size() != res_op_nums) { + GELOGE(FAILED, "Number of retcode is not equal to number of op type."); + GE_MAKE_GUARD(release, callback); + return FAILED; + } + std::string fail_reason; + for (uint32_t i = 0; i < res_op_nums; i++) { + ReturnCode ret_code = res_ret_code_list.at(i); + SysOpInfo aicpu_info = res_aicpu_op_info_list.at(i); + GELOGI("Not support aicpu op type: %lu, kernel_type:%d, opLen:%d, ret_code:%d", aicpu_info.opType, + aicpu_info.kernelsType, aicpu_info.opLen, ret_code); + std::vector op_name; + op_name.clear(); + op_name.resize(kOpNameMaxSize); + GE_CHK_RT(rtMemcpy(op_name.data(), aicpu_info.opLen, reinterpret_cast(aicpu_info.opType), + aicpu_info.opLen, RT_MEMCPY_DEVICE_TO_HOST)); + std::string kernel_type = + (static_cast(aicpu_info.kernelsType) == TF_KERNEL) ? "TF_KERNEL" : "CPU_KERNEL"; + string op_name_str(op_name.data()); + fail_reason += "op_type: " + op_name_str + " kernel_type: " + kernel_type + + " ret code:" + std::to_string(static_cast(ret_code)) + + "<0: op_type, 1: format, 2: datatype> \n"; + } + fail_reason += "not support."; + GELOGE(FAILED, "Check aicpu op_type failed. details: %s", fail_reason.c_str()); + GE_MAKE_GUARD(release, callback); + return FAILED; + } + + GE_MAKE_GUARD(release, callback); + GELOGI("Cpu kernel launch check optype task success."); + return SUCCESS; +} + +Status ModelManager::CheckAicpuOpList(GeModelPtr ge_model) { + std::vector aicpu_optype_list; + std::vector aicpu_tf_optype_list; + bool aicpu_need_check = ge::AttrUtils::GetListStr(ge_model, "needCheckCpu", aicpu_optype_list); + bool tf_need_check = ge::AttrUtils::GetListStr(ge_model, "needCheckTf", aicpu_tf_optype_list); + if (!aicpu_need_check && !tf_need_check) { + GELOGI("Graph:%s No need to check aicpu optype.", ge_model->GetGraph().GetName().c_str()); + return SUCCESS; + } + GE_CHK_STATUS_RET(LaunchKernelCheckAicpuOp(aicpu_optype_list, aicpu_tf_optype_list), + "Launch check aicpu op type failed."); + return SUCCESS; +} + } // namespace ge diff --git a/ge/graph/load/new_model_manager/model_manager.h b/ge/graph/load/new_model_manager/model_manager.h index 99af8415..088ea5fd 100755 --- a/ge/graph/load/new_model_manager/model_manager.h +++ b/ge/graph/load/new_model_manager/model_manager.h @@ -295,6 +295,11 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager { ge::Status LaunchKernelCustAicpuSo(const string &kernel_name); + ge::Status LaunchKernelCheckAicpuOp(std::vector &aicpu_optype_list, + std::vector &aicpu_tf_optype_list); + + ge::Status CheckAicpuOpList(GeModelPtr ge_model); + ge::Status GetOrigInputInfo(uint32_t model_id, uint32_t index, OriginInputInfo &orig_input_info); ge::Status GenSessionId(uint64_t &session_id); diff --git a/ge/hybrid/model/hybrid_model_builder.cc b/ge/hybrid/model/hybrid_model_builder.cc index cba83dbd..ccbef156 100755 --- a/ge/hybrid/model/hybrid_model_builder.cc +++ b/ge/hybrid/model/hybrid_model_builder.cc @@ -21,6 +21,7 @@ #include "graph/build/memory/var_mem_assign_util.h" #include "graph/debug/ge_attr_define.h" #include "graph/load/new_model_manager/model_utils.h" +#include "graph/load/new_model_manager/model_manager.h" #include "graph/manager/graph_var_manager.h" #include "graph/manager/host_mem_manager.h" #include "graph/manager/trans_var_data_utils.h" @@ -924,6 +925,7 @@ Status HybridModelBuilder::InitWeights() { } Status HybridModelBuilder::LoadTasks() { + GE_CHK_STATUS_RET(CheckAicpuOpList(), "Check Aicpu op failed."); for (auto &it : hybrid_model_.node_items_) { auto &node_item = it.second; auto &node_ptr = node_item->node; @@ -1560,5 +1562,29 @@ Status HybridModelBuilder::BuildInputMapping(GraphItem &graph_item, return SUCCESS; } + +Status HybridModelBuilder::CheckAicpuOpList() { + std::vector aicpu_optype_list; + std::vector aicpu_tf_optype_list; + std::set aicpu_optype_set; + std::set aicpu_tf_optype_set; + for (auto &it : ge_root_model_->GetSubgraphInstanceNameToModel()) { + auto &ge_model = it.second; + GE_CHECK_NOTNULL(ge_model); + if (ge::AttrUtils::GetListStr(*ge_model, "needCheckCpu", aicpu_optype_list)) { + aicpu_optype_set.insert(aicpu_optype_list.begin(), aicpu_optype_list.end()); + } + + if (ge::AttrUtils::GetListStr(*ge_model, "needCheckTf", aicpu_tf_optype_list)) { + aicpu_tf_optype_set.insert(aicpu_tf_optype_list.begin(), aicpu_tf_optype_list.end()); + } + } + // reset list with set + aicpu_optype_list.assign(aicpu_optype_set.begin(), aicpu_optype_set.end()); + aicpu_tf_optype_list.assign(aicpu_tf_optype_set.begin(), aicpu_tf_optype_set.end()); + GE_CHK_STATUS_RET(ModelManager::GetInstance()->LaunchKernelCheckAicpuOp(aicpu_optype_list, aicpu_tf_optype_list), + "Launch check aicpu op type failed."); + return SUCCESS; +} } // namespace hybrid } // namespace ge diff --git a/ge/hybrid/model/hybrid_model_builder.h b/ge/hybrid/model/hybrid_model_builder.h index b90ec982..bb349d86 100644 --- a/ge/hybrid/model/hybrid_model_builder.h +++ b/ge/hybrid/model/hybrid_model_builder.h @@ -78,6 +78,7 @@ class HybridModelBuilder { Status ParseVarOutputs(NodeItem &node_item); Status LoadKnownShapedSubgraph(ComputeGraph &graph, NodeItem *parent_node_item); Status RecoverGraphUnknownFlag(); + Status CheckAicpuOpList(); const char* GetGraphName() const { return hybrid_model_.model_name_.c_str(); From 113b80da8b56099bf7cf88aa8370cb5246208831 Mon Sep 17 00:00:00 2001 From: wjm Date: Fri, 25 Dec 2020 11:38:22 +0800 Subject: [PATCH 20/22] remove data_pass --- ge/graph/passes/data_pass.cc | 16 +++---- ge/graph/passes/multi_batch_clone_pass.cc | 45 ++++++++++++++++--- ge/graph/passes/multi_batch_clone_pass.h | 14 ++++-- ge/graph/preprocess/multi_batch_copy_graph.cc | 2 - 4 files changed, 57 insertions(+), 20 deletions(-) diff --git a/ge/graph/passes/data_pass.cc b/ge/graph/passes/data_pass.cc index 2a689cd5..5bbd2fb1 100644 --- a/ge/graph/passes/data_pass.cc +++ b/ge/graph/passes/data_pass.cc @@ -185,17 +185,13 @@ Status DataPass::Run(ComputeGraphPtr compute_graph) { const auto &parent_graph = compute_graph->GetParentGraph(); GE_CHECK_NOTNULL(parent_graph); - bool flag = false; - (void)AttrUtils::GetBool(compute_graph, "_no_reset_name", flag); - if (!flag) { - for (const NodePtr &node : compute_graph->GetDirectNode()) { - GE_CHECK_NOTNULL(node->GetOpDesc()); - if ((node->GetType() == VARIABLE) || (node->GetType() == VARIABLEV2) || (node->GetType() == NETOUTPUT)) { - continue; - } - - node->GetOpDesc()->SetName(parent_node->GetName() + "_" + compute_graph->GetName() + "/" + node->GetName()); + for (const NodePtr &node : compute_graph->GetDirectNode()) { + GE_CHECK_NOTNULL(node->GetOpDesc()); + if ((node->GetType() == VARIABLE) || (node->GetType() == VARIABLEV2) || (node->GetType() == NETOUTPUT)) { + continue; } + + node->GetOpDesc()->SetName(parent_node->GetName() + "_" + compute_graph->GetName() + "/" + node->GetName()); } return PostParseSubgraph(compute_graph, subgraph_name, parent_node); diff --git a/ge/graph/passes/multi_batch_clone_pass.cc b/ge/graph/passes/multi_batch_clone_pass.cc index 496ad214..37f4b637 100755 --- a/ge/graph/passes/multi_batch_clone_pass.cc +++ b/ge/graph/passes/multi_batch_clone_pass.cc @@ -503,12 +503,24 @@ Status MultiBatchClonePass::SetMaxShapeToData(const NodePtr &data) { /// /// @ingroup ge -/// @brief Set shape to Data node in branch. -/// @param [in] const NodePtr &data: data in branch. +/// @brief Update Data node in Subgraph. +/// @param [in] const NodePtr &data: data in Subgraph. /// @param [in] size_t index: The batch index. /// @return 0: SUCCESS / others: FAILED /// -Status MultiBatchClonePass::UpdateShapeToData(const NodePtr &data, size_t index) { +Status MultiBatchClonePass::UpdateSubgraphData(const NodePtr &data, size_t index) { + int node_index = -1; + if (!AttrUtils::GetInt(data->GetOpDesc(), ATTR_NAME_INDEX, node_index)) { + GELOGE(FAILED, "Failed to get index from data[%s]", data->GetName().c_str()); + return FAILED; + } + + int parent_index = node_index + 1; + if (!AttrUtils::SetInt(data->GetOpDesc(), ATTR_NAME_PARENT_NODE_INDEX, parent_index)) { + GELOGE(FAILED, "Failed to set parent index for node %s", data->GetName().c_str()); + return FAILED; + } + auto data_shape = NodeUtils::GetOutputDesc(*data, kDataOutIndex).GetShape(); const auto &dims = data_shape.GetDims(); if (std::all_of(dims.begin(), dims.end(), [](int64_t val) { return val >= 0; })) { @@ -581,13 +593,15 @@ Status MultiBatchClonePass::CreateSubgraphs(const ComputeGraphPtr &graph, const (void)AttrUtils::SetBool(subgraph, "_no_reset_name", true); graph->AddSubgraph(subgraph->GetName(), subgraph); all_branch_output_[subgraph] = subgraph->FindFirstNodeMatchType(NETOUTPUT); + GE_CHK_STATUS_RET(UpdateSubgraphOutput(all_branch_output_[subgraph]), + "Update %s failed", all_branch_output_[subgraph]->GetName().c_str()); const string key_name = "branches" + std::to_string(i); op_desc->AddSubgraphName(key_name); op_desc->SetSubgraphInstanceName(i, subgraph->GetName()); for (const auto &data : input_nodes) { - GE_CHK_STATUS_RET(UpdateShapeToData(data, i), "Update %s failed", subgraph->GetName().c_str()); + GE_CHK_STATUS_RET(UpdateSubgraphData(data, i), "Update %s failed", subgraph->GetName().c_str()); } } @@ -596,7 +610,28 @@ Status MultiBatchClonePass::CreateSubgraphs(const ComputeGraphPtr &graph, const const auto &op_desc = n->GetOpDesc(); op_desc->SetName(n->GetName() + kMultiBatchNodePostfix + "0"); if (n->GetType() == DATA) { - GE_CHK_STATUS_RET(UpdateShapeToData(n, 0), "Update %s failed", branch->GetName().c_str()); + GE_CHK_STATUS_RET(UpdateSubgraphData(n, 0), "Update %s failed", branch->GetName().c_str()); + } + } + + return SUCCESS; +} + +/// +/// @ingroup ge +/// @brief Update output_node in Subgraph. +/// @param [in] const NodePtr &data: output_node in Subgraph. +/// @return 0: SUCCESS / others: FAILED +/// +Status MultiBatchClonePass::UpdateSubgraphOutput(const NodePtr &output_node) { + const auto &op_desc = output_node->GetOpDesc(); + GE_CHECK_NOTNULL(op_desc); + for (size_t index = 0; index < op_desc->GetInputsSize(); ++index) { + GeTensorDescPtr tensor = op_desc->MutableInputDesc(index); + GE_CHECK_NOTNULL(tensor); + if (!AttrUtils::SetInt(tensor, ATTR_NAME_PARENT_NODE_INDEX, index)) { + GELOGE(FAILED, "Failed to set parent index for node %s", output_node->GetName().c_str()); + return FAILED; } } diff --git a/ge/graph/passes/multi_batch_clone_pass.h b/ge/graph/passes/multi_batch_clone_pass.h index 5921970a..3dbf91db 100755 --- a/ge/graph/passes/multi_batch_clone_pass.h +++ b/ge/graph/passes/multi_batch_clone_pass.h @@ -105,12 +105,20 @@ class MultiBatchClonePass : public GraphPass { /// /// @ingroup ge - /// @brief Set shape to Data node in branch. - /// @param [in] const NodePtr &data: data in branch. + /// @brief Update Data node in Subgraph. + /// @param [in] const NodePtr &data: data in Subgraph. /// @param [in] size_t index: The batch index. /// @return 0: SUCCESS / others: FAILED /// - Status UpdateShapeToData(const NodePtr &data, size_t index); + Status UpdateSubgraphData(const NodePtr &data, size_t index); + + /// + /// @ingroup ge + /// @brief Update output_node in Subgraph. + /// @param [in] const NodePtr &data: output_node in Subgraph. + /// @return 0: SUCCESS / others: FAILED + /// + Status UpdateSubgraphOutput(const NodePtr &output_node); /// /// @ingroup ge diff --git a/ge/graph/preprocess/multi_batch_copy_graph.cc b/ge/graph/preprocess/multi_batch_copy_graph.cc index eae97b04..c8880b2e 100644 --- a/ge/graph/preprocess/multi_batch_copy_graph.cc +++ b/ge/graph/preprocess/multi_batch_copy_graph.cc @@ -29,7 +29,6 @@ #include "framework/omg/omg_inner_types.h" #include "graph/debug/ge_attr_define.h" #include "graph/ge_context.h" -#include "graph/passes/data_pass.h" #include "graph/passes/multi_batch_clone_pass.h" #include "graph/passes/prune_pass.h" #include "graph/preprocess/multi_batch_options.h" @@ -1698,7 +1697,6 @@ Status ProcessMultiBatch(ComputeGraphPtr &graph) { if (multi_batch_with_switchn == nullptr) { PassManager pass_manager; GE_CHK_STATUS_RET(pass_manager.AddPass("MultiBatchClonePass", new (std::nothrow) MultiBatchClonePass)); - GE_CHK_STATUS_RET(pass_manager.AddPass("DataPass", new (std::nothrow) DataPass)); // set subgraph parent index return pass_manager.Run(graph); } } From df8f69cb418c58dfb074fa78dbdadf4940a0ddfe Mon Sep 17 00:00:00 2001 From: wjm Date: Fri, 25 Dec 2020 11:44:11 +0800 Subject: [PATCH 21/22] fix --- ge/graph/passes/multi_batch_clone_pass.cc | 3 +-- ge/graph/passes/multi_batch_clone_pass.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ge/graph/passes/multi_batch_clone_pass.cc b/ge/graph/passes/multi_batch_clone_pass.cc index 37f4b637..872f94fb 100755 --- a/ge/graph/passes/multi_batch_clone_pass.cc +++ b/ge/graph/passes/multi_batch_clone_pass.cc @@ -590,7 +590,6 @@ Status MultiBatchClonePass::CreateSubgraphs(const ComputeGraphPtr &graph, const subgraph->SetName("Batch_" + std::to_string(i)); subgraph->SetParentNode(case_node_); subgraph->SetParentGraph(graph); - (void)AttrUtils::SetBool(subgraph, "_no_reset_name", true); graph->AddSubgraph(subgraph->GetName(), subgraph); all_branch_output_[subgraph] = subgraph->FindFirstNodeMatchType(NETOUTPUT); GE_CHK_STATUS_RET(UpdateSubgraphOutput(all_branch_output_[subgraph]), @@ -620,7 +619,7 @@ Status MultiBatchClonePass::CreateSubgraphs(const ComputeGraphPtr &graph, const /// /// @ingroup ge /// @brief Update output_node in Subgraph. -/// @param [in] const NodePtr &data: output_node in Subgraph. +/// @param [in] const NodePtr &output_node: output_node in Subgraph. /// @return 0: SUCCESS / others: FAILED /// Status MultiBatchClonePass::UpdateSubgraphOutput(const NodePtr &output_node) { diff --git a/ge/graph/passes/multi_batch_clone_pass.h b/ge/graph/passes/multi_batch_clone_pass.h index 3dbf91db..ee137b5a 100755 --- a/ge/graph/passes/multi_batch_clone_pass.h +++ b/ge/graph/passes/multi_batch_clone_pass.h @@ -115,7 +115,7 @@ class MultiBatchClonePass : public GraphPass { /// /// @ingroup ge /// @brief Update output_node in Subgraph. - /// @param [in] const NodePtr &data: output_node in Subgraph. + /// @param [in] const NodePtr &output_node: output_node in Subgraph. /// @return 0: SUCCESS / others: FAILED /// Status UpdateSubgraphOutput(const NodePtr &output_node); From 325c1abd5b660d9d36c93b5be9db2ebb5d6efc8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=AC=91=E5=A4=A9?= Date: Fri, 25 Dec 2020 16:53:56 +0800 Subject: [PATCH 22/22] =?UTF-8?q?!731=20revert=20*=20=E5=9B=9E=E9=80=80=20?= =?UTF-8?q?'Pull=20Request=20!703=20:=20TaskInfo=20release=20OpDesc=20afte?= =?UTF-8?q?r=20distribute.'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../load/new_model_manager/davinci_model.cc | 2 - .../load/new_model_manager/davinci_model.h | 31 +--- .../task_info/hccl_task_info.cc | 56 +++---- .../task_info/hccl_task_info.h | 6 +- .../task_info/kernel_ex_task_info.cc | 45 +++--- .../task_info/kernel_ex_task_info.h | 3 +- .../task_info/kernel_task_info.cc | 137 ++++++++---------- .../task_info/kernel_task_info.h | 26 +++- .../task_info/memcpy_async_task_info.cc | 52 ++++--- .../task_info/memcpy_async_task_info.h | 3 +- 10 files changed, 178 insertions(+), 183 deletions(-) diff --git a/ge/graph/load/new_model_manager/davinci_model.cc b/ge/graph/load/new_model_manager/davinci_model.cc index 93f4624e..f2bf0aea 100755 --- a/ge/graph/load/new_model_manager/davinci_model.cc +++ b/ge/graph/load/new_model_manager/davinci_model.cc @@ -139,7 +139,6 @@ DavinciModel::DavinciModel(int32_t priority, const std::shared_ptr kernel_list; - std::vector arg_list; - std::vector dump_flag_list; - std::vector op_desc_list; - std::vector dump_args_list; - uint32_t last_dump_flag; - int64_t last_group_key; - uintptr_t last_dump_args; - OpDescPtr last_op; -}; - struct TaskMemInfo { int64_t input_size{0}; int64_t output_size{0}; @@ -223,14 +204,13 @@ class DavinciModel { // get total mem size size_t TotalMemSize() const { return runtime_param_.mem_size; } - const std::map &P2PMemInfos() const { return runtime_param_.memory_infos; } + const std::map &P2PMemInfos() const {return runtime_param_.memory_infos;} // model name string Name() const { return name_; } // om_name string OmName() const { return om_name_; } - // version uint32_t Version() const { return version_; } @@ -275,16 +255,12 @@ class DavinciModel { } return nullptr; } - // get task info for profiling const std::vector &GetTaskDescInfo() const { return task_desc_info_; } // get updated task info list std::vector GetTaskList() { return task_list_; } - // Modified from KernelTaskInfo. - SuperKernelTaskInfo &GetSuperKernelTaskInfo() { return skt_info_; } - /// /// @ingroup ge /// @brief get model input and output format @@ -634,7 +610,7 @@ class DavinciModel { uint8_t *MallocWeightsMem(size_t weights_size); - uint8_t *MallocP2PMem(size_t p2p_data_size); + uint8_t* MallocP2PMem(size_t p2p_data_size); void FreeFeatureMapMem(); @@ -1020,9 +996,6 @@ class DavinciModel { std::multimap op_id_map_; std::vector profile_list_; - - // For super kernel. - SuperKernelTaskInfo skt_info_; }; } // namespace ge #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_DAVINCI_MODEL_H_ diff --git a/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc b/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc index 2d476662..4fb64aab 100644 --- a/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/hccl_task_info.cc @@ -59,40 +59,40 @@ Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_m GELOGI("HcclTaskInfo Init, op_index is: %u", op_index); // Get HCCL op - const auto op_desc = davinci_model_->GetOpByIndex(op_index); - GE_CHECK_NOTNULL(op_desc); + op_desc_ = davinci_model->GetOpByIndex(op_index); + GE_CHECK_NOTNULL(op_desc_); // Create the kernel hccl infos - CreateKernelHcclInfo(op_desc); + CreateKernelHcclInfo(op_desc_); // Initialize the hccl_type of all kernel hccl info HcomOmeUtil::GetHcclType(task_def, kernel_hccl_infos_); // Only in Horovod scenario should get the inputName and GeShape - ret = HcomOmeUtil::GetHorovodInputs(op_desc, kernel_hccl_infos_); + ret = HcomOmeUtil::GetHorovodInputs(op_desc_, kernel_hccl_infos_); if (ret != SUCCESS) { GELOGE(ret, "davinci_model: GetHorovodInputs fail! domi error: %u", ret); return ret; } - Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc, kernel_hccl_infos_); + Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc_, kernel_hccl_infos_); if (dmrt != SUCCESS) { GELOGE(dmrt, "davinci_model: GetHcomDataType fail! domi error: %u", dmrt); return dmrt; } - dmrt = HcomOmeUtil::GetHcclCount(op_desc, kernel_hccl_infos_); + dmrt = HcomOmeUtil::GetHcclCount(op_desc_, kernel_hccl_infos_); if (dmrt != SUCCESS) { GELOGE(dmrt, "davinci_model: GetHcomCount fail! domi error: %u", dmrt); return dmrt; } // Only HCOMBROADCAST and HVDCALLBACKBROADCAST need to get the rootId - dmrt = HcomOmeUtil::GetAllRootId(op_desc, kernel_hccl_infos_); + dmrt = HcomOmeUtil::GetAllRootId(op_desc_, kernel_hccl_infos_); if (dmrt != SUCCESS) { GELOGE(dmrt, "davinci_model: Get rootId fail! domi error: %u", dmrt); return dmrt; } // GE's new process: hccl declares the number of streams required, creates a stream by GE, and sends it to hccl - ret = SetFollowStream(op_desc, davinci_model); + ret = SetFollowStream(op_desc_, davinci_model); if (ret != SUCCESS) { GELOGE(ret, "SetStream Fail."); return ret; @@ -100,28 +100,21 @@ Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_m if (davinci_model_->IsKnownNode()) { args_ = davinci_model_->GetCurrentArgsAddr(args_offset_); - GELOGI("Known node %s args addr %p, offset %u.", op_desc->GetName().c_str(), args_, args_offset_); + GELOGI("Known node %s args addr %p, offset %u.", op_desc_->GetName().c_str(), args_, args_offset_); } - ret = SetAddrs(op_desc, kernel_hccl_infos_); + ret = SetAddrs(op_desc_, kernel_hccl_infos_); if (ret != SUCCESS) { GELOGE(ret, "Setaddrs Fail."); return ret; } // GE's new process: hccl declares the need for Workspace size, and GE allocates Workspace - ret = SetWorkspace(op_desc, kernel_hccl_infos_); + ret = SetWorkspace(op_desc_, kernel_hccl_infos_); if (ret != SUCCESS) { GELOGE(ret, "SetWorkspace Fail."); return ret; } - const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - const auto input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc); - const auto output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc); - const auto workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc); - io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); - io_addrs_.insert(io_addrs_.end(), output_data_addrs.begin(), output_data_addrs.end()); - io_addrs_.insert(io_addrs_.end(), workspace_data_addrs.begin(), workspace_data_addrs.end()); GELOGI("HcclTaskInfo Init Success"); return SUCCESS; } @@ -238,7 +231,18 @@ Status HcclTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciModel * Status HcclTaskInfo::UpdateArgs() { GELOGI("HcclTaskInfo::UpdateArgs in."); - davinci_model_->SetTotalIOAddrs(io_addrs_); + const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); + input_data_addrs_ = ModelUtils::GetInputDataAddrs(rts_param, op_desc_); + output_data_addrs_ = ModelUtils::GetOutputDataAddrs(rts_param, op_desc_); + workspace_data_addrs_ = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc_); + + vector io_addrs; + io_addrs.insert(io_addrs.end(), input_data_addrs_.begin(), input_data_addrs_.end()); + io_addrs.insert(io_addrs.end(), output_data_addrs_.begin(), output_data_addrs_.end()); + io_addrs.insert(io_addrs.end(), workspace_data_addrs_.begin(), workspace_data_addrs_.end()); + + davinci_model_->SetTotalIOAddrs(io_addrs); + GELOGI("HcclTaskInfo::UpdateArgs success."); return SUCCESS; } @@ -257,11 +261,9 @@ Status HcclTaskInfo::SetAddrs(const std::shared_ptr &op_desc, HcclReduceOp op_type = HCCL_REDUCE_SUM; GE_CHECK_NOTNULL(davinci_model_); GELOGI("Calc opType[%s] input address before. Node name[%s]", op_desc->GetType().c_str(), op_desc->GetName().c_str()); - vector input_data_addrs; - vector output_data_addrs; if (!davinci_model_->IsKnownNode()) { - input_data_addrs = ModelUtils::GetInputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); - output_data_addrs = ModelUtils::GetOutputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); + input_data_addrs_ = ModelUtils::GetInputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); + output_data_addrs_ = ModelUtils::GetOutputDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); } void *input_data_addr = nullptr; void *output_data_addr = nullptr; @@ -273,8 +275,8 @@ Status HcclTaskInfo::SetAddrs(const std::shared_ptr &op_desc, output_data_addr = reinterpret_cast(reinterpret_cast(args_) + op_desc->GetInputsSize() + i); GELOGI("Hccl task info known input addr %p, output addr %p.", input_data_addr, output_data_addr); } else { - input_data_addr = input_data_addrs.empty() ? nullptr : input_data_addrs[i]; - output_data_addr = output_data_addrs.empty() ? nullptr : output_data_addrs[i]; + input_data_addr = input_data_addrs_.empty() ? nullptr : input_data_addrs_[i]; + output_data_addr = output_data_addrs_.empty() ? nullptr : output_data_addrs_[i]; } kernel_hccl_infos[i].inputDataAddr = input_data_addr; if (hccl_type == HCOMALLGATHER || hccl_type == HCOMRECEIVE || hccl_type == HVDCALLBACKALLGATHER) { @@ -364,8 +366,8 @@ Status HcclTaskInfo::SetWorkspace(const std::shared_ptr &op_desc, workspace_addr = reinterpret_cast(reinterpret_cast(args_) + op_desc->GetInputsSize() + op_desc->GetOutputsSize()); } else { - const auto workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); - workspace_addr = workspace_data_addrs.empty() ? nullptr : workspace_data_addrs[0]; + workspace_data_addrs_ = ModelUtils::GetWorkspaceDataAddrs(davinci_model_->GetRuntimeParam(), op_desc); + workspace_addr = workspace_data_addrs_.empty() ? nullptr : workspace_data_addrs_[0]; } } } diff --git a/ge/graph/load/new_model_manager/task_info/hccl_task_info.h b/ge/graph/load/new_model_manager/task_info/hccl_task_info.h index 5498cf6c..f7ce3468 100644 --- a/ge/graph/load/new_model_manager/task_info/hccl_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/hccl_task_info.h @@ -35,6 +35,7 @@ class HcclTaskInfo : public TaskInfo { ops_kernel_store_(nullptr), private_def_(nullptr), private_def_len_(0), + op_desc_(nullptr), args_(nullptr), args_offset_(0) {} @@ -75,7 +76,10 @@ class HcclTaskInfo : public TaskInfo { uint32_t private_def_len_; static std::mutex hccl_follow_stream_mutex_; vector kernel_hccl_infos_; - vector io_addrs_; + vector input_data_addrs_; + vector output_data_addrs_; + vector workspace_data_addrs_; + OpDescPtr op_desc_; void *args_; uint32_t args_offset_; }; diff --git a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc index 944423ab..e5574e47 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.cc @@ -30,7 +30,11 @@ namespace ge { Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { GELOGI("KernelExTaskInfo Init Start."); - GE_CHECK_NOTNULL(davinci_model); + if (davinci_model == nullptr) { + GELOGE(PARAM_INVALID, "davinci_model is null!"); + return PARAM_INVALID; + } + davinci_model_ = davinci_model; Status ret = SetStream(task_def.stream_id(), davinci_model_->GetStreamList()); if (ret != SUCCESS) { @@ -47,6 +51,7 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin GELOGE(INTERNAL_ERROR, "Init aicpu task info error, index is out of range!"); return INTERNAL_ERROR; } + op_desc_ = op_desc; // 2. Reconstruct kernelExDef.args to STR_FWK_OP_KERNEL STR_FWK_OP_KERNEL fwk_op_kernel = {0}; @@ -74,8 +79,8 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin return RT_ERROR_TO_GE_STATUS(rt_ret);) } - GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, ext_info_addr_=%p", op_desc->GetName().c_str(), - op_desc->GetType().c_str(), ext_info.size(), ext_info_addr_); + GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, ext_info_addr_=%p", op_desc_->GetName().c_str(), + op_desc_->GetType().c_str(), ext_info.size(), ext_info_addr_); // 2.1 get loop cond variable for tensor array write uint64_t step_id_addr = 0; @@ -128,7 +133,7 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin return RT_ERROR_TO_GE_STATUS(rt_ret);) GELOGI("KernelExTaskInfo knonw node Init Success."); - return SetIoAddrs(op_desc); + return SUCCESS; } // 3. Set workspaceaddr, inputOutputDataAddr @@ -192,7 +197,7 @@ Status KernelExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin davinci_model_->SetZeroCopyAddr(op_desc, io_addrs, io_addrs.data(), input_output_addr_, addrs_size, 0); GELOGI("KernelExTaskInfo Init Success. session id: %lu", session_id); - return SetIoAddrs(op_desc); + return SUCCESS; } Status KernelExTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciModel *davinci_model) { @@ -231,40 +236,36 @@ Status KernelExTaskInfo::CalculateArgs(const domi::TaskDef &task_def, DavinciMod return SUCCESS; } -Status KernelExTaskInfo::SetIoAddrs(const OpDescPtr &op_desc) { +Status KernelExTaskInfo::UpdateArgs() { + GELOGI("KernelExTaskInfo::UpdateArgs in."); const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc); - vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc); - if (!op_desc->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { - io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); - io_addrs_.insert(io_addrs_.end(), output_data_addrs.begin(), output_data_addrs.end()); + vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc_); + vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc_); + vector io_addrs; + if (!op_desc_->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { + io_addrs.insert(io_addrs.end(), input_data_addrs.begin(), input_data_addrs.end()); + io_addrs.insert(io_addrs.end(), output_data_addrs.begin(), output_data_addrs.end()); } else { string peer_input_name; - if (AttrUtils::GetStr(op_desc, ATTR_DYNAMIC_SHAPE_FIXED_ADDR, peer_input_name)) { + if (AttrUtils::GetStr(op_desc_, ATTR_DYNAMIC_SHAPE_FIXED_ADDR, peer_input_name)) { uint32_t output_index = davinci_model_->GetFixedAddrOutputIndex(peer_input_name); if (output_index > output_data_addrs.size()) { GELOGE(FAILED, "The output data addr size[%zu] and output index[%u] are inconsistent.", output_data_addrs.size(), output_index); return FAILED; } - io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); + io_addrs.insert(io_addrs.end(), input_data_addrs.begin(), input_data_addrs.end()); for (size_t i = 0; i < output_data_addrs.size(); ++i) { if (i == output_index) { void *fixed_addr = davinci_model_->GetCurrentFixedAddr(fixed_addr_offset_); - io_addrs_.emplace_back(fixed_addr); + io_addrs.emplace_back(fixed_addr); continue; } - io_addrs_.emplace_back(output_data_addrs[i]); + io_addrs.emplace_back(output_data_addrs[i]); } } } - - return SUCCESS; -} - -Status KernelExTaskInfo::UpdateArgs() { - GELOGI("KernelExTaskInfo::UpdateArgs in."); - davinci_model_->SetTotalIOAddrs(io_addrs_); + davinci_model_->SetTotalIOAddrs(io_addrs); GELOGI("KernelExTaskInfo::UpdateArgs success."); return SUCCESS; } diff --git a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h index cb7647dc..e4d3e6fd 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/kernel_ex_task_info.h @@ -59,7 +59,6 @@ class KernelExTaskInfo : public TaskInfo { }; private: Status CopyTaskInfo(const domi::KernelExDef &kernel_def, const RuntimeParam &rts_param, const OpDescPtr &op_desc); - Status SetIoAddrs(const OpDescPtr &op_desc); uint32_t task_id_; uint32_t stream_id_; @@ -70,7 +69,7 @@ class KernelExTaskInfo : public TaskInfo { void *input_output_addr_; void *ext_info_addr_; void *dump_args_; - vector io_addrs_; + OpDescPtr op_desc_ = nullptr; uint32_t args_offset_ = 0; int64_t fixed_addr_offset_ = 0; }; diff --git a/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc b/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc index 1906a0c9..ce31ef30 100755 --- a/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/kernel_task_info.cc @@ -53,6 +53,9 @@ const int kArgsAttrHandle = 4; } // namespace namespace ge { +KernelTaskInfo::SuperKernelTaskInfo KernelTaskInfo::skt_info_ = { + 0, 0, 0, 0, nullptr, nullptr, {}, {}, {}, {}, {}, RT_KERNEL_DEFAULT, kInvalidGroupKey, 0, nullptr}; + Status KernelTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { GE_CHECK_NOTNULL(davinci_model); davinci_model_ = davinci_model; @@ -134,7 +137,6 @@ Status KernelTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci ret = InitCceTask(kernel_def); } - SetIoAddrs(op_desc_); GELOGD("KernelTaskInfo init finish, result=%u.", ret); return ret; } @@ -146,10 +148,9 @@ Status KernelTaskInfo::SaveSKTDumpInfo() { return SUCCESS; } // all op in super kernel share one taskid and streamid - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); - for (size_t i = 0; i < skt_info.op_desc_list.size(); i++) { - davinci_model_->SaveDumpTask(skt_info.last_task_id, skt_info.last_stream_id, skt_info.op_desc_list[i], - skt_info.dump_args_list[i]); + for (size_t i = 0; i < skt_info_.op_desc_list.size(); i++) { + davinci_model_->SaveDumpTask(skt_info_.last_task_id, skt_info_.last_stream_id, skt_info_.op_desc_list[i], + skt_info_.dump_args_list[i]); } return SUCCESS; } @@ -163,10 +164,9 @@ void KernelTaskInfo::UpdateSKTTaskId() { GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); return; } - SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); - skt_info.last_task_id = task_id; - skt_info.last_stream_id = stream_id; - skt_id_ = skt_info.last_task_id; + skt_info_.last_task_id = task_id; + skt_info_.last_stream_id = stream_id; + skt_id_ = skt_info_.last_task_id; GELOGI("UpdateTaskId:UpdateSKTTaskId [%u],stream id [%u]", task_id, stream_id); } @@ -191,25 +191,23 @@ Status KernelTaskInfo::SKTFinalize() { UpdateSKTTaskId(); GE_CHK_STATUS_RET(SaveSKTDumpInfo(), "skt save dump info failed"); GELOGI("SuperKernel Distribute [skt_id:%u]", skt_id_); - SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); - skt_info.kernel_list.clear(); - skt_info.arg_list.clear(); - skt_info.dump_flag_list.clear(); - skt_info.op_desc_list.clear(); - skt_info.dump_args_list.clear(); - skt_info.last_stream = nullptr; - skt_info.last_block_dim = 0; - skt_info.last_sm_desc = sm_desc_; - skt_info.last_group_key = kInvalidGroupKey; - skt_info.last_dump_flag = RT_KERNEL_DEFAULT; - skt_info.last_dump_args = 0; - skt_info.last_op = nullptr; + skt_info_.kernel_list.clear(); + skt_info_.arg_list.clear(); + skt_info_.dump_flag_list.clear(); + skt_info_.op_desc_list.clear(); + skt_info_.dump_args_list.clear(); + skt_info_.last_stream = nullptr; + skt_info_.last_block_dim = 0; + skt_info_.last_sm_desc = sm_desc_; + skt_info_.last_group_key = kInvalidGroupKey; + skt_info_.last_dump_flag = RT_KERNEL_DEFAULT; + skt_info_.last_dump_args = 0; + skt_info_.last_op = nullptr; return SUCCESS; } uint32_t KernelTaskInfo::GetDumpFlag() { - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); - for (auto flag : skt_info.dump_flag_list) { + for (auto flag : skt_info_.dump_flag_list) { if (flag == RT_KERNEL_DUMPFLAG) { return RT_KERNEL_DUMPFLAG; } @@ -218,20 +216,19 @@ uint32_t KernelTaskInfo::GetDumpFlag() { } Status KernelTaskInfo::SuperKernelLaunch() { - SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); - if (skt_info.kernel_list.empty()) { + if (skt_info_.kernel_list.empty()) { GELOGI("SuperKernelLaunch: Skt_kernel_list has no task, just return"); return SUCCESS; } rtError_t rt_ret; - auto &skt_kernel_list = skt_info.kernel_list; - auto &skt_arg_list = skt_info.arg_list; + auto &skt_kernel_list = skt_info_.kernel_list; + auto &skt_arg_list = skt_info_.arg_list; GELOGI("SuperKernelLaunch: Skt_kernel_list size[%zu] skt_arg_list[%zu]", skt_kernel_list.size(), skt_arg_list.size()); if (skt_kernel_list.size() == kSKTSingleSize && skt_arg_list.size() == kSKTSingleSize) { - rt_ret = rtKernelLaunchWithFlag(skt_info.kernel_list[0], static_cast(skt_info.last_block_dim), - skt_info.arg_list[0], skt_info.last_args_size, - static_cast(skt_info.last_sm_desc), skt_info.last_stream, - skt_info.last_dump_flag); + rt_ret = rtKernelLaunchWithFlag(skt_info_.kernel_list[0], static_cast(skt_info_.last_block_dim), + skt_info_.arg_list[0], skt_info_.last_args_size, + static_cast(skt_info_.last_sm_desc), skt_info_.last_stream, + skt_info_.last_dump_flag); if (rt_ret != RT_ERROR_NONE) { GELOGE(RT_FAILED, "SuperKernelLaunch: Call rt api failed, ret: 0x%X", rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret); @@ -250,14 +247,14 @@ Status KernelTaskInfo::SuperKernelLaunch() { } // Call the fuse API std::unique_ptr superKernel = nullptr; - ge_ret = factory->FuseKernels(skt_kernel_list, skt_arg_list, skt_info.last_block_dim, superKernel); + ge_ret = factory->FuseKernels(skt_kernel_list, skt_arg_list, skt_info_.last_block_dim, superKernel); if (ge_ret != SUCCESS) { GELOGE(ge_ret, "SuperKernelLaunch: fuse call failed"); return ge_ret; } // Launch a super kernel skt_dump_flag_ = GetDumpFlag(); - ge_ret = superKernel->Launch(skt_info.last_stream, skt_dump_flag_); + ge_ret = superKernel->Launch(skt_info_.last_stream, skt_dump_flag_); if (ge_ret != SUCCESS) { GELOGE(ge_ret, "SuperKernelLaunch: launch failed"); return ge_ret; @@ -272,26 +269,23 @@ Status KernelTaskInfo::SuperKernelLaunch() { } Status KernelTaskInfo::SaveSuperKernelInfo() { - SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); - skt_info.kernel_list.push_back(stub_func_); - skt_info.arg_list.push_back(args_); - skt_info.last_stream = stream_; - skt_info.last_block_dim = block_dim_; - skt_info.last_args_size = args_size_; - skt_info.last_sm_desc = sm_desc_; - skt_info.last_dump_flag = dump_flag_; - skt_info.dump_flag_list.push_back(dump_flag_); - skt_info.op_desc_list.push_back(op_desc_); - skt_info.dump_args_list.push_back(reinterpret_cast(skt_dump_args_)); - skt_info.last_group_key = group_key_; - skt_info.last_dump_args = reinterpret_cast(skt_dump_args_); - skt_info.last_op = op_desc_; + skt_info_.kernel_list.push_back(stub_func_); + skt_info_.arg_list.push_back(args_); + skt_info_.last_stream = stream_; + skt_info_.last_block_dim = block_dim_; + skt_info_.last_args_size = args_size_; + skt_info_.last_sm_desc = sm_desc_; + skt_info_.last_dump_flag = dump_flag_; + skt_info_.dump_flag_list.push_back(dump_flag_); + skt_info_.op_desc_list.push_back(op_desc_); + skt_info_.dump_args_list.push_back(reinterpret_cast(skt_dump_args_)); + skt_info_.last_group_key = group_key_; + skt_info_.last_dump_args = reinterpret_cast(skt_dump_args_); + skt_info_.last_op = op_desc_; // last node in a stream, just launch if (IsMarkedLastNode()) { return SuperKernelLaunch(); } - - GELOGI("Save Current task [block_dim:%u, size:%zu].", block_dim_, skt_info.kernel_list.size()); return SUCCESS; } @@ -328,9 +322,8 @@ bool KernelTaskInfo::IsMarkedFirstNode() { // then may be saved to skt task list; else // call skt launch those saved tasks before bool KernelTaskInfo::FirstCallSKTLaunchCheck() { - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); - return ((block_dim_ != skt_info.last_block_dim) || (stream_ != skt_info.last_stream) || - (has_group_key_ && (group_key_ != skt_info.last_group_key))); + return ((block_dim_ != skt_info_.last_block_dim) || (stream_ != skt_info_.last_stream) || + (has_group_key_ && (group_key_ != skt_info_.last_group_key))); } // current task has group_id or has n ATTR_N_BATCH_SPLIT then save it to skt task list; else @@ -369,6 +362,7 @@ Status KernelTaskInfo::SuperKernelDistribute() { GELOGE(ret, "Call SuperKernelLaunch failed!"); return ret; } + GELOGI("Save Current task [block_dim:%u, size:%zu].", block_dim_, skt_info_.kernel_list.size()); } return SUCCESS; } @@ -397,11 +391,10 @@ Status KernelTaskInfo::Distribute() { call_save_dump_ = true; } else { /* default: not skt launch */ - const SuperKernelTaskInfo &skt_info = davinci_model_->GetSuperKernelTaskInfo(); GELOGD( "KernelTaskInfo Distribute Start, sktenable:%d taskid:%u sktid:%u last_sktid:%u stubfunc_name:%s " "stubfunc:%p blockdim:%u stream:%p", - call_skt, task_id_, skt_id_, skt_info.last_task_id, stub_func_name_.c_str(), stub_func_, block_dim_, stream_); + call_skt, task_id_, skt_id_, skt_info_.last_task_id, stub_func_name_.c_str(), stub_func_, block_dim_, stream_); // l1 fusion enable and env flag open (kCloseSkt for skt debug) bool open_dump = false; auto all_dump_model = davinci_model_->GetDumpProperties().GetAllDumpModel(); @@ -429,30 +422,23 @@ Status KernelTaskInfo::Distribute() { "KernelTaskInfo Distribute Success. sktenable:%d taskid:%d sktid:%d stubfunc_name:%s stubfunc:%p " "blockdim:%d stream:%p", call_skt, task_id_, skt_id_, stub_func_name_.c_str(), stub_func_, block_dim_, stream_); - op_desc_.reset(); // Not hold OpDesc after distribute. return SUCCESS; } -void KernelTaskInfo::SetIoAddrs(const OpDescPtr &op_desc) { - const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc); - vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc); - - io_addrs_.insert(io_addrs_.end(), input_data_addrs.begin(), input_data_addrs.end()); - io_addrs_.insert(io_addrs_.end(), output_data_addrs.begin(), output_data_addrs.end()); - if (kernel_type_ == ccKernelType::TE) { - vector workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc); - io_addrs_.insert(io_addrs_.end(), workspace_data_addrs.begin(), workspace_data_addrs.end()); - } -} - Status KernelTaskInfo::UpdateArgs() { GELOGI("KernelTaskInfo::UpdateArgs in."); + const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); + vector input_data_addrs = ModelUtils::GetInputDataAddrs(rts_param, op_desc_); + vector output_data_addrs = ModelUtils::GetOutputDataAddrs(rts_param, op_desc_); + vector io_addrs; + io_addrs.insert(io_addrs.end(), input_data_addrs.begin(), input_data_addrs.end()); + io_addrs.insert(io_addrs.end(), output_data_addrs.begin(), output_data_addrs.end()); if (kernel_type_ == ccKernelType::TE) { - davinci_model_->SetTotalIOAddrs(io_addrs_); + vector workspace_data_addrs = ModelUtils::GetWorkspaceDataAddrs(rts_param, op_desc_); + io_addrs.insert(io_addrs.end(), workspace_data_addrs.begin(), workspace_data_addrs.end()); + davinci_model_->SetTotalIOAddrs(io_addrs); } else if (kernel_type_ == ccKernelType::AI_CPU || kernel_type_ == ccKernelType::CUST_AI_CPU) { - vector io_addrs = io_addrs_; davinci_model_->UpdateKnownZeroCopyAddr(io_addrs); uintptr_t io_addr = reinterpret_cast(args_addr.get()) + sizeof(aicpu::AicpuParamHead); auto addrs_size = sizeof(uint64_t) * io_addrs.size(); @@ -803,6 +789,7 @@ Status KernelTaskInfo::InitCceTask(const domi::KernelDef &kernel_def) { GELOGE(FAILED, "flowtable is null."); return FAILED; } + flowtable_size_ = flowtable.size(); } // get smDesc stored in model @@ -867,14 +854,14 @@ Status KernelTaskInfo::InitAicpuTask(uint32_t op_index, const domi::KernelDef &k GELOGI("Do InitAicpuTask"); so_name_ = kernel_def.so_name(); kernel_name_ = kernel_def.kernel_name(); + GELOGI("node[%s] test so name %s, kernel name %s", op_desc_->GetName().c_str(), so_name_.c_str(), + kernel_name_.c_str()); OpDescPtr op_desc = davinci_model_->GetOpByIndex(op_index); if (op_desc == nullptr) { GELOGE(INTERNAL_ERROR, "index is out of range, index: %u", op_index); return INTERNAL_ERROR; } - GELOGI("node[%s] test so name %s, kernel name %s", op_desc->GetName().c_str(), so_name_.c_str(), - kernel_name_.c_str()); if (kernel_type_ == ccKernelType::CUST_AI_CPU) { bool loaded = false; @@ -898,8 +885,8 @@ Status KernelTaskInfo::InitAicpuTask(uint32_t op_index, const domi::KernelDef &k GELOGE(init_ret, "Init aicpu task ext info failed, ext_info size=%zu", ext_info.size()); return init_ret; } - GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, aicpu_ext_info_addr_=%p", op_desc->GetName().c_str(), - op_desc->GetType().c_str(), ext_info.size(), aicpu_ext_info_addr_); + GELOGI("Node[%s] type[%s] kernel_ext_info size=%zu, aicpu_ext_info_addr_=%p", op_desc_->GetName().c_str(), + op_desc_->GetType().c_str(), ext_info.size(), aicpu_ext_info_addr_); aicpu_param_head->extInfoAddr = reinterpret_cast(aicpu_ext_info_addr_); aicpu_param_head->extInfoLength = static_cast(ext_info.size()); diff --git a/ge/graph/load/new_model_manager/task_info/kernel_task_info.h b/ge/graph/load/new_model_manager/task_info/kernel_task_info.h index cb96797f..7717edd3 100644 --- a/ge/graph/load/new_model_manager/task_info/kernel_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/kernel_task_info.h @@ -38,6 +38,7 @@ class KernelTaskInfo : public TaskInfo { flowtable_(nullptr), block_dim_(0), args_size_(0), + flowtable_size_(0), task_id_(0), stream_id_(0), so_name_(""), @@ -45,6 +46,7 @@ class KernelTaskInfo : public TaskInfo { kernel_type_(ccKernelType::CCE_AI_CORE), dump_flag_(RT_KERNEL_DEFAULT), dump_args_(nullptr), + op_desc_(nullptr), davinci_model_(nullptr), skt_id_(0), stub_func_name_(""), @@ -126,7 +128,6 @@ class KernelTaskInfo : public TaskInfo { Status SuperKernelDistribute(); bool IsL1FusionOp(const OpDescPtr &op_desc); - void SetIoAddrs(const OpDescPtr &op_desc); // For super kernel Status SaveSKTDumpInfo(); @@ -147,6 +148,7 @@ class KernelTaskInfo : public TaskInfo { void *flowtable_; uint32_t block_dim_; uint32_t args_size_; + uint32_t flowtable_size_; uint32_t task_id_; uint32_t stream_id_; std::string so_name_; @@ -154,8 +156,7 @@ class KernelTaskInfo : public TaskInfo { ccKernelType kernel_type_; uint32_t dump_flag_; void *dump_args_; - OpDescPtr op_desc_; // Clear after distribute. - vector io_addrs_; + OpDescPtr op_desc_; DavinciModel *davinci_model_; uint32_t args_offset_ = 0; uint32_t hybrid_args_offset_ = 0; @@ -185,6 +186,25 @@ class KernelTaskInfo : public TaskInfo { void *output_addrs = nullptr; void *attr_handle = nullptr; } custom_info_; + + // For super kernel + static struct SuperKernelTaskInfo { + uint32_t last_block_dim; + uint32_t last_args_size; + uint32_t last_task_id; + uint32_t last_stream_id; + void *last_stream; + void *last_sm_desc; + std::vector kernel_list; + std::vector arg_list; + std::vector dump_flag_list; + std::vector op_desc_list; + std::vector dump_args_list; + uint32_t last_dump_flag; + int64_t last_group_key; + uintptr_t last_dump_args; + OpDescPtr last_op; + } skt_info_; }; } // namespace ge #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_KERNEL_TASK_INFO_H_ diff --git a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc index 6851b1bc..aa37dd07 100755 --- a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc +++ b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.cc @@ -30,13 +30,14 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da return ret; } - const domi::MemcpyAsyncDef &memcpy_async = task_def.memcpy_async(); - count_ = memcpy_async.count(); - kind_ = memcpy_async.kind(); - dst_max_ = memcpy_async.dst_max(); - OpDescPtr op_desc = davinci_model_->GetOpByIndex(memcpy_async.op_index()); + memcpy_async_ = task_def.memcpy_async(); + count_ = memcpy_async_.count(); + kind_ = memcpy_async_.kind(); + dst_max_ = memcpy_async_.dst_max(); + OpDescPtr op_desc = davinci_model_->GetOpByIndex(memcpy_async_.op_index()); + op_desc_ = op_desc; if (op_desc == nullptr) { - GELOGE(INTERNAL_ERROR, "Task op index:%u out of range", memcpy_async.op_index()); + GELOGE(INTERNAL_ERROR, "Task op index:%u out of range", memcpy_async_.op_index()); return INTERNAL_ERROR; } @@ -51,7 +52,7 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da } const RuntimeParam &rts_param = davinci_model_->GetRuntimeParam(); - ret = ModelUtils::GetRtAddress(rts_param, memcpy_async.src(), src_); + ret = ModelUtils::GetRtAddress(rts_param, memcpy_async_.src(), src_); if (ret != SUCCESS) { return ret; } @@ -60,32 +61,23 @@ Status MemcpyAsyncTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da vector memory_type_list; (void)AttrUtils::GetListInt(op_desc, ATTR_NAME_OUTPUT_MEM_TYPE_LIST, memory_type_list); if (!memory_type_list.empty() && memory_type_list[0] == RT_MEMORY_TS_4G) { // TS Feature, Just one. - uint64_t mem_offset = memcpy_async.dst() - rts_param.logic_mem_base; - dst_ = static_cast(rts_param.ts_mem_mall->Acquire(mem_offset, memcpy_async.dst_max())); + uint64_t mem_offset = memcpy_async_.dst() - rts_param.logic_mem_base; + dst_ = static_cast(rts_param.ts_mem_mall->Acquire(mem_offset, memcpy_async_.dst_max())); if (dst_ == nullptr) { return FAILED; } } else { - ret = ModelUtils::GetRtAddress(rts_param, memcpy_async.dst(), dst_); + ret = ModelUtils::GetRtAddress(rts_param, memcpy_async_.dst(), dst_); if (ret != SUCCESS) { return ret; } } GELOGI("MemcpyAsyncTaskInfo Init Success, logic[0x%lx, 0x%lx], src:%p, dst:%p, max:%lu, count:%lu", - memcpy_async.src(), memcpy_async.dst(), src_, dst_, dst_max_, count_); + memcpy_async_.src(), memcpy_async_.dst(), src_, dst_, dst_max_, count_); davinci_model_->DisableZeroCopy(src_); davinci_model_->DisableZeroCopy(dst_); - - io_addrs_.emplace_back(reinterpret_cast(src_)); - if (op_desc->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { - void *fixed_addr = davinci_model_->GetCurrentFixedAddr(fixed_addr_offset_); - io_addrs_.emplace_back(fixed_addr); - } else { - io_addrs_.emplace_back(reinterpret_cast(dst_)); - } - return SUCCESS; } @@ -126,7 +118,25 @@ Status MemcpyAsyncTaskInfo::CalculateArgs(const domi::TaskDef &task_def, Davinci Status MemcpyAsyncTaskInfo::UpdateArgs() { GELOGI("MemcpyAsyncTaskInfo::UpdateArgs in."); GE_CHECK_NOTNULL(davinci_model_); - davinci_model_->SetTotalIOAddrs(io_addrs_); + Status ret = ModelUtils::GetRtAddress(davinci_model_->GetRuntimeParam(), memcpy_async_.src(), src_); + if (ret != SUCCESS) { + return ret; + } + + ret = ModelUtils::GetRtAddress(davinci_model_->GetRuntimeParam(), memcpy_async_.dst(), dst_); + if (ret != SUCCESS) { + return ret; + } + + vector io_addrs; + io_addrs.emplace_back(reinterpret_cast(src_)); + if (op_desc_->HasAttr(ATTR_DYNAMIC_SHAPE_FIXED_ADDR)) { + void *fixed_addr = davinci_model_->GetCurrentFixedAddr(fixed_addr_offset_); + io_addrs.emplace_back(fixed_addr); + } else { + io_addrs.emplace_back(reinterpret_cast(dst_)); + } + davinci_model_->SetTotalIOAddrs(io_addrs); GELOGI("MemcpyAsyncTaskInfo::UpdateArgs success."); return SUCCESS; diff --git a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h index d7506840..7e74ab6f 100755 --- a/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h +++ b/ge/graph/load/new_model_manager/task_info/memcpy_async_task_info.h @@ -44,10 +44,11 @@ class MemcpyAsyncTaskInfo : public TaskInfo { uint8_t *src_; uint64_t count_; uint32_t kind_; - vector io_addrs_; + OpDescPtr op_desc_; int64_t fixed_addr_offset_; DavinciModel *davinci_model_ = nullptr; uint32_t args_offset_ = 0; + domi::MemcpyAsyncDef memcpy_async_; }; } // namespace ge #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_MEMCPY_ASYNC_TASK_INFO_H_