Browse Source

!1555 code_sync_0420

From: @ding_fei_fei
Reviewed-by: @xsmq,@liucunwei,@liucunwei
Signed-off-by: @liucunwei,@liucunwei
tags/v1.3.0
mindspore-ci-bot Gitee 4 years ago
parent
commit
8258636925
100 changed files with 4839 additions and 1123 deletions
  1. +1
    -1
      build.sh
  2. +29
    -1
      ge/CMakeLists.txt
  3. +11
    -6
      ge/analyzer/analyzer.cc
  4. +114
    -40
      ge/client/ge_api.cc
  5. +1
    -0
      ge/client/proto/insert_op.proto
  6. +3
    -2
      ge/common/CMakeLists.txt
  7. +95
    -44
      ge/common/auth/file_saver.cc
  8. +8
    -3
      ge/common/auth/file_saver.h
  9. +15
    -8
      ge/common/debug/memory_dumper.cc
  10. +1
    -1
      ge/common/dump/dump_manager.cc
  11. +36
    -7
      ge/common/dump/dump_op.cc
  12. +3
    -1
      ge/common/dump/dump_op.h
  13. +8
    -7
      ge/common/dump/dump_properties.cc
  14. +241
    -0
      ge/common/dump/exception_dumper.cc
  15. +48
    -0
      ge/common/dump/exception_dumper.h
  16. +1
    -5
      ge/common/dump/opdebug_register.cc
  17. +5
    -1
      ge/common/formats/format_transfers/datatype_transfer.cc
  18. +42
    -12
      ge/common/formats/format_transfers/format_transfer_c1hwncoc0_hwcn.cc
  19. +12
    -5
      ge/common/formats/format_transfers/format_transfer_dhwcn_fracz3D.cc
  20. +12
    -5
      ge/common/formats/format_transfers/format_transfer_dhwnc_fracz3D_transpose.cc
  21. +127
    -33
      ge/common/formats/format_transfers/format_transfer_fractal_nz.cc
  22. +201
    -22
      ge/common/formats/format_transfers/format_transfer_fractal_z.cc
  23. +133
    -34
      ge/common/formats/format_transfers/format_transfer_fractal_zz.cc
  24. +45
    -14
      ge/common/formats/format_transfers/format_transfer_fracz_hwcn.cc
  25. +52
    -15
      ge/common/formats/format_transfers/format_transfer_fracz_nchw.cc
  26. +71
    -31
      ge/common/formats/format_transfers/format_transfer_fracz_nhwc.cc
  27. +65
    -19
      ge/common/formats/format_transfers/format_transfer_hwcn_c1hwncoc0.cc
  28. +71
    -29
      ge/common/formats/format_transfers/format_transfer_nc1hwc0_nchw.cc
  29. +55
    -15
      ge/common/formats/format_transfers/format_transfer_nc1hwc0_nhwc.cc
  30. +84
    -25
      ge/common/formats/format_transfers/format_transfer_nchw_fz_c04.cc
  31. +59
    -18
      ge/common/formats/format_transfers/format_transfer_nchw_nc1hwc0.cc
  32. +66
    -18
      ge/common/formats/format_transfers/format_transfer_nhwc_nc1hwc0.cc
  33. +15
    -8
      ge/common/formats/format_transfers/format_transfer_transpose.cc
  34. +8
    -2
      ge/common/formats/formats.cc
  35. +7
    -5
      ge/common/helper/model_helper.cc
  36. +1
    -2
      ge/common/helper/om_file_helper.cc
  37. +82
    -8
      ge/common/profiling/profiling_manager.cc
  38. +4
    -1
      ge/common/profiling/profiling_manager.h
  39. +1
    -0
      ge/common/proto/insert_op.proto
  40. +11
    -0
      ge/common/tbe_kernel_store.cc
  41. +2
    -0
      ge/common/types.cc
  42. +7
    -2
      ge/executor/CMakeLists.txt
  43. +39
    -0
      ge/executor/ge_executor.cc
  44. +1
    -0
      ge/executor/proto/insert_op.proto
  45. +2
    -0
      ge/ge_inference.mk
  46. +8
    -6
      ge/ge_local_engine/CMakeLists.txt
  47. +1
    -0
      ge/ge_local_engine/ops_kernel_store/op/ge_deleted_op.cc
  48. +2
    -0
      ge/ge_runner.mk
  49. +57
    -10
      ge/ge_runtime/task/label_goto_task.cc
  50. +6
    -2
      ge/ge_runtime/task/label_goto_task.h
  51. +195
    -44
      ge/generator/ge_generator.cc
  52. +32
    -51
      ge/graph/build/graph_builder.cc
  53. +10
    -0
      ge/graph/build/label_allocator.cc
  54. +108
    -45
      ge/graph/build/logical_stream_allocator.cc
  55. +7
    -0
      ge/graph/build/logical_stream_allocator.h
  56. +12
    -3
      ge/graph/build/memory/binary_block_mem_assigner.cc
  57. +153
    -45
      ge/graph/build/memory/block_mem_assigner.cc
  58. +2
    -0
      ge/graph/build/memory/block_mem_assigner.h
  59. +234
    -0
      ge/graph/build/memory/buffer_pool_mem_assigner.cc
  60. +83
    -0
      ge/graph/build/memory/buffer_pool_mem_assigner.h
  61. +350
    -122
      ge/graph/build/memory/graph_mem_assigner.cc
  62. +6
    -1
      ge/graph/build/memory/graph_mem_assigner.h
  63. +1
    -0
      ge/graph/build/memory/hybrid_mem_assigner.cc
  64. +1
    -0
      ge/graph/build/memory/module.mk
  65. +47
    -11
      ge/graph/build/memory/var_mem_assign_util.cc
  66. +3
    -1
      ge/graph/build/memory/var_mem_assign_util.h
  67. +115
    -3
      ge/graph/build/model_builder.cc
  68. +2
    -0
      ge/graph/build/model_builder.h
  69. +26
    -1
      ge/graph/build/run_context.cc
  70. +285
    -7
      ge/graph/build/stream_allocator.cc
  71. +4
    -0
      ge/graph/build/stream_allocator.h
  72. +11
    -2
      ge/graph/build/stream_graph_optimizer.cc
  73. +84
    -7
      ge/graph/build/task_generator.cc
  74. +2
    -0
      ge/graph/common/bcast.cc
  75. +7
    -0
      ge/graph/common/bcast.h
  76. +58
    -0
      ge/graph/common/omg_util.cc
  77. +21
    -0
      ge/graph/common/omg_util.h
  78. +107
    -3
      ge/graph/execute/graph_execute.cc
  79. +8
    -2
      ge/graph/execute/graph_execute.h
  80. +16
    -0
      ge/graph/label/case_label_maker.cc
  81. +22
    -0
      ge/graph/label/if_label_maker.cc
  82. +30
    -0
      ge/graph/label/label_maker.cc
  83. +7
    -0
      ge/graph/label/partitioned_call_label_maker.cc
  84. +20
    -0
      ge/graph/label/while_label_maker.cc
  85. +18
    -1
      ge/graph/load/graph_loader.cc
  86. +61
    -0
      ge/graph/load/model_manager/cpu_queue_schedule.cc
  87. +34
    -174
      ge/graph/load/model_manager/data_dumper.cc
  88. +25
    -21
      ge/graph/load/model_manager/data_dumper.h
  89. +2
    -0
      ge/graph/load/model_manager/data_inputer.h
  90. +401
    -77
      ge/graph/load/model_manager/davinci_model.cc
  91. +38
    -6
      ge/graph/load/model_manager/davinci_model.h
  92. +158
    -21
      ge/graph/load/model_manager/model_manager.cc
  93. +6
    -2
      ge/graph/load/model_manager/model_manager.h
  94. +15
    -1
      ge/graph/load/model_manager/model_utils.cc
  95. +6
    -4
      ge/graph/load/model_manager/task_info/end_graph_task_info.cc
  96. +5
    -0
      ge/graph/load/model_manager/task_info/event_record_task_info.cc
  97. +7
    -0
      ge/graph/load/model_manager/task_info/event_wait_task_info.cc
  98. +3
    -0
      ge/graph/load/model_manager/task_info/fusion_start_task_info.cc
  99. +2
    -0
      ge/graph/load/model_manager/task_info/fusion_stop_task_info.cc
  100. +20
    -0
      ge/graph/load/model_manager/task_info/hccl_task_info.cc

+ 1
- 1
build.sh View File

@@ -229,7 +229,7 @@ if [[ "X$ENABLE_GE_UT" = "Xon" || "X$ENABLE_GE_COV" = "Xon" ]]; then
rm -rf ${BASEPATH}/cov rm -rf ${BASEPATH}/cov
mkdir ${BASEPATH}/cov mkdir ${BASEPATH}/cov
lcov -c -d build/tests/ut/ge -d build/tests/ut/common/graph/ -o cov/tmp.info lcov -c -d build/tests/ut/ge -d build/tests/ut/common/graph/ -o cov/tmp.info
lcov -r cov/tmp.info '*/output/*' '*/build/opensrc/*' '*/build/proto/*' '*/third_party/*' '*/tests/*' '/usr/local/*' -o cov/coverage.info
lcov -r cov/tmp.info '*/output/*' '*/build/opensrc/*' '*/build/proto/*' '*/third_party/*' '*/tests/*' '/usr/local/*' '/usr/include/*' '*/metadef/*' '*/parser/*' -o cov/coverage.info
cd ${BASEPATH}/cov cd ${BASEPATH}/cov
genhtml coverage.info genhtml coverage.info
fi fi


+ 29
- 1
ge/CMakeLists.txt View File

@@ -31,6 +31,7 @@ set(PROTO_HEADER_LIST
protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST})
protobuf_generate(ge PROTO_CLIENT_SRCS PROTO_CLIENT_HDRS ${PROTO_CLIENT_LIST}) protobuf_generate(ge PROTO_CLIENT_SRCS PROTO_CLIENT_HDRS ${PROTO_CLIENT_LIST})
protobuf_generate(ge PROTO_HEADER_SRCS PROTO_HEADER_HDRS ${PROTO_HEADER_LIST}) protobuf_generate(ge PROTO_HEADER_SRCS PROTO_HEADER_HDRS ${PROTO_HEADER_LIST})
protobuf_generate(ge_client PROTO_CLIENT_HEADER_SRCS PROTO_CLIENT_HEADER_HDRS ${PROTO_HEADER_LIST})


if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES) if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES)
############ libge_proto_common.a ############ ############ libge_proto_common.a ############
@@ -56,7 +57,7 @@ target_link_libraries(ge_proto_common PRIVATE


############ libge_proto_client.a ############ ############ libge_proto_client.a ############
add_library(ge_proto_client STATIC add_library(ge_proto_client STATIC
${PROTO_HEADER_HDRS}
${PROTO_CLIENT_HEADER_HDRS}
${PROTO_CLIENT_SRCS} ${PROTO_CLIENT_SRCS}
) )


@@ -65,6 +66,11 @@ target_compile_definitions(ge_proto_client PRIVATE
google=ascend_private google=ascend_private
) )


target_include_directories(ge_proto_client PRIVATE
${CMAKE_BINARY_DIR}/proto/ge_client
${CMAKE_BINARY_DIR}/proto/ge_client/proto
)

target_compile_options(ge_proto_client PRIVATE target_compile_options(ge_proto_client PRIVATE
-O2 -O2
-fno-common -fno-common
@@ -102,6 +108,7 @@ set(TRAIN_SRC_LIST
"common/helper/model_cache_helper.cc" "common/helper/model_cache_helper.cc"
"common/profiling/profiling_manager.cc" "common/profiling/profiling_manager.cc"
"common/dump/dump_manager.cc" "common/dump/dump_manager.cc"
"common/dump/exception_dumper.cc"
"common/dump/dump_properties.cc" "common/dump/dump_properties.cc"
"common/dump/opdebug_register.cc" "common/dump/opdebug_register.cc"
"common/dump/dump_op.cc" "common/dump/dump_op.cc"
@@ -189,6 +196,7 @@ set(TRAIN_SRC_LIST
"graph/passes/atomic_addr_clean_pass.cc" "graph/passes/atomic_addr_clean_pass.cc"
"graph/passes/mark_same_addr_pass.cc" "graph/passes/mark_same_addr_pass.cc"
"graph/passes/mark_graph_unknown_status_pass.cc" "graph/passes/mark_graph_unknown_status_pass.cc"
"graph/passes/mark_node_unknown_shape_pass.cc"
"graph/passes/mark_agnostic_pass.cc" "graph/passes/mark_agnostic_pass.cc"
"graph/partition/dynamic_shape_partition.cc" "graph/partition/dynamic_shape_partition.cc"
"graph/partition/stage_partition.cc" "graph/partition/stage_partition.cc"
@@ -209,6 +217,7 @@ set(TRAIN_SRC_LIST
"graph/passes/dimension_compute_pass.cc" "graph/passes/dimension_compute_pass.cc"
"graph/passes/dropout_pass.cc" "graph/passes/dropout_pass.cc"
"graph/passes/hccl_group_pass.cc" "graph/passes/hccl_group_pass.cc"
"graph/passes/hccl_tailing_optimization_pass.cc"
"graph/passes/enter_pass.cc" "graph/passes/enter_pass.cc"
"graph/passes/assign_remove_pass.cc" "graph/passes/assign_remove_pass.cc"
"graph/passes/inplace_support_check_pass.cc" "graph/passes/inplace_support_check_pass.cc"
@@ -320,7 +329,9 @@ set(TRAIN_SRC_LIST
"graph/passes/variable_ref_useless_control_out_delete_pass.cc" "graph/passes/variable_ref_useless_control_out_delete_pass.cc"
"graph/passes/end_of_sequence_add_control_pass.cc" "graph/passes/end_of_sequence_add_control_pass.cc"
"graph/passes/memcpy_addr_async_pass.cc" "graph/passes/memcpy_addr_async_pass.cc"
"graph/passes/parallel_group_pass.cc"
"graph/passes/set_input_output_offset_pass.cc" "graph/passes/set_input_output_offset_pass.cc"
"graph/passes/buffer_pool_memory_pass.cc"
"graph/preprocess/graph_preprocess.cc" "graph/preprocess/graph_preprocess.cc"
"graph/preprocess/insert_op/ge_aipp_op.cc" "graph/preprocess/insert_op/ge_aipp_op.cc"
"graph/preprocess/insert_op/util_insert_aipp_op.cc" "graph/preprocess/insert_op/util_insert_aipp_op.cc"
@@ -399,6 +410,7 @@ set(TRAIN_SRC_LIST
"graph/build/memory/hybrid_mem_assigner.cc" "graph/build/memory/hybrid_mem_assigner.cc"
"graph/build/memory/max_block_mem_assigner.cc" "graph/build/memory/max_block_mem_assigner.cc"
"graph/build/memory/var_mem_assign_util.cc" "graph/build/memory/var_mem_assign_util.cc"
"graph/build/memory/buffer_pool_mem_assigner.cc"
) )


set(INFER_SRC_LIST set(INFER_SRC_LIST
@@ -426,6 +438,7 @@ set(INFER_SRC_LIST
"common/formats/formats.cc" "common/formats/formats.cc"
"common/profiling/profiling_manager.cc" "common/profiling/profiling_manager.cc"
"common/dump/dump_properties.cc" "common/dump/dump_properties.cc"
"common/dump/exception_dumper.cc"
"common/dump/dump_manager.cc" "common/dump/dump_manager.cc"
"common/dump/dump_op.cc" "common/dump/dump_op.cc"
"common/dump/opdebug_register.cc" "common/dump/opdebug_register.cc"
@@ -499,6 +512,7 @@ set(INFER_SRC_LIST
"graph/passes/atomic_addr_clean_pass.cc" "graph/passes/atomic_addr_clean_pass.cc"
"graph/passes/mark_same_addr_pass.cc" "graph/passes/mark_same_addr_pass.cc"
"graph/passes/mark_graph_unknown_status_pass.cc" "graph/passes/mark_graph_unknown_status_pass.cc"
"graph/passes/mark_node_unknown_shape_pass.cc"
"graph/passes/mark_agnostic_pass.cc" "graph/passes/mark_agnostic_pass.cc"
"graph/common/omg_util.cc" "graph/common/omg_util.cc"
"graph/common/bcast.cc" "graph/common/bcast.cc"
@@ -605,8 +619,11 @@ set(INFER_SRC_LIST
"graph/passes/link_gen_mask_nodes_pass.cc" "graph/passes/link_gen_mask_nodes_pass.cc"
"graph/passes/replace_with_empty_const_pass.cc" "graph/passes/replace_with_empty_const_pass.cc"
"graph/passes/hccl_group_pass.cc" "graph/passes/hccl_group_pass.cc"
"graph/passes/hccl_tailing_optimization_pass.cc"
"graph/passes/memcpy_addr_async_pass.cc" "graph/passes/memcpy_addr_async_pass.cc"
"graph/passes/set_input_output_offset_pass.cc" "graph/passes/set_input_output_offset_pass.cc"
"graph/passes/parallel_group_pass.cc"
"graph/passes/buffer_pool_memory_pass.cc"
"graph/manager/model_manager/event_manager.cc" "graph/manager/model_manager/event_manager.cc"
"graph/manager/util/rt_context_util.cc" "graph/manager/util/rt_context_util.cc"
"graph/manager/util/variable_accelerate_ctrl.cc" "graph/manager/util/variable_accelerate_ctrl.cc"
@@ -670,6 +687,7 @@ set(INFER_SRC_LIST
"graph/build/memory/hybrid_mem_assigner.cc" "graph/build/memory/hybrid_mem_assigner.cc"
"graph/build/memory/max_block_mem_assigner.cc" "graph/build/memory/max_block_mem_assigner.cc"
"graph/build/memory/var_mem_assign_util.cc" "graph/build/memory/var_mem_assign_util.cc"
"graph/build/memory/buffer_pool_mem_assigner.cc"
) )


if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES) if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES)
@@ -700,6 +718,7 @@ target_compile_definitions(ge_runner PRIVATE
DAVINCI_CLOUD DAVINCI_CLOUD
google=ascend_private google=ascend_private
FUNC_VISIBILITY FUNC_VISIBILITY
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC>
) )


target_compile_options(ge_runner PRIVATE target_compile_options(ge_runner PRIVATE
@@ -775,6 +794,7 @@ target_compile_definitions(ge_compiler PRIVATE
COMPILE_OMG_PACKAGE COMPILE_OMG_PACKAGE
google=ascend_private google=ascend_private
FUNC_VISIBILITY FUNC_VISIBILITY
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC>
) )


target_compile_options(ge_compiler PRIVATE target_compile_options(ge_compiler PRIVATE
@@ -937,6 +957,10 @@ add_library(atc_stub_ge_compiler SHARED


add_dependencies(atc_stub_ge_compiler ge_stub) add_dependencies(atc_stub_ge_compiler ge_stub)


target_compile_options(atc_stub_ge_compiler PRIVATE
-fno-common
)

target_link_libraries(atc_stub_ge_compiler PRIVATE target_link_libraries(atc_stub_ge_compiler PRIVATE
$<BUILD_INTERFACE:intf_pub> $<BUILD_INTERFACE:intf_pub>
) )
@@ -973,6 +997,10 @@ add_library(fwk_stub_ge_runner SHARED


add_dependencies(fwk_stub_ge_runner ge_stub) add_dependencies(fwk_stub_ge_runner ge_stub)


target_compile_options(fwk_stub_ge_runner PRIVATE
-fno-common
)

target_link_libraries(fwk_stub_ge_runner PRIVATE target_link_libraries(fwk_stub_ge_runner PRIVATE
$<BUILD_INTERFACE:intf_pub> $<BUILD_INTERFACE:intf_pub>
) )


+ 11
- 6
ge/analyzer/analyzer.cc View File

@@ -155,12 +155,12 @@ std::shared_ptr<GraphInfo> Analyzer::GetJsonObject(uint64_t session_id, uint64_t
std::lock_guard<std::recursive_mutex> lg(mutex_); std::lock_guard<std::recursive_mutex> lg(mutex_);
auto iter = graph_infos_.find(session_id); auto iter = graph_infos_.find(session_id);
if (iter == graph_infos_.end()) { if (iter == graph_infos_.end()) {
GELOGE(PARAM_INVALID, "[Check][Session_id]session_id:%lu does not exist! graph_id:%lu.", session_id, graph_id);
GELOGE(PARAM_INVALID, "[Check][SessionId]session_id:%lu does not exist! graph_id:%lu", session_id, graph_id);
return nullptr; return nullptr;
} else { } else {
auto iter1 = (iter->second).find(graph_id); auto iter1 = (iter->second).find(graph_id);
if (iter1 == (iter->second).end()) { if (iter1 == (iter->second).end()) {
GELOGE(PARAM_INVALID, "[Check][Graph_id]graph_id:%lu does not exist! session_id:%lu.", graph_id, session_id);
GELOGE(PARAM_INVALID, "[Check][GraphId]graph_id:%lu does not exist! session_id:%lu.", graph_id, session_id);
return nullptr; return nullptr;
} }
GELOGI("GetJsonObject Success!session_id:%lu graph_id:%lu", session_id, graph_id); GELOGI("GetJsonObject Success!session_id:%lu graph_id:%lu", session_id, graph_id);
@@ -200,7 +200,7 @@ ge::Status Analyzer::CreateAnalyzerFile() {
} }


ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_id) { ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_id) {
GELOGD("start to save analyze file.");
GELOGD("start to save analyze file");


auto graph_info = GetJsonObject(session_id, graph_id); auto graph_info = GetJsonObject(session_id, graph_id);
GE_CHECK_NOTNULL(graph_info); GE_CHECK_NOTNULL(graph_info);
@@ -221,7 +221,10 @@ ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_
try { try {
json_file_ << jsn.dump(kJsonDumpLevel) << std::endl; json_file_ << jsn.dump(kJsonDumpLevel) << std::endl;
} catch (nlohmann::detail::type_error &e) { } catch (nlohmann::detail::type_error &e) {
GELOGE(FAILED, "[Json.dump][GraphInfo]json.dump to analyze file [%s] failed because [%s], session_id:%lu, graph_id:%lu", json_file_name_.c_str(), e.what(), session_id, graph_id);
GELOGE(FAILED,
"[Json.dump][GraphInfo]json.dump to analyze file [%s] failed because [%s],"
"session_id:%lu, graph_id:%lu",
json_file_name_.c_str(), e.what(), session_id, graph_id);
ret_failed = true; ret_failed = true;
} }
json_file_.close(); json_file_.close();
@@ -229,7 +232,7 @@ ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_
} }


ge::Status Analyzer::DoAnalyze(DataInfo &data_info) { ge::Status Analyzer::DoAnalyze(DataInfo &data_info) {
GELOGD("start to do analyzer process!");
GELOGD("start to do analyzer process");


auto pnode = data_info.node_ptr; auto pnode = data_info.node_ptr;
GE_CHECK_NOTNULL(pnode); GE_CHECK_NOTNULL(pnode);
@@ -241,7 +244,9 @@ ge::Status Analyzer::DoAnalyze(DataInfo &data_info) {
GE_CHECK_NOTNULL(graph_info); GE_CHECK_NOTNULL(graph_info);
auto status = SaveOpInfo(desc, data_info, graph_info); auto status = SaveOpInfo(desc, data_info, graph_info);
if (status != SUCCESS) { if (status != SUCCESS) {
GELOGE(status, "[Check][SaveOpInfo]save op info: desc_name [%s] desc_type [%s] failed!", desc->GetName().c_str(), desc->GetType().c_str());
GELOGE(status,
"[Check][SaveOpInfo]save op info: desc_name [%s] desc_type [%s] failed!",
desc->GetName().c_str(), desc->GetType().c_str());
return FAILED; return FAILED;
} }
// create json file // create json file


+ 114
- 40
ge/client/ge_api.cc View File

@@ -69,7 +69,11 @@ Status CheckOptionsValid(const std::map<string, string> &options) {
auto job_id_iter = options.find(OPTION_EXEC_JOB_ID); auto job_id_iter = options.find(OPTION_EXEC_JOB_ID);
if (job_id_iter != options.end()) { if (job_id_iter != options.end()) {
if (job_id_iter->second.length() > kMaxStrLen) { if (job_id_iter->second.length() > kMaxStrLen) {
GELOGE(PARAM_INVALID, "CheckOptionsValid job_id failed, string len > %d", kMaxStrLen);
GELOGE(PARAM_INVALID,"[Check][JobId]Failed,"
"the job_id [%s] string length: %zu > max string length: %d",
job_id_iter->second.c_str(), job_id_iter->second.length(), kMaxStrLen);
REPORT_INPUT_ERROR("E10051", std::vector<std::string>({"id","length"}),
std::vector<std::string>({job_id_iter->second, std::to_string(kMaxStrLen)}));
return FAILED; return FAILED;
} }
} }
@@ -84,7 +88,8 @@ Status GEInitializeImpl(const std::map<string, string> &options) {
std::string path_base = ge::GELib::GetPath(); std::string path_base = ge::GELib::GetPath();
auto ret = ErrorManager::GetInstance().Init(path_base); auto ret = ErrorManager::GetInstance().Init(path_base);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(GE_CLI_INIT_FAILED, "ErrorManager init fail");
GELOGE(GE_CLI_INIT_FAILED,
"[Init][PathBase]Init failed when pass param path_base:%s", path_base.c_str());
return ret; return ret;
} }


@@ -104,7 +109,9 @@ Status GEInitializeImpl(const std::map<string, string> &options) {
bool is_proto_init = manager->Initialize(option_tmp); bool is_proto_init = manager->Initialize(option_tmp);
GE_TIMESTAMP_END(GEInitialize, "GEInitialize::ManagerInitialize"); GE_TIMESTAMP_END(GEInitialize, "GEInitialize::ManagerInitialize");
if (!is_proto_init) { if (!is_proto_init) {
GELOGE(GE_CLI_INIT_FAILED, "geInitialize failed, ops proto path is invalid.");
GELOGE(GE_CLI_INIT_FAILED,
"[Init][OpsProtoPath]Loading OpsProto lib plugin failed, OpsProtoPath:%s invalid.",
opsproto_path.c_str());
return FAILED; return FAILED;
} }


@@ -127,7 +134,7 @@ Status GEInitializeImpl(const std::map<string, string> &options) {
ret = ge::GELib::Initialize(options); ret = ge::GELib::Initialize(options);
GE_TIMESTAMP_END(GELibInitialize, "GEInitialize::GELibInitialize"); GE_TIMESTAMP_END(GELibInitialize, "GEInitialize::GELibInitialize");
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(GE_CLI_INIT_FAILED, "geInitialize failed, error code = %u", ret);
GELOGE(GE_CLI_INIT_FAILED, "[Init][GELib]Failed, error code = %u", ret);
return FAILED; return FAILED;
} }


@@ -155,7 +162,9 @@ Status GEInitialize(const std::map<AscendString, AscendString> &options) {
std::map<std::string, std::string> str_options; std::map<std::string, std::string> str_options;
for (auto &option : options) { for (auto &option : options) {
if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) {
GELOGE(FAILED, "GEInitialize options is nullptr.");
GELOGE(FAILED, "[Check][Param]Options invalid, first or second option is nullptr.");
REPORT_INNER_ERROR("E19999", "Check parameter's options invalid,"
"the first or second option is nullptr.");
return FAILED; return FAILED;
} }
std::string key = option.first.GetString(); std::string key = option.first.GetString();
@@ -171,17 +180,17 @@ Status GEInitialize(const std::map<AscendString, AscendString> &options) {


// GE finalize, releasing all resources // GE finalize, releasing all resources
Status GEFinalize() { Status GEFinalize() {
ErrorManager::GetInstance().SetStage(ErrorMessage::kFinalize, ErrorMessage::kFinalize);
GELOGT(TRACE_INIT, "GEFinalize start");

ErrorManager::GetInstance().GenWorkStreamIdDefault();
std::lock_guard<std::mutex> lock(g_ge_release_mutex);
// check init status // check init status
if (!g_ge_initialized) { if (!g_ge_initialized) {
GELOGW("GEFinalize is called before GEInitialize");
GELOGW("[FINAL][FINAL]GEFinalize is called before GEInitialize");
return SUCCESS; return SUCCESS;
} }


std::lock_guard<std::mutex> lock(g_ge_release_mutex);
ErrorManager::GetInstance().SetStage(ErrorMessage::kFinalize, ErrorMessage::kFinalize);
ErrorManager::GetInstance().GenWorkStreamIdDefault();
GELOGT(TRACE_INIT, "GEFinalize start");

// call Finalize // call Finalize
Status ret = SUCCESS; Status ret = SUCCESS;
Status middle_ret; Status middle_ret;
@@ -237,13 +246,17 @@ Session::Session(const std::map<string, string> &options) {
// check init status // check init status
sessionId_ = 0; sessionId_ = 0;
if (!g_ge_initialized) { if (!g_ge_initialized) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized.");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Construct][Session]Failed because lack GEInitialize call before.");
REPORT_INNER_ERROR("E19999",
"Creating session failed because lack GEInitialize call before.");
return; return;
} }
// call Initialize // call Initialize
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session Constructor failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Construct][Session]Failed, GELib instance is nullptr or it is not InitFlag");
return; return;
} }


@@ -256,7 +269,7 @@ Session::Session(const std::map<string, string> &options) {
if (ret == SUCCESS) { if (ret == SUCCESS) {
sessionId_ = session_id; sessionId_ = session_id;
} else { } else {
GELOGE(ret, "Session constructor failed, session Id not initialized");
GELOGE(ret, "[Construct][Session]Failed, error code:%u.", ret);
return; return;
} }
GELOGT(TRACE_STOP, "Session Constructor finished"); GELOGT(TRACE_STOP, "Session Constructor finished");
@@ -270,13 +283,17 @@ Session::Session(const std::map<AscendString, AscendString> &options) {
// check init status // check init status
sessionId_ = 0; sessionId_ = 0;
if (!g_ge_initialized) { if (!g_ge_initialized) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized.");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Construct][Session]Failed because lack GEInitialize call before.");
REPORT_INNER_ERROR("E19999",
"Creating session failed because lack GEInitialize call before.");
return; return;
} }
// call Initialize // call Initialize
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session Constructor failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Construct][Session]Failed, the GELib instance is nullptr or is not InitFlag");
return; return;
} }


@@ -284,7 +301,9 @@ Session::Session(const std::map<AscendString, AscendString> &options) {
std::map<std::string, std::string> str_options; std::map<std::string, std::string> str_options;
for (auto &option : options) { for (auto &option : options) {
if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) {
GELOGE(FAILED, "Session options is nullptr.");
GELOGE(FAILED, "[Construct][Session]Failed, the first or second option is nullptr.");
REPORT_INNER_ERROR("E19999", "Creating session's options invalid,"
"the first or second option is nullptr.");
return; return;
} }
std::string key = option.first.GetString(); std::string key = option.first.GetString();
@@ -299,7 +318,7 @@ Session::Session(const std::map<AscendString, AscendString> &options) {
if (ret == SUCCESS) { if (ret == SUCCESS) {
sessionId_ = session_id; sessionId_ = session_id;
} else { } else {
GELOGE(ret, "Session constructor failed, session Id not initialized");
GELOGE(ret, "[Construct][Session]Failed, error code:%u.", ret);
return; return;
} }
GELOGT(TRACE_STOP, "Session Constructor finished"); GELOGT(TRACE_STOP, "Session Constructor finished");
@@ -331,17 +350,18 @@ Session::~Session() {


ret = instance_ptr->SessionManagerObj().DestroySession(session_id); ret = instance_ptr->SessionManagerObj().DestroySession(session_id);
} catch (google::protobuf::FatalException &e) { } catch (google::protobuf::FatalException &e) {
GELOGE(GE_CLI_SESS_DESTROY_FAILED, "SessionDestructor throws FatalException");
GELOGE(GE_CLI_SESS_DESTROY_FAILED, "[Destruct][Session]Failed because get fatalException.");
} }


// check return status, return, update session id if success // check return status, return, update session id if success
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Session Destructor failed");
GELOGE(ret, "[Destruct][Session]Failed, error code:%u.", ret);
} }


GELOGT(TRACE_STOP, "Session Destructor finished"); GELOGT(TRACE_STOP, "Session Destructor finished");
} }


// Add Graph
Status Session::AddGraph(uint32_t graph_id, const Graph &graph) { Status Session::AddGraph(uint32_t graph_id, const Graph &graph) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
std::map<std::string, std::string> options; std::map<std::string, std::string> options;
@@ -349,25 +369,32 @@ Status Session::AddGraph(uint32_t graph_id, const Graph &graph) {
return AddGraph(graph_id, graph, options); return AddGraph(graph_id, graph, options);
} }


// Add Graph
Status Session::AddGraph(uint32_t graph_id, const Graph &graph, const std::map<std::string, std::string> &options) { Status Session::AddGraph(uint32_t graph_id, const Graph &graph, const std::map<std::string, std::string> &options) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
GELOGT(TRACE_INIT, "Start to add graph in Session. graph_id: %u, session_id: %lu.", graph_id, sessionId_); GELOGT(TRACE_INIT, "Start to add graph in Session. graph_id: %u, session_id: %lu.", graph_id, sessionId_);
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id);
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "AddGraph failed in Session.");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Add][Graph]Failed because GELib instance is nullptr or it is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"AddGraph Failed, GELib instance is nullptr or it is not InitFlag.");
return FAILED; return FAILED;
} }
GELOGD("Adding graph to session"); GELOGD("Adding graph to session");
Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, options); Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, options);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "AddGraph failed in Session.");
GELOGE(ret,
"[Add][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.",
ret, sessionId_, graph_id);
return FAILED; return FAILED;
} }
GELOGD("AddGraph finished in Session."); GELOGD("AddGraph finished in Session.");
return ret; return ret;
} }


//Add Graph
Status Session::AddGraph(uint32_t graph_id, const Graph &graph, Status Session::AddGraph(uint32_t graph_id, const Graph &graph,
const std::map<AscendString, AscendString> &options) { const std::map<AscendString, AscendString> &options) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
@@ -375,14 +402,19 @@ Status Session::AddGraph(uint32_t graph_id, const Graph &graph,
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id);
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "AddGraph failed in Session.");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Add][Graph]Failed, the GELib instance is nullptr or is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"AddGraph Failed, GELib instance is nullptr or it is not InitFlag.");
return FAILED; return FAILED;
} }
GELOGD("Adding graph to session"); GELOGD("Adding graph to session");
std::map<std::string, std::string> str_options; std::map<std::string, std::string> str_options;
for (auto &option : options) { for (auto &option : options) {
if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) {
GELOGE(FAILED, "AddGraph options is nullptr.");
GELOGE(FAILED, "[Add][Graph]Failed, the first or second option is nullptr.");
REPORT_INNER_ERROR("E19999",
"Add Graph Failed, the first or second option is nullptr.");
return FAILED; return FAILED;
} }
std::string key = option.first.GetString(); std::string key = option.first.GetString();
@@ -391,7 +423,9 @@ Status Session::AddGraph(uint32_t graph_id, const Graph &graph,
} }
Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, str_options); Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, str_options);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "AddGraph failed in Session.");
GELOGE(ret,
"[Add][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.",
ret, sessionId_, graph_id);
return FAILED; return FAILED;
} }
GELOGD("AddGraph finished in Session."); GELOGD("AddGraph finished in Session.");
@@ -405,6 +439,7 @@ Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph) {
return AddGraphWithCopy(graph_id, graph, options); return AddGraphWithCopy(graph_id, graph, options);
} }


// Add Graph With Copy
Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph, Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph,
const std::map<AscendString, AscendString> &options) { const std::map<AscendString, AscendString> &options) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
@@ -412,7 +447,10 @@ Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph,
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id);
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "AddGraph failed in Session.");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Add][Graph]Failed, the GELib instance is nullptr or is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"AddGraph Failed, GELib instance is nullptr or is not InitFlag.");
return FAILED; return FAILED;
} }
std::map<std::string, std::string> str_options; std::map<std::string, std::string> str_options;
@@ -422,13 +460,16 @@ Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph,
GELOGD("Adding graph to session"); GELOGD("Adding graph to session");
Status ret = instance_ptr->SessionManagerObj().AddGraphWithCopy(sessionId_, graph_id, graph, str_options); Status ret = instance_ptr->SessionManagerObj().AddGraphWithCopy(sessionId_, graph_id, graph, str_options);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "AddGraph failed in Session.");
GELOGE(ret,
"[Add][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.",
ret, sessionId_, graph_id);
return FAILED; return FAILED;
} }
GELOGD("AddGraph finished in Session."); GELOGD("AddGraph finished in Session.");
return ret; return ret;
} }


// Remove Graph
Status Session::RemoveGraph(uint32_t graph_id) { Status Session::RemoveGraph(uint32_t graph_id) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
GELOGT(TRACE_INIT, "Session RemoveGraph start"); GELOGT(TRACE_INIT, "Session RemoveGraph start");
@@ -437,7 +478,10 @@ Status Session::RemoveGraph(uint32_t graph_id) {
// call RemoveGraph // call RemoveGraph
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (!instance_ptr || !instance_ptr->InitFlag()) { if (!instance_ptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session RemoveGraph failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Remove][Graph]Failed, GELib instance is nullptr or is not InitFlag ");
REPORT_INNER_ERROR("E19999",
"RemoveGraph Failed, GELib instance is nullptr or is not InitFlag.");
return FAILED; return FAILED;
} }


@@ -445,13 +489,16 @@ Status Session::RemoveGraph(uint32_t graph_id) {
Status ret = instance_ptr->SessionManagerObj().RemoveGraph(sessionId_, graph_id); Status ret = instance_ptr->SessionManagerObj().RemoveGraph(sessionId_, graph_id);
// check return status, return // check return status, return
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "session RemoveGraph failed");
GELOGE(ret,
"[Remove][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.",
ret, sessionId_, graph_id);
return FAILED; return FAILED;
} }
GELOGT(TRACE_STOP, "Session RemoveGraph finished"); GELOGT(TRACE_STOP, "Session RemoveGraph finished");
return ret; return ret;
} }


// Print Output Result
void PrintOutputResult(std::vector<Tensor> &outputs) { void PrintOutputResult(std::vector<Tensor> &outputs) {
if (outputs.empty() || outputs[0].GetData() == nullptr) { if (outputs.empty() || outputs[0].GetData() == nullptr) {
GELOGW("outputs is empty or data is nullptr."); GELOGW("outputs is empty or data is nullptr.");
@@ -499,6 +546,7 @@ void PrintOutputResult(std::vector<Tensor> &outputs) {
} }
} }


// Run Graph
Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, std::vector<Tensor> &outputs) { Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, std::vector<Tensor> &outputs) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
GELOGT(TRACE_INIT, "Session RunGraph start"); GELOGT(TRACE_INIT, "Session RunGraph start");
@@ -508,14 +556,19 @@ Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, s
// call RunGraph // call RunGraph
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session RunGraph failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Run][Graph]Failed, GELib instance is nullptr or is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"RunGraph Failed, GELib instance is nullptr or is not InitFlag.");
return FAILED; return FAILED;
} }
GELOGT(TRACE_RUNNING, "Running Graph"); GELOGT(TRACE_RUNNING, "Running Graph");
Status ret = instance_ptr->SessionManagerObj().RunGraph(sessionId_, graph_id, graph_inputs, outputs); Status ret = instance_ptr->SessionManagerObj().RunGraph(sessionId_, graph_id, graph_inputs, outputs);
// check return status // check return status
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Session RunGraph failed");
GELOGE(ret,
"[Run][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.",
ret, sessionId_, graph_id);
return FAILED; return FAILED;
} }


@@ -529,6 +582,7 @@ Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, s
return ret; return ret;
} }


// Register Call Back
Status Session::RegisterCallBackFunc(const std::string &key, const pCallBackFunc &callback) { Status Session::RegisterCallBackFunc(const std::string &key, const pCallBackFunc &callback) {
ErrorManager::GetInstance().GenWorkStreamIdDefault(); ErrorManager::GetInstance().GenWorkStreamIdDefault();
return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, key, callback); return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, key, callback);
@@ -543,30 +597,40 @@ Status Session::RegisterCallBackFunc(const char *key, const session::pCallBackFu
return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, str_key, callback); return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, str_key, callback);
} }


// Build Graph
Status Session::BuildGraph(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs) { Status Session::BuildGraph(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id);
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Build][Graph]Failed, the GELib instance is nullptr or is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"Build graph failed, the GELib instance is nullptr or is not InitFlag.");
return FAILED; return FAILED;
} }
GELOGT(TRACE_RUNNING, "Building Graph"); GELOGT(TRACE_RUNNING, "Building Graph");
Status ret = instance_ptr->SessionManagerObj().BuildGraph(sessionId_, graph_id, inputs); Status ret = instance_ptr->SessionManagerObj().BuildGraph(sessionId_, graph_id, inputs);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Session BuildGraph failed");
GELOGE(ret,
"[Build][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.",
ret, sessionId_, graph_id);
return FAILED; return FAILED;
} }
return SUCCESS; return SUCCESS;
} }


// Run Graph Asynchronously
Status Session::RunGraphAsync(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs, Status Session::RunGraphAsync(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs,
RunAsyncCallback callback) { RunAsyncCallback callback) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute);
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id);
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Run][Graph]RunGraphAsyncFailed, the GELib instance is nullptr or is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"RunGraphAsync Failed, the GELib instance is nullptr or is not InitFlag.");
return FAILED; return FAILED;
} }
GELOGT(TRACE_RUNNING, "Run Graph Asynchronously"); GELOGT(TRACE_RUNNING, "Run Graph Asynchronously");
@@ -575,49 +639,59 @@ Status Session::RunGraphAsync(uint32_t graph_id, const std::vector<InputTensorIn


Status ret = ge::GELib::GetInstance()->SessionManagerObj().RunGraphAsync(sessionId_, graph_id, inputs, callback); Status ret = ge::GELib::GetInstance()->SessionManagerObj().RunGraphAsync(sessionId_, graph_id, inputs, callback);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "SessionManager RunGraphAsync failed");
GELOGE(ret, "[Run][Graph]RunGraphAsync Failed, error code:%u, session_id:%lu, graph_id:%u.",
ret, sessionId_, graph_id);
return FAILED; return FAILED;
} }
return SUCCESS; return SUCCESS;
} }


// Get Variables
Status Session::GetVariables(const std::vector<std::string> &var_names, std::vector<Tensor> &var_values) { Status Session::GetVariables(const std::vector<std::string> &var_names, std::vector<Tensor> &var_values) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute);
ErrorManager::GetInstance().GenWorkStreamIdDefault(); ErrorManager::GetInstance().GenWorkStreamIdDefault();
auto instance_ptr = ge::GELib::GetInstance(); auto instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Get][Variables]Failed, the GELib instance is nullptr or is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"GetVariables failed, the GELib instance is nullptr or is not InitFlag.");
return FAILED; return FAILED;
} }
GELOGT(TRACE_RUNNING, "Get Variables"); GELOGT(TRACE_RUNNING, "Get Variables");
Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, var_names, var_values); Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, var_names, var_values);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "SessionManager RunGraphAsync failed");
GELOGE(ret, "[Get][Variables]Failed, error code:%u, session_id:%lu.", ret, sessionId_);
return FAILED; return FAILED;
} }
return SUCCESS; return SUCCESS;
} }


// Get Variables
Status Session::GetVariables(const std::vector<AscendString> &var_names, std::vector<Tensor> &var_values) { Status Session::GetVariables(const std::vector<AscendString> &var_names, std::vector<Tensor> &var_values) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute);
ErrorManager::GetInstance().GenWorkStreamIdDefault(); ErrorManager::GetInstance().GenWorkStreamIdDefault();
auto instance_ptr = ge::GELib::GetInstance(); auto instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed");
GELOGE(GE_CLI_GE_NOT_INITIALIZED,
"[Get][Variables]Failed, the GELib instance is nullptr or is not InitFlag.");
REPORT_INNER_ERROR("E19999",
"GetVariables failed, the GELib instance is nullptr or is not InitFlag.");
return FAILED; return FAILED;
} }
GELOGT(TRACE_RUNNING, "Get Variables"); GELOGT(TRACE_RUNNING, "Get Variables");
std::vector<ge::string> str_var_names; std::vector<ge::string> str_var_names;
for (auto &var_name : var_names) { for (auto &var_name : var_names) {
if (var_name.GetString() == nullptr) { if (var_name.GetString() == nullptr) {
GELOGE(FAILED, "GetVariables name is nullptr.");
GELOGE(FAILED, "[Get][Variable]Failed, variables' names are nullptr.");
REPORT_INNER_ERROR("E19999", "GetVariables failed, variables' names are nullptr.");
return FAILED; return FAILED;
} }
str_var_names.emplace_back(var_name.GetString()); str_var_names.emplace_back(var_name.GetString());
} }
Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, str_var_names, var_values); Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, str_var_names, var_values);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "SessionManager RunGraphAsync failed");
GELOGE(ret, "[Get][Variables]Failed, error code:%u, session_id:%lu.", ret, sessionId_);
return FAILED; return FAILED;
} }
return SUCCESS; return SUCCESS;


+ 1
- 0
ge/client/proto/insert_op.proto View File

@@ -88,6 +88,7 @@ message AippOpParams {
int32 right_padding_size = 69; int32 right_padding_size = 69;
int32 top_padding_size = 70; int32 top_padding_size = 70;
int32 bottom_padding_size = 71; int32 bottom_padding_size = 71;
float padding_value = 72;


int32 mean_chn_0 = 10; int32 mean_chn_0 = 10;
int32 mean_chn_1 = 11; int32 mean_chn_1 = 11;


+ 3
- 2
ge/common/CMakeLists.txt View File

@@ -16,6 +16,7 @@ set(PROTO_LIST
) )


protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST})
protobuf_generate(ge_static PROTO_STATIC_SRCS PROTO_STATIC_HDRS ${PROTO_LIST})


set(SRC_LIST set(SRC_LIST
"context/ctx.cc" "context/ctx.cc"
@@ -127,7 +128,7 @@ target_link_libraries(ge_common PRIVATE
) )


############ libge_common.a ############ ############ libge_common.a ############
add_library(ge_common_static STATIC ${SRC_LIST} ${PROTO_HDRS})
add_library(ge_common_static STATIC ${SRC_LIST} ${PROTO_STATIC_HDRS})
target_compile_definitions(ge_common_static PRIVATE target_compile_definitions(ge_common_static PRIVATE
PROTOBUF_INLINE_NOT_IN_HEADERS=0 PROTOBUF_INLINE_NOT_IN_HEADERS=0
HOST_VISIBILITY HOST_VISIBILITY
@@ -158,7 +159,7 @@ target_include_directories(ge_common_static PRIVATE
${METADEF_DIR}/inc/external/graph ${METADEF_DIR}/inc/external/graph
${METADEF_DIR}/inc/graph ${METADEF_DIR}/inc/graph
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/proto/ge
${CMAKE_BINARY_DIR}/proto/ge_static
#### yellow zone #### #### yellow zone ####
${GE_DEPEND_DIR}/inc ${GE_DEPEND_DIR}/inc
${GE_DEPEND_DIR}/inc/cce ${GE_DEPEND_DIR}/inc/cce


+ 95
- 44
ge/common/auth/file_saver.cc View File

@@ -33,7 +33,8 @@ const int kFileOpSuccess = 0;
namespace ge { namespace ge {
Status FileSaver::OpenFile(int32_t &fd, const std::string &file_path) { Status FileSaver::OpenFile(int32_t &fd, const std::string &file_path) {
if (CheckPath(file_path) != SUCCESS) { if (CheckPath(file_path) != SUCCESS) {
GELOGE(FAILED, "Check output file failed.");
GELOGE(FAILED, "[Check][FilePath]Check output file failed, file_path:%s.", file_path.c_str());
REPORT_CALL_ERROR("E19999", "Check output file failed, file_path:%s.", file_path.c_str());
return FAILED; return FAILED;
} }


@@ -45,7 +46,8 @@ Status FileSaver::OpenFile(int32_t &fd, const std::string &file_path) {
fd = mmOpen2(real_path, M_RDWR | M_CREAT | O_TRUNC, mode); fd = mmOpen2(real_path, M_RDWR | M_CREAT | O_TRUNC, mode);
if (fd == EN_INVALID_PARAM || fd == EN_ERROR) { if (fd == EN_INVALID_PARAM || fd == EN_ERROR) {
// -1: Failed to open file; - 2: Illegal parameter // -1: Failed to open file; - 2: Illegal parameter
GELOGE(FAILED, "Open file failed. mmpa_errno = %d, %s", fd, strerror(errno));
GELOGE(FAILED, "[Open][File]Failed. mmpa_errno = %d, %s", fd, strerror(errno));
REPORT_INNER_ERROR("E19999", "Open file failed, mmpa_errno = %d, error:%s.", fd, strerror(errno));
return FAILED; return FAILED;
} }
return SUCCESS; return SUCCESS;
@@ -62,7 +64,9 @@ Status FileSaver::WriteData(const void *data, uint32_t size, int32_t fd) {
while (size > size_1g) { while (size > size_1g) {
write_count = mmWrite(fd, reinterpret_cast<void *>(seek), size_1g); write_count = mmWrite(fd, reinterpret_cast<void *>(seek), size_1g);
if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) { if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) {
GELOGE(FAILED, "Write data failed. mmpa_errorno = %ld, %s", write_count, strerror(errno));
GELOGE(FAILED, "[Write][Data]Failed, mmpa_errorno = %ld, error:%s", write_count, strerror(errno));
REPORT_INNER_ERROR("E19999", "Write data failed, mmpa_errorno = %ld, error:%s.",
write_count, strerror(errno));
return FAILED; return FAILED;
} }
size -= size_1g; size -= size_1g;
@@ -75,7 +79,9 @@ Status FileSaver::WriteData(const void *data, uint32_t size, int32_t fd) {


// -1: Failed to write to file; - 2: Illegal parameter // -1: Failed to write to file; - 2: Illegal parameter
if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) { if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) {
GELOGE(FAILED, "Write data failed. mmpa_errorno = %ld, %s", write_count, strerror(errno));
GELOGE(FAILED, "[Write][Data]Failed. mmpa_errorno = %ld, error:%s", write_count, strerror(errno));
REPORT_INNER_ERROR("E19999", "Write data failed, mmpa_errorno = %ld, error:%s.",
write_count, strerror(errno));
return FAILED; return FAILED;
} }


@@ -85,7 +91,8 @@ Status FileSaver::WriteData(const void *data, uint32_t size, int32_t fd) {
Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, const void *data, Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, const void *data,
int len) { int len) {
if (data == nullptr || len <= 0) { if (data == nullptr || len <= 0) {
GELOGE(FAILED, "Model_data is null or the length[%d] less than 1.", len);
GELOGE(FAILED, "[Check][Param]Failed, model_data is null or the length[%d] is less than 1.", len);
REPORT_INNER_ERROR("E19999", "Save file failed, model_data is null or the length:%d is less than 1.", len);
return FAILED; return FAILED;
} }


@@ -104,7 +111,8 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi
} while (0); } while (0);
// Close file // Close file
if (mmClose(fd) != 0) { // mmClose 0: success if (mmClose(fd) != 0) { // mmClose 0: success
GELOGE(FAILED, "Close file failed.");
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno));
REPORT_INNER_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno));
ret = FAILED; ret = FAILED;
} }
return ret; return ret;
@@ -140,60 +148,95 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi
} }
} while (0); } while (0);
// Close file // Close file
GE_CHK_BOOL_RET_STATUS(mmClose(fd) == EN_OK, FAILED, "Close file failed.");
if (mmClose(fd) != EN_OK) {
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno));
REPORT_CALL_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno));
ret = FAILED;
}
return ret; return ret;
} }


Status FileSaver::SaveToBuffWithFileHeader(const ModelFileHeader &file_header, Status FileSaver::SaveToBuffWithFileHeader(const ModelFileHeader &file_header,
ModelPartitionTable &model_partition_table, ModelPartitionTable &model_partition_table,
const std::vector<ModelPartition> &partitionDatas,
const std::vector<ModelPartition> &partition_datas,
ge::ModelBufferData &model) {
const vector<ModelPartitionTable *> model_partition_tables = { &model_partition_table };
const std::vector<std::vector<ModelPartition>> all_partition_datas = { partition_datas };
return SaveToBuffWithFileHeader(file_header, model_partition_tables, all_partition_datas, model);
}

Status FileSaver::SaveToBuffWithFileHeader(const ModelFileHeader &file_header,
const vector<ModelPartitionTable *> &model_partition_tables,
const std::vector<std::vector<ModelPartition>> &all_partition_datas,
ge::ModelBufferData &model) { ge::ModelBufferData &model) {
GE_CHK_BOOL_RET_STATUS(
!partitionDatas.empty() && model_partition_table.num != 0 && model_partition_table.num == partitionDatas.size(),
FAILED, "Invalid param:partition data size is (%u), model_partition_table.num is (%zu).",
model_partition_table.num, partitionDatas.size());
uint32_t model_header_size = sizeof(ModelFileHeader);
uint32_t table_size = static_cast<uint32_t>(SIZE_OF_MODEL_PARTITION_TABLE(model_partition_table));
uint32_t total_size = model_header_size + table_size;

for (const auto &partitionData : partitionDatas) {
auto ret = ge::CheckUint32AddOverflow(total_size, partitionData.size);
GE_CHK_BOOL_RET_STATUS(ret == SUCCESS, FAILED, "add uint32 overflow!");
total_size = total_size + partitionData.size;
GE_CHK_BOOL_RET_STATUS(model_partition_tables.size() == all_partition_datas.size(), PARAM_INVALID,
"Model table size %zu does not match partition size %zu.",
model_partition_tables.size(), all_partition_datas.size());
for (size_t index = 0; index < model_partition_tables.size(); ++index) {
auto &cur_partiton_data = all_partition_datas[index];
auto &cur_model_partition_table = *model_partition_tables[index];
GE_CHK_BOOL_RET_STATUS(!cur_partiton_data.empty() && cur_model_partition_table.num != 0
&& cur_model_partition_table.num == cur_partiton_data.size(), FAILED,
"Invalid param: partition data size is (%zu), model_partition_table.num is (%u).",
cur_partiton_data.size(), cur_model_partition_table.num);
} }

uint64_t model_header_size = sizeof(ModelFileHeader);
uint64_t total_size = model_header_size;
for (size_t index = 0; index < model_partition_tables.size(); ++index) {
auto &cur_model_partition_table = *model_partition_tables[index];
total_size += static_cast<uint64_t>(SIZE_OF_MODEL_PARTITION_TABLE(cur_model_partition_table));
auto &cur_partition_data = all_partition_datas[index];
for (const auto &partition_data : cur_partition_data) {
auto ret = ge::CheckUint64AddOverflow(total_size, partition_data.size);
GE_CHK_BOOL_RET_STATUS(ret == SUCCESS, FAILED, "Add uint64 overflow!");
total_size += partition_data.size;
}
}
// save to buff
auto buff = reinterpret_cast<uint8_t *>(malloc(total_size)); auto buff = reinterpret_cast<uint8_t *>(malloc(total_size));
GE_CHK_BOOL_RET_STATUS(buff != nullptr, FAILED, "malloc failed!");
GE_PRINT_DYNAMIC_MEMORY(malloc, "file buffer.", total_size)
GE_CHK_BOOL_RET_STATUS(buff != nullptr, FAILED, "Malloc failed!");
GE_PRINT_DYNAMIC_MEMORY(malloc, "File buffer.", total_size)
model.data.reset(buff, [](uint8_t *buff) { model.data.reset(buff, [](uint8_t *buff) {
GELOGD("Free online model memory."); GELOGD("Free online model memory.");
free(buff); free(buff);
buff = nullptr; buff = nullptr;
}); });
model.length = total_size; model.length = total_size;
uint32_t left_space = total_size;
auto ret_mem1 = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<ModelFileHeader *>(&file_header)),
model_header_size);
GE_CHK_BOOL_RET_STATUS(ret_mem1 == 0, FAILED, "memcpy_s failed!");
uint64_t left_space = total_size;
auto ret_mem = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<ModelFileHeader *>(&file_header)),
model_header_size);
GE_CHK_BOOL_RET_STATUS(ret_mem == EOK, FAILED, "Memcpy_s failed!");
buff += model_header_size; buff += model_header_size;
left_space -= model_header_size; left_space -= model_header_size;
auto ret_mem2 = memcpy_s(buff, left_space, reinterpret_cast<void *>(&model_partition_table), table_size);
GE_CHK_BOOL_RET_STATUS(ret_mem2 == 0, FAILED, "memcpy_s failed!");
buff += table_size;
left_space -= table_size;
for (const auto &partitionData : partitionDatas) {
auto ret_mem3 = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<uint8_t *>(partitionData.data)),
partitionData.size);
GE_CHK_BOOL_RET_STATUS(ret_mem3 == 0, FAILED, "memcpy failed!");
buff += partitionData.size;
left_space -= partitionData.size;

for (size_t index = 0; index < model_partition_tables.size(); ++index) {
auto &cur_tabel = *model_partition_tables[index];
uint64_t table_size = static_cast<uint64_t>(SIZE_OF_MODEL_PARTITION_TABLE(cur_tabel));
ret_mem = memcpy_s(buff, left_space, reinterpret_cast<void *>(&cur_tabel), table_size);
GE_CHK_BOOL_RET_STATUS(ret_mem == EOK, FAILED, "Memcpy_s failed!");
buff += table_size;
left_space -= table_size;
auto &cur_partition_data = all_partition_datas[index];
for (const auto &partition_data : cur_partition_data) {
ret_mem = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<uint8_t *>(partition_data.data)),
partition_data.size);
GE_CHK_BOOL_RET_STATUS(ret_mem == EOK, FAILED, "Memcpy_s failed!");
buff += partition_data.size;
left_space -= partition_data.size;
}
} }

return SUCCESS; return SUCCESS;
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(const std::string &file_path) { FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(const std::string &file_path) {
// Determine file path length // Determine file path length
if (file_path.size() >= MMPA_MAX_PATH) { if (file_path.size() >= MMPA_MAX_PATH) {
GELOGE(FAILED, "Path is too long:%zu", file_path.size());
GELOGE(FAILED, "[Check][FilePath]Failed, file path's length:%zu > mmpa_max_path:%d",
file_path.size(), MMPA_MAX_PATH);
REPORT_INNER_ERROR("E19999", "Check file path failed, file path's length:%zu > mmpa_max_path:%d",
file_path.size(), MMPA_MAX_PATH);
return FAILED; return FAILED;
} }


@@ -212,7 +255,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(con
// If there is a path before the file name, create the path // If there is a path before the file name, create the path
if (path_split_pos != -1) { if (path_split_pos != -1) {
if (CreateDirectory(std::string(file_path).substr(0, static_cast<size_t>(path_split_pos))) != kFileOpSuccess) { if (CreateDirectory(std::string(file_path).substr(0, static_cast<size_t>(path_split_pos))) != kFileOpSuccess) {
GELOGE(FAILED, "CreateDirectory failed, file path:%s.", file_path.c_str());
GELOGE(FAILED, "[Create][Directory]Failed, file path:%s.", file_path.c_str());
return FAILED; return FAILED;
} }
} }
@@ -223,7 +266,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(con
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status
FileSaver::SaveToFile(const string &file_path, const ge::ModelData &model, const ModelFileHeader *model_file_header) { FileSaver::SaveToFile(const string &file_path, const ge::ModelData &model, const ModelFileHeader *model_file_header) {
if (file_path.empty() || model.model_data == nullptr || model.model_len == 0) { if (file_path.empty() || model.model_data == nullptr || model.model_len == 0) {
GELOGE(FAILED, "Incorrected input param. file_path.empty() || model.model_data == nullptr || model.model_len == 0");
GELOGE(FAILED, "[Save][File]Incorrect input param, file_path is empty or model_data is nullptr or model_len is 0");
REPORT_INNER_ERROR("E19999", "Save file failed, at least one of the input parameters(file_path, model_data, model_len) is incorrect");
return FAILED; return FAILED;
} }


@@ -240,7 +284,8 @@ FileSaver::SaveToFile(const string &file_path, const ge::ModelData &model, const


const Status ret = SaveWithFileHeader(file_path, file_header, model.model_data, file_header.length); const Status ret = SaveWithFileHeader(file_path, file_header, model.model_data, file_header.length);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(FAILED, "Save file failed, file_path:%s, file header len:%u.", file_path.c_str(), file_header.length);
GELOGE(FAILED, "[Save][File]Failed, file_path:%s, file_header_len:%u, error_code:%u.",
file_path.c_str(), file_header.length, ret);
return FAILED; return FAILED;
} }


@@ -305,7 +350,7 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi
// Write partition data // Write partition data
auto &cur_partition_datas = all_partition_datas[index]; auto &cur_partition_datas = all_partition_datas[index];
for (const auto &partition_data : cur_partition_datas) { for (const auto &partition_data : cur_partition_datas) {
GELOGI("GC:size[%u]", partition_data.size);
GELOGI("part_size[%u]", partition_data.size);
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
WriteData(static_cast<const void *>(partition_data.data), partition_data.size, fd) != SUCCESS, ret = FAILED; WriteData(static_cast<const void *>(partition_data.data), partition_data.size, fd) != SUCCESS, ret = FAILED;
break); break);
@@ -313,14 +358,19 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi
} }
} while (0); } while (0);
// Close file // Close file
GE_CHK_BOOL_RET_STATUS(mmClose(fd) == EN_OK, FAILED, "Close file failed.");
if (mmClose(fd) != 0) { // mmClose 0: success
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno));
REPORT_CALL_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno));
ret = FAILED;
}
return ret; return ret;
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(const string &file_path, const void *data, FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(const string &file_path, const void *data,
int len) { int len) {
if (data == nullptr || len <= 0) { if (data == nullptr || len <= 0) {
GELOGE(FAILED, "Model_data is null or the length[%d] less than 1.", len);
GELOGE(FAILED, "[Check][Param]Failed, model_data is null or the length[%d] is less than 1.", len);
REPORT_INNER_ERROR("E19999", "Save file failed, the model_data is null or its length:%d is less than 1.", len);
return FAILED; return FAILED;
} }


@@ -335,7 +385,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(co


// Close file // Close file
if (mmClose(fd) != 0) { // mmClose 0: success if (mmClose(fd) != 0) { // mmClose 0: success
GELOGE(FAILED, "Close file failed.");
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno));
REPORT_CALL_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno));
ret = FAILED; ret = FAILED;
} }
return ret; return ret;


+ 8
- 3
ge/common/auth/file_saver.h View File

@@ -80,9 +80,14 @@ class FileSaver {


static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header, static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header,
ModelPartitionTable &model_partition_table, ModelPartitionTable &model_partition_table,
const std::vector<ModelPartition> &partitionDatas,
const std::vector<ModelPartition> &partition_datas,
ge::ModelBufferData& model); ge::ModelBufferData& model);


static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header,
const std::vector<ModelPartitionTable *> &model_partition_tables,
const std::vector<std::vector<ModelPartition>> &all_partition_datas,
ge::ModelBufferData &model);

static Status SaveToFile(const string &file_path, const void *data, int len); static Status SaveToFile(const string &file_path, const void *data, int len);


protected: protected:
@@ -113,8 +118,8 @@ class FileSaver {
ModelPartitionTable &model_partition_table, ModelPartitionTable &model_partition_table,
const std::vector<ModelPartition> &partition_datas); const std::vector<ModelPartition> &partition_datas);
static Status SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, static Status SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header,
vector<ModelPartitionTable *> &model_partition_tables,
const vector<vector<ModelPartition>> &all_partition_datas);
std::vector<ModelPartitionTable *> &model_partition_tables,
const std::vector<std::vector<ModelPartition>> &all_partition_datas);
}; };
} // namespace ge } // namespace ge
#endif // GE_COMMON_AUTH_FILE_SAVER_H_ #endif // GE_COMMON_AUTH_FILE_SAVER_H_

+ 15
- 8
ge/common/debug/memory_dumper.cc View File

@@ -41,14 +41,16 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::DumpToFile
GE_CHECK_NOTNULL(filename); GE_CHECK_NOTNULL(filename);
GE_CHECK_NOTNULL(data); GE_CHECK_NOTNULL(data);
if (len == 0) { if (len == 0) {
GELOGE(FAILED, "len is 0.");
GELOGE(FAILED, "[Check][Param]Failed, data length is 0.");
REPORT_INNER_ERROR("E19999", "Check param failed, data length is 0.");
return PARAM_INVALID; return PARAM_INVALID;
} }


// Open the file // Open the file
int fd = OpenFile(filename); int fd = OpenFile(filename);
if (fd == kInvalidFd) { if (fd == kInvalidFd) {
GELOGE(FAILED, "Open file failed.");
GELOGE(FAILED, "[Open][File]Failed, filename:%s.", filename);
REPORT_INNER_ERROR("E19999", "Opne file failed, filename:%s.", filename);
return FAILED; return FAILED;
} }


@@ -57,13 +59,15 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::DumpToFile
int32_t mmpa_ret = mmWrite(fd, data, len); int32_t mmpa_ret = mmWrite(fd, data, len);
// mmWrite return -1:Failed to write data to file;return -2:Invalid parameter // mmWrite return -1:Failed to write data to file;return -2:Invalid parameter
if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) { if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) {
GELOGE(FAILED, "Write to file failed. errno = %d, %s", mmpa_ret, strerror(errno));
GELOGE(FAILED, "[Write][Data]Failed, errno = %d, error:%s", mmpa_ret, strerror(errno));
REPORT_INNER_ERROR("E19999", "Write data failed, errno = %d, error:%s.", mmpa_ret, strerror(errno));
ret = FAILED; ret = FAILED;
} }


// Close the file // Close the file
if (mmClose(fd) != EN_OK) { // mmClose return 0: success if (mmClose(fd) != EN_OK) { // mmClose return 0: success
GELOGE(FAILED, "Close file failed.");
GELOGE(FAILED, "[Close][File]Failed, error_code:%u, filename:%s.", ret, filename);
REPORT_INNER_ERROR("E19999", "Close file failed, error_code:%u, filename:%s.", ret, filename);
ret = FAILED; ret = FAILED;
} }


@@ -89,7 +93,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::Open(const


fd_ = OpenFile(filename); fd_ = OpenFile(filename);
if (fd_ == kInvalidFd) { if (fd_ == kInvalidFd) {
GELOGE(FAILED, "Open %s failed.", filename);
GELOGE(FAILED, "[Open][File]Failed, filename:%s.", filename);
REPORT_INNER_ERROR("E19999", "Open file:%s failed.", filename);
return FAILED; return FAILED;
} }


@@ -104,7 +109,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::Dump(void
int32_t mmpa_ret = mmWrite(fd_, data, len); int32_t mmpa_ret = mmWrite(fd_, data, len);
// mmWrite return -1:failed to write data to file;return -2:invalid parameter // mmWrite return -1:failed to write data to file;return -2:invalid parameter
if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) { if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) {
GELOGE(FAILED, "Write to file failed. errno = %d, %s", mmpa_ret, strerror(errno));
GELOGE(FAILED, "[Write][Data]Failed, errno = %d, error:%s", mmpa_ret, strerror(errno));
REPORT_INNER_ERROR("E19999", "Write data to file failed, errno = %d, error:%s.", mmpa_ret, strerror(errno));
return FAILED; return FAILED;
} }


@@ -155,9 +161,10 @@ int MemoryDumper::OpenFile(const char *filename) {
// Using the O_EXCL, if the file already exists,return failed to avoid privilege escalation vulnerability. // Using the O_EXCL, if the file already exists,return failed to avoid privilege escalation vulnerability.
mmMode_t mode = M_IRUSR | M_IWUSR; mmMode_t mode = M_IRUSR | M_IWUSR;


int32_t fd = mmOpen2(real_path.c_str(), M_RDWR | M_CREAT | O_TRUNC, mode);
int32_t fd = mmOpen2(real_path.c_str(), M_RDWR | M_CREAT | M_APPEND, mode);
if (fd == EN_ERROR || fd == EN_INVALID_PARAM) { if (fd == EN_ERROR || fd == EN_INVALID_PARAM) {
GELOGE(kInvalidFd, "open file failed. errno = %d, %s", fd, strerror(errno));
GELOGE(kInvalidFd, "[Open][File]Failed. errno = %d, error:%s, filename:%s.",
fd, strerror(errno), filename);
return kInvalidFd; return kInvalidFd;
} }
return fd; return fd;


+ 1
- 1
ge/common/dump/dump_manager.cc View File

@@ -96,7 +96,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status DumpManager::SetDumpConf
dump_mode = dump_config.dump_mode; dump_mode = dump_config.dump_mode;
GELOGI("Dump mode is %s", dump_mode.c_str()); GELOGI("Dump mode is %s", dump_mode.c_str());
dump_properties.SetDumpMode(dump_mode); dump_properties.SetDumpMode(dump_mode);
dump_properties_map_.emplace(kInferSessionId, dump_properties);
dump_properties_map_[kInferSessionId] = dump_properties;


return SUCCESS; return SUCCESS;
} }


+ 36
- 7
ge/common/dump/dump_op.cc View File

@@ -20,6 +20,7 @@
#include "common/ge/datatype_util.h" #include "common/ge/datatype_util.h"
#include "framework/common/debug/ge_log.h" #include "framework/common/debug/ge_log.h"
#include "framework/common/util.h" #include "framework/common/util.h"
#include "framework/common/types.h"
#include "graph/anchor.h" #include "graph/anchor.h"
#include "graph/ge_tensor.h" #include "graph/ge_tensor.h"
#include "graph/op_desc.h" #include "graph/op_desc.h"
@@ -55,8 +56,10 @@ void DumpOp::SetLoopAddr(void *global_step, void *loop_per_iter, void *loop_cond
loop_cond_ = reinterpret_cast<uintptr_t>(loop_cond); loop_cond_ = reinterpret_cast<uintptr_t>(loop_cond);
} }


void DumpOp::SetDynamicModelInfo(const string &dynamic_model_name, uint32_t dynamic_model_id) {
void DumpOp::SetDynamicModelInfo(const string &dynamic_model_name, const string &dynamic_om_name,
uint32_t dynamic_model_id) {
dynamic_model_name_ = dynamic_model_name; dynamic_model_name_ = dynamic_model_name;
dynamic_om_name_ = dynamic_om_name;
dynamic_model_id_ = dynamic_model_id; dynamic_model_id_ = dynamic_model_id;
} }


@@ -200,6 +203,32 @@ Status DumpOp::ExecutorDumpOp(aicpu::dump::OpMappingInfo &op_mapping_info) {
return SUCCESS; return SUCCESS;
} }


Status DumpOp::SetDumpModelName(aicpu::dump::OpMappingInfo &op_mapping_info) {
if (dynamic_model_name_.empty() && dynamic_om_name_.empty()) {
GELOGI("Single op dump, no need set model name");
return SUCCESS;
}
std::set<std::string> model_list = dump_properties_.GetAllDumpModel();
bool not_find_by_omname = model_list.find(dynamic_om_name_) == model_list.end();
bool not_find_by_modelname = model_list.find(dynamic_model_name_) == model_list.end();
std::string dump_model_name = not_find_by_omname ? dynamic_model_name_ : dynamic_om_name_;
if (model_list.find(DUMP_ALL_MODEL) == model_list.end()) {
if (not_find_by_omname && not_find_by_modelname) {
std::string model_list_str;
for (auto &model : model_list) {
model_list_str += "[" + model + "].";
}
GELOGW("Model %s will not be set to dump, dump list: %s", dump_model_name.c_str(), model_list_str.c_str());
return FAILED;
}
}
if (!dump_model_name.empty() && dump_properties_.IsDumpOpen()) {
GELOGI("Dump model name is %s", dump_model_name.c_str());
op_mapping_info.set_model_name(dump_model_name);
}
return SUCCESS;
}

Status DumpOp::LaunchDumpOp() { Status DumpOp::LaunchDumpOp() {
GELOGI("Start to launch dump op %s", op_desc_->GetName().c_str()); GELOGI("Start to launch dump op %s", op_desc_->GetName().c_str());
int32_t device_id = 0; int32_t device_id = 0;
@@ -209,8 +238,7 @@ Status DumpOp::LaunchDumpOp() {
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
if (device_id < 0) { if (device_id < 0) {
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR,
"Check device_id failed, device_id = %d, which should be not less than 0.",
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "Check device_id failed, device_id = %d, which should be not less than 0.",
device_id); device_id);
return ACL_ERROR_GE_INTERNAL_ERROR; return ACL_ERROR_GE_INTERNAL_ERROR;
} }
@@ -220,11 +248,12 @@ Status DumpOp::LaunchDumpOp() {
op_mapping_info.set_flag(kAicpuLoadFlag); op_mapping_info.set_flag(kAicpuLoadFlag);
op_mapping_info.set_dump_step(dump_properties_.GetDumpStep()); op_mapping_info.set_dump_step(dump_properties_.GetDumpStep());
op_mapping_info.set_model_id(dynamic_model_id_); op_mapping_info.set_model_id(dynamic_model_id_);
if (!dynamic_model_name_.empty() && dump_properties_.IsDumpOpen()) {
op_mapping_info.set_model_name(dynamic_model_name_);

if (SetDumpModelName(op_mapping_info) != SUCCESS) {
return SUCCESS;
} }
SetOpMappingLoopAddr(global_step_, loop_per_iter_, loop_cond_, op_mapping_info); SetOpMappingLoopAddr(global_step_, loop_per_iter_, loop_cond_, op_mapping_info);
GELOGI("Dump step is %s ,dump path is %s ,in Launch dump op", dump_properties_.GetDumpStep().c_str(),
GELOGI("Dump step is %s ,dump path is %s in Launch dump op", dump_properties_.GetDumpStep().c_str(),
dump_path.c_str()); dump_path.c_str());
uint32_t task_id = 0; uint32_t task_id = 0;
uint32_t stream_id = 0; uint32_t stream_id = 0;
@@ -273,4 +302,4 @@ Status DumpOp::LaunchDumpOp() {
} }
return SUCCESS; return SUCCESS;
} }
} // namesapce ge
} // namespace ge

+ 3
- 1
ge/common/dump/dump_op.h View File

@@ -34,12 +34,13 @@ class DumpOp {
vector<uintptr_t> output_addrs, rtStream_t stream); vector<uintptr_t> output_addrs, rtStream_t stream);
Status LaunchDumpOp(); Status LaunchDumpOp();
void SetLoopAddr(void *global_step, void *loop_per_iter, void *loop_cond); void SetLoopAddr(void *global_step, void *loop_per_iter, void *loop_cond);
void SetDynamicModelInfo(const string &dynamic_model_name, uint32_t dynamic_model_id);
void SetDynamicModelInfo(const string &dynamic_model_name, const string &dynamic_om_name, uint32_t dynamic_model_id);


private: private:
Status ExecutorDumpOp(aicpu::dump::OpMappingInfo &op_mapping_info); Status ExecutorDumpOp(aicpu::dump::OpMappingInfo &op_mapping_info);
Status DumpOutput(aicpu::dump::Task &task); Status DumpOutput(aicpu::dump::Task &task);
Status DumpInput(aicpu::dump::Task &task); Status DumpInput(aicpu::dump::Task &task);
Status SetDumpModelName(aicpu::dump::OpMappingInfo &op_mapping_info);


DumpProperties dump_properties_; DumpProperties dump_properties_;
OpDescPtr op_desc_; OpDescPtr op_desc_;
@@ -54,6 +55,7 @@ class DumpOp {
uintptr_t loop_cond_; uintptr_t loop_cond_;


std::string dynamic_model_name_; std::string dynamic_model_name_;
std::string dynamic_om_name_;
std::uint32_t dynamic_model_id_; std::uint32_t dynamic_model_id_;
}; };
} // namespace ge } // namespace ge


+ 8
- 7
ge/common/dump/dump_properties.cc View File

@@ -35,14 +35,14 @@ const std::string kDumpStatusOpen = "on";
const uint32_t kAicoreOverflow = (0x1 << 0); const uint32_t kAicoreOverflow = (0x1 << 0);
const uint32_t kAtomicOverflow = (0x1 << 1); const uint32_t kAtomicOverflow = (0x1 << 1);
const uint32_t kAllOverflow = (kAicoreOverflow | kAtomicOverflow); const uint32_t kAllOverflow = (kAicoreOverflow | kAtomicOverflow);
}
} // namespace
namespace ge { namespace ge {
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties::DumpProperties(const DumpProperties &other) { FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties::DumpProperties(const DumpProperties &other) {
CopyFrom(other); CopyFrom(other);
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties &DumpProperties::operator=( FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties &DumpProperties::operator=(
const DumpProperties &other) {
const DumpProperties &other) {
CopyFrom(other); CopyFrom(other);
return *this; return *this;
} }
@@ -97,7 +97,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::InitByOpti


// The following is the new dump scenario of the fusion operator // The following is the new dump scenario of the fusion operator
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::AddPropertyValue( FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::AddPropertyValue(
const std::string &model, const std::set<std::string> &layers) {
const std::string &model, const std::set<std::string> &layers) {
for (const std::string &layer : layers) { for (const std::string &layer : layers) {
GELOGI("This model %s config to dump layer %s", model.c_str(), layer.c_str()); GELOGI("This model %s config to dump layer %s", model.c_str(), layer.c_str());
} }
@@ -138,7 +138,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpPrope
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpProperties::GetPropertyValue( FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpProperties::GetPropertyValue(
const std::string &model) const {
const std::string &model) const {
auto iter = model_dump_properties_map_.find(model); auto iter = model_dump_properties_map_.find(model);
if (iter != model_dump_properties_map_.end()) { if (iter != model_dump_properties_map_.end()) {
return iter->second; return iter->second;
@@ -147,8 +147,9 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpPrope
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY bool DumpProperties::IsLayerNeedDump( FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY bool DumpProperties::IsLayerNeedDump(
const std::string &model, const std::string &om_name, const std::string &op_name) const {
const std::string &model, const std::string &om_name, const std::string &op_name) const {
// if dump all // if dump all
GELOGD("model name is %s om name is %s op is %s in layer need dump", model.c_str(), om_name.c_str(), op_name.c_str());
if (model_dump_properties_map_.find(DUMP_ALL_MODEL) != model_dump_properties_map_.end()) { if (model_dump_properties_map_.find(DUMP_ALL_MODEL) != model_dump_properties_map_.end()) {
return true; return true;
} }
@@ -203,7 +204,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY const std::string &DumpProperti
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::SetDumpOpSwitch( FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::SetDumpOpSwitch(
const std::string &dump_op_switch) {
const std::string &dump_op_switch) {
dump_op_switch_ = dump_op_switch; dump_op_switch_ = dump_op_switch;
} }


@@ -270,4 +271,4 @@ void DumpProperties::SetDumpDebugOptions() {
GELOGI("ge.exec.enableDumpDebug is false or is not set."); GELOGI("ge.exec.enableDumpDebug is false or is not set.");
} }
} }
} // namespace
} // namespace ge

+ 241
- 0
ge/common/dump/exception_dumper.cc View File

@@ -0,0 +1,241 @@
/**
* Copyright 2019-2021 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 "common/dump/exception_dumper.h"

#include "common/ge/datatype_util.h"
#include "common/debug/memory_dumper.h"
#include "framework/common/debug/log.h"
#include "graph/manager/util/debug.h"
#include "graph/utils/tensor_utils.h"
#include "graph/load/model_manager/model_utils.h"
#include "proto/dump_task.pb.h"

namespace {
static uint64_t GetNowTime() {
uint64_t ret = 0;
mmTimeval tv;
if (mmGetTimeOfDay(&tv, nullptr) == 0) {
ret = tv.tv_sec * 1000000ULL + tv.tv_usec;
}

return ret;
}

static void ReplaceStringElem(std::string &str) {
for_each(str.begin(), str.end(), [](char &ch) {
if ((ch == ' ') || (ch == '.') || (ch == '/') || (ch == '\\')) {
ch = '_';
}
});
}

static void SetDumpData(const ge::OpDescInfo &op_desc_info, toolkit::dumpdata::DumpData &dump_data) {
dump_data.set_version("2.0");
dump_data.set_dump_time(GetNowTime());
dump_data.set_op_name(op_desc_info.op_name);
for (size_t i = 0; i < op_desc_info.input_format.size(); ++i) {
toolkit::dumpdata::OpInput input;
input.set_data_type(toolkit::dumpdata::OutputDataType(
ge::DataTypeUtil::GetIrDataType(op_desc_info.input_data_type[i])));
input.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.input_format[i]));
for (auto dim : op_desc_info.input_shape[i]) {
input.mutable_shape()->add_dim(dim);
}
input.set_size(op_desc_info.input_size[i]);
GELOGI("[Set][DumpData] The input size int exception is %ld", op_desc_info.input_size[i]);
dump_data.mutable_input()->Add(std::move(input));
}

for (size_t j = 0; j < op_desc_info.output_format.size(); ++j) {
toolkit::dumpdata::OpOutput output;
output.set_data_type(toolkit::dumpdata::OutputDataType(
ge::DataTypeUtil::GetIrDataType(op_desc_info.output_data_type[j])));
output.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.output_format[j]));
for (auto dim : op_desc_info.output_shape[j]) {
output.mutable_shape()->add_dim(dim);
}
output.set_size(op_desc_info.output_size[j]);
GELOGI("[Set][DumpData] The output size int exception is %ld", op_desc_info.output_size[j]);
dump_data.mutable_output()->Add(std::move(output));
}
}
} // namespace

namespace ge {
ExceptionDumper::~ExceptionDumper() {}

void ExceptionDumper::SaveDumpOpInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id,
vector<void *> &input_addrs, vector<void *> &output_addrs) {
OpDescInfo op_desc_info;
SaveOpDescInfo(op, task_id, stream_id, op_desc_info);
op_desc_info.input_addrs = input_addrs;
op_desc_info.output_addrs = output_addrs;
op_desc_info_.emplace_back(std::move(op_desc_info));
}

void ExceptionDumper::SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op,
uint32_t task_id, uint32_t stream_id) {
OpDescInfo op_desc_info;
SaveOpDescInfo(op, task_id, stream_id, op_desc_info);
op_desc_info.input_addrs = ModelUtils::GetInputDataAddrs(model_param, op);
op_desc_info.output_addrs = ModelUtils::GetOutputDataAddrs(model_param, op);
op_desc_info_.emplace_back(std::move(op_desc_info));
}

void ExceptionDumper::SaveOpDescInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id,
OpDescInfo &op_desc_info) {
if (op == nullptr) {
GELOGW("[Save][OpExceptionInfo] op desc ptr is null.");
return;
}
GELOGD("[Save][OpExceptionInfo] Start to save dump op [%s] info of task_id: %u, stream_id: %u",
op->GetName().c_str(), task_id, stream_id);
op_desc_info.op_name = op->GetName();
op_desc_info.op_type = op->GetType();
op_desc_info.task_id = task_id;
op_desc_info.stream_id = stream_id;
for (size_t i = 0; i < op->GetAllInputsSize(); ++i) {
GeTensorDescPtr input_tensor_desc = op->MutableInputDesc(i);
if (input_tensor_desc == nullptr) {
continue;
}
op_desc_info.input_format.emplace_back(input_tensor_desc->GetFormat());
op_desc_info.input_shape.emplace_back(input_tensor_desc->GetShape().GetDims());
op_desc_info.input_data_type.emplace_back(input_tensor_desc->GetDataType());
int64_t input_size = 0;

if (TensorUtils::GetTensorSizeInBytes(*input_tensor_desc, input_size) != SUCCESS) {
GELOGW("[Save][OpExceptionInfo] Op [%s] get input size failed.", op->GetName().c_str());
return;
}
GELOGD("[Save][OpExceptionInfo] Save dump op info, the input size is %ld", input_size);
op_desc_info.input_size.emplace_back(input_size);
}
for (size_t j = 0; j < op->GetOutputsSize(); ++j) {
GeTensorDescPtr output_tensor_desc = op->MutableOutputDesc(j);
if (output_tensor_desc == nullptr) {
continue;
}
op_desc_info.output_format.emplace_back(output_tensor_desc->GetFormat());
op_desc_info.output_shape.emplace_back(output_tensor_desc->GetShape().GetDims());
op_desc_info.output_data_type.emplace_back(output_tensor_desc->GetDataType());
int64_t output_size = 0;
if (TensorUtils::GetTensorSizeInBytes(*output_tensor_desc, output_size) != SUCCESS) {
GELOGW("[Save][OpExceptionInfo] Op [%s] get output size failed.", op->GetName().c_str());
return;
}
GELOGD("[Save][OpExceptionInfo] Save dump op info, the output size is %ld.", output_size);
op_desc_info.output_size.emplace_back(output_size);
}
}

Status ExceptionDumper::DumpExceptionInfo(const std::vector<rtExceptionInfo> &exception_infos) const {
GELOGI("[Dump][Exception] Start to dump exception info");
for (const rtExceptionInfo &iter : exception_infos) {
OpDescInfo op_desc_info;
if (GetOpDescInfo(iter.streamid, iter.taskid, op_desc_info)) {
toolkit::dumpdata::DumpData dump_data;
SetDumpData(op_desc_info, dump_data);
uint64_t now_time = GetNowTime();
std::string op_name = op_desc_info.op_name;
std::string op_type = op_desc_info.op_type;
ReplaceStringElem(op_name);
ReplaceStringElem(op_type);
string dump_file_path =
"./" + op_type + "." + op_name + "." + std::to_string(op_desc_info.task_id) + "." + std::to_string(now_time);
GELOGI("[Dump][Exception] The exception dump file path is %s", dump_file_path.c_str());

uint64_t proto_size = dump_data.ByteSizeLong();
std::unique_ptr<char[]> proto_msg(new (std::nothrow) char[proto_size]);
bool ret = dump_data.SerializeToArray(proto_msg.get(), proto_size);
if (!ret || proto_size == 0) {
REPORT_INNER_ERROR("E19999", "Serialize proto to string fail");
GELOGE(PARAM_INVALID, "[Dump][Exception] Dump data proto serialize failed");
return PARAM_INVALID;
}

GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), &proto_size, sizeof(uint64_t)),
"Failed to dump proto size");
GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), proto_msg.get(), proto_size),
"Failed to dump proto msg");
if (DumpExceptionInput(op_desc_info, dump_file_path) != SUCCESS) {
GELOGE(PARAM_INVALID, "[Dump][Exception] Dump exception input failed");
return PARAM_INVALID;
}

if (DumpExceptionOutput(op_desc_info, dump_file_path) != SUCCESS) {
GELOGE(PARAM_INVALID, "[Dump][Exception] Dump exception output failed");
return PARAM_INVALID;
}
GELOGI("[Dump][Exception] Dump exception info SUCCESS");
} else {
GELOGE(PARAM_INVALID, "[Dump][Exception] Get op desc info failed,task id:%u,stream id:%u",
iter.taskid, iter.streamid);
return PARAM_INVALID;
}
}
return SUCCESS;
}

bool ExceptionDumper::GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const {
GELOGI("[Get][OpDescInfo] There are %zu op need to dump.", op_desc_info_.size());
for (size_t index = 0; index < op_desc_info_.size(); ++index) {
OpDescInfo dump_op_info = op_desc_info_.at(index);
if (dump_op_info.task_id == task_id && dump_op_info.stream_id == stream_id) {
GELOGI("[Get][OpDescInfo] Find exception op [%s] of task_id: %u, stream_id: %u.",
dump_op_info.op_name.c_str(), task_id, stream_id);
op_desc_info = dump_op_info;
return true;
}
}
return false;
}

Status ExceptionDumper::DumpExceptionInput(const OpDescInfo &op_desc_info, const string &dump_file) const {
GELOGI("[Dump][ExceptionInput] Start to dump exception input");
for (size_t i = 0; i < op_desc_info.input_addrs.size(); i++) {
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.input_addrs.at(i), op_desc_info.input_size.at(i)) != SUCCESS) {
GELOGE(PARAM_INVALID, "[Dump][ExceptionInput] Dump the %zu input data of op [%s] failed",
i, op_desc_info.op_name.c_str());
return PARAM_INVALID;
}
}
return SUCCESS;
}

Status ExceptionDumper::DumpExceptionOutput(const OpDescInfo &op_desc_info, const string &dump_file) const {
GELOGI("[Dump][ExceptionOutput] Start to dump exception output");
for (size_t i = 0; i < op_desc_info.output_addrs.size(); i++) {
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.output_addrs.at(i), op_desc_info.output_size.at(i)) !=
SUCCESS) {
GELOGE(PARAM_INVALID, "[Dump][ExceptionInput] Dump the %zu input data of op [%s] failed",
i, op_desc_info.op_name.c_str());
return PARAM_INVALID;
}
}
return SUCCESS;
}

OpDescInfo *ExceptionDumper::MutableOpDescInfo(uint32_t task_id, uint32_t stream_id) {
for (OpDescInfo &op_desc_info : op_desc_info_) {
if (op_desc_info.task_id == task_id && op_desc_info.stream_id == stream_id) {
return &op_desc_info;
}
}
return nullptr;
}
} // namespace ge

+ 48
- 0
ge/common/dump/exception_dumper.h View File

@@ -0,0 +1,48 @@
/**
* Copyright 2019-2021 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef GE_COMMON_DUMP_EXCEPTION_DUMPER_H_
#define GE_COMMON_DUMP_EXCEPTION_DUMPER_H_

#include <vector>

#include "graph/op_desc.h"
#include "framework/common/ge_types.h"
#include "graph/load/model_manager/task_info/task_info.h"

namespace ge {
class ExceptionDumper {
public:
ExceptionDumper() = default;
~ExceptionDumper();

void SaveDumpOpInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id,
std::vector<void *> &input_addrs, std::vector<void *> &output_addrs);
void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id);
Status DumpExceptionInfo(const std::vector<rtExceptionInfo> &exception_infos) const;
bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const;
OpDescInfo *MutableOpDescInfo(uint32_t task_id, uint32_t stream_id);

private:
void SaveOpDescInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id, OpDescInfo &op_desc_info);
Status DumpExceptionInput(const OpDescInfo &op_desc_info, const std::string &dump_file) const;
Status DumpExceptionOutput(const OpDescInfo &op_desc_info, const std::string &dump_file) const;

std::vector<OpDescInfo> op_desc_info_;
};
} // namespace ge

#endif // GE_COMMON_DUMP_EXCEPTION_DUMPER_H_

+ 1
- 5
ge/common/dump/opdebug_register.cc View File

@@ -80,13 +80,11 @@ Status OpdebugRegister::RegisterDebugForStream(rtStream_t stream, uint32_t op_de


uint32_t debug_stream_id = 0; uint32_t debug_stream_id = 0;
uint32_t debug_task_id = 0; uint32_t debug_task_id = 0;
#ifdef ONLY_COMPILE_OPEN_SRC
auto rt_ret = rtDebugRegisterForStream(stream, op_debug_mode, op_debug_addr_, &debug_stream_id, &debug_task_id); auto rt_ret = rtDebugRegisterForStream(stream, op_debug_mode, op_debug_addr_, &debug_stream_id, &debug_task_id);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "rtDebugRegisterForStream error, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "rtDebugRegisterForStream error, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
#endif
GELOGD("debug_task_id:%u, debug_stream_id:%u in stream overflow.", debug_task_id, debug_stream_id); GELOGD("debug_task_id:%u, debug_stream_id:%u in stream overflow.", debug_task_id, debug_stream_id);
data_dumper.SaveOpDebugId(debug_task_id, debug_stream_id, p2p_debug_addr_, true); data_dumper.SaveOpDebugId(debug_task_id, debug_stream_id, p2p_debug_addr_, true);
return SUCCESS; return SUCCESS;
@@ -94,7 +92,6 @@ Status OpdebugRegister::RegisterDebugForStream(rtStream_t stream, uint32_t op_de


void OpdebugRegister::UnregisterDebugForStream(rtStream_t stream) { void OpdebugRegister::UnregisterDebugForStream(rtStream_t stream) {
rtError_t rt_ret = RT_ERROR_NONE; rtError_t rt_ret = RT_ERROR_NONE;
#ifdef ONLY_COMPILE_OPEN_SRC
if (stream != nullptr) { if (stream != nullptr) {
GELOGD("start call rtDebugUnRegisterForStream in unknown shape over flow."); GELOGD("start call rtDebugUnRegisterForStream in unknown shape over flow.");
rt_ret = rtDebugUnRegisterForStream(stream); rt_ret = rtDebugUnRegisterForStream(stream);
@@ -102,7 +99,6 @@ void OpdebugRegister::UnregisterDebugForStream(rtStream_t stream) {
GELOGW("rtDebugUnRegisterForStream failed, ret: 0x%X", rt_ret); GELOGW("rtDebugUnRegisterForStream failed, ret: 0x%X", rt_ret);
} }
} }
#endif


if (op_debug_addr_ != nullptr) { if (op_debug_addr_ != nullptr) {
rt_ret = rtFree(op_debug_addr_); rt_ret = rtFree(op_debug_addr_);
@@ -145,4 +141,4 @@ Status OpdebugRegister::MallocMemForOpdebug() {
return SUCCESS; return SUCCESS;
} }


} // namespace ge
} // namespace ge

+ 5
- 1
ge/common/formats/format_transfers/datatype_transfer.cc View File

@@ -154,7 +154,11 @@ Status DataTypeTransfer::TransDataType(const CastArgs &args, TransResult &result


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to alloc the memory for dst buf %zu, data size %zu", total_size, args.src_data_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION,
"[Allocate][DSTMemory]Failed, memory for dst buf %zu, data size %zu",
total_size, args.src_data_size);
REPORT_CALL_ERROR("E19999", "Failed to allocate memory for dst buf %zu, data size %zu",
total_size, args.src_data_size);
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }




+ 42
- 12
ge/common/formats/format_transfers/format_transfer_c1hwncoc0_hwcn.cc View File

@@ -49,11 +49,15 @@ Status CheckArgsForC1hwncoc0ToHwcn(const TransArgs &args) {
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(src_shape, kC1hwncoc0DimsNum)) { if (!CheckShapeValid(src_shape, kC1hwncoc0DimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][SrcShape]Failed, src shape %s",
ShapeToString(src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check src shape %s", ShapeToString(src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) { if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s.", ShapeToString(dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s.",
ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
auto cube_size = GetCubeSizeByDataType(args.src_data_type); auto cube_size = GetCubeSizeByDataType(args.src_data_type);
@@ -73,9 +77,17 @@ Status CheckArgsForC1hwncoc0ToHwcn(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION,
"[Allocate][DSTMemory]Failed to allcoate memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -115,10 +127,16 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to copy data from C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld to "
"[Operate][Memory]Failed to copy data from "
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld to "
"HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d", "HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset,
ret);
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, src_offset,
h_idx, w_idx, c_idx, n_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to copy data from "
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld to "
"HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, src_offset,
h_idx, w_idx, c_idx, n_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -144,8 +162,13 @@ Status FormatTransferC1hwncoc0Hwcn::TransFormat(const TransArgs &args, TransResu
result.length = static_cast<size_t>(total_size); result.length = static_cast<size_t>(total_size);
return SUCCESS; return SUCCESS;
} }
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s.", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][Shape]Failed, total size %ld from dst shape %s, "
"src shape %s.",
total_size, ShapeToString(args.dst_shape).c_str(),
ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Get shape faield, total size %ld from dst shape %s, src shape %s.",
total_size, ShapeToString(args.dst_shape).c_str(),
ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from C1HWNCoC0 to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld.", GELOGD("Begin to trans format from C1HWNCoC0 to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld.",
@@ -153,9 +176,16 @@ Status FormatTransferC1hwncoc0Hwcn::TransFormat(const TransArgs &args, TransResu
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);
ret = GetDstDataAfterTrans(args, result, size, total_size); ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
GELOGE(ret, "[Get][Data]Failed when after trans, src shape %s, data type %s, dst shape %s, "
"memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
return ret; return ret;
} }
return SUCCESS; return SUCCESS;


+ 12
- 5
ge/common/formats/format_transfers/format_transfer_dhwcn_fracz3D.cc View File

@@ -94,9 +94,14 @@ Status TransFormatDhwckToFz3D(const TransArgs &args, TransResult &result) {


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -122,8 +127,10 @@ Status TransFormatDhwckToFz3D(const TransArgs &args, TransResult &result) {
args.data + src_idx * data_size, static_cast<size_t>(data_size)); args.data + src_idx * data_size, static_cast<size_t>(data_size));
} }
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d",
dst_offset, ret, pad_zero);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at "
"offset %ld, error-code %d, pad mode %d", dst_offset, ret, pad_zero);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, "
"error-code %d, pad mode %d", dst_offset, ret, pad_zero);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }


+ 12
- 5
ge/common/formats/format_transfers/format_transfer_dhwnc_fracz3D_transpose.cc View File

@@ -95,9 +95,14 @@ Status TransFormatDhwncToFz3DTranspose(const TransArgs &args, TransResult &resul


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -123,8 +128,10 @@ Status TransFormatDhwncToFz3DTranspose(const TransArgs &args, TransResult &resul
args.data + src_idx * data_size, static_cast<size_t>(data_size)); args.data + src_idx * data_size, static_cast<size_t>(data_size));
} }
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d",
dst_offset, ret, pad_zero);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at "
"offset %ld, error-code %d, pad mode %d", dst_offset, ret, pad_zero);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, "
"error-code %d, pad mode %d", dst_offset, ret, pad_zero);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }


+ 127
- 33
ge/common/formats/format_transfers/format_transfer_fractal_nz.cc View File

@@ -60,7 +60,7 @@ bool CheckShape(Format format, const ShapeVector &shape) {
default: default:
std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) + std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) +
" and FORMAT_FRACTAL_NZ is not supported."; " and FORMAT_FRACTAL_NZ is not supported.";
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str());
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str());
return false; return false;
} }
} }
@@ -87,7 +87,10 @@ Status TransShapeToFracNz(const ShapeVector &src_shape, DataType data_type, Shap
hw_shape.push_back(DIM_DEFAULT_VALUE); hw_shape.push_back(DIM_DEFAULT_VALUE);
hw_shape.push_back(src_shape[kNdDimIndexN]); hw_shape.push_back(src_shape[kNdDimIndexN]);
if (!IsShapeValid(dst_shape)) { if (!IsShapeValid(dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s",
ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -106,7 +109,10 @@ Status TransShapeToFracNz(const ShapeVector &src_shape, DataType data_type, Shap
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]); hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]);
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]); hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]);
if (!IsShapeValid(dst_shape)) { if (!IsShapeValid(dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s",
ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -117,10 +123,12 @@ Status CheckShapeRelation(const TransArgs &args, ShapeVector &hw_shape) {
ShapeVector expect_src_shape; ShapeVector expect_src_shape;
auto ret = TransShapeToFracNz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape); auto ret = TransShapeToFracNz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Trans shape from %s to %s, shape %s to %s, data type %s failed",
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), ShapeToString(args.dst_shape).c_str(),
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
GELOGE(ret, "[Transfer][ShapeToFracNz]Failed, shape from %s to %s, shape %s to %s, "
"data type %s, error_code:%u", TypeUtils::FormatToSerialString(args.dst_format).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
ShapeToString(args.dst_shape).c_str(),
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), ret);
return ret; return ret;
} }
if (!IsTransShapeSrcCorrect(args, expect_src_shape)) { if (!IsTransShapeSrcCorrect(args, expect_src_shape)) {
@@ -139,9 +147,14 @@ Status TransFormatFromNdToFracNz(const TransArgs &args, TransResult &result, con


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allocate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allocate memory for dst buf %ld "
"trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -175,7 +188,10 @@ Status TransFormatFromNdToFracNz(const TransArgs &args, TransResult &result, con
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size * w0)); static_cast<size_t>(size * w0));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,"[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d", dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -189,7 +205,10 @@ Status TransFormatFromNdToFracNz(const TransArgs &args, TransResult &result, con
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,"[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d", dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -210,9 +229,14 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to trans format "
"from %s to %s, memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
REPORT_CALL_ERROR("E19999", "Failed to trans format from %s to %s and allocate memory "
"for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -246,7 +270,11 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con
ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size * w0)); static_cast<size_t>(size * w0));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d",
dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -260,7 +288,11 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con
ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d",
dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -274,17 +306,39 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con


Status FormatTransferFractalNz::TransFormat(const TransArgs &args, TransResult &result) { Status FormatTransferFractalNz::TransFormat(const TransArgs &args, TransResult &result) {
if (!IsDataTypeSupport(args.src_data_type)) { if (!IsDataTypeSupport(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID,
"[Check][Datatype]Failed, trans format from %s to %s, src shape %s, dst shape %s, "
"data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check datatype failed, trans format from %s to %s, src shape %s, "
"dst shape %s, data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) { if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"[Check][Shape]Failed, trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check shape failed, trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s",
@@ -307,16 +361,34 @@ Status FormatTransferFractalNz::TransShape(Format src_format, const ShapeVector
Format dst_format, ShapeVector &dst_shape) { Format dst_format, ShapeVector &dst_shape) {
if (!IsDataTypeSupport(data_type)) { if (!IsDataTypeSupport(data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, GELOGE(ACL_ERROR_GE_DATATYPE_INVALID,
"Trans format from %s to %s, src shape %s, data type %s is not supported",
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str());
"[Check][Datatype]Failed, trans format from %s to %s, src shape %s, "
"data type %s is not supported",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check datatype failed, trans format from %s to %s, src shape %s, "
"data type %s is not supported",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShape(src_format, src_shape)) { if (!CheckShape(src_format, src_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"Trans format from %s to %s, src shape %s, data type %s is not supported",
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str());
"[Check][Shape]Failed, trans format from %s to %s, src shape %s, "
"data type %s is not supported",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check shape failed, trans format from %s to %s, src shape %s, "
"data type %s is not supported",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
ShapeVector hw_shape; ShapeVector hw_shape;
@@ -325,18 +397,40 @@ Status FormatTransferFractalNz::TransShape(Format src_format, const ShapeVector


Status FormatTransferFractalNzND::TransFormat(const TransArgs &args, TransResult &result) { Status FormatTransferFractalNzND::TransFormat(const TransArgs &args, TransResult &result) {
if (!IsDataTypeSupport(args.src_data_type)) { if (!IsDataTypeSupport(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID,
"[Check][Datatype]Failed, trans format from %s to %s, src shape %s, dst shape %s, "
"data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check datatype failed, trans format from %s to %s, src shape %s, "
"dst shape %s, data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }


if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) { if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"[Check][Shape]Failed, trans format from %s to %s, src shape %s, dst shape %s, "
"data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check shape failed, trans format from %s to %s, src shape %s, "
"dst shape %s, data type %s is not supported",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s",


+ 201
- 22
ge/common/formats/format_transfers/format_transfer_fractal_z.cc View File

@@ -29,6 +29,25 @@
namespace ge { namespace ge {
namespace formats { namespace formats {
namespace { namespace {
constexpr int64_t kDim = 1;
static int64_t Measure(int64_t x, int64_t y) {
int64_t z = y;
while (x % y != 0) {
z = x % y;
x = y;
y = z;
}
return z;
}
// least common multiple
static int64_t Lcm(int64_t a, int64_t b) {
if (b == 0) {
return -1;
}
int64_t temp = (a * b) / (Measure(a, b));
return temp;
}

Status CheckDataTypeSupport(DataType data_type) { return GetSizeByDataType(data_type) > 0 ? SUCCESS : UNSUPPORTED; } Status CheckDataTypeSupport(DataType data_type) { return GetSizeByDataType(data_type) > 0 ? SUCCESS : UNSUPPORTED; }


/** /**
@@ -54,8 +73,39 @@ Status TransShapeToFz(int64_t n, int64_t c, int64_t h, int64_t w, DataType data_
dst_shape.push_back(kNiSize); dst_shape.push_back(kNiSize);
dst_shape.push_back(c0); dst_shape.push_back(c0);
if (!IsShapeValid(dst_shape)) { if (!IsShapeValid(dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed, dst shape %s",
ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID;
}
return SUCCESS;
}

Status TransShapeToFzWithGroups(int64_t n, int64_t c, int64_t h, int64_t w, DataType data_type, std::vector<int64_t> &dst_shape,
int64_t groups) {
auto c0 = GetCubeSizeByDataType(data_type);
if (c0 < 0) {
return ACL_ERROR_GE_DATATYPE_INVALID;
}
int64_t cin_ori = c;
int64_t cout_ori = n / groups;
int64_t cube_k = GetCubeSizeByDataType(data_type);
int64_t e_mult = std::min(
Lcm(Lcm(cin_ori, cube_k) / (cin_ori), Lcm(cout_ori, static_cast<int64_t>(kCubeSize)) / (cout_ori)),
groups);
int64_t cin_opt = Ceil(e_mult * cin_ori, cube_k) * cube_k;
int64_t c1_dim = cin_opt / cube_k;
int64_t g_dim = Ceil(groups, e_mult);
auto n1 = Ceil(cout_ori * e_mult, static_cast<int64_t>(kCubeSize));
dst_shape.clear();
dst_shape.push_back(g_dim * c1_dim * h * w);
dst_shape.push_back(n1);
dst_shape.push_back(16);
dst_shape.push_back(cube_k);
if (!IsShapeValid(dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed, dst shape %s",
ShapeToString(dst_shape).c_str()); ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -86,6 +136,21 @@ Status TransShapeHwcnToFz(const std::vector<int64_t> &src_shape, DataType data_t
return TransShapeToFz(n, c, h, w, data_type, dst_shape); return TransShapeToFz(n, c, h, w, data_type, dst_shape);
} }


Status TransShapeHwcnToFzWithGroups(const std::vector<int64_t> &src_shape, DataType data_type, std::vector<int64_t> &dst_shape
, int64_t groups){
if (!CheckShapeValid(src_shape, kHwcnDimsNum)) {
return ACL_ERROR_GE_SHAPE_INVALID;
}

auto h = src_shape.at(kHwcnH);
auto w = src_shape.at(kHwcnW);
auto c = src_shape.at(kHwcnC);
auto n = src_shape.at(kHwcnN);

return TransShapeToFzWithGroups(n, c, h, w, data_type, dst_shape, groups);
}


Status TransShapeNhwcToFz(const std::vector<int64_t> &src_shape, DataType data_type, std::vector<int64_t> &dst_shape) { Status TransShapeNhwcToFz(const std::vector<int64_t> &src_shape, DataType data_type, std::vector<int64_t> &dst_shape) {
if (!CheckShapeValid(src_shape, kNhwcDimsNum)) { if (!CheckShapeValid(src_shape, kNhwcDimsNum)) {
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
@@ -127,9 +192,14 @@ Status TransFormatFromNchwToFz(const TransArgs &args, TransResult &result) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
dst == nullptr, dst == nullptr,
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION;); return ACL_ERROR_GE_MEMORY_ALLOCATION;);


for (int64_t vfi = 0; vfi < vf_cnt; vfi++) { for (int64_t vfi = 0; vfi < vf_cnt; vfi++) {
@@ -173,8 +243,12 @@ Status TransFormatFromNchwToFz(const TransArgs &args, TransResult &result) {
} }
} }
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d pad mode %d", offset,
ret, need_pad_zero);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,"[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d pad mode %d",
offset, ret, need_pad_zero);
REPORT_CALL_ERROR("E19999","Failed to operate dst memory at offset %ld, "
"error-code %d pad mode %d",
offset, ret, need_pad_zero);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -187,6 +261,89 @@ Status TransFormatFromNchwToFz(const TransArgs &args, TransResult &result) {
return SUCCESS; return SUCCESS;
} }


Status TransFormatHwcnToFzWithGroups(const TransArgs &args, TransResult &result, int64_t groups){
int64_t h_dim = args.src_shape[kHwcnH];
int64_t w_dim = args.src_shape[kHwcnW];
int64_t c_dim = args.src_shape[kHwcnC];
int64_t n_dim = args.src_shape[kHwcnN];
int64_t cin_ori = c_dim;
int64_t cout_ori = n_dim / groups;
if (cin_ori == 0 || cout_ori == 0) {
GELOGE(GRAPH_FAILED, "[Check][Param]Failed, cin_ori, cout_ori must not be equal 0, "
"and current cin_ori, cout_ori, groups are %ld %ld %ld", cin_ori, cout_ori, groups);
REPORT_CALL_ERROR("E19999", "Check graph param failed, cin_ori, cout_ori must not be equal 0,"
"and current cin_ori, cout_ori, groups are %ld %ld %ld",
cin_ori, cout_ori, groups);
return GRAPH_FAILED;
}
const int64_t cube_k = GetCubeSizeByDataType(args.src_data_type);
int64_t e_mult = std::min(
Lcm(Lcm(cin_ori, cube_k) / (cin_ori), Lcm(cout_ori, static_cast<int64_t>(kCubeSize)) / (cout_ori)),
groups);
int64_t cin_opt = Ceil(e_mult * cin_ori, cube_k) * cube_k;
int64_t cout_opt = Ceil(e_mult * cout_ori, static_cast<int64_t>(kCubeSize)) * static_cast<int64_t>(kCubeSize);
int64_t c1_dim = cin_opt / cube_k;
int64_t g_dim = Ceil(groups, e_mult);
int64_t dim_cin = cin_opt / cube_k;
int64_t data_size = GetSizeByDataType(args.src_data_type);
int64_t size_output_data = g_dim * kDim * dim_cin * h_dim * w_dim * cout_opt * cube_k * data_size;
if (size_output_data == 0) {
result.length = static_cast<size_t>(size_output_data);
return SUCCESS;
}
errno_t ret = EOK;
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[size_output_data], std::default_delete<uint8_t[]>());
if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
size_output_data, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
size_output_data, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION;
}
ret = memset_s(dst.get(), static_cast<size_t>(size_output_data), 0, static_cast<size_t>(size_output_data));
if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed, ret is %d", ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory, ret is %d", ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
}
for (int64_t g = 0; g < groups; g++) {
for (int64_t d = 0; d < kDim; d++) {
for (int64_t c = 0; c < c_dim; c++) {
for (int64_t h = 0; h < h_dim; h++) {
for (int64_t w = 0; w < w_dim; w++) {
for (int64_t n = 0; n < cout_ori; n++) {
int64_t e_val = g % e_mult;
int64_t dst_ci = e_val * cin_ori + c;
int64_t dst_co = e_val * cout_ori + n;
int64_t src_co = g * cout_ori + n;
int64_t tempory = dst_ci % cube_k;
int64_t srx_inx = 0;
int64_t dst_inx = (g / e_mult) * kDim * c1_dim * h_dim * w_dim * cout_opt * cube_k +
d * c1_dim * h_dim * w_dim * cout_opt * cube_k +
(dst_ci / cube_k) * h_dim * w_dim * cout_opt * cube_k +
h * w_dim * cout_opt * cube_k + w * cout_opt * cube_k +
dst_co * cube_k + tempory;
srx_inx = d * h_dim * w_dim * c_dim * n_dim + h * w_dim * c_dim * n_dim +
w * c_dim * n_dim + c * n_dim + src_co;
char *dst_data = reinterpret_cast<char *>(dst.get() + dst_inx * data_size);
const char *src_data = reinterpret_cast<const char *>(args.data + srx_inx * data_size);
for (int64_t index = 0; index < data_size; index++) {
*dst_data++ = *src_data++;
}
}
}
}
}
}
}
result.data = dst;
result.length = static_cast<size_t>(size_output_data);
return SUCCESS;
}
Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) { Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) {
int64_t h = args.src_shape[kHwcnH]; int64_t h = args.src_shape[kHwcnH];
int64_t w = args.src_shape[kHwcnW]; int64_t w = args.src_shape[kHwcnW];
@@ -213,9 +370,14 @@ Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
dst == nullptr, dst == nullptr,
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION;); return ACL_ERROR_GE_MEMORY_ALLOCATION;);


for (int64_t c1i = 0; c1i < c1; c1i++) { for (int64_t c1i = 0; c1i < c1; c1i++) {
@@ -235,7 +397,8 @@ Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) {
static_cast<size_t>(data_size)); static_cast<size_t>(data_size));
} else { } else {
if (protected_size < data_size) { if (protected_size < data_size) {
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Failed to operate the dst memory, protected_size is %ld and size is %ld",
GELOGE(ACL_ERROR_GE_PARAM_INVALID,"[Operate][DSTMemory]Failed, protected_size "
"is %ld and size is %ld",
protected_size, data_size); protected_size, data_size);
return ACL_ERROR_GE_PARAM_INVALID; return ACL_ERROR_GE_PARAM_INVALID;
} }
@@ -247,8 +410,11 @@ Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) {
} }
} }
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d",
dst_offset, ret, pad_zero);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed, "
"at offset %ld, error-code %d, pad mode %d", dst_offset, ret, pad_zero);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memoery at offset %ld, "
"error-code %d, pad mode %d",
dst_offset, ret, pad_zero);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -288,9 +454,14 @@ Status TransFormatNhwcToFz(const TransArgs &args, TransResult &result) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
dst == nullptr, dst == nullptr,
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION;); return ACL_ERROR_GE_MEMORY_ALLOCATION;);


for (int64_t c1i = 0; c1i < c1; c1i++) { for (int64_t c1i = 0; c1i < c1; c1i++) {
@@ -310,7 +481,8 @@ Status TransFormatNhwcToFz(const TransArgs &args, TransResult &result) {
static_cast<size_t>(data_size)); static_cast<size_t>(data_size));
} else { } else {
if (protected_size < data_size) { if (protected_size < data_size) {
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Failed to operate the dst memory, protected_size is %ld and size is %ld",
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Operate][DSTMemory]Failed, protected_size "
"is %ld and size is %ld",
protected_size, data_size); protected_size, data_size);
return ACL_ERROR_GE_PARAM_INVALID; return ACL_ERROR_GE_PARAM_INVALID;
} }
@@ -322,8 +494,11 @@ Status TransFormatNhwcToFz(const TransArgs &args, TransResult &result) {
} }
} }
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d",
dst_offset, ret, pad_zero);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld,"
" error-code %d, pad mode %d", dst_offset, ret, pad_zero);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, "
"error-code %d, pad mode %d",
dst_offset, ret, pad_zero);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -355,15 +530,16 @@ Status FormatTransferFractalZ::TransFormat(const TransArgs &args, TransResult &r
if (args.src_format == FORMAT_NHWC && args.dst_format == FORMAT_FRACTAL_Z) { if (args.src_format == FORMAT_NHWC && args.dst_format == FORMAT_FRACTAL_Z) {
return TransFormatNhwcToFz(args, result); return TransFormatNhwcToFz(args, result);
} }

if (args.src_format == FORMAT_HWCN && args.dst_format == FORMAT_FRACTAL_Z) {
if ((args.src_format == FORMAT_HWCN) && (GetPrimaryFormat(args.dst_format) == FORMAT_FRACTAL_Z)) {
if (GetSubFormat(args.dst_format) > 1) {
return TransFormatHwcnToFzWithGroups(args, result, GetSubFormat(args.dst_format));
}
return TransFormatHwcnToFz(args, result); return TransFormatHwcnToFz(args, result);
} }


if (args.src_format == FORMAT_NCHW && args.dst_format == FORMAT_FRACTAL_Z) { if (args.src_format == FORMAT_NCHW && args.dst_format == FORMAT_FRACTAL_Z) {
return TransFormatFromNchwToFz(args, result); return TransFormatFromNchwToFz(args, result);
} }

return ACL_ERROR_GE_FORMAT_INVALID; return ACL_ERROR_GE_FORMAT_INVALID;
} }


@@ -376,7 +552,10 @@ Status FormatTransferFractalZ::TransShape(Format src_format, const std::vector<i
if (src_format == FORMAT_NHWC && dst_format == FORMAT_FRACTAL_Z) { if (src_format == FORMAT_NHWC && dst_format == FORMAT_FRACTAL_Z) {
return TransShapeNhwcToFz(src_shape, data_type, dst_shape); return TransShapeNhwcToFz(src_shape, data_type, dst_shape);
} }
if (src_format == FORMAT_HWCN && dst_format == FORMAT_FRACTAL_Z) {
if ((src_format == FORMAT_HWCN) && (GetPrimaryFormat(dst_format) == FORMAT_FRACTAL_Z)) {
if (GetSubFormat(dst_format) > 1) {
return TransShapeHwcnToFzWithGroups(src_shape, data_type, dst_shape, GetSubFormat(dst_format));
}
return TransShapeHwcnToFz(src_shape, data_type, dst_shape); return TransShapeHwcnToFz(src_shape, data_type, dst_shape);
} }
if (src_format == FORMAT_NCHW && dst_format == FORMAT_FRACTAL_Z) { if (src_format == FORMAT_NCHW && dst_format == FORMAT_FRACTAL_Z) {


+ 133
- 34
ge/common/formats/format_transfers/format_transfer_fractal_zz.cc View File

@@ -59,7 +59,7 @@ bool CheckShape(Format format, const ShapeVector &shape) {
default: default:
std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) + std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) +
" and FORMAT_FRACTAL_ZZ is not supported."; " and FORMAT_FRACTAL_ZZ is not supported.";
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str());
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str());
return false; return false;
} }
} }
@@ -86,8 +86,10 @@ Status TransShapeToFracZz(const ShapeVector &src_shape, DataType data_type, Shap
hw_shape.push_back(DIM_DEFAULT_VALUE); hw_shape.push_back(DIM_DEFAULT_VALUE);
hw_shape.push_back(src_shape[kNdDimIndexN]); hw_shape.push_back(src_shape[kNdDimIndexN]);
if (!IsShapeValid(dst_shape)) { if (!IsShapeValid(dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s",
ShapeToString(dst_shape).c_str()); ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -106,8 +108,10 @@ Status TransShapeToFracZz(const ShapeVector &src_shape, DataType data_type, Shap
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]); hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]);
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]); hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]);
if (!IsShapeValid(dst_shape)) { if (!IsShapeValid(dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s",
ShapeToString(dst_shape).c_str()); ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -118,10 +122,18 @@ Status CheckShapeRelation(const TransArgs &args, ShapeVector &hw_shape) {
ShapeVector expect_src_shape; ShapeVector expect_src_shape;
auto ret = TransShapeToFracZz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape); auto ret = TransShapeToFracZz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Trans shape from %s to %s, shape %s to %s, data type %s failed",
GELOGE(ret, "[Trans][ShapeToFracZz] Failed from %s to %s, shape %s to %s, data type %s",
TypeUtils::FormatToSerialString(args.dst_format).c_str(), TypeUtils::FormatToSerialString(args.dst_format).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), ShapeToString(args.dst_shape).c_str(),
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.src_format).c_str(),
ShapeToString(args.dst_shape).c_str(),
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Failed to trans shape from %s to %s, shape %s to %s, data type %s",
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
ShapeToString(args.dst_shape).c_str(),
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ret; return ret;
} }
if (!IsTransShapeSrcCorrect(args, expect_src_shape)) { if (!IsTransShapeSrcCorrect(args, expect_src_shape)) {
@@ -140,9 +152,14 @@ Status TransFormatFromNdToFracZz(const TransArgs &args, TransResult &result, con


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }
// The src&dst_shape can be written as times*H*W & times*H1*W1*H0*W0, respectively. dst_shape_size >= kDimNum4D // The src&dst_shape can be written as times*H*W & times*H1*W1*H0*W0, respectively. dst_shape_size >= kDimNum4D
@@ -179,7 +196,11 @@ Status TransFormatFromNdToFracZz(const TransArgs &args, TransResult &result, con
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size * w0)); static_cast<size_t>(size * w0));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d",
dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -195,7 +216,11 @@ Status TransFormatFromNdToFracZz(const TransArgs &args, TransResult &result, con
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d",
dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -217,9 +242,14 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory "
"for dst buf %ld when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -257,7 +287,11 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size * w0)); static_cast<size_t>(size * w0));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d",
dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -273,7 +307,11 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret);
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, "
"error-code %d",
dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d",
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -288,17 +326,39 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con


Status FormatTransferFractalZz::TransFormat(const TransArgs &args, TransResult &result) { Status FormatTransferFractalZz::TransFormat(const TransArgs &args, TransResult &result) {
if (!IsDataTypeSupport(args.src_data_type)) { if (!IsDataTypeSupport(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID,
"[Check][Datatype]Failed, not support trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check datatype failed, not support trans format "
"from %s to %s, src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) { if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"[Check][Shape]Failed, not support trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Check shape failed, not support trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s",
@@ -321,16 +381,34 @@ Status FormatTransferFractalZz::TransShape(Format src_format, const ShapeVector
Format dst_format, ShapeVector &dst_shape) { Format dst_format, ShapeVector &dst_shape) {
if (!IsDataTypeSupport(data_type)) { if (!IsDataTypeSupport(data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, GELOGE(ACL_ERROR_GE_DATATYPE_INVALID,
"Not support trans format from %s to %s, src shape %s, data type %s",
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str());
"[Check][Datatype]Failed, not support trans format from %s to %s, "
"src shape %s, data type %s",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check datatype failed, not support trans format from %s to %s, "
"src shape %s, data type %s",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShape(src_format, src_shape)) { if (!CheckShape(src_format, src_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"Not support trans format from %s to %s, src shape %s, data type %s",
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str());
"[Check][Shape]Failed, not support trans format from %s to %s, "
"src shape %s, data type %s",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
REPORT_CALL_ERROR("E19999", "Check shape failed, not support trans format from %s to %s, "
"src shape %s, data type %s",
TypeUtils::FormatToSerialString(src_format).c_str(),
TypeUtils::FormatToSerialString(dst_format).c_str(),
ShapeToString(src_shape).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
ShapeVector hw_shape; ShapeVector hw_shape;
@@ -339,18 +417,39 @@ Status FormatTransferFractalZz::TransShape(Format src_format, const ShapeVector


Status FormatTransferFractalZzND::TransFormat(const TransArgs &args, TransResult &result) { Status FormatTransferFractalZzND::TransFormat(const TransArgs &args, TransResult &result) {
if (!IsDataTypeSupport(args.src_data_type)) { if (!IsDataTypeSupport(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID,
"[Check][Datatype]Failed, not support trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Check datatype Failed, not support trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }


if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) { if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed, not support trans format "
"from %s to %s, src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Check shape failed, not support trans format from %s to %s, "
"src shape %s, dst shape %s, data type %s",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s",


+ 45
- 14
ge/common/formats/format_transfers/format_transfer_fracz_hwcn.cc View File

@@ -41,16 +41,26 @@ Status CheckArgsForFracZToHwcn(const TransArgs &args) {
return ACL_ERROR_GE_FORMAT_INVALID; return ACL_ERROR_GE_FORMAT_INVALID;
} }
if (!CheckDataTypeSupported(args.src_data_type)) { if (!CheckDataTypeSupported(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from FORMAT_FRACTAL_Z to HWCN, invalid data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, "
"shape from FORMAT_FRACTAL_Z to HWCN, invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Failed to trans shape from FORMAT_FRACTAL_Z to HWCN, "
"invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(src_shape, kFracZDimsNum)) { if (!CheckShapeValid(src_shape, kFracZDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) { if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); int64_t c0 = GetCubeSizeByDataType(args.src_data_type);
@@ -66,7 +76,7 @@ Status CheckArgsForFracZToHwcn(const TransArgs &args) {
FmtToStr(ShapeToString(dst_shape)); FmtToStr(ShapeToString(dst_shape));
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str()); GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
}
}


return SUCCESS; return SUCCESS;
} }
@@ -74,9 +84,17 @@ Status CheckArgsForFracZToHwcn(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION,
"[Allocate][DSTMemory]Failed, memory for dst buf %ld, shape %s "
"when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, shape %s "
"when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -114,9 +132,12 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to copy data from FracZ offset %ld to HWCN[%ld, %ld, %ld, %ld] "
"offset %ld, err-code %d",
"[Operate][Memory]Failed to copy data from FracZ offset %ld to "
"HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset, ret); src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to copy data from FracZ offset %ld to "
"HWCN[%ld, %ld, %ld, %ld], offset %ld, err-code %d",
src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -142,9 +163,12 @@ Status FormatTransferFracZHwcn::TransFormat(const TransArgs &args, TransResult &
result.length = static_cast<size_t>(total_size); result.length = static_cast<size_t>(total_size);
return SUCCESS; return SUCCESS;
} }

GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, "
"total size %ld from dst shape %s, src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from "
"dst shape %s, src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from FracZ to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld", GELOGD("Begin to trans format from FracZ to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld",
@@ -152,9 +176,16 @@ Status FormatTransferFracZHwcn::TransFormat(const TransArgs &args, TransResult &
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);
ret = GetDstDataAfterTrans(args, result, size, total_size); ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
GELOGE(ret, "[Get][Data]Failed after trans, src shape %s, "
"data type %s, dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, "
"data type %s, dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
return ret; return ret;
} }
return SUCCESS; return SUCCESS;


+ 52
- 15
ge/common/formats/format_transfers/format_transfer_fracz_nchw.cc View File

@@ -37,20 +37,30 @@ Status CheckArgsForFracZToNchw(const TransArgs &args) {
std::string error = "Dose not support trans format from " + std::string error = "Dose not support trans format from " +
FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " +
FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); FmtToStr(TypeUtils::FormatToSerialString(args.dst_format));
GE_ERRORLOG_AND_ERRORMSG(UNSUPPORTED, error.c_str());
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str());
return ACL_ERROR_GE_FORMAT_INVALID; return ACL_ERROR_GE_FORMAT_INVALID;
} }
if (!CheckDataTypeSupported(args.src_data_type)) { if (!CheckDataTypeSupported(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from FORMAT_FRACTAL_Z to NCHW, invalid data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, "
"shape from FORMAT_FRACTAL_Z to NCHW, invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Failed to trans shape from FORMAT_FRACTAL_Z to NCHW, "
"invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(src_shape, kFracZDimsNum)) { if (!CheckShapeValid(src_shape, kFracZDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(dst_shape, kNchwDimsNum)) { if (!CheckShapeValid(dst_shape, kNchwDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); int64_t c0 = GetCubeSizeByDataType(args.src_data_type);
@@ -59,10 +69,15 @@ Status CheckArgsForFracZToNchw(const TransArgs &args) {
} }
int64_t c1 = Ceil(dst_shape.at(kNchwC), c0); int64_t c1 = Ceil(dst_shape.at(kNchwC), c0);
int64_t n0 = Ceil(dst_shape.at(kNchwN), static_cast<int64_t>(kNiSize)); int64_t n0 = Ceil(dst_shape.at(kNchwN), static_cast<int64_t>(kNiSize));
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNchwH) * dst_shape.at(kNchwW) * c1 || src_shape.at(kFracZC0) != c0 ||
src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s",
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNchwH) * dst_shape.at(kNchwW) * c1 ||
src_shape.at(kFracZC0) != c0 || src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"[Check][Shape]Failed to check relationship between src and dst shape, "
"src shape %s, dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src and dst shape, "
"src shape %s, dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }


@@ -72,9 +87,17 @@ Status CheckArgsForFracZToNchw(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION,
"[Allocate][DSTMemory]Failed, memory for dst buf %ld, shape %s "
"when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, shape %s "
"when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -112,9 +135,12 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to copy data from FracZ offset %ld to NCHW[%ld, %ld, %ld, %ld] offset %ld, "
"err-code %d",
"[Operate][Memory]Failed to copy data from FracZ offset %ld to "
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret); src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999","Failed to copy data from FracZ offset %ld to "
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret );
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -141,8 +167,12 @@ Status FormatTransferFracZNchw::TransFormat(const TransArgs &args, TransResult &
return SUCCESS; return SUCCESS;
} }


GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, "
"src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s",
total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from FracZ to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld", GELOGD("Begin to trans format from FracZ to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld",
@@ -151,9 +181,16 @@ Status FormatTransferFracZNchw::TransFormat(const TransArgs &args, TransResult &


ret = GetDstDataAfterTrans(args, result, size, total_size); ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, "
"data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
return ret; return ret;
} }
return SUCCESS; return SUCCESS;


+ 71
- 31
ge/common/formats/format_transfers/format_transfer_fracz_nhwc.cc View File

@@ -37,33 +37,48 @@ Status CheckArgsForFracZToNhwc(const TransArgs &args) {
std::string error = "Dose not support trans format from " + std::string error = "Dose not support trans format from " +
FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " +
FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); FmtToStr(TypeUtils::FormatToSerialString(args.dst_format));
GE_ERRORLOG_AND_ERRORMSG(UNSUPPORTED, error.c_str());
return UNSUPPORTED;
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str());
return ACL_ERROR_GE_FORMAT_INVALID;
} }
if (!CheckDataTypeSupported(args.src_data_type)) { if (!CheckDataTypeSupported(args.src_data_type)) {
GELOGE(UNSUPPORTED, "Failed to trans shape from FORMAT_FRACTAL_Z to NHWC, invalid data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, "
"shape from FORMAT_FRACTAL_Z to NCHW, invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return UNSUPPORTED;
REPORT_INNER_ERROR("E19999", "Failed to trans shape from FORMAT_FRACTAL_Z to NCHW, "
"invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(src_shape, kFracZDimsNum)) { if (!CheckShapeValid(src_shape, kFracZDimsNum)) {
GELOGE(PARAM_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str());
return PARAM_INVALID;
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(dst_shape, kNhwcDimsNum)) { if (!CheckShapeValid(dst_shape, kNhwcDimsNum)) {
GELOGE(PARAM_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str());
return PARAM_INVALID;
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID;
} }
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); int64_t c0 = GetCubeSizeByDataType(args.src_data_type);
if (c0 < 0) { if (c0 < 0) {
return PARAM_INVALID;
return ACL_ERROR_GE_DATATYPE_INVALID;
} }
int64_t c1 = Ceil(dst_shape.at(kNhwcC), c0); int64_t c1 = Ceil(dst_shape.at(kNhwcC), c0);
int64_t n0 = Ceil(dst_shape.at(kNhwcN), static_cast<int64_t>(kNiSize)); int64_t n0 = Ceil(dst_shape.at(kNhwcN), static_cast<int64_t>(kNiSize));
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNhwcH) * dst_shape.at(kNhwcW) * c1 || src_shape.at(kFracZC0) != c0 ||
src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) {
GELOGE(PARAM_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s",
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNhwcH) * dst_shape.at(kNhwcW) * c1 ||
src_shape.at(kFracZC0) != c0 || src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"[Check][Shape]Failed to check relationship between src and dst shape, "
"src shape %s, dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
return PARAM_INVALID;
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src and dst shape, "
"src shape %s, dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID;
} }


return SUCCESS; return SUCCESS;
@@ -72,10 +87,18 @@ Status CheckArgsForFracZToNhwc(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(OUT_OF_MEMORY, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION,
"[Allocate][DSTMemory]Failed, memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
return OUT_OF_MEMORY;
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


auto n0 = args.src_shape.at(kFracZN0); auto n0 = args.src_shape.at(kFracZN0);
@@ -111,10 +134,14 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(INTERNAL_ERROR,
"Failed to copy data from FracZ offset %ld to HHWC[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
src_offset, n_idx, h_idx, w_idx, c_idx, dst_offset, ret);
return INTERNAL_ERROR;
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"[Operate][Memory]Failed to copy data from FracZ offset %ld to "
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999","Failed to copy data from FracZ offset %ld to "
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
} }
@@ -127,8 +154,9 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size
} // namespace } // namespace


Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult &result) { Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult &result) {
if (CheckArgsForFracZToNhwc(args) != SUCCESS) {
return PARAM_INVALID;
Status ret = CheckArgsForFracZToNhwc(args);
if (ret != SUCCESS) {
return ret;
} }
int size = GetSizeByDataType(args.src_data_type); int size = GetSizeByDataType(args.src_data_type);
auto total_size = GetItemNumByShape(args.dst_shape) * size; auto total_size = GetItemNumByShape(args.dst_shape) * size;
@@ -139,18 +167,30 @@ Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult &
return SUCCESS; return SUCCESS;
} }


GELOGE(INTERNAL_ERROR, "Get %ld total size from dst shape %s, src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return PARAM_INVALID;
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, "
"src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s",
total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_PARAM_INVALID;
} }
GELOGD("Begin to trans format from FracZ to NHWC, src shape %s, data type %s, dst shape %s, memory size %ld", GELOGD("Begin to trans format from FracZ to NHWC, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);
if (GetDstDataAfterTrans(args, result, size, total_size) != SUCCESS) {
GELOGE(INTERNAL_ERROR, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
return INTERNAL_ERROR;
ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) {
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
REPORT_CALL_ERROR("E19999","Failed to get data after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
return ret;
} }
return SUCCESS; return SUCCESS;
} }
@@ -158,7 +198,7 @@ Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult &
Status FormatTransferFracZNhwc::TransShape(Format src_format, const std::vector<int64_t> &src_shape, DataType data_type, Status FormatTransferFracZNhwc::TransShape(Format src_format, const std::vector<int64_t> &src_shape, DataType data_type,
Format dst_format, std::vector<int64_t> &dst_shape) { Format dst_format, std::vector<int64_t> &dst_shape) {
GELOGD("The shape derivation from FracZ to NHWC is not unique. Trans shape in this direction is not supported"); GELOGD("The shape derivation from FracZ to NHWC is not unique. Trans shape in this direction is not supported");
return UNSUPPORTED;
return ACL_ERROR_GE_FORMAT_INVALID;
} }


REGISTER_FORMAT_TRANSFER(FormatTransferFracZNhwc, FORMAT_FRACTAL_Z, FORMAT_NHWC) REGISTER_FORMAT_TRANSFER(FormatTransferFracZNhwc, FORMAT_FRACTAL_Z, FORMAT_NHWC)


+ 65
- 19
ge/common/formats/format_transfers/format_transfer_hwcn_c1hwncoc0.cc View File

@@ -43,8 +43,10 @@ Status TransShapeHwcnToC1hwncoc0(const DataType &data_type, const std::vector<in
dst_shape.push_back(cube_size); dst_shape.push_back(cube_size);
dst_shape.push_back(cube_size); dst_shape.push_back(cube_size);
if (!CheckShapeValid(dst_shape, kC1hwncoc0DimsNum)) { if (!CheckShapeValid(dst_shape, kC1hwncoc0DimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(dst_shape).c_str()); ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -59,16 +61,26 @@ Status CheckArgsForHwcnToC1hwncoc0(const TransArgs &args) {
return ACL_ERROR_GE_FORMAT_INVALID; return ACL_ERROR_GE_FORMAT_INVALID;
} }
if (!CheckDataTypeSupported(args.src_data_type)) { if (!CheckDataTypeSupported(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from HWCN to C1HWNCoC0, invalid data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Trans][Shape]Failed, "
"shape from HWCN to C1HWNCoC0, invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Failed to trans shape from HWCN to C1HWNCoC0, "
"invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(args.src_shape, kHwcnDimsNum)) { if (!CheckShapeValid(args.src_shape, kHwcnDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(args.dst_shape, kC1hwncoc0DimsNum)) { if (!CheckShapeValid(args.dst_shape, kC1hwncoc0DimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(args.dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(args.dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
std::vector<int64_t> expect_dst_shape; std::vector<int64_t> expect_dst_shape;
@@ -78,10 +90,14 @@ Status CheckArgsForHwcnToC1hwncoc0(const TransArgs &args) {
} }
if (args.dst_shape != expect_dst_shape) { if (args.dst_shape != expect_dst_shape) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"Failed to trans format, src and dst shape are not compatible. src shape %s, dst shape %s, "
"[Trans][Shape]Failed, src shape %s and dst shape %s are not compatible. "
"expect dst shape %s", "expect dst shape %s",
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(),
ShapeToString(expect_dst_shape).c_str()); ShapeToString(expect_dst_shape).c_str());
REPORT_INNER_ERROR("E19999", "Failed to trans format, src shape %s and dst shape %s "
"are not compatible. expect dst shape %s",
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(),
ShapeToString(expect_dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }


@@ -91,9 +107,16 @@ Status CheckArgsForHwcnToC1hwncoc0(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed, "
"memory for dst buf %ld, shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -135,11 +158,17 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to copy data from HWCN[%ld, %ld, %ld, %ld] offset %ld to "
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Copy][Data]Failed, "
"data from HWCN[%ld, %ld, %ld, %ld] offset %ld to "
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", "C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d",
h_idx, w_idx, c_idx, n_idx, src_offset, c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx,
dst_offset, ret);
h_idx, w_idx, c_idx, n_idx, src_offset, c1_idx, h_idx, w_idx,
n_idx, co_idx, c0_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to copy data from "
"HWCN[%ld, %ld, %ld, %ld] offset %ld "
"to, C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] "
"offset %ld, err-code %d",
h_idx, w_idx, c_idx, n_idx, src_offset, c1_idx, h_idx, w_idx,
n_idx, co_idx, c0_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} else { } else {
@@ -147,14 +176,18 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size)); memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to set to 0 to C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, "
"err-code %d",
"[Operate][Memory]Failed to set to 0 to "
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d",
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, dst_offset, ret); c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to set to 0 to "
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, "
"err-code %d",
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
} }
}
}
} }
} }
} }
@@ -179,8 +212,12 @@ Status FormatTransferHwcnC1hwncoc0::TransFormat(const TransArgs &args, TransResu
return SUCCESS; return SUCCESS;
} }


GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size,
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, "
"src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s",
total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from HWCN to C1HWNCoC0, src shape %s, data type %s, dst shape %s, memory size %ld", GELOGD("Begin to trans format from HWCN to C1HWNCoC0, src shape %s, data type %s, dst shape %s, memory size %ld",
@@ -189,9 +226,16 @@ Status FormatTransferHwcnC1hwncoc0::TransFormat(const TransArgs &args, TransResu


ret = GetDstDataAfterTrans(args, result, size, total_size); ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
return ret; return ret;
} }
return SUCCESS; return SUCCESS;
@@ -201,8 +245,10 @@ Status FormatTransferHwcnC1hwncoc0::TransShape(Format src_format, const std::vec
DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) {
if (src_format == FORMAT_HWCN && CheckDataTypeSupported(data_type)) { if (src_format == FORMAT_HWCN && CheckDataTypeSupported(data_type)) {
if (!CheckShapeValid(src_shape, kHwcnDimsNum)) { if (!CheckShapeValid(src_shape, kHwcnDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(src_shape).c_str()); ShapeToString(src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return TransShapeHwcnToC1hwncoc0(data_type, src_shape, dst_shape); return TransShapeHwcnToC1hwncoc0(data_type, src_shape, dst_shape);


+ 71
- 29
ge/common/formats/format_transfers/format_transfer_nc1hwc0_nchw.cc View File

@@ -37,33 +37,49 @@ Status CheckArgsForNc1hwc0ToNchw(const TransArgs &args) {
std::string error = "Dose not support trans format from " + std::string error = "Dose not support trans format from " +
FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " +
FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); FmtToStr(TypeUtils::FormatToSerialString(args.dst_format));
GE_ERRORLOG_AND_ERRORMSG(UNSUPPORTED, error.c_str());
return UNSUPPORTED;
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str());
return ACL_ERROR_GE_FORMAT_INVALID;
} }
if (!CheckDataTypeSupported(args.src_data_type)) { if (!CheckDataTypeSupported(args.src_data_type)) {
GELOGE(UNSUPPORTED, "Failed to trans shape from NC1HWC0 to NCHW, invalid data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, shape from NC1HWC0 to NCHW, "
"invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return UNSUPPORTED;
REPORT_INNER_ERROR("E19999", "Failed to trans shape from NC1HWC0 to NCHW, invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) { if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) {
GELOGE(PARAM_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str());
return PARAM_INVALID;
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(args.dst_shape, kNchwDimsNum)) { if (!CheckShapeValid(args.dst_shape, kNchwDimsNum)) {
GELOGE(PARAM_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str());
return PARAM_INVALID;
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(args.dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(args.dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID;
} }
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); int64_t c0 = GetCubeSizeByDataType(args.src_data_type);
if (c0 <= 0) { if (c0 <= 0) {
GELOGE(PARAM_INVALID, "Failed to get cube size, the data type is invalid");
return PARAM_INVALID;
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data tyep %s is invalid",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNchwH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNchwW) || if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNchwH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNchwW) ||
src_shape.at(kNc1hwc0N) != dst_shape.at(kNchwN) || src_shape.at(kNc1hwc0C0) != c0 || src_shape.at(kNc1hwc0N) != dst_shape.at(kNchwN) || src_shape.at(kNc1hwc0C0) != c0 ||
src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNchwC), c0))) { src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNchwC), c0))) {
GELOGE(PARAM_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed to check relationship between "
"src shape %s and dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
return PARAM_INVALID;
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src shape %s "
"and dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID;
} }


return SUCCESS; return SUCCESS;
@@ -72,10 +88,17 @@ Status CheckArgsForNc1hwc0ToNchw(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(OUT_OF_MEMORY, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed, "
"memory for dst buf %ld, shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
return OUT_OF_MEMORY;
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


auto h = args.src_shape.at(kNc1hwc0H); auto h = args.src_shape.at(kNc1hwc0H);
@@ -109,11 +132,17 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset,
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(INTERNAL_ERROR,
"Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld to NCHW[%ld, %ld, %ld, %ld]"
" offset %ld, err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret);
return INTERNAL_ERROR;
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Copy][Data]Failed, data from "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] "
"src offset %ld to NCHW[%ld, %ld, %ld, %ld], dst offset %ld, err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx,
c_idx, h_idx, w_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] "
"src offset %ld to NCHW[%ld, %ld, %ld, %ld], dst offset %ld, "
"err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx,
c_idx, h_idx, w_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
} }
@@ -126,8 +155,9 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
} // namespace } // namespace


Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult &result) { Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult &result) {
if (CheckArgsForNc1hwc0ToNchw(args) != SUCCESS) {
return PARAM_INVALID;
Status ret = CheckArgsForNc1hwc0ToNchw(args);
if (ret != SUCCESS) {
return ret;
} }
int size = GetSizeByDataType(args.src_data_type); int size = GetSizeByDataType(args.src_data_type);
auto total_size = GetItemNumByShape(args.dst_shape) * size; auto total_size = GetItemNumByShape(args.dst_shape) * size;
@@ -138,18 +168,30 @@ Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult
return SUCCESS; return SUCCESS;
} }


GELOGE(INTERNAL_ERROR, "Get %ld total size from dst shape %s, src shape %s", total_size,
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, "
"src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return PARAM_INVALID;
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s",
total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_PARAM_INVALID;
} }
GELOGD("Begin to trans format from NC1HWC0 to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld", GELOGD("Begin to trans format from NC1HWC0 to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);
if (GetDstDataAfterTrans(args, result, size, total_size) != SUCCESS) {
GELOGE(INTERNAL_ERROR, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) {
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);
return INTERNAL_ERROR;
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
return ret;
} }
return SUCCESS; return SUCCESS;
} }
@@ -157,7 +199,7 @@ Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult
Status FormatTransferNc1hwc0Nchw::TransShape(Format src_format, const std::vector<int64_t> &src_shape, Status FormatTransferNc1hwc0Nchw::TransShape(Format src_format, const std::vector<int64_t> &src_shape,
DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) {
GELOGD("The shape derivation from NC1HWC0 to NCHW is not unique. Trans shape in this direction is not supported"); GELOGD("The shape derivation from NC1HWC0 to NCHW is not unique. Trans shape in this direction is not supported");
return UNSUPPORTED;
return ACL_ERROR_GE_FORMAT_INVALID;
} }


REGISTER_FORMAT_TRANSFER(FormatTransferNc1hwc0Nchw, FORMAT_NC1HWC0, FORMAT_NCHW) REGISTER_FORMAT_TRANSFER(FormatTransferNc1hwc0Nchw, FORMAT_NC1HWC0, FORMAT_NCHW)


+ 55
- 15
ge/common/formats/format_transfers/format_transfer_nc1hwc0_nhwc.cc View File

@@ -41,28 +41,44 @@ Status CheckArgsForNc1hwc0ToNhwc(const TransArgs &args) {
return ACL_ERROR_GE_FORMAT_INVALID; return ACL_ERROR_GE_FORMAT_INVALID;
} }
if (!CheckDataTypeSupported(args.src_data_type)) { if (!CheckDataTypeSupported(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from NC1HWC0 to NHWC, invalid data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, shape from NC1HWC0 to NHWC, "
"invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Failed to trans shape from NC1HWC0 to NHWC, invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) { if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(args.dst_shape, kNhwcDimsNum)) { if (!CheckShapeValid(args.dst_shape, kNhwcDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(args.dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(args.dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); int64_t c0 = GetCubeSizeByDataType(args.src_data_type);
if (c0 <= 0) { if (c0 <= 0) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to get cube size, the data type is invalid");
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data type %s is invalid",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNhwcH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNhwcW) || if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNhwcH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNhwcW) ||
src_shape.at(kNc1hwc0N) != dst_shape.at(kNhwcN) || src_shape.at(kNc1hwc0C0) != c0 || src_shape.at(kNc1hwc0N) != dst_shape.at(kNhwcN) || src_shape.at(kNc1hwc0C0) != c0 ||
src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNhwcC), c0))) { src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNhwcC), c0))) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed to check relationship between "
"src shape %s and dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src shape %s "
"and dst shape %s",
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }


@@ -72,9 +88,16 @@ Status CheckArgsForNc1hwc0ToNhwc(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed, memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -110,9 +133,14 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld to NHWC[%ld, %ld, %ld, %ld]"
" offset %ld, err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret);
"[Copy][Data]Failed, data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] "
"offset %ld to NHWC[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx,
h_idx, w_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] "
"offset %ld to NHWC[%ld, %ld, %ld, %ld] offset %ld, err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx,
h_idx, w_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -139,19 +167,31 @@ Status FormatTransferNc1hwc0Nhwc::TransFormat(const TransArgs &args, TransResult
return SUCCESS; return SUCCESS;
} }


GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size,
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, "
"src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s",
total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD("Begin to trans format from NC1HWC0 to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld",
GELOGD("[Trans][Format]Begin to trans format from NC1HWC0 to NCHW, "
"src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);


ret = GetDstDataAfterTrans(args, result, size, total_size); ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
REPORT_CALL_ERROR("E19999", "[Get][Data]Failed, after trans, src shape %s, "
"data type %s, dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
return ret; return ret;
} }
return SUCCESS; return SUCCESS;


+ 84
- 25
ge/common/formats/format_transfers/format_transfer_nchw_fz_c04.cc View File

@@ -59,8 +59,9 @@ Status TransShape(int64_t n, int64_t c, int64_t h, int64_t w, DataType data_type
dst_shape.push_back(c0); dst_shape.push_back(c0);


if (!IsShapeValid(dst_shape)) { if (!IsShapeValid(dst_shape)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(dst_shape).c_str()); ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -94,7 +95,13 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) {
std::vector<int64_t> expect_shape = {n, h, w, c}; std::vector<int64_t> expect_shape = {n, h, w, c};
auto ret = ge::formats::Transpose(data, args.src_shape, args.src_data_type, perm_arg_1, trans_result_1); auto ret = ge::formats::Transpose(data, args.src_shape, args.src_data_type, perm_arg_1, trans_result_1);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to Transpose from NCHW to HWCN");
GELOGE(ret, "[Trans][Formats]Failed from NCHW to HWCN, src_shape %s, src_data_type %s",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Failede to trans formats from NCHW to HWCN, src_shape %s, "
"src_data_type %s",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ret; return ret;
} }


@@ -104,7 +111,9 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) {
// check size it should be same with original // check size it should be same with original
size_t expect_size = n * c * h * w * size; // before has do check about mul size_t expect_size = n * c * h * w * size; // before has do check about mul
if (trans_result_1.length != expect_size) { if (trans_result_1.length != expect_size) {
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "size is not match after transpose!");
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Check][Shape]size %zu is not match expect size %zu "
"after transpose",
trans_result_1.length, expect_size);
return ACL_ERROR_GE_PARAM_INVALID; return ACL_ERROR_GE_PARAM_INVALID;
} }


@@ -118,19 +127,32 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) {


// data overflow check totally // data overflow check totally
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o), GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", h_o, w_o);
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%ld]", h_o, w_o);
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], "
"B[%ld]", h_o, w_o);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o), GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", n_o, c_o);
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%ld]", n_o, c_o);
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], "
"B[%ld]", n_o, c_o);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);
auto t1 = h_o * w_o; auto t1 = h_o * w_o;
auto t2 = n_o * c_o; auto t2 = n_o * c_o;
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2), GELOGE(INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", t1, t2);
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%ld]", t1, t2);
REPORT_CALL_ERROR("E19999", "Check shape failed, "
"int64 mul overflow.A[%ld], B[%ld]", t1, t2);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);


int64_t total_ele_cnt = n_o * c_o * h_o * w_o; int64_t total_ele_cnt = n_o * c_o * h_o * w_o;
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size), GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size);
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size);
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], "
"B[%d]", total_ele_cnt, size);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);
int64_t dst_size = total_ele_cnt * size; int64_t dst_size = total_ele_cnt * size;
if (dst_size == 0) { if (dst_size == 0) {
@@ -140,14 +162,21 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) {


std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to alloc the memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld "
"when trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }
auto retMem = memset_s(dst.get(), dst_size, 0, dst_size); auto retMem = memset_s(dst.get(), dst_size, 0, dst_size);
if (retMem != EOK) { if (retMem != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memst failed!");
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memory]Failed, dst buf %ld, error_code %d",
dst_size, retMem);
REPORT_CALL_ERROR("E19999", "Set memory failed, dst buf %ld, error_code %d", dst_size, retMem);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
// copy data // copy data
@@ -159,7 +188,10 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) {
for (auto k = 0; k < n; k++) { for (auto k = 0; k < n; k++) {
ret = memcpy_s(p_d + k * stride, protectSize, p_s + k * block, block); ret = memcpy_s(p_d + k * stride, protectSize, p_s + k * block, block);
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memcpy_s failed!");
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memcpy]Failed, block %zu, stride %zu, "
"protect_size %ld, error_code %d", block, stride, protectSize, ret);
REPORT_CALL_ERROR("E19999", "[Set][Memcpy]Failed, block %zu, stride %zu, "
"protect_size %ld, error_code %d", block, stride, protectSize, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
protectSize = protectSize - block; protectSize = protectSize - block;
@@ -169,7 +201,8 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) {
std::vector<int64_t> perm_arg_2 = {2, 0, 1, 3}; std::vector<int64_t> perm_arg_2 = {2, 0, 1, 3};
ret = ge::formats::Transpose(dst.get(), shape_o, args.src_data_type, perm_arg_2, result); ret = ge::formats::Transpose(dst.get(), shape_o, args.src_data_type, perm_arg_2, result);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to Transpose from NCHW to HWCN");
GELOGE(ret, "[Trans][Formats]Failed from NCHW to HWCN, error_code %u", ret);
REPORT_CALL_ERROR("E19999", "Failed to trans formats from NCHW to HWCN, error_code %u", ret);
return ret; return ret;
} }


@@ -190,7 +223,8 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin
auto w = src_shape.at(kNchwW); auto w = src_shape.at(kNchwW);


if (c > kMaxDimsNumC) { if (c > kMaxDimsNumC) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Invalie dim c num[%lu].It should be in (0,4]", c);
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Invalid dim c num[%lu]. "
"It should be in (0,4]", c);
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }


@@ -205,20 +239,33 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin


// data overflow check // data overflow check
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o), GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", h_o, w_o);
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%ld]", h_o, w_o);
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], "
"B[%ld]", h_o, w_o);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o), GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", n_o, c_o);
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%ld]", n_o, c_o);
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], "
"B[%ld]", n_o, c_o);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);
auto t1 = h_o * w_o; auto t1 = h_o * w_o;
auto t2 = n_o * c_o; auto t2 = n_o * c_o;
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2), GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", t1, t2);
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%ld]", t1, t2);
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], "
"B[%ld]", t1, t2);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);


int64_t total_ele_cnt = n_o * c_o * h_o * w_o; int64_t total_ele_cnt = n_o * c_o * h_o * w_o;
int size = GetSizeByDataType(args.src_data_type); int size = GetSizeByDataType(args.src_data_type);
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size), GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size),
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size);
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, "
"int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size);
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], "
"B[%d]", total_ele_cnt, size);
return ACL_ERROR_GE_INTERNAL_ERROR); return ACL_ERROR_GE_INTERNAL_ERROR);


int64_t dst_size = total_ele_cnt * size; int64_t dst_size = total_ele_cnt * size;
@@ -228,14 +275,21 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin


dst.reset(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); dst.reset(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld",
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size);
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to alloc the memory for dst buf %ld when "
"trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld when "
"trans format from %s to %s",
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }
auto ret = memset_s(dst.get(), dst_size, 0, dst_size); auto ret = memset_s(dst.get(), dst_size, 0, dst_size);
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memst failed!");
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memory]Failed, dst buf %ld, error_code %d",
dst_size, ret);
REPORT_CALL_ERROR("E19999", "Set memory failed, dst buf %ld, error_code %d", dst_size, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }


@@ -249,7 +303,10 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin
ret = memcpy_s(p_d + (i * c_o * h_o * w_o + j * h_o * w_o) * size, protectSize, ret = memcpy_s(p_d + (i * c_o * h_o * w_o + j * h_o * w_o) * size, protectSize,
p_s + (i * c * h * w + j * h * w) * size, block); p_s + (i * c * h * w + j * h * w) * size, block);
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memcpy_s failed!");
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memcpy]Failed, block %zu, "
"protect_size %ld, error_code %d", block, protectSize, ret);
REPORT_CALL_ERROR("E19999", "[Set][Memcpy]Failed, block %zu, protect_size %ld, "
"error_code %d", block, protectSize, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
protectSize = protectSize - block; protectSize = protectSize - block;
@@ -270,12 +327,14 @@ Status FormatTransferNchwToFZC04::TransFormat(const TransArgs &args, TransResult
std::shared_ptr<uint8_t> dst = nullptr; std::shared_ptr<uint8_t> dst = nullptr;
auto ret = PaddingNC(args, args_tmp, dst); auto ret = PaddingNC(args, args_tmp, dst);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Padding in NC axis failed!");
GELOGE(ret, "[Padding][NCAxis]Failed, error_code %u", ret);
REPORT_CALL_ERROR("E19999", "Padding in NC axis failed, error_code %u", ret);
return ret; return ret;
} }


std::vector<int64_t> expect_shape; std::vector<int64_t> expect_shape;
ret = TransShape(args_tmp.src_format, args_tmp.src_shape, args_tmp.src_data_type, args_tmp.dst_format, expect_shape);
ret = TransShape(args_tmp.src_format, args_tmp.src_shape, args_tmp.src_data_type,
args_tmp.dst_format, expect_shape);
if (ret != SUCCESS) { if (ret != SUCCESS) {
return ret; return ret;
} }


+ 59
- 18
ge/common/formats/format_transfers/format_transfer_nchw_nc1hwc0.cc View File

@@ -32,12 +32,17 @@ Status TransShapeNchwToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d
std::vector<int64_t> &dst_shape) { std::vector<int64_t> &dst_shape) {
int64_t c0 = GetCubeSizeByDataType(data_type); int64_t c0 = GetCubeSizeByDataType(data_type);
if (c0 <= 0) { if (c0 <= 0) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to get cube size, the data type is invalid");
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid",
TypeUtils::DataTypeToSerialString(data_type).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data type %s is invalid",
TypeUtils::DataTypeToSerialString(data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(src_shape, kNchwDimsNum)) { if (!CheckShapeValid(src_shape, kNchwDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(src_shape).c_str()); ShapeToString(src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
dst_shape.clear(); dst_shape.clear();
@@ -47,8 +52,10 @@ Status TransShapeNchwToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d
dst_shape.push_back(src_shape.at(kNchwW)); dst_shape.push_back(src_shape.at(kNchwW));
dst_shape.push_back(c0); dst_shape.push_back(c0);
if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) { if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(dst_shape).c_str()); ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -69,10 +76,17 @@ Status CheckArgsForNchwToNc1hwc0(const TransArgs &args) {
} }
if (expect_5d_shape != args.dst_shape) { if (expect_5d_shape != args.dst_shape) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"Failed to trans format, the src and dst shape are not compatible. data"
" type %s, src shape %s, dst shape %s, expect dst shape %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), ShapeToString(args.src_shape).c_str(),
"[Trans][Format]Failed, the src and dst shape are not compatible. "
"data type %s, src shape %s, dst shape %s, expect dst shape %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(), ShapeToString(expect_5d_shape).c_str()); ShapeToString(args.dst_shape).c_str(), ShapeToString(expect_5d_shape).c_str());
REPORT_INNER_ERROR("E19999", "Failed to trans formats, the src and dst shape are not "
"compatible. data type %s, src shape %s, dst shape %s, expect dst shape %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.src_shape).c_str(),
ShapeToString(args.dst_shape).c_str(),
ShapeToString(expect_5d_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }


@@ -83,10 +97,16 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION,
"Failed to trans format from %s to %s, can not alloc the memory for"
" dst buf %ld, shape %s",
"[Allcoate][Memory]Failed to alloc the memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -97,7 +117,10 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in


int64_t c0 = GetCubeSizeByDataType(args.src_data_type); int64_t c0 = GetCubeSizeByDataType(args.src_data_type);
if (c0 <= 0) { if (c0 <= 0) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "The c0 is invalid %ld", c0);
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][Shape]The c0 is invalid %ld, data_type %s",
c0, TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Check shape failed, the c0 is invalid %ld, data_type %s",
c0, TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
int64_t c1 = (c - 1) / c0 + 1; int64_t c1 = (c - 1) / c0 + 1;
@@ -130,9 +153,13 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
static_cast<size_t>(size)); static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to copy data from NCHW[%ld] offset %ld to "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d",
"[Operate][Memory]Failed to copy data from NCHW[%ld] offset %ld "
"to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d",
srcIdx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); srcIdx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to copy data from NCHW[%ld] offset %ld "
"to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d",
srcIdx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx,
dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} else { } else {
@@ -140,9 +167,12 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size)); memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to set to 0 to "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d",
"[Operate][Memory]Failed to set to 0 to NC1HWC0[%ld, %ld, %ld, %ld, %ld] "
"offset %ld, err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to set to 0 to "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -173,8 +203,12 @@ Status FormatTransferNchwNc1hwc0::TransFormat(const TransArgs &args, TransResult
return SUCCESS; return SUCCESS;
} }


GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size,
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][Shape]Failed, total size %ld from dst shape %s, "
"src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s",
total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
GELOGD( GELOGD(
@@ -184,9 +218,16 @@ Status FormatTransferNchwNc1hwc0::TransFormat(const TransArgs &args, TransResult
ShapeToString(args.dst_shape).c_str(), total_size); ShapeToString(args.dst_shape).c_str(), total_size);
ret = GetDstDataAfterTrans(args, result, size, total_size); ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
return ret; return ret;
} }
return SUCCESS; return SUCCESS;


+ 66
- 18
ge/common/formats/format_transfers/format_transfer_nhwc_nc1hwc0.cc View File

@@ -34,7 +34,10 @@ Status TransShapeNhwcToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d
std::vector<int64_t> &dst_shape) { std::vector<int64_t> &dst_shape) {
int64_t c0 = GetCubeSizeByDataType(data_type); int64_t c0 = GetCubeSizeByDataType(data_type);
if (c0 <= 0) { if (c0 <= 0) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to get cube size, the data type is invalid");
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid",
TypeUtils::DataTypeToSerialString(data_type).c_str());
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data type %s is invalid",
TypeUtils::DataTypeToSerialString(data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
dst_shape.clear(); dst_shape.clear();
@@ -44,8 +47,10 @@ Status TransShapeNhwcToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d
dst_shape.push_back(src_shape.at(kNhwcW)); dst_shape.push_back(src_shape.at(kNhwcW));
dst_shape.push_back(c0); dst_shape.push_back(c0);
if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) { if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(dst_shape).c_str()); ShapeToString(dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid",
ShapeToString(dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return SUCCESS; return SUCCESS;
@@ -60,16 +65,25 @@ Status CheckArgsForNhwcToNc1hwc0(const TransArgs &args) {
return ACL_ERROR_GE_FORMAT_INVALID; return ACL_ERROR_GE_FORMAT_INVALID;
} }
if (!CheckDataTypeSupported(args.src_data_type)) { if (!CheckDataTypeSupported(args.src_data_type)) {
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from NHWC to NC1HWC0, invalid data type %s",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed from NHWC to NC1HWC0, "
"invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
REPORT_INNER_ERROR("E19999", "Failed to trans shape from NHWC to NC1HWC0, invalid data type %s",
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
if (!CheckShapeValid(args.src_shape, kNhwcDimsNum)) { if (!CheckShapeValid(args.src_shape, kNhwcDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
if (!CheckShapeValid(args.dst_shape, kNc1hwc0DimsNum)) { if (!CheckShapeValid(args.dst_shape, kNc1hwc0DimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s",
ShapeToString(args.dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Dst shape %s check valid",
ShapeToString(args.dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
std::vector<int64_t> expect_dst_shape; std::vector<int64_t> expect_dst_shape;
@@ -79,10 +93,14 @@ Status CheckArgsForNhwcToNc1hwc0(const TransArgs &args) {
} }
if (args.dst_shape != expect_dst_shape) { if (args.dst_shape != expect_dst_shape) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, GELOGE(ACL_ERROR_GE_SHAPE_INVALID,
"Failed to trans format, the src and dst shape are not compatible. src shape %s, dst shape %s, "
"[Trans][Format]Failed , the src shape %s and dst shape %s are not compatible. "
"expect dst shape %s", "expect dst shape %s",
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(),
ShapeToString(expect_dst_shape).c_str()); ShapeToString(expect_dst_shape).c_str());
REPORT_CALL_ERROR("E19999", "Failed to trans format, the src shape %s and "
"dst shape %s are not compatible. expect dst shape %s",
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(),
ShapeToString(expect_dst_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }


@@ -92,9 +110,16 @@ Status CheckArgsForNhwcToNc1hwc0(const TransArgs &args) {
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) {
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>());
if (dst == nullptr) { if (dst == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s",
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allcoate][Memory]Failed, memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(), TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str());
TypeUtils::FormatToSerialString(args.dst_format).c_str());
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, "
"shape %s when trans format from %s to %s",
total_size, ShapeToString(args.dst_shape).c_str(),
TypeUtils::FormatToSerialString(args.src_format).c_str(),
TypeUtils::FormatToSerialString(args.dst_format).c_str());
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }


@@ -132,17 +157,27 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in
auto ret = memcpy_s(dst.get() + dst_offset, protected_size, args.data + src_offset, size); auto ret = memcpy_s(dst.get() + dst_offset, protected_size, args.data + src_offset, size);
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to copy data from NHWC[%ld, %ld, %ld, %ld] offset %ld to "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld err-code %d",
n_idx, h_idx, w_idx, c_idx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
"[Operate][Memory]Failed to copy data from NHWC[%ld, %ld, %ld, %ld] "
"offset %ld to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld err-code %d",
n_idx, h_idx, w_idx, c_idx, src_offset,
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to copy data from NHWC[%ld, %ld, %ld, %ld] "
"offset %ld to "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld err-code %d",
n_idx, h_idx, w_idx, c_idx, src_offset,
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} else { } else {
auto ret = memset_s(dst.get() + dst_offset, protected_size, 0, size); auto ret = memset_s(dst.get() + dst_offset, protected_size, 0, size);
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to set 0 to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld base err-code %d", n_idx, c1_idx,
h_idx, w_idx, c0_idx, dst_offset, ret);
"[Operate][Memory]Failed to set 0 to "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld base err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
REPORT_CALL_ERROR("E19999", "Failed to set 0 to "
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld base err-code %d",
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret);
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
} }
@@ -171,8 +206,12 @@ Status FormatTransferNhwcNc1hwc0::TransFormat(const TransArgs &args, TransResult
return SUCCESS; return SUCCESS;
} }


GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size,
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][ShapeSize]Failed, "
"total size %ld from dst shape %s, src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999", "[Get][Shape]Failed, total size %ld from "
"dst shape %s, src shape %s", total_size,
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_DATATYPE_INVALID; return ACL_ERROR_GE_DATATYPE_INVALID;
} }
GELOGD("Begin to trans format from NHWC to NC1HWC0, src shape %s, data type %s, dst shape %s, memory size %ld", GELOGD("Begin to trans format from NHWC to NC1HWC0, src shape %s, data type %s, dst shape %s, memory size %ld",
@@ -181,9 +220,16 @@ Status FormatTransferNhwcNc1hwc0::TransFormat(const TransArgs &args, TransResult


ret = GetDstDataAfterTrans(args, result, size, total_size); ret = GetDstDataAfterTrans(args, result, size, total_size);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld",
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size);
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, "
"dst shape %s, memory size %ld, error_code %u",
ShapeToString(args.src_shape).c_str(),
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(),
ShapeToString(args.dst_shape).c_str(), total_size, ret);
return ret; return ret;
} }
return SUCCESS; return SUCCESS;
@@ -193,8 +239,10 @@ Status FormatTransferNhwcNc1hwc0::TransShape(Format src_format, const std::vecto
DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) {
if (src_format == FORMAT_NHWC && CheckDataTypeSupported(data_type)) { if (src_format == FORMAT_NHWC && CheckDataTypeSupported(data_type)) {
if (!CheckShapeValid(src_shape, kNhwcDimsNum)) { if (!CheckShapeValid(src_shape, kNhwcDimsNum)) {
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s",
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s",
ShapeToString(src_shape).c_str()); ShapeToString(src_shape).c_str());
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid",
ShapeToString(src_shape).c_str());
return ACL_ERROR_GE_SHAPE_INVALID; return ACL_ERROR_GE_SHAPE_INVALID;
} }
return TransShapeNhwcToNc1hwc0(src_shape, data_type, dst_shape); return TransShapeNhwcToNc1hwc0(src_shape, data_type, dst_shape);


+ 15
- 8
ge/common/formats/format_transfers/format_transfer_transpose.cc View File

@@ -50,21 +50,21 @@ std::map<Format, std::map<Format, std::vector<int64_t>>> perm_args{
bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<int64_t> &perm_arg) { bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<int64_t> &perm_arg) {
if (src_shape.empty()) { if (src_shape.empty()) {
std::string error = "Failed to transpose, empty src shape"; std::string error = "Failed to transpose, empty src shape";
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str());
GELOGE(PARAM_INVALID, "Failed to transpose, empty src shape");
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str());
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Trans][Shape]Failed, empty src shape");
return false; return false;
} }
for (auto dim : src_shape) { for (auto dim : src_shape) {
if (dim < 0) { if (dim < 0) {
std::string error = "Failed to transpose, negative dim in src shape " + FmtToStr(ShapeToString(src_shape)); std::string error = "Failed to transpose, negative dim in src shape " + FmtToStr(ShapeToString(src_shape));
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str());
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str());
return false; return false;
} }
} }
if (perm_arg.size() != src_shape.size()) { if (perm_arg.size() != src_shape.size()) {
std::string error = "Failed to transpose, the size of src shape" + FmtToStr(src_shape.size()) + std::string error = "Failed to transpose, the size of src shape" + FmtToStr(src_shape.size()) +
" and perm arg" + FmtToStr(perm_arg.size()) + " are different"; " and perm arg" + FmtToStr(perm_arg.size()) + " are different";
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str());
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str());
return false; return false;
} }


@@ -73,7 +73,7 @@ bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<in
if (perm < 0 || static_cast<size_t>(perm) >= perm_arg.size() || ++exists[perm] > 1) { if (perm < 0 || static_cast<size_t>(perm) >= perm_arg.size() || ++exists[perm] > 1) {
std::string error = "Failed to transpose, duplicated perm arg " + FmtToStr(perm) + std::string error = "Failed to transpose, duplicated perm arg " + FmtToStr(perm) +
", perm arg " + FmtToStr(JoinToString(perm_arg)); ", perm arg " + FmtToStr(JoinToString(perm_arg));
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str());
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_PARAM_INVALID, error.c_str());
return false; return false;
} }
} }
@@ -82,12 +82,14 @@ bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<in
bool IsTransposeArgValid(const uint8_t *src, const std::vector<int64_t> &src_shape, DataType src_data_type, bool IsTransposeArgValid(const uint8_t *src, const std::vector<int64_t> &src_shape, DataType src_data_type,
const std::vector<int64_t> &perm_arg) { const std::vector<int64_t> &perm_arg) {
if (src == nullptr) { if (src == nullptr) {
GELOGE(PARAM_INVALID, "Failed to transpose, the src is null");
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Trans][Param]Failed, the src is null");
return false; return false;
} }
if (GetSizeByDataType(src_data_type) < 0) { if (GetSizeByDataType(src_data_type) < 0) {
GELOGE(UNSUPPORTED, "Failed to transpose, the data type %s is not support",
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Trans][Param]Failed, the data type %s is not support",
TypeUtils::DataTypeToSerialString(src_data_type).c_str()); TypeUtils::DataTypeToSerialString(src_data_type).c_str());
REPORT_CALL_ERROR("E19999", "Failed to transpose, the data type %s is not support",
TypeUtils::DataTypeToSerialString(src_data_type).c_str());
return false; return false;
} }
return IsShapeArgValid(src_shape, perm_arg); return IsShapeArgValid(src_shape, perm_arg);
@@ -173,10 +175,15 @@ Status Transpose(const uint8_t *src, const std::vector<int64_t> &src_shape, Data
static_cast<size_t>(data_size)); static_cast<size_t>(data_size));
if (ret != EOK) { if (ret != EOK) {
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,
"Failed to transpose, src shape %s, perm arg %s, dst shape %s, "
"[Operate][Memory]Failed to transpose, src shape %s, perm arg %s, dst shape %s, "
"failed to write to dst offset %ld, current dim offset %s", "failed to write to dst offset %ld, current dim offset %s",
ShapeToString(src_shape).c_str(), ShapeToString(perm_arg).c_str(), ShapeToString(dst_shape).c_str(), ShapeToString(src_shape).c_str(), ShapeToString(perm_arg).c_str(), ShapeToString(dst_shape).c_str(),
dst_offset_bytes, ShapeToString(dst_indexes).c_str()); dst_offset_bytes, ShapeToString(dst_indexes).c_str());
REPORT_CALL_ERROR("E19999", "Failed to transpose, src shape %s, perm arg %s, dst shape %s, "
"failed to write to dst offset %ld, current dim offset %s",
ShapeToString(src_shape).c_str(), ShapeToString(perm_arg).c_str(),
ShapeToString(dst_shape).c_str(),
dst_offset_bytes, ShapeToString(dst_indexes).c_str());
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; return ACL_ERROR_GE_MEMORY_OPERATE_FAILED;
} }
AddOne(dst_shape, dst_indexes); AddOne(dst_shape, dst_indexes);


+ 8
- 2
ge/common/formats/formats.cc View File

@@ -44,7 +44,12 @@ GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY Status TransFormat(const TransArg


auto src_shape_size = GetItemNumByShape(args.src_shape); auto src_shape_size = GetItemNumByShape(args.src_shape);
if (args.data == nullptr && src_shape_size != 0) { if (args.data == nullptr && src_shape_size != 0) {
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Invalid input null data");
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Check][Shape]Failed, input data is null "
"or shape size not euqal to 0, src_shape %s",
ShapeToString(args.src_shape).c_str());
REPORT_CALL_ERROR("E19999","Failed to check shape, input data is null "
"or shape size not equal to 0, src_shape %s",
ShapeToString(args.src_shape).c_str());
return ACL_ERROR_GE_PARAM_INVALID; return ACL_ERROR_GE_PARAM_INVALID;
} }


@@ -82,7 +87,8 @@ GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY Status TransDataType(const CastAr
} }


if (args.data == nullptr && args.src_data_size != 0) { if (args.data == nullptr && args.src_data_size != 0) {
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Invalid input null data");
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Check][Param]Failed, input data is null "
"or data size not equal to 0, src_data_size %ld", args.src_data_size);
return ACL_ERROR_GE_PARAM_INVALID; return ACL_ERROR_GE_PARAM_INVALID;
} }




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

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


std::shared_ptr<ModelTaskDef> model_task_def = ge_model->GetModelTaskDefPtr(); std::shared_ptr<ModelTaskDef> model_task_def = ge_model->GetModelTaskDefPtr();
if (model_task_def == nullptr) { if (model_task_def == nullptr) {
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Create model task def ptr failed");
return ACL_ERROR_GE_MEMORY_ALLOCATION;
GELOGD("SaveSizeToModelDef task_info_size is 0.");
om_info.push_back(0);
} else {
size_t partition_task_size = model_task_def->ByteSizeLong();
GELOGD("SaveSizeToModelDef task_info_size is %zu", partition_task_size);
om_info.push_back(partition_task_size);
} }
size_t partition_task_size = model_task_def->ByteSizeLong();
GELOGD("SaveSizeToModelDef task_info_size is %zu", partition_task_size);
om_info.push_back(partition_task_size);


GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(*(ge_model.get()), "om_info_list", om_info), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(*(ge_model.get()), "om_info_list", om_info),
GELOGE(FAILED, "SetListInt of om_info_list failed."); GELOGE(FAILED, "SetListInt of om_info_list failed.");
@@ -598,6 +599,7 @@ Status ModelHelper::GenerateGeRootModel(OmFileLoadHelper &om_load_helper) {
is_first_model = false; is_first_model = false;
root_model_->SetRootGraph(GraphUtils::GetComputeGraph(cur_model->GetGraph())); root_model_->SetRootGraph(GraphUtils::GetComputeGraph(cur_model->GetGraph()));
root_model_->SetModelId(cur_model->GetModelId()); root_model_->SetModelId(cur_model->GetModelId());
root_model_->SetModelName(cur_model->GetName());
model_ = cur_model; model_ = cur_model;
continue; continue;
} }


+ 1
- 2
ge/common/helper/om_file_helper.cc View File

@@ -416,8 +416,7 @@ Status OmFileSaveHelper::SaveRootModel(const SaveParam &save_param, const char *
if (is_offline) { if (is_offline) {
ret = FileSaver::SaveToFile(output_file, model_header_, model_partition_tabels, all_model_partitions); ret = FileSaver::SaveToFile(output_file, model_header_, model_partition_tabels, all_model_partitions);
} else { } else {
GELOGW("do not support save ge root model to buff now");
return FAILED;
ret = FileSaver::SaveToBuffWithFileHeader(model_header_, model_partition_tabels, all_model_partitions, model);
} }
if (ret == SUCCESS) { if (ret == SUCCESS) {
GELOGD("Save model success without encrypt."); GELOGD("Save model success without encrypt.");


+ 82
- 8
ge/common/profiling/profiling_manager.cc View File

@@ -24,6 +24,7 @@
#include "graph/types.h" #include "graph/types.h"
#include "runtime/base.h" #include "runtime/base.h"
#include "graph/load/model_manager/davinci_model.h" #include "graph/load/model_manager/davinci_model.h"
#include "mmpa/mmpa_api.h"


namespace { namespace {
const char *const kTrainingTrace = "training_trace"; const char *const kTrainingTrace = "training_trace";
@@ -31,7 +32,6 @@ const char *const kFpPoint = "fp_point";
const char *const kBpPoint = "bp_point"; const char *const kBpPoint = "bp_point";


#ifdef DAVINCI_SUPPORT_PROFILING #ifdef DAVINCI_SUPPORT_PROFILING
const size_t kReportMaxLen = 2048;
const int32_t kMaxDeviceNum = 256; const int32_t kMaxDeviceNum = 256;
const uint32_t kInteval = 2; const uint32_t kInteval = 2;
const std::string kConfigNumsdev = "devNums"; const std::string kConfigNumsdev = "devNums";
@@ -47,6 +47,10 @@ const std::string kOptype = "op_type";
const std::string kBlockDim = "block_dims"; const std::string kBlockDim = "block_dims";
const std::string kTaskId = "task_id"; const std::string kTaskId = "task_id";
const std::string kStreamId = "stream_id"; const std::string kStreamId = "stream_id";
const std::string kThreadId = "thread_id";
const std::string kIndexId = "index_id";
const std::string kTimeStamp = "time_stamp";
const std::string kTagId = "tag_id";
const std::string kShapeType = "shape_type"; const std::string kShapeType = "shape_type";
const std::string kCurIterNum = "cur_iter_num"; const std::string kCurIterNum = "cur_iter_num";
const std::string kTaskType = "task_type"; const std::string kTaskType = "task_type";
@@ -287,27 +291,80 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::Profilin
#endif #endif
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ProfilingManager::ProfileStepInfo(
uint64_t index_id, uint64_t model_id, uint16_t tag_id, rtStream_t stream, int32_t device_id) {
#ifdef DAVINCI_SUPPORT_PROFILING
rtError_t rt_ret = RT_ERROR_NONE;
#ifndef ONLY_COMPILE_OPEN_SRC
GELOGD("Profiling Step Info TraceTask execute async start, index_id = %lu, model_id = %lu, tag_id = %u",
index_id, model_id, tag_id);
rt_ret = rtProfilerTraceEx(index_id, model_id, tag_id, stream);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "[Call][rtProfilerTraceEx] failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret);
}
GELOGD("Profiling Step Info TraceTask execute async success, index_id = %lu, model_id = %lu, tag_id = %u",
index_id, model_id, tag_id);
#endif

mmTimespec timespec = mmGetTickCount();
// 1000 ^ 3 converts second to nanosecond
int64_t time = timespec.tv_sec * 1000 * 1000 * 1000 + timespec.tv_nsec;
uint32_t task_id = 0;
uint32_t stream_id = 0;
rt_ret = rtGetTaskIdAndStreamID(&task_id, &stream_id);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "[Get][RtsInfo] task_id and stream_id failed, ret: 0x%X.", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret);
}
GELOGD("Get profiling args, task_id[%u], stream_id[%u]", task_id, stream_id);

Json step_info;
step_info[kIndexId] = index_id;
step_info[kModelId] = model_id;
step_info[kTimeStamp] = time;
step_info[kTagId] = tag_id;
step_info[kTaskId] = task_id;
step_info[kStreamId] = stream_id;
step_info[kThreadId] = mmGetTid();

std::string reported_data;
try {
reported_data = step_info.dump(kInteval, ' ', false, Json::error_handler_t::ignore);
} catch (std::exception &e) {
GELOGE(FAILED, "Failed to convert JSON to string, reason: %s.", e.what());
} catch (...) {
GELOGE(FAILED, "Failed to convert JSON to string.");
}
reported_data.append(",")
.append("\n");
ReportData(device_id, reported_data, "step_info");
#endif
return SUCCESS;
}

FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::ReportData( FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::ReportData(
const int32_t &device_id, const string &data, const string &tag_name) { const int32_t &device_id, const string &data, const string &tag_name) {
#ifdef DAVINCI_SUPPORT_PROFILING #ifdef DAVINCI_SUPPORT_PROFILING
ReporterData reporter_data{}; ReporterData reporter_data{};
int ret = -1; int ret = -1;
int32_t cb_ret = -1; int32_t cb_ret = -1;
size_t index = data.size() / kReportMaxLen;
size_t report_max_len = reporter_max_len_;
size_t index = data.size() / report_max_len;
if (index >= 1) { if (index >= 1) {
reporter_data.deviceId = device_id; reporter_data.deviceId = device_id;
ret = memcpy_s(reporter_data.tag, MSPROF_ENGINE_MAX_TAG_LEN + 1, tag_name.c_str(), tag_name.size()); ret = memcpy_s(reporter_data.tag, MSPROF_ENGINE_MAX_TAG_LEN + 1, tag_name.c_str(), tag_name.size());
GE_IF_BOOL_EXEC(ret != EOK, GELOGE(ret, "Report data tag [%s] memcpy error!", tag_name.c_str()); return;); GE_IF_BOOL_EXEC(ret != EOK, GELOGE(ret, "Report data tag [%s] memcpy error!", tag_name.c_str()); return;);
for (size_t i = 0; i < index; ++i) { for (size_t i = 0; i < index; ++i) {
reporter_data.data = (unsigned char *)data.c_str() + kReportMaxLen * i;
reporter_data.dataLen = kReportMaxLen;
reporter_data.data = (unsigned char *)data.c_str() + report_max_len * i;
reporter_data.dataLen = report_max_len;
cb_ret = CallMsprofReport(reporter_data); cb_ret = CallMsprofReport(reporter_data);
GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret); GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret);
return;); return;);
} }
reporter_data.dataLen = data.size() - kReportMaxLen * index;
reporter_data.dataLen = data.size() - report_max_len * index;
if (reporter_data.dataLen != 0) { if (reporter_data.dataLen != 0) {
reporter_data.data = (unsigned char *)data.c_str() + kReportMaxLen * index;
reporter_data.data = (unsigned char *)data.c_str() + report_max_len * index;
cb_ret = CallMsprofReport(reporter_data); cb_ret = CallMsprofReport(reporter_data);
GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret); GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret);
return;); return;);
@@ -745,15 +802,32 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY bool ProfilingManager::Profilin
return execute_model_prof_on; return execute_model_prof_on;
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ProfilingManager::PluginInit() const {
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ProfilingManager::PluginInit() {
if (prof_cb_.msprofReporterCallback == nullptr) { if (prof_cb_.msprofReporterCallback == nullptr) {
GELOGE(ge::PARAM_INVALID, "MsprofReporterCallback callback is nullptr."); GELOGE(ge::PARAM_INVALID, "MsprofReporterCallback callback is nullptr.");
return ge::PARAM_INVALID; return ge::PARAM_INVALID;
} }
return prof_cb_.msprofReporterCallback(
int32_t cb_ret = prof_cb_.msprofReporterCallback(
static_cast<uint32_t>(MsprofReporterModuleId::MSPROF_MODULE_FRAMEWORK), static_cast<uint32_t>(MsprofReporterModuleId::MSPROF_MODULE_FRAMEWORK),
static_cast<uint32_t>(MsprofReporterCallbackType::MSPROF_REPORTER_INIT), static_cast<uint32_t>(MsprofReporterCallbackType::MSPROF_REPORTER_INIT),
nullptr, 0); nullptr, 0);
if (cb_ret != MSPROF_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Profiling reporter init failed, ret = %d.", cb_ret);
GELOGE(INTERNAL_ERROR, "[Init][ProfilingReporter] profiling init failed, ret = %d.", cb_ret);
return INTERNAL_ERROR;
}

cb_ret = prof_cb_.msprofReporterCallback(
static_cast<uint32_t>(MsprofReporterModuleId::MSPROF_MODULE_FRAMEWORK),
static_cast<uint32_t>(MsprofReporterCallbackType::MSPROF_REPORTER_DATA_MAX_LEN),
&reporter_max_len_, sizeof(uint32_t));
if (cb_ret != MSPROF_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Get profiling reporter data max len failed, ret = %d.", cb_ret);
GELOGE(INTERNAL_ERROR, "[Init][ProfilingReporter] Get profiling reporter data max len failed, ret = %d.", cb_ret);
return INTERNAL_ERROR;
}

return SUCCESS;
} }


FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::PluginUnInit() const { FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::PluginUnInit() const {


+ 4
- 1
ge/common/profiling/profiling_manager.h View File

@@ -27,6 +27,7 @@
#include "framework/common/ge_types.h" #include "framework/common/ge_types.h"
#include "external/register/register_types.h" #include "external/register/register_types.h"
#include "toolchain/prof_callback.h" #include "toolchain/prof_callback.h"
#include "runtime/stream.h"


using std::map; using std::map;
using std::string; using std::string;
@@ -88,7 +89,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ProfilingManager {
void ProfilingTaskDescInfo(uint32_t model_id, const std::vector<TaskDescInfo> &task_desc_info, void ProfilingTaskDescInfo(uint32_t model_id, const std::vector<TaskDescInfo> &task_desc_info,
const int32_t &device_id); const int32_t &device_id);
void ProfilingOpInputOutInfo(const TaskDescInfo &task, Json &task_json); void ProfilingOpInputOutInfo(const TaskDescInfo &task, Json &task_json);
Status PluginInit() const;
Status PluginInit();
void PluginUnInit() const; void PluginUnInit() const;
Status CallMsprofReport(ReporterData &reporter_data) const; Status CallMsprofReport(ReporterData &reporter_data) const;
struct MsprofCallback &GetMsprofCallback() { return prof_cb_; } struct MsprofCallback &GetMsprofCallback() { return prof_cb_; }
@@ -97,6 +98,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ProfilingManager {
void GetFpBpPoint(std::string &fp_point, std::string &bp_point); void GetFpBpPoint(std::string &fp_point, std::string &bp_point);
void GetOpInputOutputInfo(const OpDescPtr &op, TaskDescInfo &task_desc_info) const; void GetOpInputOutputInfo(const OpDescPtr &op, TaskDescInfo &task_desc_info) const;
void ReportData(const int32_t &device_id, const std::string &data, const std::string &tag_name); void ReportData(const int32_t &device_id, const std::string &data, const std::string &tag_name);
Status ProfileStepInfo(uint64_t index_id, uint64_t model_id, uint16_t tag_id, rtStream_t stream, int32_t device_id);
private: private:
Status InitFromOptions(const Options &options, MsprofGeOptions &prof_conf); Status InitFromOptions(const Options &options, MsprofGeOptions &prof_conf);
Status ParseOptions(const std::string &options); Status ParseOptions(const std::string &options);
@@ -119,6 +121,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ProfilingManager {
MsprofCallback prof_cb_; MsprofCallback prof_cb_;
std::string fp_point_; std::string fp_point_;
std::string bp_point_; std::string bp_point_;
uint32_t reporter_max_len_ = 0;
}; };
} // namespace ge } // namespace ge
#endif // GE_COMMON_PROFILING_PROFILING_MANAGER_H_ #endif // GE_COMMON_PROFILING_PROFILING_MANAGER_H_

+ 1
- 0
ge/common/proto/insert_op.proto View File

@@ -88,6 +88,7 @@ message AippOpParams {
int32 right_padding_size = 69; int32 right_padding_size = 69;
int32 top_padding_size = 70; int32 top_padding_size = 70;
int32 bottom_padding_size = 71; int32 bottom_padding_size = 71;
float padding_value = 72;


int32 mean_chn_0 = 10; int32 mean_chn_0 = 10;
int32 mean_chn_1 = 11; int32 mean_chn_1 = 11;


+ 11
- 0
ge/common/tbe_kernel_store.cc View File

@@ -15,6 +15,8 @@
*/ */


#include "common/tbe_kernel_store.h" #include "common/tbe_kernel_store.h"
#include "graph/utils/attr_utils.h"
#include "graph/debug/ge_attr_define.h"


namespace ge { namespace ge {


@@ -31,6 +33,15 @@ void TBEKernelStore::LoadTBEKernelBinToOpDesc(const std::shared_ptr<ge::OpDesc>
GE_IF_BOOL_EXEC(!op_desc->SetExtAttr(ge::OP_EXTATTR_NAME_TBE_KERNEL, kernel_bin), GE_IF_BOOL_EXEC(!op_desc->SetExtAttr(ge::OP_EXTATTR_NAME_TBE_KERNEL, kernel_bin),
GELOGW("LoadKernelTBEBinToOpDesc: SetExtAttr for kernel_bin failed");) GELOGW("LoadKernelTBEBinToOpDesc: SetExtAttr for kernel_bin failed");)
GELOGI("Load tbe kernel:%s, %zu", kernel_bin->GetName().c_str(), kernel_bin->GetBinDataSize()); GELOGI("Load tbe kernel:%s, %zu", kernel_bin->GetName().c_str(), kernel_bin->GetBinDataSize());

std::string atomic_kernel_name;
(void) AttrUtils::GetStr(op_desc, ATOMIC_ATTR_TBE_KERNEL_NAME, atomic_kernel_name);
if (!atomic_kernel_name.empty()) {
GELOGI("Get atomic kernel name is %s.", atomic_kernel_name.c_str());
auto atomic_kernel_bin = FindKernel(atomic_kernel_name);
GE_IF_BOOL_EXEC(!op_desc->SetExtAttr(EXT_ATTR_ATOMIC_TBE_KERNEL, atomic_kernel_bin),
GELOGW("LoadKernelTBEBinToOpDesc: SetExtAttr for atomic kernel_bin failed");)
}
} }
} }
} }


+ 2
- 0
ge/common/types.cc View File

@@ -90,6 +90,8 @@ REGISTER_OPTYPE_DEFINE(DEPCONVOLUTION, "ConvolutionDepthwise");
REGISTER_OPTYPE_DEFINE(DROPOUT, "Dropout"); REGISTER_OPTYPE_DEFINE(DROPOUT, "Dropout");
REGISTER_OPTYPE_DEFINE(DROPOUTGENMASK, "DropOutGenMask"); REGISTER_OPTYPE_DEFINE(DROPOUTGENMASK, "DropOutGenMask");
REGISTER_OPTYPE_DEFINE(DROPOUTDOMASK, "DropOutDoMask"); REGISTER_OPTYPE_DEFINE(DROPOUTDOMASK, "DropOutDoMask");
REGISTER_OPTYPE_DEFINE(DROPOUTDOMASKV3, "DropOutDoMaskV3");
REGISTER_OPTYPE_DEFINE(DROPOUTDOMASKV3D, "DropOutDoMaskV3D");
REGISTER_OPTYPE_DEFINE(CONCAT, "Concat"); REGISTER_OPTYPE_DEFINE(CONCAT, "Concat");
REGISTER_OPTYPE_DEFINE(ROIPOOLING, "ROIPooling"); REGISTER_OPTYPE_DEFINE(ROIPOOLING, "ROIPooling");
REGISTER_OPTYPE_DEFINE(PROPOSAL, "Proposal"); REGISTER_OPTYPE_DEFINE(PROPOSAL, "Proposal");


+ 7
- 2
ge/executor/CMakeLists.txt View File

@@ -8,6 +8,7 @@ set(PROTO_LIST
) )


protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST})
protobuf_generate(ge_static PROTO_STATIC_SRCS PROTO_STATIC_HDRS ${PROTO_LIST})


set(SRC_LIST set(SRC_LIST
"ge_executor.cc" "ge_executor.cc"
@@ -15,6 +16,7 @@ set(SRC_LIST
"../common/ge/plugin_manager.cc" "../common/ge/plugin_manager.cc"
"../common/ge/op_tiling_manager.cc" "../common/ge/op_tiling_manager.cc"
"../common/dump/dump_properties.cc" "../common/dump/dump_properties.cc"
"../common/dump/exception_dumper.cc"
"../common/dump/dump_manager.cc" "../common/dump/dump_manager.cc"
"../common/dump/dump_op.cc" "../common/dump/dump_op.cc"
"../common/dump/opdebug_register.cc" "../common/dump/opdebug_register.cc"
@@ -162,7 +164,7 @@ set(SRC_LIST
) )


######## libge_executor.a ######## ######## libge_executor.a ########
add_library(ge_executor STATIC ${SRC_LIST} ${PROTO_HDRS})
add_library(ge_executor STATIC ${SRC_LIST} ${PROTO_STATIC_HDRS})


target_compile_options(ge_executor PRIVATE target_compile_options(ge_executor PRIVATE
$<$<OR:$<STREQUAL:${TARGET_SYSTEM_NAME},Linux>,$<STREQUAL:${TARGET_SYSTEM_NAME},Android>>:-fvisibility=hidden -O2 -Werror -Wno-deprecated-declarations -fno-common> $<$<OR:$<STREQUAL:${TARGET_SYSTEM_NAME},Linux>,$<STREQUAL:${TARGET_SYSTEM_NAME},Android>>:-fvisibility=hidden -O2 -Werror -Wno-deprecated-declarations -fno-common>
@@ -178,6 +180,7 @@ target_compile_definitions(ge_executor PRIVATE
google=ascend_private google=ascend_private
$<IF:$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>,OS_TYPE=WIN,OS_TYPE=0> $<IF:$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>,OS_TYPE=WIN,OS_TYPE=0>
$<$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>:SECUREC_USING_STD_SECURE_LIB=0 NOMINMAX> $<$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>:SECUREC_USING_STD_SECURE_LIB=0 NOMINMAX>
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC>
LOG_CPP LOG_CPP
) )


@@ -191,7 +194,7 @@ target_include_directories(ge_executor SYSTEM PRIVATE
${METADEF_DIR}/inc/external/graph ${METADEF_DIR}/inc/external/graph
${METADEF_DIR}/inc/graph ${METADEF_DIR}/inc/graph
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/proto/ge
${CMAKE_BINARY_DIR}/proto/ge_static
#### yellow zone #### #### yellow zone ####
${GE_CODE_DIR}/../inc ${GE_CODE_DIR}/../inc
${GE_CODE_DIR}/../inc/cce ${GE_CODE_DIR}/../inc/cce
@@ -212,6 +215,7 @@ target_link_libraries(ge_executor PRIVATE
add_library(ge_executor_shared SHARED ${SRC_LIST} ${PROTO_HDRS}) add_library(ge_executor_shared SHARED ${SRC_LIST} ${PROTO_HDRS})


target_compile_options(ge_executor_shared PRIVATE target_compile_options(ge_executor_shared PRIVATE
-fno-common
-Werror -Werror
-O2 -O2
-Wno-deprecated-declarations -Wno-deprecated-declarations
@@ -223,6 +227,7 @@ target_compile_definitions(ge_executor_shared PRIVATE
DAVINCI_SUPPORT_PROFILING DAVINCI_SUPPORT_PROFILING
google=ascend_private google=ascend_private
FUNC_VISIBILITY FUNC_VISIBILITY
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC>
) )


target_include_directories(ge_executor_shared PRIVATE target_include_directories(ge_executor_shared PRIVATE


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

@@ -30,6 +30,8 @@
#include "single_op/single_op_manager.h" #include "single_op/single_op_manager.h"
#include "graph/load/model_manager/davinci_model.h" #include "graph/load/model_manager/davinci_model.h"
#include "opskernel_manager/ops_kernel_builder_manager.h" #include "opskernel_manager/ops_kernel_builder_manager.h"
#include "graph/opsproto_manager.h"
#include "ge_local_engine/engine/host_cpu_engine.h"


using std::string; using std::string;
using std::vector; using std::vector;
@@ -199,6 +201,33 @@ bool IsDynmaicDimsSizeMatchModel(const vector<uint64_t> cur_dynamic_dims,
namespace ge { namespace ge {
bool GeExecutor::isInit_ = false; bool GeExecutor::isInit_ = false;


static void InitOpsProtoManager() {
string opsproto_path;
const char *path_env = std::getenv("ASCEND_OPP_PATH");
if (path_env != nullptr) {
string path = path_env;
string file_path = RealPath(path.c_str());
if (file_path.empty()) {
GELOGE(FAILED, "[Check][EnvPath]ASCEND_OPP_PATH path [%s] is invalid.", path.c_str());
REPORT_INPUT_ERROR("E68016", {"ASCEND_OPP_PATH", path});
return;
}
opsproto_path = (path + "/op_proto/custom/" + ":") + (path + "/op_proto/built-in/");
GELOGI("Get opsproto so path from env : %s", path.c_str());
} else {
string path_base = PluginManager::GetPath();
GELOGI("path_base is %s", path_base.c_str());
path_base = path_base.substr(0, path_base.rfind('/'));
path_base = path_base.substr(0, path_base.rfind('/') + 1);
opsproto_path = (path_base + "ops/op_proto/custom/" + ":") + (path_base + "ops/op_proto/built-in/");
}
GELOGI("Get opsproto path is %s", opsproto_path.c_str());
OpsProtoManager *manager = OpsProtoManager::Instance();
map<string, string> option_tmp;
option_tmp.emplace(std::pair<string, string>(string("ge.opsProtoLibPath"), opsproto_path));
(void)manager->Initialize(option_tmp);
}

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


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


OpTilingManager::GetInstance().LoadSo();

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

InitOpsProtoManager();

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


+ 1
- 0
ge/executor/proto/insert_op.proto View File

@@ -88,6 +88,7 @@ message AippOpParams {
int32 right_padding_size = 69; int32 right_padding_size = 69;
int32 top_padding_size = 70; int32 top_padding_size = 70;
int32 bottom_padding_size = 71; int32 bottom_padding_size = 71;
float padding_value = 72;


int32 mean_chn_0 = 10; int32 mean_chn_0 = 10;
int32 mean_chn_1 = 11; int32 mean_chn_1 = 11;


+ 2
- 0
ge/ge_inference.mk View File

@@ -114,6 +114,7 @@ OMG_HOST_SRC_FILES := \
graph/passes/atomic_addr_clean_pass.cc \ graph/passes/atomic_addr_clean_pass.cc \
graph/passes/mark_same_addr_pass.cc \ graph/passes/mark_same_addr_pass.cc \
graph/passes/mark_graph_unknown_status_pass.cc \ graph/passes/mark_graph_unknown_status_pass.cc \
graph/passes/mark_node_unknown_shape_pass.cc \
graph/passes/mark_agnostic_pass.cc \ graph/passes/mark_agnostic_pass.cc \
graph/common/omg_util.cc \ graph/common/omg_util.cc \
graph/common/bcast.cc \ graph/common/bcast.cc \
@@ -222,6 +223,7 @@ OMG_HOST_SRC_FILES := \
graph/passes/hccl_group_pass.cc \ graph/passes/hccl_group_pass.cc \
graph/passes/memcpy_addr_async_pass.cc \ graph/passes/memcpy_addr_async_pass.cc \
graph/passes/set_input_output_offset_pass.cc \ graph/passes/set_input_output_offset_pass.cc \
graph/passes/buffer_pool_memory_pass.cc \


OMG_DEVICE_SRC_FILES := $(OMG_HOST_SRC_FILES) OMG_DEVICE_SRC_FILES := $(OMG_HOST_SRC_FILES)




+ 8
- 6
ge/ge_local_engine/CMakeLists.txt View File

@@ -20,6 +20,8 @@ set(OPS_KERNEL_SRC_LIST
) )


protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST})
protobuf_generate(ge_ops_shared PROTO_OPS_SHARED_SRCS PROTO_OPS_SHARED_HDRS ${PROTO_LIST})
protobuf_generate(ge_ops_static PROTO_OPS_STATIC_SRCS PROTO_OPS_STATIC_HDRS ${PROTO_LIST})


############ libge_local_engine.so ############ ############ libge_local_engine.so ############
add_library(ge_local_engine SHARED ${SRC_LIST} ${PROTO_HDRS}) add_library(ge_local_engine SHARED ${SRC_LIST} ${PROTO_HDRS})
@@ -119,7 +121,7 @@ set_target_properties(atc_ge_local_engine PROPERTIES
) )


############ libge_local_opskernel_builder.so ############ ############ libge_local_opskernel_builder.so ############
add_library(ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_HDRS})
add_library(ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_OPS_SHARED_HDRS})


target_compile_options(ge_local_opskernel_builder PRIVATE target_compile_options(ge_local_opskernel_builder PRIVATE
-Werror -Werror
@@ -143,7 +145,7 @@ target_include_directories(ge_local_opskernel_builder PRIVATE
${METADEF_DIR}/inc/external/graph ${METADEF_DIR}/inc/external/graph
${METADEF_DIR}/inc/graph ${METADEF_DIR}/inc/graph
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/proto/ge
${CMAKE_BINARY_DIR}/proto/ge_ops_shared
#### yellow zone #### #### yellow zone ####
${GE_CODE_DIR}/../inc ${GE_CODE_DIR}/../inc
#### blue zone #### #### blue zone ####
@@ -166,7 +168,7 @@ target_link_libraries(ge_local_opskernel_builder PRIVATE
) )


############ atclib/libge_local_opskernel_builder.so ############ ############ atclib/libge_local_opskernel_builder.so ############
add_library(atc_ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_HDRS})
add_library(atc_ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_OPS_SHARED_HDRS})


target_compile_options(atc_ge_local_opskernel_builder PRIVATE target_compile_options(atc_ge_local_opskernel_builder PRIVATE
-Werror -Werror
@@ -190,7 +192,7 @@ target_include_directories(atc_ge_local_opskernel_builder PRIVATE
${METADEF_DIR}/inc/external/graph ${METADEF_DIR}/inc/external/graph
${METADEF_DIR}/inc/graph ${METADEF_DIR}/inc/graph
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/proto/ge
${CMAKE_BINARY_DIR}/proto/ge_ops_shared
#### yellow zone #### #### yellow zone ####
${GE_CODE_DIR}/../inc ${GE_CODE_DIR}/../inc
#### blue zone #### #### blue zone ####
@@ -218,7 +220,7 @@ set_target_properties(atc_ge_local_opskernel_builder PROPERTIES
) )


############ libge_local_opskernel_builder.a ############ ############ libge_local_opskernel_builder.a ############
add_library(ge_local_opskernel_builder_static STATIC ${OPS_KERNEL_SRC_LIST} ${PROTO_HDRS})
add_library(ge_local_opskernel_builder_static STATIC ${OPS_KERNEL_SRC_LIST} ${PROTO_OPS_STATIC_HDRS})


target_compile_options(ge_local_opskernel_builder_static PRIVATE target_compile_options(ge_local_opskernel_builder_static PRIVATE
-Werror -Werror
@@ -243,7 +245,7 @@ target_include_directories(ge_local_opskernel_builder_static PRIVATE
${METADEF_DIR}/inc/external/graph ${METADEF_DIR}/inc/external/graph
${METADEF_DIR}/inc/graph ${METADEF_DIR}/inc/graph
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/proto/ge
${CMAKE_BINARY_DIR}/proto/ge_ops_static
#### yellow zone #### #### yellow zone ####
${GE_CODE_DIR}/../inc ${GE_CODE_DIR}/../inc
#### blue zone #### #### blue zone ####


+ 1
- 0
ge/ge_local_engine/ops_kernel_store/op/ge_deleted_op.cc View File

@@ -38,6 +38,7 @@ REGISTER_OP_CREATOR(ExpandDims, GeDeletedOp);
REGISTER_OP_CREATOR(Reshape, GeDeletedOp); REGISTER_OP_CREATOR(Reshape, GeDeletedOp);
REGISTER_OP_CREATOR(ReFormat, GeDeletedOp); REGISTER_OP_CREATOR(ReFormat, GeDeletedOp);
REGISTER_OP_CREATOR(Squeeze, GeDeletedOp); REGISTER_OP_CREATOR(Squeeze, GeDeletedOp);
REGISTER_OP_CREATOR(Unsqueeze, GeDeletedOp);
REGISTER_OP_CREATOR(Size, GeDeletedOp); REGISTER_OP_CREATOR(Size, GeDeletedOp);
REGISTER_OP_CREATOR(Shape, GeDeletedOp); REGISTER_OP_CREATOR(Shape, GeDeletedOp);
REGISTER_OP_CREATOR(ShapeN, GeDeletedOp); REGISTER_OP_CREATOR(ShapeN, GeDeletedOp);


+ 2
- 0
ge/ge_runner.mk View File

@@ -114,6 +114,7 @@ LIBGE_LOCAL_SRC_FILES := \
graph/passes/atomic_addr_clean_pass.cc \ graph/passes/atomic_addr_clean_pass.cc \
graph/passes/mark_same_addr_pass.cc \ graph/passes/mark_same_addr_pass.cc \
graph/passes/mark_graph_unknown_status_pass.cc \ graph/passes/mark_graph_unknown_status_pass.cc \
graph/passes/mark_node_unknown_shape_pass.cc \
graph/passes/mark_agnostic_pass.cc \ graph/passes/mark_agnostic_pass.cc \
graph/partition/dynamic_shape_partition.cc \ graph/partition/dynamic_shape_partition.cc \
graph/partition/stage_partition.cc \ graph/partition/stage_partition.cc \
@@ -246,6 +247,7 @@ LIBGE_LOCAL_SRC_FILES := \
graph/passes/end_of_sequence_add_control_pass.cc \ graph/passes/end_of_sequence_add_control_pass.cc \
graph/passes/memcpy_addr_async_pass.cc \ graph/passes/memcpy_addr_async_pass.cc \
graph/passes/set_input_output_offset_pass.cc \ graph/passes/set_input_output_offset_pass.cc \
graph/passes/buffer_pool_memory_pass.cc \
graph/preprocess/graph_preprocess.cc \ graph/preprocess/graph_preprocess.cc \
graph/preprocess/insert_op/ge_aipp_op.cc \ graph/preprocess/insert_op/ge_aipp_op.cc \
graph/preprocess/insert_op/util_insert_aipp_op.cc \ graph/preprocess/insert_op/util_insert_aipp_op.cc \


+ 57
- 10
ge/ge_runtime/task/label_goto_task.cc View File

@@ -16,14 +16,12 @@


#include "ge_runtime/task/label_goto_task.h" #include "ge_runtime/task/label_goto_task.h"
#include "ge_runtime/task/task_factory.h" #include "ge_runtime/task/task_factory.h"
#include "framework/common/util.h"


namespace ge { namespace ge {
namespace model_runner { namespace model_runner {
LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::shared_ptr<LabelGotoTaskInfo> &task_info) LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::shared_ptr<LabelGotoTaskInfo> &task_info)
: TaskRepeater<LabelGotoTaskInfo>(model_context, task_info),
task_info_(task_info),
stream_(nullptr),
label_(nullptr) {
: TaskRepeater<LabelGotoTaskInfo>(model_context, task_info), task_info_(task_info) {
if (task_info_ == nullptr) { if (task_info_ == nullptr) {
GELOGW("task_info_ is null!"); GELOGW("task_info_ is null!");
return; return;
@@ -42,29 +40,78 @@ LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::share
label_ = label_list[label_id]; label_ = label_list[label_id];
} }


LabelGotoTask::~LabelGotoTask() {}
LabelGotoTask::~LabelGotoTask() {
GE_FREE_RT_LOG(label_info_);
GE_FREE_RT_LOG(index_value_);
}


bool LabelGotoTask::Distribute() { bool LabelGotoTask::Distribute() {
GELOGI("LabelGotoTask Distribute start."); GELOGI("LabelGotoTask Distribute start.");
if (!CheckParamValid()) {
return false;
}

const std::vector<void *> label_list = { label_ };
rtError_t rt_ret = rtMalloc(&index_value_, sizeof(uint64_t), RT_MEMORY_HBM);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret);
return false;
}

uint64_t branch_index = 0;
rt_ret = rtMemcpy(index_value_, sizeof(uint64_t), &branch_index, sizeof(uint64_t), RT_MEMCPY_HOST_TO_DEVICE);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret);
return false;
}

uint32_t label_info_size = sizeof(rtLabelDevInfo) * label_list.size();
rt_ret = rtMalloc(&label_info_, label_info_size, RT_MEMORY_HBM);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret);
return false;
}

rt_ret = rtLabelListCpy(label_list.data(), label_list.size(), label_info_, label_info_size);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret);
return false;
}

rt_ret = rtLabelSwitchByIndex(index_value_, label_list.size(), label_info_, stream_);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret);
return false;
}

GELOGI("DistributeTask end.");
return true;
}

bool LabelGotoTask::CheckParamValid() {
if (stream_ == nullptr) { if (stream_ == nullptr) {
GELOGE(PARAM_INVALID, "stream is null!"); GELOGE(PARAM_INVALID, "stream is null!");
return false; return false;
} }

if (label_ == nullptr) { if (label_ == nullptr) {
GELOGE(PARAM_INVALID, "label is null!"); GELOGE(PARAM_INVALID, "label is null!");
return false; return false;
} }
rtError_t rt_ret = rtLabelGotoEx(label_, stream_);
if (rt_ret != RT_ERROR_NONE) {
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);

if (label_info_ != nullptr) {
GELOGE(PARAM_INVALID, "label_info_ has dirty data.");
return false;
}

if (index_value_ != nullptr) {
GELOGE(PARAM_INVALID, "index_value_ has dirty data.");
return false; return false;
} }


GELOGI("DistributeTask end.");
return true; return true;
} }


REGISTER_TASK(TaskInfoType::LABEL_GOTO, LabelGotoTask, LabelGotoTaskInfo); REGISTER_TASK(TaskInfoType::LABEL_GOTO, LabelGotoTask, LabelGotoTaskInfo);

} // namespace model_runner } // namespace model_runner
} // namespace ge } // namespace ge

+ 6
- 2
ge/ge_runtime/task/label_goto_task.h View File

@@ -31,9 +31,13 @@ class LabelGotoTask : public TaskRepeater<LabelGotoTaskInfo> {
bool Distribute() override; bool Distribute() override;


private: private:
bool CheckParamValid();

std::shared_ptr<LabelGotoTaskInfo> task_info_; std::shared_ptr<LabelGotoTaskInfo> task_info_;
void *stream_;
void *label_;
void *stream_{nullptr};
void *label_{nullptr};
void *label_info_{nullptr};
void *index_value_{nullptr};
}; };
} // namespace model_runner } // namespace model_runner
} // namespace ge } // namespace ge


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

@@ -36,6 +36,7 @@
#include "graph/utils/type_utils.h" #include "graph/utils/type_utils.h"
#include "init/gelib.h" #include "init/gelib.h"
#include "model/ge_model.h" #include "model/ge_model.h"
#include "analyzer/analyzer.h"


using std::map; using std::map;
using std::string; using std::string;
@@ -50,9 +51,14 @@ const char *const kFileNameSuffix = "online";
const char *const kAicpuAllshape = "_AllShape"; const char *const kAicpuAllshape = "_AllShape";
constexpr char const *kAttrSupportDynamicShape = "support_dynamicshape"; constexpr char const *kAttrSupportDynamicShape = "support_dynamicshape";
const int64_t kDynamicDimValue = -2; const int64_t kDynamicDimValue = -2;
const int kDefaultDeviceId = 0;
const int kDefaultJobId = 0;
const int32_t kFuzzBuildPattern = 1;


std::map<ge::OpEngineType, std::string> engine_type_map{ std::map<ge::OpEngineType, std::string> engine_type_map{
{ge::ENGINE_SYS, kEngineNameDefault}, {ge::ENGINE_AICORE, kAIcoreEngine}, {ge::ENGINE_VECTOR, kVectorEngine}};
{ge::ENGINE_SYS, kEngineNameDefault},
{ge::ENGINE_AICORE, kAIcoreEngine},
{ge::ENGINE_VECTOR, kVectorEngine}};


bool ContainsDynamicInpus(const ge::OpDesc &op_desc) { bool ContainsDynamicInpus(const ge::OpDesc &op_desc) {
for (auto &tensor_desc : op_desc.GetAllInputsDescPtr()) { for (auto &tensor_desc : op_desc.GetAllInputsDescPtr()) {
@@ -63,6 +69,10 @@ bool ContainsDynamicInpus(const ge::OpDesc &op_desc) {
} }
return false; return false;
} }
// if optional in/out, format is format_reserved and dtype is dt_undefined
bool IsOptional(const ge::GeTensorDesc &tensor_desc) {
return tensor_desc.GetFormat() == ge::FORMAT_RESERVED && tensor_desc.GetDataType() == ge::DT_UNDEFINED;
}
} // namespace } // namespace


namespace ge { namespace ge {
@@ -83,8 +93,9 @@ static Status CheckEngineTypeSupport(const NodePtr &node, OpEngineType engine_ty
} else { } else {
ErrorManager::GetInstance().ATCReportErrMessage("E14001", {"opname", "optype", "value", "reason"}, ErrorManager::GetInstance().ATCReportErrMessage("E14001", {"opname", "optype", "value", "reason"},
{op_desc->GetName(), op_desc->GetType(), "engine type", {op_desc->GetName(), op_desc->GetType(), "engine type",
"it only support kEngineNameDefault/kAIcoreEngine/kVectorEngine"});
GELOGE(FAILED, "CheckEngineType: engine type: %d not support", static_cast<int>(engine_type));
"it only support default/AIcoreEngine/VectorEngine"});
GELOGE(FAILED, "[Check][EngineType]value:%d not support, "
"only support default/AIcoreEngine/VectorEngine now", static_cast<int>(engine_type));
return FAILED; return FAILED;
} }


@@ -149,7 +160,7 @@ static Status CheckEngineTypeSupport(const NodePtr &node, OpEngineType engine_ty
} }


static Status AddInputs(const ComputeGraphPtr &graph, const NodePtr &node, const GeTensorDesc &tensor, int32_t index, static Status AddInputs(const ComputeGraphPtr &graph, const NodePtr &node, const GeTensorDesc &tensor, int32_t index,
bool attr) {
bool attr, int32_t &data_index) {
GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID); GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID);
GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID); GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID);


@@ -188,17 +199,21 @@ static Status AddInputs(const ComputeGraphPtr &graph, const NodePtr &node, const


(void)AttrUtils::SetBool(data_op, "_is_single_op", true); (void)AttrUtils::SetBool(data_op, "_is_single_op", true);


GE_CHK_BOOL_EXEC(data_op->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add input desc fail.");
GE_CHK_BOOL_EXEC(data_op->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add output desc fail.");
if (attr) {
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(data_op, ATTR_NAME_INDEX, index), return FAILED, "Set index fail.");
GE_CHK_BOOL_EXEC(data_op->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED,
"[Add][InputDesc]fail for node:%s", data_op->GetName().c_str());
GE_CHK_BOOL_EXEC(data_op->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED,
"[Add][OutputDesc]fail for node:%s", data_op->GetName().c_str());
if (attr && !is_const) {
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(data_op, ATTR_NAME_INDEX, data_index), return FAILED,
"[Set][Attr:%s]fail for node:%s", ATTR_NAME_INDEX.c_str(), data_op->GetName().c_str());
++data_index;
} }


ge::NodePtr arg_node = graph->AddNode(data_op); ge::NodePtr arg_node = graph->AddNode(data_op);
GE_CHK_BOOL_EXEC(arg_node != nullptr, return FAILED, "Insert Data node fail.");
GE_CHK_BOOL_EXEC(arg_node != nullptr, return FAILED, "Insert Data node fail");


GE_CHK_STATUS(GraphUtils::AddEdge(arg_node->GetOutDataAnchor(0), node->GetInDataAnchor(index)), GE_CHK_STATUS(GraphUtils::AddEdge(arg_node->GetOutDataAnchor(0), node->GetInDataAnchor(index)),
"Add edge[%s->%s] fail.", data_op->GetName().c_str(), node->GetName().c_str());
"[Add][Edge]fail from node:%s to node:%s", data_op->GetName().c_str(), node->GetName().c_str());


return SUCCESS; return SUCCESS;
} }
@@ -213,20 +228,23 @@ static Status AddOutputs(const ComputeGraphPtr &graph, const NodePtr &node, cons
for (const auto &out_desc : outputs) { for (const auto &out_desc : outputs) {
GeTensorDesc tensor = out_desc.GetTensorDesc(); GeTensorDesc tensor = out_desc.GetTensorDesc();
TensorUtils::SetInputTensor(tensor, true); TensorUtils::SetInputTensor(tensor, true);
GE_CHK_BOOL_EXEC(op_desc->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add input desc fail");
GE_CHK_BOOL_EXEC(op_desc->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED,
"[Add][InputDesc]fail for node:%s", op_desc->GetName().c_str());


TensorUtils::SetInputTensor(tensor, false); TensorUtils::SetInputTensor(tensor, false);
TensorUtils::SetOutputTensor(tensor, true); TensorUtils::SetOutputTensor(tensor, true);
GE_CHK_BOOL_EXEC(op_desc->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add output desc fail");
GE_CHK_BOOL_EXEC(op_desc->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED,
"[Add][OutputDesc]fail for node:%s", op_desc->GetName().c_str());
count++; count++;
} }
GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID); GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID);
ge::NodePtr out_node = graph->AddNode(op_desc); ge::NodePtr out_node = graph->AddNode(op_desc);
GE_CHK_BOOL_EXEC(out_node != nullptr, return FAILED, "Insert Output node fail.");
GE_CHK_BOOL_EXEC(out_node != nullptr, return FAILED,
"[Add][Node:%s]fail in graph:%u", op_desc->GetName().c_str(), graph->GetGraphID());
GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID); GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID);
for (int32_t i = 0; i < count; ++i) { for (int32_t i = 0; i < count; ++i) {
GE_CHK_STATUS(GraphUtils::AddEdge(node->GetOutDataAnchor(i), out_node->GetInDataAnchor(i)), GE_CHK_STATUS(GraphUtils::AddEdge(node->GetOutDataAnchor(i), out_node->GetInDataAnchor(i)),
"Add edge[%s->%s] fail.", node->GetName().c_str(), out_node->GetName().c_str());
"[Add][Edge]fail from node:%s to node:%s", node->GetName().c_str(), out_node->GetName().c_str());
} }


return SUCCESS; return SUCCESS;
@@ -283,13 +301,44 @@ static Status ResetTensorVecShape(const vector<GeTensor> &inputs, vector<GeTenso
return SUCCESS; return SUCCESS;
} }


static Status GetFuzzBuildAttrs(const OpDescPtr &op_desc, const GeRootModelPtr &ge_root_model,
GeAttrValue::LIST_NAMED_ATTRS &fuzz_build_attrs) {
GELOGD("Start get fuzz build attrs of %s.", op_desc->GetName().c_str());
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph());
for (const auto &node : ge_root_model->GetRootGraph()->GetAllNodes()) {
GE_CHECK_NOTNULL(node);
GE_CHECK_NOTNULL(node->GetOpDesc());
GELOGD("Delete fuzz build attr of %s after build.", node->GetName().c_str());
node->GetOpDesc()->DelAttr(ATTR_NAME_FUZZ_BUILD);
}
(void)AttrUtils::GetListNamedAttrs(op_desc, ATTR_NAME_FUZZ_BUILD_RES_ATTRS, fuzz_build_attrs);
if (!fuzz_build_attrs.empty()) {
GELOGD("%s has split, get ATTR_NAME_FUZZ_BUILD_RES_ATTRS directly.", op_desc->GetName().c_str());
return SUCCESS;
} else {
GELOGW("%s build with fuzz build pattern, but not set ATTR_NAME_FUZZ_BUILD_RES_ATTRS.", op_desc->GetName().c_str());
}
return SUCCESS;
}

static bool HasShapeRange(const vector<GeTensor> &inputs) {
for (const auto &input : inputs) {
vector<pair<int64_t, int64_t>> shape_range;
(void)input.GetTensorDesc().GetShapeRange(shape_range);
if (!shape_range.empty()) {
GELOGD("Has set shape range.");
return true;
}
}
return false;
}

class GeGenerator::Impl { class GeGenerator::Impl {
public: public:
Impl(OmgContext &omg_context) : omg_context_(omg_context) {} Impl(OmgContext &omg_context) : omg_context_(omg_context) {}
~Impl() = default; ~Impl() = default;


Status BuildModel(const Graph &graph, const vector<GeTensor> &inputs, GeRootModelPtr &ge_models); Status BuildModel(const Graph &graph, const vector<GeTensor> &inputs, GeRootModelPtr &ge_models);

Status SaveModel(const string &file_name_prefix, GeModelPtr &models, ModelBufferData &model); Status SaveModel(const string &file_name_prefix, GeModelPtr &models, ModelBufferData &model);


Status SaveRootModel(const string &file_name_prefix, GeRootModelPtr &model, ModelBufferData &model_buff); Status SaveRootModel(const string &file_name_prefix, GeRootModelPtr &model, ModelBufferData &model_buff);
@@ -554,6 +603,42 @@ bool GeGenerator::Impl::SetOmSystemInfo(AttrHolder &obj) {
return true; return true;
} }


Status GeGenerator::SetModelNameForDump(const GeRootModelPtr &ge_root_model) {
bool is_unknown_shape = false;
Status ret = ge_root_model->CheckIsUnknownShape(is_unknown_shape);
if (ret != SUCCESS) {
GELOGE(FAILED, "[Check][IsUnknownShape]Check root model is unknown shape failed, model id:%u",
ge_root_model->GetModelId());
REPORT_CALL_ERROR("E19999", "Check root model is unknown shape failed, model id:%u",
ge_root_model->GetModelId());
return FAILED;
}
GeModelPtr model_root = nullptr;
if (is_unknown_shape) {
model_root = MakeShared<GeModel>();
GE_CHECK_NOTNULL(model_root);
model_root->SetGraph(GraphUtils::CreateGraphFromComputeGraph(ge_root_model->GetRootGraph()));
ge_root_model->SetSubgraphInstanceNameToModel(ge_root_model->GetRootGraph()->GetName(), model_root);
}

ModelHelper model_helper;
string model_name;
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph());
Status name_ret = model_helper.GetModelNameFromMergedGraphName(ge_root_model->GetRootGraph()->GetName(),
model_name);
if (name_ret != SUCCESS) {
ErrorManager::GetInstance().ATCReportErrMessage("E10000", {"parameter"}, {"output"});
GELOGE(FAILED, "[Check][GetModelNameStep]Get model_name failed. Param --output is invalid, root graph name: %s",
ge_root_model->GetRootGraph()->GetName().c_str());
return PARAM_INVALID;
}
map<string, GeModelPtr> name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel();
GeModelPtr &ge_model = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()];
GE_CHECK_NOTNULL(ge_model);
ge_model->SetName(model_name);
return SUCCESS;
}

Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_prefix, const vector<GeTensor> &inputs, Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_prefix, const vector<GeTensor> &inputs,
ModelBufferData &model, bool is_offline) { ModelBufferData &model, bool is_offline) {
rtContext_t ctx = nullptr; rtContext_t ctx = nullptr;
@@ -588,20 +673,10 @@ Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_pr
} }


GE_CHECK_NOTNULL(ge_root_model); GE_CHECK_NOTNULL(ge_root_model);
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph());
ModelHelper model_helper;
string model_name = "";
Status name_ret = model_helper.GetModelNameFromMergedGraphName(ge_root_model->GetRootGraph()->GetName(),
model_name);
if (name_ret != SUCCESS) {
ErrorManager::GetInstance().ATCReportErrMessage("E10000", {"parameter"}, {"output"});
GELOGE(FAILED, "Get model_name failed. Param --output is invalid.");
return PARAM_INVALID;
ret = SetModelNameForDump(ge_root_model);
if (ret != SUCCESS) {
return ret;
} }
map<string, GeModelPtr> name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel();
GeModelPtr &ge_model = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()];
GE_RETURN_WITH_LOG_IF_FALSE(ge_model != nullptr, "ge_model cannot be null");
ge_model->SetName(model_name);
ret = impl_->SaveRootModel(file_name_prefix, ge_root_model, model); ret = impl_->SaveRootModel(file_name_prefix, ge_root_model, model);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "Save model failed"); GELOGE(ret, "Save model failed");
@@ -654,6 +729,34 @@ namespace {
} }
} }


bool GeGenerator::CheckNoAicore(const ComputeGraphPtr &graph) {
for (const auto &node : graph->GetDirectNode()) {
if (node == nullptr) {
continue;
}
auto op_desc = node->GetOpDesc();
if (op_desc == nullptr) {
continue;
}
if (op_desc->GetOpEngineName() == kAIcoreEngine) {
return false;
}
}
return true;
}

void GeGenerator::RemoveConst(const vector<GeTensor> &inputs, vector<GeTensor> &outputs) {
for (auto &input : inputs) {
GeTensorDesc input_desc = input.GetTensorDesc();
bool is_const = false;
(void)AttrUtils::GetBool(input_desc, CONST_ATTR_NAME_INPUT, is_const);
bool is_optional = IsOptional(input_desc);
if (!is_optional && !is_const) {
outputs.emplace_back(input);
}
}
}

Status GeGenerator::CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, Status GeGenerator::CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs,
const vector<GeTensor> &outputs) { const vector<GeTensor> &outputs) {
GE_CHECK_NOTNULL_EXEC(op_desc, return PARAM_INVALID); GE_CHECK_NOTNULL_EXEC(op_desc, return PARAM_INVALID);
@@ -676,7 +779,8 @@ Status GeGenerator::CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor>


Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, const vector<GeTensor> &outputs, Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, const vector<GeTensor> &outputs,
const string &model_file_name, OpEngineType engine_type, ModelBufferData &model_buff, const string &model_file_name, OpEngineType engine_type, ModelBufferData &model_buff,
bool is_offline) {
bool is_offline, int32_t compile_flag) {
GELOGD("Inputs size is %zu, outputs size is %zu.", inputs.size(), outputs.size());
GE_CHECK_NOTNULL_EXEC(impl_, return PARAM_INVALID); GE_CHECK_NOTNULL_EXEC(impl_, return PARAM_INVALID);
impl_->is_offline_ = is_offline; impl_->is_offline_ = is_offline;
if (!is_offline) { if (!is_offline) {
@@ -698,6 +802,16 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in
OpDescPtr op_desc_tmp = AttrUtils::CloneOpDesc(op_desc); OpDescPtr op_desc_tmp = AttrUtils::CloneOpDesc(op_desc);
GE_CHECK_NOTNULL(op_desc_tmp); GE_CHECK_NOTNULL(op_desc_tmp);


bool fuzz_compile_flag = false;
if (!HasShapeRange(inputs) && compile_flag == kFuzzBuildPattern) {
fuzz_compile_flag = true;
}
if (!AttrUtils::SetBool(op_desc, ATTR_NAME_FUZZ_BUILD, fuzz_compile_flag)) {
GELOGE(FAILED, "[Set][ATTR_NAME_FUZZ_BUILD] Failed to set attr for %s.", op_desc->GetName().c_str());
return FAILED;
}
impl_->omg_context_.fuzz_compile_flag = fuzz_compile_flag;

// 1. Create ComputeGraph. // 1. Create ComputeGraph.
string name = ge::CurrentTimeInStr() + "_" + model_file_name; string name = ge::CurrentTimeInStr() + "_" + model_file_name;
Graph graph; Graph graph;
@@ -710,7 +824,7 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in
auto node = comp_graph->FindNode(op_desc->GetName()); auto node = comp_graph->FindNode(op_desc->GetName());
Status ret = CheckEngineTypeSupport(node, engine_type); Status ret = CheckEngineTypeSupport(node, engine_type);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(ret, "check engine type failed.");
GELOGE(ret, "[Check][EngineType]value:%d for node:%s not support", engine_type, node->GetName().c_str());
return ret; return ret;
} }
} }
@@ -718,7 +832,9 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in
GELOGI("ATC parser success in single op build."); GELOGI("ATC parser success in single op build.");


GeRootModelPtr ge_root_model = nullptr; GeRootModelPtr ge_root_model = nullptr;
GE_CHK_STATUS_RET_NOLOG(impl_->BuildModel(graph, inputs, ge_root_model));
vector<GeTensor> data_inputs;
RemoveConst(inputs, data_inputs);
GE_CHK_STATUS_RET_NOLOG(impl_->BuildModel(graph, data_inputs, ge_root_model));
map<string, GeAttrValue> op_attrs = op_desc_tmp->GetAllAttrs(); map<string, GeAttrValue> op_attrs = op_desc_tmp->GetAllAttrs();
GE_CHECK_NOTNULL(ge_root_model); GE_CHECK_NOTNULL(ge_root_model);
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); GE_CHECK_NOTNULL(ge_root_model->GetRootGraph());
@@ -734,7 +850,7 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in


bool all_shape = false; bool all_shape = false;
(void)AttrUtils::GetBool(op_desc, kAicpuAllshape, all_shape); (void)AttrUtils::GetBool(op_desc, kAicpuAllshape, all_shape);
if (all_shape) {
if (all_shape && CheckNoAicore(root_graph)) {
GELOGD("Get aicpu all_shape kernel!"); GELOGD("Get aicpu all_shape kernel!");
vector<GeTensor> inputs_dynamic; vector<GeTensor> inputs_dynamic;
vector<GeTensor> outputs_dynamic; vector<GeTensor> outputs_dynamic;
@@ -742,6 +858,19 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in
GE_CHK_STATUS_RET_NOLOG(ResetTensorVecShape(outputs, outputs_dynamic)); GE_CHK_STATUS_RET_NOLOG(ResetTensorVecShape(outputs, outputs_dynamic));
GE_CHK_STATUS_RET_NOLOG( GE_CHK_STATUS_RET_NOLOG(
impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs_dynamic, outputs_dynamic)); impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs_dynamic, outputs_dynamic));
} else if (fuzz_compile_flag) {
GELOGD("Get fuzz build result of %s.", op_desc->GetName().c_str());
(void)AttrUtils::SetInt(ge_model, ATTR_NAME_BUILD_MODE, fuzz_compile_flag);
GeAttrValue::LIST_NAMED_ATTRS fuzz_build_attrs;
if (GetFuzzBuildAttrs(op_desc, ge_root_model, fuzz_build_attrs) != SUCCESS) {
GELOGE(FAILED, "[Get][FuzzRet]Failed to get fuzz build result of %s.", op_desc->GetName().c_str());
return FAILED;
}
if (!fuzz_build_attrs.empty()) {
GE_CHK_BOOL_EXEC(AttrUtils::SetListNamedAttrs(ge_model, ATTR_NAME_FUZZ_BUILD_RES_ATTRS, fuzz_build_attrs),
return FAILED, "Set ATTR_NAME_FUZZ_BUILD_RES_ATTRS failed.");
}
GE_CHK_STATUS_RET_NOLOG(impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs, outputs));
} else { } else {
GE_CHK_STATUS_RET_NOLOG(impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs, outputs)); GE_CHK_STATUS_RET_NOLOG(impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs, outputs));
} }
@@ -757,15 +886,17 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in
* @param [in] vector<GeTensor> &inputs: Operator input data description information. * @param [in] vector<GeTensor> &inputs: Operator input data description information.
* @param [in] vector<GeTensor> &outputs: Operator output data description information. * @param [in] vector<GeTensor> &outputs: Operator output data description information.
* @param [in] const string &model_file_name: Offline model filename. * @param [in] const string &model_file_name: Offline model filename.
* @param [in] compile_flag: op build flag from atc
* @return SUCCESS handle successfully / others handle failed * @return SUCCESS handle successfully / others handle failed
*/ */
Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs, Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs,
const vector<GeTensor> &outputs, const string &model_file_name) {
const vector<GeTensor> &outputs, const string &model_file_name,
int32_t compile_flag) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
GELOGI("Start to build single op offline model, input size: %zu, output size: %zu", inputs.size(), outputs.size()); GELOGI("Start to build single op offline model, input size: %zu, output size: %zu", inputs.size(), outputs.size());
ModelBufferData model_buff; ModelBufferData model_buff;
OpEngineType engine_type = ENGINE_SYS; OpEngineType engine_type = ENGINE_SYS;
Status status = BuildSingleOp(op_desc, inputs, outputs, model_file_name, engine_type, model_buff, true);
Status status = BuildSingleOp(op_desc, inputs, outputs, model_file_name, engine_type, model_buff, true, compile_flag);
GELOGI("Finish build single offline model, status: %u", status); GELOGI("Finish build single offline model, status: %u", status);
return status; return status;
} }
@@ -777,9 +908,11 @@ Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor
* @param [in] vector<GeTensor> &inputs: Operator input data description information. * @param [in] vector<GeTensor> &inputs: Operator input data description information.
* @param [in] vector<GeTensor> &outputs: Operator output data description information. * @param [in] vector<GeTensor> &outputs: Operator output data description information.
* @param [in] engine_type: specific engine. * @param [in] engine_type: specific engine.
* @param [in] compile_flag: op build flag, compile flag by acl
* @param [out] ModelBufferData &Model_buff: Model_buff: model buffer of the op. * @param [out] ModelBufferData &Model_buff: Model_buff: model buffer of the op.
* @return SUCCESS handle successfully / others handle failed * @return SUCCESS handle successfully / others handle failed
*/ */

Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs, Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs,
const vector<GeTensor> &outputs, OpEngineType engine_type, const vector<GeTensor> &outputs, OpEngineType engine_type,
ModelBufferData &model_buff) { ModelBufferData &model_buff) {
@@ -790,6 +923,17 @@ Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor
return status; return status;
} }


Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs,
const vector<GeTensor> &outputs, OpEngineType engine_type, int32_t compile_flag,
ModelBufferData &model_buff) {
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
GELOGI("Start to build single op online, input size: %zu, output size: %zu", inputs.size(), outputs.size());
Status status = BuildSingleOp(op_desc, inputs, outputs, kFileNameSuffix, engine_type, model_buff, false,
compile_flag);
GELOGI("Finish build single online model, status: %u", status);
return status;
}

Status GeGenerator::BuildSingleOpGraph(OpDescPtr &op_desc, const vector<GeTensor> &inputs, Status GeGenerator::BuildSingleOpGraph(OpDescPtr &op_desc, const vector<GeTensor> &inputs,
const vector<GeTensor> &outputs, std::string graph_name, Graph &graph) { const vector<GeTensor> &outputs, std::string graph_name, Graph &graph) {
ge::ComputeGraphPtr compute_graph = MakeShared<ComputeGraph>(graph_name); ge::ComputeGraphPtr compute_graph = MakeShared<ComputeGraph>(graph_name);
@@ -801,18 +945,19 @@ Status GeGenerator::BuildSingleOpGraph(OpDescPtr &op_desc, const vector<GeTensor


// 2. Create InputData node. // 2. Create InputData node.
int32_t arg_index = 0; int32_t arg_index = 0;
int32_t data_index = 0;
if (inputs.empty()) { if (inputs.empty()) {
for (const auto &input_desc : op_desc->GetAllInputsDescPtr()) { for (const auto &input_desc : op_desc->GetAllInputsDescPtr()) {
GE_CHECK_NOTNULL_EXEC(input_desc, return INTERNAL_ERROR); GE_CHECK_NOTNULL_EXEC(input_desc, return INTERNAL_ERROR);
if (!IsNeedConnectInputOpForSingleOp(*input_desc)) { if (!IsNeedConnectInputOpForSingleOp(*input_desc)) {
continue; continue;
} }
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, *input_desc, arg_index, false));
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, *input_desc, arg_index, false, data_index));
arg_index++; arg_index++;
} }
} else { } else {
for (const auto &in_desc : inputs) { for (const auto &in_desc : inputs) {
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, in_desc.GetTensorDesc(), arg_index, true));
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, in_desc.GetTensorDesc(), arg_index, true, data_index));
arg_index++; arg_index++;
} }
} }
@@ -871,13 +1016,12 @@ Status GeGenerator::Impl::SaveRootModel(const string &file_name_prefix, GeRootMo
"ge root model has no sub model") "ge root model has no sub model")
GeModelPtr model_root = nullptr; GeModelPtr model_root = nullptr;
if (is_unknown_shape) { if (is_unknown_shape) {
model_root = make_shared<GeModel>();
model_root->SetGraph(GraphUtils::CreateGraphFromComputeGraph(ge_root_model->GetRootGraph()));
ge_root_model->SetSubgraphInstanceNameToModel(ge_root_model->GetRootGraph()->GetName(), model_root);
model_root->SetName(ge_root_model->GetRootGraph()->GetName());
auto name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel();
model_root = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()];
} else { } else {
model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second; model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second;
} }
GE_CHECK_NOTNULL(model_root);
// set atc version // set atc version
if (!SetAtcVersionInfo(*(model_root.get()))) { if (!SetAtcVersionInfo(*(model_root.get()))) {
GELOGW("SetPackageVersionInfo of atc failed!"); GELOGW("SetPackageVersionInfo of atc failed!");
@@ -915,6 +1059,13 @@ Status GeGenerator::Impl::BuildModel(const Graph &graph, const vector<GeTensor>


static std::atomic<uint64_t> atomic_session_id(0); static std::atomic<uint64_t> atomic_session_id(0);
auto session_id = atomic_session_id.fetch_add(1); auto session_id = atomic_session_id.fetch_add(1);
// This is a temporary add for graph with variable
auto version = static_cast<int32_t>(SessionVersion::ClOUD_VERSION);
ret = VarManager::Instance(session_id)->Init(version, session_id, kDefaultDeviceId, kDefaultJobId);
GELOGI("Start init var instance, session_id %lu", session_id);
if (ret != SUCCESS) {
GELOGW("Failed init var instance, session_id %lu", session_id);
}
if (is_singleop_unregistered_) { if (is_singleop_unregistered_) {
ret = graph_manager_.BuildGraphForUnregisteredOp(graph_id, inputs, ge_root_model, session_id); ret = graph_manager_.BuildGraphForUnregisteredOp(graph_id, inputs, ge_root_model, session_id);
} else { } else {
@@ -924,13 +1075,13 @@ Status GeGenerator::Impl::BuildModel(const Graph &graph, const vector<GeTensor>
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED, "GraphManager build graph fail, graph id: %u", graph_id); GELOGE(GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED, "GraphManager build graph fail, graph id: %u", graph_id);
VarManagerPool::Instance().RemoveVarManager(session_id);
return GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED;
ret = GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED;
} }


RtContextUtil::GetInstance().DestroyRtContexts(session_id);
Analyzer::GetInstance()->DestroySessionJsonObject(session_id);
VarManagerPool::Instance().RemoveVarManager(session_id); VarManagerPool::Instance().RemoveVarManager(session_id);

return SUCCESS;
return ret;
} }


Status GeGenerator::Impl::GenerateInfershapeGraph(const Graph &graph) { Status GeGenerator::Impl::GenerateInfershapeGraph(const Graph &graph) {


+ 32
- 51
ge/graph/build/graph_builder.cc View File

@@ -77,6 +77,8 @@ Status HandleSubgraphNode(NodePtr &src_node, OutDataAnchorPtr &src_out_anchor) {
Status HandleSubgraphDataNode(NodePtr &src_node, OutDataAnchorPtr &src_out_anchor) { Status HandleSubgraphDataNode(NodePtr &src_node, OutDataAnchorPtr &src_out_anchor) {
uint32_t index = 0; uint32_t index = 0;
if (!AttrUtils::GetInt(src_node->GetOpDesc(), ATTR_NAME_PARENT_NODE_INDEX, index)) { if (!AttrUtils::GetInt(src_node->GetOpDesc(), ATTR_NAME_PARENT_NODE_INDEX, index)) {
REPORT_INNER_ERROR("E19999", "get attr:%s failed from node:%s",
ATTR_NAME_PARENT_NODE_INDEX.c_str(), src_node->GetName().c_str());
GELOGE(FAILED, "Get attr ATTR_NAME_PARENT_NODE_INDEX failed, node:%s.", src_node->GetName().c_str()); GELOGE(FAILED, "Get attr ATTR_NAME_PARENT_NODE_INDEX failed, node:%s.", src_node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -109,6 +111,8 @@ Status GraphBuilder::CalcOpParam(const ge::ComputeGraphPtr &graph) {
GE_CHECK_NOTNULL(graph); GE_CHECK_NOTNULL(graph);
auto instance_ptr = ge::GELib::GetInstance(); auto instance_ptr = ge::GELib::GetInstance();
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { if (instance_ptr == nullptr || !instance_ptr->InitFlag()) {
REPORT_INNER_ERROR("E19999", "check gelib instance null, graph:%s",
graph->GetName().c_str());
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GraphBuilder: GE is not initialized"); GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GraphBuilder: GE is not initialized");
return GE_CLI_GE_NOT_INITIALIZED; return GE_CLI_GE_NOT_INITIALIZED;
} }
@@ -121,6 +125,8 @@ Status GraphBuilder::CalcOpParam(const ge::ComputeGraphPtr &graph) {
(void)instance_ptr->DNNEngineManagerObj().GetDNNEngineName(node_ptr); (void)instance_ptr->DNNEngineManagerObj().GetDNNEngineName(node_ptr);
kernel_lib_name = node_ptr->GetOpDesc()->GetOpKernelLibName(); kernel_lib_name = node_ptr->GetOpDesc()->GetOpKernelLibName();
if (kernel_lib_name.empty()) { if (kernel_lib_name.empty()) {
REPORT_INNER_ERROR("E19999", "op kernel lib is empty in node:%s(%s)",
node_ptr->GetName().c_str(), node_ptr->GetType().c_str());
GELOGE(INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node_ptr->GetName().c_str(), GELOGE(INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node_ptr->GetName().c_str(),
node_ptr->GetType().c_str()); node_ptr->GetType().c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
@@ -129,12 +135,16 @@ Status GraphBuilder::CalcOpParam(const ge::ComputeGraphPtr &graph) {


auto ret = SetInputSize(node_ptr); auto ret = SetInputSize(node_ptr);
if (ret != SUCCESS) { if (ret != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Set node:%s(%s) inputDesc size failed",
node_ptr->GetName().c_str(), node_ptr->GetType().c_str());
GELOGE(ret, "Set node inputDesc size failed, node name is %s", node_ptr->GetName().c_str()); GELOGE(ret, "Set node inputDesc size failed, node name is %s", node_ptr->GetName().c_str());
return ret; return ret;
} }


ret = OpsKernelBuilderManager::Instance().CalcOpRunningParam(*node_ptr); ret = OpsKernelBuilderManager::Instance().CalcOpRunningParam(*node_ptr);
if (ret != SUCCESS) { if (ret != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call Calculate op:%s(%s) running param failed",
node_ptr->GetName().c_str(), node_ptr->GetType().c_str());
GELOGE(ret, "Calculate op running param failed, node name is %s", node_ptr->GetName().c_str()); GELOGE(ret, "Calculate op running param failed, node name is %s", node_ptr->GetName().c_str());
return ret; return ret;
} }
@@ -191,6 +201,7 @@ Status GraphBuilder::UpdateParentNodeOutputSize(const ge::ComputeGraphPtr &graph


Status GraphBuilder::Build(ComputeGraphPtr &comp_graph, GeRootModelPtr &ge_root_model_ptr, uint64_t session_id) { Status GraphBuilder::Build(ComputeGraphPtr &comp_graph, GeRootModelPtr &ge_root_model_ptr, uint64_t session_id) {
if (comp_graph == nullptr) { if (comp_graph == nullptr) {
REPORT_INNER_ERROR("E19999", "check compute_graph nullptr, session_id:%lu", session_id);
GELOGE(GE_GRAPH_PARAM_NULLPTR, "Graph build comp_graph is null."); GELOGE(GE_GRAPH_PARAM_NULLPTR, "Graph build comp_graph is null.");
return GE_GRAPH_PARAM_NULLPTR; return GE_GRAPH_PARAM_NULLPTR;
} }
@@ -302,6 +313,8 @@ Status GraphBuilder::SetConstantInputOffset(ComputeGraphPtr &comp_graph) {


std::vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(peer_node); std::vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(peer_node);
if (weights.empty()) { if (weights.empty()) {
REPORT_INNER_ERROR("E19999", "check weights size of node %s(%s) is empty",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -382,54 +395,6 @@ Status GraphBuilder::BuildForHostCpuGraph(ComputeGraphPtr &comp_graph, GeModelPt
return BuildForUnknownShapeGraph(comp_graph, ge_model_ptr, session_id); return BuildForUnknownShapeGraph(comp_graph, ge_model_ptr, session_id);
} }


static Status InsertMemcpyNode(const ComputeGraphPtr &graph, const OutDataAnchorPtr &out_anchor,
const std::vector<InDataAnchorPtr> &in_anchors, const std::string &name) {
GE_CHECK_NOTNULL(out_anchor);
NodePtr in_node = out_anchor->GetOwnerNode();
GE_CHECK_NOTNULL(in_node);
OpDescBuilder op_desc_builder(name, MEMCPYADDRASYNC);
OpDescPtr op_desc = op_desc_builder.AddInput("x", in_node->GetOpDesc()->GetOutputDesc(0))
.AddOutput("y", in_node->GetOpDesc()->GetOutputDesc(0))
.Build();
(void)AttrUtils::SetBool(op_desc, ATTR_NO_NEED_CONSTANT_FOLDING, false);
if (GraphUtils::InsertNodeAfter(out_anchor, in_anchors, graph->AddNode(op_desc)) != GRAPH_SUCCESS) {
GELOGE(FAILED, "Insert IDENTITY node %s after %s failed.", name.c_str(), in_node->GetName().c_str());
return FAILED;
}
return SUCCESS;
}

static Status GenerateTaskForConstant(const std::shared_ptr<ComputeGraph> &graph) {
for (auto &node : graph->GetDirectNode()) {
// CONSTANT not generate task, so insert IDENTITY between CONSTANT and NETOUTPUT
auto op_desc = node->GetOpDesc();
if (op_desc == nullptr) {
continue;
}
auto op_type = op_desc->GetType();
if (op_type == NETOUTPUT) {
for (InDataAnchorPtr &in_data_anchor : node->GetAllInDataAnchors()) {
const OutDataAnchorPtr &peer_out_anchor = in_data_anchor->GetPeerOutAnchor();
GE_IF_BOOL_EXEC(peer_out_anchor == nullptr, continue);
NodePtr in_node = peer_out_anchor->GetOwnerNode();
GE_CHECK_NOTNULL(in_node);

std::string in_node_op_type = in_node->GetType();
if (in_node_op_type == CONSTANT) {
GELOGD("Insert MemcpyAsync node between %s and %s.", in_node->GetName().c_str(), node->GetName().c_str());
std::string name = node->GetName() + "_input_" + std::to_string(in_data_anchor->GetIdx()) + "_Memcpy";
if (InsertMemcpyNode(graph, peer_out_anchor, {in_data_anchor}, name) != SUCCESS) {
GELOGE(FAILED, "Insert memcpy between %s and %s failed.",
in_node->GetName().c_str(), node->GetName().c_str());
return FAILED;
}
}
}
}
}
return SUCCESS;
}

Status GraphBuilder::MarkFpBpProfilingTaskAttr(ComputeGraphPtr &com_graph) { Status GraphBuilder::MarkFpBpProfilingTaskAttr(ComputeGraphPtr &com_graph) {
bool original_unknown_shape_flag = com_graph->GetGraphUnknownFlag(); bool original_unknown_shape_flag = com_graph->GetGraphUnknownFlag();
com_graph->SetGraphUnknownFlag(false); com_graph->SetGraphUnknownFlag(false);
@@ -466,6 +431,8 @@ Status GraphBuilder::MarkFpBpProfilingTaskAttr(ComputeGraphPtr &com_graph) {
GELOGI("The all reduce node of dynamic graph is %s, idx %u", op_desc->GetName().c_str(), node_index); GELOGI("The all reduce node of dynamic graph is %s, idx %u", op_desc->GetName().c_str(), node_index);
(void)ge::AttrUtils::SetBool(op_desc, ATTR_NAME_INSERT_BP_PROFILILNG_TASK, true); (void)ge::AttrUtils::SetBool(op_desc, ATTR_NAME_INSERT_BP_PROFILILNG_TASK, true);
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep),
REPORT_INNER_ERROR("E19999", "Multiply result is out of range when calc profiling ar log id "
"for node:%s(%s)", op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Multiply result is out of range."); GELOGE(FAILED, "Multiply result is out of range.");
return FAILED); return FAILED);
int64_t log_id = i * kProfilingArStep + kProfilingArStartLogid; int64_t log_id = i * kProfilingArStep + kProfilingArStartLogid;
@@ -512,9 +479,6 @@ Status GraphBuilder::BuildForDynamicShapeGraph(ComputeGraphPtr &comp_graph,
!sub_graph->GetParentGraph()->GetGraphUnknownFlag()) { !sub_graph->GetParentGraph()->GetGraphUnknownFlag()) {
continue; continue;
} }

GE_CHK_STATUS_RET(GenerateTaskForConstant(sub_graph), "Generate task For constant node in subgraph failed.");

if (sub_graph->GetGraphUnknownFlag()) { if (sub_graph->GetGraphUnknownFlag()) {
// unknown shape build flow // unknown shape build flow
GE_CHK_STATUS_RET(BuildForUnknownShapeGraph(sub_graph, ge_model_ptr, session_id), GE_CHK_STATUS_RET(BuildForUnknownShapeGraph(sub_graph, ge_model_ptr, session_id),
@@ -545,16 +509,19 @@ Status GraphBuilder::GetTaskInfo(const ge::ModelBuilder &builder, const ModelPtr


int64_t memory_size = 0; int64_t memory_size = 0;
if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_MEMORY_SIZE, memory_size)) { if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_MEMORY_SIZE, memory_size)) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail in model", ATTR_MODEL_MEMORY_SIZE.c_str());
GELOGE(INTERNAL_ERROR, "Get memory size fail."); GELOGE(INTERNAL_ERROR, "Get memory size fail.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
int64_t p2p_memory_size = 0; int64_t p2p_memory_size = 0;
if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_memory_size)) { if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_memory_size)) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail in model", ATTR_MODEL_P2P_MEMORY_SIZE.c_str());
GELOGE(INTERNAL_ERROR, "Get p2p memory size fail."); GELOGE(INTERNAL_ERROR, "Get p2p memory size fail.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
int64_t weight_size = 0; int64_t weight_size = 0;
if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_WEIGHT_SIZE, weight_size)) { if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_WEIGHT_SIZE, weight_size)) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail in model", ATTR_MODEL_WEIGHT_SIZE.c_str());
GELOGE(INTERNAL_ERROR, "Get weight memory size fail."); GELOGE(INTERNAL_ERROR, "Get weight memory size fail.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -664,6 +631,7 @@ Status GraphBuilder::SetInputSize(const ge::NodePtr &node_ptr) {
Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) { Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) {
const auto &op_desc = node_ptr->GetOpDesc(); const auto &op_desc = node_ptr->GetOpDesc();
if (op_desc == nullptr) { if (op_desc == nullptr) {
REPORT_INNER_ERROR("E19999", "check op_desc is nullptr");
GELOGE(FAILED, "Op desc is nullptr."); GELOGE(FAILED, "Op desc is nullptr.");
return FAILED; return FAILED;
} }
@@ -681,6 +649,8 @@ Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) {
int64_t real_dim_size = 0; int64_t real_dim_size = 0;
ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size); ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size);
if (graph_status != GRAPH_SUCCESS) { if (graph_status != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get tensor size in bytes failed for op:%s(%s) index:0",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Get tensor size in bytes failed."); GELOGE(FAILED, "Get tensor size in bytes failed.");
return FAILED; return FAILED;
} }
@@ -688,6 +658,8 @@ Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) {
ge::GeTensorDesc input_desc = op_desc->GetInputDesc(0); ge::GeTensorDesc input_desc = op_desc->GetInputDesc(0);
ge::TensorUtils::SetSize(input_desc, real_dim_size); ge::TensorUtils::SetSize(input_desc, real_dim_size);
if (op_desc->UpdateInputDesc(0, input_desc) != GRAPH_SUCCESS) { if (op_desc->UpdateInputDesc(0, input_desc) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Update input desc size failed for op:%s(%s) index:0",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Update input desc size failed."); GELOGE(FAILED, "Update input desc size failed.");
return FAILED; return FAILED;
} }
@@ -716,6 +688,8 @@ Status GraphBuilder::CalcDynShapeRootGraphDataSize(const ge::OpDescPtr &op_desc)
int64_t real_dim_size = 0; int64_t real_dim_size = 0;
ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size); ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size);
if (graph_status != GRAPH_SUCCESS) { if (graph_status != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get tensor size in bytes failed for op:%s(%s) index:0 ",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Get tensor size in bytes failed."); GELOGE(FAILED, "Get tensor size in bytes failed.");
return FAILED; return FAILED;
} }
@@ -723,6 +697,8 @@ Status GraphBuilder::CalcDynShapeRootGraphDataSize(const ge::OpDescPtr &op_desc)
ge::TensorUtils::SetSize(output_desc, real_dim_size); ge::TensorUtils::SetSize(output_desc, real_dim_size);
GELOGI("Update dynamic shape graph data output size to [%ld].", real_dim_size); GELOGI("Update dynamic shape graph data output size to [%ld].", real_dim_size);
if (op_desc->UpdateOutputDesc(0, output_desc) != GRAPH_SUCCESS) { if (op_desc->UpdateOutputDesc(0, output_desc) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Update output desc size failed for op:%s(%s) index:0 ",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Update dynamic shape graph data output desc size failed."); GELOGE(FAILED, "Update dynamic shape graph data output desc size failed.");
return FAILED; return FAILED;
} }
@@ -740,6 +716,8 @@ Status GraphBuilder::SecondPartition(ge::ComputeGraphPtr &comp_graph) {
GE_CHK_STATUS_RET(ret, "Graph partition Failed."); GE_CHK_STATUS_RET(ret, "Graph partition Failed.");
const auto &graph_2_subgraphlist = graph_partitioner_.GetSubGraphMap(); const auto &graph_2_subgraphlist = graph_partitioner_.GetSubGraphMap();
if (graph_2_subgraphlist.find(comp_graph) == graph_2_subgraphlist.end()) { if (graph_2_subgraphlist.find(comp_graph) == graph_2_subgraphlist.end()) {
REPORT_INNER_ERROR("E19999", "find subgraphlis in graph:%s failed",
comp_graph->GetName().c_str());
GELOGE(FAILED, "Find subgraph failed."); GELOGE(FAILED, "Find subgraph failed.");
return FAILED; return FAILED;
} }
@@ -768,6 +746,9 @@ Status GraphBuilder::AddOutputMemTypeForNode(const NodePtr &node) {
mem_type); mem_type);
if (!AttrUtils::SetInt(src_desc->MutableOutputDesc(src_out_anchor->GetIdx()), ATTR_OUTPUT_MEMORY_TYPE, if (!AttrUtils::SetInt(src_desc->MutableOutputDesc(src_out_anchor->GetIdx()), ATTR_OUTPUT_MEMORY_TYPE,
mem_type)) { mem_type)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s for node:%s(%s) out_index:%u failed",
ATTR_OUTPUT_MEMORY_TYPE.c_str(), src_desc->GetName().c_str(), src_desc->GetType().c_str(),
src_out_anchor->GetIdx());
GELOGE(INTERNAL_ERROR, "Set out_memory_type attr for [%s:%d] failed.", src_desc->GetName().c_str(), GELOGE(INTERNAL_ERROR, "Set out_memory_type attr for [%s:%d] failed.", src_desc->GetName().c_str(),
src_out_anchor->GetIdx()); src_out_anchor->GetIdx());
return INTERNAL_ERROR; return INTERNAL_ERROR;


+ 10
- 0
ge/graph/build/label_allocator.cc View File

@@ -28,6 +28,7 @@ LabelAllocator::LabelAllocator(const ComputeGraphPtr &graph) : compute_graph_(gr


Status LabelAllocator::AssignFunctionalLabels() { Status LabelAllocator::AssignFunctionalLabels() {
if (compute_graph_ == nullptr) { if (compute_graph_ == nullptr) {
REPORT_INNER_ERROR("E19999", "check param compute_graph nullptr");
GELOGE(INTERNAL_ERROR, "ComputeGraph not set, Assign labels failed."); GELOGE(INTERNAL_ERROR, "ComputeGraph not set, Assign labels failed.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -46,11 +47,15 @@ Status LabelAllocator::AssignFunctionalLabels() {
for (auto node : functional_nodes) { for (auto node : functional_nodes) {
LabelMakerPtr maker = LabelMakerFactory::Instance().Create(node->GetType(), compute_graph_, node); LabelMakerPtr maker = LabelMakerFactory::Instance().Create(node->GetType(), compute_graph_, node);
if (maker == nullptr) { if (maker == nullptr) {
REPORT_CALL_ERROR("E19999", "Check Node:%s(%s) label maker not registed",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(INTERNAL_ERROR, "Node: %s label maker not registed.", node->GetType().c_str()); GELOGE(INTERNAL_ERROR, "Node: %s label maker not registed.", node->GetType().c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }


if (maker->Run(label_index) != SUCCESS) { if (maker->Run(label_index) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Node:%s(%s) run label maker failed",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(INTERNAL_ERROR, "Node: %s run label maker failed.", node->GetType().c_str()); GELOGE(INTERNAL_ERROR, "Node: %s run label maker failed.", node->GetType().c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -63,6 +68,7 @@ Status LabelAllocator::AssignFunctionalLabels() {


bool LabelAllocator::CollectFunctionalNode(ComputeGraphPtr &graph, std::set<NodePtr> &functional_nodes) { bool LabelAllocator::CollectFunctionalNode(ComputeGraphPtr &graph, std::set<NodePtr> &functional_nodes) {
if (graph == nullptr) { if (graph == nullptr) {
REPORT_INNER_ERROR("E19999", "check param compute_graph nullptr");
GELOGE(INTERNAL_ERROR, "Sub ComputeGraph is null."); GELOGE(INTERNAL_ERROR, "Sub ComputeGraph is null.");
return false; return false;
} }
@@ -74,12 +80,16 @@ bool LabelAllocator::CollectFunctionalNode(ComputeGraphPtr &graph, std::set<Node


NodePtr func_node = graph->GetParentNode(); NodePtr func_node = graph->GetParentNode();
if (func_node == nullptr) { if (func_node == nullptr) {
REPORT_INNER_ERROR("E19999", "Parent node not set in node:%s(%s), graph:%s",
func_node->GetName().c_str(), func_node->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Parent functional node not set: %s.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Parent functional node not set: %s.", graph->GetName().c_str());
return false; return false;
} }


ComputeGraphPtr owner_graph = func_node->GetOwnerComputeGraph(); ComputeGraphPtr owner_graph = func_node->GetOwnerComputeGraph();
if (owner_graph == nullptr) { if (owner_graph == nullptr) {
REPORT_INNER_ERROR("E19999", "ComputeGraph owner not set in node:%s(%s), graph:%s",
func_node->GetName().c_str(), func_node->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "ComputeGraph owner not set: %s.", func_node->GetName().c_str()); GELOGE(INTERNAL_ERROR, "ComputeGraph owner not set: %s.", func_node->GetName().c_str());
return false; return false;
} }


+ 108
- 45
ge/graph/build/logical_stream_allocator.cc View File

@@ -33,13 +33,21 @@ using std::queue;
namespace ge { namespace ge {
LogicalStreamPass::LogicalStreamPass(const string &name) : name_(name) {} LogicalStreamPass::LogicalStreamPass(const string &name) : name_(name) {}


const string &LogicalStreamPass::GetName() const { return name_; }
const string &LogicalStreamPass::GetName() const {
return name_;
}


bool LogicalStreamPass::IsEngineSkip(const Subgraph &subgraph) const { return subgraph.engine_conf.skip_assign_stream; }
bool LogicalStreamPass::IsEngineSkip(const Subgraph &subgraph) const {
return subgraph.engine_conf.skip_assign_stream;
}


bool LogicalStreamPass::IsEngineAttach(const Subgraph &subgraph) const { return subgraph.engine_conf.attach; }
bool LogicalStreamPass::IsEngineAttach(const Subgraph &subgraph) const {
return subgraph.engine_conf.attach;
}


bool LogicalStreamPass::IsEngineIndependent(const Subgraph &subgraph) const { return subgraph.engine_conf.independent; }
bool LogicalStreamPass::IsEngineIndependent(const Subgraph &subgraph) const {
return subgraph.engine_conf.independent;
}


bool LogicalStreamPass::HasStreamLabel(const Subgraph &subgraph) const { bool LogicalStreamPass::HasStreamLabel(const Subgraph &subgraph) const {
return !subgraph.subgraph_info.GetStreamLabel().empty(); return !subgraph.subgraph_info.GetStreamLabel().empty();
@@ -60,14 +68,14 @@ Status AssignByLabelPass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr> &
// Subgraphs of the same stream_label are assigned to the same stream, // Subgraphs of the same stream_label are assigned to the same stream,
// and different stream_labels are assigned new streams. // and different stream_labels are assigned new streams.
auto iter = label_streams.find(stream_label); auto iter = label_streams.find(stream_label);
if (iter != label_streams.end()) {
subgraph->stream_id = iter->second;
} else {
if (iter == label_streams.end()) {
subgraph->stream_id = next_stream; subgraph->stream_id = next_stream;
GELOGI("Assign new stream %ld for label %s.", next_stream, stream_label.c_str());
GELOGI("[Assign][NewStreamId] %ld for label %s.", next_stream, stream_label.c_str());


label_streams.emplace(stream_label, next_stream); label_streams.emplace(stream_label, next_stream);
++next_stream;
next_stream++;
} else {
subgraph->stream_id = iter->second;
} }
changed = true; changed = true;
} }
@@ -92,15 +100,15 @@ Status IndependentStreamPass::Run(ComputeGraphPtr graph, const vector<SubgraphPt
const string &stream_label = subgraph->subgraph_info.GetStreamLabel(); const string &stream_label = subgraph->subgraph_info.GetStreamLabel();
auto &label_streams = engine_streams[engine]; auto &label_streams = engine_streams[engine];
auto iter = label_streams.find(stream_label); auto iter = label_streams.find(stream_label);
if (iter != label_streams.end()) {
subgraph->stream_id = iter->second;
} else {
if (iter == label_streams.end()) {
subgraph->stream_id = next_stream; subgraph->stream_id = next_stream;
GELOGI("Assign new independent stream %ld for engine %s (label: %s).", next_stream, engine.c_str(),
GELOGI("[Assign][NewStreamId:independent] %ld for engine %s (label: %s).", next_stream, engine.c_str(),
stream_label.c_str()); stream_label.c_str());


label_streams.emplace(stream_label, next_stream); label_streams.emplace(stream_label, next_stream);
++next_stream;
next_stream++;
} else {
subgraph->stream_id = iter->second;
} }
changed = true; changed = true;
} }
@@ -121,14 +129,16 @@ Status AssignByDependencyPass::Run(ComputeGraphPtr graph, const vector<SubgraphP
} }


SubgraphPtr reusable_subgraph = GetReusableSubgraph(subgraph, end_subgraph_map, pld_subgraph_map); SubgraphPtr reusable_subgraph = GetReusableSubgraph(subgraph, end_subgraph_map, pld_subgraph_map);
if (reusable_subgraph != nullptr) {
if (reusable_subgraph == nullptr) {
(void)AssignNewStream(subgraph);
} else {
if (HasAssignedStream(*reusable_subgraph)) { if (HasAssignedStream(*reusable_subgraph)) {
subgraph->stream_id = reusable_subgraph->stream_id; subgraph->stream_id = reusable_subgraph->stream_id;
} else { } else {
int64_t stream_id = AssignNewStream(reusable_subgraph); int64_t stream_id = AssignNewStream(reusable_subgraph);
subgraph->stream_id = stream_id; subgraph->stream_id = stream_id;
GELOGI("Reusable subgraph %s has not been assigned a stream, now assign new stream %ld.",
reusable_subgraph->name.c_str(), stream_id);
GELOGI("[Assign][NewStreamId] %ld for Reusable subgraph %s cause has not been assigned before.",
stream_id, reusable_subgraph->name.c_str());
} }


if (reusable_subgraph->reused_subgraph != nullptr) { if (reusable_subgraph->reused_subgraph != nullptr) {
@@ -137,11 +147,10 @@ Status AssignByDependencyPass::Run(ComputeGraphPtr graph, const vector<SubgraphP


subgraph->reused_subgraph = reusable_subgraph; subgraph->reused_subgraph = reusable_subgraph;
reused_subgraphs_.emplace_back(subgraph, reusable_subgraph); reused_subgraphs_.emplace_back(subgraph, reusable_subgraph);
GELOGI("Subgraph %s of engine %s reuses stream of subgraph %s of engine %s.", subgraph->name.c_str(),
GELOGI("[Reuse][Stream]Subgraph %s of engine %s reuses stream of subgraph %s of engine %s.",
subgraph->name.c_str(),
subgraph->engine_conf.id.c_str(), reusable_subgraph->name.c_str(), subgraph->engine_conf.id.c_str(), reusable_subgraph->name.c_str(),
reusable_subgraph->engine_conf.id.c_str()); reusable_subgraph->engine_conf.id.c_str());
} else {
(void)AssignNewStream(subgraph);
} }
changed = true; changed = true;
} }
@@ -191,13 +200,15 @@ bool AssignByDependencyPass::CouldReuse(const SubgraphPtr &subgraph, const Subgr
auto iter = pld_subgraph_map.find(end_pld_pair.second); auto iter = pld_subgraph_map.find(end_pld_pair.second);
if (iter != pld_subgraph_map.end()) { if (iter != pld_subgraph_map.end()) {
const SubgraphPtr &pred_subgraph_succ = iter->second; const SubgraphPtr &pred_subgraph_succ = iter->second;
if (pred_subgraph_succ != subgraph && pred_subgraph_succ->engine_conf.id == pred_subgraph->engine_conf.id) {
if ((pred_subgraph_succ != subgraph) &&
(pred_subgraph_succ->engine_conf.id == pred_subgraph->engine_conf.id)) {
return false; return false;
} }
} }
} }


if ((subgraph->engine_conf.id == pred_subgraph->engine_conf.id) || IsEngineAttach(*subgraph)) {
if ((subgraph->engine_conf.id == pred_subgraph->engine_conf.id) ||
IsEngineAttach(*subgraph)) {
return true; return true;
} }


@@ -249,7 +260,7 @@ int64_t AssignByDependencyPass::AssignNewStream(SubgraphPtr subgraph) {
engine_stream_num_[engine_name] = stream_id + 1; engine_stream_num_[engine_name] = stream_id + 1;
} }


GELOGI("Subgraph %s assigns new temp stream %ld (engine: %s).", subgraph->name.c_str(), stream_id,
GELOGI("[Assign][NewStreamId:temp]id:%ld for Subgraph %s (engine: %s).", stream_id, subgraph->name.c_str(),
engine_name.c_str()); engine_name.c_str());


return stream_id; return stream_id;
@@ -282,7 +293,7 @@ void AssignByDependencyPass::UpdateAssignedSubgraphs(Context &context) {
GELOGI("Subgraph %s of engine %s reuses default stream %ld.", subgraph->name.c_str(), GELOGI("Subgraph %s of engine %s reuses default stream %ld.", subgraph->name.c_str(),
subgraph->engine_conf.id.c_str(), context.default_stream); subgraph->engine_conf.id.c_str(), context.default_stream);
} else { } else {
GELOGI("Stream of subgraph %s has been updated to %ld.", subgraph->name.c_str(), subgraph->stream_id);
GELOGI("[Update][StreamId]id:%ld for subgraph %s.", subgraph->stream_id, subgraph->name.c_str());
} }
} }
} }
@@ -293,7 +304,7 @@ void AssignByDependencyPass::UpdateReusedSubgraphs() {
auto &cur_subgraph = item.first; auto &cur_subgraph = item.first;
auto &reused_graph = item.second; auto &reused_graph = item.second;
cur_subgraph->stream_id = reused_graph->stream_id; cur_subgraph->stream_id = reused_graph->stream_id;
GELOGI("Stream of subgraph %s has been updated to %ld.", cur_subgraph->name.c_str(), cur_subgraph->stream_id);
GELOGI("[Update][StreamId]id:%ld for subgraph %s.", cur_subgraph->stream_id, cur_subgraph->name.c_str());
} }
} }


@@ -309,6 +320,8 @@ Status SingleStreamPass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr> &s
if (!HasAssignedStream(*subgraph)) { if (!HasAssignedStream(*subgraph)) {
const string &stream_label = subgraph->subgraph_info.GetStreamLabel(); const string &stream_label = subgraph->subgraph_info.GetStreamLabel();
if (!stream_label.empty()) { if (!stream_label.empty()) {
REPORT_INNER_ERROR("E19999", "Stream labels are not supported in SingleStream mode "
"(subgraph: %s, stream label: %s)", subgraph->name.c_str(), stream_label.c_str());
GELOGE(INTERNAL_ERROR, "Stream labels are not supported (subgraph: %s, stream label: %s).", GELOGE(INTERNAL_ERROR, "Stream labels are not supported (subgraph: %s, stream label: %s).",
subgraph->name.c_str(), stream_label.c_str()); subgraph->name.c_str(), stream_label.c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
@@ -326,11 +339,13 @@ Status NodeStreamUpdatePass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr
const string &engine_name = subgraph->engine_conf.id; const string &engine_name = subgraph->engine_conf.id;


if (!IsEngineSkip(*subgraph) && !HasAssignedStream(*subgraph)) { if (!IsEngineSkip(*subgraph) && !HasAssignedStream(*subgraph)) {
REPORT_INNER_ERROR("E19999", "Subgraph %s has not yet been assigned a stream (engine: %s)",
subgraph->name.c_str(), engine_name.c_str());
GELOGE(INTERNAL_ERROR, "Subgraph %s has not yet been assigned a stream (engine: %s).", subgraph->name.c_str(), GELOGE(INTERNAL_ERROR, "Subgraph %s has not yet been assigned a stream (engine: %s).", subgraph->name.c_str(),
engine_name.c_str()); engine_name.c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} else { } else {
GELOGI("Subgraph %s is assigned stream %ld (engine: %s).", subgraph->name.c_str(), subgraph->stream_id,
GELOGI("[Assign][StreamId] %ld for Subgraph %s (engine: %s).", subgraph->stream_id, subgraph->name.c_str(),
engine_name.c_str()); engine_name.c_str());
} }
} }
@@ -353,12 +368,12 @@ Status NodeStreamUpdatePass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr
GELOGD("Node %s of type %s in subgraph %s is assigned parent stream %ld (engine: %s).", node->GetName().c_str(), GELOGD("Node %s of type %s in subgraph %s is assigned parent stream %ld (engine: %s).", node->GetName().c_str(),
node->GetType().c_str(), subgraph->name.c_str(), context.default_stream, engine_name.c_str()); node->GetType().c_str(), subgraph->name.c_str(), context.default_stream, engine_name.c_str());
} else if (IsEngineSkip(*subgraph) && node->GetInNodes().empty()) { } else if (IsEngineSkip(*subgraph) && node->GetInNodes().empty()) {
GELOGD("Node %s of type %s in subgraph %s doesn't need to assign a stream (engine: %s).",
GELOGD("[Skip][StreamIdAssign]Node %s of type %s in subgraph %s doesn't need (engine: %s).",
node->GetName().c_str(), node->GetType().c_str(), subgraph->name.c_str(), engine_name.c_str()); node->GetName().c_str(), node->GetType().c_str(), subgraph->name.c_str(), engine_name.c_str());
} else { } else {
node->GetOpDesc()->SetStreamId(stream_id); node->GetOpDesc()->SetStreamId(stream_id);
GELOGD("Node %s of type %s in subgraph %s is assigned stream %ld (engine: %s).", node->GetName().c_str(),
node->GetType().c_str(), subgraph->name.c_str(), stream_id, engine_name.c_str());
GELOGD("[Assign][StreamId]id:%ld for Node %s of type %s in subgraph %s (engine: %s).", stream_id,
node->GetName().c_str(), node->GetType().c_str(), subgraph->name.c_str(), engine_name.c_str());
} }
} }
} }
@@ -366,6 +381,48 @@ Status NodeStreamUpdatePass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr
return SUCCESS; return SUCCESS;
} }


Status UpdateForParallelGroupPass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr> &subgraphs, Context &context) {
std::map<int, vector<OpDescPtr>> stream_op_map;
for (const SubgraphPtr &subgraph : subgraphs) {
auto compute_graph = subgraph->subgraph_info.GetSubGraph();
for (const NodePtr &node : compute_graph->GetDirectNode()) {
OpDescPtr op_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(op_desc);
if (op_desc->HasAttr(ATTR_NAME_PARALLEL_GROUP)) {
int64_t op_desc_stream_id = op_desc->GetStreamId();
stream_op_map[op_desc_stream_id].push_back(op_desc);
}
}
}
for (const auto &itr : stream_op_map) {
if (itr.first == kInvalidStream) {
continue;
}
std::map<std::string, int64_t> group_2_stream_id;
for (const auto &op_desc : itr.second) {
std::string group_name;
if (!AttrUtils::GetStr(op_desc, ATTR_NAME_PARALLEL_GROUP, group_name)) {
GELOGE(FAILED, "[GetAttr][OpDesc]Get node %s ATTR_NAME_PARALLEL_GROUP failed.", op_desc->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Get node %s ATTR_NAME_PARALLEL_GROUP failed.", op_desc->GetName().c_str());
return FAILED;
}
const auto &itr = group_2_stream_id.find(group_name);
int64_t new_stream_id = kInvalidStream;
int64_t old_stream_id = op_desc->GetStreamId();
if (itr != group_2_stream_id.end()) {
new_stream_id = itr->second;
} else {
new_stream_id = context.next_stream++;
group_2_stream_id[group_name] = new_stream_id;
}
op_desc->SetStreamId(new_stream_id);
GELOGD("Node %s assigned stream %ld from stream %ld.",
op_desc->GetName().c_str(), new_stream_id, old_stream_id);
}
}
return SUCCESS;
}

int64_t UpdateForSkippedEnginePass::GetSingleInoutStream(const NodePtr &node) const { int64_t UpdateForSkippedEnginePass::GetSingleInoutStream(const NodePtr &node) const {
set<int64_t> stream_ids; set<int64_t> stream_ids;


@@ -387,8 +444,8 @@ int64_t UpdateForSkippedEnginePass::GetSingleInoutStream(const NodePtr &node) co


if (stream_ids.size() == 1) { if (stream_ids.size() == 1) {
int64_t stream_id = *(stream_ids.begin()); int64_t stream_id = *(stream_ids.begin());
GELOGI("The stream of all input and output nodes of node %s (type: %s) is %ld.", node->GetName().c_str(),
node->GetType().c_str(), stream_id);
GELOGI("[Get][SingleStreamId]The stream of all input and output nodes of node %s (type: %s) is %ld.",
node->GetName().c_str(), node->GetType().c_str(), stream_id);
return stream_id; return stream_id;
} }


@@ -406,7 +463,7 @@ Status UpdateForSkippedEnginePass::Run(ComputeGraphPtr graph, const vector<Subgr
auto op_desc = node->GetOpDesc(); auto op_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(op_desc); GE_CHECK_NOTNULL(op_desc);
auto stream_id = op_desc->GetStreamId(); auto stream_id = op_desc->GetStreamId();
if (stream_id != kInvalidStream && !HasStreamLabel(*subgraph)) {
if ((stream_id != kInvalidStream) && !HasStreamLabel(*subgraph)) {
ops_without_label.emplace(op_desc); ops_without_label.emplace(op_desc);
} }
} }
@@ -427,8 +484,8 @@ Status UpdateForSkippedEnginePass::Run(ComputeGraphPtr graph, const vector<Subgr
int64_t inout_stream = GetSingleInoutStream(node); int64_t inout_stream = GetSingleInoutStream(node);
if (inout_stream != kInvalidStream) { if (inout_stream != kInvalidStream) {
op_desc->SetStreamId(inout_stream); op_desc->SetStreamId(inout_stream);
GELOGI("Node %s of type %s reassign to stream %ld from stream %ld.", node->GetName().c_str(),
node->GetType().c_str(), inout_stream, stream_id);
GELOGI("[Reassign][StreamId]%ld for Node %s of type %s from stream %ld.",
inout_stream, node->GetName().c_str(), node->GetType().c_str(), stream_id);
} }
} }
} }
@@ -455,7 +512,7 @@ Status AllReduceParallelPass::Run(ComputeGraphPtr graph, const vector<SubgraphPt
return NOT_CHANGED; return NOT_CHANGED;
} }


GELOGI("AllReduceParallelPass is enabled.");
GELOGI("[Run][AllReduceParallelPass] start");
GE_DUMP(graph, "BeforeAllReduceParallel"); GE_DUMP(graph, "BeforeAllReduceParallel");


// All successors of HcomAllReduce. // All successors of HcomAllReduce.
@@ -463,7 +520,7 @@ Status AllReduceParallelPass::Run(ComputeGraphPtr graph, const vector<SubgraphPt


for (const NodePtr &node : graph->GetDirectNode()) { for (const NodePtr &node : graph->GetDirectNode()) {
if (!IsHcomNode(node->GetType()) || if (!IsHcomNode(node->GetType()) ||
node->GetInDataNodes().size() <= 1) {
(node->GetInDataNodes().size() <= 1)) {
continue; continue;
} }


@@ -565,7 +622,7 @@ Status LogicalStreamAllocator::Assign(const ComputeGraphPtr &root_graph, const G
RefreshContinuousStreams(root_graph); RefreshContinuousStreams(root_graph);


stream_num = context_.next_stream; stream_num = context_.next_stream;
GELOGI("Assigned logical stream num: %ld.", stream_num);
GELOGI("[Assign][LogicalStream] At last, stream num: %ld.", stream_num);


return SUCCESS; return SUCCESS;
} }
@@ -575,7 +632,7 @@ Status LogicalStreamAllocator::DoAssign(const ComputeGraphPtr &graph, const Grap
GE_CHECK_NOTNULL(graph); GE_CHECK_NOTNULL(graph);


NodePtr parent_node = graph->GetParentNode(); NodePtr parent_node = graph->GetParentNode();
if (parent_node == nullptr || parent_node->GetOpDesc() == nullptr) {
if ((parent_node == nullptr) || (parent_node->GetOpDesc() == nullptr)) {
context_.default_stream = kInvalidStream; context_.default_stream = kInvalidStream;
} else { } else {
context_.default_stream = parent_node->GetOpDesc()->GetStreamId(); context_.default_stream = parent_node->GetOpDesc()->GetStreamId();
@@ -583,6 +640,8 @@ Status LogicalStreamAllocator::DoAssign(const ComputeGraphPtr &graph, const Grap


auto iter = subgraph_map.find(graph); auto iter = subgraph_map.find(graph);
if (iter == subgraph_map.end()) { if (iter == subgraph_map.end()) {
REPORT_INNER_ERROR("E19999", "Graph %s not found in subgraph_map when do logical stream assign ",
graph->GetName().c_str());
GELOGE(FAILED, "Graph %s not found.", graph->GetName().c_str()); GELOGE(FAILED, "Graph %s not found.", graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -597,7 +656,7 @@ Status LogicalStreamAllocator::DoAssign(const ComputeGraphPtr &graph, const Grap
return status; return status;
} }


GELOGD("Subgraphs of graph %s:", graph->GetName().c_str());
GELOGD("[Show][Subgraphs] in graph %s", graph->GetName().c_str());
for (const auto &subgraph : subgraphs) { for (const auto &subgraph : subgraphs) {
if (subgraph != nullptr) { if (subgraph != nullptr) {
GELOGD("subgraph: %s", subgraph->name.c_str()); GELOGD("subgraph: %s", subgraph->name.c_str());
@@ -622,6 +681,8 @@ Status LogicalStreamAllocator::ConvertSubgraphs(const vector<SubGraphInfoPtr> &s
const string &engine_name = subgraph_info->GetEngineName(); const string &engine_name = subgraph_info->GetEngineName();
auto engine_conf_iter = engine_confs.find(engine_name); auto engine_conf_iter = engine_confs.find(engine_name);
if ((engine_conf_iter == engine_confs.end()) || (engine_conf_iter->second == nullptr)) { if ((engine_conf_iter == engine_confs.end()) || (engine_conf_iter->second == nullptr)) {
REPORT_INNER_ERROR("E19999", "Engine conf of subgraph %s not found (engine name: %s)",
subgraph_name.c_str(), engine_name.c_str());
GELOGE(INTERNAL_ERROR, "Engine conf of subgraph %s not found (engine name: %s).", subgraph_name.c_str(), GELOGE(INTERNAL_ERROR, "Engine conf of subgraph %s not found (engine name: %s).", subgraph_name.c_str(),
engine_name.c_str()); engine_name.c_str());


@@ -655,6 +716,7 @@ Status LogicalStreamAllocator::RunPasses(const ComputeGraphPtr &graph, const vec
passes.emplace_back(MakeShared<IndependentStreamPass>()); passes.emplace_back(MakeShared<IndependentStreamPass>());
passes.emplace_back(MakeShared<AssignByDependencyPass>()); passes.emplace_back(MakeShared<AssignByDependencyPass>());
passes.emplace_back(MakeShared<NodeStreamUpdatePass>()); passes.emplace_back(MakeShared<NodeStreamUpdatePass>());
passes.emplace_back(MakeShared<UpdateForParallelGroupPass>());
passes.emplace_back(MakeShared<AllReduceParallelPass>()); passes.emplace_back(MakeShared<AllReduceParallelPass>());
passes.emplace_back(MakeShared<UpdateForSkippedEnginePass>()); passes.emplace_back(MakeShared<UpdateForSkippedEnginePass>());
} }
@@ -664,10 +726,11 @@ Status LogicalStreamAllocator::RunPasses(const ComputeGraphPtr &graph, const vec


Status status = pass->Run(graph, subgraphs, context_); Status status = pass->Run(graph, subgraphs, context_);
if (status == SUCCESS) { if (status == SUCCESS) {
GELOGD("Stream pass %s return SUCCESS.", pass->GetName().c_str());
GELOGD("[Show][Status]Stream pass %s return SUCCESS.", pass->GetName().c_str());
} else if (status == NOT_CHANGED) { } else if (status == NOT_CHANGED) {
GELOGD("Stream pass %s return NOT_CHANGED.", pass->GetName().c_str());
GELOGD("[Show][Status]Stream pass %s return NOT_CHANGED.", pass->GetName().c_str());
} else { } else {
REPORT_CALL_ERROR("E19999", "Stream pass %s run failed.", pass->GetName().c_str());
GELOGE(status, "Stream pass %s failed.", pass->GetName().c_str()); GELOGE(status, "Stream pass %s failed.", pass->GetName().c_str());
return status; return status;
} }
@@ -686,7 +749,7 @@ void LogicalStreamAllocator::RefreshContinuousStreams(const ComputeGraphPtr &gra
auto op_desc = node->GetOpDesc(); auto op_desc = node->GetOpDesc();
if (op_desc != nullptr) { if (op_desc != nullptr) {
int64_t stream_id = op_desc->GetStreamId(); int64_t stream_id = op_desc->GetStreamId();
if (stream_id != kInvalidStream && stream_id < stream_num) {
if ((stream_id != kInvalidStream) && (stream_id < stream_num)) {
stream_has_node[stream_id] = true; stream_has_node[stream_id] = true;
} }
} }
@@ -695,10 +758,10 @@ void LogicalStreamAllocator::RefreshContinuousStreams(const ComputeGraphPtr &gra


context_.next_stream = 0; context_.next_stream = 0;
vector<int64_t> old_to_new_streams(stream_num, kInvalidStream); vector<int64_t> old_to_new_streams(stream_num, kInvalidStream);
for (size_t old_stream = 0; old_stream < stream_has_node.size(); ++old_stream) {
for (size_t old_stream = 0; old_stream < stream_has_node.size(); old_stream++) {
if (stream_has_node[old_stream]) { if (stream_has_node[old_stream]) {
old_to_new_streams[old_stream] = context_.next_stream; old_to_new_streams[old_stream] = context_.next_stream;
++context_.next_stream;
context_.next_stream++;
} }
} }


@@ -706,7 +769,7 @@ void LogicalStreamAllocator::RefreshContinuousStreams(const ComputeGraphPtr &gra
auto op_desc = node->GetOpDesc(); auto op_desc = node->GetOpDesc();
if (op_desc != nullptr) { if (op_desc != nullptr) {
int64_t stream_id = op_desc->GetStreamId(); int64_t stream_id = op_desc->GetStreamId();
if (stream_id != kInvalidStream && stream_id < stream_num) {
if ((stream_id != kInvalidStream) && (stream_id < stream_num)) {
op_desc->SetStreamId(old_to_new_streams[stream_id]); op_desc->SetStreamId(old_to_new_streams[stream_id]);
} }
} }


+ 7
- 0
ge/graph/build/logical_stream_allocator.h View File

@@ -149,6 +149,13 @@ class NodeStreamUpdatePass : public LogicalStreamPass {
Status Run(ComputeGraphPtr graph, const std::vector<SubgraphPtr> &subgraphs, Context &context) override; Status Run(ComputeGraphPtr graph, const std::vector<SubgraphPtr> &subgraphs, Context &context) override;
}; };


// assign stream by parallel group
class UpdateForParallelGroupPass : public LogicalStreamPass {
public:
STREAM_PASS_DEFAULT_FUNC(UpdateForParallelGroupPass);
Status Run(ComputeGraphPtr graph, const std::vector<SubgraphPtr> &subgraphs, Context &context) override;
};

// Update the stream of subgraphs to nodes. // Update the stream of subgraphs to nodes.
class UpdateForSkippedEnginePass : public LogicalStreamPass { class UpdateForSkippedEnginePass : public LogicalStreamPass {
public: public:


+ 12
- 3
ge/graph/build/memory/binary_block_mem_assigner.cc View File

@@ -70,7 +70,10 @@ Status BinaryBlockMemAssigner::GetMemoryRanges(vector<int64_t> &range_ceils) {
return SUCCESS; return SUCCESS;
} }
if ((all_memory_size.front() <= 0) || (log(kLogBase) == 0)) { if ((all_memory_size.front() <= 0) || (log(kLogBase) == 0)) {
GELOGE(FAILED, "Memory size:%ld is invalid.", all_memory_size.front());
GELOGE(FAILED, "[Check][MemRangeStep]first mem_range_step:%ld less than 0,invalid,"
"maybe has dynamic shape in graph", all_memory_size.front());
REPORT_INNER_ERROR("E19999", "first mem_range_step:%ld less than 0,invalid,"
"maybe has dynamic shape in graph", all_memory_size.front());
return FAILED; return FAILED;
} }
// Memory size is 512 aligned, so it is not necessary to take less than 512 // Memory size is 512 aligned, so it is not necessary to take less than 512
@@ -81,12 +84,18 @@ Status BinaryBlockMemAssigner::GetMemoryRanges(vector<int64_t> &range_ceils) {
GELOGD("Range number: %zu", range_number); GELOGD("Range number: %zu", range_number);


vector<vector<int64_t>> ranges(range_number); vector<vector<int64_t>> ranges(range_number);
GE_CHK_BOOL_EXEC((range_number != 0), return PARAM_INVALID, "range_number can't be 0.");
GE_CHK_BOOL_EXEC((range_number != 0),
REPORT_INNER_ERROR("E19999", "inner data[range_number] is 0, judge invalid");
return PARAM_INVALID,
"[Check][RangeNumber]inner data is 0, judge invalid.");
size_t range_number_limit = all_memory_size.size() / range_number; size_t range_number_limit = all_memory_size.size() / range_number;
int64_t range_ceil = min_memory_size; int64_t range_ceil = min_memory_size;
for (size_t i = 1; i <= range_number; i++) { for (size_t i = 1; i <= range_number; i++) {
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(static_cast<uint64_t>(range_ceil), kRangeCeilInterval), GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(static_cast<uint64_t>(range_ceil), kRangeCeilInterval),
GELOGE(FAILED, "Multiply result is out of range.");
GELOGE(FAILED, "[Check][MemRangeCeil]Multiply result is out of range,"
"range_ceil:%ld, interval:%u", range_ceil, kRangeCeilInterval);
REPORT_INNER_ERROR("E19999", "process mem_range_ceil,multiply result out of range,"
"range_ceil:%ld, interval:%u", range_ceil, kRangeCeilInterval);
return FAILED); return FAILED);
range_ceil *= kRangeCeilInterval; // The block size of each interval is doubled every time. range_ceil *= kRangeCeilInterval; // The block size of each interval is doubled every time.
for (auto iter = all_memory_size.begin(); iter != all_memory_size.end();) { for (auto iter = all_memory_size.begin(); iter != all_memory_size.end();) {


+ 153
- 45
ge/graph/build/memory/block_mem_assigner.cc View File

@@ -30,6 +30,7 @@
#include "graph/utils/node_utils.h" #include "graph/utils/node_utils.h"
#include "graph/utils/op_desc_utils.h" #include "graph/utils/op_desc_utils.h"
#include "graph/utils/tensor_utils.h" #include "graph/utils/tensor_utils.h"
#include "graph/utils/type_utils.h"


#include "graph/debug/ge_attr_define.h" #include "graph/debug/ge_attr_define.h"


@@ -429,17 +430,14 @@ void SetLastUsedInputMemAttr(NodePtr &node, int input_index) {
} }
auto node_op_desc = node->GetOpDesc(); auto node_op_desc = node->GetOpDesc();
if (node_op_desc != nullptr) { if (node_op_desc != nullptr) {
auto input_desc = node_op_desc->GetInputDesc(input_index);
if (!ge::AttrUtils::SetInt(input_desc, ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE, true)) {
auto input_desc = node_op_desc->MutableInputDesc(input_index);
if (!ge::AttrUtils::SetInt(*input_desc, ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE, true)) {
GELOGW("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true failed.", node_op_desc->GetName().c_str(), GELOGW("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true failed.", node_op_desc->GetName().c_str(),
input_index); input_index);
return; return;
} }
GELOGD("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true success.", node_op_desc->GetName().c_str(), GELOGD("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true success.", node_op_desc->GetName().c_str(),
input_index); input_index);
if (node_op_desc->UpdateInputDesc(input_index, input_desc) != GRAPH_SUCCESS) {
GELOGW("Update %s input[%d] desc failed.", node_op_desc->GetName().c_str(), input_index);
}
} }
} }


@@ -457,7 +455,16 @@ Status GetNoAlignSize(const ge::OpDesc &desc, uint32_t index, size_t &size) {
DataType data_type = output_op_desc->GetDataType(); DataType data_type = output_op_desc->GetDataType();
graphStatus graph_status = TensorUtils::CalcTensorMemSize(shape, format, data_type, tensor_size); graphStatus graph_status = TensorUtils::CalcTensorMemSize(shape, format, data_type, tensor_size);
if (graph_status != GRAPH_SUCCESS) { if (graph_status != GRAPH_SUCCESS) {
GELOGE(graph_status, "CalcTensorMemSize failed!");
GELOGE(graph_status, "[Calculate][TensorSize]shape:%s, format:%s, data_type:%s, op:%s, out_index:%u",
shape.ToString().c_str(),
TypeUtils::FormatToSerialString(format).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str(),
desc.GetName().c_str(), index);
REPORT_CALL_ERROR("E19999", "CalcTensorMemSize fail, shape:%s, format:%s, data_type:%s, op:%s, out_index:%u",
shape.ToString().c_str(),
TypeUtils::FormatToSerialString(format).c_str(),
TypeUtils::DataTypeToSerialString(data_type).c_str(),
desc.GetName().c_str(), index);
return FAILED; return FAILED;
} }
size = static_cast<size_t>(tensor_size); size = static_cast<size_t>(tensor_size);
@@ -498,7 +505,7 @@ BlockMemAssigner::BlockMemAssigner(ComputeGraphPtr compute_graph, const map<stri
symbol_to_anchors_(symbol_to_anchors), anchor_to_symbol_(anchor_to_symbol), life_time_(0) {} symbol_to_anchors_(symbol_to_anchors), anchor_to_symbol_(anchor_to_symbol), life_time_(0) {}


BlockMemAssigner::~BlockMemAssigner() { BlockMemAssigner::~BlockMemAssigner() {
GELOGD("blocks_store_ size : %lu", blocks_store_.size());
GELOGD("[Destruct][BlockMemAssigner]blocks_store_ size : %lu", blocks_store_.size());
for (MemoryBlock *memory_block : blocks_store_) { for (MemoryBlock *memory_block : blocks_store_) {
GE_DELETE_NEW_SINGLE(memory_block); GE_DELETE_NEW_SINGLE(memory_block);
} }
@@ -583,11 +590,16 @@ void BlockMemAssigner::GetOutAndWorkSpaceMem(vector<int64_t> &all_memory_size) {
} }


for (auto &out_anchor : n->GetAllOutDataAnchors()) { for (auto &out_anchor : n->GetAllOutDataAnchors()) {
GeTensorDesc output_desc = node_op_desc->GetOutputDesc(out_anchor->GetIdx());
auto output_desc = node_op_desc->GetOutputDescPtr(out_anchor->GetIdx());
int64_t size = 0; int64_t size = 0;
GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(output_desc, size) != SUCCESS, GELOGI("Get size failed"));
GE_IF_BOOL_EXEC(size < 0, GELOGE(FAILED, "Node:%s size:%ld is invalid, maybe it is unknown shape node.",
node_op_desc->GetName().c_str(), size);
GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(*output_desc, size) != SUCCESS, GELOGI("Get size failed"));
GE_IF_BOOL_EXEC(size < 0,
GELOGE(FAILED, "[Check][TensorSize]tensor_size:%ld is invalid, "
"maybe it is unknown shape node, Node_name:%s",
size, node_op_desc->GetName().c_str());
REPORT_INNER_ERROR("E19999", "tensor_size:%ld is invalid, "
"maybe it is unknown shape node, Node_name:%s",
size, node_op_desc->GetName().c_str());
return;); return;);
batch_all_memory_size[batch_label].emplace_back(size); batch_all_memory_size[batch_label].emplace_back(size);
if (batch_total_size.find(batch_label) == batch_total_size.end()) { if (batch_total_size.find(batch_label) == batch_total_size.end()) {
@@ -678,22 +690,34 @@ bool BlockMemAssigner::IsOutNodeSetContinuousInput(const NodePtr &n, uint32_t ou
if (static_cast<size_t>(out_index) < n->GetAllOutDataAnchors().size()) { if (static_cast<size_t>(out_index) < n->GetAllOutDataAnchors().size()) {
auto out_anchor = n->GetOutDataAnchor(out_index); auto out_anchor = n->GetOutDataAnchor(out_index);
GE_IF_BOOL_EXEC(out_anchor == nullptr, GE_IF_BOOL_EXEC(out_anchor == nullptr,
GELOGE(FAILED, "Node[%s] output[%u] anchor is null.", n->GetName().c_str(), out_index);
GELOGE(FAILED, "[Check][Anchor]Node[%s] output[%u] anchor is null.",
n->GetName().c_str(), out_index);
REPORT_INNER_ERROR("E19999", "output anchor is null, node_name: %s output_index: %u.",
n->GetName().c_str(), out_index);
return false;); return false;);
for (auto const &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) { for (auto const &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) {
GE_IF_BOOL_EXEC(peer_in_anchor == nullptr, GE_IF_BOOL_EXEC(peer_in_anchor == nullptr,
GELOGE(FAILED, "Node[%s] output[%u] peer_in_anchor 0 is null.", n->GetName().c_str(), out_index);
GELOGE(FAILED, "[Check][Anchor]Node[%s] output[%u] peer_in_anchor 0 is null.",
n->GetName().c_str(), out_index);
REPORT_INNER_ERROR("E19999", "output anchor peer is null, node_name: %s output_index: %u.",
n->GetName().c_str(), out_index);
return false;); return false;);
auto peer_node = peer_in_anchor->GetOwnerNode(); auto peer_node = peer_in_anchor->GetOwnerNode();
GE_IF_BOOL_EXEC(peer_node == nullptr, GE_IF_BOOL_EXEC(peer_node == nullptr,
GELOGE(FAILED, "Node[%s] output[%u] node is null.", n->GetName().c_str(), out_index);
GELOGE(FAILED, "[Check][Node]Node[%s] output[%u] peer node is null.",
n->GetName().c_str(), out_index);
REPORT_INNER_ERROR("E19999", "output anchor peer node is null, node_name: %s output_index: %u.",
n->GetName().c_str(), out_index);
return false;); return false;);


// Get the continuous input type of the node, default is false // Get the continuous input type of the node, default is false
bool is_input_continuous = false; bool is_input_continuous = false;
auto peer_in_node_desc = peer_node->GetOpDesc(); auto peer_in_node_desc = peer_node->GetOpDesc();
GE_IF_BOOL_EXEC(peer_in_node_desc == nullptr, GE_IF_BOOL_EXEC(peer_in_node_desc == nullptr,
GELOGE(FAILED, "Node[%s] output[%u] nodedesc is null.", n->GetName().c_str(), out_index);
GELOGE(FAILED, "[Check][OpDesc]Node[%s] output[%u] nodedesc is null.",
n->GetName().c_str(), out_index);
REPORT_INNER_ERROR("E19999", "output anchor peer op_desc is null, node_name:%s output_index:%u.",
n->GetName().c_str(), out_index);
return false;); return false;);


// If GetBool fail, is_input_continuous is false. // If GetBool fail, is_input_continuous is false.
@@ -793,7 +817,10 @@ bool BlockMemAssigner::IsContinuousMemoryReuse(const NodePtr &n, const NodePtr &
if ((in_anchor == nullptr) || (in_anchor->GetPeerOutAnchor() == nullptr) || if ((in_anchor == nullptr) || (in_anchor->GetPeerOutAnchor() == nullptr) ||
(in_anchor->GetPeerOutAnchor()->GetOwnerNode() == nullptr) || (in_anchor->GetPeerOutAnchor()->GetOwnerNode() == nullptr) ||
(in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc() == nullptr)) { (in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc() == nullptr)) {
GELOGE(FAILED, "Node[%s] output[%u] peer input node desc is null.", n->GetName().c_str(), out_index);
GELOGE(FAILED, "[Check][OpDesc]Node[%s] output[%u] peer input node desc is null.",
n->GetName().c_str(), out_index);
REPORT_INNER_ERROR("E19999", "get output anchor peer op_desc fail, node_name: %s output_index: %u.",
n->GetName().c_str(), out_index);
return false; return false;
} }
auto peer_out_node_desc = in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc(); auto peer_out_node_desc = in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc();
@@ -1077,7 +1104,10 @@ MemoryBlock *BlockMemAssigner::ApplyMemory(size_t block_size, size_t real_size,
OpMemoryType mem_type, const NodePtr &n, uint32_t out_index, OpMemoryType mem_type, const NodePtr &n, uint32_t out_index,
const vector<bool> &workspace_reuse_flag, const bool is_op_reuse_mem, const vector<bool> &workspace_reuse_flag, const bool is_op_reuse_mem,
const bool continuous, int64_t memory_type) { const bool continuous, int64_t memory_type) {
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(n == nullptr, return nullptr, "Input parameter n is null.");
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
n == nullptr,
REPORT_INNER_ERROR("E19999", "Input parameter n(type:node_ptr) is null, apply memory failed");
return nullptr, "[Check][Param]Input parameter n(type:node_ptr) is null.");
auto node_op_desc = n->GetOpDesc(); auto node_op_desc = n->GetOpDesc();
GE_IF_BOOL_EXEC(node_op_desc == nullptr, return nullptr); GE_IF_BOOL_EXEC(node_op_desc == nullptr, return nullptr);
std::string batch_label; std::string batch_label;
@@ -1129,7 +1159,12 @@ MemoryBlock *BlockMemAssigner::ApplyMemory(size_t block_size, size_t real_size,
} }


auto block = new (std::nothrow) MemoryBlock(block_size, node_op_desc->GetStreamId(), is_reuse_memory, memory_type); auto block = new (std::nothrow) MemoryBlock(block_size, node_op_desc->GetStreamId(), is_reuse_memory, memory_type);
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(block == nullptr, return nullptr, "new an object failed.");
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
block == nullptr,
REPORT_INNER_ERROR("E19999", "new a memoryblock object failed. node_name:%s out_index:%u",
n->GetName().c_str(), out_index);
return nullptr,
"[New][Object]new MemoryBlock failed, node_name:%s out_index:%u", n->GetName().c_str(), out_index);


// Data and netoutput need zero copy block // Data and netoutput need zero copy block
block->is_zero_copy_ = IsZeroCopyBlock(n, continuous); block->is_zero_copy_ = IsZeroCopyBlock(n, continuous);
@@ -1188,9 +1223,15 @@ void BlockMemAssigner::ContinuousOutRefCheck(bool &isAllOutputRef, bool &isOutpu


Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<int64_t> &ranges, Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<int64_t> &ranges,
const bool is_op_reuse_mem) { const bool is_op_reuse_mem) {
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(n == nullptr, return INTERNAL_ERROR, "input node is null.");
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
n == nullptr,
REPORT_INNER_ERROR("E19999", "Input parameter n(type:node_ptr) is null");
return INTERNAL_ERROR, "[check][param]Input parameter n(type:NodePtr) is null.");
auto node_op_desc = n->GetOpDesc(); auto node_op_desc = n->GetOpDesc();
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(node_op_desc == nullptr, return INTERNAL_ERROR, "node_op_desc is null.");
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
node_op_desc == nullptr,
REPORT_INNER_ERROR("E19999", "Input parameter n(type:OpDescPtr) is null");
return INTERNAL_ERROR, "[Check][Param]Input parameter n(type:OpDescPtr) is null");


// continuous output support ref only when all output ref input // continuous output support ref only when all output ref input
bool isAllOutputRef = true; bool isAllOutputRef = true;
@@ -1204,7 +1245,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in
} }


if (!isAllOutputRef && isOutputHasRef) { if (!isAllOutputRef && isOutputHasRef) {
GELOGE(INTERNAL_ERROR, "continuous output node ref part input, not support this situation, node_name:%s",
REPORT_INNER_ERROR("E19999", "continuous output node ref part input, not support now. node_name:%s",
n->GetName().c_str());
GELOGE(INTERNAL_ERROR, "[Check][OutRefStatus]continuous output node ref part input, not support, node_name:%s",
n->GetName().c_str()); n->GetName().c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -1215,7 +1258,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in
for (uint32_t index = 0; index < static_cast<uint32_t>(node_op_desc->GetOutputsSize()); index++) { for (uint32_t index = 0; index < static_cast<uint32_t>(node_op_desc->GetOutputsSize()); index++) {
auto output_op_desc = node_op_desc->GetOutputDescPtr(index); auto output_op_desc = node_op_desc->GetOutputDescPtr(index);
if (output_op_desc == nullptr) { if (output_op_desc == nullptr) {
GELOGE(INTERNAL_ERROR, "Get output desc failed, node_name:%s, output_index:%u", n->GetName().c_str(), index);
REPORT_INNER_ERROR("E19999", "get output_desc failed, node_name:%s, output_index:%u",
n->GetName().c_str(), index);
GELOGE(INTERNAL_ERROR, "[Get][OutputDesc]node_name:%s, output_index:%u", n->GetName().c_str(), index);
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }


@@ -1226,7 +1271,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in


int64_t size = 0; int64_t size = 0;
if (ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS) { if (ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS) {
GELOGE(INTERNAL_ERROR, "Get size failed, node_name:%s, output_index:%u", n->GetName().c_str(), index);
REPORT_CALL_ERROR("E19999", "get tensor_size failed, node_name:%s, output_index:%u",
n->GetName().c_str(), index);
GELOGE(INTERNAL_ERROR, "[Get][TensorSize]node_name:%s, output_index:%u", n->GetName().c_str(), index);
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
size_t align_size = static_cast<size_t>(size); size_t align_size = static_cast<size_t>(size);
@@ -1266,7 +1313,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in
block->last_continuous_block_ = true; block->last_continuous_block_ = true;
++(block->ref_count_); ++(block->ref_count_);
} else { } else {
GELOGE(INTERNAL_ERROR, "node apply continuous output memory failed. node_name:%s", n->GetName().c_str());
REPORT_CALL_ERROR("E19999", "apply continuousMemory failed, node_name:%s, total_size:%ld",
n->GetName().c_str(), total_size);
GELOGE(INTERNAL_ERROR, "[Apply][ContinuousMemory]node_name:%s, total_size:%ld", n->GetName().c_str(), total_size);
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
return SUCCESS; return SUCCESS;
@@ -1274,25 +1323,44 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in


MemoryBlock *BlockMemAssigner::ApplyOutMemory(const NodePtr &n, uint32_t index, const vector<int64_t> &ranges, MemoryBlock *BlockMemAssigner::ApplyOutMemory(const NodePtr &n, uint32_t index, const vector<int64_t> &ranges,
const bool is_op_reuse_mem, const bool continuous) { const bool is_op_reuse_mem, const bool continuous) {
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(n == nullptr, return nullptr, "input node is null.");
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
n == nullptr,
REPORT_INNER_ERROR("E19999", "Input parameter n(type:NodePtr) is null");
return nullptr, "[Check][Param]Input parameter n(type:NodePtr) is null");
auto node_op_desc = n->GetOpDesc(); auto node_op_desc = n->GetOpDesc();
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(node_op_desc == nullptr, return nullptr, "node_op_desc is null.");
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
node_op_desc == nullptr,
REPORT_INNER_ERROR("E19999", "Input parameter n(type:OpDescPtr) is null");
return nullptr, "[Check][Param]Input parameter n(type:OpDescPtr) is null");
MemoryBlock *block = nullptr; MemoryBlock *block = nullptr;
NodeIndexIO node_index_io(n, index, kOut); NodeIndexIO node_index_io(n, index, kOut);
int64_t size = 0; int64_t size = 0;
auto output_op_desc = node_op_desc->GetOutputDescPtr(index); auto output_op_desc = node_op_desc->GetOutputDescPtr(index);
GE_IF_BOOL_EXEC(output_op_desc == nullptr, return nullptr);
GE_IF_BOOL_EXEC(
output_op_desc == nullptr,
REPORT_INNER_ERROR("E19999", "get output_desc failed, node_name:%s, output_index:%u",
n->GetName().c_str(), index);
GELOGE(FAILED, "[Get][OutputDesc]node_name:%s, output_index:%u", n->GetName().c_str(), index);
return nullptr);
GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS, GELOGI("Get size failed")); GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS, GELOGI("Get size failed"));
size_t no_align_size = 0; size_t no_align_size = 0;
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(GetNoAlignSize(*node_op_desc, index, no_align_size) != SUCCESS,
return nullptr, "Get no align size failed");
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
GetNoAlignSize(*node_op_desc, index, no_align_size) != SUCCESS,
REPORT_CALL_ERROR("E19999", "Get no align size failed, node_name:%s, output_index:%u",
n->GetName().c_str(), index);
return nullptr,
"[Get][TensorSize]Get no align size, node_name:%s, output_index:%u", n->GetName().c_str(), index);


std::string symbol; std::string symbol;
bool reuse_input = false; bool reuse_input = false;
if (IsSymbolExist(node_index_io, symbol)) { if (IsSymbolExist(node_index_io, symbol)) {
block = symbol_blocks_[symbol]; block = symbol_blocks_[symbol];
GE_IF_BOOL_EXEC(block == nullptr, GELOGE(FAILED, "Node %s ref block is nullptr.", node_op_desc->GetName().c_str());
return nullptr);
GE_IF_BOOL_EXEC(block == nullptr,
REPORT_INNER_ERROR("E19999", "get ref block failed, node_name:%s, symbol:%s",
node_op_desc->GetName().c_str(), node_index_io.ToString().c_str());
GELOGE(FAILED, "[Get][RefBlock]node_name:%s, symbol:%s",
node_op_desc->GetName().c_str(), node_index_io.ToString().c_str());
return nullptr);
// reduce old size // reduce old size
size_t align_size = block->Size(); size_t align_size = block->Size();
AlignMemOffset(align_size); AlignMemOffset(align_size);
@@ -1335,12 +1403,28 @@ MemoryBlock *BlockMemAssigner::ApplyOutMemory(const NodePtr &n, uint32_t index,
vector<bool> workspace_reuse_flag; vector<bool> workspace_reuse_flag;
block = ApplyMemory(block_size, size, no_align_size, kOutput, n, index, block = ApplyMemory(block_size, size, no_align_size, kOutput, n, index,
workspace_reuse_flag, is_op_reuse_mem, continuous, memory_type); workspace_reuse_flag, is_op_reuse_mem, continuous, memory_type);
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(
block == nullptr,
REPORT_CALL_ERROR("E19999", "apply out Memory failed, node_name:%s, block_size:%ld, out_index:%u",
n->GetName().c_str(), block_size, index);
return nullptr,
"[Apply][Memory]node_name:%s, block_size:%ld, out_index:%u",
n->GetName().c_str(), block_size, index);
} }
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(block == nullptr, return nullptr, "Block is nullptr.");
int out_count = 0; int out_count = 0;
GE_IF_BOOL_EXEC(index >= n->GetAllOutDataAnchors().size(), GELOGE(FAILED, "index is out of range."); return nullptr);
GE_IF_BOOL_EXEC(
index >= n->GetAllOutDataAnchors().size(),
REPORT_INNER_ERROR("E19999", "out index:%u exceed out_size:%lu, node_name:%s",
index, n->GetAllOutDataAnchors().size(), n->GetName().c_str());
GELOGE(FAILED, "[Check][OutIndex]index:%u exceed out_size:%lu, node_name:%s",
index, n->GetAllOutDataAnchors().size(), n->GetName().c_str());
return nullptr);
auto out_data_anchor = n->GetOutDataAnchor(index); auto out_data_anchor = n->GetOutDataAnchor(index);
GE_IF_BOOL_EXEC(out_data_anchor == nullptr, GELOGE(FAILED, "Out data anchor is nullptr."); return nullptr);
GE_IF_BOOL_EXEC(
out_data_anchor == nullptr,
REPORT_INNER_ERROR("E19999", "out anchor is null, index:%u, node_name:%s", index, n->GetName().c_str());
GELOGE(FAILED, "[Check][OutAnchor]is null, index:%u, node_name:%s", index, n->GetName().c_str());
return nullptr);
for (const auto &in_anchor : out_data_anchor->GetPeerInDataAnchors()) { for (const auto &in_anchor : out_data_anchor->GetPeerInDataAnchors()) {
auto owner_node = in_anchor->GetOwnerNode(); auto owner_node = in_anchor->GetOwnerNode();
auto op_desc = owner_node->GetOpDesc(); auto op_desc = owner_node->GetOpDesc();
@@ -1546,8 +1630,14 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector
GELOGD("Assign memory node[%s], output size[%zu], output memory type size[%zu]", op_desc->GetName().c_str(), GELOGD("Assign memory node[%s], output size[%zu], output memory type size[%zu]", op_desc->GetName().c_str(),
op_desc->GetOutputsSize(), memorys_type.size()); op_desc->GetOutputsSize(), memorys_type.size());
if (has_mem_type_attr && (memorys_type.size() != op_desc->GetOutputsSize())) { if (has_mem_type_attr && (memorys_type.size() != op_desc->GetOutputsSize())) {
GELOGE(INTERNAL_ERROR, "fusion: node[%s], output memory size err[outputsize:%zu, memorysize:%zu]",
op_desc->GetName().c_str(), op_desc->GetOutputsSize(), memorys_type.size());
REPORT_INNER_ERROR("E19999", "Attr[%s] size:%zu not equal to node output size:%zu, node_name:%s",
ATTR_NAME_OUTPUT_MEM_TYPE_LIST.c_str(), memorys_type.size(),
op_desc->GetOutputsSize(), op_desc->GetName().c_str());
GELOGE(
INTERNAL_ERROR,
"[Check][MemTypeAttr]Attr %s size:%zu not equal to node output size:%zu, node_name:%s",
ATTR_NAME_OUTPUT_MEM_TYPE_LIST.c_str(), memorys_type.size(),
op_desc->GetOutputsSize(), op_desc->GetName().c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }


@@ -1565,12 +1655,15 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector
bool is_atomic = false; bool is_atomic = false;
// If GetBool fail, is_atomic is false. // If GetBool fail, is_atomic is false.
(void)ge::AttrUtils::GetBool(op_desc, ATOMIC_ATTR_IS_ATOMIC_NODE, is_atomic); (void)ge::AttrUtils::GetBool(op_desc, ATOMIC_ATTR_IS_ATOMIC_NODE, is_atomic);
bool is_buffer_pool_mem_supported = (op_desc->HasAttr(ATTR_NAME_BUFFER_POOL_ID)) &&
(op_desc->HasAttr(ATTR_NAME_BUFFER_POOL_SIZE)) && (!root_unknown_shape_flag_);
// Allocate memory for the current node and release node memory of the same size in the workspace // Allocate memory for the current node and release node memory of the same size in the workspace
GE_IF_BOOL_EXEC(ge_disable_reuse_mem_env_ != "1", GE_IF_BOOL_EXEC(ge_disable_reuse_mem_env_ != "1",
for (auto iter = stream_workspace_blocks_.begin(); iter != stream_workspace_blocks_.end(); for (auto iter = stream_workspace_blocks_.begin(); iter != stream_workspace_blocks_.end();
++iter) { ReleaseMemorys(iter->second[stream_id], reusable_blocks_[iter->first][stream_id]); ++iter) { ReleaseMemorys(iter->second[stream_id], reusable_blocks_[iter->first][stream_id]);
iter->second[stream_id].clear();}); iter->second[stream_id].clear();});
if (IsContinuousOutput(node)) {
bool need_apply_continuous_memory = IsContinuousOutput(node) && (!is_buffer_pool_mem_supported);
if (need_apply_continuous_memory) {
return ApplyContinuousMemory(node, ranges, is_op_reuse_mem_); return ApplyContinuousMemory(node, ranges, is_op_reuse_mem_);
} }
for (uint32_t i = 0; i < static_cast<uint32_t>(op_desc->GetOutputsSize()); i++) { for (uint32_t i = 0; i < static_cast<uint32_t>(op_desc->GetOutputsSize()); i++) {
@@ -1604,7 +1697,7 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector
GE_IF_BOOL_EXEC(!no_need_assign_memory, GE_IF_BOOL_EXEC(!no_need_assign_memory,
no_need_assign_memory = IsAtomicOutputMemory(node, i, is_atomic, out_node_set_continuous_input);); no_need_assign_memory = IsAtomicOutputMemory(node, i, is_atomic, out_node_set_continuous_input););
} }
no_need_assign_memory = (no_need_assign_memory || IsKnownSubgraphData(node));
no_need_assign_memory = (no_need_assign_memory || IsKnownSubgraphData(node) || is_buffer_pool_mem_supported);
if (no_need_assign_memory) { if (no_need_assign_memory) {
zero_memory_list_.emplace_back(node, kOutput, i, false); zero_memory_list_.emplace_back(node, kOutput, i, false);
continue; continue;
@@ -1645,11 +1738,18 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector
/// ///
void BlockMemAssigner::AssignMemoryWithReuse(vector<int64_t> &ranges) { void BlockMemAssigner::AssignMemoryWithReuse(vector<int64_t> &ranges) {
(void)ge::GetContext().GetOption(OPTION_EXEC_DISABLE_REUSED_MEMORY, ge_disable_reuse_mem_env_); (void)ge::GetContext().GetOption(OPTION_EXEC_DISABLE_REUSED_MEMORY, ge_disable_reuse_mem_env_);
GELOGD("Reuse memory %s", ge_disable_reuse_mem_env_ == "1" ? "close" : "open");
GEEVENT("Reuse memory %s", ge_disable_reuse_mem_env_ == "1" ? "close" : "open");
string op_no_reuse_mem_str; string op_no_reuse_mem_str;
const char *op_no_reuse_mem = std::getenv(OP_NO_REUSE_MEM); const char *op_no_reuse_mem = std::getenv(OP_NO_REUSE_MEM);
GE_IF_BOOL_EXEC(op_no_reuse_mem != nullptr, op_no_reuse_mem_str = string(op_no_reuse_mem); GE_IF_BOOL_EXEC(op_no_reuse_mem != nullptr, op_no_reuse_mem_str = string(op_no_reuse_mem);
CheckAndGetOpReuseEnv(op_no_reuse_mem_str, op_no_reuse_mem_vec_, op_reuse_env_valid_);); CheckAndGetOpReuseEnv(op_no_reuse_mem_str, op_no_reuse_mem_vec_, op_reuse_env_valid_););
auto root_graph = GraphUtils::FindRootGraph(compute_graph_);
if (root_graph == nullptr) {
GELOGE(INTERNAL_ERROR, "[Check][RootGraph]Root graph is nullptr, graph:%s.", compute_graph_->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Root graph is nullptr, graph:%s.", compute_graph_->GetName().c_str());
return;
}
root_unknown_shape_flag_ = root_graph->GetGraphUnknownFlag();


for (NodePtr &n : compute_graph_->GetAllNodes()) { for (NodePtr &n : compute_graph_->GetAllNodes()) {
auto node_op_desc = n->GetOpDesc(); auto node_op_desc = n->GetOpDesc();
@@ -1673,8 +1773,12 @@ void BlockMemAssigner::AssignMemoryWithReuse(vector<int64_t> &ranges) {
temp.size(), tvm_workspace_memory_type.size()); temp.size(), tvm_workspace_memory_type.size());


if (has_tvm_workspace_mem_type_attr && (temp.size() != tvm_workspace_memory_type.size())) { if (has_tvm_workspace_mem_type_attr && (temp.size() != tvm_workspace_memory_type.size())) {
GELOGE(INTERNAL_ERROR, "fusion: node[%s], tvm workspace memory size error![v_temp:%zu, workspace:%zu]",
n->GetName().c_str(), temp.size(), tvm_workspace_memory_type.size());
REPORT_INNER_ERROR("E19999", "Attr[%s]size:%zu is not equal to workspace size:%zu, node_name:%s",
TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(), tvm_workspace_memory_type.size(),
temp.size(), n->GetName().c_str());
GELOGE(INTERNAL_ERROR, "[Check][Attr]Attr %s size:%zu is not equal to workspace size:%zu, node_name:%s",
TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(), tvm_workspace_memory_type.size(),
temp.size(), n->GetName().c_str());
return; return;
} }
for (size_t i = 0; i < temp.size(); i++) { for (size_t i = 0; i < temp.size(); i++) {
@@ -2031,7 +2135,7 @@ void SetBlockOpMemOffset(MemoryBlock *block, int32_t child_block_level) {


child_block_level++; child_block_level++;
for (MemoryBlock *child_block : block->ChildBlockList()) { for (MemoryBlock *child_block : block->ChildBlockList()) {
SetBlockOpMemOffset(child_block, child_block_level);
SetBlockOpMemOffset(child_block, child_block_level);
} }
} }


@@ -2059,7 +2163,7 @@ void BlockMemAssigner::SetOpMemOffset(bool is_zero_copy) {
Status BlockMemAssigner::Assign() { Status BlockMemAssigner::Assign() {
vector<int64_t> ranges; vector<int64_t> ranges;
if (GetMemoryRanges(ranges) != SUCCESS) { if (GetMemoryRanges(ranges) != SUCCESS) {
GELOGE(FAILED, "GetMemoryRanges Fail!");
GELOGE(FAILED, "[Get][MemoryRanges] Fail!");
return FAILED; return FAILED;
} }
GE_IF_BOOL_EXEC(ranges.empty(), return SUCCESS); GE_IF_BOOL_EXEC(ranges.empty(), return SUCCESS);
@@ -2083,8 +2187,12 @@ bool BlockMemAssigner::GetWorkSpaceMemoryType(const NodePtr &node, size_t index,
bool has_workspace_mem_type_attr = bool has_workspace_mem_type_attr =
ge::AttrUtils::GetListInt(op_desc, TVM_ATTR_NAME_WORKSPACE_TYPE, workspace_memory_type); ge::AttrUtils::GetListInt(op_desc, TVM_ATTR_NAME_WORKSPACE_TYPE, workspace_memory_type);
if (has_workspace_mem_type_attr && (workspace_memory_type.size() <= index)) { if (has_workspace_mem_type_attr && (workspace_memory_type.size() <= index)) {
GELOGE(INTERNAL_ERROR, "node[%s], workspace_memory size error![index:%zu, workspace:%zu]",
node->GetName().c_str(), index, workspace_memory_type.size());
REPORT_INNER_ERROR("E19999", "get workspace mem_type failed, "
"index %zu invalid, bigger than attr %s size:%zu, node_name:%s",
index, TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(),
workspace_memory_type.size(), node->GetName().c_str());
GELOGE(INTERNAL_ERROR, "[Get][WorkspaceMemType]index %zu invalid, bigger than attr %s size:%zu, node_name:%s",
index, TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(), workspace_memory_type.size(), node->GetName().c_str());
return false; return false;
} }
memory_type = has_workspace_mem_type_attr ? workspace_memory_type[index] : RT_MEMORY_HBM; memory_type = has_workspace_mem_type_attr ? workspace_memory_type[index] : RT_MEMORY_HBM;


+ 2
- 0
ge/graph/build/memory/block_mem_assigner.h View File

@@ -494,6 +494,8 @@ class BlockMemAssigner : public MemAssigner {
/// @ [stream2][nodeid] /// @ [stream2][nodeid]
/// ///
DependStreamLife total_node_depend_stream_life_; DependStreamLife total_node_depend_stream_life_;

bool root_unknown_shape_flag_ = false;
}; };
} // namespace ge } // namespace ge
#endif // GE_GRAPH_BUILD_MEMORY_BLOCK_MEM_ASSIGNER_H_ #endif // GE_GRAPH_BUILD_MEMORY_BLOCK_MEM_ASSIGNER_H_

+ 234
- 0
ge/graph/build/memory/buffer_pool_mem_assigner.cc View File

@@ -0,0 +1,234 @@
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include "graph/build/memory/buffer_pool_mem_assigner.h"
#include "graph/common/omg_util.h"
#include "graph/utils/tensor_utils.h"
#include "framework/common/util.h"
#include "graph/compute_graph.h"
#include "graph/debug/ge_attr_define.h"
#include "common/math/math_util.h"
#include "common/util/error_manager/error_manager.h"

namespace ge {
namespace {
const size_t kBufferPoolNodeMemInfoLength = 2;
const uint32_t kBufferPoolNodeOutputSizeIndex = 0;
const uint32_t kBufferPoolNodeOutputOffsetIndex = 1;
} // namespace

Status BufferPoolMemAssigner::Assign() {
if (compute_graph_ == nullptr) {
GELOGE(PARAM_INVALID, "[Check][Graph]Graph is nullptr");
REPORT_INNER_ERROR("E19999", "Input graph is nullptr");
return PARAM_INVALID;
}
Status ret = InitAssigner(compute_graph_);
if (ret != SUCCESS) {
GELOGE(FAILED, "[Init][Assigner]Graph:%s.", compute_graph_->GetName().c_str());
return FAILED;
}
ret = AssignOutput();
if (ret != SUCCESS) {
GELOGE(FAILED, "[Assign][Output]Graph:%s.", compute_graph_->GetName().c_str());
return FAILED;
}
return SUCCESS;
}

Status BufferPoolMemAssigner::GetOutputMemoryType(const NodePtr &node, size_t idx, int64_t &memory_type) {
GE_CHECK_NOTNULL(node->GetOpDesc());
memory_type = RT_MEMORY_HBM;
std::vector<int64_t> type_list;
bool has_mem_type = ge::AttrUtils::GetListInt(node->GetOpDesc(), ATTR_NAME_OUTPUT_MEM_TYPE_LIST, type_list);
if (has_mem_type && (type_list.size() != node->GetOpDesc()->GetOutputsSize() || idx >= type_list.size())) {
GELOGE(PARAM_INVALID, "[Check][OutputParam]Output param invalid, output size:%zu, mem type size:%zu, index:%zu.",
node->GetOpDesc()->GetOutputsSize(), type_list.size(), idx);
REPORT_INNER_ERROR("E19999", "Output param invalid, output size:%zu, mem type size:%zu, index:%zu.",
node->GetOpDesc()->GetOutputsSize(), type_list.size(), idx);
return PARAM_INVALID;
}
memory_type = has_mem_type ? type_list[idx] : RT_MEMORY_HBM;
return SUCCESS;
}

Status BufferPoolMemAssigner::InitAssigner(const ComputeGraphPtr &graph) {
for (const NodePtr &node : graph->GetAllNodes()) {
int64_t buffer_pool_id = 0;
int64_t buffer_pool_size = 0;
bool get_attr = AttrUtils::GetInt(node->GetOpDesc(), ATTR_NAME_BUFFER_POOL_ID, buffer_pool_id);
get_attr = get_attr && (AttrUtils::GetInt(node->GetOpDesc(), ATTR_NAME_BUFFER_POOL_SIZE, buffer_pool_size));
if (get_attr) {
std::string batch_label;
(void) AttrUtils::GetStr(node->GetOpDesc(), ATTR_NAME_BATCH_LABEL, batch_label);
buffer_pool_nodes_[batch_label][buffer_pool_id].emplace_back(node);
auto iter = buffer_pool_size_[batch_label].find(buffer_pool_id);
if (iter == buffer_pool_size_[batch_label].end()) {
buffer_pool_size_[batch_label][buffer_pool_id] = buffer_pool_size;
}
Status ret = InitMemOffsetBase(node);
if (ret != SUCCESS) {
GELOGE(ret, "[Init][MemOffsetBase]Batch label:%s.", batch_label.c_str());
REPORT_INNER_ERROR("E19999", "Failed to init offset base, batch label:%s.", batch_label.c_str());
return ret;
}
}
}

int64_t max_size = 0;
for (const auto &iter : buffer_pool_size_) {
std::string batch_label = iter.first;
int64_t batch_offset = mem_offset_base_;
for (const auto &buffer_pool : iter.second) {
int64_t buffer_pool_id = buffer_pool.first;
int64_t buffer_pool_size = buffer_pool.second;
buffer_pool_offset_base_[batch_label][buffer_pool_id] = batch_offset;
FMK_INT64_ADDCHECK(buffer_pool_size, kBufferPoolMemAlignSize);
AlignMemSize(buffer_pool_size, kBufferPoolMemAlignSize);
FMK_INT64_ADDCHECK(batch_offset, (buffer_pool_size + kBufferPoolMemAlignSize));
batch_offset += (buffer_pool_size + kBufferPoolMemAlignSize);
}
int64_t batch_mem_size = batch_offset - mem_offset_base_;
GELOGI("[Init][Assigner]Get batch mem size, batch label:%s, mem size:%ld.", batch_label.c_str(), batch_mem_size);
if (max_size < batch_mem_size) {
max_size = batch_mem_size;
}
}
FMK_INT64_ADDCHECK(mem_offset_base_, max_size);
mem_offset_ = static_cast<size_t>(mem_offset_base_ + max_size);
GELOGI("[Init][Assigner]Init buffer pool mem assigner successfully, "
"mem type:%ld, mem offset base:%ld, mem offset:%zu.", mem_type_, mem_offset_base_, mem_offset_);
return SUCCESS;
}

Status BufferPoolMemAssigner::InitMemOffsetBase(const NodePtr &node) {
int64_t mem_type;
Status ret = GetOutputMemoryType(node, static_cast<size_t>(kBufferPoolNodeOutIndex), mem_type);
if (ret != SUCCESS) {
GELOGE(ret, "[Get][MemType]Node:%s, index:%u.", node->GetName().c_str(), kBufferPoolNodeOutIndex);
REPORT_INNER_ERROR("E19999", "Failed to get output memory type, node:%s, index:%u.",
node->GetName().c_str(), kBufferPoolNodeOutIndex);
return ret;
}
if (mem_type_ != mem_type && init_offset_base_) {
GELOGE(PARAM_INVALID, "[Check][MemType]The memory type of all buffer pool nodes must be the same, node:%s, "
"required:%ld, actually: %ld", node->GetName().c_str(), mem_type_, mem_type);
REPORT_INNER_ERROR("E19999", "The memory type of all buffer pool nodes must be the same, node:%s, "
"required:%ld, actually: %ld", node->GetName().c_str(), mem_type_, mem_type);
return PARAM_INVALID;
}
if (!init_offset_base_) {
auto iter = mem_type_to_offset_.find(mem_type);
if (iter == mem_type_to_offset_.end()) {
GELOGE(PARAM_INVALID, "[Check][MemType]Memory type is not supported, node:%s, mem type:%ld.",
node->GetName().c_str(), mem_type);
REPORT_INNER_ERROR("E19999", "Memory type is not supported, node:%s, mem type:%ld.",
node->GetName().c_str(), mem_type);
return PARAM_INVALID;
}
mem_offset_base_ = static_cast<int64_t>(iter->second);
FMK_INT64_ADDCHECK(mem_offset_base_, (kBufferPoolMemAlignSize + kBufferPoolMemAlignSize));
AlignMemSize(mem_offset_base_, kBufferPoolMemAlignSize);
// The HCOM nodes may access the previous 512 bytes.
mem_offset_base_ += kBufferPoolMemAlignSize;
mem_type_ = mem_type;
init_offset_base_ = true;
GELOGI("[Init][MemOffsetBase]Init offset base:%ld, memory type:%ld", mem_offset_base_, mem_type);
}
return SUCCESS;
}

Status BufferPoolMemAssigner::AssignOutput() {
for (auto &batch_pool_nodes_map : buffer_pool_nodes_) {
std::string batch_label = batch_pool_nodes_map.first;
for (auto &pool_nodes_map : batch_pool_nodes_map.second) {
int64_t buffer_pool_id = pool_nodes_map.first;
auto iter_buffer_id_size = buffer_pool_size_[batch_label].find(buffer_pool_id);
if (iter_buffer_id_size == buffer_pool_size_[batch_label].end()) {
GELOGE(INTERNAL_ERROR, "[Get][BufferPoolSize]Pool id:%ld.", buffer_pool_id);
REPORT_INNER_ERROR("E19999", "Failed to get buffer pool size, pool id:%ld.", buffer_pool_id);
return INTERNAL_ERROR;
}
auto iter_buffer_id_offset = buffer_pool_offset_base_[batch_label].find(buffer_pool_id);
if (iter_buffer_id_offset == buffer_pool_offset_base_[batch_label].end()) {
GELOGE(INTERNAL_ERROR, "[Get][BufferPoolBaseOffset]Pool id:%ld.", buffer_pool_id);
REPORT_INNER_ERROR("E19999", "Failed to get buffer pool base offset, pool id:%ld.", buffer_pool_id);
return INTERNAL_ERROR;
}
int64_t buffer_pool_size = iter_buffer_id_size->second;
int64_t output_offset_base = iter_buffer_id_offset->second;
Status ret = AssignOutputInOneBufferPool(batch_label, output_offset_base, pool_nodes_map.second);
if (ret != SUCCESS) {
GELOGE(ret, "[Assign][OneBufferPool]Batch label:%s, pool id:%ld, pool size:%ld, offset base:%ld.",
batch_label.c_str(), buffer_pool_id, buffer_pool_size, output_offset_base);
REPORT_INNER_ERROR("E19999", "Failed to assign output memory, batch label:%s, "
"pool id:%ld, pool size:%ld, offset base:%ld.",
batch_label.c_str(), buffer_pool_id, buffer_pool_size, output_offset_base);
return ret;
}
GELOGI("[Assign][Output]Assign output successfully, batch label:%s, pool id:%ld, pool size:%ld, offset base:%ld.",
batch_label.c_str(), buffer_pool_id, buffer_pool_size, output_offset_base);
}
}
return SUCCESS;
}

Status BufferPoolMemAssigner::AssignOutputInOneBufferPool(const std::string &batch_label,
int64_t output_offset_base,
const std::vector<NodePtr> &buffer_pool_nodes) {
for (const NodePtr &node : buffer_pool_nodes) {
int64_t output_size = 0;
Status ret = GetMemorySize(node, output_size);
if (ret != SUCCESS) {
GELOGE(ret, "[Get][MemSize]Node:%s.", node->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to get output size, node:%s.", node->GetName().c_str());
return ret;
}
OpDescPtr op_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(op_desc);
vector<int64_t> memory_size_and_offset;
bool get_attr = AttrUtils::GetListInt(op_desc, ATTR_NAME_BUFFER_POOL_NODE_SIZE_AND_OFFSET, memory_size_and_offset);
if (!get_attr || memory_size_and_offset.size() != kBufferPoolNodeMemInfoLength) {
GELOGE(PARAM_INVALID, "[Get][Attr]Node:%s, mem info size:%zu, required size:%zu.",
node->GetName().c_str(), memory_size_and_offset.size(), kBufferPoolNodeMemInfoLength);
REPORT_INNER_ERROR("E19999", "Failed to get pool node memory info, node:%s, info size:%zu, required size:%zu.",
node->GetName().c_str(), memory_size_and_offset.size(), kBufferPoolNodeMemInfoLength);
return PARAM_INVALID;
}
if (output_size != memory_size_and_offset[kBufferPoolNodeOutputSizeIndex]) {
GELOGE(PARAM_INVALID, "[Check][MemSize]Something wrong with memory size, pre size:%ld, curr size:%ld, node:%s.",
memory_size_and_offset[kBufferPoolNodeOutputSizeIndex], output_size, node->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Something wrong with memory size, pre size:%ld, curr size:%ld, node:%s.",
memory_size_and_offset[kBufferPoolNodeOutputSizeIndex], output_size, node->GetName().c_str());
return PARAM_INVALID;
}

int64_t logical_offset = memory_size_and_offset[kBufferPoolNodeOutputOffsetIndex];
vector<int64_t> output_list = {(output_offset_base + logical_offset)};
op_desc->SetOutputOffset(output_list);
// log for IMAS tools
GELOGI("[IMAS]Set %s name[%s] optype[%s] %s[%u] offset to [%ld] streamid[%ld] memtype[%ld] "
"size[%zu] realsize[%zu] noalignsize[%zu] life time begin[%d] life time end[%d] "
"child[%d:%d:%d:%d:%d] isref[%d] batch[%s]",
compute_graph_->GetName().c_str(), op_desc->GetName().c_str(), op_desc->GetType().c_str(),
"output", kBufferPoolNodeOutIndex, output_list[kBufferPoolNodeOutIndex], op_desc->GetStreamId(), mem_type_,
static_cast<size_t>(output_size), static_cast<size_t>(output_size), static_cast<size_t>(output_size),
0, 0, 0, 0, 0, 0, 0, 0, batch_label.c_str());
}
return SUCCESS;
}

} // namespace ge

+ 83
- 0
ge/graph/build/memory/buffer_pool_mem_assigner.h View File

@@ -0,0 +1,83 @@
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef GE_GRAPH_BUILD_MEMORY_BUFFER_POOL_MEM_ASSIGNER_H_
#define GE_GRAPH_BUILD_MEMORY_BUFFER_POOL_MEM_ASSIGNER_H_

#include <vector>
#include <map>
#include <unordered_map>
#include "graph/build/memory/mem_assigner.h"
#include "runtime/mem.h"

namespace ge {
class BufferPoolMemAssigner : public MemAssigner {
public:
BufferPoolMemAssigner(ComputeGraphPtr compute_graph, const std::map<int64_t, size_t> &mem_type_to_offset)
: MemAssigner(), compute_graph_(compute_graph),
mem_type_(0),
mem_offset_(0),
mem_offset_base_(0),
init_offset_base_(false),
mem_type_to_offset_(mem_type_to_offset) {}

BufferPoolMemAssigner(const BufferPoolMemAssigner &) = delete;

BufferPoolMemAssigner &operator=(const BufferPoolMemAssigner &) = delete;

~BufferPoolMemAssigner() override = default;

Status Assign() override;

size_t GetMemOffset() const { return mem_offset_; }

int64_t GetMemType() const { return mem_type_; }

private:
static Status GetOutputMemoryType(const NodePtr &node, size_t idx, int64_t &memory_type);

Status InitAssigner(const ComputeGraphPtr &graph);

Status InitMemOffsetBase(const NodePtr &node);

Status AssignOutput();

Status AssignOutputInOneBufferPool(const std::string &batch_label,
int64_t output_offset_base,
const std::vector<NodePtr> &buffer_pool_nodes);

ComputeGraphPtr compute_graph_;

int64_t mem_type_;

size_t mem_offset_;

int64_t mem_offset_base_;

bool init_offset_base_;

std::map<int64_t, size_t> mem_type_to_offset_;

// Use map to ensure that each visit is in the order of pool id
std::unordered_map<std::string, std::map<int64_t, std::vector<NodePtr>>> buffer_pool_nodes_;

// Use map to ensure that each visit is in the order of pool id
std::unordered_map<std::string, std::map<int64_t, int64_t>> buffer_pool_size_;

std::unordered_map<std::string, std::unordered_map<int64_t, int64_t>> buffer_pool_offset_base_;
};
} // namespace ge
#endif // GE_GRAPH_BUILD_MEMORY_BUFFER_POOL_MEM_ASSIGNER_H_

+ 350
- 122
ge/graph/build/memory/graph_mem_assigner.cc
File diff suppressed because it is too large
View File


+ 6
- 1
ge/graph/build/memory/graph_mem_assigner.h View File

@@ -110,8 +110,11 @@ class GraphMemoryAssigner {
ge::Status SetInputOffset(); ge::Status SetInputOffset();


ge::Status UpdateOpInputOffset(const NodePtr &node) const; ge::Status UpdateOpInputOffset(const NodePtr &node) const;
ge::Status UpdateRefOpOutputOffset(const NodePtr &node, const std::map<int32_t, int32_t> &out2ins, const int ref_in,
const int64_t input_offset) const;


ge::Status CheckOffset(); ge::Status CheckOffset();
ge::Status CheckRefNodeOffset(const NodePtr &node);


ge::Status AssignReferenceMemory(); ge::Status AssignReferenceMemory();


@@ -125,7 +128,7 @@ class GraphMemoryAssigner {


ge::Status ReAssignAtomicMemory(bool is_loop_graph); ge::Status ReAssignAtomicMemory(bool is_loop_graph);


ge::Status GetAllRef(const NodePtr &node, std::map<int32_t, int32_t> &out2ins);
ge::Status TryGetNodeRefIndexes(const NodePtr &node, std::map<int32_t, int32_t> &out2ins) const;


bool AssignContinuousInputMemoryWithAtomicProcessDirectly(const NodePtr &input_continuous_node, bool AssignContinuousInputMemoryWithAtomicProcessDirectly(const NodePtr &input_continuous_node,
std::map<NodePtr, uint32_t> &node_2_continuous_type); std::map<NodePtr, uint32_t> &node_2_continuous_type);
@@ -188,6 +191,8 @@ class GraphMemoryAssigner {


void PrintMemoryOffset(); void PrintMemoryOffset();


Status AssignBufferPoolMemory();

MemoryOffsetMap memory_offset_; MemoryOffsetMap memory_offset_;
ge::ComputeGraphPtr compute_graph_; ge::ComputeGraphPtr compute_graph_;
HybridMemAssignerPtr mem_assigner_; HybridMemAssignerPtr mem_assigner_;


+ 1
- 0
ge/graph/build/memory/hybrid_mem_assigner.cc View File

@@ -42,6 +42,7 @@ Status HybridMemAssigner::AssignMemory(std::unique_ptr<BlockMemAssigner> &block_


Status HybridMemAssigner::Assign() { Status HybridMemAssigner::Assign() {
if (GraphUtils::GetRefMapping(compute_graph_, symbol_to_anchors_, anchor_to_symbol_) != GRAPH_SUCCESS) { if (GraphUtils::GetRefMapping(compute_graph_, symbol_to_anchors_, anchor_to_symbol_) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get ref-mapping for graph %s failed", compute_graph_->GetName().c_str());
GELOGE(FAILED, "Get ref-mapping for graph %s failed.", compute_graph_->GetName().c_str()); GELOGE(FAILED, "Get ref-mapping for graph %s failed.", compute_graph_->GetName().c_str());
return FAILED; return FAILED;
} }


+ 1
- 0
ge/graph/build/memory/module.mk View File

@@ -8,6 +8,7 @@ local_lib_src_files := memory_assigner.cc \
hybrid_mem_assigner.cc \ hybrid_mem_assigner.cc \
max_block_mem_assigner.cc \ max_block_mem_assigner.cc \
var_mem_assign_util.cc \ var_mem_assign_util.cc \
buffer_pool_mem_assigner.cc \


local_lib_inc_path := ${LOCAL_PATH} \ local_lib_inc_path := ${LOCAL_PATH} \
${TOPDIR}inc \ ${TOPDIR}inc \


+ 47
- 11
ge/graph/build/memory/var_mem_assign_util.cc View File

@@ -53,6 +53,8 @@ Status VarMemAssignUtil::AssignStaticMemory2Node(ge::ComputeGraphPtr &compute_gr
GE_IF_BOOL_EXEC(ge::AttrUtils::GetStr(n->GetOpDesc(), REF_VAR_SRC_VAR_NAME, ref_var_src_var_name), continue); GE_IF_BOOL_EXEC(ge::AttrUtils::GetStr(n->GetOpDesc(), REF_VAR_SRC_VAR_NAME, ref_var_src_var_name), continue);
string node_name = n->GetName(); string node_name = n->GetName();
GE_IF_BOOL_EXEC(n->GetOpDesc()->GetAllOutputsDesc().empty(), GE_IF_BOOL_EXEC(n->GetOpDesc()->GetAllOutputsDesc().empty(),
REPORT_INNER_ERROR("E19999", "check node:%s has no OutputDesc",
n->GetName().c_str());
GELOGE(FAILED, "node:%s has no OutputDesc.", n->GetName().c_str()); GELOGE(FAILED, "node:%s has no OutputDesc.", n->GetName().c_str());
return FAILED); return FAILED);
ge::ConstGeTensorDescPtr tensor_desc = n->GetOpDesc()->GetOutputDescPtr(0); ge::ConstGeTensorDescPtr tensor_desc = n->GetOpDesc()->GetOutputDescPtr(0);
@@ -116,6 +118,8 @@ Status VarMemAssignUtil::SetOutVariableAttr(const ge::NodePtr &node, const ge::N
GE_CHECK_NOTNULL(node->GetOpDesc()); GE_CHECK_NOTNULL(node->GetOpDesc());
output_list = node->GetOpDesc()->GetOutputOffset(); output_list = node->GetOpDesc()->GetOutputOffset();
if (output_list.empty()) { if (output_list.empty()) {
REPORT_INNER_ERROR("E19999", "check node:%s output_offset_list is empty",
node->GetName().c_str());
GELOGE(PARAM_INVALID, "Output_list is empty"); GELOGE(PARAM_INVALID, "Output_list is empty");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -126,7 +130,12 @@ Status VarMemAssignUtil::SetOutVariableAttr(const ge::NodePtr &node, const ge::N
VarManager::Instance(session_id)->GetVarAddr(var_node->GetName(), var_tensor_desc, &dev_ptr, memory_type)); VarManager::Instance(session_id)->GetVarAddr(var_node->GetName(), var_tensor_desc, &dev_ptr, memory_type));


int out_list_size = static_cast<int>(output_list.size()); int out_list_size = static_cast<int>(output_list.size());
GE_CHK_BOOL_RET_STATUS(index < out_list_size, FAILED, "index %d >= output_list.size() %d", index, out_list_size);
if (index >= out_list_size) {
REPORT_INNER_ERROR("E19999", "param index:%d >= output_list.size() %d in node %s, check invalid",
index, out_list_size, node->GetName().c_str());
GELOGE(FAILED, "index %d >= output_list.size() %d", index, out_list_size);
return FAILED;
}


output_list[index] = static_cast<int64_t>(reinterpret_cast<intptr_t>(dev_ptr)); output_list[index] = static_cast<int64_t>(reinterpret_cast<intptr_t>(dev_ptr));
GELOGI("Assign node outputOffset[index] is: %ld", output_list[index]); GELOGI("Assign node outputOffset[index] is: %ld", output_list[index]);
@@ -168,9 +177,13 @@ Status VarMemAssignUtil::DealBroadCastNode(uint32_t graph_id, const ge::NodePtr


auto broad_cast_index = static_cast<size_t>(broad_cast_info.idx); auto broad_cast_index = static_cast<size_t>(broad_cast_info.idx);
auto input_tensor_desc_ptr_vistor = op_desc->GetAllInputsDescPtr(); auto input_tensor_desc_ptr_vistor = op_desc->GetAllInputsDescPtr();
GE_CHK_BOOL_RET_STATUS(input_tensor_desc_ptr_vistor.size() > broad_cast_index, FAILED,
"Get broadcast op %s input tensor desc size [%zu] < idx [%d]", node->GetName().c_str(),
input_tensor_desc_ptr_vistor.size(), broad_cast_info.idx);
if (input_tensor_desc_ptr_vistor.size() <= broad_cast_index) {
REPORT_INNER_ERROR("E19999", "Get broadcast op %s input tensor desc size [%zu] < idx [%d]",
node->GetName().c_str(), input_tensor_desc_ptr_vistor.size(), broad_cast_info.idx);
GELOGE(FAILED, "Get broadcast op %s input tensor desc size [%zu] < idx [%d]", node->GetName().c_str(),
input_tensor_desc_ptr_vistor.size(), broad_cast_info.idx);
return FAILED;
}
const ge::GeTensorDescPtr input_tensor_desc = const ge::GeTensorDescPtr input_tensor_desc =
input_tensor_desc_ptr_vistor.at(static_cast<size_t>(broad_cast_info.idx)); input_tensor_desc_ptr_vistor.at(static_cast<size_t>(broad_cast_info.idx));
int64_t input_size = 0; int64_t input_size = 0;
@@ -298,6 +311,7 @@ Status VarMemAssignUtil::SetOutTransNodeToAssign(const ge::NodePtr &node, const
} }


Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &compute_graph) { Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &compute_graph) {
GraphToNodeMap graph_to_node;
for (const ge::NodePtr &n : compute_graph->GetAllNodes()) { for (const ge::NodePtr &n : compute_graph->GetAllNodes()) {
string ref_var_src_var_name; string ref_var_src_var_name;
auto op_desc = n->GetOpDesc(); auto op_desc = n->GetOpDesc();
@@ -305,7 +319,8 @@ Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &comput
for (uint32_t idx = 0; idx < op_desc->GetOutputsSize(); idx += 1) { for (uint32_t idx = 0; idx < op_desc->GetOutputsSize(); idx += 1) {
const auto out_desc = op_desc->MutableOutputDesc(idx); const auto out_desc = op_desc->MutableOutputDesc(idx);
if (ge::AttrUtils::GetStr(out_desc, REF_VAR_SRC_VAR_NAME, ref_var_src_var_name)) { if (ge::AttrUtils::GetStr(out_desc, REF_VAR_SRC_VAR_NAME, ref_var_src_var_name)) {
GE_CHK_STATUS_RET(AssignData2VarRef(n, ref_var_src_var_name, compute_graph->GetSessionID(), idx));
GE_CHK_STATUS_RET(
AssignData2VarRef(n, ref_var_src_var_name, compute_graph->GetSessionID(), idx, graph_to_node));
} }
} }
} }
@@ -313,16 +328,37 @@ Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &comput
} }


Status VarMemAssignUtil::AssignData2VarRef(const ge::NodePtr &has_ref_attr_node, const string &src_var_name, Status VarMemAssignUtil::AssignData2VarRef(const ge::NodePtr &has_ref_attr_node, const string &src_var_name,
uint64_t session_id, uint32_t out_index) {
uint64_t session_id, uint32_t out_index,
GraphToNodeMap &graph_to_node) {
// Get ref_var_src_var address // Get ref_var_src_var address
auto root_graph = GraphUtils::FindRootGraph(has_ref_attr_node->GetOwnerComputeGraph()); auto root_graph = GraphUtils::FindRootGraph(has_ref_attr_node->GetOwnerComputeGraph());
GE_CHECK_NOTNULL(root_graph); GE_CHECK_NOTNULL(root_graph);
ge::NodePtr var_ref_src_var = root_graph->FindNode(src_var_name);
if (var_ref_src_var == nullptr) {
// Cache mapping (name to nodeptr) simproves query performance
auto &name_to_node = graph_to_node[root_graph];
if (name_to_node.empty()) {
for (const ge::NodePtr &n : root_graph->GetDirectNode()) {
name_to_node.emplace(n->GetName(), n);
}
for (auto sub_graph : root_graph->GetAllSubgraphs()) {
auto &name_to_node_sub = graph_to_node[sub_graph];
if (name_to_node_sub.empty()) {
for (const ge::NodePtr &n : sub_graph->GetDirectNode()) {
name_to_node_sub.emplace(n->GetName(), n);
}
}
}
}

ge::NodePtr var_ref_src_var = nullptr;
auto it = name_to_node.find(src_var_name);
if ((it != name_to_node.end()) && (it->second != nullptr)) {
var_ref_src_var = it->second;
} else {
for (auto sub_graph : root_graph->GetAllSubgraphs()) { for (auto sub_graph : root_graph->GetAllSubgraphs()) {
auto node_ptr = sub_graph->FindNode(src_var_name);
if (node_ptr != nullptr) {
var_ref_src_var = node_ptr;
auto &name_to_node_sub = graph_to_node[sub_graph];
it = name_to_node_sub.find(src_var_name);
if ((it != name_to_node_sub.end()) && (it->second != nullptr)) {
var_ref_src_var = it->second;
break; break;
} }
} }


+ 3
- 1
ge/graph/build/memory/var_mem_assign_util.h View File

@@ -22,6 +22,8 @@
#include "graph/utils/node_utils.h" #include "graph/utils/node_utils.h"


namespace ge { namespace ge {
using GraphToNodeMap = std::map<ge::ComputeGraphPtr, std::map<std::string, ge::NodePtr>>;

class VarMemAssignUtil { class VarMemAssignUtil {
public: public:
static Status AssignVarMemory(ge::ComputeGraphPtr &compute_graph); static Status AssignVarMemory(ge::ComputeGraphPtr &compute_graph);
@@ -47,7 +49,7 @@ class VarMemAssignUtil {
static Status DealTransNode(const ge::NodePtr &final_trans_node); static Status DealTransNode(const ge::NodePtr &final_trans_node);
static Status DealExportTransNode(const ge::NodePtr &node, const ge::NodePtr &final_trans_node); static Status DealExportTransNode(const ge::NodePtr &node, const ge::NodePtr &final_trans_node);
static Status AssignData2VarRef(const ge::NodePtr &variable_ref, const std::string &src_var_name, uint64_t session_id, static Status AssignData2VarRef(const ge::NodePtr &variable_ref, const std::string &src_var_name, uint64_t session_id,
uint32_t out_index);
uint32_t out_index, GraphToNodeMap &graph_to_node);


static Status SetOutTransNodeToAssign(const ge::NodePtr &node, const ge::NodePtr &final_trans_node, size_t index); static Status SetOutTransNodeToAssign(const ge::NodePtr &node, const ge::NodePtr &final_trans_node, size_t index);
}; };


+ 115
- 3
ge/graph/build/model_builder.cc View File

@@ -116,11 +116,15 @@ Status ModelBuilder::CalcOutputSize(const ge::NodePtr &n) {
int64_t size_temp = 0; int64_t size_temp = 0;
graphStatus graph_status = TensorUtils::GetTensorMemorySizeInBytes(desc_temp, size_temp); graphStatus graph_status = TensorUtils::GetTensorMemorySizeInBytes(desc_temp, size_temp);
if (graph_status != GRAPH_SUCCESS) { if (graph_status != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get tensor size in bytes failed for op:%s(%s) index:%u",
node_op_desc->GetName().c_str(), node_op_desc->GetType().c_str(), index);
GELOGE(graph_status, "GetTensorMemorySizeInBytes failed!"); GELOGE(graph_status, "GetTensorMemorySizeInBytes failed!");
return FAILED; return FAILED;
} }
TensorUtils::SetSize(desc_temp, size_temp); TensorUtils::SetSize(desc_temp, size_temp);
if (node_op_desc->UpdateOutputDesc(index, desc_temp) != SUCCESS) { if (node_op_desc->UpdateOutputDesc(index, desc_temp) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Update Output desc size failed for op:%s(%s) index:%u",
node_op_desc->GetName().c_str(), node_op_desc->GetType().c_str(), index);
GELOGE(FAILED, "UpdateOutputDesc failed."); GELOGE(FAILED, "UpdateOutputDesc failed.");
return FAILED; return FAILED;
} }
@@ -197,8 +201,7 @@ void ModelBuilder::SetInputIsConst(const ge::NodePtr &n) {
} }
} }


std::string input_const_info = ToString(is_input_const);
GELOGD("update opdesc:%s InputConst:%s", node_op_desc->GetName().c_str(), input_const_info.c_str());
GELOGD("update opdesc:%s InputConst:%s", node_op_desc->GetName().c_str(), ToString(is_input_const).c_str());
node_op_desc->SetIsInputConst(is_input_const); node_op_desc->SetIsInputConst(is_input_const);
} }


@@ -207,11 +210,15 @@ Status ModelBuilder::AdjustConstWeightSize(const ge::NodePtr &node, size_t &mem_
if (node->GetType() == CONSTANT) { if (node->GetType() == CONSTANT) {
vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(node); vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(node);
if (weights.empty()) { if (weights.empty()) {
REPORT_INNER_ERROR("E19999", "Check weights size of node %s(%s) is empty",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str());
return FAILED; return FAILED;
} }
GeTensorPtr weight = weights[0]; GeTensorPtr weight = weights[0];
if (weight == nullptr) { if (weight == nullptr) {
REPORT_INNER_ERROR("E19999", "Check weight of node %s(%s) is nullptr",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "weights[0] is null."); GELOGE(FAILED, "weights[0] is null.");
return FAILED; return FAILED;
} }
@@ -353,6 +360,9 @@ Status ModelBuilder::AdjustInputTensorFlag() {
auto input_desc = owner_node_op_desc->GetInputDesc(in_anchors->GetIdx()); auto input_desc = owner_node_op_desc->GetInputDesc(in_anchors->GetIdx());
ge::TensorUtils::SetInputTensor(input_desc, true); ge::TensorUtils::SetInputTensor(input_desc, true);
if (owner_node_op_desc->UpdateInputDesc(in_anchors->GetIdx(), input_desc) != SUCCESS) { if (owner_node_op_desc->UpdateInputDesc(in_anchors->GetIdx(), input_desc) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Update Input desc size failed for op:%s(%s) index:%u",
owner_node_op_desc->GetName().c_str(), owner_node_op_desc->GetType().c_str(),
in_anchors->GetIdx());
GELOGE(FAILED, "UpdateOutputDesc failed."); GELOGE(FAILED, "UpdateOutputDesc failed.");
return FAILED; return FAILED;
} }
@@ -381,33 +391,51 @@ Status ModelBuilder::BuildModelDef(ge::Model &model) {


max_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_HBM]; max_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_HBM];
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_MEMORY_SIZE, max_mem_offset_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_MEMORY_SIZE, max_mem_offset_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_MEMORY_SIZE.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_MEMORY_SIZE failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_MEMORY_SIZE failed.");
return FAILED); return FAILED);
if (mem_type_to_mem_offset_.find(RT_MEMORY_P2P_DDR) != mem_type_to_mem_offset_.end()) { if (mem_type_to_mem_offset_.find(RT_MEMORY_P2P_DDR) != mem_type_to_mem_offset_.end()) {
p2p_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_P2P_DDR]; p2p_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_P2P_DDR];
} }
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_mem_offset_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_mem_offset_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_P2P_MEMORY_SIZE.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_P2P_MEMORY_SIZE failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_P2P_MEMORY_SIZE failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_WEIGHT_SIZE, weight_offset_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_WEIGHT_SIZE, weight_offset_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_WEIGHT_SIZE.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_WEIGHT_SIZE failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_WEIGHT_SIZE failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_STREAM_NUM.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_STREAM_NUM failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_STREAM_NUM failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_EVENT_NUM, event_num_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_EVENT_NUM, event_num_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_EVENT_NUM.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_EVENT_NUM failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_EVENT_NUM failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(&model, ATTR_MODEL_HUGE_STREAM_LIST, huge_streams_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(&model, ATTR_MODEL_HUGE_STREAM_LIST, huge_streams_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_HUGE_STREAM_LIST.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_HUGE_STREAM_LIST failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_HUGE_STREAM_LIST failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_LABEL_NUM, label_num_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_LABEL_NUM, label_num_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_LABEL_NUM.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_LABEL_NUM failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_LABEL_NUM failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_ZERO_COPY_MEMORY_SIZE, zero_copy_mem_size_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_ZERO_COPY_MEMORY_SIZE, zero_copy_mem_size_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_ZERO_COPY_MEMORY_SIZE.c_str());
GELOGE(FAILED, "SetInt of ATTR_MODEL_ZERO_COPY_MEMORY_SIZE failed."); GELOGE(FAILED, "SetInt of ATTR_MODEL_ZERO_COPY_MEMORY_SIZE failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(&model, ATTR_MODEL_OUT_NODES_NAME, GetLocalOmgContext().net_out_nodes), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(&model, ATTR_MODEL_OUT_NODES_NAME, GetLocalOmgContext().net_out_nodes),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_OUT_NODES_NAME.c_str());
GELOGE(FAILED, "SetListStr of ATTR_MODEL_OUT_NODES_NAME failed."); GELOGE(FAILED, "SetListStr of ATTR_MODEL_OUT_NODES_NAME failed.");
return FAILED); return FAILED);
GELOGI("For model, max_mem_offset_: %zu, p2p_mem_size: %zu, zero_copy_mem_size_: %zu", max_mem_offset_, GELOGI("For model, max_mem_offset_: %zu, p2p_mem_size: %zu, zero_copy_mem_size_: %zu", max_mem_offset_,
@@ -415,6 +443,8 @@ Status ModelBuilder::BuildModelDef(ge::Model &model) {
string fp_ceiling_mode; string fp_ceiling_mode;
if (ge::GetContext().GetOption("ge.fpCeilingMode", fp_ceiling_mode) == SUCCESS) { if (ge::GetContext().GetOption("ge.fpCeilingMode", fp_ceiling_mode) == SUCCESS) {
if (!ge::AttrUtils::SetStr(&model, ATTR_FP_CEILING_MODE, fp_ceiling_mode)) { if (!ge::AttrUtils::SetStr(&model, ATTR_FP_CEILING_MODE, fp_ceiling_mode)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_FP_CEILING_MODE.c_str());
GELOGE(FAILED, "Failed to set attr ATTR_FP_CEILING_MODE"); GELOGE(FAILED, "Failed to set attr ATTR_FP_CEILING_MODE");
return FAILED; return FAILED;
} }
@@ -429,22 +459,30 @@ Status ModelBuilder::BuildModelDef(ge::Model &model) {
int64_t core_type = (ge_core_type == kVectorCore) ? 1 : 0; int64_t core_type = (ge_core_type == kVectorCore) ? 1 : 0;
GELOGI("core_type: %ld", core_type); GELOGI("core_type: %ld", core_type);
if (!ge::AttrUtils::SetInt(&model, ATTR_MODEL_CORE_TYPE, core_type)) { if (!ge::AttrUtils::SetInt(&model, ATTR_MODEL_CORE_TYPE, core_type)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_MODEL_CORE_TYPE.c_str());
GELOGE(FAILED, "SetInt of ATTR_CORE_TYPE failed."); GELOGE(FAILED, "SetInt of ATTR_CORE_TYPE failed.");
} }
InitL1FusionOption(); InitL1FusionOption();
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(&model, ATTR_NAME_SWITCH_FOR_L1_FUSION, is_l1_fusion_enable_), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(&model, ATTR_NAME_SWITCH_FOR_L1_FUSION, is_l1_fusion_enable_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_NAME_SWITCH_FOR_L1_FUSION.c_str());
GELOGE(FAILED, "SetBool of ATTR_NAME_SWITCH_FOR_L1_FUSION failed."); GELOGE(FAILED, "SetBool of ATTR_NAME_SWITCH_FOR_L1_FUSION failed.");
return FAILED); return FAILED);
const DumpProperties &dump_properties = DumpManager::GetInstance().GetDumpProperties(session_id_); const DumpProperties &dump_properties = DumpManager::GetInstance().GetDumpProperties(session_id_);
bool is_op_debug = dump_properties.IsOpDebugOpen(); bool is_op_debug = dump_properties.IsOpDebugOpen();
if (is_op_debug) { if (is_op_debug) {
if (!ge::AttrUtils::SetBool(&model, ATTR_OP_DEBUG_FLAG, is_op_debug)) { if (!ge::AttrUtils::SetBool(&model, ATTR_OP_DEBUG_FLAG, is_op_debug)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_OP_DEBUG_FLAG.c_str());
GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_FLAG failed."); GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_FLAG failed.");
return FAILED; return FAILED;
} }
uint32_t op_debug_mode = dump_properties.GetOpDebugMode(); uint32_t op_debug_mode = dump_properties.GetOpDebugMode();
GELOGI("Get op debug mode:%d", op_debug_mode); GELOGI("Get op debug mode:%d", op_debug_mode);
if (!ge::AttrUtils::SetInt(&model, ATTR_OP_DEBUG_MODE, op_debug_mode)) { if (!ge::AttrUtils::SetInt(&model, ATTR_OP_DEBUG_MODE, op_debug_mode)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed",
ATTR_OP_DEBUG_MODE.c_str());
GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_MODE failed."); GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_MODE failed.");
return FAILED; return FAILED;
} }
@@ -516,6 +554,8 @@ Status ModelBuilder::MergeWeights() {
// If MutableTensor failed, weight is nullptr. // If MutableTensor failed, weight is nullptr.
(void)ge::AttrUtils::MutableTensor(op_desc, ATTR_NAME_WEIGHTS, weight); (void)ge::AttrUtils::MutableTensor(op_desc, ATTR_NAME_WEIGHTS, weight);
if (weight == nullptr) { if (weight == nullptr) {
REPORT_INNER_ERROR("E19999", "Can't get const weight in op:%s(%s)",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Can't get const op weight, name: %s", node->GetName().c_str()); GELOGE(FAILED, "Can't get const op weight, name: %s", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -538,8 +578,15 @@ Status ModelBuilder::MergeWeights() {
continue; continue;
} }
if (weight_data.data() != nullptr) { if (weight_data.data() != nullptr) {
GE_IF_BOOL_EXEC(base_addr == nullptr, GELOGE(FAILED, "Base addr is nullptr."); return FAILED);
GE_IF_BOOL_EXEC(base_addr == nullptr,
REPORT_INNER_ERROR("E19999", "Check weight in op:%s(%s) is nullptr",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Base addr is nullptr.");
return FAILED);
if (weight_offset_ - offset < weight_data.size()) { if (weight_offset_ - offset < weight_data.size()) {
REPORT_INNER_ERROR("E19999", "left weight size not enough for op:%s(%s) left_size:%zu, weight_size:%zu",
op_desc->GetName().c_str(), op_desc->GetType().c_str(),
weight_offset_ - offset, weight_data.size());
GELOGE(FAILED, "left weight size not enough. left_size:%lu, weight_size:%lu", GELOGE(FAILED, "left weight size not enough. left_size:%lu, weight_size:%lu",
weight_offset_ - offset, weight_data.size()); weight_offset_ - offset, weight_data.size());
return FAILED; return FAILED;
@@ -551,6 +598,9 @@ Status ModelBuilder::MergeWeights() {
auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), SECUREC_MEM_MAX_LEN, reinterpret_cast<void *>(src_ptr), auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), SECUREC_MEM_MAX_LEN, reinterpret_cast<void *>(src_ptr),
SECUREC_MEM_MAX_LEN); SECUREC_MEM_MAX_LEN);
if (err != EOK) { if (err != EOK) {
REPORT_CALL_ERROR("E19999", "mem copy failed. errret:%u, "
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu,",
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN);
GELOGE(FAILED, "mem copy failed. errret:%u, " GELOGE(FAILED, "mem copy failed. errret:%u, "
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu", "dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu",
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN);
@@ -562,6 +612,9 @@ Status ModelBuilder::MergeWeights() {
} }
auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), left_size, reinterpret_cast<void *>(src_ptr), left_size); auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), left_size, reinterpret_cast<void *>(src_ptr), left_size);
if (err != EOK) { if (err != EOK) {
REPORT_CALL_ERROR("E19999", "mem copy failed. errret:%u, "
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu,",
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN);
GELOGE(FAILED, "mem copy failed. errret:%u, " GELOGE(FAILED, "mem copy failed. errret:%u, "
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu", "dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu",
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN);
@@ -574,6 +627,50 @@ Status ModelBuilder::MergeWeights() {
return SUCCESS; return SUCCESS;
} }


Status ModelBuilder::SaveAtomicTBEKernel(const OpDescPtr &op_desc) {
ge::NodePtr atomic_clean_node = nullptr;
atomic_clean_node = op_desc->TryGetExtAttr("atomic_clean_node_ptr", atomic_clean_node);
if (atomic_clean_node == nullptr) {
return SUCCESS;
}

ge::OpDescPtr atomic_op_desc = atomic_clean_node->GetOpDesc();
GE_CHECK_NOTNULL(atomic_op_desc);
TBEKernelPtr tbe_kernel = atomic_op_desc->TryGetExtAttr(ge::OP_EXTATTR_NAME_TBE_KERNEL, TBEKernelPtr());
if (tbe_kernel == nullptr) {
std::string kernel_name;
GeAttrValue::BYTES kernel_buffer;
(void) AttrUtils::GetStr(atomic_op_desc, ATTR_NAME_TBE_KERNEL_NAME, kernel_name);
(void) AttrUtils::GetBytes(atomic_op_desc, ATTR_NAME_TBE_KERNEL_BUFFER, kernel_buffer);
if (!kernel_name.empty() && (kernel_buffer.GetSize() > 0)) {
GE_CHECK_NOTNULL(kernel_buffer.GetData());
std::vector<char> data(kernel_buffer.GetData(), kernel_buffer.GetData() + kernel_buffer.GetSize());
tbe_kernel = MakeShared<OpKernelBin>(kernel_name, std::move(data));
GE_CHECK_NOTNULL(tbe_kernel);
}
}
if (tbe_kernel == nullptr) {
GELOGD("Atomic_clean_node doesn't have tbe_kernel.");
return SUCCESS;
}
tbe_kernel_store_.AddTBEKernel(tbe_kernel);
GELOGD("Atomic_clean_node tbe_kernel_name %s!", tbe_kernel->GetName().c_str());
(void) AttrUtils::SetStr(op_desc, ATOMIC_ATTR_TBE_KERNEL_NAME, tbe_kernel->GetName());

std::string kernel_name;
(void) AttrUtils::GetStr(atomic_op_desc, atomic_op_desc->GetName() + "_kernelname", kernel_name);
(void) AttrUtils::SetStr(op_desc, op_desc->GetName() + "_atomic_kernelname", kernel_name);

std::string meta_data;
(void) AttrUtils::GetStr(atomic_op_desc, TVM_ATTR_NAME_METADATA, meta_data);
(void) AttrUtils::SetStr(op_desc, ATOMIC_ATTR_TVM_METADATA, meta_data);

std::string json_string;
(void) AttrUtils::GetStr(atomic_op_desc, TVM_ATTR_NAME_MAGIC, json_string);
(void) AttrUtils::SetStr(op_desc, ATOMIC_ATTR_TVM_MAGIC, json_string);
return SUCCESS;
}

Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) {
// Add weight // Add weight
ge_model.SetWeight(weight_buffer_); ge_model.SetWeight(weight_buffer_);
@@ -602,11 +699,15 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) {
} }
GE_IF_BOOL_EXEC(tbe_kernel == nullptr, continue); GE_IF_BOOL_EXEC(tbe_kernel == nullptr, continue);
if (tbe_name_set.count(tbe_kernel->GetName()) > 0) { if (tbe_name_set.count(tbe_kernel->GetName()) > 0) {
REPORT_INNER_ERROR("E19999", "tbe_kernel name %s can't be the same, judge for op:%s(%s),",
tbe_kernel->GetName().c_str(), n->GetName().c_str(), n->GetType().c_str());
GELOGE(FAILED, "tbe_kernel name %s can't be the same", tbe_kernel->GetName().c_str()); GELOGE(FAILED, "tbe_kernel name %s can't be the same", tbe_kernel->GetName().c_str());
return FAILED; return FAILED;
} }
tbe_name_set.insert(tbe_kernel->GetName()); tbe_name_set.insert(tbe_kernel->GetName());
tbe_kernel_store_.AddTBEKernel(tbe_kernel); tbe_kernel_store_.AddTBEKernel(tbe_kernel);

GE_CHK_STATUS_RET(SaveAtomicTBEKernel(node_op_desc), "[Save][TBEKernel] save atomic tbekernel failed!");
} }


SetModelCheckAicpuAttr(model, aicpu_op_types, aicpu_tf_op_types); SetModelCheckAicpuAttr(model, aicpu_op_types, aicpu_tf_op_types);
@@ -618,6 +719,8 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) {
node_op_desc->TryGetExtAttr(ge::OP_EXTATTR_CUSTAICPU_KERNEL, CustAICPUKernelPtr()); node_op_desc->TryGetExtAttr(ge::OP_EXTATTR_CUSTAICPU_KERNEL, CustAICPUKernelPtr());
GE_IF_BOOL_EXEC(cust_aicpu_kernel == nullptr, continue); GE_IF_BOOL_EXEC(cust_aicpu_kernel == nullptr, continue);
if (aicpu_name_set.count(cust_aicpu_kernel->GetName()) > 0) { if (aicpu_name_set.count(cust_aicpu_kernel->GetName()) > 0) {
REPORT_INNER_ERROR("E19999", "aicpu_kernel name %s can't be the same, judge for op:%s(%s),",
cust_aicpu_kernel->GetName().c_str(), n->GetName().c_str(), n->GetType().c_str());
GELOGE(FAILED, "aicpu_kernel name %s can't be the same", cust_aicpu_kernel->GetName().c_str()); GELOGE(FAILED, "aicpu_kernel name %s can't be the same", cust_aicpu_kernel->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -640,6 +743,7 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) {
// Add task // Add task
GeAttrValue::BYTES task_def_bytes; GeAttrValue::BYTES task_def_bytes;
if (!AttrUtils::GetZeroCopyBytes(model, MODEL_ATTR_TASKS, task_def_bytes)) { if (!AttrUtils::GetZeroCopyBytes(model, MODEL_ATTR_TASKS, task_def_bytes)) {
REPORT_CALL_ERROR("E19999", "Get attr:%s in model failed", MODEL_ATTR_TASKS.c_str());
GELOGE(INTERNAL_ERROR, "Get zero copy bytes fail."); GELOGE(INTERNAL_ERROR, "Get zero copy bytes fail.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -675,6 +779,7 @@ void ModelBuilder::SetModelVersion(ge::Model &model) {


Status ModelBuilder::PreBuildModel() { Status ModelBuilder::PreBuildModel() {
if ((compute_graph_ == nullptr) || !(compute_graph_->IsValid())) { if ((compute_graph_ == nullptr) || !(compute_graph_->IsValid())) {
REPORT_INNER_ERROR("E19999", "Check compute_graph no valid");
GELOGE(FAILED, "Graph_ is not valid."); GELOGE(FAILED, "Graph_ is not valid.");
return FAILED; return FAILED;
} }
@@ -754,6 +859,7 @@ Status ModelBuilder::CompileSingleOp() {
// Create ge instance // Create ge instance
std::shared_ptr<GELib> instance = ge::GELib::GetInstance(); std::shared_ptr<GELib> instance = ge::GELib::GetInstance();
if ((instance == nullptr) || !instance->InitFlag()) { if ((instance == nullptr) || !instance->InitFlag()) {
REPORT_INNER_ERROR("E19999", "Check GELib instance not init before");
GELOGE(ge::GE_CLI_GE_NOT_INITIALIZED, "CompileSingleOp failed."); GELOGE(ge::GE_CLI_GE_NOT_INITIALIZED, "CompileSingleOp failed.");
return ge::GE_CLI_GE_NOT_INITIALIZED; return ge::GE_CLI_GE_NOT_INITIALIZED;
} }
@@ -775,6 +881,8 @@ Status ModelBuilder::CompileSingleOp() {
(void)instance->DNNEngineManagerObj().GetDNNEngineName(node); (void)instance->DNNEngineManagerObj().GetDNNEngineName(node);
kernel_lib_name = op_desc->GetOpKernelLibName(); kernel_lib_name = op_desc->GetOpKernelLibName();
if (kernel_lib_name.empty()) { if (kernel_lib_name.empty()) {
REPORT_INNER_ERROR("E19999", "Check kernel lib name empty of op:%s(%s)",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(ge::INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node->GetName().c_str(), GELOGE(ge::INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node->GetName().c_str(),
node->GetType().c_str()); node->GetType().c_str());
return ge::INTERNAL_ERROR; return ge::INTERNAL_ERROR;
@@ -785,6 +893,8 @@ Status ModelBuilder::CompileSingleOp() {
if (kernel_info != nullptr) { if (kernel_info != nullptr) {
node_vector_map[kernel_lib_name].emplace_back(node); node_vector_map[kernel_lib_name].emplace_back(node);
} else { } else {
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s,",
node->GetName().c_str(), node->GetType().c_str(), kernel_lib_name.c_str());
GELOGE(ge::GE_GRAPH_PARAM_NULLPTR, "Get op %s ops kernel info store failed", node->GetName().c_str()); GELOGE(ge::GE_GRAPH_PARAM_NULLPTR, "Get op %s ops kernel info store failed", node->GetName().c_str());
return ge::GE_GRAPH_PARAM_NULLPTR; return ge::GE_GRAPH_PARAM_NULLPTR;
} }
@@ -800,6 +910,8 @@ Status ModelBuilder::CompileSingleOp() {
GELOGI("[GEPERFTRACE] The node size of compile op of %s is %zu", kernel_lib_name.c_str(), node_vector.size()); GELOGI("[GEPERFTRACE] The node size of compile op of %s is %zu", kernel_lib_name.c_str(), node_vector.size());
GE_TIMESTAMP_ADD(BatchCompileOp); GE_TIMESTAMP_ADD(BatchCompileOp);
if (ret != ge::SUCCESS) { if (ret != ge::SUCCESS) {
REPORT_CALL_ERROR("E19999", "Batch compile op failed, kernel lib name, node size:%zu,",
node_vector.size());
GELOGE(ret, "Compile op failed, kernel lib name is %s", kernel_lib_name.c_str()); GELOGE(ret, "Compile op failed, kernel lib name is %s", kernel_lib_name.c_str());
return ret; return ret;
} }


+ 2
- 0
ge/graph/build/model_builder.h View File

@@ -89,6 +89,8 @@ class ModelBuilder {
void SetModelCheckAicpuAttr(ge::Model &model, std::set<std::string> &aicpu_op_types, void SetModelCheckAicpuAttr(ge::Model &model, std::set<std::string> &aicpu_op_types,
std::set<std::string> &aicpu_tf_op_types); std::set<std::string> &aicpu_tf_op_types);


Status SaveAtomicTBEKernel(const OpDescPtr &op_desc);

uint64_t session_id_; uint64_t session_id_;


map<int64_t, size_t> mem_type_to_mem_offset_; map<int64_t, size_t> mem_type_to_mem_offset_;


+ 26
- 1
ge/graph/build/run_context.cc View File

@@ -18,6 +18,7 @@
#include "common/util.h" #include "common/util.h"
#include "framework/common/debug/ge_log.h" #include "framework/common/debug/ge_log.h"
#include "graph/debug/ge_attr_define.h" #include "graph/debug/ge_attr_define.h"
#include "graph/common/omg_util.h"


namespace ge { namespace ge {
RunContextUtil::~RunContextUtil() { DestroyRtModelResources(); } RunContextUtil::~RunContextUtil() { DestroyRtModelResources(); }
@@ -27,15 +28,21 @@ Status RunContextUtil::InitMemInfo(uint8_t *data_mem_base, uint64_t data_mem_siz
std::map<int64_t, uint64_t> mem_type_to_data_mem_size, uint8_t *weight_mem_base, std::map<int64_t, uint64_t> mem_type_to_data_mem_size, uint8_t *weight_mem_base,
uint64_t weight_mem_size) { uint64_t weight_mem_size) {
if ((data_mem_size > 0) && (data_mem_base == nullptr)) { if ((data_mem_size > 0) && (data_mem_base == nullptr)) {
REPORT_INNER_ERROR("E19999", "InitMemInfo param data_mem_base is null but data_mem_size = %lu", data_mem_size);
GELOGE(PARAM_INVALID, "InitMemInfo param data_mem_base is null but data_mem_size = %lu.", data_mem_size); GELOGE(PARAM_INVALID, "InitMemInfo param data_mem_base is null but data_mem_size = %lu.", data_mem_size);
return PARAM_INVALID; return PARAM_INVALID;
} }
if ((weight_mem_size > 0) && (weight_mem_base == nullptr)) { if ((weight_mem_size > 0) && (weight_mem_base == nullptr)) {
REPORT_INNER_ERROR("E19999", "InitMemInfo param weight_mem_base is null but weight_mem_size = %lu",
weight_mem_size);
GELOGE(PARAM_INVALID, "InitMemInfo param weight_mem_base is null but weight_mem_size = %lu.", weight_mem_size); GELOGE(PARAM_INVALID, "InitMemInfo param weight_mem_base is null but weight_mem_size = %lu.", weight_mem_size);
return PARAM_INVALID; return PARAM_INVALID;
} }
if (mem_type_to_data_mem_base.empty() || mem_type_to_data_mem_size.empty() || if (mem_type_to_data_mem_base.empty() || mem_type_to_data_mem_size.empty() ||
mem_type_to_data_mem_base.size() != mem_type_to_data_mem_size.size()) { mem_type_to_data_mem_base.size() != mem_type_to_data_mem_size.size()) {
REPORT_INNER_ERROR("E19999", "InitMemInfo param mem_type_to_data_mem_base size[%zu] "
"is not equal to the size of mem_type_to_data_mem_size[%zu].",
mem_type_to_data_mem_base.size(), mem_type_to_data_mem_size.size());
GELOGE(PARAM_INVALID, GELOGE(PARAM_INVALID,
"InitMemInfo param mem_type_to_data_mem_base size[%zu] is not equal to the size of " "InitMemInfo param mem_type_to_data_mem_base size[%zu] is not equal to the size of "
"mem_type_to_data_mem_size[%zu].", "mem_type_to_data_mem_size[%zu].",
@@ -55,6 +62,7 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even
// Create rt model // Create rt model
rtError_t rt_ret = rtModelCreate(&rt_model_, 0); rtError_t rt_ret = rtModelCreate(&rt_model_, 0);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "call rtModelCreate failed, ret:%d,", static_cast<int>(rt_ret));
GELOGE(RT_FAILED, "rtModelCreate failed. rt_ret = %d", static_cast<int>(rt_ret)); GELOGE(RT_FAILED, "rtModelCreate failed. rt_ret = %d", static_cast<int>(rt_ret));
return RT_FAILED; return RT_FAILED;
} }
@@ -64,6 +72,8 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even
rtStream_t stream = nullptr; rtStream_t stream = nullptr;
rt_ret = rtStreamCreate(&stream, 0); rt_ret = rtStreamCreate(&stream, 0);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "call rtStreamCreate failed, ret:%d, index:%u,",
static_cast<int>(rt_ret), i);
GELOGE(RT_FAILED, "rtStreamCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); GELOGE(RT_FAILED, "rtStreamCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i);
return RT_FAILED; return RT_FAILED;
} }
@@ -71,16 +81,22 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even


rt_ret = rtModelBindStream(rt_model_, stream, 0); rt_ret = rtModelBindStream(rt_model_, stream, 0);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "call rtModelBindStream failed, ret:%d, index:%u,",
static_cast<int>(rt_ret), i);
GELOGE(RT_FAILED, "Bind stream and model failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); GELOGE(RT_FAILED, "Bind stream and model failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i);
return RT_FAILED; return RT_FAILED;
} }
} }


// Create rt event // Create rt event
uint32_t create_flag = static_cast<uint32_t>((event_num > kEventReuseThreshold) ? RT_EVENT_WITH_FLAG :
RT_EVENT_DEFAULT);
for (uint32_t i = 0; i < event_num; ++i) { for (uint32_t i = 0; i < event_num; ++i) {
rtEvent_t event = nullptr; rtEvent_t event = nullptr;
rt_ret = rtEventCreate(&event);
rt_ret = rtEventCreateWithFlag(&event, create_flag);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "call rtEventCreate failed, ret:%d, index:%u,",
static_cast<int>(rt_ret), i);
GELOGE(RT_FAILED, "rtEventCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); GELOGE(RT_FAILED, "rtEventCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i);
return RT_FAILED; return RT_FAILED;
} }
@@ -92,6 +108,8 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even
rtLabel_t label = nullptr; rtLabel_t label = nullptr;
rt_ret = rtLabelCreateV2(&label, rt_model_); rt_ret = rtLabelCreateV2(&label, rt_model_);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "call rtLabelCreateV2 failed, ret:%d, index:%u,",
static_cast<int>(rt_ret), i);
GELOGE(RT_FAILED, "rtLabelCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); GELOGE(RT_FAILED, "rtLabelCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i);
return RT_FAILED; return RT_FAILED;
} }
@@ -143,12 +161,15 @@ Status RunContextUtil::CreateRunContext(Model &model, const ComputeGraphPtr &gra
GELOGD("Begin to Create RunContext, session_id = %lu", session_id); GELOGD("Begin to Create RunContext, session_id = %lu", session_id);
// check params // check params
if (graph == nullptr) { if (graph == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param graph nullptr, session_id:%lu,", session_id);
GELOGE(PARAM_INVALID, "CreateRunContext param graph is null. session_id=%lu", session_id); GELOGE(PARAM_INVALID, "CreateRunContext param graph is null. session_id=%lu", session_id);
return PARAM_INVALID; return PARAM_INVALID;
} }


uint32_t stream_num = 0; uint32_t stream_num = 0;
if (!AttrUtils::GetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num)) { if (!AttrUtils::GetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num)) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s failed for model, session_id:%lu,",
ATTR_MODEL_STREAM_NUM.c_str(), session_id);
GELOGE(INTERNAL_ERROR, "Get stream_num attr from model_def failed. session_id=%lu", session_id); GELOGE(INTERNAL_ERROR, "Get stream_num attr from model_def failed. session_id=%lu", session_id);
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -156,6 +177,8 @@ Status RunContextUtil::CreateRunContext(Model &model, const ComputeGraphPtr &gra


uint32_t event_num = 0; uint32_t event_num = 0;
if (!AttrUtils::GetInt(&model, ATTR_MODEL_EVENT_NUM, event_num)) { if (!AttrUtils::GetInt(&model, ATTR_MODEL_EVENT_NUM, event_num)) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s failed for model, session_id:%lu,",
ATTR_MODEL_EVENT_NUM.c_str(), session_id);
GELOGE(INTERNAL_ERROR, "Get event_num attr from model failed. session_id=%lu", session_id); GELOGE(INTERNAL_ERROR, "Get event_num attr from model failed. session_id=%lu", session_id);
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -163,6 +186,8 @@ Status RunContextUtil::CreateRunContext(Model &model, const ComputeGraphPtr &gra


uint32_t label_num = 0; uint32_t label_num = 0;
if (!AttrUtils::GetInt(&model, ATTR_MODEL_LABEL_NUM, label_num)) { if (!AttrUtils::GetInt(&model, ATTR_MODEL_LABEL_NUM, label_num)) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s failed for model, session_id:%lu,",
ATTR_MODEL_LABEL_NUM.c_str(), session_id);
GELOGE(INTERNAL_ERROR, "Get label_num attr from model failed. session_id=%lu", session_id); GELOGE(INTERNAL_ERROR, "Get label_num attr from model failed. session_id=%lu", session_id);
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }


+ 285
- 7
ge/graph/build/stream_allocator.cc View File

@@ -27,6 +27,8 @@
#include "graph/ge_context.h" #include "graph/ge_context.h"
#include "graph/utils/graph_utils.h" #include "graph/utils/graph_utils.h"
#include "init/gelib.h" #include "init/gelib.h"
#include "common/string_util.h"
#include "common/util/error_manager/error_manager.h"


using std::map; using std::map;
using std::set; using std::set;
@@ -38,6 +40,13 @@ const int64_t kTaskNumPerNormalNode = 3;
const int64_t kTaskNumPerHcclNode = 245; const int64_t kTaskNumPerHcclNode = 245;
const char *const kTrueStr = "true"; const char *const kTrueStr = "true";
const char *const kFalseStr = "false"; const char *const kFalseStr = "false";
const size_t kEventMultiplexingItemCount = 3;
const size_t kKeyWordIndex = 0;
const size_t kNodeNameIndex = 1;
const size_t kEventIdIndex = 2;
const char *const kSend = "SendTo";
const char *const kRecv = "RecvFrom";
const char kDelim = ';';


inline bool HasContinuousStreamLabel(const ge::OpDescPtr &op_desc, std::string &continuous_stream_label) { inline bool HasContinuousStreamLabel(const ge::OpDescPtr &op_desc, std::string &continuous_stream_label) {
if (ge::AttrUtils::GetStr(op_desc, ge::ATTR_NAME_CONTINUOUS_STREAM_LABEL, continuous_stream_label)) { if (ge::AttrUtils::GetStr(op_desc, ge::ATTR_NAME_CONTINUOUS_STREAM_LABEL, continuous_stream_label)) {
@@ -52,6 +61,97 @@ bool IsHcclOp(const string &op_type) {
ge::HCOMALLREDUCE, ge::HCOMREDUCESCATTER, ge::HCOMREDUCE}); ge::HCOMALLREDUCE, ge::HCOMREDUCESCATTER, ge::HCOMREDUCE});
return hccl_op_types.find(op_type) != hccl_op_types.end(); return hccl_op_types.find(op_type) != hccl_op_types.end();
} }

ge::Status ParseNodeEventMultiplexing(const ge::NodePtr &node,
const std::vector<std::string> &raw_event_multiplexing,
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_send,
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_recv) {
GE_CHECK_NOTNULL(node);
for (const auto &str : raw_event_multiplexing) {
std::vector<std::string> ele = ge::StringUtils::Split(str, kDelim);
if (ele.size() != kEventMultiplexingItemCount) {
GELOGE(ge::PARAM_INVALID, "[Check][RawMultiplexing]Size error, node:%s, require size:%zu, actually:%zu.",
node->GetName().c_str(), kEventMultiplexingItemCount, ele.size());
REPORT_INNER_ERROR("E19999", "Raw event multiplexing is invalid, node:%s, require size:%zu, actually:%zu.",
node->GetName().c_str(), kEventMultiplexingItemCount, ele.size());
return ge::PARAM_INVALID;
}
int value;
try {
value = std::stoi(ele[kEventIdIndex]);
} catch (std::invalid_argument &) {
GELOGE(ge::PARAM_INVALID, "[Throw][Exception]Event id is invalid, node:%s, raw:%s.",
node->GetName().c_str(), ele[kEventIdIndex].c_str());
REPORT_INNER_ERROR("E19999", "Event id is invalid, node:%s, raw:%s.",
node->GetName().c_str(), ele[kEventIdIndex].c_str());
return ge::PARAM_INVALID;
} catch (std::out_of_range &) {
GELOGE(ge::PARAM_INVALID, "[Throw][Exception]Event id is out of range, node:%s, raw:%s.",
node->GetName().c_str(), ele[kEventIdIndex].c_str());
REPORT_INNER_ERROR("E19999", "Event id is out of range, node:%s, raw:%s.",
node->GetName().c_str(), ele[kEventIdIndex].c_str());
return ge::PARAM_INVALID;
}
if (value < 0) {
GELOGE(ge::PARAM_INVALID, "[Check][EventId]Event id is out of range, node:%s, raw:%s, value:%d.",
node->GetName().c_str(), ele[kEventIdIndex].c_str(), value);
REPORT_INNER_ERROR("E19999", "Event id is out of range, node:%s, raw:%s, value:%d.",
node->GetName().c_str(), ele[kEventIdIndex].c_str(), value);
return ge::PARAM_INVALID;
}
if (ele[kKeyWordIndex] == kSend) {
node_to_send[node].emplace_back(std::make_pair(ele[kNodeNameIndex], static_cast<uint32_t>(value)));
} else if (ele[kKeyWordIndex] == kRecv) {
node_to_recv[node].emplace_back(std::make_pair(ele[kNodeNameIndex], static_cast<uint32_t>(value)));
} else {
GELOGE(ge::PARAM_INVALID, "[Check][KeyWord]Key word is not supported, node:%s, key:%s.",
node->GetName().c_str(), ele[kEventIdIndex].c_str());
REPORT_INNER_ERROR("E19999", "Key word is not supported, node:%s, key:%s.",
node->GetName().c_str(), ele[kEventIdIndex].c_str());
return ge::PARAM_INVALID;
}
}
return ge::SUCCESS;
}

ge::Status ParseAllNodeEventMultiplexing(const ge::ComputeGraphPtr &graph,
std::unordered_map<std::string, ge::NodePtr> &name_to_node_map,
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_send,
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_recv) {
for (const auto &node : graph->GetNodes(graph->GetGraphUnknownFlag())) {
ge::OpDescPtr op_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(op_desc);
name_to_node_map.insert({node->GetName(), node});
std::vector<std::string> raw_event_multiplexing;
if (!(op_desc->HasAttr(ge::ATTR_NAME_EVENT_MULTIPLEXING))) {
continue;
}
bool get_attr = ge::AttrUtils::GetListStr(op_desc, ge::ATTR_NAME_EVENT_MULTIPLEXING, raw_event_multiplexing);
if (!get_attr) {
GELOGE(ge::PARAM_INVALID, "[Get][Attr]Node:%s.", node->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to get raw event multiplexing, node:%s.", node->GetName().c_str());
return ge::PARAM_INVALID;
}
auto parse_ret = ParseNodeEventMultiplexing(node, raw_event_multiplexing, node_to_send, node_to_recv);
if (parse_ret != ge::SUCCESS) {
GELOGE(parse_ret, "[Parse][Eventmultiplexing]Node:%s.", node->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to parse node event multiplexing, node:%s.", node->GetName().c_str());
return parse_ret;
}
}
return ge::SUCCESS;
}

std::vector<uint32_t> GetIntersection(std::vector<uint32_t> &a, std::vector<uint32_t> &b) {
std::unordered_set<uint32_t> ele_of_a(a.begin(), a.end());
std::vector<uint32_t> res;
for (auto &ele : b) {
if (ele_of_a.count(ele) > 0) {
res.emplace_back(ele);
}
}
return res;
}
} // namespace } // namespace


namespace ge { namespace ge {
@@ -76,6 +176,7 @@ Status StreamAllocator::AssignLogicalStreams(const std::map<std::string, int> &m


auto gelib = GELib::GetInstance(); auto gelib = GELib::GetInstance();
if (gelib == nullptr) { if (gelib == nullptr) {
REPORT_INNER_ERROR("E19999", "Check GELib instance nullptr");
GELOGE(FAILED, "Get GELib instance failed."); GELOGE(FAILED, "Get GELib instance failed.");
return FAILED; return FAILED;
} }
@@ -149,6 +250,12 @@ Status StreamAllocator::RefreshRealStream(int64_t &stream_num, int64_t &event_nu
return status; return status;
} }


status = RefreshEventsWithReuse();
if (status != SUCCESS) {
GELOGE(status, "[Refresh][Events]RefreshEventsWithReuse failed!");
return status;
}

status = InsertSyncEventNodes(); status = InsertSyncEventNodes();
if (status != SUCCESS) { if (status != SUCCESS) {
GELOGE(status, "InsertSyncEventNode failed!"); GELOGE(status, "InsertSyncEventNode failed!");
@@ -184,6 +291,8 @@ Status StreamAllocator::AssignSingleStream() {
} }


if (stream_num_ > 1) { if (stream_num_ > 1) {
REPORT_INNER_ERROR("E19999", "The number of ts streams is %ld, only one is supported",
stream_num_);
GELOGE(FAILED, "The number of ts streams is %ld, only one is supported.", stream_num_); GELOGE(FAILED, "The number of ts streams is %ld, only one is supported.", stream_num_);
return FAILED; return FAILED;
} }
@@ -257,6 +366,9 @@ Status StreamAllocator::SetActiveStreamsByLabel() {
} }
} }
GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, activated_stream_list), GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, activated_stream_list),
REPORT_INNER_ERROR("E19999", "Set Attr:%s for op:%s(%s) failed",
ATTR_NAME_ACTIVE_STREAM_LIST.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "SetListInt failed."); GELOGE(FAILED, "SetListInt failed.");
return FAILED); return FAILED);
} }
@@ -307,6 +419,9 @@ Status StreamAllocator::SetActiveStreamsForSubgraphs() {
} }


if (!AttrUtils::SetListInt(first_active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { if (!AttrUtils::SetListInt(first_active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s for op:%s(%s) failed",
ATTR_NAME_ACTIVE_STREAM_LIST.c_str(),
first_active_node->GetName().c_str(), first_active_node->GetType().c_str());
GELOGE(FAILED, "Set active streams for node %s failed.", first_active_node->GetName().c_str()); GELOGE(FAILED, "Set active streams for node %s failed.", first_active_node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -376,6 +491,8 @@ Status StreamAllocator::InsertOneEventInTwoNodes(const NodePtr &cur_node, const
} }


if (next_stream_id == kInvalidStream) { if (next_stream_id == kInvalidStream) {
REPORT_INNER_ERROR("E19999", "Stream id of next_node %s(%s) should not be %ld",
next_node->GetName().c_str(), next_node->GetType().c_str(), kInvalidStream);
GELOGE(FAILED, "Stream id of next_node %s should not be %ld", next_node->GetName().c_str(), kInvalidStream); GELOGE(FAILED, "Stream id of next_node %s should not be %ld", next_node->GetName().c_str(), kInvalidStream);
return FAILED; return FAILED;
} }
@@ -589,8 +706,14 @@ Status StreamAllocator::OptimizeByStreamActivate() {
// -> stream(streamSwitch) -> stream(streamActivate) -> stream(stream true or false) // -> stream(streamSwitch) -> stream(streamActivate) -> stream(stream true or false)
// No need to insert an event between node in stream(normal) and node in stream(stream true or false) // No need to insert an event between node in stream(normal) and node in stream(stream true or false)
bool StreamAllocator::IsRecvNodeActivatedBySendNode(const NodePtr &send_node_ptr, const NodePtr &recv_node_ptr) const { bool StreamAllocator::IsRecvNodeActivatedBySendNode(const NodePtr &send_node_ptr, const NodePtr &recv_node_ptr) const {
GE_CHECK_NOTNULL_EXEC(send_node_ptr->GetOpDesc(), GELOGE(FAILED, "op desc is nullptr"); return false);
GE_CHECK_NOTNULL_EXEC(recv_node_ptr->GetOpDesc(), GELOGE(FAILED, "op desc is nullptr"); return false);
GE_CHECK_NOTNULL_EXEC(send_node_ptr->GetOpDesc(),
REPORT_INNER_ERROR("E19999", "Check param send_node_ptr nullptr");
GELOGE(FAILED, "op desc is nullptr");
return false);
GE_CHECK_NOTNULL_EXEC(recv_node_ptr->GetOpDesc(),
REPORT_INNER_ERROR("E19999", "Check param recv_node_ptr nullptr");
GELOGE(FAILED, "op desc is nullptr");
return false);
auto cur_stream_id = send_node_ptr->GetOpDesc()->GetStreamId(); auto cur_stream_id = send_node_ptr->GetOpDesc()->GetStreamId();
if (AttrUtils::HasAttr(recv_node_ptr->GetOpDesc(), ATTR_NAME_STREAM_LABEL)) { if (AttrUtils::HasAttr(recv_node_ptr->GetOpDesc(), ATTR_NAME_STREAM_LABEL)) {
// find streamActivate node // find streamActivate node
@@ -714,6 +837,8 @@ Status StreamAllocator::SplitStreams(vector<set<int64_t>> &split_streams) {
continue; continue;
} }
if (stream_id > last_stream_id) { if (stream_id > last_stream_id) {
REPORT_INNER_ERROR("E19999", "streamid(%ld) > last_stream_id(%ld), check invalid",
stream_id, last_stream_id);
GELOGE(FAILED, "SplitStreams:streamid(%ld) > last_stream_id(%ld)", stream_id, last_stream_id); GELOGE(FAILED, "SplitStreams:streamid(%ld) > last_stream_id(%ld)", stream_id, last_stream_id);
return FAILED; return FAILED;
} }
@@ -727,6 +852,8 @@ Status StreamAllocator::SplitStreams(vector<set<int64_t>> &split_streams) {
stream_continuous_2_node_num_map[continuous_stream_label]++; stream_continuous_2_node_num_map[continuous_stream_label]++;
// return error // return error
if (stream_continuous_2_node_num_map[continuous_stream_label] > max_node_num_one_stream) { if (stream_continuous_2_node_num_map[continuous_stream_label] > max_node_num_one_stream) {
REPORT_INNER_ERROR("E19999", "Check node[%s] stream_id[%ld] continuous stream label[%s] unsatisfied",
op_desc->GetName().c_str(), stream_id, continuous_stream_label.c_str());
GELOGE(FAILED, "SplitStreams:node[%s] stream_id[%ld] continuous stream label[%s] unsatisfied ", GELOGE(FAILED, "SplitStreams:node[%s] stream_id[%ld] continuous stream label[%s] unsatisfied ",
op_desc->GetName().c_str(), stream_id, continuous_stream_label.c_str()); op_desc->GetName().c_str(), stream_id, continuous_stream_label.c_str());
return FAILED; return FAILED;
@@ -881,6 +1008,8 @@ Status StreamAllocator::UpdateActiveStreamsForSwitchNode(NodePtr &switch_node) {
GE_CHECK_NOTNULL(op_desc); GE_CHECK_NOTNULL(op_desc);


if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_ACTIVE_STREAM_LIST, stream_ids)) { if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_ACTIVE_STREAM_LIST, stream_ids)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(),
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "SetListInt failed."); GELOGE(FAILED, "SetListInt failed.");
return FAILED; return FAILED;
} }
@@ -895,6 +1024,8 @@ Status StreamAllocator::InsertActiveNodesAfterSwitch(NodePtr &switch_node, vecto
vector<string> ori_active_label_list; vector<string> ori_active_label_list;
if (!AttrUtils::GetListStr(switch_desc, ATTR_NAME_ACTIVE_LABEL_LIST, ori_active_label_list) || if (!AttrUtils::GetListStr(switch_desc, ATTR_NAME_ACTIVE_LABEL_LIST, ori_active_label_list) ||
ori_active_label_list.empty()) { ori_active_label_list.empty()) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_LABEL_LIST.c_str(),
switch_node->GetName().c_str(), switch_node->GetType().c_str());
GELOGE(INTERNAL_ERROR, "Get active label list of switch %s failed.", switch_node->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Get active label list of switch %s failed.", switch_node->GetName().c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -918,6 +1049,8 @@ Status StreamAllocator::InsertActiveNodesAfterSwitch(NodePtr &switch_node, vecto
for (auto &active_node : added_active_nodes) { for (auto &active_node : added_active_nodes) {
GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor()); GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor());
if (switch_node->GetOutControlAnchor()->LinkTo(active_node->GetInControlAnchor()) != GRAPH_SUCCESS) { if (switch_node->GetOutControlAnchor()->LinkTo(active_node->GetInControlAnchor()) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Link from %s to %s failed",
switch_node->GetName().c_str(), active_node->GetName().c_str());
GELOGE(FAILED, "Link %s to %s failed.", switch_node->GetName().c_str(), active_node->GetName().c_str()); GELOGE(FAILED, "Link %s to %s failed.", switch_node->GetName().c_str(), active_node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -933,6 +1066,8 @@ Status StreamAllocator::UpdateActiveStreamsForActiveNode(const vector<set<int64_
vector<uint32_t> new_active_streams = active_streams; vector<uint32_t> new_active_streams = active_streams;
for (uint32_t logical_stream : active_streams) { for (uint32_t logical_stream : active_streams) {
if (static_cast<size_t>(logical_stream) >= split_streams.size()) { if (static_cast<size_t>(logical_stream) >= split_streams.size()) {
REPORT_INNER_ERROR("E19999", "Check logical stream:%u is out of range:%zu",
logical_stream, split_streams.size());
GELOGE(FAILED, "logical stream is out of range."); GELOGE(FAILED, "logical stream is out of range.");
return FAILED; return FAILED;
} }
@@ -951,6 +1086,8 @@ Status StreamAllocator::UpdateActiveStreamsForActiveNode(const vector<set<int64_
} }
} }
if (!AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, new_active_streams)) { if (!AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, new_active_streams)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Set active streams for node %s failed.", node->GetName().c_str()); GELOGE(FAILED, "Set active streams for node %s failed.", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -991,6 +1128,8 @@ Status StreamAllocator::UpdateActiveStreamsForSubgraphs() const {
new_active_streams.emplace(static_cast<uint32_t>(new_split_stream)); new_active_streams.emplace(static_cast<uint32_t>(new_split_stream));
active_streams.assign(new_active_streams.begin(), new_active_streams.end()); active_streams.assign(new_active_streams.begin(), new_active_streams.end());
if (!AttrUtils::SetListInt(active_op, ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { if (!AttrUtils::SetListInt(active_op, ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(),
active_op->GetName().c_str(), active_op->GetType().c_str());
GELOGE(FAILED, "Set active streams for node %s failed.", active_node->GetName().c_str()); GELOGE(FAILED, "Set active streams for node %s failed.", active_node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -1059,6 +1198,8 @@ Status StreamAllocator::SetActiveStreamsForLoop() {


NodePtr pre_switch_node = FindSwitchNodeBeforeLoopActiveNode(node); NodePtr pre_switch_node = FindSwitchNodeBeforeLoopActiveNode(node);
if (pre_switch_node == nullptr) { if (pre_switch_node == nullptr) {
REPORT_INNER_ERROR("E19999", "Find switch node before loop active node %s fail",
node->GetName().c_str());
GELOGE(FAILED, "find switch node before loop active node %s failed", node->GetName().c_str()); GELOGE(FAILED, "find switch node before loop active node %s failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -1066,6 +1207,9 @@ Status StreamAllocator::SetActiveStreamsForLoop() {
if (!AttrUtils::GetListStr(node->GetOpDesc(), ATTR_NAME_ACTIVE_LABEL_LIST, activated_label_list) || if (!AttrUtils::GetListStr(node->GetOpDesc(), ATTR_NAME_ACTIVE_LABEL_LIST, activated_label_list) ||
activated_label_list.empty()) { activated_label_list.empty()) {
GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, loop_active_streams), GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, loop_active_streams),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)",
ATTR_NAME_ACTIVE_STREAM_LIST.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "SetListInt failed."); GELOGE(FAILED, "SetListInt failed.");
return FAILED); return FAILED);
for (const auto &stream_id : loop_active_streams) { for (const auto &stream_id : loop_active_streams) {
@@ -1112,6 +1256,8 @@ Status StreamAllocator::CheckStreamActived() const {
uint32_t stream_id = static_cast<uint32_t>(node->GetOpDesc()->GetStreamId()); uint32_t stream_id = static_cast<uint32_t>(node->GetOpDesc()->GetStreamId());
auto iter = find(active_streams.begin(), active_streams.end(), stream_id); auto iter = find(active_streams.begin(), active_streams.end(), stream_id);
if (iter != active_streams.end()) { if (iter != active_streams.end()) {
REPORT_INNER_ERROR("E19999", "Node:%s(%s) cannot active its own stream %u, check invalid ",
node->GetName().c_str(), node->GetType().c_str(), stream_id);
GELOGE(FAILED, "Node %s cannot active its own stream %u.", node->GetName().c_str(), stream_id); GELOGE(FAILED, "Node %s cannot active its own stream %u.", node->GetName().c_str(), stream_id);
return FAILED; return FAILED;
} }
@@ -1121,6 +1267,94 @@ Status StreamAllocator::CheckStreamActived() const {
return SUCCESS; return SUCCESS;
} }


Status StreamAllocator::ReuseEvent(bool send_to,
const std::unordered_map<std::string, ge::NodePtr> &name_to_node_map,
const std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_event_id) {
for (const auto &node_event_id : node_to_event_id) {
ge::NodePtr curr_node = node_event_id.first;
NodePtr send_node = send_to ? curr_node : nullptr;
NodePtr recv_node = send_to ? nullptr : curr_node;
for (const auto &event_pair : node_event_id.second) {
auto peer_node_iter = name_to_node_map.find(event_pair.first);
if (peer_node_iter == name_to_node_map.end()) {
GELOGE(PARAM_INVALID, "[Get][Node]Name:%s.", event_pair.first.c_str());
REPORT_INNER_ERROR("E19999", "Failed to find node, name:%s.", event_pair.first.c_str());
return PARAM_INVALID;
}
recv_node = send_to ? peer_node_iter->second : recv_node;
send_node = send_to ? send_node : peer_node_iter->second;
GE_CHECK_NOTNULL(send_node);
GE_CHECK_NOTNULL(recv_node);
auto event_id = GetIntersection(node_to_send_events_[send_node], node_to_recv_events_[recv_node]);
uint32_t new_event = event_pair.second + event_num_;
if (event_id.empty()) {
GELOGI("[Check][Optimized]Send:%s, recv:%s.", send_node->GetName().c_str(), recv_node->GetName().c_str());
continue;
} else if (event_id.size() != 1) {
GELOGW("[Check][Event]More than one event are found between %s and %s, event num:%zu.",
send_node->GetName().c_str(), recv_node->GetName().c_str(), event_id.size());
}
uint32_t old_event = event_id[0];
auto reuse_event_id = [] (vector<uint32_t> &event_list, uint32_t old_event, uint32_t new_event) -> void {
event_list.erase(std::remove(event_list.begin(), event_list.end(), old_event), event_list.end());
event_list.push_back(new_event);
return;
};
reuse_event_id(node_to_send_events_[send_node], old_event, new_event);
reuse_event_id(node_to_recv_events_[recv_node], old_event, new_event);
GELOGI("[Reuse][Event]Replace event successfully, send node:%s, recv node:%s, old id:%u, new id:%u.",
send_node->GetName().c_str(), recv_node->GetName().c_str(), old_event, new_event);
}
}
return ge::SUCCESS;
}

// Refresh events to reuse events
Status StreamAllocator::RefreshEventsWithReuse() {
GELOGI("[Refresh][Events]Refresh events with reuse, stream num:%ld, original event num:%u.", stream_num_, event_num_);
if (event_num_ <= kEventReuseThreshold) {
GELOGI("[Check][ReuseThreshold]Event used num is %u, less than %u, skip reuse.",
event_num_, kEventReuseThreshold);
return SUCCESS;
}
std::unordered_map<std::string, NodePtr> name_to_node_map;
std::unordered_map<NodePtr, std::vector<std::pair<std::string, uint32_t>>> node_to_send;
std::unordered_map<NodePtr, std::vector<std::pair<std::string, uint32_t>>> node_to_recv;
Status ret = ParseAllNodeEventMultiplexing(whole_graph_, name_to_node_map, node_to_send, node_to_recv);
if (ret != SUCCESS) {
GELOGE(ret, "[Parse][AllNodeEventMultiplexing]Graph:%s.", whole_graph_->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to parse all node event multiplexing, graph:%s.",
whole_graph_->GetName().c_str());
return ret;
}
if (node_to_send.empty() && node_to_recv.empty()) {
return SUCCESS;
}

ret = ReuseEvent(true, name_to_node_map, node_to_send);
if (ret != SUCCESS) {
GELOGE(ret, "[Reuse][Event]Phase:Send, graph:%s.", whole_graph_->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to reuse event, phase:Send, graph:%s.", whole_graph_->GetName().c_str());
return ret;
}

ret = ReuseEvent(false, name_to_node_map, node_to_recv);
if (ret != SUCCESS) {
GELOGE(ret, "[Reuse][Event]Phase:Recv, graph:%s.", whole_graph_->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to reuse event, phase:Recv, graph:%s.", whole_graph_->GetName().c_str());
return ret;
}

Status status = RefreshContinuousEvents();
if (status != SUCCESS) {
GELOGE(status, "[Refresh][ContinuousEvents]Graph:%s.", whole_graph_->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to refresh continuous events, graph:%s.", whole_graph_->GetName().c_str());
return status;
}
GELOGI("[Refresh][Events]RefreshEventsWithReuse successfully, event num:%u.", event_num_);
return SUCCESS;
}

// Refresh events to continuous events // Refresh events to continuous events
Status StreamAllocator::RefreshContinuousEvents() { Status StreamAllocator::RefreshContinuousEvents() {
// Establish a mapping relationship from old to new event id // Establish a mapping relationship from old to new event id
@@ -1128,8 +1362,10 @@ Status StreamAllocator::RefreshContinuousEvents() {
uint32_t new_event_id = 0; uint32_t new_event_id = 0;
for (const auto &one_pair : node_to_send_events_) { for (const auto &one_pair : node_to_send_events_) {
for (const auto &event_id : one_pair.second) { for (const auto &event_id : one_pair.second) {
old_to_new_events[event_id] = new_event_id;
new_event_id++;
if (old_to_new_events.find(event_id) == old_to_new_events.end()) {
old_to_new_events[event_id] = new_event_id;
new_event_id++;
}
} }
} }


@@ -1139,6 +1375,7 @@ Status StreamAllocator::RefreshContinuousEvents() {
for (size_t i = 0; i < send_events.size(); i++) { for (size_t i = 0; i < send_events.size(); i++) {
auto find_it = old_to_new_events.find(send_events[i]); auto find_it = old_to_new_events.find(send_events[i]);
if (find_it == old_to_new_events.end()) { if (find_it == old_to_new_events.end()) {
REPORT_INNER_ERROR("E19999", "Check invalid send event %u", send_events[i]);
GELOGE(FAILED, "RefreshContinuousEvents: invalid send event %u", send_events[i]); GELOGE(FAILED, "RefreshContinuousEvents: invalid send event %u", send_events[i]);
return FAILED; return FAILED;
} }
@@ -1152,6 +1389,7 @@ Status StreamAllocator::RefreshContinuousEvents() {
for (size_t i = 0; i < recv_events.size(); i++) { for (size_t i = 0; i < recv_events.size(); i++) {
auto find_it = old_to_new_events.find(recv_events[i]); auto find_it = old_to_new_events.find(recv_events[i]);
if (find_it == old_to_new_events.end()) { if (find_it == old_to_new_events.end()) {
REPORT_INNER_ERROR("E19999", "Check invalid recv event %u", recv_events[i]);
GELOGE(FAILED, "RefreshContinuousEvents: invalid recv event %u", recv_events[i]); GELOGE(FAILED, "RefreshContinuousEvents: invalid recv event %u", recv_events[i]);
return FAILED; return FAILED;
} }
@@ -1166,6 +1404,7 @@ Status StreamAllocator::RefreshContinuousEvents() {


// Insert the real send/recv node in the graph // Insert the real send/recv node in the graph
Status StreamAllocator::InsertSyncEventNodes() { Status StreamAllocator::InsertSyncEventNodes() {
unordered_map<string, uint32_t> sync_event_name;
for (const auto &node : whole_graph_->GetNodes(whole_graph_->GetGraphUnknownFlag())) { for (const auto &node : whole_graph_->GetNodes(whole_graph_->GetGraphUnknownFlag())) {
// Add the node corresponding to the recv event // Add the node corresponding to the recv event
vector<uint32_t> recv_event_id_list; vector<uint32_t> recv_event_id_list;
@@ -1175,12 +1414,23 @@ Status StreamAllocator::InsertSyncEventNodes() {
GE_CHECK_NOTNULL(node->GetOutControlAnchor()); GE_CHECK_NOTNULL(node->GetOutControlAnchor());
for (auto &event_id : recv_event_id_list) { for (auto &event_id : recv_event_id_list) {
string recv_node_name = whole_graph_->GetName() + "_Recv_" + to_string(event_id); string recv_node_name = whole_graph_->GetName() + "_Recv_" + to_string(event_id);
auto iter = sync_event_name.find(recv_node_name);
if (iter == sync_event_name.end()) {
sync_event_name[recv_node_name] = 1;
} else {
recv_node_name = recv_node_name + "_Reuse_" + to_string(iter->second);
++(iter->second);
}
OpDescPtr op_desc_ptr = MakeShared<OpDesc>(recv_node_name, RECV); OpDescPtr op_desc_ptr = MakeShared<OpDesc>(recv_node_name, RECV);
GE_CHECK_NOTNULL(op_desc_ptr); GE_CHECK_NOTNULL(op_desc_ptr);


int64_t temp_stream_id = node->GetOpDesc()->GetStreamId(); int64_t temp_stream_id = node->GetOpDesc()->GetStreamId();
op_desc_ptr->SetStreamId(temp_stream_id); op_desc_ptr->SetStreamId(temp_stream_id);
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(op_desc_ptr, RECV_ATTR_EVENT_ID, event_id), GELOGE(FAILED, "SetInt failed.");
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(op_desc_ptr, RECV_ATTR_EVENT_ID, event_id),
REPORT_INNER_ERROR("E19999", "Set Attr:%s for op:%s(%s) failed, event_id:%u,",
RECV_ATTR_EVENT_ID.c_str(),
node->GetName().c_str(), node->GetType().c_str(), event_id);
GELOGE(FAILED, "SetInt failed.");
return FAILED); return FAILED);
(void)AttrUtils::SetListStr(op_desc_ptr, ATTR_NAME_DATA_DUMP_ORIGIN_OP_NAMES, (void)AttrUtils::SetListStr(op_desc_ptr, ATTR_NAME_DATA_DUMP_ORIGIN_OP_NAMES,
std::move(std::vector<std::string>())); std::move(std::vector<std::string>()));
@@ -1189,6 +1439,8 @@ Status StreamAllocator::InsertSyncEventNodes() {
GE_CHECK_NOTNULL(recv_node->GetOutControlAnchor()); GE_CHECK_NOTNULL(recv_node->GetOutControlAnchor());
Status status = GraphUtils::AddEdge(recv_node->GetOutControlAnchor(), node->GetInControlAnchor()); Status status = GraphUtils::AddEdge(recv_node->GetOutControlAnchor(), node->GetInControlAnchor());
if (status != SUCCESS) { if (status != SUCCESS) {
REPORT_INNER_ERROR("E19999", "Add edge from node %s to node %s failed",
recv_node->GetName().c_str(), node->GetName().c_str());
GELOGE(status, "Add edge for node %s and node %s failed.", recv_node->GetName().c_str(), GELOGE(status, "Add edge for node %s and node %s failed.", recv_node->GetName().c_str(),
node->GetName().c_str()); node->GetName().c_str());
return status; return status;
@@ -1203,6 +1455,13 @@ Status StreamAllocator::InsertSyncEventNodes() {


for (auto &event_id : send_event_id_list) { for (auto &event_id : send_event_id_list) {
string send_node_name = whole_graph_->GetName() + "_Send_" + to_string(event_id); string send_node_name = whole_graph_->GetName() + "_Send_" + to_string(event_id);
auto iter = sync_event_name.find(send_node_name);
if (iter == sync_event_name.end()) {
sync_event_name[send_node_name] = 1;
} else {
send_node_name = send_node_name + "_Reuse_" + to_string(iter->second);
++(iter->second);
}
OpDescPtr op_desc_ptr = MakeShared<OpDesc>(send_node_name, SEND); OpDescPtr op_desc_ptr = MakeShared<OpDesc>(send_node_name, SEND);
GE_CHECK_NOTNULL(op_desc_ptr); GE_CHECK_NOTNULL(op_desc_ptr);


@@ -1217,6 +1476,8 @@ Status StreamAllocator::InsertSyncEventNodes() {
GE_CHECK_NOTNULL(send_node->GetInControlAnchor()); GE_CHECK_NOTNULL(send_node->GetInControlAnchor());
Status status = GraphUtils::AddEdge(node->GetOutControlAnchor(), send_node->GetInControlAnchor()); Status status = GraphUtils::AddEdge(node->GetOutControlAnchor(), send_node->GetInControlAnchor());
if (status != SUCCESS) { if (status != SUCCESS) {
REPORT_INNER_ERROR("E19999", "Add edge from node %s to node %s failed",
node->GetName().c_str(), send_node->GetName().c_str());
GELOGE(status, "Add edge for node %s and node %s failed.", node->GetName().c_str(), GELOGE(status, "Add edge for node %s and node %s failed.", node->GetName().c_str(),
send_node->GetName().c_str()); send_node->GetName().c_str());
return status; return status;
@@ -1228,6 +1489,8 @@ Status StreamAllocator::InsertSyncEventNodes() {


Status status = whole_graph_->InsertGraphEvents(); Status status = whole_graph_->InsertGraphEvents();
if (status != SUCCESS) { if (status != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Insert Graph Events fail, graph:%s,",
whole_graph_->GetName().c_str());
GELOGE(status, "Graph ReorderEventNodes failed"); GELOGE(status, "Graph ReorderEventNodes failed");
return status; return status;
} }
@@ -1248,12 +1511,16 @@ void StreamAllocator::DumpEvents() {
GELOGD("After RefreshRealStream: stream %ld.", stream_id); GELOGD("After RefreshRealStream: stream %ld.", stream_id);


for (const auto &node : one_pair.second) { for (const auto &node : one_pair.second) {
if (node == nullptr || node->GetOpDesc() == nullptr) {
continue;
}
string send_event_str; string send_event_str;
for (const auto &send_event_id : node_to_send_events_[node]) { for (const auto &send_event_id : node_to_send_events_[node]) {
send_event_str += " " + to_string(send_event_id); send_event_str += " " + to_string(send_event_id);
} }
if (!send_event_str.empty()) { if (!send_event_str.empty()) {
GELOGI("node: %s, send events: %s", node->GetName().c_str(), send_event_str.c_str());
GELOGI("node: %s, id: %ld, stream id :%ld, send events: %s.", node->GetName().c_str(),
node->GetOpDesc()->GetId(), node->GetOpDesc()->GetStreamId(), send_event_str.c_str());
} }


string recv_event_str; string recv_event_str;
@@ -1261,7 +1528,8 @@ void StreamAllocator::DumpEvents() {
recv_event_str += " " + to_string(recv_event_id); recv_event_str += " " + to_string(recv_event_id);
} }
if (!recv_event_str.empty()) { if (!recv_event_str.empty()) {
GELOGI("node: %s, recv events: %s", node->GetName().c_str(), recv_event_str.c_str());
GELOGI("node: %s, id: %ld, stream id :%ld, recv events: %s.", node->GetName().c_str(),
node->GetOpDesc()->GetId(), node->GetOpDesc()->GetStreamId(), recv_event_str.c_str());
} }
} }
} }
@@ -1274,6 +1542,8 @@ Status StreamAllocator::GetMaxStreamAndTask(bool huge_stream, uint32_t &max_stre
} }
rtError_t ret = rtGetMaxStreamAndTask(stream_type, &max_stream_count, &max_task_count); rtError_t ret = rtGetMaxStreamAndTask(stream_type, &max_stream_count, &max_task_count);
if (ret != RT_ERROR_NONE) { if (ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "call rtGetMaxStreamAndTask fail, ret:%d, stream_type:%u,",
static_cast<int>(ret), stream_type);
GELOGE(FAILED, "Get max stream and task count by rts failed."); GELOGE(FAILED, "Get max stream and task count by rts failed.");
return FAILED; return FAILED;
} }
@@ -1416,6 +1686,7 @@ Status StreamAllocator::AddActiveNodes(NodePtr &switch_node, const vector<string
for (size_t i = 0; i < label_num; i++) { for (size_t i = 0; i < label_num; i++) {
const string &active_label = ori_active_label_list[i]; const string &active_label = ori_active_label_list[i];
if (labeled_streams_.find(active_label) == labeled_streams_.end()) { if (labeled_streams_.find(active_label) == labeled_streams_.end()) {
REPORT_INNER_ERROR("E19999", "can not find stream label:%s", active_label.c_str());
GELOGE(FAILED, "can not find stream label %s", active_label.c_str()); GELOGE(FAILED, "can not find stream label %s", active_label.c_str());
return FAILED; return FAILED;
} }
@@ -1442,11 +1713,15 @@ Status StreamAllocator::AddActiveNodes(NodePtr &switch_node, const vector<string
} }
GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor()); GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor());
if (switch_node->GetOutControlAnchor()->Unlink(node->GetInControlAnchor()) != GRAPH_SUCCESS) { if (switch_node->GetOutControlAnchor()->Unlink(node->GetInControlAnchor()) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Unlink %s to %s failed",
switch_node->GetName().c_str(), node->GetName().c_str());
GELOGE(FAILED, "Unlink %s to %s failed.", switch_node->GetName().c_str(), node->GetName().c_str()); GELOGE(FAILED, "Unlink %s to %s failed.", switch_node->GetName().c_str(), node->GetName().c_str());
return FAILED; return FAILED;
} }
GE_CHECK_NOTNULL(active_node->GetOutControlAnchor()); GE_CHECK_NOTNULL(active_node->GetOutControlAnchor());
if (active_node->GetOutControlAnchor()->LinkTo(node->GetInControlAnchor()) != GRAPH_SUCCESS) { if (active_node->GetOutControlAnchor()->LinkTo(node->GetInControlAnchor()) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Link %s to %s failed",
active_node->GetName().c_str(), node->GetName().c_str());
GELOGE(FAILED, "Link %s to %s failed.", active_node->GetName().c_str(), node->GetName().c_str()); GELOGE(FAILED, "Link %s to %s failed.", active_node->GetName().c_str(), node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -1477,12 +1752,15 @@ Status StreamAllocator::AddActiveNodes(NodePtr &switch_node, const vector<string


Status StreamAllocator::SetActiveStreamList(NodePtr &active_node, const string &active_label) { Status StreamAllocator::SetActiveStreamList(NodePtr &active_node, const string &active_label) {
if (labeled_streams_.find(active_label) == labeled_streams_.end()) { if (labeled_streams_.find(active_label) == labeled_streams_.end()) {
REPORT_INNER_ERROR("E19999", "Can not find stream label:%s", active_label.c_str());
GELOGE(FAILED, "Can not find stream label %s.", active_label.c_str()); GELOGE(FAILED, "Can not find stream label %s.", active_label.c_str());
return FAILED; return FAILED;
} }
set<int64_t> &streams = labeled_streams_[active_label]; set<int64_t> &streams = labeled_streams_[active_label];
vector<int64_t> active_streams(streams.begin(), streams.end()); vector<int64_t> active_streams(streams.begin(), streams.end());
if (!AttrUtils::SetListInt(active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { if (!AttrUtils::SetListInt(active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(),
active_node->GetName().c_str(), active_node->GetType().c_str());
GELOGE(FAILED, "SetListInt of %s failed.", ATTR_NAME_ACTIVE_STREAM_LIST.c_str()); GELOGE(FAILED, "SetListInt of %s failed.", ATTR_NAME_ACTIVE_STREAM_LIST.c_str());
return FAILED; return FAILED;
} }


+ 4
- 0
ge/graph/build/stream_allocator.h View File

@@ -71,6 +71,10 @@ class StreamAllocator {
Status SetActiveStreamsForLoop(); Status SetActiveStreamsForLoop();
Status CheckStreamActived() const; Status CheckStreamActived() const;


Status ReuseEvent(bool send_to,
const std::unordered_map<std::string, ge::NodePtr> &name_to_node_map,
const std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_event_id);
Status RefreshEventsWithReuse();
Status RefreshContinuousEvents(); Status RefreshContinuousEvents();


Status InsertSyncEventNodes(); Status InsertSyncEventNodes();


+ 11
- 2
ge/graph/build/stream_graph_optimizer.cc View File

@@ -14,6 +14,9 @@
* limitations under the License. * limitations under the License.
*/ */
#include "stream_graph_optimizer.h" #include "stream_graph_optimizer.h"

#include <securec.h>

#include "common/util.h" #include "common/util.h"
#include "framework/common/debug/ge_log.h" #include "framework/common/debug/ge_log.h"
#include "graph/utils/node_utils.h" #include "graph/utils/node_utils.h"
@@ -122,13 +125,16 @@ Status StreamGraphOptimizer::OptimizeStreamedSubGraph(const ComputeGraphPtr &com
GE_CHECK_NOTNULL(op_desc); GE_CHECK_NOTNULL(op_desc);
int64_t stream_id = op_desc->GetStreamId(); int64_t stream_id = op_desc->GetStreamId();
if (static_cast<size_t>(stream_id) >= run_context.graphStreamList.size()) { if (static_cast<size_t>(stream_id) >= run_context.graphStreamList.size()) {
REPORT_INNER_ERROR("E19999", "Check stream_id:%ld in op:%s(%s) is bigger than "
"run_context.graphStreamList.size():%zu", stream_id, op_desc->GetName().c_str(),
op_desc->GetType().c_str(), run_context.graphStreamList.size());
GELOGE(FAILED, "stream_id %ld is bigger than run_context.graphStreamList.size() %zu", stream_id, GELOGE(FAILED, "stream_id %ld is bigger than run_context.graphStreamList.size() %zu", stream_id,
run_context.graphStreamList.size()); run_context.graphStreamList.size());
return FAILED; return FAILED;
} }
run_context.stream = run_context.graphStreamList[stream_id]; run_context.stream = run_context.graphStreamList[stream_id];
std::string batch_label;
(void)AttrUtils::GetStr(subgraph, ATTR_NAME_BATCH_LABEL, batch_label);
std::string batch_label;
(void)AttrUtils::GetStr(subgraph, ATTR_NAME_BATCH_LABEL, batch_label);
GELOGD("Subgraph has same stream id, subgraph: %s, engine_name: %s, stream_id: %ld, rtstream: %lu, " GELOGD("Subgraph has same stream id, subgraph: %s, engine_name: %s, stream_id: %ld, rtstream: %lu, "
"batch_label: %s", subgraph->GetName().c_str(), engine_name.c_str(), stream_id, "batch_label: %s", subgraph->GetName().c_str(), engine_name.c_str(), stream_id,
static_cast<uint64_t>(reinterpret_cast<uintptr_t>(run_context.stream)), batch_label.c_str()); static_cast<uint64_t>(reinterpret_cast<uintptr_t>(run_context.stream)), batch_label.c_str());
@@ -136,6 +142,9 @@ Status StreamGraphOptimizer::OptimizeStreamedSubGraph(const ComputeGraphPtr &com
GE_CHECK_NOTNULL(*iter); GE_CHECK_NOTNULL(*iter);
Status ret = (*iter)->OptimizeStreamGraph(*subgraph, run_context); Status ret = (*iter)->OptimizeStreamGraph(*subgraph, run_context);
if (ret != SUCCESS) { if (ret != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call optimize streamed subgraph failed, subgraph: %s, engine_name: %s, graph "
"Optimizer num: %zu, ret: %u", subgraph->GetName().c_str(), engine_name.c_str(),
graph_optimizers.size(), ret);
GELOGE( GELOGE(
ret, ret,
"[optimizeStreamedSubGraph]: optimize streamed subgraph failed, subgraph: %s, engine_name: %s, graph " "[optimizeStreamedSubGraph]: optimize streamed subgraph failed, subgraph: %s, engine_name: %s, graph "


+ 84
- 7
ge/graph/build/task_generator.cc View File

@@ -49,6 +49,7 @@ const char *const kIsLastNode = "is_last_node";
const char *const kIsInputVar = "INPUT_IS_VAR"; const char *const kIsInputVar = "INPUT_IS_VAR";
const char *const kIsOutputVar = "OUTPUT_IS_VAR"; const char *const kIsOutputVar = "OUTPUT_IS_VAR";
const char *const kProfilingMode = "PROFILING_MODE"; const char *const kProfilingMode = "PROFILING_MODE";
const char *const kIteratorV2 = "IteratorV2";
const uint32_t kProfilingArStep = 2; const uint32_t kProfilingArStep = 2;
const uint64_t kProfilingFpStartLogid = 1; const uint64_t kProfilingFpStartLogid = 1;
const uint64_t kProfilingBpEndLogid = 2; const uint64_t kProfilingBpEndLogid = 2;
@@ -57,6 +58,7 @@ const uint64_t kProfilingArEndLogid = 4;
const uint64_t kProfilingIterEndLogid = 65535; const uint64_t kProfilingIterEndLogid = 65535;
const int64_t kHashFactor = 100000; const int64_t kHashFactor = 100000;
const int64_t kInvalidGroupId = -1; const int64_t kInvalidGroupId = -1;
const std::set<std::string> kFpNodeTypes = {ge::DATA, ge::GETNEXT, kIteratorV2};
} // namespace } // namespace
namespace ge { namespace ge {
TaskGenerator::TaskGenerator(uint8_t *var_mem_base, uint64_t var_mem_size) { TaskGenerator::TaskGenerator(uint8_t *var_mem_base, uint64_t var_mem_size) {
@@ -69,6 +71,7 @@ Status TaskGenerator::GetTaskInfo(Model &model, ComputeGraphPtr &graph, uint64_t
GELOGD("Begin to Get TaskInfo. session_id=%lu", session_id); GELOGD("Begin to Get TaskInfo. session_id=%lu", session_id);
// Check params // Check params
if (graph == nullptr) { if (graph == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param graph is null, session_id:%lu", session_id);
GELOGE(PARAM_INVALID, "GetTaskInfo param graph is null. session_id=%lu", session_id); GELOGE(PARAM_INVALID, "GetTaskInfo param graph is null. session_id=%lu", session_id);
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -93,6 +96,8 @@ Status TaskGenerator::GetTaskInfo(Model &model, ComputeGraphPtr &graph, uint64_t
op_name.push_back(iter.second); op_name.push_back(iter.second);
} }
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(model, ATTR_MODEL_TASK_INDEX_OP_NAME, op_name), GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(model, ATTR_MODEL_TASK_INDEX_OP_NAME, op_name),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s",
ATTR_MODEL_TASK_INDEX_OP_NAME.c_str(), model.GetName().c_str());
GELOGE(FAILED, "SetListStr failed."); GELOGE(FAILED, "SetListStr failed.");
return FAILED); return FAILED);


@@ -106,6 +111,8 @@ Status TaskGenerator::GetTaskInfo(Model &model, ComputeGraphPtr &graph, uint64_t
for (const TaskDef &task_def_temp : task_def_list) { for (const TaskDef &task_def_temp : task_def_list) {
TaskDef *task_def = model_task_def.add_task(); TaskDef *task_def = model_task_def.add_task();
if (task_def == nullptr) { if (task_def == nullptr) {
REPORT_INNER_ERROR("E19999", "Add task_def in ModelTaskDef fail, session_id:%lu, graph:%s, model:%s",
session_id, graph->GetName().c_str(), model.GetName().c_str());
GELOGE(FAILED, "task_def is nullptr."); GELOGE(FAILED, "task_def is nullptr.");
return FAILED; return FAILED;
} }
@@ -126,30 +133,44 @@ Status TaskGenerator::AddModelTaskToModel(const ModelTaskDef &model_task_def, ui
RunContext &run_context) { RunContext &run_context) {
GE_CHK_BOOL_EXEC( GE_CHK_BOOL_EXEC(
AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_BASE_ADDR, reinterpret_cast<uintptr_t>(run_context.dataMemBase)), AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_BASE_ADDR, reinterpret_cast<uintptr_t>(run_context.dataMemBase)),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s",
MODEL_ATTR_TASK_GEN_BASE_ADDR.c_str(), model.GetName().c_str());
GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_BASE_ADDR failed."); GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_BASE_ADDR failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC( GE_CHK_BOOL_EXEC(
AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_WEIGHT_ADDR, reinterpret_cast<uintptr_t>(run_context.weightMemBase)), AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_WEIGHT_ADDR, reinterpret_cast<uintptr_t>(run_context.weightMemBase)),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s",
MODEL_ATTR_TASK_GEN_WEIGHT_ADDR.c_str(), model.GetName().c_str());
GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_WEIGHT_ADDR failed."); GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_WEIGHT_ADDR failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_TASK_GEN_VAR_ADDR, reinterpret_cast<uintptr_t>(var_mem_base_)), GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_TASK_GEN_VAR_ADDR, reinterpret_cast<uintptr_t>(var_mem_base_)),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s",
ATTR_MODEL_TASK_GEN_VAR_ADDR.c_str(), model.GetName().c_str());
GELOGE(FAILED, "SetInt ATTR_MODEL_TASK_GEN_VAR_ADDR failed."); GELOGE(FAILED, "SetInt ATTR_MODEL_TASK_GEN_VAR_ADDR failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_VAR_SIZE, var_mem_size_), GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_VAR_SIZE, var_mem_size_),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s",
ATTR_MODEL_VAR_SIZE.c_str(), model.GetName().c_str());
GELOGE(FAILED, "SetInt ATTR_MODEL_VAR_SIZE failed."); GELOGE(FAILED, "SetInt ATTR_MODEL_VAR_SIZE failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, MODEL_ATTR_SESSION_ID, session_id), GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, MODEL_ATTR_SESSION_ID, session_id),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for mode:%s",
MODEL_ATTR_SESSION_ID.c_str(), model.GetName().c_str());
GELOGE(FAILED, "SetInt MODEL_ATTR_SESSION_ID failed."); GELOGE(FAILED, "SetInt MODEL_ATTR_SESSION_ID failed.");
return FAILED); return FAILED);


size_t task_size = model_task_def.ByteSizeLong(); size_t task_size = model_task_def.ByteSizeLong();
ge::Buffer serial_buff(task_size); ge::Buffer serial_buff(task_size);
if (!model_task_def.SerializePartialToArray(serial_buff.GetData(), static_cast<int>(task_size))) { if (!model_task_def.SerializePartialToArray(serial_buff.GetData(), static_cast<int>(task_size))) {
REPORT_INNER_ERROR("E19999", "model_task_def's serialize failed, model name = %s, task_size=%zu",
model.GetName().c_str(), task_size);
GELOGE(FAILED, "model_task_def's serialize failed, model name = %s, task_size=%zu.", model.GetName().c_str(), GELOGE(FAILED, "model_task_def's serialize failed, model name = %s, task_size=%zu.", model.GetName().c_str(),
task_size); task_size);
return FAILED; return FAILED;
} }
if (!AttrUtils::SetZeroCopyBytes(model, MODEL_ATTR_TASKS, std::move(serial_buff))) { if (!AttrUtils::SetZeroCopyBytes(model, MODEL_ATTR_TASKS, std::move(serial_buff))) {
REPORT_INNER_ERROR("E19999", "Set model task to model failed, model name = %s, task_size=%zu",
model.GetName().c_str(), task_size);
GELOGE(FAILED, "Set model task to model failed, model name = %s, task_size=%zu.", model.GetName().c_str(), GELOGE(FAILED, "Set model task to model failed, model name = %s, task_size=%zu.", model.GetName().c_str(),
task_size); task_size);
return FAILED; return FAILED;
@@ -167,7 +188,10 @@ Status TaskGenerator::UpdateOpIsVarAttr(const OpDescPtr &op_desc, uint64_t sessi
for (int64_t input : input_offsets) { for (int64_t input : input_offsets) {
input_var.push_back(VarManager::Instance(session_id)->IsVarAddr(input)); input_var.push_back(VarManager::Instance(session_id)->IsVarAddr(input));
} }
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsInputVar, input_var), GELOGE(FAILED, "SetListBool failed.");
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsInputVar, input_var),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsInputVar,
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "SetListBool failed.");
return FAILED); return FAILED);
} }


@@ -177,7 +201,10 @@ Status TaskGenerator::UpdateOpIsVarAttr(const OpDescPtr &op_desc, uint64_t sessi
for (int64_t output : output_offsets) { for (int64_t output : output_offsets) {
output_var.push_back(VarManager::Instance(session_id)->IsVarAddr(output)); output_var.push_back(VarManager::Instance(session_id)->IsVarAddr(output));
} }
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsOutputVar, output_var), GELOGE(FAILED, "SetListBool failed.");
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsOutputVar, output_var),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsOutputVar,
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "SetListBool failed.");
return FAILED); return FAILED);
} }
return SUCCESS; return SUCCESS;
@@ -252,6 +279,7 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra
GELOGD("Beign to generate task, graph name is %s.", graph->GetName().c_str()); GELOGD("Beign to generate task, graph name is %s.", graph->GetName().c_str());
std::shared_ptr<GELib> ge_lib = GELib::GetInstance(); std::shared_ptr<GELib> ge_lib = GELib::GetInstance();
if ((ge_lib == nullptr) || !ge_lib->InitFlag()) { if ((ge_lib == nullptr) || !ge_lib->InitFlag()) {
REPORT_INNER_ERROR("E19999", "Check GELib instance not init before");
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GenerateTask failed."); GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GenerateTask failed.");
return GE_CLI_GE_NOT_INITIALIZED; return GE_CLI_GE_NOT_INITIALIZED;
} }
@@ -319,6 +347,8 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra
} }
auto kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name); auto kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name);
if (kernel_info_store == nullptr) { if (kernel_info_store == nullptr) {
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s",
node->GetName().c_str(), node->GetType().c_str(), op_kernel_lib_name.c_str());
GELOGE(INTERNAL_ERROR, GELOGE(INTERNAL_ERROR,
"No ops kernel store or ops kernel builder found. node:%s(%s), op_kernel_lib_name=%s.", "No ops kernel store or ops kernel builder found. node:%s(%s), op_kernel_lib_name=%s.",
name.c_str(), name.c_str(),
@@ -344,6 +374,8 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra
auto ret = OpsKernelBuilderManager::Instance().GenerateTask(*node, run_context, task_def_list); auto ret = OpsKernelBuilderManager::Instance().GenerateTask(*node, run_context, task_def_list);
GE_TIMESTAMP_ADD(GenerateTask); GE_TIMESTAMP_ADD(GenerateTask);
if (ret != SUCCESS) { if (ret != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call OpsKernelBuilderManager GenerateTask fail for op:%s(%s)",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(ret, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task failed.", GELOGE(ret, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task failed.",
op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id); op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id);
return ret; return ret;
@@ -353,6 +385,9 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra
size_t task_list_size_after = task_def_list.size(); size_t task_list_size_after = task_def_list.size();
// If tasks is reduced // If tasks is reduced
if (task_list_size_after < task_list_size_before) { if (task_list_size_after < task_list_size_before) {
REPORT_INNER_ERROR("E19999", "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task "
"but task num from %zu to %zu, check invalid", op_kernel_lib_name.c_str(), name.c_str(),
type.c_str(), op_id, stream_id, task_list_size_before, task_list_size_after);
GELOGE(FAILED, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task. but task num from %zu to %zu.", GELOGE(FAILED, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task. but task num from %zu to %zu.",
op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id, task_list_size_before, op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id, task_list_size_before,
task_list_size_after); task_list_size_after);
@@ -417,6 +452,9 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info
size_t task_list_size_before = task_def_list.size(); size_t task_list_size_before = task_def_list.size();
OpsKernelInfoStorePtr kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name); OpsKernelInfoStorePtr kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name);
if (kernel_info_store == nullptr) { if (kernel_info_store == nullptr) {
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s",
op_desc->GetName().c_str(), op_desc->GetType().c_str(),
op_kernel_lib_name.c_str());
GELOGE(INTERNAL_ERROR, GELOGE(INTERNAL_ERROR,
"Fusion: No ops kernel store or ops kernel builder found. fusion_node:%s(%s), op_kernel_lib_name=%s.", "Fusion: No ops kernel store or ops kernel builder found. fusion_node:%s(%s), op_kernel_lib_name=%s.",
fusion_node_name.c_str(), fusion_node_type.c_str(), op_kernel_lib_name.c_str()); fusion_node_name.c_str(), fusion_node_type.c_str(), op_kernel_lib_name.c_str());
@@ -433,6 +471,9 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info
int64_t op_id = op_desc->GetId(); int64_t op_id = op_desc->GetId();
int64_t stream_id = op_desc->GetStreamId(); int64_t stream_id = op_desc->GetStreamId();
if (stream_id < 0 || stream_id >= (int64_t)run_context.graphStreamList.size()) { if (stream_id < 0 || stream_id >= (int64_t)run_context.graphStreamList.size()) {
REPORT_INNER_ERROR("E19999", "Fusion: fusion_node[name:%s(%s), id:%ld] stream id is invalid, "
"stream list size=%zu", fusion_node_name.c_str(), fusion_node_type.c_str(),
op_id, run_context.graphStreamList.size());
GELOGE(INTERNAL_ERROR, "Fusion: fusion_node[name:%s(%s), id:%ld] stream id is invalid, stream list size=%zu", GELOGE(INTERNAL_ERROR, "Fusion: fusion_node[name:%s(%s), id:%ld] stream id is invalid, stream list size=%zu",
fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, run_context.graphStreamList.size()); fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, run_context.graphStreamList.size());
return INTERNAL_ERROR; return INTERNAL_ERROR;
@@ -444,6 +485,9 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info
op_kernel_lib_name.c_str(), fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, stream_id); op_kernel_lib_name.c_str(), fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, stream_id);
ret = OpsKernelBuilderManager::Instance().GenerateTask(*fusion_node, run_context, task_def_list); ret = OpsKernelBuilderManager::Instance().GenerateTask(*fusion_node, run_context, task_def_list);
if (ret != SUCCESS) { if (ret != SUCCESS) {
REPORT_CALL_ERROR("E19999", " Call %s to generate fusion_node:[fusion_node_name:%s(%s), "
"id:%ld, stream_id:%ld] task failed", op_kernel_lib_name.c_str(),
fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, stream_id);
GELOGE(ret, GELOGE(ret,
"Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), " "Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), "
"id:%ld, stream_id:%ld] task failed.", "id:%ld, stream_id:%ld] task failed.",
@@ -455,6 +499,10 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info
size_t task_list_size_after = task_def_list.size(); size_t task_list_size_after = task_def_list.size();
// if tasks is reduced // if tasks is reduced
if (task_list_size_after < task_list_size_before) { if (task_list_size_after < task_list_size_before) {
REPORT_INNER_ERROR("E19999", "InsertProfilingTask for fusion_node:[fusion_node_name:%s(%s), kernel_name:%s"
"id:%ld, stream_id:%ld] task, but task num from %zu to %zu, check invalid",
fusion_node_name.c_str(), fusion_node_type.c_str(), op_kernel_lib_name.c_str(),
op_id, stream_id, task_list_size_before, task_list_size_after);
GELOGE(FAILED, GELOGE(FAILED,
"Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), " "Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), "
"id:%ld, stream_id:%ld] task. but task num from %zu to %zu.", "id:%ld, stream_id:%ld] task. but task num from %zu to %zu.",
@@ -489,6 +537,8 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info


Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) { Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) {
if (NodeUtils::SetAllAnchorStatus(node) != GRAPH_SUCCESS) { if (NodeUtils::SetAllAnchorStatus(node) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "SetAllAnchorStatus fail for op:%s(%s)",
node->GetName().c_str(), node->GetType().c_str());
GELOGE(INTERNAL_ERROR, "NodeUtils::SetAllAnchorStatus failed."); GELOGE(INTERNAL_ERROR, "NodeUtils::SetAllAnchorStatus failed.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -496,6 +546,8 @@ Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) {
auto peer_anchor = anchor->GetPeerOutAnchor(); auto peer_anchor = anchor->GetPeerOutAnchor();
if (peer_anchor == nullptr) { if (peer_anchor == nullptr) {
if (AnchorUtils::SetStatus(anchor, ANCHOR_SUSPEND) != GRAPH_SUCCESS) { if (AnchorUtils::SetStatus(anchor, ANCHOR_SUSPEND) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Set in peer anchor status fail for op:%s(%s), anchor_index:%d,",
node->GetName().c_str(), node->GetType().c_str(), anchor->GetIdx());
GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -506,11 +558,15 @@ Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) {
bool is_const = NodeUtils::GetConstOpType(peer_anchor->GetOwnerNode(), const_type); bool is_const = NodeUtils::GetConstOpType(peer_anchor->GetOwnerNode(), const_type);
if (is_const && (const_type == CONSTANT)) { if (is_const && (const_type == CONSTANT)) {
if (AnchorUtils::SetStatus(anchor, ANCHOR_CONST) != GRAPH_SUCCESS) { if (AnchorUtils::SetStatus(anchor, ANCHOR_CONST) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Set in anchor CONST status fail for op:%s(%s), anchor_index:%d,",
node->GetName().c_str(), node->GetType().c_str(), anchor->GetIdx());
GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
} else { } else {
if (AnchorUtils::SetStatus(anchor, ANCHOR_DATA) != GRAPH_SUCCESS) { if (AnchorUtils::SetStatus(anchor, ANCHOR_DATA) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Set in anchor DATA status fail for op:%s(%s), anchor_index:%d,",
node->GetName().c_str(), node->GetType().c_str(), anchor->GetIdx());
GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -523,12 +579,15 @@ Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) {
Status TaskGenerator::MarkNodeAndSetIndex(ComputeGraphPtr &graph) { Status TaskGenerator::MarkNodeAndSetIndex(ComputeGraphPtr &graph) {
auto ge_lib = GELib::GetInstance(); auto ge_lib = GELib::GetInstance();
if ((ge_lib == nullptr) || !ge_lib->InitFlag()) { if ((ge_lib == nullptr) || !ge_lib->InitFlag()) {
REPORT_INNER_ERROR("E19999", "Check GELib instance not init before");
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized or is finalized."); GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized or is finalized.");
return GE_CLI_GE_NOT_INITIALIZED; return GE_CLI_GE_NOT_INITIALIZED;
} }


const auto all_nodes = graph->GetNodes(graph->GetGraphUnknownFlag()); const auto all_nodes = graph->GetNodes(graph->GetGraphUnknownFlag());
if (all_nodes.empty()) { if (all_nodes.empty()) {
REPORT_INNER_ERROR("E19999", "Check param all_nodes empty in graph:%s",
graph->GetName().c_str());
GELOGE(GE_GRAPH_GRAPH_NODE_NULL, "Graph's node is empty"); GELOGE(GE_GRAPH_GRAPH_NODE_NULL, "Graph's node is empty");
return GE_GRAPH_GRAPH_NODE_NULL; return GE_GRAPH_GRAPH_NODE_NULL;
} }
@@ -584,6 +643,9 @@ Status TaskGenerator::MarkFirstAndLastOps(const vector<OpDescPtr> &ops, bool is_
for (auto &op_desc : continuous_ops) { for (auto &op_desc : continuous_ops) {
string op_kernel_lib_name = op_desc->GetOpKernelLibName(); string op_kernel_lib_name = op_desc->GetOpKernelLibName();
if (op_kernel_lib_name.empty()) { if (op_kernel_lib_name.empty()) {
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s",
op_desc->GetName().c_str(), op_desc->GetType().c_str(),
op_kernel_lib_name.c_str());
GELOGE(INTERNAL_ERROR, "node:%s(%s) get op kernel lib failed.", op_desc->GetName().c_str(), GELOGE(INTERNAL_ERROR, "node:%s(%s) get op kernel lib failed.", op_desc->GetName().c_str(),
op_desc->GetType().c_str()); op_desc->GetType().c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
@@ -599,9 +661,15 @@ Status TaskGenerator::MarkFirstAndLastOps(const vector<OpDescPtr> &ops, bool is_


for (auto &it : first_and_last_ops) { for (auto &it : first_and_last_ops) {
auto &op_pair = it.second; auto &op_pair = it.second;
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.first, kIsFirstNode, true), GELOGE(FAILED, "SetBool failed.");
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.first, kIsFirstNode, true),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsFirstNode,
op_pair.first->GetName().c_str(), op_pair.first->GetType().c_str());
GELOGE(FAILED, "SetBool failed.");
return FAILED); return FAILED);
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.second, kIsLastNode, true), GELOGE(FAILED, "SetBool failed.");
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.second, kIsLastNode, true),
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsLastNode,
op_pair.second->GetName().c_str(), op_pair.second->GetType().c_str());
GELOGE(FAILED, "SetBool failed.");
return FAILED); return FAILED);
} }
} }
@@ -621,8 +689,10 @@ Status TaskGenerator::AutoFindFpOpIndex(const ComputeGraphPtr &graph, ProfilingP
if (op_kernel_lib_name.empty()) { if (op_kernel_lib_name.empty()) {
continue; continue;
} }

if (op_desc->GetType() == GETNEXT || op_desc->GetType() == DATA) {
auto type = op_desc->GetType();
std::string original_type;
(void)AttrUtils::GetStr(op_desc, ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE, original_type);
if (kFpNodeTypes.find(type) != kFpNodeTypes.end() || kFpNodeTypes.find(original_type) != kFpNodeTypes.end()) {
auto out_anchor = node->GetOutDataAnchor(0); auto out_anchor = node->GetOutDataAnchor(0);
for (auto &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) { for (auto &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) {
GE_CHECK_NOTNULL(peer_in_anchor); GE_CHECK_NOTNULL(peer_in_anchor);
@@ -723,7 +793,9 @@ uint32_t TaskGenerator::FindLastBpFromBpNode(const ComputeGraphPtr &graph, const
GELOGI("bp_op_desc is %s, id is %ld", bp_op_desc->GetName().c_str(), bp_op_desc->GetId()); GELOGI("bp_op_desc is %s, id is %ld", bp_op_desc->GetName().c_str(), bp_op_desc->GetId());
} }


GE_CHECK_NOTNULL(bp_op_desc);
if (bp_op_desc == nullptr) {
return last_bp;
}
uint32_t current_idx = 0; uint32_t current_idx = 0;
for (auto &node : graph->GetNodes(graph->GetGraphUnknownFlag())) { for (auto &node : graph->GetNodes(graph->GetGraphUnknownFlag())) {
OpDescPtr op_desc = node->GetOpDesc(); OpDescPtr op_desc = node->GetOpDesc();
@@ -906,6 +978,8 @@ Status TaskGenerator::InsertProfilingArTaskBefore(const OpDescPtr &op_desc, std:
for (size_t i = 0; i < all_reduce_nodes.size(); i++) { for (size_t i = 0; i < all_reduce_nodes.size(); i++) {
if (all_reduce_nodes[i] == node_index) { if (all_reduce_nodes[i] == node_index) {
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep),
REPORT_INNER_ERROR("E19999", "Multiply result is out of range when calc profiling ar log id "
"for node:%s(%s)", op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Multiply result is out of range."); GELOGE(FAILED, "Multiply result is out of range.");
return FAILED); return FAILED);
ar_log_id = i * kProfilingArStep + kProfilingArStartLogid; ar_log_id = i * kProfilingArStep + kProfilingArStartLogid;
@@ -998,6 +1072,8 @@ Status TaskGenerator::InsertProfilingArTaskAfter(const OpDescPtr &op_desc, std::
for (size_t i = 0; i < all_reduce_nodes.size(); i++) { for (size_t i = 0; i < all_reduce_nodes.size(); i++) {
if (all_reduce_nodes[i] == node_index) { if (all_reduce_nodes[i] == node_index) {
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep),
REPORT_INNER_ERROR("E19999", "Multiply result is out of range when calc profiling ar log id "
"for node:%s(%s)", op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(FAILED, "Multiply result is out of range."); GELOGE(FAILED, "Multiply result is out of range.");
return FAILED); return FAILED);
ar_log_id = i * kProfilingArStep + kProfilingArEndLogid; ar_log_id = i * kProfilingArStep + kProfilingArEndLogid;
@@ -1107,6 +1183,7 @@ Status TaskGenerator::SetUnknownShapeStream(RunContext &run_context, rtStream_t
run_context.stream = stream; run_context.stream = stream;
rtError_t rt_ret = rtModelBindStream(run_context.model, stream, 0); rtError_t rt_ret = rtModelBindStream(run_context.model, stream, 0);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtModelBindStream failed, ret:0x%X", rt_ret);
GELOGE(FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
GE_CHK_RT_RET(rtStreamDestroy(stream)); GE_CHK_RT_RET(rtStreamDestroy(stream));
return FAILED; return FAILED;


+ 2
- 0
ge/graph/common/bcast.cc View File

@@ -73,6 +73,8 @@ Status BCast::SetShapeDifferentInfo(const kVecInt &x, const kVecInt &y) {
y_bcast_i = x_i; y_bcast_i = x_i;
grad_y_reduce_idx_.push_back(n - 1 - i); grad_y_reduce_idx_.push_back(n - 1 - i);
} else { } else {
REPORT_INNER_ERROR("E19999", "SetShapeDifferentInfo failed. Two tensor shapes are not compatible "
"according to the broadcasting rule.");
GELOGE(domi::PARAM_INVALID, GELOGE(domi::PARAM_INVALID,
"SetShapeDifferentInfo failed. Two tensor shapes are not compatible " "SetShapeDifferentInfo failed. Two tensor shapes are not compatible "
"according to the broadcasting rule."); "according to the broadcasting rule.");


+ 7
- 0
ge/graph/common/bcast.h View File

@@ -111,11 +111,14 @@ class BCast {
const std::function<OutT(InT const &, InT const &)> &func) { const std::function<OutT(InT const &, InT const &)> &func) {
Status ret; Status ret;
if (func == nullptr) { if (func == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param func nullptr");
GELOGE(domi::PARAM_INVALID, "Param func is null"); GELOGE(domi::PARAM_INVALID, "Param func is null");
return domi::PARAM_INVALID; return domi::PARAM_INVALID;
} }
// Min input num is 2 // Min input num is 2
if (input.size() < kMinDimNum) { if (input.size() < kMinDimNum) {
REPORT_INNER_ERROR("E19999", "Param input.size():%zu < %zu, check invalid",
input.size(), kMinDimNum);
GELOGE(domi::PARAM_INVALID, "Input size is smaller than two."); GELOGE(domi::PARAM_INVALID, "Input size is smaller than two.");
return domi::PARAM_INVALID; return domi::PARAM_INVALID;
} }
@@ -149,11 +152,14 @@ class BCast {
Status BCastComputeCheck(const std::vector<ConstGeTensorPtr> &input, std::vector<OutT> &v_output, Status BCastComputeCheck(const std::vector<ConstGeTensorPtr> &input, std::vector<OutT> &v_output,
const std::function<OutT(InT const &, InT const &, DataType &type, Status &)> &func) { const std::function<OutT(InT const &, InT const &, DataType &type, Status &)> &func) {
if (func == nullptr) { if (func == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param func nullptr");
GELOGE(PARAM_INVALID, "Param func is null"); GELOGE(PARAM_INVALID, "Param func is null");
return PARAM_INVALID; return PARAM_INVALID;
} }
// Min input num is 2 // Min input num is 2
if (input.size() < kMinDimNum) { if (input.size() < kMinDimNum) {
REPORT_INNER_ERROR("E19999", "Param input.size():%zu < %zu, check invalid",
input.size(), kMinDimNum);
GELOGE(PARAM_INVALID, "Input size is smaller than two."); GELOGE(PARAM_INVALID, "Input size is smaller than two.");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -179,6 +185,7 @@ class BCast {
auto value = func((*(reinterpret_cast<const InT *>(x1_data) + x_index)), auto value = func((*(reinterpret_cast<const InT *>(x1_data) + x_index)),
(*(reinterpret_cast<const InT *>(x2_data) + y_index)), data_type, ret); (*(reinterpret_cast<const InT *>(x2_data) + y_index)), data_type, ret);
if (ret != SUCCESS) { if (ret != SUCCESS) {
REPORT_INNER_ERROR("E19999", "BCastComputeCheck func execute failed, datatype is %d.", data_type);
GELOGE(ret, "BCastComputeCheck func execute failed, datatype is %d.", data_type); GELOGE(ret, "BCastComputeCheck func execute failed, datatype is %d.", data_type);
return ret; return ret;
} }


+ 58
- 0
ge/graph/common/omg_util.cc View File

@@ -21,6 +21,8 @@
#include "framework/common/debug/ge_log.h" #include "framework/common/debug/ge_log.h"
#include "graph/debug/ge_attr_define.h" #include "graph/debug/ge_attr_define.h"
#include "graph/utils/graph_utils.h" #include "graph/utils/graph_utils.h"
#include "graph/utils/tensor_utils.h"
#include "common/math/math_util.h"


namespace ge { namespace ge {
/// ///
@@ -36,6 +38,8 @@ Status GetOriginalType(const ge::NodePtr &node, string &type) {
GE_CHECK_NOTNULL(node->GetOpDesc()); GE_CHECK_NOTNULL(node->GetOpDesc());
bool ret = ge::AttrUtils::GetStr(node->GetOpDesc(), ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE, type); bool ret = ge::AttrUtils::GetStr(node->GetOpDesc(), ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE, type);
if (!ret) { if (!ret) {
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail for op:%s(%s)", ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(INTERNAL_ERROR, "Get FrameWorkOp original type [%s]", type.c_str()); GELOGE(INTERNAL_ERROR, "Get FrameWorkOp original type [%s]", type.c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -55,6 +59,8 @@ Status SetStreamLabel(const ge::NodePtr &node, const std::string &label) {
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);


if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_STREAM_LABEL, label)) { if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_STREAM_LABEL, label)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_STREAM_LABEL.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_LABEL failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_LABEL failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -72,6 +78,8 @@ Status SetCycleEvent(const ge::NodePtr &node) {
OpDescPtr tmp_desc = node->GetOpDesc(); OpDescPtr tmp_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);
if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_STREAM_CYCLE_EVENT_FLAG, true)) { if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_STREAM_CYCLE_EVENT_FLAG, true)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_STREAM_CYCLE_EVENT_FLAG.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_CYCLE_EVENT_FLAG failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_CYCLE_EVENT_FLAG failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -90,6 +98,8 @@ Status SetActiveLabelList(const ge::NodePtr &node, const std::vector<std::string
OpDescPtr tmp_desc = node->GetOpDesc(); OpDescPtr tmp_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);
if (!AttrUtils::SetListStr(tmp_desc, ge::ATTR_NAME_ACTIVE_LABEL_LIST, active_label_list)) { if (!AttrUtils::SetListStr(tmp_desc, ge::ATTR_NAME_ACTIVE_LABEL_LIST, active_label_list)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_LABEL_LIST.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_ACTIVE_LABEL_LIST failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_ACTIVE_LABEL_LIST failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -108,6 +118,8 @@ Status SetSwitchBranchNodeLabel(const ge::NodePtr &node, const std::string &bran
OpDescPtr tmp_desc = node->GetOpDesc(); OpDescPtr tmp_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);
if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_SWITCH_BRANCH_NODE_LABEL, branch_label)) { if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_SWITCH_BRANCH_NODE_LABEL, branch_label)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_SWITCH_BRANCH_NODE_LABEL.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_BRANCH_NODE_LABEL failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_BRANCH_NODE_LABEL failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -126,6 +138,8 @@ Status SetSwitchTrueBranchFlag(const ge::NodePtr &node, bool value) {
OpDescPtr tmp_desc = node->GetOpDesc(); OpDescPtr tmp_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);
if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG, value)) { if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG, value)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -144,6 +158,8 @@ Status SetOriginalNodeName(const ge::NodePtr &node, const std::string &orig_name
OpDescPtr tmp_desc = node->GetOpDesc(); OpDescPtr tmp_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);
if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_ORIG_NODE_NAME, orig_name)) { if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_ORIG_NODE_NAME, orig_name)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ORIG_NODE_NAME.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_ORIG_NODE_NAME failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_ORIG_NODE_NAME failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -161,6 +177,8 @@ Status SetCyclicDependenceFlag(const ge::NodePtr &node) {
OpDescPtr tmp_desc = node->GetOpDesc(); OpDescPtr tmp_desc = node->GetOpDesc();
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);
if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_CYCLIC_DEPENDENCE_FLAG, true)) { if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_CYCLIC_DEPENDENCE_FLAG, true)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_CYCLIC_DEPENDENCE_FLAG.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_CYCLIC_DEPENDENCE_FLAG failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_CYCLIC_DEPENDENCE_FLAG failed", node->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -180,10 +198,50 @@ Status SetNextIteration(const ge::NodePtr &node, const std::string &next) {
GE_CHECK_NOTNULL(tmp_desc); GE_CHECK_NOTNULL(tmp_desc);


if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_NEXT_ITERATION, next)) { if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_NEXT_ITERATION, next)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_NEXT_ITERATION.c_str(),
node->GetName().c_str(), node->GetType().c_str());
GELOGE(FAILED, "Op: %s set ATTR_NAME_NEXT_ITERATION failed", node->GetName().c_str()); GELOGE(FAILED, "Op: %s set ATTR_NAME_NEXT_ITERATION failed", node->GetName().c_str());
return FAILED; return FAILED;
} }


return SUCCESS; return SUCCESS;
} }

///
/// @brief Align the memory
/// @param [in/out] memory size
/// @param [in] alinment
/// @return void
///
void AlignMemSize(int64_t &mem_size, int64_t align_size) {
if (mem_size <= 0) {
return;
}
mem_size = (mem_size + align_size - 1) / align_size * align_size;
}

///
/// @brief Get memory size from tensor desc
/// @param [in] node
/// @param [out] memory size
/// @return Status
///
Status GetMemorySize(const NodePtr &node, int64_t &output_size) {
GE_CHECK_NOTNULL(node->GetOpDesc());
auto output_op_desc = node->GetOpDesc()->GetOutputDescPtr(kBufferPoolNodeOutIndex);
GE_CHECK_NOTNULL(output_op_desc);
int64_t size = 0;
auto ret = ge::TensorUtils::GetSize(*output_op_desc, size);
if (ret != ge::GRAPH_SUCCESS) {
GELOGE(INTERNAL_ERROR, "[Get][Size]Node:%s.", node->GetName().c_str());
REPORT_INNER_ERROR("E19999", "Failed to get output size, node:%s.", node->GetName().c_str());
return INTERNAL_ERROR;
}
FMK_INT64_ADDCHECK(size, kBufferPoolMemAlignSize);
AlignMemSize(size, kBufferPoolMemAlignSize);
// The HCOM operator requires an additional 512 bytes before and after
FMK_INT64_ADDCHECK(size, (kBufferPoolMemAlignSize + kBufferPoolMemAlignSize));
output_size = kBufferPoolMemAlignSize + size + kBufferPoolMemAlignSize;
return SUCCESS;
}
} // namespace ge } // namespace ge

+ 21
- 0
ge/graph/common/omg_util.h View File

@@ -27,6 +27,11 @@
#include "graph/node.h" #include "graph/node.h"


namespace ge { namespace ge {
namespace {
const int64_t kBufferPoolMemAlignSize = 512;
const uint32_t kBufferPoolNodeOutIndex = 0;
const uint32_t kEventReuseThreshold = 65500;
} // namespace
/// ///
/// @brief get the Original Type of FrameworkOp /// @brief get the Original Type of FrameworkOp
/// @param [in] node /// @param [in] node
@@ -96,6 +101,22 @@ Status SetCyclicDependenceFlag(const ge::NodePtr &node);
/// @return Status /// @return Status
/// ///
Status SetNextIteration(const ge::NodePtr &node, const std::string &next); Status SetNextIteration(const ge::NodePtr &node, const std::string &next);

///
/// @brief Align the memory
/// @param [in/out] memory size
/// @param [in] alinment
/// @return void
///
void AlignMemSize(int64_t &mem_size, int64_t align_size);

///
/// @brief Get memory size from tensor desc
/// @param [in] node
/// @param [out] memory size
/// @return Status
///
Status GetMemorySize(const NodePtr &node, int64_t &output_size);
} // namespace ge } // namespace ge


#endif // GE_GRAPH_COMMON_OMG_UTIL_H_ #endif // GE_GRAPH_COMMON_OMG_UTIL_H_

+ 107
- 3
ge/graph/execute/graph_execute.cc View File

@@ -20,9 +20,12 @@
#include <string> #include <string>


#include "graph/load/model_manager/model_manager.h" #include "graph/load/model_manager/model_manager.h"
#include "graph/load/model_manager/davinci_model.h"
#include "omm/csa_interact.h" #include "omm/csa_interact.h"


namespace ge { namespace ge {
using Uint32Pair = pair<uint32_t, uint32_t>;
const uint32_t kInvalidModelId = UINT32_MAX;
GraphExecutor::GraphExecutor() GraphExecutor::GraphExecutor()
: init_flag_(false), : init_flag_(false),
train_graph_flag_(false), train_graph_flag_(false),
@@ -40,6 +43,7 @@ GraphExecutor::~GraphExecutor() {
rtError_t rt_ret; rtError_t rt_ret;
rt_ret = rtFreeHost(buffer_addr); rt_ret = rtFreeHost(buffer_addr);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtFreeHost failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret);
} }
} }
@@ -51,14 +55,17 @@ GraphExecutor::~GraphExecutor() {
Status GraphExecutor::SetCondition(std::mutex *mutex, std::condition_variable *cond, Status GraphExecutor::SetCondition(std::mutex *mutex, std::condition_variable *cond,
std::shared_ptr<GraphModelListener> listener) { std::shared_ptr<GraphModelListener> listener) {
if (mutex == nullptr) { if (mutex == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param mutex nullptr");
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param mutex is nullptr."); GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param mutex is nullptr.");
return GE_GRAPH_PARAM_NULLPTR; return GE_GRAPH_PARAM_NULLPTR;
} }
if (cond == nullptr) { if (cond == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param cond nullptr");
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param cond is nullptr."); GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param cond is nullptr.");
return GE_GRAPH_PARAM_NULLPTR; return GE_GRAPH_PARAM_NULLPTR;
} }
if (listener == nullptr) { if (listener == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param listener nullptr");
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param listener is nullptr."); GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param listener is nullptr.");
return GE_GRAPH_PARAM_NULLPTR; return GE_GRAPH_PARAM_NULLPTR;
} }
@@ -75,6 +82,7 @@ Status GraphExecutor::SetCondition(std::mutex *mutex, std::condition_variable *c


Status GraphExecutor::SetGraphContext(GraphContextPtr graph_context_ptr) { Status GraphExecutor::SetGraphContext(GraphContextPtr graph_context_ptr) {
if (graph_context_ptr == nullptr) { if (graph_context_ptr == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param graph_context_ptr nullptr");
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetGraphContext] input param graph_context_ptr is nullptr"); GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetGraphContext] input param graph_context_ptr is nullptr");
return GE_GRAPH_PARAM_NULLPTR; return GE_GRAPH_PARAM_NULLPTR;
} }
@@ -101,6 +109,7 @@ Status GraphExecutor::FreeInOutBuffer() {
rtError_t rt_ret; rtError_t rt_ret;
rt_ret = rtFreeHost(*iter); rt_ret = rtFreeHost(*iter);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtFreeHost failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret);
(void)buffer_addr_.erase(buffer_addr_.begin(), iter); (void)buffer_addr_.erase(buffer_addr_.begin(), iter);
return GE_GRAPH_FREE_FAILED; return GE_GRAPH_FREE_FAILED;
@@ -146,6 +155,8 @@ Status GraphExecutor::MallocInOutBuffer(const std::vector<uint64_t> &buffer_size
void *tmp_buf = nullptr; void *tmp_buf = nullptr;
rt_ret = rtMallocHost(&tmp_buf, buffer_size[i]); rt_ret = rtMallocHost(&tmp_buf, buffer_size[i]);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMallocHost failed, size:%lu, ret:0x%X",
buffer_size[i], rt_ret);
GELOGE(RT_FAILED, "[GraphManager] subgraph malloc buffer failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "[GraphManager] subgraph malloc buffer failed, ret: 0x%X", rt_ret);
return GE_GRAPH_MALLOC_FAILED; return GE_GRAPH_MALLOC_FAILED;
} }
@@ -191,6 +202,8 @@ Status GraphExecutor::PrepareInputData(const std::vector<GeTensor> &input_tensor
rtError_t rt_ret = rtMemcpy(addrVec[i], bufferSizeVec[i], in_tensor->GetData().data(), rtError_t rt_ret = rtMemcpy(addrVec[i], bufferSizeVec[i], in_tensor->GetData().data(),
in_tensor->GetData().size(), RT_MEMCPY_HOST_TO_HOST); in_tensor->GetData().size(), RT_MEMCPY_HOST_TO_HOST);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, dst_size:%lu, src_size:%zu, ret:0x%X",
bufferSizeVec[i], in_tensor->GetData().size(), rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_FAILED; return RT_FAILED;
} }
@@ -250,6 +263,8 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe
} }


if (graph_run_listener_->ResetResult() != SUCCESS) { if (graph_run_listener_->ResetResult() != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call graph_run_listener_.ResetResult fail, model_id:%u",
model_id);
GELOGE(GE_GRAPH_EXECUTE_FAILED, "Reset result failed"); GELOGE(GE_GRAPH_EXECUTE_FAILED, "Reset result failed");
return GE_GRAPH_EXECUTE_FAILED; return GE_GRAPH_EXECUTE_FAILED;
} }
@@ -273,6 +288,8 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe
// Run graph return // Run graph return
uint32_t result_code = graph_run_listener_->GetResultCode(); uint32_t result_code = graph_run_listener_->GetResultCode();
if (result_code != SUCCESS && result_code != END_OF_SEQUENCE) { if (result_code != SUCCESS && result_code != END_OF_SEQUENCE) {
REPORT_CALL_ERROR("E19999", "Graph_run_listener_ run fail, result:%u, model_id:%u",
result_code, model_id);
GELOGE(GE_GRAPH_EXECUTE_FAILED, "[GraphExecutor] execute model failed, ret=%u, modelId=%u.", result_code, GELOGE(GE_GRAPH_EXECUTE_FAILED, "[GraphExecutor] execute model failed, ret=%u, modelId=%u.", result_code,
model_id); model_id);
return GE_GRAPH_EXECUTE_FAILED; return GE_GRAPH_EXECUTE_FAILED;
@@ -281,10 +298,14 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe
for (size_t i = 0; i < output_data.blobs.size(); ++i) { for (size_t i = 0; i < output_data.blobs.size(); ++i) {
DataBuffer outputDataTmp = output_data.blobs[i]; DataBuffer outputDataTmp = output_data.blobs[i];
CHECK_FALSE_EXEC(outputDataTmp.length != 0, CHECK_FALSE_EXEC(outputDataTmp.length != 0,
REPORT_INNER_ERROR("E19999", "Param output_data.length is 0 in model:%u, check invalid",
model_id);
GELOGE(GE_GRAPH_EXECUTE_FAILED, "Failed to allocate memory, length is 0."); GELOGE(GE_GRAPH_EXECUTE_FAILED, "Failed to allocate memory, length is 0.");
return GE_GRAPH_EXECUTE_FAILED); return GE_GRAPH_EXECUTE_FAILED);
std::unique_ptr<uint8_t> outBufTmp(new (std::nothrow) uint8_t[outputDataTmp.length]); std::unique_ptr<uint8_t> outBufTmp(new (std::nothrow) uint8_t[outputDataTmp.length]);
if (outBufTmp == nullptr) { if (outBufTmp == nullptr) {
REPORT_CALL_ERROR("E19999", "New output buffer fail, length:%lu, model:%u",
outputDataTmp.length, model_id);
GELOGE(FAILED, "Failed to allocate memory."); GELOGE(FAILED, "Failed to allocate memory.");
return FAILED; return FAILED;
} }
@@ -292,6 +313,8 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe
rtError_t ret_value = rtMemcpy(outBufTmp.get(), outputDataTmp.length, outputDataTmp.data, outputDataTmp.length, rtError_t ret_value = rtMemcpy(outBufTmp.get(), outputDataTmp.length, outputDataTmp.data, outputDataTmp.length,
RT_MEMCPY_HOST_TO_HOST); RT_MEMCPY_HOST_TO_HOST);
CHECK_FALSE_EXEC(ret_value == RT_ERROR_NONE, CHECK_FALSE_EXEC(ret_value == RT_ERROR_NONE,
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, dst_size:%lu, src_size:%zu, ret:0x%X",
outputDataTmp.length, outputDataTmp.length, ret_value);
GELOGE(GE_GRAPH_EXECUTE_FAILED, "Call rt api rtMemcpy failed, ret: 0x%X", ret); GELOGE(GE_GRAPH_EXECUTE_FAILED, "Call rt api rtMemcpy failed, ret: 0x%X", ret);
return GE_GRAPH_EXECUTE_FAILED); return GE_GRAPH_EXECUTE_FAILED);
GeTensor outTensor; GeTensor outTensor;
@@ -344,6 +367,8 @@ Status GraphExecutor::ExecuteGraph(GraphId graph_id, const GeRootModelPtr &ge_ro
last_graph_id_ = graph_id; last_graph_id_ = graph_id;


if (!init_flag_) { if (!init_flag_) {
REPORT_INNER_ERROR("E19999", "No SetCondition called before, graph:%u, check invalid",
graph_id);
GELOGE(GE_GRAPH_EXECUTE_NOT_INIT, "[GraphExecutor] AI Core Engine without calling SetCondition!"); GELOGE(GE_GRAPH_EXECUTE_NOT_INIT, "[GraphExecutor] AI Core Engine without calling SetCondition!");
return GE_GRAPH_EXECUTE_NOT_INIT; return GE_GRAPH_EXECUTE_NOT_INIT;
} }
@@ -358,7 +383,8 @@ Status GraphExecutor::ExecuteGraph(GraphId graph_id, const GeRootModelPtr &ge_ro
} }


Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model, Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model,
const std::vector<InputTensorInfo> &input_tensor) {
const std::vector<InputTensorInfo> &input_tensor,
const RunAsyncCallback& callback) {
GELOGI("[GraphExecutor] Start to async execute graph, graph_id=%u", graph_id); GELOGI("[GraphExecutor] Start to async execute graph, graph_id=%u", graph_id);
if (graph_id != last_graph_id_) { if (graph_id != last_graph_id_) {
auto ret = FreeExecuteMemory(); auto ret = FreeExecuteMemory();
@@ -368,7 +394,7 @@ Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &
} }
last_graph_id_ = graph_id; last_graph_id_ = graph_id;
GE_CHECK_NOTNULL_EXEC(ge_root_model, return FAILED); GE_CHECK_NOTNULL_EXEC(ge_root_model, return FAILED);
Status ret = AsyncExecuteModel(ge_root_model->GetModelId(), input_tensor);
Status ret = AsyncExecuteModel(ge_root_model, input_tensor, callback);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(GE_GRAPH_SYNC_MODEL_FAILED, "[GraphExecutor] AsyncExecuteModel Error!"); GELOGE(GE_GRAPH_SYNC_MODEL_FAILED, "[GraphExecutor] AsyncExecuteModel Error!");
return GE_GRAPH_SYNC_MODEL_FAILED; return GE_GRAPH_SYNC_MODEL_FAILED;
@@ -378,11 +404,81 @@ Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &
return SUCCESS; return SUCCESS;
} }


Status GraphExecutor::AsyncExecuteModel(uint32_t model_id, const std::vector<InputTensorInfo> &inputs) {
bool CompareByLoad(const Uint32Pair &lhs, const Uint32Pair &rhs) {
return lhs.second < rhs.second;
}

uint32_t GraphExecutor::GetExecuteModelId(const GeRootModelPtr &ge_root_model) {
std::vector<uint32_t> model_ids = ge_root_model->GetAllModelId();
if (model_ids.empty()) {
return kInvalidModelId;
}
if (model_ids.size() == 1) {
return ge_root_model->GetModelId();
}
std::vector<Uint32Pair> model_id_to_loads;
auto model_manager = ModelManager::GetInstance();
GE_CHECK_NOTNULL(model_manager);
for (auto model_id : model_ids) {
auto davinci_model = model_manager->GetModel(model_id);
auto hybrid_model = model_manager->GetHybridModel(model_id);
if (hybrid_model == nullptr) {
GE_CHECK_NOTNULL(davinci_model);
}
uint32_t input_load = hybrid_model != nullptr ? hybrid_model->GetDataInputerSize() :
davinci_model->GetDataInputerSize();
uint32_t running_load = hybrid_model != nullptr ? static_cast<uint32_t>(hybrid_model->GetRunningFlag()) :
static_cast<uint32_t>(davinci_model->GetRunningFlag());
uint32_t load = input_load + running_load;
if (load == 0) {
return model_id;
}
model_id_to_loads.emplace_back(model_id, load);
}
sort(model_id_to_loads.begin(), model_id_to_loads.end(), CompareByLoad);
if (model_id_to_loads.empty()) {
return kInvalidModelId;
}
return model_id_to_loads.begin()->first;
}

Status GraphExecutor::SetCallback(uint32_t model_id, const GeRootModelPtr &ge_root_model,
const RunAsyncCallback &callback) {
auto model_manager = ge::ModelManager::GetInstance();
GE_CHECK_NOTNULL(model_manager);
if (model_manager->IsNeedHybridLoad(*ge_root_model)) {
auto model = model_manager->GetHybridModel(model_id);
GE_CHECK_NOTNULL(model);
if (model->SetRunAsyncListenerCallback(callback) != SUCCESS) {
GELOGE(FAILED, "SetRunAsyncListenerCallback failed.");
return FAILED;
}
} else {
auto model = model_manager->GetModel(model_id);
GE_CHECK_NOTNULL(model);
if (model->SetRunAsyncListenerCallback(callback) != SUCCESS) {
GELOGE(FAILED, "SetRunAsyncListenerCallback failed.");
return FAILED;
}
}
return SUCCESS;
}

Status GraphExecutor::AsyncExecuteModel(const GeRootModelPtr &ge_root_model, const std::vector<InputTensorInfo> &inputs,
const RunAsyncCallback &callback) {
uint32_t model_id = GetExecuteModelId(ge_root_model);
if (model_id == kInvalidModelId) {
GELOGE(INTERNAL_ERROR, "No valid model id.");
return INTERNAL_ERROR;
}
try { try {
auto model_manager = ge::ModelManager::GetInstance(); auto model_manager = ge::ModelManager::GetInstance();
GE_CHECK_NOTNULL(model_manager); GE_CHECK_NOTNULL(model_manager);
GELOGI("RunAsync begin.model_id %u", model_id); GELOGI("RunAsync begin.model_id %u", model_id);
if (SetCallback(model_id, ge_root_model, callback) != SUCCESS) {
GELOGE(FAILED, "RunAsync: SetCallBack for model fail");
return FAILED;
}


Status ret = model_manager->DataInputTensor(model_id, inputs); Status ret = model_manager->DataInputTensor(model_id, inputs);
if (ret != SUCCESS) { if (ret != SUCCESS) {
@@ -392,10 +488,12 @@ Status GraphExecutor::AsyncExecuteModel(uint32_t model_id, const std::vector<Inp


GELOGI("RunAsync success."); GELOGI("RunAsync success.");
} catch (std::bad_alloc &) { } catch (std::bad_alloc &) {
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed");
GELOGE(MEMALLOC_FAILED, "RunAsync failed, bad memory allocation occur !"); GELOGE(MEMALLOC_FAILED, "RunAsync failed, bad memory allocation occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return MEMALLOC_FAILED; return MEMALLOC_FAILED;
} catch (...) { } catch (...) {
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed");
GELOGE(FAILED, "RunAsync failed, some exceptions occur !"); GELOGE(FAILED, "RunAsync failed, some exceptions occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return FAILED; return FAILED;
@@ -415,10 +513,12 @@ Status GraphExecutor::DataInput(const InputData &input_data, OutputData &output_
return ret; return ret;
} }
} catch (std::bad_alloc &) { } catch (std::bad_alloc &) {
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed");
GELOGE(MEMALLOC_FAILED, "DataInput failed, bad memory allocation occur !"); GELOGE(MEMALLOC_FAILED, "DataInput failed, bad memory allocation occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return MEMALLOC_FAILED; return MEMALLOC_FAILED;
} catch (...) { } catch (...) {
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed");
GELOGE(FAILED, "DataInput failed, some exceptions occur !"); GELOGE(FAILED, "DataInput failed, some exceptions occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return FAILED; return FAILED;
@@ -439,10 +539,12 @@ Status GraphExecutor::GetInputOutputDescInfo(const uint32_t model_id, vector<Inp
return ret; return ret;
} }
} catch (std::bad_alloc &) { } catch (std::bad_alloc &) {
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed");
GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !"); GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return MEMALLOC_FAILED; return MEMALLOC_FAILED;
} catch (...) { } catch (...) {
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed");
GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !"); GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return FAILED; return FAILED;
@@ -466,10 +568,12 @@ Status GraphExecutor::GetInputOutputDescInfo(const uint32_t model_id, vector<Inp
return ret; return ret;
} }
} catch (std::bad_alloc &) { } catch (std::bad_alloc &) {
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed");
GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !"); GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return MEMALLOC_FAILED; return MEMALLOC_FAILED;
} catch (...) { } catch (...) {
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed");
GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !"); GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !");
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC);
return FAILED; return FAILED;


+ 8
- 2
ge/graph/execute/graph_execute.h View File

@@ -50,7 +50,7 @@ class GraphExecutor {
std::vector<GeTensor> &output_tensor); std::vector<GeTensor> &output_tensor);


ge::Status ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model, ge::Status ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model,
const std::vector<InputTensorInfo> &input_tensor);
const std::vector<InputTensorInfo> &input_tensor, const RunAsyncCallback &callback);


Status SetCondition(std::mutex *mutex, std::condition_variable *cond, std::shared_ptr<GraphModelListener> listener); Status SetCondition(std::mutex *mutex, std::condition_variable *cond, std::shared_ptr<GraphModelListener> listener);


@@ -116,6 +116,8 @@ class GraphExecutor {


static Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info); static Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info);


uint32_t GetExecuteModelId(const GeRootModelPtr &ge_root_model);

private: private:
Status PrepareInputData(const std::vector<GeTensor> &input_tensor, InputData &graph_input_data, Status PrepareInputData(const std::vector<GeTensor> &input_tensor, InputData &graph_input_data,
OutputData &graph_output_data, std::vector<InputOutputDescInfo> &output_desc); OutputData &graph_output_data, std::vector<InputOutputDescInfo> &output_desc);
@@ -123,7 +125,8 @@ class GraphExecutor {
Status SyncExecuteModel(uint32_t model_id, const std::vector<GeTensor> &input_tensor, Status SyncExecuteModel(uint32_t model_id, const std::vector<GeTensor> &input_tensor,
std::vector<GeTensor> &output_tensor); std::vector<GeTensor> &output_tensor);


Status AsyncExecuteModel(uint32_t model_id, const std::vector<InputTensorInfo> &input_tensor);
Status AsyncExecuteModel(const GeRootModelPtr &ge_root_model, const std::vector<InputTensorInfo> &input_tensor,
const RunAsyncCallback &callback);


void InitModelIdInfo(std::vector<uint32_t> &out_model_id_info, std::vector<SubGraphInfoPtr> &sub_graph_vec, void InitModelIdInfo(std::vector<uint32_t> &out_model_id_info, std::vector<SubGraphInfoPtr> &sub_graph_vec,
uint32_t output_size); uint32_t output_size);
@@ -132,6 +135,9 @@ class GraphExecutor {


Status MallocInOutBuffer(const std::vector<uint64_t> &buffer_size, std::vector<void *> &data_addr); Status MallocInOutBuffer(const std::vector<uint64_t> &buffer_size, std::vector<void *> &data_addr);


static Status SetCallback(uint32_t model_id, const GeRootModelPtr &ge_root_model,
const RunAsyncCallback &callback);

bool init_flag_; bool init_flag_;


bool train_graph_flag_; bool train_graph_flag_;


+ 16
- 0
ge/graph/label/case_label_maker.cc View File

@@ -42,6 +42,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) {


const auto graph_names = case_desc->GetSubgraphInstanceNames(); const auto graph_names = case_desc->GetSubgraphInstanceNames();
if (graph_names.empty() || graph_names.size() > kMaxCaseBranch) { if (graph_names.empty() || graph_names.size() > kMaxCaseBranch) {
REPORT_INNER_ERROR("E19999", "Node:%s(%s) subgraph size: %zu, check invalid", case_desc->GetName().c_str(),
case_desc->GetType().c_str(), graph_names.size());
GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, graph size: %zu.", case_desc->GetName().c_str(), GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, graph size: %zu.", case_desc->GetName().c_str(),
graph_names.size()); graph_names.size());
return FAILED; return FAILED;
@@ -67,6 +69,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) {
parent_node_->GetName() + "/StreamActive_" + std::to_string(index); // rtStreamActive parent_node_->GetName() + "/StreamActive_" + std::to_string(index); // rtStreamActive
NodePtr stream_active = AddStreamActive(graph, stream_active_name); NodePtr stream_active = AddStreamActive(graph, stream_active_name);
if (stream_active == nullptr) { if (stream_active == nullptr) {
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail",
graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -75,6 +79,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) {
std::string label_set_name = parent_node_->GetName() + "/LabelSet_" + std::to_string(index); // rtLabelSet std::string label_set_name = parent_node_->GetName() + "/LabelSet_" + std::to_string(index); // rtLabelSet
NodePtr label = AddLabelSetEnter(graph, label_set_name, curr_label_index, stream_active); NodePtr label = AddLabelSetEnter(graph, label_set_name, curr_label_index, stream_active);
if (label == nullptr) { if (label == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail",
graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -88,6 +94,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) {
// middle node, add goto node to tail. // middle node, add goto node to tail.
std::string label_goto_name = parent_node_->GetName() + "/LabelGoto_" + std::to_string(index); // rtLabelGoto std::string label_goto_name = parent_node_->GetName() + "/LabelGoto_" + std::to_string(index); // rtLabelGoto
if (AddLabelGotoLeave(graph, label_goto_name, last_label_index) == nullptr) { if (AddLabelGotoLeave(graph, label_goto_name, last_label_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelGotoLeave node in graph:%s fail",
graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -95,6 +103,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) {
// last node, add label node to tail. // last node, add label node to tail.
std::string last_label_name = parent_node_->GetName() + "/LabelSet_Last"; // rtLabelSet std::string last_label_name = parent_node_->GetName() + "/LabelSet_Last"; // rtLabelSet
if (AddLabelSetLeave(graph, last_label_name, last_label_index) == nullptr) { if (AddLabelSetLeave(graph, last_label_name, last_label_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetLeave node in graph:%s fail",
graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -110,12 +120,16 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) {
const GeTensorDesc &pred_desc = case_desc->GetInputDesc(kCasePredIndex); const GeTensorDesc &pred_desc = case_desc->GetInputDesc(kCasePredIndex);
NodePtr switch_node = AddLabelSwitchEnter(first_graph, label_switch_name, pred_desc, switch_labels); NodePtr switch_node = AddLabelSwitchEnter(first_graph, label_switch_name, pred_desc, switch_labels);
if (switch_node == nullptr) { if (switch_node == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSwitchEnter node in graph:%s fail",
first_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", first_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", first_graph->GetName().c_str());
return FAILED; return FAILED;
} }


// Link control edge to then branch head. // Link control edge to then branch head.
if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), first_label->GetInControlAnchor()) != SUCCESS) { if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), first_label->GetInControlAnchor()) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", switch_node->GetName().c_str(),
first_label->GetName().c_str(), first_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", first_label->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", first_label->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -123,6 +137,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) {
uint32_t parent_index = 0; // Case cond input is first. uint32_t parent_index = 0; // Case cond input is first.
const std::string data_name = parent_node_->GetName() + "/SwitchIndexData"; const std::string data_name = parent_node_->GetName() + "/SwitchIndexData";
if (AddLabelSwitchIndex(first_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) { if (AddLabelSwitchIndex(first_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSwitchIndex node in graph:%s fail",
first_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", first_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", first_graph->GetName().c_str());
return FAILED; return FAILED;
} }


+ 22
- 0
ge/graph/label/if_label_maker.cc View File

@@ -43,6 +43,10 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) {
const std::string then_branch_name = if_desc->GetSubgraphInstanceName(kThenBranchIndex); const std::string then_branch_name = if_desc->GetSubgraphInstanceName(kThenBranchIndex);
const std::string else_branch_name = if_desc->GetSubgraphInstanceName(kElseBranchIndex); const std::string else_branch_name = if_desc->GetSubgraphInstanceName(kElseBranchIndex);
if (then_branch_name.empty() || else_branch_name.empty()) { if (then_branch_name.empty() || else_branch_name.empty()) {
REPORT_INNER_ERROR("E19999", "Node:%s(%s), check subgraph invalid, "
"then branch graph: %s, else branch graph: %s",
if_desc->GetName().c_str(), if_desc->GetType().c_str(),
then_branch_name.c_str(), else_branch_name.c_str());
GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, then branch: %s, else branch: %s.", GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, then branch: %s, else branch: %s.",
if_desc->GetName().c_str(), then_branch_name.c_str(), else_branch_name.c_str()); if_desc->GetName().c_str(), then_branch_name.c_str(), else_branch_name.c_str());
return FAILED; return FAILED;
@@ -66,32 +70,44 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) {


NodePtr then_stream_active = AddStreamActive(then_sub_graph, then_active_name); NodePtr then_stream_active = AddStreamActive(then_sub_graph, then_active_name);
if (then_stream_active == nullptr) { if (then_stream_active == nullptr) {
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail",
then_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", then_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", then_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }


NodePtr then_enter_label = AddLabelSetEnter(then_sub_graph, then_label_name, then_enter_index, then_stream_active); NodePtr then_enter_label = AddLabelSetEnter(then_sub_graph, then_label_name, then_enter_index, then_stream_active);
if (then_enter_label == nullptr) { if (then_enter_label == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail",
then_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", then_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", then_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }


if (AddLabelGotoLeave(then_sub_graph, then_leave_name, else_leave_index) == nullptr) { if (AddLabelGotoLeave(then_sub_graph, then_leave_name, else_leave_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelGotoLeave node in graph:%s fail",
then_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", then_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", then_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }


NodePtr else_stream_active = AddStreamActive(else_sub_graph, else_active_name); NodePtr else_stream_active = AddStreamActive(else_sub_graph, else_active_name);
if (else_stream_active == nullptr) { if (else_stream_active == nullptr) {
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail",
else_stream_active->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", else_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", else_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }


if (AddLabelSetEnter(else_sub_graph, else_enter_name, else_enter_index, else_stream_active) == nullptr) { if (AddLabelSetEnter(else_sub_graph, else_enter_name, else_enter_index, else_stream_active) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail",
else_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }
if (AddLabelSetLeave(else_sub_graph, else_leave_name, else_leave_index) == nullptr) { if (AddLabelSetLeave(else_sub_graph, else_leave_name, else_leave_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetLeave node in graph:%s fail",
else_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -103,12 +119,16 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) {
const GeTensorDesc &pred_desc = if_desc->GetInputDesc(kIfPredIndex); const GeTensorDesc &pred_desc = if_desc->GetInputDesc(kIfPredIndex);
NodePtr switch_node = AddLabelSwitchEnter(then_sub_graph, then_enter_name, pred_desc, switch_labels); NodePtr switch_node = AddLabelSwitchEnter(then_sub_graph, then_enter_name, pred_desc, switch_labels);
if (switch_node == nullptr) { if (switch_node == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSwitchEnter node in graph:%s fail",
then_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", then_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", then_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }


// Link control edge to then branch head. // Link control edge to then branch head.
if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), then_enter_label->GetInControlAnchor()) != SUCCESS) { if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), then_enter_label->GetInControlAnchor()) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", switch_node->GetName().c_str(),
then_enter_label->GetName().c_str(), then_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", then_enter_label->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", then_enter_label->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -116,6 +136,8 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) {
uint32_t parent_index = 0; // If cond input is first. uint32_t parent_index = 0; // If cond input is first.
const std::string data_name = parent_node_->GetName() + "/SwitchIndexData"; const std::string data_name = parent_node_->GetName() + "/SwitchIndexData";
if (AddLabelSwitchIndex(then_sub_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) { if (AddLabelSwitchIndex(then_sub_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSwitchIndex node in graph:%s fail",
then_sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", then_sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", then_sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }


+ 30
- 0
ge/graph/label/label_maker.cc View File

@@ -56,6 +56,8 @@ void LabelMaker::LinkToGraphHead(const ComputeGraphPtr &graph, const NodePtr &no
} }


if (GraphUtils::AddEdge(node->GetOutControlAnchor(), n->GetInControlAnchor()) != SUCCESS) { if (GraphUtils::AddEdge(node->GetOutControlAnchor(), n->GetInControlAnchor()) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", node->GetName().c_str(),
n->GetName().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", node->GetName().c_str(), n->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", node->GetName().c_str(), n->GetName().c_str());
} }
} }
@@ -78,6 +80,8 @@ void LabelMaker::LinkToGraphTail(const ComputeGraphPtr &graph, const NodePtr &no
} }


if (GraphUtils::AddEdge(tail->GetOutControlAnchor(), node->GetInControlAnchor()) != SUCCESS) { if (GraphUtils::AddEdge(tail->GetOutControlAnchor(), node->GetInControlAnchor()) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", tail->GetName().c_str(),
node->GetName().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", tail->GetName().c_str(), node->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", tail->GetName().c_str(), node->GetName().c_str());
} }
return; return;
@@ -96,6 +100,7 @@ NodePtr LabelMaker::AddStreamActive(const ComputeGraphPtr &graph, const std::str


const auto &node_list = graph->GetDirectNode(); const auto &node_list = graph->GetDirectNode();
if (node_list.empty()) { if (node_list.empty()) {
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str());
return nullptr; return nullptr;
} }
@@ -131,6 +136,7 @@ NodePtr LabelMaker::AddLabelSetEnter(const ComputeGraphPtr &graph, const std::st


const auto &node_list = graph->GetDirectNode(); const auto &node_list = graph->GetDirectNode();
if (node_list.empty()) { if (node_list.empty()) {
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str());
return nullptr; return nullptr;
} }
@@ -145,6 +151,8 @@ NodePtr LabelMaker::AddLabelSetEnter(const ComputeGraphPtr &graph, const std::st
GE_CHECK_NOTNULL_EXEC(label_set, return nullptr); GE_CHECK_NOTNULL_EXEC(label_set, return nullptr);


if (GraphUtils::AddEdge(label_set->GetOutControlAnchor(), stream_active->GetInControlAnchor()) != SUCCESS) { if (GraphUtils::AddEdge(label_set->GetOutControlAnchor(), stream_active->GetInControlAnchor()) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", label_set->GetName().c_str(),
stream_active->GetName().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", label_set->GetName().c_str(), GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", label_set->GetName().c_str(),
stream_active->GetName().c_str()); stream_active->GetName().c_str());
return nullptr; return nullptr;
@@ -193,6 +201,7 @@ NodePtr LabelMaker::AddLabelGotoEnter(const ComputeGraphPtr &graph, const std::s
const auto &node_list = graph->GetDirectNode(); const auto &node_list = graph->GetDirectNode();
auto it = node_list.begin(); auto it = node_list.begin();
if (it == node_list.end()) { if (it == node_list.end()) {
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelGoto: Graph %s node is empty.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelGoto: Graph %s node is empty.", graph->GetName().c_str());
return nullptr; return nullptr;
} }
@@ -205,6 +214,8 @@ NodePtr LabelMaker::AddLabelGotoEnter(const ComputeGraphPtr &graph, const std::s
(void)AttrUtils::SetInt(op_desc, ATTR_NAME_LABEL_SWITCH_INDEX, index); (void)AttrUtils::SetInt(op_desc, ATTR_NAME_LABEL_SWITCH_INDEX, index);
NodePtr label_goto = graph->AddNodeFront(op_desc); NodePtr label_goto = graph->AddNodeFront(op_desc);
if (label_goto == nullptr) { if (label_goto == nullptr) {
REPORT_CALL_ERROR("E19999", "Add node:%s(%s) to graph:%s fail",
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelGoto: Add to graph %s failed.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelGoto: Add to graph %s failed.", graph->GetName().c_str());
return nullptr; return nullptr;
} }
@@ -253,6 +264,7 @@ NodePtr LabelMaker::AddLabelSwitchEnter(const ComputeGraphPtr &graph, const std:
const auto &node_list = graph->GetDirectNode(); const auto &node_list = graph->GetDirectNode();
auto it = node_list.begin(); auto it = node_list.begin();
if (it == node_list.end()) { if (it == node_list.end()) {
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Graph %s node is empty.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Graph %s node is empty.", graph->GetName().c_str());
return nullptr; return nullptr;
} }
@@ -263,17 +275,23 @@ NodePtr LabelMaker::AddLabelSwitchEnter(const ComputeGraphPtr &graph, const std:


GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str()); GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str());
if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add input desc into node:%s(%s) in graph:%s fail",
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed."); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed.");
return nullptr; return nullptr;
} }


if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) { if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_LABEL_SWITCH_LIST.c_str(),
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str());
return nullptr; return nullptr;
} }


NodePtr label_switch = graph->AddNodeFront(op_desc); NodePtr label_switch = graph->AddNodeFront(op_desc);
if (label_switch == nullptr) { if (label_switch == nullptr) {
REPORT_CALL_ERROR("E19999", "Add node:%s(%s) to graph:%s ahead fail",
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add to graph %s failed.", graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add to graph %s failed.", graph->GetName().c_str());
return nullptr; return nullptr;
} }
@@ -300,11 +318,15 @@ NodePtr LabelMaker::AddLabelSwitchLeave(const ComputeGraphPtr &graph, const std:


GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str()); GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str());
if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add input desc into node:%s(%s) in graph:%s fail",
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed."); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed.");
return nullptr; return nullptr;
} }


if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) { if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_LABEL_SWITCH_LIST.c_str(),
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str());
return nullptr; return nullptr;
} }
@@ -336,15 +358,21 @@ NodePtr LabelMaker::AddLabelSwitchIndex(const ComputeGraphPtr &graph, const std:


GELOGI("Data: Create node %s.", op_desc->GetName().c_str()); GELOGI("Data: Create node %s.", op_desc->GetName().c_str());
if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add input desc into node:%s(%s) in graph:%s fail",
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data input desc failed."); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data input desc failed.");
return nullptr; return nullptr;
} }
if (op_desc->AddOutputDesc(desc) != GRAPH_SUCCESS) { if (op_desc->AddOutputDesc(desc) != GRAPH_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add output desc into node:%s(%s) in graph:%s fail",
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data output desc failed."); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data output desc failed.");
return nullptr; return nullptr;
} }


if (!AttrUtils::SetInt(op_desc, ATTR_NAME_PARENT_NODE_INDEX, parent_index)) { if (!AttrUtils::SetInt(op_desc, ATTR_NAME_PARENT_NODE_INDEX, parent_index)) {
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_PARENT_NODE_INDEX.c_str(),
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_PARENT_NODE_INDEX.c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_PARENT_NODE_INDEX.c_str());
return nullptr; return nullptr;
} }
@@ -354,6 +382,8 @@ NodePtr LabelMaker::AddLabelSwitchIndex(const ComputeGraphPtr &graph, const std:


// Link control edge to graph head. // Link control edge to graph head.
if (GraphUtils::AddEdge(op_data->GetOutDataAnchor(0), sw_node->GetInDataAnchor(0)) != SUCCESS) { if (GraphUtils::AddEdge(op_data->GetOutDataAnchor(0), sw_node->GetInDataAnchor(0)) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", op_data->GetName().c_str(),
sw_node->GetName().c_str(), graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input edge to %s failed.", op_data->GetName().c_str()); GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input edge to %s failed.", op_data->GetName().c_str());
return nullptr; return nullptr;
} }


+ 7
- 0
ge/graph/label/partitioned_call_label_maker.cc View File

@@ -39,12 +39,17 @@ Status PartitionedCallLabelMaker::Run(uint32_t &label_index) {


std::string sub_graph_name = call_desc->GetSubgraphInstanceName(kSubGraphIndex); std::string sub_graph_name = call_desc->GetSubgraphInstanceName(kSubGraphIndex);
if (sub_graph_name.empty()) { if (sub_graph_name.empty()) {
REPORT_INNER_ERROR("E19999", "Node:%s(%s) subgraph_index:%d name is empty, check invalid",
call_desc->GetName().c_str(), call_desc->GetType().c_str(), kSubGraphIndex);
GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph name.", sub_graph_name.c_str()); GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph name.", sub_graph_name.c_str());
return FAILED; return FAILED;
} }


ComputeGraphPtr sub_graph = parent_graph_->GetSubgraph(sub_graph_name); ComputeGraphPtr sub_graph = parent_graph_->GetSubgraph(sub_graph_name);
if (sub_graph == nullptr) { if (sub_graph == nullptr) {
REPORT_INNER_ERROR("E19999", "Node:%s(%s) subgraph_name:%s is not exist in parent_graph, check invalid",
call_desc->GetName().c_str(), call_desc->GetType().c_str(),
sub_graph_name.c_str());
GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph.", sub_graph_name.c_str()); GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph.", sub_graph_name.c_str());
return FAILED; return FAILED;
} }
@@ -52,6 +57,8 @@ Status PartitionedCallLabelMaker::Run(uint32_t &label_index) {
const std::string stream_active_name = parent_node_->GetName() + "/StreamActive"; // rtStreamActive const std::string stream_active_name = parent_node_->GetName() + "/StreamActive"; // rtStreamActive
NodePtr stream_active = AddStreamActive(sub_graph, stream_active_name); NodePtr stream_active = AddStreamActive(sub_graph, stream_active_name);
if (stream_active == nullptr) { if (stream_active == nullptr) {
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail",
sub_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active node failed.", sub_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active node failed.", sub_graph->GetName().c_str());
return FAILED; return FAILED;
} }


+ 20
- 0
ge/graph/label/while_label_maker.cc View File

@@ -44,6 +44,9 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) {
std::string cond_name = while_desc->GetSubgraphInstanceName(kCondBranchIndex); std::string cond_name = while_desc->GetSubgraphInstanceName(kCondBranchIndex);
std::string body_name = while_desc->GetSubgraphInstanceName(kBodyBranchIndex); std::string body_name = while_desc->GetSubgraphInstanceName(kBodyBranchIndex);
if (cond_name.empty() || body_name.empty()) { if (cond_name.empty() || body_name.empty()) {
REPORT_INNER_ERROR("E19999", "Node:%s(%s) cond subgraph index:%d or body subgraph index:%d name is empty, "
"check invalid", while_desc->GetName().c_str(), while_desc->GetType().c_str(),
kCondBranchIndex, kBodyBranchIndex);
GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, cond branch: %s, body branch: %s.", GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, cond branch: %s, body branch: %s.",
while_desc->GetName().c_str(), cond_name.c_str(), body_name.c_str()); while_desc->GetName().c_str(), cond_name.c_str(), body_name.c_str());
return FAILED; return FAILED;
@@ -67,32 +70,44 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) {


NodePtr cond_stream_active = AddStreamActive(cond_graph, cond_active_name); NodePtr cond_stream_active = AddStreamActive(cond_graph, cond_active_name);
if (cond_stream_active == nullptr) { if (cond_stream_active == nullptr) {
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail",
cond_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", cond_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", cond_graph->GetName().c_str());
return FAILED; return FAILED;
} }


if (AddLabelSetEnter(cond_graph, cond_enter_name, cond_enter_index, cond_stream_active) == nullptr) { if (AddLabelSetEnter(cond_graph, cond_enter_name, cond_enter_index, cond_stream_active) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail",
cond_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", cond_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", cond_graph->GetName().c_str());
return FAILED; return FAILED;
} }


NodePtr body_stream_active = AddStreamActive(body_graph, body_active_name); NodePtr body_stream_active = AddStreamActive(body_graph, body_active_name);
if (body_stream_active == nullptr) { if (body_stream_active == nullptr) {
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail",
body_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", body_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", body_graph->GetName().c_str());
return FAILED; return FAILED;
} }


if (AddLabelSetEnter(body_graph, body_enter_name, body_enter_index, body_stream_active) == nullptr) { if (AddLabelSetEnter(body_graph, body_enter_name, body_enter_index, body_stream_active) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail",
body_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str());
return FAILED; return FAILED;
} }


if (AddLabelGotoLeave(body_graph, goto_leave_name, cond_enter_index) == nullptr) { if (AddLabelGotoLeave(body_graph, goto_leave_name, cond_enter_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelGotoLeave node in graph:%s fail",
body_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", body_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", body_graph->GetName().c_str());
return FAILED; return FAILED;
} }


if (AddLabelSetLeave(body_graph, body_leave_name, body_leave_index) == nullptr) { if (AddLabelSetLeave(body_graph, body_leave_name, body_leave_index) == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSetLeave node in graph:%s fail",
body_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -109,6 +124,8 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) {
const std::vector<uint32_t> switch_labels = {body_leave_index, body_enter_index}; const std::vector<uint32_t> switch_labels = {body_leave_index, body_enter_index};
NodePtr switch_node = AddLabelSwitchLeave(cond_graph, cond_leave_name, pred_desc, switch_labels); NodePtr switch_node = AddLabelSwitchLeave(cond_graph, cond_leave_name, pred_desc, switch_labels);
if (switch_node == nullptr) { if (switch_node == nullptr) {
REPORT_CALL_ERROR("E19999", "Add LabelSwitchLeave node in graph:%s fail",
cond_graph->GetName().c_str());
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", cond_graph->GetName().c_str()); GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", cond_graph->GetName().c_str());
return FAILED; return FAILED;
} }
@@ -124,6 +141,9 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) {
InDataAnchorPtr in_anchor = all_in_data.at(kCondOutputIndex); InDataAnchorPtr in_anchor = all_in_data.at(kCondOutputIndex);
GE_CHECK_NOTNULL(in_anchor); GE_CHECK_NOTNULL(in_anchor);
if (GraphUtils::AddEdge(in_anchor->GetPeerOutAnchor(), switch_node->GetInDataAnchor(kCondOutputIndex)) != SUCCESS) { if (GraphUtils::AddEdge(in_anchor->GetPeerOutAnchor(), switch_node->GetInDataAnchor(kCondOutputIndex)) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail",
in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetName().c_str(),
switch_node->GetName().c_str(), cond_graph->GetName().c_str());
GELOGE(FAILED, "Node: %s Add pred data input failed.", switch_node->GetName().c_str()); GELOGE(FAILED, "Node: %s Add pred data input failed.", switch_node->GetName().c_str());
return FAILED; return FAILED;
} }


+ 18
- 1
ge/graph/load/graph_loader.cc View File

@@ -52,15 +52,17 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge
GELOGI("Load model online begin."); GELOGI("Load model online begin.");
rtError_t rt_ret = rtSetDevice(GetContext().DeviceId()); rtError_t rt_ret = rtSetDevice(GetContext().DeviceId());
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtSetDevice failed, device_id:%u, ret:0x%X",
GetContext().DeviceId(), rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD); CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD);
return RT_FAILED; return RT_FAILED;
} }
if (ge_root_model_ptr == nullptr) { if (ge_root_model_ptr == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param ge_root_model_ptr nullptr, check invalid");
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[LoadGraph] GE load graph model_ptr is nullptr."); GELOGE(GE_GRAPH_PARAM_NULLPTR, "[LoadGraph] GE load graph model_ptr is nullptr.");
return GE_GRAPH_PARAM_NULLPTR; return GE_GRAPH_PARAM_NULLPTR;
} }
model_id = ge_root_model_ptr->GetModelId();


auto model_manager = ModelManager::GetInstance(); auto model_manager = ModelManager::GetInstance();
GE_CHECK_NOTNULL(model_manager); GE_CHECK_NOTNULL(model_manager);
@@ -71,6 +73,8 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge


rt_ret = rtDeviceReset(GetContext().DeviceId()); rt_ret = rtDeviceReset(GetContext().DeviceId());
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X",
GetContext().DeviceId(), rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
} }
return ret; return ret;
@@ -84,6 +88,8 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge


rt_ret = rtDeviceReset(GetContext().DeviceId()); rt_ret = rtDeviceReset(GetContext().DeviceId());
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X",
GetContext().DeviceId(), rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
} }


@@ -93,6 +99,8 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge
} }
rt_ret = rtDeviceReset(GetContext().DeviceId()); rt_ret = rtDeviceReset(GetContext().DeviceId());
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X",
GetContext().DeviceId(), rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_FAILED; return RT_FAILED;
} }
@@ -121,6 +129,8 @@ Status GraphLoader::LoadDataFromFile(const std::string &path, const std::string


GELOGI("Load model begin, model path is: %s", path.c_str()); GELOGI("Load model begin, model path is: %s", path.c_str());
if (!key_path.empty() && !CheckInputPathValid(key_path)) { if (!key_path.empty() && !CheckInputPathValid(key_path)) {
REPORT_INNER_ERROR("E19999", "Param key_path:%s empty or invalid",
key_path.c_str());
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "decrypt_key path is invalid: %s", key_path.c_str()); GELOGE(ACL_ERROR_GE_PARAM_INVALID, "decrypt_key path is invalid: %s", key_path.c_str());
return ACL_ERROR_GE_PARAM_INVALID; return ACL_ERROR_GE_PARAM_INVALID;
} }
@@ -147,10 +157,12 @@ Status GraphLoader::CommandHandle(const Command &command) {
return ret; return ret;
} }
} catch (std::bad_alloc &) { } catch (std::bad_alloc &) {
REPORT_INNER_ERROR("E19999", "Bad memory allocation occur");
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Command handle failed, bad memory allocation occur !"); GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Command handle failed, bad memory allocation occur !");


return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} catch (...) { } catch (...) {
REPORT_INNER_ERROR("E19999", "Some exceptions occur");
GELOGE(FAILED, "Command handle failed, some exceptions occur !"); GELOGE(FAILED, "Command handle failed, some exceptions occur !");


return FAILED; return FAILED;
@@ -232,6 +244,8 @@ Status GraphLoader::ExecuteModel(uint32_t model_id, rtStream_t stream, bool asyn
Status GraphLoader::GetMemoryInfo(int64_t &free) { Status GraphLoader::GetMemoryInfo(int64_t &free) {
rtError_t rt_ret = rtSetDevice(GetContext().DeviceId()); rtError_t rt_ret = rtSetDevice(GetContext().DeviceId());
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtSetDevice failed, device_id:%u, ret:0x%X",
GetContext().DeviceId(), rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD); CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD);
return RT_FAILED; return RT_FAILED;
@@ -240,11 +254,14 @@ Status GraphLoader::GetMemoryInfo(int64_t &free) {
size_t free_mem = 0; size_t free_mem = 0;
rt_ret = rtMemGetInfo(&free_mem, &total_mem); rt_ret = rtMemGetInfo(&free_mem, &total_mem);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemGetInfo failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_FAILED; return RT_FAILED;
} }
rt_ret = rtDeviceReset(GetContext().DeviceId()); rt_ret = rtDeviceReset(GetContext().DeviceId());
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X",
GetContext().DeviceId(), rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_FAILED; return RT_FAILED;
} }


+ 61
- 0
ge/graph/load/model_manager/cpu_queue_schedule.cc View File

@@ -51,6 +51,8 @@ CpuTaskInfo::~CpuTaskInfo() {
/// ///
Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) { Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) {
if ((args_ != nullptr) || (args_size_ > 0)) { if ((args_ != nullptr) || (args_size_ > 0)) {
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0,"
"check invalid", args_size_);
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); GELOGE(FAILED, "Task already initialized, size: %u", args_size_);
return FAILED; return FAILED;
} }
@@ -58,6 +60,8 @@ Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) {
args_size_ = sizeof(MbufQueueInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save in_mbuf. args_size_ = sizeof(MbufQueueInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save in_mbuf.
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -69,6 +73,8 @@ Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) {
queue_info.in_mbuf = in_mbuf; // Placeholder, input mbuf addr will save to this place. queue_info.in_mbuf = in_mbuf; // Placeholder, input mbuf addr will save to this place.
status = rtMemcpy(args_, args_size_, &queue_info, sizeof(MbufQueueInfo), RT_MEMCPY_HOST_TO_DEVICE); status = rtMemcpy(args_, args_size_, &queue_info, sizeof(MbufQueueInfo), RT_MEMCPY_HOST_TO_DEVICE);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -78,12 +84,16 @@ Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) {


Status CpuTaskModelDequeue::Distribute() { Status CpuTaskModelDequeue::Distribute() {
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) {
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr,"
"check invalid", args_size_);
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_);
return FAILED; return FAILED;
} }


rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelDequeue, kCoreDim, args_, args_size_, nullptr, stream_); rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelDequeue, kCoreDim, args_, args_size_, nullptr, stream_);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X",
status);
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelDequeue failed, status: 0x%X", status); GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelDequeue failed, status: 0x%X", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -101,6 +111,8 @@ Status CpuTaskModelDequeue::Distribute() {
/// ///
Status CpuTaskZeroCopy::Init(std::vector<uintptr_t> &mbuf_list, const map<uint32_t, ZeroCopyOffset> &outside_addrs) { Status CpuTaskZeroCopy::Init(std::vector<uintptr_t> &mbuf_list, const map<uint32_t, ZeroCopyOffset> &outside_addrs) {
if ((args_ != nullptr) || (args_size_ > 0)) { if ((args_ != nullptr) || (args_size_ > 0)) {
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0,"
"check invalid", args_size_);
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); GELOGE(FAILED, "Task already initialized, size: %u", args_size_);
return FAILED; return FAILED;
} }
@@ -155,12 +167,16 @@ Status CpuTaskZeroCopy::Init(std::vector<uintptr_t> &mbuf_list, const map<uint32


Status CpuTaskZeroCopy::Distribute() { Status CpuTaskZeroCopy::Distribute() {
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) {
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr,"
"check invalid", args_size_);
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_);
return FAILED; return FAILED;
} }


rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskZeroCopy, kCoreDim, args_, args_size_, nullptr, stream_); rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskZeroCopy, kCoreDim, args_, args_size_, nullptr, stream_);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X",
status);
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ZeroCopy failed, status: 0x%X", status); GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ZeroCopy failed, status: 0x%X", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -199,6 +215,8 @@ CpuTaskZeroCopy::~CpuTaskZeroCopy() {
/// ///
Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mbuf, uintptr_t &out_mbuf) { Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mbuf, uintptr_t &out_mbuf) {
if ((args_ != nullptr) || (args_size_ > 0)) { if ((args_ != nullptr) || (args_size_ > 0)) {
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0,"
"check invalid", args_size_);
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); GELOGE(FAILED, "Task already initialized, size: %u", args_size_);
return FAILED; return FAILED;
} }
@@ -206,6 +224,8 @@ Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mb
args_size_ = sizeof(PrepareOutputInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save out_mbuf. args_size_ = sizeof(PrepareOutputInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save out_mbuf.
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -220,6 +240,8 @@ Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mb
prepare.out_mbuf = out_mbuf; // Placeholder, output mbuf addr will save to this place. prepare.out_mbuf = out_mbuf; // Placeholder, output mbuf addr will save to this place.
status = rtMemcpy(args_, args_size_, &prepare, sizeof(PrepareOutputInfo), RT_MEMCPY_HOST_TO_DEVICE); status = rtMemcpy(args_, args_size_, &prepare, sizeof(PrepareOutputInfo), RT_MEMCPY_HOST_TO_DEVICE);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -229,12 +251,16 @@ Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mb


Status CpuTaskPrepareOutput::Distribute() { Status CpuTaskPrepareOutput::Distribute() {
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) {
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr,"
"check invalid", args_size_);
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_);
return FAILED; return FAILED;
} }


rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskPrepareOutput, kCoreDim, args_, args_size_, nullptr, stream_); rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskPrepareOutput, kCoreDim, args_, args_size_, nullptr, stream_);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X",
status);
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch PrepareOutput failed, status: 0x%X", status); GELOGE(RT_FAILED, "Call rt CpuKernelLaunch PrepareOutput failed, status: 0x%X", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -252,6 +278,8 @@ Status CpuTaskPrepareOutput::Distribute() {
/// ///
Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) { Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) {
if ((args_ != nullptr) || (args_size_ > 0)) { if ((args_ != nullptr) || (args_size_ > 0)) {
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0,"
"check invalid", args_size_);
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); GELOGE(FAILED, "Task already initialized, size: %u", args_size_);
return FAILED; return FAILED;
} }
@@ -260,6 +288,8 @@ Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) {
args_size_ = sizeof(MbufQueueInfo); args_size_ = sizeof(MbufQueueInfo);
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -270,6 +300,8 @@ Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) {
queue_info.in_mbuf = out_mbuf; queue_info.in_mbuf = out_mbuf;
status = rtMemcpy(args_, args_size_, &queue_info, args_size_, RT_MEMCPY_HOST_TO_DEVICE); status = rtMemcpy(args_, args_size_, &queue_info, args_size_, RT_MEMCPY_HOST_TO_DEVICE);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -279,12 +311,16 @@ Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) {


Status CpuTaskModelEnqueue::Distribute() { Status CpuTaskModelEnqueue::Distribute() {
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) {
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_ is 0 or stream_ is nullptr, arg_size:%u,"
"check invalid", args_size_);
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_);
return FAILED; return FAILED;
} }


rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelEnqueue, kCoreDim, args_, args_size_, nullptr, stream_); rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelEnqueue, kCoreDim, args_, args_size_, nullptr, stream_);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X",
status);
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelEnqueue failed, status: 0x%X", status); GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelEnqueue failed, status: 0x%X", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -301,6 +337,7 @@ Status CpuTaskModelEnqueue::Distribute() {
/// ///
Status CpuTaskActiveEntry::Init(rtStream_t stream) { Status CpuTaskActiveEntry::Init(rtStream_t stream) {
if (stream == nullptr) { if (stream == nullptr) {
REPORT_INNER_ERROR("E19999", "Param stream is nullptr, check invalid");
GELOGE(FAILED, "Task active stream not valid"); GELOGE(FAILED, "Task active stream not valid");
return FAILED; return FAILED;
} }
@@ -311,12 +348,16 @@ Status CpuTaskActiveEntry::Init(rtStream_t stream) {


Status CpuTaskActiveEntry::Distribute() { Status CpuTaskActiveEntry::Distribute() {
if ((active_stream_ == nullptr) || (stream_ == nullptr)) { if ((active_stream_ == nullptr) || (stream_ == nullptr)) {
REPORT_INNER_ERROR("E19999", "Param stream is nullptr or active_stream_ is nullptr, "
"check invalid");
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_);
return FAILED; return FAILED;
} }


rtError_t ret = rtStreamActive(active_stream_, stream_); rtError_t ret = rtStreamActive(active_stream_, stream_);
if (ret != RT_ERROR_NONE) { if (ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamActive failed, ret:0x%X",
ret);
GELOGE(RT_FAILED, "Call rt StreamActive failed, ret: 0x%X", ret); GELOGE(RT_FAILED, "Call rt StreamActive failed, ret: 0x%X", ret);
return RT_ERROR_TO_GE_STATUS(ret); return RT_ERROR_TO_GE_STATUS(ret);
} }
@@ -333,6 +374,8 @@ Status CpuTaskActiveEntry::Distribute() {
/// ///
Status CpuTaskWaitEndGraph::Init(uint32_t model_id) { Status CpuTaskWaitEndGraph::Init(uint32_t model_id) {
if ((args_ != nullptr) || (args_size_ > 0)) { if ((args_ != nullptr) || (args_size_ > 0)) {
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0,"
"check invalid", args_size_);
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); GELOGE(FAILED, "Task already initialized, size: %u", args_size_);
return FAILED; return FAILED;
} }
@@ -340,6 +383,8 @@ Status CpuTaskWaitEndGraph::Init(uint32_t model_id) {
args_size_ = sizeof(model_id); args_size_ = sizeof(model_id);
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -347,6 +392,8 @@ Status CpuTaskWaitEndGraph::Init(uint32_t model_id) {


status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE); status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -356,12 +403,16 @@ Status CpuTaskWaitEndGraph::Init(uint32_t model_id) {


Status CpuTaskWaitEndGraph::Distribute() { Status CpuTaskWaitEndGraph::Distribute() {
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) {
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr,"
"check invalid", args_size_);
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_);
return FAILED; return FAILED;
} }


rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskWaitEndGraph, kCoreDim, args_, args_size_, nullptr, stream_); rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskWaitEndGraph, kCoreDim, args_, args_size_, nullptr, stream_);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X",
status);
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch WaitEndGraph failed, status: 0x%X", status); GELOGE(RT_FAILED, "Call rt CpuKernelLaunch WaitEndGraph failed, status: 0x%X", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -378,6 +429,8 @@ Status CpuTaskWaitEndGraph::Distribute() {
/// ///
Status CpuTaskModelRepeat::Init(uint32_t model_id) { Status CpuTaskModelRepeat::Init(uint32_t model_id) {
if ((args_ != nullptr) || (args_size_ > 0)) { if ((args_ != nullptr) || (args_size_ > 0)) {
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0,"
"check invalid", args_size_);
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); GELOGE(FAILED, "Task already initialized, size: %u", args_size_);
return FAILED; return FAILED;
} }
@@ -385,6 +438,8 @@ Status CpuTaskModelRepeat::Init(uint32_t model_id) {
args_size_ = sizeof(model_id); args_size_ = sizeof(model_id);
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -392,6 +447,8 @@ Status CpuTaskModelRepeat::Init(uint32_t model_id) {


status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE); status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X",
args_size_, status);
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -401,12 +458,16 @@ Status CpuTaskModelRepeat::Init(uint32_t model_id) {


Status CpuTaskModelRepeat::Distribute() { Status CpuTaskModelRepeat::Distribute() {
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) {
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr,"
"check invalid", args_size_);
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_);
return FAILED; return FAILED;
} }


rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelRepeat, kCoreDim, args_, args_size_, nullptr, stream_); rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelRepeat, kCoreDim, args_, args_size_, nullptr, stream_);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X",
status);
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelRepeat failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelRepeat failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }


+ 34
- 174
ge/graph/load/model_manager/data_dumper.cc View File

@@ -72,24 +72,6 @@ static bool ParseNameIndex(const std::string &node_name_index, std::string &node
static bool IsTensorDescWithSkipDumpAddrType(bool has_mem_type_attr, vector<int64_t> v_memory_type, size_t i) { static bool IsTensorDescWithSkipDumpAddrType(bool has_mem_type_attr, vector<int64_t> v_memory_type, size_t i) {
return has_mem_type_attr && (v_memory_type[i] == RT_MEMORY_L1); return has_mem_type_attr && (v_memory_type[i] == RT_MEMORY_L1);
} }

static uint64_t GetNowTime() {
uint64_t ret = 0;
mmTimeval tv;
if (mmGetTimeOfDay(&tv, nullptr) == 0) {
ret = tv.tv_sec * 1000000ULL + tv.tv_usec;
}

return ret;
}

static void ReplaceStringElem(std::string &str) {
for_each(str.begin(), str.end(), [](char &ch) {
if ((ch == ' ') || (ch == '.') || (ch == '/') || (ch == '\\')) {
ch = '_';
}
});
}
} // namespace } // namespace


static int32_t GetIrDataType(ge::DataType data_type) { static int32_t GetIrDataType(ge::DataType data_type) {
@@ -194,66 +176,6 @@ void DataDumper::SaveOpDebugId(uint32_t task_id, uint32_t stream_id, void *op_de
is_op_debug_ = is_op_debug; is_op_debug_ = is_op_debug;
} }


void DataDumper::SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id,
uint32_t stream_id) {
GELOGD("Start SaveDumpOpInfo of task_id: %u, stream_id: %u", task_id, stream_id);
OpDescInfo op_desc_info;
op_desc_info.op_name = op->GetName();
op_desc_info.op_type = op->GetType();
op_desc_info.task_id = task_id;
op_desc_info.stream_id = stream_id;
for (size_t i = 0; i < op->GetAllInputsSize(); ++i) {
GeTensorDescPtr input_tensor_desc = op->MutableInputDesc(i);
if (input_tensor_desc == nullptr) {
continue;
}
op_desc_info.input_format.emplace_back(input_tensor_desc->GetFormat());
op_desc_info.input_shape.emplace_back(input_tensor_desc->GetShape().GetDims());
op_desc_info.input_data_type.emplace_back(input_tensor_desc->GetDataType());
int64_t input_size = 0;

if (TensorUtils::GetTensorSizeInBytes(*input_tensor_desc, input_size) != SUCCESS) {
GELOGW("Get input size failed");
return;
}
GELOGD("Save dump op info, the input size is %ld", input_size);
op_desc_info.input_size.emplace_back(input_size);
}
for (size_t j = 0; j < op->GetOutputsSize(); ++j) {
GeTensorDescPtr output_tensor_desc = op->MutableOutputDesc(j);
if (output_tensor_desc == nullptr) {
continue;
}
op_desc_info.output_format.emplace_back(output_tensor_desc->GetFormat());
op_desc_info.output_shape.emplace_back(output_tensor_desc->GetShape().GetDims());
op_desc_info.output_data_type.emplace_back(output_tensor_desc->GetDataType());
int64_t output_size = 0;
if (TensorUtils::GetTensorSizeInBytes(*output_tensor_desc, output_size) != SUCCESS) {
GELOGW("Get input size failed");
return;
}
GELOGD("Save dump op info, the output size is %ld", output_size);
op_desc_info.output_size.emplace_back(output_size);
}
op_desc_info.input_addrs = ModelUtils::GetInputDataAddrs(model_param, op);
op_desc_info.output_addrs = ModelUtils::GetOutputDataAddrs(model_param, op);

op_desc_info_.emplace_back(op_desc_info);
}

bool DataDumper::GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const {
GELOGI("There are %zu op need to dump.", op_desc_info_.size());
for (size_t index = 0; index < op_desc_info_.size(); ++index) {
OpDescInfo dump_op_info = op_desc_info_.at(index);
if (dump_op_info.task_id == task_id && dump_op_info.stream_id == stream_id) {
GELOGI("find exception op of task_id: %u, stream_id: %u.", task_id, stream_id);
op_desc_info = dump_op_info;
return true;
}
}
return false;
}

void DataDumper::SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc, void DataDumper::SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc,
uintptr_t args) { uintptr_t args) {
if (op_desc == nullptr) { if (op_desc == nullptr) {
@@ -325,6 +247,7 @@ Status DataDumper::GenerateOutput(aicpu::dump::Output &output, const OpDesc::Vis
} }
int64_t output_size = 0; int64_t output_size = 0;
if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), output_size) != SUCCESS) { if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), output_size) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get tensor size fail");
GELOGE(PARAM_INVALID, "Get output size filed"); GELOGE(PARAM_INVALID, "Get output size filed");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -385,8 +308,11 @@ Status DataDumper::DumpRefOutput(const DataDumper::InnerDumpInfo &inner_dump_inf


Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) { Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) {
const auto &output_descs = inner_dump_info.op->GetAllOutputsDesc(); const auto &output_descs = inner_dump_info.op->GetAllOutputsDesc();
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(runtime_param_, inner_dump_info.op);
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(*runtime_param_, inner_dump_info.op);
if (output_descs.size() != output_addrs.size()) { if (output_descs.size() != output_addrs.size()) {
REPORT_INNER_ERROR("E19999", "output_desc size:%zu != output addr size:%zu in op:%s(%s)",
output_descs.size(), output_addrs.size(),
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str());
GELOGE(PARAM_INVALID, "Invalid output desc addrs size %zu, op %s has %zu output desc.", output_addrs.size(), GELOGE(PARAM_INVALID, "Invalid output desc addrs size %zu, op %s has %zu output desc.", output_addrs.size(),
inner_dump_info.op->GetName().c_str(), output_descs.size()); inner_dump_info.op->GetName().c_str(), output_descs.size());
return PARAM_INVALID; return PARAM_INVALID;
@@ -411,6 +337,8 @@ Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicp
GELOGI("[L1Fusion] DumpOutputWithTask[%s] output[%zu] is l1 addr.", inner_dump_info.op->GetName().c_str(), i); GELOGI("[L1Fusion] DumpOutputWithTask[%s] output[%zu] is l1 addr.", inner_dump_info.op->GetName().c_str(), i);
int64_t output_size = 0; int64_t output_size = 0;
if (TensorUtils::GetTensorSizeInBytes(output_descs.at(i), output_size) != SUCCESS) { if (TensorUtils::GetTensorSizeInBytes(output_descs.at(i), output_size) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get output tensor size fail in op:%s(%s), index:%zu",
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str(), i);
GELOGE(PARAM_INVALID, "Get output size failed."); GELOGE(PARAM_INVALID, "Get output size failed.");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -436,8 +364,12 @@ Status DataDumper::DumpOutput(const InnerDumpInfo &inner_dump_info, aicpu::dump:
// else data, const or variable op // else data, const or variable op
aicpu::dump::Output output; aicpu::dump::Output output;
auto output_tensor = inner_dump_info.op->GetOutputDescPtr(inner_dump_info.output_anchor_index); auto output_tensor = inner_dump_info.op->GetOutputDescPtr(inner_dump_info.output_anchor_index);
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(runtime_param_, inner_dump_info.op);
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(*runtime_param_, inner_dump_info.op);
if (output_tensor == nullptr) { if (output_tensor == nullptr) {
REPORT_INNER_ERROR("E19999", "output_desc tensor is nullptr in op:%s(%s), index:%u, "
"check invalid",
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str(),
inner_dump_info.output_anchor_index);
GELOGE(PARAM_INVALID, "output_tensor is null, index: %d, size: %zu.", inner_dump_info.output_anchor_index, GELOGE(PARAM_INVALID, "output_tensor is null, index: %d, size: %zu.", inner_dump_info.output_anchor_index,
inner_dump_info.op->GetOutputsSize()); inner_dump_info.op->GetOutputsSize());
return PARAM_INVALID; return PARAM_INVALID;
@@ -461,6 +393,9 @@ Status DataDumper::DumpOutput(const InnerDumpInfo &inner_dump_info, aicpu::dump:
output.set_original_output_data_type(static_cast<int32_t>(output_tensor->GetOriginDataType())); output.set_original_output_data_type(static_cast<int32_t>(output_tensor->GetOriginDataType()));
// due to lhisi virtual addr bug, cannot use args now // due to lhisi virtual addr bug, cannot use args now
if (inner_dump_info.output_anchor_index >= static_cast<int>(output_addrs.size())) { if (inner_dump_info.output_anchor_index >= static_cast<int>(output_addrs.size())) {
REPORT_INNER_ERROR("E19999", "output_anchor_index:%u >= output addr size:%zu in op:%s(%s), "
"check invalid", inner_dump_info.output_anchor_index, output_addrs.size(),
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str());
GELOGE(FAILED, "Index is out of range."); GELOGE(FAILED, "Index is out of range.");
return FAILED; return FAILED;
} }
@@ -487,6 +422,7 @@ Status DataDumper::GenerateInput(aicpu::dump::Input &input, const OpDesc::Vistor
if (AttrUtils::GetInt(tensor_descs.at(index), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) { if (AttrUtils::GetInt(tensor_descs.at(index), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) {
GELOGI("Get aipp input size according to attr is %ld", input_size); GELOGI("Get aipp input size according to attr is %ld", input_size);
} else if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), input_size) != SUCCESS) { } else if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), input_size) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get tensor size fail");
GELOGE(PARAM_INVALID, "Get input size filed"); GELOGE(PARAM_INVALID, "Get input size filed");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -540,8 +476,11 @@ Status DataDumper::DumpRefInput(const DataDumper::InnerDumpInfo &inner_dump_info
Status DataDumper::DumpInput(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) { Status DataDumper::DumpInput(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) {
GELOGI("Start dump input"); GELOGI("Start dump input");
const auto &input_descs = inner_dump_info.op->GetAllInputsDesc(); const auto &input_descs = inner_dump_info.op->GetAllInputsDesc();
const std::vector<void *> input_addrs = ModelUtils::GetInputDataAddrs(runtime_param_, inner_dump_info.op);
const std::vector<void *> input_addrs = ModelUtils::GetInputDataAddrs(*runtime_param_, inner_dump_info.op);
if (input_descs.size() != input_addrs.size()) { if (input_descs.size() != input_addrs.size()) {
REPORT_INNER_ERROR("E19999", "input_desc size:%zu != input addr size:%zu in op:%s(%s)",
input_descs.size(), input_addrs.size(),
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str());
GELOGE(PARAM_INVALID, "Invalid input desc addrs size %zu, op %s has %zu input desc.", input_addrs.size(), GELOGE(PARAM_INVALID, "Invalid input desc addrs size %zu, op %s has %zu input desc.", input_addrs.size(),
inner_dump_info.op->GetName().c_str(), input_descs.size()); inner_dump_info.op->GetName().c_str(), input_descs.size());
return PARAM_INVALID; return PARAM_INVALID;
@@ -567,6 +506,8 @@ Status DataDumper::DumpInput(const InnerDumpInfo &inner_dump_info, aicpu::dump::
if (AttrUtils::GetInt(input_descs.at(i), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) { if (AttrUtils::GetInt(input_descs.at(i), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) {
GELOGI("Get aipp input size according to attr is %ld", input_size); GELOGI("Get aipp input size according to attr is %ld", input_size);
} else if (TensorUtils::GetTensorSizeInBytes(input_descs.at(i), input_size) != SUCCESS) { } else if (TensorUtils::GetTensorSizeInBytes(input_descs.at(i), input_size) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Get input tensor size fail in op:%s(%s), index:%zu",
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str(), i);
GELOGE(PARAM_INVALID, "Get input size failed."); GELOGE(PARAM_INVALID, "Get input size failed.");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -595,6 +536,7 @@ Status DataDumper::ExecuteLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_in
size_t proto_size = op_mapping_info.ByteSizeLong(); size_t proto_size = op_mapping_info.ByteSizeLong();
bool ret = op_mapping_info.SerializeToString(&proto_str); bool ret = op_mapping_info.SerializeToString(&proto_str);
if (!ret || proto_size == 0) { if (!ret || proto_size == 0) {
REPORT_INNER_ERROR("E19999", "Serialize proto to string fail");
GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size); GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size);
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -606,6 +548,8 @@ Status DataDumper::ExecuteLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_in


rtError_t rt_ret = rtMalloc(&dev_mem_load_, proto_size, RT_MEMORY_HBM); rtError_t rt_ret = rtMalloc(&dev_mem_load_, proto_size, RT_MEMORY_HBM);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret:0x%X",
proto_size, rt_ret);
GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -613,12 +557,15 @@ Status DataDumper::ExecuteLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_in


rt_ret = rtMemcpy(dev_mem_load_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE); rt_ret = rtMemcpy(dev_mem_load_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret:0x%X",
proto_size, rt_ret);
GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


rt_ret = rtDatadumpInfoLoad(dev_mem_load_, proto_size); rt_ret = rtDatadumpInfoLoad(dev_mem_load_, proto_size);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtDatadumpInfoLoad failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -633,6 +580,7 @@ Status DataDumper::ExecuteUnLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_
size_t proto_size = op_mapping_info.ByteSizeLong(); size_t proto_size = op_mapping_info.ByteSizeLong();
bool ret = op_mapping_info.SerializeToString(&proto_str); bool ret = op_mapping_info.SerializeToString(&proto_str);
if (!ret || proto_size == 0) { if (!ret || proto_size == 0) {
REPORT_INNER_ERROR("E19999", "Serialize proto to string fail");
GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size); GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size);
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -644,6 +592,8 @@ Status DataDumper::ExecuteUnLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_


rtError_t rt_ret = rtMalloc(&dev_mem_unload_, proto_size, RT_MEMORY_HBM); rtError_t rt_ret = rtMalloc(&dev_mem_unload_, proto_size, RT_MEMORY_HBM);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret:0x%X",
proto_size, rt_ret);
GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -651,12 +601,15 @@ Status DataDumper::ExecuteUnLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_


rt_ret = rtMemcpy(dev_mem_unload_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE); rt_ret = rtMemcpy(dev_mem_unload_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret:0x%X",
proto_size, rt_ret);
GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


rt_ret = rtDatadumpInfoLoad(dev_mem_unload_, proto_size); rt_ret = rtDatadumpInfoLoad(dev_mem_unload_, proto_size);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtDatadumpInfoLoad failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -873,97 +826,4 @@ void DataDumper::PrintCheckLog(string &dump_list_key) {
} }
} }
} }

Status DataDumper::DumpExceptionInput(const OpDescInfo &op_desc_info, const string &dump_file) {
GELOGI("Start to dump exception input");
for (size_t i = 0; i < op_desc_info.input_addrs.size(); i++) {
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.input_addrs.at(i), op_desc_info.input_size.at(i)) != SUCCESS) {
GELOGE(PARAM_INVALID, "Dump the %zu input data failed", i);
return PARAM_INVALID;
}
}
return SUCCESS;
}

Status DataDumper::DumpExceptionOutput(const OpDescInfo &op_desc_info, const string &dump_file) {
GELOGI("Start to dump exception output");
for (size_t i = 0; i < op_desc_info.output_addrs.size(); i++) {
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.output_addrs.at(i), op_desc_info.output_size.at(i)) !=
SUCCESS) {
GELOGE(PARAM_INVALID, "Dump the %zu input data failed", i);
return PARAM_INVALID;
}
}
return SUCCESS;
}

Status DataDumper::DumpExceptionInfo(const std::vector<rtExceptionInfo> exception_infos) {
GELOGI("Start to dump exception info");
for (const rtExceptionInfo &iter : exception_infos) {
OpDescInfo op_desc_info;
if (GetOpDescInfo(iter.streamid, iter.taskid, op_desc_info)) {
toolkit::dumpdata::DumpData dump_data;
dump_data.set_version("2.0");
dump_data.set_dump_time(GetNowTime());
dump_data.set_op_name(op_desc_info.op_name);
for (size_t i = 0; i < op_desc_info.input_format.size(); ++i) {
toolkit::dumpdata::OpInput input;
input.set_data_type(toolkit::dumpdata::OutputDataType(GetIrDataType(op_desc_info.input_data_type[i])));
input.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.input_format[i]));
for (auto dim : op_desc_info.input_shape[i]) {
input.mutable_shape()->add_dim(dim);
}
input.set_size(op_desc_info.input_size[i]);
GELOGI("The input size int exception is %ld", op_desc_info.input_size[i]);
dump_data.mutable_input()->Add(std::move(input));
}
for (size_t j = 0; j < op_desc_info.output_format.size(); ++j) {
toolkit::dumpdata::OpOutput output;
output.set_data_type(toolkit::dumpdata::OutputDataType(GetIrDataType(op_desc_info.output_data_type[j])));
output.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.output_format[j]));
for (auto dim : op_desc_info.output_shape[j]) {
output.mutable_shape()->add_dim(dim);
}
output.set_size(op_desc_info.output_size[j]);
GELOGI("The output size int exception is %ld", op_desc_info.output_size[j]);
dump_data.mutable_output()->Add(std::move(output));
}
uint64_t now_time = GetNowTime();
std::string op_name = op_desc_info.op_name;
std::string op_type = op_desc_info.op_type;
ReplaceStringElem(op_name);
ReplaceStringElem(op_type);
string dump_file_path =
"./" + op_type + "." + op_name + "." + std::to_string(op_desc_info.task_id) + "." + std::to_string(now_time);
GELOGI("The exception dump file path is %s", dump_file_path.c_str());

uint64_t proto_size = dump_data.ByteSizeLong();
std::unique_ptr<char[]> proto_msg(new (std::nothrow) char[proto_size]);
bool ret = dump_data.SerializeToArray(proto_msg.get(), proto_size);
if (!ret || proto_size == 0) {
GELOGE(PARAM_INVALID, "Dump data proto serialize failed");
return PARAM_INVALID;
}

GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), &proto_size, sizeof(uint64_t)),
"Failed to dump proto size");
GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), proto_msg.get(), proto_size),
"Failed to dump proto msg");
if (DumpExceptionInput(op_desc_info, dump_file_path) != SUCCESS) {
GELOGE(PARAM_INVALID, "Dump exception input failed");
return PARAM_INVALID;
}

if (DumpExceptionOutput(op_desc_info, dump_file_path) != SUCCESS) {
GELOGE(PARAM_INVALID, "Dump exception output failed");
return PARAM_INVALID;
}
GELOGI("Dump exception info SUCCESS");
} else {
GELOGE(PARAM_INVALID, "Get op desc info failed,task id:%u,stream id:%u", iter.taskid, iter.streamid);
return PARAM_INVALID;
}
}
return SUCCESS;
}
} // namespace ge } // namespace ge

+ 25
- 21
ge/graph/load/model_manager/data_dumper.h View File

@@ -36,9 +36,21 @@
namespace ge { namespace ge {
class DataDumper { class DataDumper {
public: public:
DataDumper() : runtime_param_{} {}

explicit DataDumper(const RuntimeParam &rsh) : runtime_param_(rsh) {}
explicit DataDumper(RuntimeParam *rsh)
: model_name_(),
model_id_(0),
runtime_param_(rsh),
dev_mem_load_(nullptr),
dev_mem_unload_(nullptr),
op_list_(),
input_map_(),
load_flag_(false),
device_id_(0),
global_step_(0),
loop_per_iter_(0),
loop_cond_(0),
compute_graph_(nullptr),
ref_info_() {}


~DataDumper(); ~DataDumper();


@@ -58,8 +70,6 @@ class DataDumper {


void SaveDumpInput(const std::shared_ptr<Node> &node); void SaveDumpInput(const std::shared_ptr<Node> &node);


void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id);

// args is device memory stored first output addr // args is device memory stored first output addr
void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc, uintptr_t args); void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc, uintptr_t args);
void SaveEndGraphId(uint32_t task_id, uint32_t stream_id); void SaveEndGraphId(uint32_t task_id, uint32_t stream_id);
@@ -75,14 +85,8 @@ class DataDumper {


void SetDumpProperties(const DumpProperties &dump_properties) { dump_properties_ = dump_properties; } void SetDumpProperties(const DumpProperties &dump_properties) { dump_properties_ = dump_properties; }
const DumpProperties &GetDumpProperties() const { return dump_properties_; } const DumpProperties &GetDumpProperties() const { return dump_properties_; }
bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const;
const std::vector<OpDescInfo> &GetAllOpDescInfo() const { return op_desc_info_; } const std::vector<OpDescInfo> &GetAllOpDescInfo() const { return op_desc_info_; }


// Dump exception info
Status DumpExceptionInput(const OpDescInfo &op_desc_info, const string &dump_file);
Status DumpExceptionOutput(const OpDescInfo &op_desc_info, const string &dump_file);
Status DumpExceptionInfo(const std::vector<rtExceptionInfo> exception_infos);

private: private:
void ReleaseDevMem(void **ptr) noexcept; void ReleaseDevMem(void **ptr) noexcept;


@@ -93,10 +97,10 @@ class DataDumper {
// for inference data dump // for inference data dump
std::string om_name_; std::string om_name_;


uint32_t model_id_ = 0;
const RuntimeParam &runtime_param_;
void *dev_mem_load_ = nullptr;
void *dev_mem_unload_ = nullptr;
uint32_t model_id_;
RuntimeParam *runtime_param_;
void *dev_mem_load_;
void *dev_mem_unload_;


struct InnerDumpInfo; struct InnerDumpInfo;
struct InnerInputMapping; struct InnerInputMapping;
@@ -107,12 +111,12 @@ class DataDumper {
uint32_t end_graph_stream_id_ = 0; uint32_t end_graph_stream_id_ = 0;
bool is_end_graph_ = false; bool is_end_graph_ = false;
std::multimap<std::string, InnerInputMapping> input_map_; // release after DavinciModel::Init std::multimap<std::string, InnerInputMapping> input_map_; // release after DavinciModel::Init
bool load_flag_ = false;
uint32_t device_id_ = 0;
uintptr_t global_step_ = 0;
uintptr_t loop_per_iter_ = 0;
uintptr_t loop_cond_ = 0;
ComputeGraphPtr compute_graph_ = nullptr; // release after DavinciModel::Init
bool load_flag_;
uint32_t device_id_;
uintptr_t global_step_;
uintptr_t loop_per_iter_;
uintptr_t loop_cond_;
ComputeGraphPtr compute_graph_; // release after DavinciModel::Init
std::map<OpDescPtr, void *> ref_info_; // release after DavinciModel::Init std::map<OpDescPtr, void *> ref_info_; // release after DavinciModel::Init
void *l1_fusion_addr_ = nullptr; void *l1_fusion_addr_ = nullptr;




+ 2
- 0
ge/graph/load/model_manager/data_inputer.h View File

@@ -134,6 +134,8 @@ class DataInputer {
/// ///
void Stop() { queue_.Stop(); } void Stop() { queue_.Stop(); }


uint32_t Size() { return queue_.Size(); }

private: private:
/// ///
/// @ingroup domi_ome /// @ingroup domi_ome


+ 401
- 77
ge/graph/load/model_manager/davinci_model.cc
File diff suppressed because it is too large
View File


+ 38
- 6
ge/graph/load/model_manager/davinci_model.h View File

@@ -29,6 +29,7 @@
#include "common/helper/om_file_helper.h" #include "common/helper/om_file_helper.h"
#include "common/opskernel/ge_task_info.h" #include "common/opskernel/ge_task_info.h"
#include "common/properties_manager.h" #include "common/properties_manager.h"
#include "common/dump/exception_dumper.h"
#include "common/dump/opdebug_register.h" #include "common/dump/opdebug_register.h"
#include "common/types.h" #include "common/types.h"
#include "framework/common/util.h" #include "framework/common/util.h"
@@ -221,6 +222,11 @@ class DavinciModel {
/// ///
DataInputer *const GetDataInputer() const { return data_inputer_; } DataInputer *const GetDataInputer() const { return data_inputer_; }


uint32_t GetDataInputerSize() {
GE_CHECK_NOTNULL(data_inputer_);
return data_inputer_->Size();
}

// get Stream number // get Stream number
uint32_t StreamNum() const { return runtime_param_.stream_num; } uint32_t StreamNum() const { return runtime_param_.stream_num; }


@@ -248,7 +254,10 @@ class DavinciModel {
string Name() const { return name_; } string Name() const { return name_; }


// om_name // om_name
string OmName() const { return om_name_; }
const string &OmName() const { return om_name_; }

// dump_model_name
const string &DumpModelName() const { return dump_model_name_; }


// version // version
uint32_t Version() const { return version_; } uint32_t Version() const { return version_; }
@@ -273,6 +282,8 @@ class DavinciModel {


const vector<rtLabel_t> &GetLabelList() const { return label_list_; } const vector<rtLabel_t> &GetLabelList() const { return label_list_; }


Status GetLabelGotoAddr(uint32_t label_index, rtMemType_t memory_type, void *&addr, uint32_t &size);

Status DestroyThread(); Status DestroyThread();


// get Op // get Op
@@ -466,13 +477,17 @@ class DavinciModel {
Status ReportProfilingData(); Status ReportProfilingData();


void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id) { void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id) {
data_dumper_.SaveDumpOpInfo(model_param, op, task_id, stream_id);
exception_dumper_.SaveDumpOpInfo(model_param, op, task_id, stream_id);
} }


void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const shared_ptr<OpDesc> &op_desc, uintptr_t args) { void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const shared_ptr<OpDesc> &op_desc, uintptr_t args) {
data_dumper_.SaveDumpTask(task_id, stream_id, op_desc, args); data_dumper_.SaveDumpTask(task_id, stream_id, op_desc, args);
} }


Status DumpExceptionInfo(const std::vector<rtExceptionInfo> &exception_infos) const {
return exception_dumper_.DumpExceptionInfo(exception_infos);
}

void SetKnownShapeGlobalStep(void *global_step) { void SetKnownShapeGlobalStep(void *global_step) {
known_shape_global_step_ = global_step; known_shape_global_step_ = global_step;
} }
@@ -481,6 +496,12 @@ class DavinciModel {
data_dumper_.DumpShrink(); data_dumper_.DumpShrink();
} }


bool OpNeedDump(const string &op_name) {
return GetDumpProperties().IsLayerNeedDump(dump_model_name_, om_name_, op_name);
}

bool ModelNeedDump();

void SetEndGraphId(uint32_t task_id, uint32_t stream_id); void SetEndGraphId(uint32_t task_id, uint32_t stream_id);
DavinciModel &operator=(const DavinciModel &model) = delete; DavinciModel &operator=(const DavinciModel &model) = delete;


@@ -529,10 +550,10 @@ class DavinciModel {
void SetKnownNode(bool known_node) { known_node_ = known_node; } void SetKnownNode(bool known_node) { known_node_ = known_node; }
bool IsKnownNode() { return known_node_; } bool IsKnownNode() { return known_node_; }
Status MallocKnownArgs(); Status MallocKnownArgs();
Status CheckCapability(rtFeatureType_t featureType, int32_t featureInfo, bool &is_support) const;
Status UpdateKnownNodeArgs(const vector<void *> &inputs, const vector<void *> &outputs); Status UpdateKnownNodeArgs(const vector<void *> &inputs, const vector<void *> &outputs);
Status CreateKnownZeroCopyMap(const vector<void *> &inputs, const vector<void *> &outputs); Status CreateKnownZeroCopyMap(const vector<void *> &inputs, const vector<void *> &outputs);
Status UpdateKnownZeroCopyAddr(vector<void *> &total_io_addrs, bool update_args = true); Status UpdateKnownZeroCopyAddr(vector<void *> &total_io_addrs, bool update_args = true);
void SetKnownNodeAddrNotChanged(bool base_addr_not_changed) { base_addr_not_changed_ = base_addr_not_changed; }


Status GetOrigInputInfo(uint32_t index, OriginInputInfo &orig_input_info) const; Status GetOrigInputInfo(uint32_t index, OriginInputInfo &orig_input_info) const;
Status GetAllAippInputOutputDims(uint32_t index, vector<InputOutputDims> &input_dims, Status GetAllAippInputOutputDims(uint32_t index, vector<InputOutputDims> &input_dims,
@@ -540,13 +561,19 @@ class DavinciModel {


// om file name // om file name
void SetOmName(const string &om_name) { om_name_ = om_name; } void SetOmName(const string &om_name) { om_name_ = om_name; }
void SetDumpModelName(const string &dump_model_name) { dump_model_name_ = dump_model_name; }


void SetDumpProperties(const DumpProperties &dump_properties) { data_dumper_.SetDumpProperties(dump_properties); } void SetDumpProperties(const DumpProperties &dump_properties) { data_dumper_.SetDumpProperties(dump_properties); }
const DumpProperties &GetDumpProperties() const { return data_dumper_.GetDumpProperties(); } const DumpProperties &GetDumpProperties() const { return data_dumper_.GetDumpProperties(); }


bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const { 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);
return exception_dumper_.GetOpDescInfo(stream_id, task_id, op_desc_info);
} }
void UpdateOpIOAddrs(uint32_t task_id, uint32_t stream_id, const std::vector<void *> &io_addrs);

bool GetRunningFlag() const { return running_flg_; }
void SetRunningFlag(bool flag) { running_flg_ = flag; }
Status SetRunAsyncListenerCallback(const RunAsyncCallback &callback);


private: private:
// memory address of weights // memory address of weights
@@ -886,6 +913,7 @@ class DavinciModel {


// used for inference data dump // used for inference data dump
string om_name_; string om_name_;
string dump_model_name_;


uint32_t version_; uint32_t version_;
GeModelPtr ge_model_; // release after DavinciModel::Init GeModelPtr ge_model_; // release after DavinciModel::Init
@@ -911,6 +939,8 @@ class DavinciModel {
shared_ptr<ModelListener> listener_; shared_ptr<ModelListener> listener_;


bool run_flg_; bool run_flg_;
// check whether model is running with data
bool running_flg_ = false;


mutex mux_run_flg_; mutex mux_run_flg_;


@@ -930,6 +960,9 @@ class DavinciModel {
vector<rtLabel_t> label_list_; vector<rtLabel_t> label_list_;
set<uint32_t> label_id_indication_; set<uint32_t> label_id_indication_;


mutex label_args_mutex_;
map<uint32_t, pair<void *, uint32_t>> label_goto_args_;

mutex outside_addrs_mutex_; mutex outside_addrs_mutex_;
vector<ZeroCopyTask> zero_copy_tasks_; // Task used Data or NetOutput addr. vector<ZeroCopyTask> zero_copy_tasks_; // Task used Data or NetOutput addr.
set<const void *> copy_only_addrs_; // Address need copy to original place. set<const void *> copy_only_addrs_; // Address need copy to original place.
@@ -985,6 +1018,7 @@ class DavinciModel {
int64_t maxDumpOpNum_; int64_t maxDumpOpNum_;
// for data dump // for data dump
DataDumper data_dumper_; DataDumper data_dumper_;
ExceptionDumper exception_dumper_;
OpdebugRegister opdebug_register_; OpdebugRegister opdebug_register_;
uint64_t iterator_count_; uint64_t iterator_count_;
bool is_l1_fusion_enable_; bool is_l1_fusion_enable_;
@@ -1002,8 +1036,6 @@ class DavinciModel {
map<const void *, void *> known_input_data_info_; map<const void *, void *> known_input_data_info_;
map<const void *, void *> known_output_data_info_; map<const void *, void *> known_output_data_info_;
vector<void *> total_io_addrs_; vector<void *> total_io_addrs_;
vector<void *> orig_total_io_addrs_;
bool base_addr_not_changed_ = false;


vector<vector<int64_t>> batch_info_; vector<vector<int64_t>> batch_info_;
vector<vector<int64_t>> combined_batch_info_; vector<vector<int64_t>> combined_batch_info_;


+ 158
- 21
ge/graph/load/model_manager/model_manager.cc View File

@@ -99,11 +99,17 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u


auto kernel_size = sizeof(uint64_t) * (v_aicpu_kernel.size()); auto kernel_size = sizeof(uint64_t) * (v_aicpu_kernel.size());
rtError_t rt_ret = rtMalloc(&aicpu_kernel_addr, kernel_size, RT_MEMORY_HBM); rtError_t rt_ret = rtMalloc(&aicpu_kernel_addr, kernel_size, RT_MEMORY_HBM);
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE, GELOGE(RT_FAILED, "rtMalloc error, ret: 0x%X", rt_ret);
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE,
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret: 0x%X",
kernel_size, rt_ret);
GELOGE(RT_FAILED, "rtMalloc error, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret);) return RT_ERROR_TO_GE_STATUS(rt_ret);)


rt_ret = rtMemcpy(aicpu_kernel_addr, kernel_size, v_aicpu_kernel.data(), kernel_size, RT_MEMCPY_HOST_TO_DEVICE); rt_ret = rtMemcpy(aicpu_kernel_addr, kernel_size, v_aicpu_kernel.data(), kernel_size, RT_MEMCPY_HOST_TO_DEVICE);
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE, GELOGE(RT_FAILED, "rtMemcpy to input_output_addr_ error: 0x%X", rt_ret);
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE,
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret: 0x%X",
kernel_size, rt_ret);
GELOGE(RT_FAILED, "rtMemcpy to input_output_addr_ error: 0x%X", rt_ret);
GE_CHK_RT(rtFree(aicpu_kernel_addr)); return RT_ERROR_TO_GE_STATUS(rt_ret);) GE_CHK_RT(rtFree(aicpu_kernel_addr)); return RT_ERROR_TO_GE_STATUS(rt_ret);)
uint64_t kernel_id_addr = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(aicpu_kernel_addr)); uint64_t kernel_id_addr = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(aicpu_kernel_addr));
param_base.fwkKernelBase.fwk_kernel.kernelID = kernel_id_addr; param_base.fwkKernelBase.fwk_kernel.kernelID = kernel_id_addr;
@@ -114,6 +120,8 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u


rtError_t rt_ret = rtMalloc(&(devicebase), sizeof(STR_FWK_OP_KERNEL), RT_MEMORY_HBM); rtError_t rt_ret = rtMalloc(&(devicebase), sizeof(STR_FWK_OP_KERNEL), RT_MEMORY_HBM);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret: 0x%X",
sizeof(STR_FWK_OP_KERNEL), rt_ret);
GELOGE(RT_FAILED, "malloc device memory failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "malloc device memory failed. ret: 0x%X", rt_ret);
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr)));
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
@@ -122,6 +130,8 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u
rt_ret = rt_ret =
rtMemcpy(devicebase, sizeof(STR_FWK_OP_KERNEL), &param_base, sizeof(STR_FWK_OP_KERNEL), RT_MEMCPY_HOST_TO_DEVICE); rtMemcpy(devicebase, sizeof(STR_FWK_OP_KERNEL), &param_base, sizeof(STR_FWK_OP_KERNEL), RT_MEMCPY_HOST_TO_DEVICE);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret: 0x%X",
sizeof(STR_FWK_OP_KERNEL), rt_ret);
GELOGE(RT_FAILED, "memory copy to device failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "memory copy to device failed. ret: 0x%X", rt_ret);
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr)));
GE_CHK_RT(rtFree(devicebase)); GE_CHK_RT(rtFree(devicebase));
@@ -131,6 +141,7 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u
rtStream_t stream = nullptr; rtStream_t stream = nullptr;
rt_ret = rtStreamCreate(&stream, 0); rt_ret = rtStreamCreate(&stream, 0);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamCreate failed, ret: 0x%X", rt_ret);
GELOGE(RT_FAILED, "create stream failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "create stream failed. ret: 0x%X", rt_ret);
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr)));
GE_CHK_RT(rtFree(devicebase)); GE_CHK_RT(rtFree(devicebase));
@@ -139,6 +150,7 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u


rt_ret = rtKernelLaunchEx(devicebase, sizeof(STR_FWK_OP_KERNEL), 0, stream); rt_ret = rtKernelLaunchEx(devicebase, sizeof(STR_FWK_OP_KERNEL), 0, stream);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtKernelLaunchEx failed, ret: 0x%X", rt_ret);
GELOGE(RT_FAILED, "rtKernelLaunchEx failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "rtKernelLaunchEx failed. ret: 0x%X", rt_ret);
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr)));
GE_CHK_RT(rtFree(devicebase)); GE_CHK_RT(rtFree(devicebase));
@@ -147,6 +159,8 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u
} }
rt_ret = rtStreamSynchronize(stream); rt_ret = rtStreamSynchronize(stream);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamSynchronize failed, ret: 0x%X",
rt_ret);
GELOGE(RT_FAILED, "rtStreamSynchronize failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "rtStreamSynchronize failed. ret: 0x%X", rt_ret);
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr)));
GE_CHK_RT(rtFree(devicebase)); GE_CHK_RT(rtFree(devicebase));
@@ -156,6 +170,7 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u
if (aicpu_kernel_addr != nullptr) { if (aicpu_kernel_addr != nullptr) {
rt_ret = rtFree(aicpu_kernel_addr); rt_ret = rtFree(aicpu_kernel_addr);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtFree failed, ret: 0x%X", rt_ret);
GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret);
GE_CHK_RT(rtFree(devicebase)); GE_CHK_RT(rtFree(devicebase));
GE_CHK_RT(rtStreamDestroy(stream)); GE_CHK_RT(rtStreamDestroy(stream));
@@ -164,12 +179,14 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u
} }
rt_ret = rtFree(devicebase); rt_ret = rtFree(devicebase);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtFree failed, ret: 0x%X", rt_ret);
GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret);
GE_CHK_RT(rtStreamDestroy(stream)); GE_CHK_RT(rtStreamDestroy(stream));
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
rt_ret = rtStreamDestroy(stream); rt_ret = rtStreamDestroy(stream);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamDestroy failed, ret: 0x%X", rt_ret);
GELOGE(RT_FAILED, "rtStreamDestroy failed. ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "rtStreamDestroy failed. ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -216,6 +233,8 @@ ge::Status ModelManager::DestroyAicpuSessionForInfer(uint32_t model_id) {


auto it = model_map_.find(model_id); auto it = model_map_.find(model_id);
if (it == model_map_.end()) { if (it == model_map_.end()) {
REPORT_INNER_ERROR("E19999", "Param model_id:%u can't find in model_map, check invalid",
model_id);
GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", model_id); GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", model_id);
return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID; return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID;
} }
@@ -233,6 +252,8 @@ ge::Status ModelManager::DestroyAicpuKernel(uint64_t session_id, uint32_t model_
Status ret = KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType::FWK_ADPT_KERNEL_DESTROY, session_id, model_id, Status ret = KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType::FWK_ADPT_KERNEL_DESTROY, session_id, model_id,
sub_model_id); sub_model_id);
if (ret != SUCCESS) { if (ret != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call KernelLaunchEx fail, model_id:%u, sub_model_id:%u, session_id:%lu",
model_id, sub_model_id, session_id);
GELOGE(FAILED, "Destroy aicpu kernel failed."); GELOGE(FAILED, "Destroy aicpu kernel failed.");
return FAILED; return FAILED;
} }
@@ -259,6 +280,7 @@ ModelManager::~ModelManager() {
model_map_.clear(); model_map_.clear();
model_aicpu_kernel_.clear(); model_aicpu_kernel_.clear();
cust_aicpu_so_.clear(); cust_aicpu_so_.clear();
dump_exception_flag_ = false;


GE_IF_BOOL_EXEC(device_count > 0, GE_CHK_RT(rtDeviceReset(0))); GE_IF_BOOL_EXEC(device_count > 0, GE_CHK_RT(rtDeviceReset(0)));
} }
@@ -271,7 +293,7 @@ ge::Status ModelManager::SetDynamicSize(uint32_t model_id, const std::vector<uin
return SUCCESS; return SUCCESS;
} }


ge::Status ModelManager::DoLoadHybridModelOnline(uint32_t model_id, const string &model_name,
ge::Status ModelManager::DoLoadHybridModelOnline(uint32_t model_id, const string &om_name,
const shared_ptr<ge::GeRootModel> &ge_root_model, const shared_ptr<ge::GeRootModel> &ge_root_model,
const shared_ptr<ModelListener> &listener) { const shared_ptr<ModelListener> &listener) {
auto hybrid_model = hybrid::HybridDavinciModel::Create(ge_root_model); auto hybrid_model = hybrid::HybridDavinciModel::Create(ge_root_model);
@@ -279,13 +301,26 @@ ge::Status ModelManager::DoLoadHybridModelOnline(uint32_t model_id, const string
hybrid_model->SetListener(listener); hybrid_model->SetListener(listener);
hybrid_model->SetModelId(model_id); hybrid_model->SetModelId(model_id);
hybrid_model->SetDeviceId(GetContext().DeviceId()); hybrid_model->SetDeviceId(GetContext().DeviceId());
hybrid_model->SetModelName(model_name);
hybrid_model->SetOmName(om_name);
GE_CHK_STATUS_RET(hybrid_model->Init(), "Failed to init hybrid model. model_id = %u", model_id); GE_CHK_STATUS_RET(hybrid_model->Init(), "Failed to init hybrid model. model_id = %u", model_id);
auto shared_model = std::shared_ptr<hybrid::HybridDavinciModel>(hybrid_model.release()); auto shared_model = std::shared_ptr<hybrid::HybridDavinciModel>(hybrid_model.release());
InsertModel(model_id, shared_model); InsertModel(model_id, shared_model);
return SUCCESS; return SUCCESS;
} }


bool ModelManager::IsNeedHybridLoad(ge::GeRootModel &ge_root_model) {
auto root_graph = ge_root_model.GetRootGraph();
if (root_graph == nullptr) {
REPORT_INNER_ERROR("E19999", "root graph in param ge_root_model is nullptr, model_id:%u, "
"check invalid", ge_root_model.GetModelId());
GELOGE(FAILED, "no model on root model");
return false;
}
bool is_shape_unknown = root_graph->GetGraphUnknownFlag();
bool is_dsp_partitioned_graph = false;
(void)AttrUtils::GetBool(root_graph, ATTR_NAME_DYNAMIC_SHAPE_PARTITIONED, is_dsp_partitioned_graph);
return is_shape_unknown || is_dsp_partitioned_graph || GetContext().GetHostExecFlag();
}
/// ///
/// @ingroup domi_ome /// @ingroup domi_ome
/// @brief load model online /// @brief load model online
@@ -296,19 +331,18 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge
GE_CHK_BOOL_RET_STATUS(listener.get() != nullptr, PARAM_INVALID, "Param incorrect, listener is null"); GE_CHK_BOOL_RET_STATUS(listener.get() != nullptr, PARAM_INVALID, "Param incorrect, listener is null");
if (model_id == INVALID_MODEL_ID) { if (model_id == INVALID_MODEL_ID) {
GenModelId(&model_id); GenModelId(&model_id);
GELOGD("Generate new model_id:%u", model_id);
} }

bool is_shape_unknown = false;
string model_name = "";
GE_CHK_STATUS_RET(ge_root_model->CheckIsUnknownShape(is_shape_unknown), "CheckIsUnknownShape failed, model id:%u",
model_id);
if (is_shape_unknown || GetContext().GetHostExecFlag()) {
return DoLoadHybridModelOnline(model_id, model_name, ge_root_model, listener);
auto name_to_model = ge_root_model->GetSubgraphInstanceNameToModel();
string om_name;
if (IsNeedHybridLoad(*ge_root_model)) {
return DoLoadHybridModelOnline(model_id, om_name, ge_root_model, listener);
} }


mmTimespec timespec = mmGetTickCount(); mmTimespec timespec = mmGetTickCount();
std::shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(0, listener); std::shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(0, listener);
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_CALL_ERROR("E19999", "New DavinciModel fail, model_id:%u", model_id);
GELOGE(FAILED, "davinci_model is nullptr"); GELOGE(FAILED, "davinci_model is nullptr");
return FAILED; return FAILED;
} }
@@ -324,7 +358,6 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge
auto root_graph = ge_root_model->GetRootGraph(); auto root_graph = ge_root_model->GetRootGraph();
GE_CHECK_NOTNULL(root_graph); GE_CHECK_NOTNULL(root_graph);
string root_model_name = root_graph->GetName(); string root_model_name = root_graph->GetName();
auto name_to_model = ge_root_model->GetSubgraphInstanceNameToModel();
GeModelPtr ge_model = name_to_model[root_model_name]; GeModelPtr ge_model = name_to_model[root_model_name];
Status ret = SUCCESS; Status ret = SUCCESS;
do { do {
@@ -332,7 +365,18 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge
GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Assign(ge_model)), GELOGW("assign model to modeldef failed."); GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Assign(ge_model)), GELOGW("assign model to modeldef failed.");
break;); break;);
GE_TIMESTAMP_END(Assign, "GraphLoader::ModelAssign"); GE_TIMESTAMP_END(Assign, "GraphLoader::ModelAssign");

/// In multi-threaded inference, using the same session_id among multiple threads may cause some threads to fail.
/// These session_ids come from the same model, so the values of session_id are the same.
/// Update session_id for infer in load model to avoid the same session_id.
if (!ge_root_model->GetTrainFlag()) {
uint64_t new_session_id;
ret = GenSessionId(new_session_id);
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ret, "Generate session_id for infer failed.");
ret = davinci_model->UpdateSessionId(new_session_id);
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ret, "Update session_id for infer failed.");
ge_model->InsertSessionMap(model_id, new_session_id);
GELOGD("Update new session id: %lu.", new_session_id);
}
GE_TIMESTAMP_START(Init); GE_TIMESTAMP_START(Init);
GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Init()), GELOGW("DavinciInit failed."); break;); GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Init()), GELOGW("DavinciInit failed."); break;);
GE_TIMESTAMP_END(Init, "GraphLoader::ModelInit"); GE_TIMESTAMP_END(Init, "GraphLoader::ModelInit");
@@ -345,16 +389,16 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge
return ret; return ret;
} }


void ModelManager::InsertModel(uint32_t id, std::shared_ptr<DavinciModel> &davinci_model) {
GE_CHK_BOOL_EXEC(davinci_model != nullptr, return, "davinci_model ptr is null, id: %u", id);
void ModelManager::InsertModel(uint32_t model_id, std::shared_ptr<DavinciModel> &davinci_model) {
GE_CHK_BOOL_EXEC(davinci_model != nullptr, return, "davinci_model ptr is null, id: %u", model_id);
std::lock_guard<std::recursive_mutex> lock(map_mutex_); std::lock_guard<std::recursive_mutex> lock(map_mutex_);
model_map_[id] = davinci_model;
model_map_[model_id] = davinci_model;
} }


void ModelManager::InsertModel(uint32_t id, shared_ptr<hybrid::HybridDavinciModel> &hybrid_model) {
GE_CHK_BOOL_EXEC(hybrid_model != nullptr, return, "hybrid_model ptr is null, id: %u", id);
void ModelManager::InsertModel(uint32_t model_id, shared_ptr<hybrid::HybridDavinciModel> &hybrid_model) {
GE_CHK_BOOL_EXEC(hybrid_model != nullptr, return, "hybrid_model ptr is null, id: %u", model_id);
std::lock_guard<std::recursive_mutex> lock(map_mutex_); std::lock_guard<std::recursive_mutex> lock(map_mutex_);
hybrid_model_map_[id] = hybrid_model;
hybrid_model_map_[model_id] = hybrid_model;
} }


Status ModelManager::DeleteModel(uint32_t id) { Status ModelManager::DeleteModel(uint32_t id) {
@@ -374,6 +418,8 @@ Status ModelManager::DeleteModel(uint32_t id) {
} else if (hybrid_model_it != hybrid_model_map_.end()) { } else if (hybrid_model_it != hybrid_model_map_.end()) {
(void)hybrid_model_map_.erase(hybrid_model_it); (void)hybrid_model_map_.erase(hybrid_model_it);
} else { } else {
REPORT_INNER_ERROR("E19999", "model_id:%u not exist in model_map, check invalid",
id);
GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", id); GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", id);
return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID; return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID;
} }
@@ -420,6 +466,7 @@ Status ModelManager::DataInput(const InputData &input_data, OutputData &output_d


Status status = data_wrap->Init(input_data, output_data); Status status = data_wrap->Init(input_data, output_data);
if (status != SUCCESS) { if (status != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Init InputDataWrapper failed, input data index: %u", input_data.index);
GELOGE(domi::PUSH_DATA_FAILED, "Init InputDataWrapper failed, input data index: %u.", input_data.index); GELOGE(domi::PUSH_DATA_FAILED, "Init InputDataWrapper failed, input data index: %u.", input_data.index);
return domi::PUSH_DATA_FAILED; return domi::PUSH_DATA_FAILED;
} }
@@ -436,6 +483,7 @@ Status ModelManager::DataInput(const InputData &input_data, OutputData &output_d
DataInputer *inputer = model->GetDataInputer(); DataInputer *inputer = model->GetDataInputer();
GE_CHECK_NOTNULL(inputer); GE_CHECK_NOTNULL(inputer);
if (inputer->Push(data_wrap) != SUCCESS) { if (inputer->Push(data_wrap) != SUCCESS) {
REPORT_CALL_ERROR("E19999", "DataInputer queue is full, please call again later, model_id %u", model_id);
GELOGE(domi::DATA_QUEUE_ISFULL, "Data queue is full, please call again later, model_id %u ", model_id); GELOGE(domi::DATA_QUEUE_ISFULL, "Data queue is full, please call again later, model_id %u ", model_id);
return domi::DATA_QUEUE_ISFULL; return domi::DATA_QUEUE_ISFULL;
} }
@@ -449,6 +497,9 @@ Status ModelManager::GetCurDynamicDims(const vector<vector<int64_t>> &user_real_
vector<int32_t> &cur_dynamic_dims) { vector<int32_t> &cur_dynamic_dims) {
GELOGD("Start get cur dynamic dims."); GELOGD("Start get cur dynamic dims.");
if (user_real_input_dims.size() != user_input_dims.size()) { if (user_real_input_dims.size() != user_input_dims.size()) {
REPORT_INNER_ERROR("E19999", "Param user_real_input_dims.size:%zu != user_input_dims.size:%zu, "
"check invalid",
user_real_input_dims.size(), user_input_dims.size());
GELOGE(INTERNAL_ERROR, GELOGE(INTERNAL_ERROR,
"The input count of user: %zu should be equal to the data count of graph: %zu", "The input count of user: %zu should be equal to the data count of graph: %zu",
user_real_input_dims.size(), user_input_dims.size()); user_real_input_dims.size(), user_input_dims.size());
@@ -457,6 +508,9 @@ Status ModelManager::GetCurDynamicDims(const vector<vector<int64_t>> &user_real_


for (size_t i = 0; i < user_input_dims.size(); ++i) { for (size_t i = 0; i < user_input_dims.size(); ++i) {
if (user_real_input_dims[i].size() != user_input_dims[i].second.size()) { if (user_real_input_dims[i].size() != user_input_dims[i].second.size()) {
REPORT_INNER_ERROR("E19999", "Param user_real_input_dims[%zu].size:%zu != user_input_dims[%zu].size:%zu, "
"check invalid", i, user_real_input_dims[i].size(),
i, user_input_dims[i].second.size());
GELOGE(INTERNAL_ERROR, GELOGE(INTERNAL_ERROR,
"The shape size: %zu of dynamic input: %s should be equal to the shape size of input shape: %zu.", "The shape size: %zu of dynamic input: %s should be equal to the shape size of input shape: %zu.",
user_real_input_dims[i].size(), user_input_dims[i].first.c_str(), user_input_dims[i].second.size()); user_real_input_dims[i].size(), user_input_dims[i].first.c_str(), user_input_dims[i].second.size());
@@ -478,6 +532,8 @@ Status ModelManager::GetCurDynamicDims(const vector<vector<int64_t>> &user_real_
} }
} }
if (!cur_dynamic_dims_valid) { if (!cur_dynamic_dims_valid) {
REPORT_INNER_ERROR("E19999", "cur dynamic dims is %s, not exist in options, check invalid",
formats::JoinToString(cur_dynamic_dims).c_str());
GELOGE(INTERNAL_ERROR, "Cur dynamic dims is %s, not exist in options.", GELOGE(INTERNAL_ERROR, "Cur dynamic dims is %s, not exist in options.",
formats::JoinToString(cur_dynamic_dims).c_str()); formats::JoinToString(cur_dynamic_dims).c_str());
return INTERNAL_ERROR; return INTERNAL_ERROR;
@@ -629,6 +685,8 @@ Status ModelManager::HandleCommand(const Command &command) {


auto iter = cmds.find(command.cmd_type); auto iter = cmds.find(command.cmd_type);
if (iter == cmds.end()) { if (iter == cmds.end()) {
REPORT_INNER_ERROR("E19999", "Unsupported command:%s check",
command.cmd_type.c_str());
GELOGE(PARAM_INVALID, "Unsupported command: %s", command.cmd_type.c_str()); GELOGE(PARAM_INVALID, "Unsupported command: %s", command.cmd_type.c_str());
return PARAM_INVALID; return PARAM_INVALID;
} else { } else {
@@ -639,6 +697,9 @@ Status ModelManager::HandleCommand(const Command &command) {
Status ModelManager::GetModelByCmd(const Command &command, Status ModelManager::GetModelByCmd(const Command &command,
std::shared_ptr<DavinciModel> &davinci_model) { std::shared_ptr<DavinciModel> &davinci_model) {
if (command.cmd_params.size() < kCmdParSize) { if (command.cmd_params.size() < kCmdParSize) {
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu < kCmdParSize:%u, command_type:%s, "
"check invalid", command.cmd_params.size(), kCmdParSize,
command.cmd_type.c_str());
GELOGE(PARAM_INVALID, "When the cmd_type is '%s', the size of cmd_params must larger than 2.", GELOGE(PARAM_INVALID, "When the cmd_type is '%s', the size of cmd_params must larger than 2.",
command.cmd_type.c_str()); command.cmd_type.c_str());
return PARAM_INVALID; return PARAM_INVALID;
@@ -651,12 +712,18 @@ Status ModelManager::GetModelByCmd(const Command &command,
try { try {
model_id = std::stoi(value); model_id = std::stoi(value);
} catch (std::invalid_argument &) { } catch (std::invalid_argument &) {
REPORT_INNER_ERROR("E19999", "%s param:%s, check invalid", PROFILE_MODEL_ID.c_str(),
value.c_str());
GELOGE(PARAM_INVALID, "Model id: %s is invalid.", value.c_str()); GELOGE(PARAM_INVALID, "Model id: %s is invalid.", value.c_str());
return PARAM_INVALID; return PARAM_INVALID;
} catch (std::out_of_range &) { } catch (std::out_of_range &) {
REPORT_INNER_ERROR("E19999", "%s param:%s, check out of range", PROFILE_MODEL_ID.c_str(),
value.c_str());
GELOGE(PARAM_INVALID, "Model id: %s is out of range.", value.c_str()); GELOGE(PARAM_INVALID, "Model id: %s is out of range.", value.c_str());
return PARAM_INVALID; return PARAM_INVALID;
} catch (...) { } catch (...) {
REPORT_INNER_ERROR("E19999", "%s param:%s, check cannot change to int",
PROFILE_MODEL_ID.c_str(), value.c_str());
GELOGE(FAILED, "Model id: %s cannot change to int.", value.c_str()); GELOGE(FAILED, "Model id: %s cannot change to int.", value.c_str());
return FAILED; return FAILED;
} }
@@ -665,10 +732,14 @@ Status ModelManager::GetModelByCmd(const Command &command,
GE_CHECK_NOTNULL(model_manager); GE_CHECK_NOTNULL(model_manager);
davinci_model = model_manager->GetModel(static_cast<uint32_t>(model_id)); davinci_model = model_manager->GetModel(static_cast<uint32_t>(model_id));
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_INNER_ERROR("E19999", "GetModel from model_manager fail, model_id:%u",
model_id);
GELOGE(FAILED, "Model id: %d is invaild or model is not loaded.", model_id); GELOGE(FAILED, "Model id: %d is invaild or model is not loaded.", model_id);
return FAILED; return FAILED;
} }
} else { } else {
REPORT_INNER_ERROR("E19999", "Fisrt cmd_param not %s, check invalid",
PROFILE_MODEL_ID.c_str());
GELOGE(FAILED, "The model_id parameter is not found in the command."); GELOGE(FAILED, "The model_id parameter is not found in the command.");
return FAILED; return FAILED;
} }
@@ -732,10 +803,14 @@ Status ModelManager::HandleProfFinalizeCommand(const Command &command) {
*/ */
Status ModelManager::HandleProfStartCommand(const Command &command) { Status ModelManager::HandleProfStartCommand(const Command &command) {
if (command.cmd_params.size() < kProfStartCmdParaSize) { if (command.cmd_params.size() < kProfStartCmdParaSize) {
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu < %zu, check invalid",
command.cmd_params.size(), kProfStartCmdParaSize);
GELOGE(PARAM_INVALID, "When the cmd_type is 'profile start', the size of cmd_params must larger than 2."); GELOGE(PARAM_INVALID, "When the cmd_type is 'profile start', the size of cmd_params must larger than 2.");
return PARAM_INVALID; return PARAM_INVALID;
} }
if (command.cmd_params.size() > kProfCmdParaMaxSize) { if (command.cmd_params.size() > kProfCmdParaMaxSize) {
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu > %zu, check invalid",
command.cmd_params.size(), kProfCmdParaMaxSize);
GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size()); GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size());
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -758,10 +833,14 @@ Status ModelManager::HandleProfStartCommand(const Command &command) {


Status ModelManager::HandleProfStopCommand(const Command &command) { Status ModelManager::HandleProfStopCommand(const Command &command) {
if (command.cmd_params.size() < kProfStartCmdParaSize) { if (command.cmd_params.size() < kProfStartCmdParaSize) {
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu < %zu, check invalid",
command.cmd_params.size(), kProfStartCmdParaSize);
GELOGE(PARAM_INVALID, "When the cmd_type is 'profile stop', the size of cmd_params must larger than 2."); GELOGE(PARAM_INVALID, "When the cmd_type is 'profile stop', the size of cmd_params must larger than 2.");
return PARAM_INVALID; return PARAM_INVALID;
} }
if (command.cmd_params.size() > kProfCmdParaMaxSize) { if (command.cmd_params.size() > kProfCmdParaMaxSize) {
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu > %zu, check invalid",
command.cmd_params.size(), kProfCmdParaMaxSize);
GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size()); GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size());
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -787,6 +866,8 @@ static Status ParserPara(const Command &command, const string &dump_key, string
if (iter != command.cmd_params.end()) { if (iter != command.cmd_params.end()) {
++iter; ++iter;
if (iter == command.cmd_params.end()) { if (iter == command.cmd_params.end()) {
REPORT_INNER_ERROR("E19999", "dump_key:%s can't find in command.param, check invalid",
dump_key.c_str());
GELOGE(PARAM_INVALID, "Invalid access."); GELOGE(PARAM_INVALID, "Invalid access.");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -797,6 +878,8 @@ static Status ParserPara(const Command &command, const string &dump_key, string


Status ModelManager::HandleDumpCommand(const Command &command) { Status ModelManager::HandleDumpCommand(const Command &command) {
if (command.cmd_params.size() % kDumpCmdPairSize != 0) { if (command.cmd_params.size() % kDumpCmdPairSize != 0) {
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu MOD 2 != 0, check invalid",
command.cmd_params.size());
GELOGE(PARAM_INVALID, "When the cmd_type is 'dump', the size of cmd_params must be a even number."); GELOGE(PARAM_INVALID, "When the cmd_type is 'dump', the size of cmd_params must be a even number.");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -1013,6 +1096,7 @@ Status ModelManager::GenSessionId(uint64_t &session_id) {


mmTimeval tv; mmTimeval tv;
if (mmGetTimeOfDay(&tv, nullptr) != 0) { if (mmGetTimeOfDay(&tv, nullptr) != 0) {
REPORT_CALL_ERROR("E19999", "Call mmGetTimeOfDay fail");
GELOGE(INTERNAL_ERROR, "Failed to get current time."); GELOGE(INTERNAL_ERROR, "Failed to get current time.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -1057,6 +1141,7 @@ Status ModelManager::LoadModelOffline(uint32_t &model_id, const ModelData &model
GeModelPtr ge_model = model_helper.GetGeModel(); GeModelPtr ge_model = model_helper.GetGeModel();
shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model.priority, listener); shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model.priority, listener);
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_CALL_ERROR("E19999", "New DavinciModel fail");
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Make shared failed"); GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Make shared failed");
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }
@@ -1072,6 +1157,7 @@ Status ModelManager::LoadModelOffline(uint32_t &model_id, const ModelData &model
int32_t device_id = 0; int32_t device_id = 0;
rtError_t rt_ret = rtGetDevice(&device_id); rtError_t rt_ret = rtGetDevice(&device_id);
if (rt_ret != RT_ERROR_NONE || device_id < 0) { if (rt_ret != RT_ERROR_NONE || device_id < 0) {
REPORT_CALL_ERROR("E19999", "Call rtGetDevice failed, ret = 0x%X", rt_ret);
GELOGE(rt_ret, "Call rtGetDevice failed, ret = 0x%X, device_id = %d.", rt_ret, device_id); GELOGE(rt_ret, "Call rtGetDevice failed, ret = 0x%X, device_id = %d.", rt_ret, device_id);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -1130,6 +1216,7 @@ Status ModelManager::LoadModelWithQ(uint32_t &model_id, const ModelData &model_d


shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model_data.priority, nullptr); shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model_data.priority, nullptr);
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_CALL_ERROR("E19999", "New DavinciModel fail");
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "create model failed."); GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "create model failed.");
return ACL_ERROR_GE_MEMORY_ALLOCATION; return ACL_ERROR_GE_MEMORY_ALLOCATION;
} }
@@ -1250,6 +1337,8 @@ Status ModelManager::LoadCustAicpuSo(const OpDescPtr &op_desc, const string &so_
rtContext_t rt_cur_ctx = nullptr; rtContext_t rt_cur_ctx = nullptr;
auto rt_error = rtCtxGetCurrent(&rt_cur_ctx); auto rt_error = rtCtxGetCurrent(&rt_cur_ctx);
if (rt_error != RT_ERROR_NONE) { if (rt_error != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCtxGetCurrent failed, ret = 0x%X",
rt_error);
GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error)); GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error));
return RT_FAILED; return RT_FAILED;
} }
@@ -1285,6 +1374,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) {
rtContext_t rt_cur_ctx = nullptr; rtContext_t rt_cur_ctx = nullptr;
auto rt_error = rtCtxGetCurrent(&rt_cur_ctx); auto rt_error = rtCtxGetCurrent(&rt_cur_ctx);
if (rt_error != RT_ERROR_NONE) { if (rt_error != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtCtxGetCurrent failed, ret = 0x%X",
rt_error);
GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error)); GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error));
return RT_FAILED; return RT_FAILED;
} }
@@ -1310,12 +1401,16 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) {


status = rtMalloc(&d_aicpu_data, aicpu_data_length, RT_MEMORY_HBM); status = rtMalloc(&d_aicpu_data, aicpu_data_length, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret = 0x%X",
aicpu_data_length, status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
allocated_mem.push_back(d_aicpu_data); allocated_mem.push_back(d_aicpu_data);
status = rtMalloc(&d_so_name, so_name.size(), RT_MEMORY_HBM); status = rtMalloc(&d_so_name, so_name.size(), RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X",
so_name.size(), status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1338,6 +1433,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) {
uint32_t args_size = sizeof(CustAicpuSoBuf) * v_cust_so.size(); uint32_t args_size = sizeof(CustAicpuSoBuf) * v_cust_so.size();
status = rtMalloc(&args, args_size, RT_MEMORY_HBM); status = rtMalloc(&args, args_size, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%u, ret = 0x%X",
args_size, status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1352,6 +1449,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) {
uint32_t batch_args_size = sizeof(BatchLoadOpFromBufArgs); uint32_t batch_args_size = sizeof(BatchLoadOpFromBufArgs);
status = rtMalloc(&batch_args, batch_args_size, RT_MEMORY_HBM); status = rtMalloc(&batch_args, batch_args_size, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%u, ret = 0x%X",
batch_args_size, status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1364,6 +1463,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) {


status = rtStreamSynchronize(stream); status = rtStreamSynchronize(stream);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamSynchronize fail, ret = 0x%X",
status);
GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1408,6 +1509,7 @@ Status ModelManager::GetModelMemAndWeightSize(const ModelData &model, size_t &me


auto partition_table = reinterpret_cast<ModelPartitionTable *>(model_data); auto partition_table = reinterpret_cast<ModelPartitionTable *>(model_data);
if (partition_table->num == 1) { if (partition_table->num == 1) {
REPORT_INNER_ERROR("E19999", "partition_table num in model_data is 1, check invalid");
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "om model is error,please use executable om model"); GELOGE(ACL_ERROR_GE_PARAM_INVALID, "om model is error,please use executable om model");
return ACL_ERROR_GE_PARAM_INVALID; return ACL_ERROR_GE_PARAM_INVALID;
} }
@@ -1474,6 +1576,7 @@ ge::Status ModelManager::SyncExecuteModel(uint32_t model_id, const vector<GeTens
vector<GeTensor> &outputs) { vector<GeTensor> &outputs) {
auto model = GetHybridModel(model_id); auto model = GetHybridModel(model_id);
if (model == nullptr) { if (model == nullptr) {
REPORT_INNER_ERROR("E19999", "partition_table num in model_data is 1, check invalid");
GELOGE(FAILED, "Hybrid model not found. model id = %u.", model_id); GELOGE(FAILED, "Hybrid model not found. model id = %u.", model_id);
return FAILED; return FAILED;
} }
@@ -1485,9 +1588,21 @@ Status ModelManager::GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint3
for (const auto &model : model_map_) { for (const auto &model : model_map_) {
auto davinci_model = model.second; auto davinci_model = model.second;
if (davinci_model->GetDeviceId() == device_id) { if (davinci_model->GetDeviceId() == device_id) {
GELOGI("Start to GetOpDescInfo of device_id: %u.", device_id);
GELOGI("[Get][OpDescInfo] Start to GetOpDescInfo of device_id: %u in davinci model.", device_id);
if (davinci_model->GetOpDescInfo(stream_id, task_id, op_desc_info)) { if (davinci_model->GetOpDescInfo(stream_id, task_id, op_desc_info)) {
GELOGI("Find specific node of stream_id: %u, task_id: %u.", stream_id, task_id);
GELOGI("[Get][OpDescInfo] Find specific node of stream_id: %u, task_id: %u in davinci model.",
stream_id, task_id);
return SUCCESS;
}
}
}
for (const auto &model : hybrid_model_map_) {
auto hybrid_model = model.second;
if (hybrid_model->GetDeviceId() == device_id) {
GELOGI("[Get][OpDescInfo] Start to GetOpDescInfo of device_id: %u in hybrid model.", device_id);
if (hybrid_model->GetOpDescInfo(stream_id, task_id, op_desc_info)) {
GELOGI("[Get][OpDescInfo] Find specific node of stream_id: %u, task_id: %u in hybrid model.",
stream_id, task_id);
return SUCCESS; return SUCCESS;
} }
} }
@@ -1500,8 +1615,11 @@ Status ModelManager::EnableExceptionDump(const std::map<string, string> &options
if (iter != options.end()) { if (iter != options.end()) {
GELOGI("Find option enable_exeception_dump is %s", iter->second.c_str()); GELOGI("Find option enable_exeception_dump is %s", iter->second.c_str());
if (iter->second == "1") { if (iter->second == "1") {
dump_exception_flag_ = true;
rtError_t rt_ret = rtSetTaskFailCallback(reinterpret_cast<rtTaskFailCallback>(ExceptionCallback)); rtError_t rt_ret = rtSetTaskFailCallback(reinterpret_cast<rtTaskFailCallback>(ExceptionCallback));
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtSetTaskFailCallback fail, ret = 0x%X",
rt_ret);
GELOGE(RT_FAILED, "rtSetTaskFailCallback failed"); GELOGE(RT_FAILED, "rtSetTaskFailCallback failed");
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -1549,6 +1667,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
// malloc sysOpInfoList in SysOpCheckInfo // malloc sysOpInfoList in SysOpCheckInfo
status = rtMalloc(&d_req_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); status = rtMalloc(&d_req_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X",
op_nums * sizeof(SysOpInfo), status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1557,6 +1677,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
// malloc sysOpInfoList in SysOpCheckResp // malloc sysOpInfoList in SysOpCheckResp
status = rtMalloc(&d_res_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); status = rtMalloc(&d_res_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X",
op_nums * sizeof(SysOpInfo), status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1565,6 +1687,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
// malloc returnCodeList in SysOpCheckResp // malloc returnCodeList in SysOpCheckResp
status = rtMalloc(&d_ret_code_list, op_nums * sizeof(ReturnCode), RT_MEMORY_HBM); status = rtMalloc(&d_ret_code_list, op_nums * sizeof(ReturnCode), RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X",
op_nums * sizeof(ReturnCode), status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1576,6 +1700,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
void *d_op_type_name = nullptr; void *d_op_type_name = nullptr;
status = rtMalloc(&d_op_type_name, op_type.length(), RT_MEMORY_HBM); status = rtMalloc(&d_op_type_name, op_type.length(), RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%lu, ret = 0x%X",
op_type.length(), status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1593,6 +1719,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
void *d_op_type_name = nullptr; void *d_op_type_name = nullptr;
status = rtMalloc(&d_op_type_name, op_type.size(), RT_MEMORY_HBM); status = rtMalloc(&d_op_type_name, op_type.size(), RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%lu, ret = 0x%X",
op_type.length(), status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1621,6 +1749,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
uint32_t args_size = sizeof(SysOpCheckInfo) + sizeof(SysOpCheckResp); uint32_t args_size = sizeof(SysOpCheckInfo) + sizeof(SysOpCheckResp);
status = rtMalloc(&args, args_size, RT_MEMORY_HBM); status = rtMalloc(&args, args_size, RT_MEMORY_HBM);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%u, ret = 0x%X",
args_size, status);
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status);
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
} }
@@ -1636,6 +1766,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op


status = rtStreamSynchronize(stream); status = rtStreamSynchronize(stream);
if (status != RT_ERROR_NONE) { if (status != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamSynchronize fail, ret = 0x%X",
status);
GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status);
GE_CHK_RT(rtStreamDestroy(stream)); GE_CHK_RT(rtStreamDestroy(stream));
return RT_ERROR_TO_GE_STATUS(status); return RT_ERROR_TO_GE_STATUS(status);
@@ -1668,6 +1800,9 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
reinterpret_cast<void *>(static_cast<uintptr_t>(op_check_info_res.sysOpInfoList)), reinterpret_cast<void *>(static_cast<uintptr_t>(op_check_info_res.sysOpInfoList)),
sizeof(SysOpInfo) * res_op_nums, RT_MEMCPY_DEVICE_TO_HOST)); 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) { if (res_ret_code_list.size() != res_aicpu_op_info_list.size() || res_ret_code_list.size() != res_op_nums) {
REPORT_INNER_ERROR("E19999", "res_ret_code_list.size:%zu res_aicpu_op_info_list.size:%zu res_op_nums:%lu "
"not equal, check invalid",
res_ret_code_list.size(), res_aicpu_op_info_list.size(), res_op_nums);
GELOGE(FAILED, "Number of retcode is not equal to number of op type."); GELOGE(FAILED, "Number of retcode is not equal to number of op type.");
GE_CHK_RT(rtStreamDestroy(stream)); GE_CHK_RT(rtStreamDestroy(stream));
return FAILED; return FAILED;
@@ -1691,6 +1826,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op
"<0: op_type, 1: format, 2: datatype> \n"; "<0: op_type, 1: format, 2: datatype> \n";
} }
fail_reason += "not support."; fail_reason += "not support.";
REPORT_INNER_ERROR("E19999", "Check aicpu op_type failed, details:%s",
fail_reason.c_str());
GELOGE(FAILED, "Check aicpu op_type failed. details: %s", fail_reason.c_str()); GELOGE(FAILED, "Check aicpu op_type failed. details: %s", fail_reason.c_str());
GE_CHK_RT(rtStreamDestroy(stream)); GE_CHK_RT(rtStreamDestroy(stream));
return FAILED; return FAILED;


+ 6
- 2
ge/graph/load/model_manager/model_manager.h View File

@@ -294,6 +294,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager {
std::vector<InputOutputDims> &output_dims); std::vector<InputOutputDims> &output_dims);


bool IsDynamicShape(uint32_t model_id); bool IsDynamicShape(uint32_t model_id);
bool IsNeedHybridLoad(ge::GeRootModel &ge_root_model);
ge::Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info); ge::Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info);


ge::Status EnableExceptionDump(const std::map<string, string> &options); ge::Status EnableExceptionDump(const std::map<string, string> &options);
@@ -312,6 +313,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager {
instance->AddExceptionInfo(*rt_exception_info); instance->AddExceptionInfo(*rt_exception_info);
} }


bool IsDumpExceptionOpen() { return dump_exception_flag_; }
private: private:
/// ///
/// @ingroup domi_ome /// @ingroup domi_ome
@@ -329,8 +331,8 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager {
/// @ingroup domi_ome /// @ingroup domi_ome
/// @brief insert new model into model manager set /// @brief insert new model into model manager set
/// ///
void InsertModel(uint32_t id, std::shared_ptr<DavinciModel> &davinci_model);
void InsertModel(uint32_t id, std::shared_ptr<hybrid::HybridDavinciModel> &hybrid_model);
void InsertModel(uint32_t model_id, std::shared_ptr<DavinciModel> &davinci_model);
void InsertModel(uint32_t model_id, std::shared_ptr<hybrid::HybridDavinciModel> &hybrid_model);


/// ///
/// @ingroup domi_ome /// @ingroup domi_ome
@@ -340,6 +342,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager {


void GenModelId(uint32_t *id); void GenModelId(uint32_t *id);



std::map<uint32_t, std::shared_ptr<DavinciModel>> model_map_; std::map<uint32_t, std::shared_ptr<DavinciModel>> model_map_;
std::map<uint32_t, std::shared_ptr<hybrid::HybridDavinciModel>> hybrid_model_map_; std::map<uint32_t, std::shared_ptr<hybrid::HybridDavinciModel>> hybrid_model_map_;
std::map<std::string, std::vector<uint64_t>> model_aicpu_kernel_; std::map<std::string, std::vector<uint64_t>> model_aicpu_kernel_;
@@ -354,6 +357,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager {
std::map<uintptr_t, std::map<std::string, CustAICPUKernelPtr>> cust_aicpu_so_; std::map<uintptr_t, std::map<std::string, CustAICPUKernelPtr>> cust_aicpu_so_;


static DumpProperties dump_properties_; static DumpProperties dump_properties_;
bool dump_exception_flag_ = false;
}; };
} // namespace ge } // namespace ge




+ 15
- 1
ge/graph/load/model_manager/model_utils.cc View File

@@ -25,6 +25,9 @@
#define VALIDATE_MEM_RANGE(OP, SIZE, OFFSET) \ #define VALIDATE_MEM_RANGE(OP, SIZE, OFFSET) \
do { \ do { \
if (SIZE <= static_cast<uint64_t>(OFFSET)) { \ if (SIZE <= static_cast<uint64_t>(OFFSET)) { \
REPORT_INNER_ERROR("E19999", \
"Node:%s(%s) offset:%ld out of range size:%lu, check invalid", \
OP->GetName().c_str(), OP->GetType().c_str(), OFFSET, SIZE); \
GELOGE(OUT_OF_MEMORY, "Node: %s, memory out of range[%lu: %ld]", OP->GetName().c_str(), SIZE, OFFSET); \ GELOGE(OUT_OF_MEMORY, "Node: %s, memory out of range[%lu: %ld]", OP->GetName().c_str(), SIZE, OFFSET); \
return {}; \ return {}; \
} \ } \
@@ -305,6 +308,9 @@ vector<void *> ModelUtils::GetInputDataAddrs(const RuntimeParam &model_param, Co
vector<int64_t> v_memory_type; vector<int64_t> v_memory_type;
bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_INPUT_MEM_TYPE_LIST, v_memory_type); bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_INPUT_MEM_TYPE_LIST, v_memory_type);
if (has_mem_type_attr && (v_memory_type.size() != inputs_size)) { if (has_mem_type_attr && (v_memory_type.size() != inputs_size)) {
REPORT_INNER_ERROR("E19999", "Attr:%s, memory_type.size:%zu != input_desc.size:%zu, op:%s(%s), check invalid",
ATTR_NAME_INPUT_MEM_TYPE_LIST.c_str(), v_memory_type.size(), inputs_size,
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(PARAM_INVALID, "Fusion: check input size failed, op: %s, input v_memory_type size: %zu input numbers: %zu", GELOGE(PARAM_INVALID, "Fusion: check input size failed, op: %s, input v_memory_type size: %zu input numbers: %zu",
op_desc->GetName().c_str(), v_memory_type.size(), inputs_size); op_desc->GetName().c_str(), v_memory_type.size(), inputs_size);
return v_input_data_addr; return v_input_data_addr;
@@ -384,7 +390,9 @@ Status ModelUtils::GetVarAddr(const RuntimeParam &model_param, const ConstOpDesc
switch (mem_type) { switch (mem_type) {
case RT_MEMORY_RDMA_HBM: case RT_MEMORY_RDMA_HBM:
if (offset < 0) { if (offset < 0) {
GELOGE(PARAM_INVALID, "rdma var addr is invalid, addr=%p", reinterpret_cast<uint8_t *>(offset));
REPORT_INNER_ERROR("E19999", "Param offset:%ld < 0, check invalid", offset);
GELOGE(PARAM_INVALID, "rdma var addr is invalid, addr=%p",
reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(offset)));
return PARAM_INVALID; return PARAM_INVALID;
} }
var_addr = reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(offset)); var_addr = reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(offset));
@@ -394,6 +402,8 @@ Status ModelUtils::GetVarAddr(const RuntimeParam &model_param, const ConstOpDesc
var_addr = model_param.var_base + offset - model_param.logic_var_base; var_addr = model_param.var_base + offset - model_param.logic_var_base;
break; break;
default: default:
REPORT_INNER_ERROR("E19999", "Get mem_type:%d for offset:%ld is unsupported, check invalid",
mem_type, offset);
GELOGE(PARAM_INVALID, "unsupported memory type %u", mem_type); GELOGE(PARAM_INVALID, "unsupported memory type %u", mem_type);
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -419,6 +429,9 @@ vector<void *> ModelUtils::GetOutputDataAddrs(const RuntimeParam &model_param, C
vector<int64_t> v_memory_type; vector<int64_t> v_memory_type;
bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_OUTPUT_MEM_TYPE_LIST, v_memory_type); bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_OUTPUT_MEM_TYPE_LIST, v_memory_type);
if (has_mem_type_attr && (v_memory_type.size() != outputs_size)) { if (has_mem_type_attr && (v_memory_type.size() != outputs_size)) {
REPORT_INNER_ERROR("E19999", "Attr:%s, memory_type.size:%zu != output_desc.size:%zu, op:%s(%s), check invalid",
ATTR_NAME_OUTPUT_MEM_TYPE_LIST.c_str(), v_memory_type.size(), outputs_size,
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(PARAM_INVALID, GELOGE(PARAM_INVALID,
"Fusion: check output size failed, op: %s, output v_memory_type size: %lu output numbers: %zu", "Fusion: check output size failed, op: %s, output v_memory_type size: %lu output numbers: %zu",
op_desc->GetName().c_str(), v_memory_type.size(), outputs_size); op_desc->GetName().c_str(), v_memory_type.size(), outputs_size);
@@ -567,6 +580,7 @@ Status ModelUtils::GetRtAddress(const RuntimeParam &param, uintptr_t logic_addr,
param.var_size); param.var_size);
} else if (logic_addr != 0) { } else if (logic_addr != 0) {
mem_addr = nullptr; mem_addr = nullptr;
REPORT_INNER_ERROR("E19999", "Check param logic addr:0x%lx abnormal", logic_addr);
GELOGE(PARAM_INVALID, "The logic addr:0x%lx is abnormal", logic_addr); GELOGE(PARAM_INVALID, "The logic addr:0x%lx is abnormal", logic_addr);
return PARAM_INVALID; return PARAM_INVALID;
} }


+ 6
- 4
ge/graph/load/model_manager/task_info/end_graph_task_info.cc View File

@@ -27,6 +27,7 @@ namespace ge {
Status EndGraphTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { Status EndGraphTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) {
GELOGI("InitEndGraphTaskInfo Init Start."); GELOGI("InitEndGraphTaskInfo Init Start.");
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr");
GELOGE(PARAM_INVALID, "davinci_model is null!"); GELOGE(PARAM_INVALID, "davinci_model is null!");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -45,13 +46,11 @@ Status EndGraphTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin
Status EndGraphTaskInfo::Distribute() { Status EndGraphTaskInfo::Distribute() {
GELOGI("EndGraphTaskInfo Distribute Start."); GELOGI("EndGraphTaskInfo Distribute Start.");
GE_CHECK_NOTNULL(davinci_model_); GE_CHECK_NOTNULL(davinci_model_);
auto all_dump_model = davinci_model_->GetDumpProperties().GetAllDumpModel();
if (all_dump_model.find(ge::DUMP_ALL_MODEL) != all_dump_model.end() ||
all_dump_model.find(davinci_model_->Name()) != all_dump_model.end() ||
all_dump_model.find(davinci_model_->OmName()) != all_dump_model.end()) {
if (davinci_model_->ModelNeedDump()) {
GELOGI("Start to call rtEndGraphEx"); GELOGI("Start to call rtEndGraphEx");
rtError_t rt_ret = rtEndGraphEx(model_, stream_, kDumpFlag); rtError_t rt_ret = rtEndGraphEx(model_, stream_, kDumpFlag);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtEndGraphEx failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "Call rtEndGraphEx failed, ret: 0x%x", rt_ret); GELOGE(RT_FAILED, "Call rtEndGraphEx failed, ret: 0x%x", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -59,6 +58,7 @@ Status EndGraphTaskInfo::Distribute() {
GELOGI("Start to call rtEndGraph"); GELOGI("Start to call rtEndGraph");
rtError_t rt_ret = rtEndGraph(model_, stream_); rtError_t rt_ret = rtEndGraph(model_, stream_);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtEndGraph failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "Call rtEndGraph failed, ret: 0x%x", rt_ret); GELOGE(RT_FAILED, "Call rtEndGraph failed, ret: 0x%x", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
@@ -68,6 +68,8 @@ Status EndGraphTaskInfo::Distribute() {
uint32_t stream_id = 0; uint32_t stream_id = 0;
rtError_t rt_ret = rtModelGetTaskId(davinci_model_->GetRtModelHandle(), &task_id, &stream_id); rtError_t rt_ret = rtModelGetTaskId(davinci_model_->GetRtModelHandle(), &task_id, &stream_id);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtModelGetTaskId failed, ret:0x%X",
rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


+ 5
- 0
ge/graph/load/model_manager/task_info/event_record_task_info.cc View File

@@ -23,6 +23,7 @@ namespace ge {
Status EventRecordTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { Status EventRecordTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) {
GELOGI("EventRecordTaskInfo Init Start."); GELOGI("EventRecordTaskInfo Init Start.");
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr");
GELOGE(PARAM_INVALID, "davinci_model is null!"); GELOGE(PARAM_INVALID, "davinci_model is null!");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -34,6 +35,8 @@ Status EventRecordTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da


const auto &eventList = davinci_model->GetEventList(); const auto &eventList = davinci_model->GetEventList();
if (task_def.event_id() >= eventList.size()) { if (task_def.event_id() >= eventList.size()) {
REPORT_INNER_ERROR("E19999", "Task event_id:%u > model event size:%zu, check invalid",
task_def.event_id(), eventList.size());
GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id()); GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -47,6 +50,8 @@ Status EventRecordTaskInfo::Distribute() {
GELOGI("EventRecordTaskInfo Distribute Start."); GELOGI("EventRecordTaskInfo Distribute Start.");
rtError_t rt_ret = rtEventRecord(event_, stream_); rtError_t rt_ret = rtEventRecord(event_, stream_);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtEventRecord failed, ret:0x%X",
rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


+ 7
- 0
ge/graph/load/model_manager/task_info/event_wait_task_info.cc View File

@@ -23,6 +23,7 @@ namespace ge {
Status EventWaitTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { Status EventWaitTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) {
GELOGI("EventWaitTaskInfo Init Start."); GELOGI("EventWaitTaskInfo Init Start.");
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr");
GELOGE(PARAM_INVALID, "davinci_model is null!"); GELOGE(PARAM_INVALID, "davinci_model is null!");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -34,6 +35,8 @@ Status EventWaitTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davi


const auto &eventList = davinci_model->GetEventList(); const auto &eventList = davinci_model->GetEventList();
if (task_def.event_id() >= eventList.size()) { if (task_def.event_id() >= eventList.size()) {
REPORT_INNER_ERROR("E19999", "Task event_id:%u > model event size:%zu, check invalid",
task_def.event_id(), eventList.size());
GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id()); GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id());
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -48,12 +51,16 @@ Status EventWaitTaskInfo::Distribute() {
GELOGI("EventWaitTaskInfo Distribute Start."); GELOGI("EventWaitTaskInfo Distribute Start.");
rtError_t rt_ret = rtStreamWaitEvent(stream_, event_); rtError_t rt_ret = rtStreamWaitEvent(stream_, event_);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamWaitEvent failed, ret:0x%X",
rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


rt_ret = rtEventReset(event_, stream_); rt_ret = rtEventReset(event_, stream_);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtEventReset failed, ret:0x%X",
rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


+ 3
- 0
ge/graph/load/model_manager/task_info/fusion_start_task_info.cc View File

@@ -23,6 +23,7 @@ namespace ge {
Status FusionStartTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { Status FusionStartTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) {
GELOGI("FusionStartTaskInfo Init Start."); GELOGI("FusionStartTaskInfo Init Start.");
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr");
GELOGE(PARAM_INVALID, "davinci_model is null!"); GELOGE(PARAM_INVALID, "davinci_model is null!");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -39,6 +40,8 @@ Status FusionStartTaskInfo::Distribute() {
GELOGI("FusionStartTaskInfo Distribute Start."); GELOGI("FusionStartTaskInfo Distribute Start.");
rtError_t rt_ret = rtKernelFusionStart(stream_); rtError_t rt_ret = rtKernelFusionStart(stream_);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtKernelFusionStart failed, ret:0x%X",
rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


+ 2
- 0
ge/graph/load/model_manager/task_info/fusion_stop_task_info.cc View File

@@ -23,6 +23,7 @@ namespace ge {
Status FusionStopTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { Status FusionStopTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) {
GELOGI("FusionStopTaskInfo Init Start."); GELOGI("FusionStopTaskInfo Init Start.");
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr");
GELOGE(PARAM_INVALID, "davinci_model is null!"); GELOGE(PARAM_INVALID, "davinci_model is null!");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -39,6 +40,7 @@ Status FusionStopTaskInfo::Distribute() {
GELOGI("FusionStopTaskInfo Distribute Start."); GELOGI("FusionStopTaskInfo Distribute Start.");
rtError_t rt_ret = rtKernelFusionEnd(stream_); rtError_t rt_ret = rtKernelFusionEnd(stream_);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtKernelFusionEnd failed, ret:0x%X", rt_ret);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }


+ 20
- 0
ge/graph/load/model_manager/task_info/hccl_task_info.cc View File

@@ -30,6 +30,7 @@ HcclTaskInfo::~HcclTaskInfo() {
if (private_def_ != nullptr) { if (private_def_ != nullptr) {
rtError_t ret = rtFreeHost(private_def_); rtError_t ret = rtFreeHost(private_def_);
if (ret != RT_ERROR_NONE) { if (ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtFreeHost failed, ret:0x%X", ret);
GELOGE(RT_FAILED, "Call rtFree Fail, ret = 0x%X.", ret); GELOGE(RT_FAILED, "Call rtFree Fail, ret = 0x%X.", ret);
} }
private_def_ = nullptr; private_def_ = nullptr;
@@ -41,6 +42,7 @@ HcclTaskInfo::~HcclTaskInfo() {
Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) {
GELOGI("HcclTaskInfo Init Start."); GELOGI("HcclTaskInfo Init Start.");
if (davinci_model == nullptr) { if (davinci_model == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr");
GELOGE(PARAM_INVALID, "davinci_model is null!"); GELOGE(PARAM_INVALID, "davinci_model is null!");
return PARAM_INVALID; return PARAM_INVALID;
} }
@@ -67,22 +69,30 @@ Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_m
// Only in Horovod scenario should get the inputName and GeShape // 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) { if (ret != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call GetHorovodInputs fail for op:%s(%s)",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(ret, "davinci_model: GetHorovodInputs fail! domi error: %u", ret); GELOGE(ret, "davinci_model: GetHorovodInputs fail! domi error: %u", ret);
return ret; return ret;
} }
Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc, kernel_hccl_infos_); Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc, kernel_hccl_infos_);
if (dmrt != SUCCESS) { if (dmrt != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call GetHcclDataType fail for op:%s(%s)",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(dmrt, "davinci_model: GetHcomDataType fail! domi error: %u", dmrt); GELOGE(dmrt, "davinci_model: GetHcomDataType fail! domi error: %u", dmrt);
return dmrt; return dmrt;
} }
dmrt = HcomOmeUtil::GetHcclCount(op_desc, kernel_hccl_infos_); dmrt = HcomOmeUtil::GetHcclCount(op_desc, kernel_hccl_infos_);
if (dmrt != SUCCESS) { if (dmrt != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call GetHcclCount fail for op:%s(%s)",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(dmrt, "davinci_model: GetHcomCount fail! domi error: %u", dmrt); GELOGE(dmrt, "davinci_model: GetHcomCount fail! domi error: %u", dmrt);
return dmrt; return dmrt;
} }
// Only HCOMBROADCAST and HVDCALLBACKBROADCAST need to get the rootId // 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) { if (dmrt != SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call GetAllRootId fail for op:%s(%s)",
op_desc->GetName().c_str(), op_desc->GetType().c_str());
GELOGE(dmrt, "davinci_model: Get rootId fail! domi error: %u", dmrt); GELOGE(dmrt, "davinci_model: Get rootId fail! domi error: %u", dmrt);
return dmrt; return dmrt;
} }
@@ -169,12 +179,16 @@ Status HcclTaskInfo::CreateStream(int64_t stream_num, DavinciModel *davinci_mode
rtError_t rt_ret = rtError_t rt_ret =
rtStreamCreateWithFlags(&stream, davinci_model->Priority(), RT_STREAM_PERSISTENT | RT_STREAM_FORCE_COPY); rtStreamCreateWithFlags(&stream, davinci_model->Priority(), RT_STREAM_PERSISTENT | RT_STREAM_FORCE_COPY);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtStreamCreateWithFlags failed, ret:0x%X, stream_idx:%ld, stream_num:%ld",
rt_ret, i, stream_num);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
} }
// Create slave stream, inactive by default, activated by hccl // Create slave stream, inactive by default, activated by hccl
rt_ret = rtModelBindStream(davinci_model->GetRtModelHandle(), stream, RT_MODEL_WAIT_ACTIVE_STREAM); rt_ret = rtModelBindStream(davinci_model->GetRtModelHandle(), stream, RT_MODEL_WAIT_ACTIVE_STREAM);
if (rt_ret != RT_ERROR_NONE) { if (rt_ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtModelBindStream failed, ret:0x%X, stream_idx:%ld, stream_num:%ld",
rt_ret, i, stream_num);
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret);
(void)rtStreamDestroy(stream); (void)rtStreamDestroy(stream);
return RT_ERROR_TO_GE_STATUS(rt_ret); return RT_ERROR_TO_GE_STATUS(rt_ret);
@@ -192,6 +206,7 @@ Status HcclTaskInfo::CreateStream(int64_t stream_num, DavinciModel *davinci_mode
Status HcclTaskInfo::Distribute() { Status HcclTaskInfo::Distribute() {
GELOGI("HcclTaskInfo Distribute Start. begin to call function LoadTask in hccl."); GELOGI("HcclTaskInfo Distribute Start. begin to call function LoadTask in hccl.");
if (ops_kernel_store_ == nullptr) { if (ops_kernel_store_ == nullptr) {
REPORT_INNER_ERROR("E19999", "Check param ops_kernel_store_ nullptr");
GELOGE(INTERNAL_ERROR, "ops kernel store is null."); GELOGE(INTERNAL_ERROR, "ops kernel store is null.");
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -201,6 +216,7 @@ Status HcclTaskInfo::Distribute() {
TransToGETaskInfo(ge_task); TransToGETaskInfo(ge_task);
auto result = ops_kernel_info_store->LoadTask(ge_task); auto result = ops_kernel_info_store->LoadTask(ge_task);
if (result != HCCL_SUCCESS) { if (result != HCCL_SUCCESS) {
REPORT_CALL_ERROR("E19999", "Call ops_kernel_info_store LoadTask fail");
GELOGE(INTERNAL_ERROR, "davinci_model : load task fail, return ret: %u", result); GELOGE(INTERNAL_ERROR, "davinci_model : load task fail, return ret: %u", result);
return INTERNAL_ERROR; return INTERNAL_ERROR;
} }
@@ -316,6 +332,8 @@ void HcclTaskInfo::GetPrivateDefByTaskDef(const domi::TaskDef &task) {
private_def_len_ = private_def_temp.size(); private_def_len_ = private_def_temp.size();
rtError_t ret = rtMallocHost(&private_def_, private_def_len_); rtError_t ret = rtMallocHost(&private_def_, private_def_len_);
if (ret != RT_ERROR_NONE) { if (ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMallocHost failed, ret:0x%X, size:%u",
ret, private_def_len_);
GELOGE(RT_FAILED, "Call rtMallocHost Fail, ret = 0x%X.", ret); GELOGE(RT_FAILED, "Call rtMallocHost Fail, ret = 0x%X.", ret);
return; return;
} }
@@ -323,6 +341,8 @@ void HcclTaskInfo::GetPrivateDefByTaskDef(const domi::TaskDef &task) {
ret = rtMemcpy(private_def_, private_def_len_, task.private_def().c_str(), private_def_len_, ret = rtMemcpy(private_def_, private_def_len_, task.private_def().c_str(), private_def_len_,
RT_MEMCPY_HOST_TO_HOST); RT_MEMCPY_HOST_TO_HOST);
if (ret != RT_ERROR_NONE) { if (ret != RT_ERROR_NONE) {
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, ret:0x%X, size:%u",
ret, private_def_len_);
GELOGE(RT_FAILED, "Call rtMemcpy Fail, ret = 0x%X.", ret); GELOGE(RT_FAILED, "Call rtMemcpy Fail, ret = 0x%X.", ret);
return; return;
} }


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save